Compare commits

...

4 Commits

Author SHA1 Message Date
ca56046e33 add dark-mode in calendar 2023-03-23 18:43:44 +05:30
cba602655d Converted <label> in <BaseLabel> 2023-03-23 17:24:03 +05:30
87495e8055 added dark-mode in BaseInputGroup and BaseLabel 2023-03-22 10:16:06 +05:30
15f3f566e3 Dark sidebar header (#1156)
* add dark mode in sidebar and header

* add dark theme in blade file
2023-03-20 15:50:27 +05:30
26 changed files with 317 additions and 196 deletions

View File

@ -83,25 +83,25 @@
@click="selectNote(index, close)" @click="selectNote(index, close)"
> >
<div class="flex justify-between px-2"> <div class="flex justify-between px-2">
<label <BaseLabel
class=" class="
m-0 !m-0
text-base !text-base
font-semibold !font-semibold
leading-tight !leading-tight
text-gray-700 !text-gray-700
cursor-pointer !cursor-pointer
" "
> >
{{ note.name }} {{ note.name }}
</label> </BaseLabel>
</div> </div>
</div> </div>
</div> </div>
<div v-else class="flex justify-center p-5 text-gray-400"> <div v-else class="flex justify-center p-5 text-gray-400">
<label class="text-base text-gray-500"> <BaseLabel class="!text-base !text-gray-500">
{{ $t('general.no_note_found') }} {{ $t('general.no_note_found') }}
</label> </BaseLabel>
</div> </div>
</div> </div>
<button <button
@ -122,19 +122,18 @@
@click="openNoteModal" @click="openNoteModal"
> >
<BaseIcon name="CheckCircleIcon" class="text-primary-400" /> <BaseIcon name="CheckCircleIcon" class="text-primary-400" />
<label <BaseLabel
class=" class="
m-0 !m-0
ml-3 !ml-3
text-sm !leading-none
leading-none !cursor-pointer
cursor-pointer !font-base
font-base !text-primary-400
text-primary-400
" "
> >
{{ $t('settings.customization.notes.add_new_note') }} {{ $t('settings.customization.notes.add_new_note') }}
</label> </BaseLabel>
</button> </button>
</div> </div>
</PopoverPanel> </PopoverPanel>

View File

@ -1,9 +1,9 @@
<template> <template>
<div class="flex items-center justify-between mb-3"> <div class="flex items-center justify-between mb-3">
<div class="flex items-center text-base" style="flex: 4"> <div class="flex items-center text-base" style="flex: 4">
<label class="pr-2 mb-0" align="right"> <BaseLabel class="!pr-2 !mb-0" align="right">
{{ $t('invoices.item.tax') }} {{ $t('invoices.item.tax') }}
</label> </BaseLabel>
<BaseMultiselect <BaseMultiselect
v-model="selectedTax" v-model="selectedTax"
@ -35,9 +35,9 @@
> >
<BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" /> <BaseIcon name="CheckCircleIcon" class="h-5 text-primary-400" />
<label <BaseLabel
class="ml-2 text-sm leading-none cursor-pointer text-primary-400" class="!ml-2 !leading-none !cursor-pointer !text-primary-400"
>{{ $t('invoices.add_new_tax') }}</label >{{ $t('invoices.add_new_tax') }}</BaseLabel
> >
</button> </button>
</template> </template>

View File

@ -5,9 +5,9 @@
> >
<SelectNotePopup :type="type" @select="onSelectNote" /> <SelectNotePopup :type="type" @select="onSelectNote" />
</div> </div>
<label class="text-gray-800 font-medium mb-4 text-sm"> <BaseLabel class="!text-gray-800 !mb-4 ">
{{ $t('invoices.notes') }} {{ $t('invoices.notes') }}
</label> </BaseLabel>
<BaseCustomInput <BaseCustomInput
v-model="store[storeProp].notes" v-model="store[storeProp].notes"
:content-loading="store.isFetchingInitialSettings" :content-loading="store.isFetchingInitialSettings"

View File

@ -16,12 +16,12 @@
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <BaseLabel
v-else v-else
class="text-sm font-semibold leading-5 text-gray-400 uppercase" class="!font-semibold !text-gray-400 !uppercase"
> >
{{ $t('estimates.sub_total') }} {{ $t('estimates.sub_total') }}
</label> </BaseLabel>
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
@ -29,7 +29,7 @@
<label <label
v-else v-else
class="flex items-center justify-center m-0 text-lg text-black uppercase " class="flex items-center justify-center m-0 text-lg text-black dark:text-white uppercase "
> >
<BaseFormatMoney <BaseFormatMoney
:amount="store.getSubTotal" :amount="store.getSubTotal"
@ -48,7 +48,7 @@
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <label
v-else-if="store[storeProp].tax_per_item === 'YES'" v-else-if="store[storeProp].tax_per_item === 'YES'"
class="m-0 text-sm font-semibold leading-5 text-gray-500 uppercase" class="m-0 text-sm font-semibold leading-5 text-gray-500 uppercase dark:text-gray-400"
> >
{{ tax.name }} - {{ tax.percent }}% {{ tax.name }} - {{ tax.percent }}%
</label> </label>
@ -59,7 +59,7 @@
<label <label
v-else-if="store[storeProp].tax_per_item === 'YES'" v-else-if="store[storeProp].tax_per_item === 'YES'"
class="flex items-center justify-center m-0 text-lg text-black uppercase " class="flex items-center justify-center m-0 text-lg text-black dark:text-white uppercase "
> >
<BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" /> <BaseFormatMoney :amount="tax.amount" :currency="defaultCurrency" />
</label> </label>
@ -75,12 +75,12 @@
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <BaseLabel
v-else v-else
class="text-sm font-semibold leading-5 text-gray-400 uppercase" class=" !font-semibold !text-gray-400 !uppercase"
> >
{{ $t('estimates.discount') }} {{ $t('estimates.discount') }}
</label> </BaseLabel>
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText <BaseContentPlaceholdersText
:lines="1" :lines="1"
@ -171,21 +171,21 @@
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <BaseLabel
v-else v-else
class="m-0 text-sm font-semibold leading-5 text-gray-400 uppercase" class="!m-0 !font-semibold !text-gray-400 !uppercase"
>{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</label >{{ $t('estimates.total') }} {{ $t('estimates.amount') }}:</BaseLabel
> >
<BaseContentPlaceholders v-if="isLoading"> <BaseContentPlaceholders v-if="isLoading">
<BaseContentPlaceholdersText :lines="1" class="w-16 h-5" /> <BaseContentPlaceholdersText :lines="1" class="w-16 h-5" />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <BaseLabel
v-else v-else
class="flex items-center justify-center text-lg uppercase text-primary-400" class="!flex !items-center !justify-center !text-lg !uppercase !text-primary-400"
> >
<BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" /> <BaseFormatMoney :amount="store.getTotal" :currency="defaultCurrency" />
</label> </BaseLabel>
</div> </div>
</div> </div>
</template> </template>

View File

@ -1,9 +1,9 @@
<template> <template>
<div class="flex items-center justify-between w-full mt-2 text-sm"> <div class="flex items-center justify-between w-full mt-2 text-sm">
<label class="font-semibold leading-5 text-gray-500 uppercase"> <BaseLabel class="!font-semibold !text-gray-500 !uppercase">
{{ tax.name }} ({{ tax.percent }} %) {{ tax.name }} ({{ tax.percent }} %)
</label> </BaseLabel>
<label class="flex items-center justify-center text-lg text-black"> <label class="flex items-center justify-center text-lg text-black dark:text-white">
<BaseFormatMoney :amount="tax.amount" :currency="currency" /> <BaseFormatMoney :amount="tax.amount" :currency="currency" />
<BaseIcon <BaseIcon

View File

@ -88,38 +88,37 @@
@click="selectTaxType(taxType, close)" @click="selectTaxType(taxType, close)"
> >
<div class="flex justify-between px-2"> <div class="flex justify-between px-2">
<label <BaseLabel
class=" class="
m-0 !m-0
text-base !text-base
font-semibold !font-semibold
leading-tight !leading-tight
text-gray-700 !cursor-pointer
cursor-pointer
" "
> >
{{ taxType.name }} {{ taxType.name }}
</label> </BaseLabel>
<label <BaseLabel
class=" class="
m-0 !m-0
text-base !text-base
font-semibold !font-semibold
text-gray-700 !text-gray-700
cursor-pointer !cursor-pointer
" "
> >
{{ taxType.percent }} % {{ taxType.percent }} %
</label> </BaseLabel>
</div> </div>
</div> </div>
</div> </div>
<div v-else class="flex justify-center p-5 text-gray-400"> <div v-else class="flex justify-center p-5 text-gray-400">
<label class="text-base text-gray-500 cursor-pointer"> <BaseLabel class="!text-base !text-gray-500 !cursor-pointer">
{{ $t('general.no_tax_found') }} {{ $t('general.no_tax_found') }}
</label> </BaseLabel>
</div> </div>
</div> </div>
@ -142,19 +141,18 @@
@click="openTaxTypeModal" @click="openTaxTypeModal"
> >
<BaseIcon name="CheckCircleIcon" class="text-primary-400" /> <BaseIcon name="CheckCircleIcon" class="text-primary-400" />
<label <BaseLabel
class=" class="
m-0 !m-0
ml-3 !ml-3
text-sm !leading-none
leading-none !cursor-pointer
cursor-pointer !font-base
font-base !text-primary-400
text-primary-400
" "
> >
{{ $t('estimates.add_new_tax') }} {{ $t('estimates.add_new_tax') }}
</label> </BaseLabel>
</button> </button>
</div> </div>
</PopoverPanel> </PopoverPanel>

View File

@ -1,9 +1,9 @@
<template> <template>
<div> <div>
<label class="flex text-gray-800 font-medium text-sm mb-2"> <BaseLabel class="!flex !text-gray-800 !mb-2">
{{ $t('general.select_template') }} {{ $t('general.select_template') }}
<span class="text-sm text-red-500"> *</span> <span class="text-sm text-red-500"> *</span>
</label> </BaseLabel>
<BaseButton <BaseButton
type="button" type="button"
class="flex justify-center w-full text-sm lg:w-auto hover:bg-gray-200" class="flex justify-center w-full text-sm lg:w-auto hover:bg-gray-200"

View File

@ -15,6 +15,13 @@
bg-gradient-to-r bg-gradient-to-r
from-primary-500 from-primary-500
to-primary-400 to-primary-400
dark:from-gray-700/70 dark:to-gray-800/70
bg-primary-500
dark:bg-transparent
dark:backdrop-blur-xl
dark:shadow-glass
dark:border
dark:border-white/10
" "
> >
<router-link <router-link
@ -53,6 +60,7 @@
cursor-pointer cursor-pointer
md:hidden md:ml-0 md:hidden md:ml-0
hover:bg-gray-100 hover:bg-gray-100
dark:bg-gray-800 dark:border-gray-500 dark:border
" "
@click.prevent="onToggle" @click.prevent="onToggle"
> >

View File

@ -15,7 +15,9 @@
leave-from="opacity-100" leave-from="opacity-100"
leave-to="opacity-0" leave-to="opacity-0"
> >
<DialogOverlay class="fixed inset-0 bg-gray-600 bg-opacity-75" /> <DialogOverlay
class="fixed inset-0 bg-gray-600 bg-opacity-75 dark:bg-gray-900/90"
/>
</TransitionChild> </TransitionChild>
<TransitionChild <TransitionChild
@ -27,7 +29,9 @@
leave-from="translate-x-0" leave-from="translate-x-0"
leave-to="-translate-x-full" leave-to="-translate-x-full"
> >
<div class="relative flex flex-col flex-1 w-full max-w-xs bg-white"> <div
class="relative flex flex-col flex-1 w-full max-w-xs bg-white dark:bg-gray-800"
>
<TransitionChild <TransitionChild
as="template" as="template"
enter="ease-in-out duration-300" enter="ease-in-out duration-300"
@ -40,18 +44,17 @@
<div class="absolute top-0 right-0 pt-2 -mr-12"> <div class="absolute top-0 right-0 pt-2 -mr-12">
<button <button
class=" class="
flex flex
items-center items-center
justify-center justify-center
w-10 w-10
h-10 h-10
ml-1 ml-1
rounded-full rounded-full
focus:outline-none focus:outline-none
focus:ring-2 focus:ring-2
focus:ring-inset focus:ring-inset
focus:ring-white focus:ring-white"
"
@click="globalStore.setSidebarVisibility(false)" @click="globalStore.setSidebarVisibility(false)"
> >
<span class="sr-only">Close sidebar</span> <span class="sr-only">Close sidebar</span>
@ -82,8 +85,8 @@
:to="item.link" :to="item.link"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 border-primary-500 bg-gray-100 ' ? 'text-primary-500 border-primary-500 bg-gray-100 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
: 'text-black', : 'text-black dark:text-gray-300',
'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium', 'cursor-pointer px-0 pl-4 py-3 border-transparent flex items-center border-l-4 border-solid text-sm not-italic font-medium',
]" ]"
@click="globalStore.setSidebarVisibility(false)" @click="globalStore.setSidebarVisibility(false)"
@ -100,6 +103,10 @@
/> />
{{ $t(item.title) }} {{ $t(item.title) }}
</router-link> </router-link>
<LightDarkSwitch
:show-label="false"
class="absolute right-6 top-6 !w-auto"
/>
</nav> </nav>
</div> </div>
</div> </div>
@ -113,17 +120,16 @@
<!-- DESKTOP MENU --> <!-- DESKTOP MENU -->
<div <div
class=" class="
hidden hidden
w-56 w-56
h-screen h-screen
pb-32 bg-white
overflow-y-auto border-r border-gray-200 border-solid
bg-white xl:w-64
border-r border-gray-200 border-solid md:fixed md:flex md:flex-col md:inset-y-0
xl:w-64 pt-16
md:fixed md:flex md:flex-col md:inset-y-0 dark:border-gray-800
pt-16 dark:bg-gray-800/80"
"
> >
<div <div
v-for="menu in globalStore.menuGroups" v-for="menu in globalStore.menuGroups"
@ -136,8 +142,8 @@
:to="item.link" :to="item.link"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 border-primary-500 bg-gray-100 ' ? 'text-primary-500 border-primary-500 bg-gray-100 dark:border-primary-400 dark:shadow-glass dark:backdrop-blur-xl dark:hover:bg-gray-700 dark:bg-gray-700/50 dark:text-primary-400 dark:font-medium'
: 'text-black', : 'text-black dark:hover:bg-transparent dark:hover:text-white dark:text-gray-300',
'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium', 'cursor-pointer px-0 pl-6 hover:bg-gray-50 py-3 group flex items-center border-l-4 border-solid border-transparent text-sm not-italic font-medium',
]" ]"
> >
@ -145,8 +151,8 @@
:name="item.icon" :name="item.icon"
:class="[ :class="[
hasActiveUrl(item.link) hasActiveUrl(item.link)
? 'text-primary-500 group-hover:text-primary-500 ' ? 'text-primary-500 group-hover:text-primary-500 dark:text-primary-400 dark:group-hover:text-primary-500 '
: 'text-gray-400 group-hover:text-black', : 'text-gray-400 group-hover:text-black dark:text-gray-400 dark:group-hover:text-white',
'mr-4 shrink-0 h-5 w-5 ', 'mr-4 shrink-0 h-5 w-5 ',
]" ]"
/> />
@ -154,6 +160,9 @@
{{ $t(item.title) }} {{ $t(item.title) }}
</router-link> </router-link>
</div> </div>
<LightDarkSwitch
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
/>
</div> </div>
</template> </template>
@ -169,6 +178,7 @@ import {
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useGlobalStore } from '@/scripts/admin/stores/global' import { useGlobalStore } from '@/scripts/admin/stores/global'
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
const route = useRoute() const route = useRoute()
const globalStore = useGlobalStore() const globalStore = useGlobalStore()

View File

@ -34,6 +34,7 @@ export const useGlobalStore = (useWindow = false) => {
isAppLoaded: false, isAppLoaded: false,
isSidebarOpen: false, isSidebarOpen: false,
areCurrenciesLoading: false, areCurrenciesLoading: false,
isDarkModeOn: false,
downloadReport: null, downloadReport: null,
}), }),
@ -70,8 +71,8 @@ export const useGlobalStore = (useWindow = false) => {
moduleStore.apiToken = response.data.global_settings.api_token moduleStore.apiToken = response.data.global_settings.api_token
moduleStore.enableModules = response.data.modules moduleStore.enableModules = response.data.modules
// company store // company store
companyStore.companies = response.data.companies companyStore.companies = response.data.companies
companyStore.selectedCompany = response.data.current_company companyStore.selectedCompany = response.data.current_company
companyStore.setSelectedCompany(response.data.current_company) companyStore.setSelectedCompany(response.data.current_company)
companyStore.selectedCompanySettings = companyStore.selectedCompanySettings =

View File

@ -53,7 +53,7 @@
</div> </div>
</div> </div>
<div v-else class="mt-24"> <div v-else class="mt-24">
<label class="flex items-center justify-center text-gray-500"> <label class="flex items-center justify-center text-gray-500 dark:text-gray-300">
{{ $t('modules.no_modules_installed') }} {{ $t('modules.no_modules_installed') }}
</label> </label>
</div> </div>

View File

@ -215,9 +215,9 @@
<SelectNotePopup type="Payment" @select="onSelectNote" /> <SelectNotePopup type="Payment" @select="onSelectNote" />
</div> </div>
<label class="mb-4 text-sm font-medium text-gray-800"> <BaseLabel class="!mb-4 !text-gray-800">
{{ $t('estimates.notes') }} {{ $t('estimates.notes') }}
</label> </BaseLabel>
<BaseCustomInput <BaseCustomInput
v-model="paymentStore.currentPayment.notes" v-model="paymentStore.currentPayment.notes"

View File

@ -4,9 +4,9 @@
:description="$t('settings.update_app.description')" :description="$t('settings.update_app.description')"
> >
<div class="pb-8 ml-0"> <div class="pb-8 ml-0">
<label class="text-sm not-italic font-medium input-label"> <BaseLabel class="!input-label">
{{ $t('settings.update_app.current_version') }} {{ $t('settings.update_app.current_version') }}
</label> </BaseLabel>
<div <div
class=" class="
@ -64,9 +64,9 @@
</div> </div>
</div> </div>
<label class="text-sm not-italic font-medium input-label"> <BaseLabel class="!input-label">
{{ $t('settings.update_app.next_version') }} {{ $t('settings.update_app.next_version') }}
</label> </BaseLabel>
<br /> <br />
<div <div
class=" class="
@ -99,9 +99,9 @@
v-html="description" v-html="description"
></div> ></div>
<label class="text-sm not-italic font-medium input-label"> <BaseLabel class=" !input-label">
{{ $t('settings.update_app.requirements') }} {{ $t('settings.update_app.requirements') }}
</label> </BaseLabel>
<table class="w-1/2 mt-2 border-2 border-gray-200 BaseTable-fixed"> <table class="w-1/2 mt-2 border-2 border-gray-200 BaseTable-fixed">
<tr <tr

View File

@ -97,6 +97,7 @@
whitespace-nowrap whitespace-nowrap
mr-2 mr-2
min-w-[200px] min-w-[200px]
dark:text-primary-400
" "
> >
{{ element.label }} {{ element.label }}

View File

@ -50,20 +50,20 @@
pb-4 pb-4
" "
> >
<label <BaseLabel
class=" class="
px-3 !px-3
py-2 !py-2
text-xs !text-xs
font-semibold !font-semibold
text-gray-400 !text-gray-400
mb-0.5 !mb-0.5
block !block
uppercase !uppercase
" "
> >
{{ $t('company_switcher.label') }} {{ $t('company_switcher.label') }}
</label> </BaseLabel>
<div <div
v-if="companyStore.companies.length < 1" v-if="companyStore.companies.length < 1"

View File

@ -62,9 +62,9 @@
</div> </div>
<div v-else> <div v-else>
<div v-if="usersStore.customerList.length > 0"> <div v-if="usersStore.customerList.length > 0">
<label class="text-sm text-gray-400 mb-0.5 block px-2 uppercase"> <BaseLabel class="!text-gray-400 !mb-0.5 !block !px-2 !uppercase">
{{ $t('global_search.customers') }} {{ $t('global_search.customers') }}
</label> </BaseLabel>
<div <div
v-for="(customer, index) in usersStore.customerList" v-for="(customer, index) in usersStore.customerList"
:key="index" :key="index"
@ -108,11 +108,11 @@
</div> </div>
<div v-if="usersStore.userList.length > 0" class="mt-2"> <div v-if="usersStore.userList.length > 0" class="mt-2">
<label <BaseLabel
class="text-sm text-gray-400 mb-2 block px-2 mb-0.5 uppercase" class="!text-gray-400 !mb-2 !block !px-2 !uppercase"
> >
{{ $t('global_search.users') }} {{ $t('global_search.users') }}
</label> </BaseLabel>
<div <div
v-for="(user, index) in usersStore.userList" v-for="(user, index) in usersStore.userList"
:key="index" :key="index"

View File

@ -0,0 +1,101 @@
<!-- This example requires Tailwind CSS v2.0+ -->
<script lang="ts" setup>
import { Switch, SwitchGroup, SwitchLabel } from '@headlessui/vue'
import { useGlobalStore } from '@/scripts/admin/stores/global'
import { computed, ref } from 'vue'
defineProps({
showLabel: {
type: Boolean,
default: true,
},
vertical: {
type: Boolean,
default: false,
},
})
const globalStore = useGlobalStore()
const enabled = ref(
localStorage.getItem('theme') === 'dark' ||
document.documentElement.classList.contains('dark')
)
globalStore.isDarkModeOn = enabled
function onChange(val) {
if (val) {
localStorage.theme = 'dark'
document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark')
globalStore.isDarkModeOn = true
} else {
localStorage.theme = 'light'
document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light')
globalStore.isDarkModeOn = false
}
}
</script>
<template>
<div class="w-full flex justify-center">
<SwitchGroup
as="div"
class="flex items-center"
:class="vertical ? 'flex-col justify-center' : 'flex-row'"
>
<Switch
v-model="enabled"
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:ring-offset-gray-700"
:class="[enabled ? 'bg-primary-600' : 'bg-gray-200']"
@update:modelValue="onChange"
>
<span class="sr-only">Use setting</span>
<span
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transform ring-0 transition ease-in-out duration-200"
:class="[enabled ? 'translate-x-5' : 'translate-x-0']"
>
<span
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
:class="[
enabled
? 'opacity-0 ease-out duration-100'
: 'opacity-100 ease-in duration-200',
]"
aria-hidden="true"
>
<BaseIcon class="h-3 w-3 text-yellow-500" name="SunIcon" />
</span>
<span
class="absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
:class="[
enabled
? 'opacity-100 ease-in duration-200'
: 'opacity-0 ease-out duration-100',
]"
aria-hidden="true"
>
<BaseIcon class="h-3 w-3 text-primary-500" name="MoonIcon" />
</span>
</span>
</Switch>
<SwitchLabel
v-if="showLabel"
as="span"
class="cursor-pointer"
:class="vertical ? 'px-1 text-center mt-2' : 'ml-3'"
>
<span
v-if="enabled"
class="text-sm font-medium text-gray-500 dark:text-gray-400"
>
Dark Mode
</span>
<span v-else class="text-sm font-medium text-gray-500">
Light Mode
</span>
</SwitchLabel>
</SwitchGroup>
</div>
</template>

View File

@ -15,7 +15,7 @@
v-if="label" v-if="label"
:for="id" :for="id"
:class="`font-medium ${ :class="`font-medium ${
disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600' disabled ? 'text-gray-400 cursor-not-allowed' : 'text-gray-600 dark:text-white'
} cursor-pointer `" } cursor-pointer `"
> >
{{ label }} {{ label }}

View File

@ -69,31 +69,29 @@
</div> </div>
<div class="grid grid-cols-2 gap-8 mt-2"> <div class="grid grid-cols-2 gap-8 mt-2">
<div v-if="selectedCustomer.billing" class="flex flex-col"> <div v-if="selectedCustomer.billing" class="flex flex-col">
<label <BaseLabel
class=" class="
mb-1 !mb-1
text-sm !text-left !text-gray-400
font-medium !uppercase
text-left text-gray-400 !whitespace-nowrap
uppercase
whitespace-nowrap
" "
> >
{{ $t('general.bill_to') }} {{ $t('general.bill_to') }}
</label> </BaseLabel>
<div <div
v-if="selectedCustomer.billing" v-if="selectedCustomer.billing"
class="flex flex-col flex-1 p-0 text-left" class="flex flex-col flex-1 p-0 text-left"
> >
<label <BaseLabel
v-if="selectedCustomer.billing.name" v-if="selectedCustomer.billing.name"
class="relative w-11/12 text-sm truncate" class="!relative !w-11/12 !truncate"
> >
{{ selectedCustomer.billing.name }} {{ selectedCustomer.billing.name }}
</label> </BaseLabel>
<label class="relative w-11/12 text-sm truncate"> <BaseLabel class="!relative !w-11/12 !truncate">
<span v-if="selectedCustomer.billing.city"> <span v-if="selectedCustomer.billing.city">
{{ selectedCustomer.billing.city }} {{ selectedCustomer.billing.city }}
</span> </span>
@ -108,42 +106,40 @@
<span v-if="selectedCustomer.billing.state"> <span v-if="selectedCustomer.billing.state">
{{ selectedCustomer.billing.state }} {{ selectedCustomer.billing.state }}
</span> </span>
</label> </BaseLabel>
<label <BaseLabel
v-if="selectedCustomer.billing.zip" v-if="selectedCustomer.billing.zip"
class="relative w-11/12 text-sm truncate" class="!relative !w-11/12 !truncate"
> >
{{ selectedCustomer.billing.zip }} {{ selectedCustomer.billing.zip }}
</label> </BaseLabel>
</div> </div>
</div> </div>
<div v-if="selectedCustomer.shipping" class="flex flex-col"> <div v-if="selectedCustomer.shipping" class="flex flex-col">
<label <BaseLabel
class=" class="
mb-1 !mb-1
text-sm !text-left !text-gray-400
font-medium !uppercase
text-left text-gray-400 !whitespace-nowrap
uppercase
whitespace-nowrap
" "
> >
{{ $t('general.ship_to') }} {{ $t('general.ship_to') }}
</label> </BaseLabel>
<div <div
v-if="selectedCustomer.shipping" v-if="selectedCustomer.shipping"
class="flex flex-col flex-1 p-0 text-left" class="flex flex-col flex-1 p-0 text-left"
> >
<label <BaseLabel
v-if="selectedCustomer.shipping.name" v-if="selectedCustomer.shipping.name"
class="relative w-11/12 text-sm truncate" class="!relative !w-11/12 !truncate"
> >
{{ selectedCustomer.shipping.name }} {{ selectedCustomer.shipping.name }}
</label> </BaseLabel>
<label class="relative w-11/12 text-sm truncate"> <BaseLabel class="!relative !w-11/12 !truncate">
<span v-if="selectedCustomer.shipping.city"> <span v-if="selectedCustomer.shipping.city">
{{ selectedCustomer.shipping.city }} {{ selectedCustomer.shipping.city }}
</span> </span>
@ -158,13 +154,13 @@
<span v-if="selectedCustomer.shipping.state"> <span v-if="selectedCustomer.shipping.state">
{{ selectedCustomer.shipping.state }} {{ selectedCustomer.shipping.state }}
</span> </span>
</label> </BaseLabel>
<label <BaseLabel
v-if="selectedCustomer.shipping.zip" v-if="selectedCustomer.shipping.zip"
class="relative w-11/12 text-sm truncate" class="!relative !w-11/12 !text-sm !truncate"
> >
{{ selectedCustomer.shipping.zip }} {{ selectedCustomer.shipping.zip }}
</label> </BaseLabel>
</div> </div>
</div> </div>
</div> </div>
@ -211,7 +207,7 @@
/> />
<div class="mt-1"> <div class="mt-1">
<label class="text-lg font-medium text-gray-900"> <label class="text-lg font-medium text-gray-900 dark:text-white">
{{ $t('customers.new_customer') }} {{ $t('customers.new_customer') }}
<span class="text-red-500"> * </span> <span class="text-red-500"> * </span>
</label> </label>
@ -335,9 +331,9 @@
v-if="customerStore.customers.length === 0" v-if="customerStore.customers.length === 0"
class="flex justify-center p-5 text-gray-400" class="flex justify-center p-5 text-gray-400"
> >
<label class="text-base text-gray-500 cursor-pointer"> <BaseLabel class="!text-base !text-gray-500 !cursor-pointer">
{{ $t('customers.no_customers_found') }} {{ $t('customers.no_customers_found') }}
</label> </BaseLabel>
</div> </div>
</ul> </ul>
</div> </div>
@ -362,19 +358,18 @@
> >
<BaseIcon name="UserAddIcon" class="text-primary-400" /> <BaseIcon name="UserAddIcon" class="text-primary-400" />
<label <BaseLabel
class=" class="
m-0 !m-0
ml-3 !ml-3
text-sm !leading-none
leading-none !cursor-pointer
cursor-pointer !font-base
font-base !text-primary-400
text-primary-400
" "
> >
{{ $t('customers.add_new_customer') }} {{ $t('customers.add_new_customer') }}
</label> </BaseLabel>
</button> </button>
</PopoverPanel> </PopoverPanel>
</div> </div>

View File

@ -28,6 +28,7 @@
:attributes="attrs" :attributes="attrs"
:model-config="config" :model-config="config"
:masks="masks" :masks="masks"
:is-dark="isDarkModeOn"
:locale="global.locale" :locale="global.locale"
> >
<template <template
@ -72,7 +73,7 @@
<template v-if="showExtraOptions" #footer> <template v-if="showExtraOptions" #footer>
<div <div
class="bg-gray-100 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg" class="bg-gray-800 grid grid-cols-3 gap-2 p-2 border-t rounded-b-lg"
> >
<button type="button" class="extra-button" @click="moveToDate(sourceDate)"> <button type="button" class="extra-button" @click="moveToDate(sourceDate)">
{{ global.t('date_picker.same_day') }} {{ global.t('date_picker.same_day') }}
@ -146,7 +147,7 @@ const props = defineProps({
defaultInputClass: { defaultInputClass: {
type: String, type: String,
default: default:
'border-2 font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black', 'border-2 dark:bg-gray-700 dark:border-gray-600 dark:text-white font-base pl-8 py-2 outline-none focus:ring-primary-400 focus:outline-none focus:border-primary-400 block w-full sm:text-sm border-gray-200 rounded-md text-black',
}, },
time24hr: { time24hr: {
type: Boolean, type: Boolean,
@ -171,7 +172,7 @@ const slots = useSlots()
const companyStore = useCompanyStore() const companyStore = useCompanyStore()
const { global } = window.i18n const { global } = window.i18n
const vCalendar = ref(null) const vCalendar = ref(null)
const isDarkModeOn = document.documentElement.classList.contains('dark')
const hasIconSlot = computed(() => { const hasIconSlot = computed(() => {
return !!slots.icon return !!slots.icon
}) })

View File

@ -4,10 +4,10 @@
<slot></slot> <slot></slot>
</div> </div>
<div class="mt-2"> <div class="mt-2">
<label class="font-medium">{{ title }}</label> <BaseLabel >{{ title }}</BaseLabel>
</div> </div>
<div class="mt-2"> <div class="mt-2">
<label class="text-gray-500"> <label class="text-gray-500 dark:text-gray-400">
{{ description }} {{ description }}
</label> </label>
</div> </div>

View File

@ -20,6 +20,7 @@
hover:text-gray-700 hover:text-gray-700
top-2.5 top-2.5
right-3.5 right-3.5
dark:text-gray-300
" "
@click="$emit('clear')" @click="$emit('clear')"
> >

View File

@ -3,18 +3,15 @@
<BaseContentPlaceholders v-if="contentLoading"> <BaseContentPlaceholders v-if="contentLoading">
<BaseContentPlaceholdersText :lines="1" :class="contentLoadClass" /> <BaseContentPlaceholdersText :lines="1" :class="contentLoadClass" />
</BaseContentPlaceholders> </BaseContentPlaceholders>
<label <BaseLabel
v-else-if="label" v-else-if="label"
:class="labelClasses" :class="labelClasses"
class=" class="
flex !flex
text-sm !items-center
not-italic !text-gray-800
items-center !whitespace-nowrap
font-medium !justify-between
text-gray-800
whitespace-nowrap
justify-between
" "
> >
<div> <div>
@ -28,10 +25,10 @@
name="InformationCircleIcon" name="InformationCircleIcon"
class="h-4 text-gray-400 cursor-pointer hover:text-gray-600" class="h-4 text-gray-400 cursor-pointer hover:text-gray-600"
/> />
</label> </BaseLabel>
<div :class="inputContainerClasses"> <div :class="inputContainerClasses">
<slot></slot> <slot></slot>
<span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light"> <span v-if="helpText" class="text-gray-500 text-xs mt-1 font-light dark:text-gray-400">
{{ helpText }} {{ helpText }}
</span> </span>
<span v-if="error" class="block mt-0.5 text-sm text-red-500"> <span v-if="error" class="block mt-0.5 text-sm text-red-500">

View File

@ -1,5 +1,5 @@
<template> <template>
<label class="text-sm not-italic font-medium leading-5 text-primary-800"> <label class="text-sm not-italic font-medium leading-5 text-primary-800 dark:!text-gray-300">
<slot /> <slot />
</label> </label>
</template> </template>

View File

@ -17,7 +17,7 @@
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Module Styles --> <!-- Module Styles -->
@foreach(\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path) @foreach (\Crater\Services\Module\ModuleFacade::allStyles() as $name => $path)
<link rel="stylesheet" href="/modules/styles/{{ $name }}"> <link rel="stylesheet" href="/modules/styles/{{ $name }}">
@endforeach @endforeach
@ -25,8 +25,8 @@
</head> </head>
<body <body
class="h-full overflow-hidden bg-gray-100 font-base class="h-full overflow-hidden bg-gray-100 dark:bg-gray-900 dark:text-white font-base
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif "> @if (isset($current_theme)) theme-{{ $current_theme }} @else theme-{{ get_app_setting('admin_portal_theme') ?? 'crater' }} @endif ">
<!-- Module Scripts --> <!-- Module Scripts -->
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path) @foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
@ -38,6 +38,14 @@
@endforeach @endforeach
<script type="module"> <script type="module">
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
document.documentElement.style.setProperty('color-scheme', 'dark');
} else {
document.documentElement.classList.remove('dark')
document.documentElement.style.setProperty('color-scheme', 'light')
}
@if(isset($customer_logo)) @if(isset($customer_logo))
window.customer_logo = "/storage/{{$customer_logo}}" window.customer_logo = "/storage/{{$customer_logo}}"

View File

@ -19,6 +19,7 @@ module.exports = {
'./resources/scripts/**/*.js', './resources/scripts/**/*.js',
'./resources/scripts/**/*.vue', './resources/scripts/**/*.vue',
], ],
darkMode: 'class',
theme: { theme: {
extend: { extend: {
colors: { colors: {