jws-frontend/src/pages/01_branch-management/MainPage.vue

935 lines
27 KiB
Vue
Raw Normal View History

2024-04-02 17:47:32 +07:00
<script setup lang="ts">
2024-04-09 16:47:52 +07:00
import { storeToRefs } from 'pinia';
2024-04-05 18:14:53 +07:00
import { ref, onMounted } from 'vue';
import { Icon } from '@iconify/vue';
2024-04-05 18:14:53 +07:00
import useBranchStore from 'stores/branch';
import useBranchContactStore from 'stores/branch-contact';
2024-04-02 17:47:32 +07:00
import AppBox from 'components/app/AppBox.vue';
2024-04-05 18:14:53 +07:00
import BtnAddComponent from 'components/01_branch-management/BtnAddComponent.vue';
import TooltipComponent from 'components/TooltipComponent.vue';
import StatCardComponent from 'components/StatCardComponent.vue';
2024-04-09 15:54:47 +07:00
import CardDetailsComponent from 'src/components/01_branch-management/CardDetailsComponent.vue';
import DeatailsBranchDrawerComponent from 'src/components/01_branch-management/DeatailsBranchDrawerComponent.vue';
2024-04-09 15:55:15 +07:00
import FormDialog from 'src/components/FormDialog.vue';
import TableCardComponent from 'src/components/01_branch-management/TableCardComponent.vue';
import { BranchContactCreate } from 'src/stores/branch-contact/types';
import {
BranchWithChildren,
Branch,
BranchCreate,
} from 'src/stores/branch/types';
2024-04-09 15:54:47 +07:00
const branchStore = useBranchStore();
const branchContactStore = useBranchContactStore();
2024-04-09 16:47:52 +07:00
const { data: branchData } = storeToRefs(branchStore);
2024-04-09 15:54:47 +07:00
const modal = ref<boolean>(false);
const currentBranchIdEdit = ref<string>('');
const currentBranchContactIdEdit = ref<string>('');
const showCurrentBranch = ref<Branch>();
2024-04-09 15:54:47 +07:00
const shape = ref<boolean>(false);
2024-04-09 15:55:15 +07:00
const openBranchDrawer = ref<boolean>(true);
const openCardDetails = ref<boolean>(false);
const openTableCard = ref<boolean>(true);
const inputSelectBranch = ref<string>('ทั้งหมด');
const inputFilter = ref<string>('คอลัมน์');
const inputSearch = ref<string>('');
const optionsBranch: string[] = ['ทั้งหมด', 'สำนักงานใหญ่', 'สาขา'];
const optionsFilter: string[] = [
'ชื่อสาขา',
'ที่อยู่',
'เบอร์โทร',
'สำนักงานใหญ่',
'ประเภท',
'สถานะ',
];
const formDataContact = ref<BranchContactCreate>({
lineId: '',
telephoneNo: '',
qrCodeImage: new File([], 'ชื่อไฟล์.png', { type: 'image/png' }),
});
const formType = ref<'edit' | 'create' | 'delete'>('create');
const typeBranch = ref<'headOffice' | 'subBranch'>('headOffice');
const branchContact = ref<BranchContactCreate[]>();
const inputCode = ref<string>('');
const formData = ref<BranchCreate>({
taxNo: '',
nameEN: '',
name: '',
addressEN: '',
address: '',
zipCode: '',
2024-04-09 15:55:15 +07:00
email: '',
telephoneNo: '',
longitude: '',
latitude: '',
subDistrictId: '',
districtId: '',
provinceId: '',
headOfficeId: null,
2024-04-09 15:55:15 +07:00
});
const selected = ref<string>('');
const expanded = ref<string[]>([]);
const branchStat = ref<
{
amount: number;
label: string;
}[]
>([
{
amount: 1,
label: 'สำนักงานใหญ่ 1',
},
{
amount: 2,
label: 'สำนักงานใหญ่ 2',
},
{
amount: 3,
label: 'สำนักงานใหญ่ 3',
},
{
amount: 4,
label: 'สำนักงานใหญ่ 4',
},
{
amount: 5,
label: 'สำนักงานใหญ่ 5',
},
]);
2024-04-09 15:54:47 +07:00
const treeData = ref<BranchWithChildren[]>([]);
const subBranch = ref<boolean>(false);
const rowsBranch = ref<
{
2024-04-10 17:22:33 +07:00
id: string;
name: string;
branchName: string;
address: string;
telephoneNo: string;
code: string;
type: boolean;
status: string;
}[]
>([]);
function clearData() {
formData.value = {
taxNo: '',
nameEN: '',
name: '',
addressEN: '',
address: '',
zipCode: '',
email: '',
telephoneNo: '',
longitude: '',
latitude: '',
subDistrictId: '',
districtId: '',
provinceId: '',
headOfficeId: null,
};
formDataContact.value = {
lineId: '',
telephoneNo: '',
qrCodeImage: new File([], 'ชื่อไฟล์.png', { type: 'image/png' }),
};
}
2024-04-09 15:55:15 +07:00
function openDialog() {
modal.value = true;
}
2024-04-09 15:54:47 +07:00
async function getTree() {
const result = await branchStore.fetchList<BranchWithChildren>({
tree: true,
});
if (result) {
treeData.value = result.result;
rowsBranch.value = treeData.value
.filter((v) => v.isHeadOffice)
.map((v) => ({
2024-04-10 17:22:33 +07:00
id: v.id,
name: v.code,
branchName: v.name,
address: v.address,
telephoneNo: v.telephoneNo,
code: v.code,
type: v.isHeadOffice,
status: v.status.toString(),
}));
subBranch.value = false;
}
2024-04-09 15:54:47 +07:00
}
function changeSubject(
formType: 'edit' | 'create' | 'delete',
typeBranch: 'headOffice' | 'subBranch',
) {
if (typeBranch === 'headOffice') {
if (formType === 'create') {
return 'เพิ่มสำนักงานใหญ่';
}
return 'แก้ไขสำนักงานใหญ่';
}
if (typeBranch === 'subBranch') {
if (formType === 'create') {
return 'เพิ่มสาขา';
}
return 'แก้ไขสาขา';
}
}
function triggerCreateSubBranch(code: string, id: string) {
clearData();
formType.value = 'create';
typeBranch.value = 'subBranch';
inputCode.value = code;
formData.value.headOfficeId = id;
openDialog();
}
function triggerEditSubBranch(code: string, id: string) {
clearData();
formType.value = 'edit';
typeBranch.value = 'subBranch';
inputCode.value = code;
formData.value.headOfficeId = id;
currentBranchIdEdit.value = id;
fetchFormEditBranch(id);
fetchFormEditBranchContact(id);
openDialog();
}
function triggerDeleteSubBranch(id: string) {
clearData();
formType.value = 'delete';
typeBranch.value = 'subBranch';
formData.value.headOfficeId = id;
openDialog();
}
function triggerCreateHeadOffice() {
clearData();
formType.value = 'create';
typeBranch.value = 'headOffice';
openDialog();
}
function triggerEditHeadOffice(id: string) {
clearData();
formType.value = 'edit';
typeBranch.value = 'headOffice';
currentBranchIdEdit.value = id;
fetchFormEditBranch(id);
fetchFormEditBranchContact(id);
openDialog();
}
function triggerDeleteHeadOffice() {
clearData();
formType.value = 'delete';
typeBranch.value = 'headOffice';
openDialog();
}
async function fetchFormEditBranch(id: string) {
const result = await branchStore.fetchById<Branch>(id);
if (result) {
formData.value = {
taxNo: result.taxNo,
nameEN: result.nameEN,
name: result.name,
addressEN: result.addressEN,
address: result.address,
zipCode: result.zipCode,
email: result.email,
telephoneNo: result.telephoneNo,
longitude: result.longitude,
latitude: result.latitude,
subDistrictId: result.subDistrictId,
districtId: result.districtId,
provinceId: result.provinceId,
headOfficeId: result.headOfficeId,
};
}
}
async function fetchFormEditBranchContact(id: string) {
const result = await branchContactStore.fetchList(id);
if (result) {
const resultFilter = result.result.filter((v) => v.branchId === id);
currentBranchContactIdEdit.value = resultFilter[0].id;
formDataContact.value = {
lineId: resultFilter[0].lineId,
telephoneNo: resultFilter[0].telephoneNo,
qrCodeImage: new File([], 'ชื่อไฟล์.png', { type: 'image/png' }),
};
}
}
async function submitForm(
typeSubmit: 'create' | 'edit' | 'delete',
formTypeSubmit: 'headOffice' | 'subBranch',
inputBranchCreate: BranchCreate,
inputBranchContactCreate: BranchContactCreate,
) {
if (formTypeSubmit === 'headOffice') {
if (typeSubmit === 'create') {
const result = await branchStore.create(inputBranchCreate);
if (result) {
await branchContactStore.create(result.id, inputBranchContactCreate);
getTree();
modal.value = false;
return;
}
}
if (typeSubmit === 'edit') {
await branchStore.editById(currentBranchIdEdit.value, inputBranchCreate);
await branchContactStore.editById(
currentBranchIdEdit.value,
currentBranchContactIdEdit.value,
inputBranchContactCreate,
);
getTree();
modal.value = false;
return;
}
if (typeSubmit === 'delete') {
return;
}
}
if (formTypeSubmit === 'subBranch') {
if (typeSubmit === 'create') {
const result = await branchStore.create(inputBranchCreate);
if (result) {
await branchContactStore.create(result.id, inputBranchContactCreate);
getTree();
modal.value = false;
return;
}
}
if (typeSubmit === 'edit') {
await branchStore.editById(currentBranchIdEdit.value, inputBranchCreate);
await branchContactStore.editById(
currentBranchIdEdit.value,
currentBranchContactIdEdit.value,
inputBranchContactCreate,
);
getTree();
modal.value = false;
return;
}
if (typeSubmit === 'delete') {
return;
}
}
}
async function fetchCard(id: string) {
const result = await branchStore.fetchById<Branch>(id);
if (result) {
showCurrentBranch.value = result;
openCardDetails.value = true;
openTableCard.value = false;
2024-04-09 15:54:47 +07:00
}
}
async function fetchSubBranch(id: string) {
const result = await branchStore.fetchById<BranchWithChildren>(id, {
includeSubBranch: true,
});
2024-04-09 15:54:47 +07:00
if (result) {
rowsBranch.value = result.branch.map((v) => ({
2024-04-10 17:22:33 +07:00
id: v.id,
name: v.code,
branchName: v.name,
address: v.address,
telephoneNo: v.telephoneNo,
code: v.code,
type: v.isHeadOffice,
status: v.status,
}));
subBranch.value = true;
openCardDetails.value = false;
openTableCard.value = true;
2024-04-09 15:54:47 +07:00
}
}
onMounted(async () => {
getTree();
});
2024-04-02 17:47:32 +07:00
</script>
<template>
<div class="column">
<div class="row text-h6 text-weight-bold q-mb-md">
{{ $t('branchManagement') }}
</div>
2024-04-02 17:47:32 +07:00
2024-04-09 16:47:52 +07:00
<AppBox
bordered
class="q-mb-md"
:class="{ 'bg-card-branch-title': $q.dark.isActive }"
>
2024-04-05 18:14:53 +07:00
<StatCardComponent :branch="branchStat" />
2024-04-09 16:47:52 +07:00
</AppBox>
2024-04-09 17:21:34 +07:00
<AppBox bordered style="width: 100%" v-if="!branchData?.total">
<div class="column">
2024-04-02 17:47:32 +07:00
<div class="col-1 self-end">
2024-04-09 16:47:52 +07:00
<TooltipComponent
title="branchNoMainOfficeYet"
caption="branchClickToCreateMainOffice"
imgSrc="img-table-"
/>
2024-04-02 17:47:32 +07:00
</div>
2024-04-09 16:47:52 +07:00
<div class="col self-center" style="display: flex; align-items: center">
2024-04-05 18:14:53 +07:00
<BtnAddComponent
2024-04-02 17:47:32 +07:00
:label="'สร้างสำนักงานใหญ่'"
2024-04-09 15:54:47 +07:00
@trigger="() => openDialog()"
2024-04-02 17:47:32 +07:00
/>
</div>
</div>
2024-04-09 16:47:52 +07:00
</AppBox>
2024-04-09 16:47:52 +07:00
<AppBox
2024-04-09 17:21:34 +07:00
class="bordered branch-container no-padding"
:class="{ dark: $q.dark.isActive }"
>
2024-04-09 16:47:52 +07:00
<AppBox class="bg-card-branch-title" style="border-radius: 0">
<div class="row items-center">
2024-04-09 17:21:34 +07:00
<span
class="col q-pl-md text-h6 text-weight-bold color-card-branch-title"
>
{{ $t('headQuarters') }}
2024-04-09 17:21:34 +07:00
</span>
<div class="col-3">
<q-input
2024-04-09 16:47:52 +07:00
class="bordered rounded q-px-md"
borderless
dense
2024-04-09 16:47:52 +07:00
v-model="inputSearch"
label="ค้นหา"
>
<template #prepend>
2024-04-05 18:14:53 +07:00
<Icon icon="ic:baseline-search" />
</template>
</q-input>
</div>
</div>
2024-04-09 16:47:52 +07:00
</AppBox>
2024-04-09 17:21:34 +07:00
<AppBox class="no-padding row bordered-t" style="border-radius: 0">
2024-04-09 16:47:52 +07:00
<div class="q-pa-md bg-branch-tree-box bordered-r" style="width: 21%">
<div
@click="triggerCreateHeadOffice()"
class="btn-add col-2 text-weight-bold cursor-pointer color-card-branch-btn"
>
<div class="text-h4 q-mr-md">+</div>
{{ $t('btnCreate') }}
</div>
<q-scroll-area
2024-04-09 16:47:52 +07:00
class="q-pa-sm bg-branch-tree-scroll"
style="height: 350px; width: 100%; border-radius: 6px"
>
<div class="col">
<q-tree
2024-04-09 15:54:47 +07:00
:nodes="treeData"
dense
2024-04-09 15:54:47 +07:00
node-key="name"
v-model:expanded="expanded"
2024-04-09 15:54:47 +07:00
v-model:selected="selected"
children-key="branch"
>
<template #default-header="prop">
<div
@click="fetchSubBranch(prop.node.id)"
2024-04-09 17:28:59 +07:00
class="q-px-sm color-brach-tree-text"
:class="{
2024-04-09 15:54:47 +07:00
'color-tree-active': expanded.includes(prop.node.name),
'bg-branch-tree':
prop.node.isHeadOffice &&
2024-04-09 15:54:47 +07:00
expanded.includes(prop.node.name),
'dark-tree': $q.dark.isActive,
}"
style="border-radius: 6px"
>
2024-04-09 15:54:47 +07:00
{{ prop.node.name }}
</div>
<q-space />
<q-btn
class="color-brach-tree-btn"
@click.stop="
triggerCreateSubBranch(prop.node.code, prop.node.id)
"
v-if="prop.node.isHeadOffice"
2024-04-09 17:28:59 +07:00
size="lg"
flat
square
dense
>
2024-04-05 18:14:53 +07:00
<Icon
2024-04-09 15:54:47 +07:00
v-if="expanded.includes(prop.node.name)"
icon="eva:file-add-fill"
/>
2024-04-05 18:14:53 +07:00
<Icon v-else icon="eva:file-add-outline" />
</q-btn>
<!-- subBranch -->
<q-btn
v-else
class="color-brach-tree-btn"
@click.stop
size="lg"
dense
flat
name="menu"
>
<Icon icon="ri:more-2-fill" width="16px" />
<q-menu class="bordered" style="width: 150px">
<q-list>
<q-item
clickable
v-close-popup
dense
@click="
triggerEditSubBranch(prop.node.code, prop.node.id)
"
>
<q-item-section avatar class="q-py-sm">
<q-icon
style="color: hsl(var(--cyan-6-hsl))"
name="mdi-pencil-outline"
/>
</q-item-section>
<q-item-section>{{ $t('edit') }}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
dense
@click="triggerDeleteSubBranch(prop.node.id)"
>
<q-item-section avatar class="q-py-sm">
<q-icon
style="color: hsl(var(--red-6-hsl))"
name="mdi-trash-can-outline"
/>
</q-item-section>
<q-item-section>{{ $t('delete') }}</q-item-section>
</q-item>
<q-item v-close-popup dense>
<q-item-section class="q-py-sm">
<div
class="bg-branch-tree-toggle q-pa-sm"
style="border-radius: 6px"
:class="{ 'dark-toggle': $q.dark.isActive }"
>
<q-toggle
dense
:label="$t('closedStatus')"
size="sm"
v-model="shape"
val="md"
/>
</div>
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
<q-btn
v-if="prop.node.isHeadOffice"
class="color-brach-tree-btn"
2024-04-09 17:28:59 +07:00
@click.stop
size="lg"
dense
flat
name="menu"
>
2024-04-09 17:28:59 +07:00
<Icon icon="ri:more-2-fill" width="16px" />
<q-menu class="bordered" style="width: 150px">
2024-04-09 17:21:34 +07:00
<q-list>
<q-item
clickable
v-close-popup
dense
@click="triggerEditHeadOffice(prop.node.id)"
>
2024-04-09 17:21:34 +07:00
<q-item-section avatar class="q-py-sm">
<q-icon
2024-04-09 17:21:34 +07:00
style="color: hsl(var(--cyan-6-hsl))"
name="mdi-pencil-outline"
/>
</q-item-section>
2024-04-09 17:21:34 +07:00
<q-item-section>{{ $t('edit') }}</q-item-section>
</q-item>
<q-item
clickable
v-close-popup
dense
@click="triggerDeleteHeadOffice()"
>
2024-04-09 17:21:34 +07:00
<q-item-section avatar class="q-py-sm">
<q-icon
2024-04-09 17:21:34 +07:00
style="color: hsl(var(--red-6-hsl))"
name="mdi-trash-can-outline"
/>
</q-item-section>
<q-item-section>{{ $t('delete') }}</q-item-section>
</q-item>
2024-04-09 17:21:34 +07:00
<q-item v-close-popup dense>
<q-item-section class="q-py-sm">
<div
class="bg-branch-tree-toggle q-pa-sm"
style="border-radius: 6px"
2024-04-09 17:21:34 +07:00
:class="{ 'dark-toggle': $q.dark.isActive }"
>
<q-toggle
dense
:label="$t('closedStatus')"
size="sm"
v-model="shape"
val="md"
/>
</div>
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</template>
</q-tree>
</div>
</q-scroll-area>
</div>
<div v-if="openTableCard" class="col" style="overflow-y: auto">
2024-04-09 16:47:52 +07:00
<AppBox class="q-pb-none">
<div class="row">
<div class="col">
<q-select
style="width: 150px"
dense
outlined
v-model="inputSelectBranch"
:options="optionsBranch"
label="เลือก"
/>
</div>
<div class="col-2 q-pr-md">
<q-input dense outlined v-model="inputSearch">
2024-04-09 16:47:52 +07:00
<template #append>
<Icon icon="ic:baseline-search" />
</template>
</q-input>
</div>
<div class="col-2">
<q-select
style="width: 150px"
dense
outlined
v-model="inputFilter"
:options="optionsFilter"
/>
</div>
</div>
2024-04-09 16:47:52 +07:00
</AppBox>
2024-04-09 16:47:52 +07:00
<AppBox>
<TableCardComponent
2024-04-10 17:22:33 +07:00
@navigate="(v) => fetchSubBranch(v.id)"
@showCard="(v) => fetchCard(v.name)"
:sub-branch="subBranch"
:rows="rowsBranch"
/>
2024-04-09 16:47:52 +07:00
</AppBox>
</div>
<div
v-if="openCardDetails"
class="col bordered"
style="overflow-y: auto"
>
2024-04-09 15:54:47 +07:00
<CardDetailsComponent
2024-04-09 16:47:52 +07:00
:data="showCurrentBranch as Branch"
2024-04-09 15:54:47 +07:00
class="q-pa-sm"
/>
</div>
2024-04-09 16:47:52 +07:00
</AppBox>
</AppBox>
2024-04-02 17:47:32 +07:00
</div>
2024-04-09 15:55:15 +07:00
<DeatailsBranchDrawerComponent
v-model:open="openBranchDrawer"
2024-04-09 16:47:52 +07:00
:data="showCurrentBranch as Branch"
2024-04-09 15:55:15 +07:00
/>
<FormDialog
v-model:modal="modal"
addressTitle="ที่อยู่"
addressENTitle="address"
v-model:address="formData.address"
v-modeladdressEN="formData.addressEN"
v-model:provinceId="formData.provinceId as string"
v-model:districtId="formData.districtId as string"
v-model:subDistrictId="formData.subDistrictId as string"
v-model:zipCode="formData.zipCode"
:title="changeSubject(formType, typeBranch) as string"
:submit="() => submitForm(formType, typeBranch, formData, formDataContact)"
2024-04-09 15:55:15 +07:00
>
<template #top>
<div class="row full-width">
<div class="col">
<q-input
v-model="inputCode"
2024-04-09 15:55:15 +07:00
dense
outlined
label="รหัสสำนักงานใหญ่"
readonly
2024-04-09 15:55:15 +07:00
/>
</div>
<div class="col q-pl-md">
<q-input
v-model="formData.taxNo"
2024-04-09 15:55:15 +07:00
dense
outlined
label="เลขประจำตัวผู้เสียภาษี"
/>
</div>
</div>
<div class="row full-width">
<div class="col">
<q-input
v-model="formData.name"
2024-04-09 15:55:15 +07:00
dense
outlined
label="ชื่อสำนักงานใหญ่"
/>
</div>
<div class="col q-pl-md">
<q-input
v-model="formData.nameEN"
2024-04-09 15:55:15 +07:00
dense
outlined
label="ชื่อสำนักงานใหญ่ ภาษาอังกฤษ"
/>
</div>
</div>
</template>
<template #append>
<AppBox class="q-mt-md" style="background: var(--gray-1)">
<div class="row q-mb-md">
<div class="col">
<q-input
v-model="formDataContact.telephoneNo"
2024-04-09 15:55:15 +07:00
dense
outlined
label="เบอร์โทรศัพท์"
/>
</div>
<div class="col q-pl-md">
<q-input
v-model="formDataContact.lineId"
dense
outlined
label="id line"
/>
2024-04-09 15:55:15 +07:00
</div>
</div>
<div
style="
border: 2px dashed var(--gray-4);
border-radius: 10px;
background-image: linear-gradient(
180deg,
var(--indigo-0),
var(--sand-0)
);
"
class="q-pa-md column items-center justify-center full-width"
>
<div class="col q-pb-md" style="opacity: 0.3">
<q-btn
unelevated
class="bg-white"
style="border: 3px solid grey; border-radius: 6px"
>
<Icon icon="teenyicons:add-outline" width="20px" height="50px" />
</q-btn>
</div>
<div class="col">
<q-btn
style="
background: var(--blue-5);
color: var(--blue-0);
font-size: 12px;
"
unelevated
rounded
label="อัปโหลด QR Code"
></q-btn>
</div>
</div>
</AppBox>
</template>
<template #midBottom>
2024-04-09 15:55:15 +07:00
<div>
<div class="row full-width q-pb-md">
<div class="col q-pr-md">
<q-input
v-model="formData.telephoneNo"
2024-04-09 15:55:15 +07:00
dense
outlined
label="เบอร์โทรศัพท์สำนักงานใหฐ่"
/>
</div>
<div class="col">
<q-input
v-model="formData.email"
2024-04-09 15:55:15 +07:00
dense
outlined
label="อีเมลติดต่อสำนักงานใหญ่ "
/>
</div>
</div>
<div
class="column q-pa-sm full-width bordered"
style="border-radius: 6px"
>
<div class="col">location</div>
<div class="col self-center bg-image q-pa-md">
<q-btn
rounded
style="
background: var(--blue-5);
color: var(--blue-0);
font-size: 12px;
"
class="flex flrx-center"
label="location"
></q-btn>
</div>
</div>
</div>
</template>
</FormDialog>
2024-04-02 17:47:32 +07:00
</template>
<style scoped>
2024-04-09 15:55:15 +07:00
.bg-image {
background-image: url(/map.png);
background-repeat: no-repeat;
background-size: auto;
}
2024-04-09 17:11:59 +07:00
.branch-container {
--_color-branch-tree-text: var(--blue-6-hsl);
--_color-branch-title: var(--blue-10-hsl);
--_bg-branch-title: var(--_color-branch-title) / 0.08;
--_color-branch-btn: var(--cyan-6-hsl);
--_color-branch-tree-active: var(--blue-6-hsl);
--_bg-branch-tree-box: var(--gray-0-hsl);
--_bg-branch-tree-scroll: var(--gray-0-hsl);
--_color-branch-tree-scroll: var(--gray-0-hsl);
&.dark {
--_color-branch-title: var(--blue-0-hsl);
--_bg-branch-title: var(--gray-9-hsl) / 1;
--_color-branch-btn: var(--cyan-6-hsl);
--_color-branch-tree-active: var(--blue-6-hsl);
--_bg-branch-tree-box: var(--gray-10-hsl);
--_bg-branch-tree-scroll: var(--gray-11-hsl);
--_color-branch-tree-scroll: var(--gray-8-hsl);
}
}
.bg-branch-tree-toggle {
--_bg-branch-tree-toggle: var(--gray-3-hsl);
background: hsl(var(--_bg-branch-tree-toggle));
&.dark-toggle {
--_bg-branch-tree-toggle: var(--gray-9-hsl);
}
}
.bg-branch-tree-scroll {
background: hsl(var(--_bg-branch-tree-scroll));
color: hsl(var(--_color-branch-tree-scroll));
}
.bg-branch-tree-box {
background: hsl(var(--_bg-branch-tree-box));
}
.bg-card-branch-title {
background: hsla(var(--_bg-branch-title));
}
.color-card-branch-title {
color: hsl(var(--_color-branch-title));
}
.color-card-branch-btn {
color: hsl(var(--_color-branch-btn));
display: flex;
align-items: center;
}
.color-brach-tree-text,
.color-brach-tree-btn {
color: var(--stone-6);
}
.color-tree-active {
color: hsl(var(--_color-branch-tree-active));
}
.bg-branch-tree {
background: hsla(var(--_color-branch-tree-active) / 0.08);
&.dark-tree {
background: hsla(var(--_color-branch-tree-active) / 0.01);
border: 1px solid hsla(var(--_color-branch-tree-active));
}
}
</style>