mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 11:41:09 -04:00
Compare commits
3 Commits
dark-sideb
...
dark-base-
| Author | SHA1 | Date | |
|---|---|---|---|
| 9275010c0e | |||
| 1307c2dfe1 | |||
| 15f3f566e3 |
@ -15,6 +15,13 @@
|
||||
bg-gradient-to-r
|
||||
from-primary-500
|
||||
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
|
||||
@ -53,6 +60,7 @@
|
||||
cursor-pointer
|
||||
md:hidden md:ml-0
|
||||
hover:bg-gray-100
|
||||
dark:bg-gray-800 dark:border-gray-500 dark:border
|
||||
"
|
||||
@click.prevent="onToggle"
|
||||
>
|
||||
|
||||
@ -15,7 +15,9 @@
|
||||
leave-from="opacity-100"
|
||||
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
|
||||
@ -27,7 +29,9 @@
|
||||
leave-from="translate-x-0"
|
||||
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
|
||||
as="template"
|
||||
enter="ease-in-out duration-300"
|
||||
@ -40,18 +44,17 @@
|
||||
<div class="absolute top-0 right-0 pt-2 -mr-12">
|
||||
<button
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white
|
||||
"
|
||||
flex
|
||||
items-center
|
||||
justify-center
|
||||
w-10
|
||||
h-10
|
||||
ml-1
|
||||
rounded-full
|
||||
focus:outline-none
|
||||
focus:ring-2
|
||||
focus:ring-inset
|
||||
focus:ring-white"
|
||||
@click="globalStore.setSidebarVisibility(false)"
|
||||
>
|
||||
<span class="sr-only">Close sidebar</span>
|
||||
@ -82,8 +85,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
? '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 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',
|
||||
]"
|
||||
@click="globalStore.setSidebarVisibility(false)"
|
||||
@ -100,6 +103,10 @@
|
||||
/>
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
<LightDarkSwitch
|
||||
:show-label="false"
|
||||
class="absolute right-6 top-6 !w-auto"
|
||||
/>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
@ -113,17 +120,16 @@
|
||||
<!-- DESKTOP MENU -->
|
||||
<div
|
||||
class="
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
pb-32
|
||||
overflow-y-auto
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
"
|
||||
hidden
|
||||
w-56
|
||||
h-screen
|
||||
bg-white
|
||||
border-r border-gray-200 border-solid
|
||||
xl:w-64
|
||||
md:fixed md:flex md:flex-col md:inset-y-0
|
||||
pt-16
|
||||
dark:border-gray-800
|
||||
dark:bg-gray-800/80"
|
||||
>
|
||||
<div
|
||||
v-for="menu in globalStore.menuGroups"
|
||||
@ -136,8 +142,8 @@
|
||||
:to="item.link"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 border-primary-500 bg-gray-100 '
|
||||
: 'text-black',
|
||||
? '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 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',
|
||||
]"
|
||||
>
|
||||
@ -145,8 +151,8 @@
|
||||
:name="item.icon"
|
||||
:class="[
|
||||
hasActiveUrl(item.link)
|
||||
? 'text-primary-500 group-hover:text-primary-500 '
|
||||
: 'text-gray-400 group-hover:text-black',
|
||||
? '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 dark:text-gray-400 dark:group-hover:text-white',
|
||||
'mr-4 shrink-0 h-5 w-5 ',
|
||||
]"
|
||||
/>
|
||||
@ -154,6 +160,9 @@
|
||||
{{ $t(item.title) }}
|
||||
</router-link>
|
||||
</div>
|
||||
<LightDarkSwitch
|
||||
class="absolute bottom-0 py-4 border-t border-gray-200 dark:border-gray-700"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -169,6 +178,7 @@ import {
|
||||
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useGlobalStore } from '@/scripts/admin/stores/global'
|
||||
import LightDarkSwitch from '@/scripts/components/LightDarkSwitcher.vue'
|
||||
|
||||
const route = useRoute()
|
||||
const globalStore = useGlobalStore()
|
||||
|
||||
@ -34,6 +34,7 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
isAppLoaded: false,
|
||||
isSidebarOpen: false,
|
||||
areCurrenciesLoading: false,
|
||||
isDarkModeOn: false,
|
||||
|
||||
downloadReport: null,
|
||||
}),
|
||||
@ -70,8 +71,8 @@ export const useGlobalStore = (useWindow = false) => {
|
||||
moduleStore.apiToken = response.data.global_settings.api_token
|
||||
moduleStore.enableModules = response.data.modules
|
||||
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
// company store
|
||||
companyStore.companies = response.data.companies
|
||||
companyStore.selectedCompany = response.data.current_company
|
||||
companyStore.setSelectedCompany(response.data.current_company)
|
||||
companyStore.selectedCompanySettings =
|
||||
|
||||
@ -113,10 +113,10 @@
|
||||
|
||||
<div v-if="companyStore.companies.length !== 1" class="py-5">
|
||||
<BaseDivider class="my-4" />
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||
<h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-white">
|
||||
{{ $tc('settings.company_info.delete_company') }}
|
||||
</h3>
|
||||
<div class="mt-2 max-w-xl text-sm text-gray-500">
|
||||
<div class="mt-2 max-w-xl text-sm text-gray-500 dark:text-gray-400">
|
||||
<p>
|
||||
{{ $tc('settings.company_info.delete_company_description') }}
|
||||
</p>
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
{{ $t('settings.menu_title.exchange_rate') }}
|
||||
</h6>
|
||||
<p
|
||||
class="mt-2 text-sm leading-snug text-left text-gray-500"
|
||||
class="mt-2 text-sm leading-snug text-left text-gray-500 dark:text-gray-400"
|
||||
style="max-width: 680px"
|
||||
>
|
||||
{{ $t('settings.exchange_rate.providers_description') }}
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
{{ $t(`settings.customization.${type}s.${type}_number_format`) }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t(`settings.customization.${type}s.${type}_number_format_description`)
|
||||
}}
|
||||
</p>
|
||||
"
|
||||
>
|
||||
{{ $t(`settings.customization.${type}s.${type}_number_format`) }}
|
||||
</BaseHeading>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="w-full mt-6 table-fixed">
|
||||
@ -29,6 +29,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
></th>
|
||||
<th
|
||||
@ -41,6 +42,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:text-gray-300 dark:border-gray-600
|
||||
"
|
||||
>
|
||||
Component
|
||||
@ -55,6 +57,7 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:text-gray-300 dark:border-gray-600
|
||||
"
|
||||
>
|
||||
Parameter
|
||||
@ -69,13 +72,14 @@
|
||||
leading-5
|
||||
text-left text-gray-700
|
||||
border-t border-b border-gray-200 border-solid
|
||||
dark:border-gray-600
|
||||
"
|
||||
></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<draggable
|
||||
v-model="selectedFields"
|
||||
class="divide-y divide-gray-200"
|
||||
class="divide-y divide-gray-200 dark:divide-gray-600"
|
||||
item-key="id"
|
||||
tag="tbody"
|
||||
handle=".handle"
|
||||
@ -97,12 +101,13 @@
|
||||
whitespace-nowrap
|
||||
mr-2
|
||||
min-w-[200px]
|
||||
dark:text-primary-400
|
||||
"
|
||||
>
|
||||
{{ element.label }}
|
||||
</label>
|
||||
|
||||
<p class="text-xs text-gray-500 mt-1">
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400 mt-1">
|
||||
{{ element.description }}
|
||||
</p>
|
||||
</td>
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.convert_estimate_description')
|
||||
"
|
||||
>
|
||||
{{ $tc('settings.customization.estimates.convert_estimate_options') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{ $t('settings.customization.estimates.convert_estimate_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup required>
|
||||
<BaseRadio
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.estimates.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.estimates.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.estimates.expiry_date_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.estimates.expiry_date') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.estimates.expiry_date_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseSwitchSection
|
||||
v-model="expiryDateAutoField"
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.invoices.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.invoices.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$t('settings.customization.invoices.default_invoice_email_body')"
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
{{ $t('settings.customization.invoices.due_date') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.invoices.due_date_description') }}
|
||||
</p>
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.due_date_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.invoices.due_date') }}
|
||||
</BaseHeading>
|
||||
|
||||
<BaseSwitchSection
|
||||
v-model="dueDateAutoField"
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
<template>
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.invoices.retrospective_edits_description')
|
||||
"
|
||||
>
|
||||
{{ $tc('settings.customization.invoices.retrospective_edits') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500">
|
||||
{{ $t('settings.customization.invoices.retrospective_edits_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup required>
|
||||
<BaseRadio
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<h6 class="text-gray-900 text-lg font-medium">
|
||||
<BaseHeading
|
||||
type="heading-title"
|
||||
:subtitle="
|
||||
$t('settings.customization.payments.default_formats_description')
|
||||
"
|
||||
>
|
||||
{{ $t('settings.customization.payments.default_formats') }}
|
||||
</h6>
|
||||
<p class="mt-1 text-sm text-gray-500 mb-2">
|
||||
{{ $t('settings.customization.payments.default_formats_description') }}
|
||||
</p>
|
||||
</BaseHeading>
|
||||
|
||||
<BaseInputGroup
|
||||
:label="$t('settings.customization.payments.default_payment_email_body')"
|
||||
|
||||
101
resources/scripts/components/LightDarkSwitcher.vue
Normal file
101
resources/scripts/components/LightDarkSwitcher.vue
Normal 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>
|
||||
@ -2,6 +2,21 @@
|
||||
<h6 :class="typeClass">
|
||||
<slot />
|
||||
</h6>
|
||||
|
||||
<p
|
||||
v-if="subtitle"
|
||||
class="
|
||||
mt-2
|
||||
text-sm
|
||||
leading-snug
|
||||
text-gray-500
|
||||
dark:text-gray-400
|
||||
max-w-[680px]
|
||||
"
|
||||
>
|
||||
{{ subtitle }}
|
||||
</p>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@ -14,12 +29,16 @@ const props = defineProps({
|
||||
return ['section-title', 'heading-title'].indexOf(value) !== -1
|
||||
},
|
||||
},
|
||||
subtitle: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
})
|
||||
|
||||
const typeClass = computed(() => {
|
||||
return {
|
||||
'text-gray-900 text-lg font-medium': props.type === 'heading-title',
|
||||
'text-gray-500 uppercase text-base': props.type === 'section-title',
|
||||
'text-gray-900 text-lg font-medium dark:text-white': props.type === 'heading-title',
|
||||
'text-gray-500 uppercase text-base dark:text-gray-300': props.type === 'section-title',
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
mt-2
|
||||
text-sm
|
||||
leading-snug
|
||||
text-left text-gray-500
|
||||
text-left text-gray-500 dark:text-gray-400
|
||||
max-w-[680px]
|
||||
"
|
||||
>
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<!-- 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 }}">
|
||||
@endforeach
|
||||
|
||||
@ -25,8 +25,8 @@
|
||||
</head>
|
||||
|
||||
<body
|
||||
class="h-full overflow-hidden bg-gray-100 font-base
|
||||
@if(isset($current_theme)) theme-{{ $current_theme }} @else theme-{{get_app_setting('admin_portal_theme') ?? 'crater'}} @endif ">
|
||||
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 ">
|
||||
|
||||
<!-- Module Scripts -->
|
||||
@foreach (\Crater\Services\Module\ModuleFacade::allScripts() as $name => $path)
|
||||
@ -38,6 +38,14 @@
|
||||
@endforeach
|
||||
|
||||
<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))
|
||||
|
||||
window.customer_logo = "/storage/{{$customer_logo}}"
|
||||
@ -57,12 +65,12 @@
|
||||
|
||||
window.login_page_description = "{{$login_page_description}}"
|
||||
|
||||
@endif
|
||||
@endif
|
||||
@if(isset($copyright_text))
|
||||
|
||||
window.copyright_text = "{{$copyright_text}}"
|
||||
|
||||
@endif
|
||||
@endif
|
||||
|
||||
window.Crater.start()
|
||||
</script>
|
||||
|
||||
@ -19,6 +19,7 @@ module.exports = {
|
||||
'./resources/scripts/**/*.js',
|
||||
'./resources/scripts/**/*.vue',
|
||||
],
|
||||
darkMode: 'class',
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
|
||||
Reference in New Issue
Block a user