mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
241 lines
7.7 KiB
HTML
241 lines
7.7 KiB
HTML
|
|
<style>
|
|||
|
|
:root{
|
|||
|
|
--ms-color-bg: #FFF;
|
|||
|
|
}
|
|||
|
|
:root.dark{
|
|||
|
|
--ms-color-bg: #000;
|
|||
|
|
}
|
|||
|
|
.ms-color-palette{
|
|||
|
|
font-size:0;
|
|||
|
|
}
|
|||
|
|
.ms-color-palette .ms-color-gradient:nth-child(10n){
|
|||
|
|
margin-right: 20px;
|
|||
|
|
}
|
|||
|
|
.ms-color-palette .ms-color-gradient:nth-child(20n){
|
|||
|
|
display: table-column;
|
|||
|
|
}
|
|||
|
|
.ms-color-gradient{
|
|||
|
|
display: inline-block;
|
|||
|
|
position: relative;
|
|||
|
|
width: 20px;
|
|||
|
|
height:20px;
|
|||
|
|
margin-bottom: 15px;
|
|||
|
|
margin-right: 5px;
|
|||
|
|
transition-duration:0.1s;
|
|||
|
|
}
|
|||
|
|
.ms-color-gradient:hover{
|
|||
|
|
transform:scale(1.5);
|
|||
|
|
z-index: 999;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.ms-color-edit-picker>div{
|
|||
|
|
border-color: transparent !important;
|
|||
|
|
}
|
|||
|
|
.ms-color-edit-picker i{
|
|||
|
|
display: none;
|
|||
|
|
}
|
|||
|
|
.ms-color-edit-picker span{
|
|||
|
|
border-color: #5f5f60;
|
|||
|
|
}
|
|||
|
|
.ms-color-edit-picker .layui-colorpicker-trigger-bgcolor{
|
|||
|
|
display: inline;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
</style>
|
|||
|
|
<div style="padding: 20px;background-color: var(--ms-color-bg);">
|
|||
|
|
<div style="display: flex;justify-content: space-between;align-items: center;">
|
|||
|
|
<div style="display: flex;" >
|
|||
|
|
<label style="display: flex; position: relative; top: 1px; margin-right: 10px;" title="降低饱和度,提高亮度,暗色下更舒适">
|
|||
|
|
深色色板
|
|||
|
|
<input name="colorpicker" type="checkbox" style="height: 20px; width: 20px;">
|
|||
|
|
</label>
|
|||
|
|
<label title="类名/属性名例如 .dark,[theme-mode='dark']">
|
|||
|
|
自定义主题类/属性选择器
|
|||
|
|
<input name="theme-prefix" type="input" style="height: 18px; width: 150px;">
|
|||
|
|
</label>
|
|||
|
|
<i id="theme-prefix-tips" class="layui-icon layui-icon-tips" style="position: relative; top: 3.5px;margin-left: 2px;"></i>
|
|||
|
|
</div>
|
|||
|
|
<div style="display: flex;" >
|
|||
|
|
<span title="重置"><i id="resetTheme" style="font-size: 23px;" class="layui-icon layui-icon-refresh"></i></span>
|
|||
|
|
<span title="下载"><i id="downloadCSS" style="font-size: 23px;margin-left: 10px;" class="layui-icon layui-icon-download-circle"></i></span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<hr>
|
|||
|
|
<div class="ms-color-palette">
|
|||
|
|
<!-- 色板 tpl 生成 -->
|
|||
|
|
</div>
|
|||
|
|
<div class="ms-color-edit">
|
|||
|
|
<!-- 编辑区 tpl 生成 -->
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<template id="tpl-color-palette">
|
|||
|
|
{{# layui.each(d.ColorPaletteLight, function(key, val){ }}
|
|||
|
|
<div class="ms-color-gradient" style="background-color: var({{- key }});" title="{{- key.replace('--lay-color-','') }}"></div>
|
|||
|
|
{{# }) }}
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<template id="tpl-color-editable">
|
|||
|
|
{{# layui.each(d.editable, function(key, val){ }}
|
|||
|
|
<div style="display: flex; align-items: center; height:30px">
|
|||
|
|
<div>{{= key }}</div>
|
|||
|
|
<div style="flex: 1 1 auto;"></div>
|
|||
|
|
<input type="text" name="color" value="{{= val }}" placeholder=""
|
|||
|
|
style="text-align: right;height:28px;width: 150px;background-color: transparent;border-color: transparent;">
|
|||
|
|
<div class="ms-color-edit-picker" lay-options="{color: '{{= val }}', format: '{{- /^rgb/.test(val) ? 'rgb':'hex' }}' }" data-key="{{= key}}"></div>
|
|||
|
|
</div>
|
|||
|
|
{{# }) }}
|
|||
|
|
</template>
|
|||
|
|
<template id="tpl-theme-prefix-example">
|
|||
|
|
<pre class="layui-code code-demo" lay-options="{}" style="margin: 0; padding: 0;">
|
|||
|
|
/** .dark,通过改变 html 标签的类名切换主题*/
|
|||
|
|
:root{ :root.dark{
|
|||
|
|
--color-bg: #000; --color-bg: #000;
|
|||
|
|
} ==> }
|
|||
|
|
.lay-card{ .dark .lay-card{}
|
|||
|
|
color: #FFF; color: #FFF;
|
|||
|
|
} }
|
|||
|
|
/** js */
|
|||
|
|
// 设置为暗色主题
|
|||
|
|
document.documentElement.classList.add('dark')
|
|||
|
|
// 恢复亮色主题
|
|||
|
|
document.documentElement.classList.remove('dark')
|
|||
|
|
// 切换亮/暗主题
|
|||
|
|
document.documentElement.classList.toggle('dark')
|
|||
|
|
----------------------------------------------------------
|
|||
|
|
/** [theme-mode='dark'],通过改变 html 标签上 theme-mode 的属性切换主题*/
|
|||
|
|
:root{ :root[theme-mode='dark']{
|
|||
|
|
--color-bg: #000; --color-bg: #000;
|
|||
|
|
} ==> }
|
|||
|
|
.lay-card{ [theme-mode='dark'] .lay-card{}
|
|||
|
|
color: #FFF; color: #FFF;
|
|||
|
|
} }
|
|||
|
|
/** js */
|
|||
|
|
// 设置为暗色主题
|
|||
|
|
document.documentElement.setAttribute('theme-mode', 'dark')
|
|||
|
|
// 恢复亮色主题
|
|||
|
|
document.documentElement.removeAttribute('theme-mode');
|
|||
|
|
</pre>
|
|||
|
|
</template>
|
|||
|
|
<script src="static/lib/less.js"></script>
|
|||
|
|
<script>
|
|||
|
|
layui.use(async ()=> {
|
|||
|
|
const {jquery:$,laytpl,colorpicker,layer} = layui;
|
|||
|
|
|
|||
|
|
const originalData=await (await fetch('./assets/themes.json')).json()
|
|||
|
|
let customTheme = {};
|
|||
|
|
|
|||
|
|
laytpl($('#tpl-color-palette').html()).render(originalData,function(str) {
|
|||
|
|
$('.ms-color-palette').html(str);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
laytpl($('#tpl-color-editable').html()).render(originalData,function(str) {
|
|||
|
|
$('.ms-color-edit').html(str);
|
|||
|
|
renderColorPicker();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
$('input[name=colorpicker]').on('click',function(){
|
|||
|
|
applyColorPalette(this.checked)
|
|||
|
|
})
|
|||
|
|
$('#resetTheme').on('click',function(){
|
|||
|
|
resetTheme()
|
|||
|
|
$('input[name=colorpicker]').prop('checked',false)
|
|||
|
|
})
|
|||
|
|
$('#downloadCSS').on('click',function(){
|
|||
|
|
dropdownCSS()
|
|||
|
|
})
|
|||
|
|
$('#theme-prefix-tips').hover(function(){
|
|||
|
|
layer.tips($('#tpl-theme-prefix-example').html(),this,{
|
|||
|
|
tips: 3,
|
|||
|
|
time: false,
|
|||
|
|
area: ['700px','auto'],
|
|||
|
|
success: function(layero){
|
|||
|
|
layui.code({elem: '.code-demo'});
|
|||
|
|
layero.find('.layui-layer-content').css({padding:0,margin:0})
|
|||
|
|
layero.css('top','50px') //阻止反转
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},function(){
|
|||
|
|
layer.closeLast('tips');
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
function renderColorPicker(){
|
|||
|
|
colorpicker.render({
|
|||
|
|
elem: '.ms-color-edit-picker',
|
|||
|
|
alpha: true,
|
|||
|
|
change: function(color) {
|
|||
|
|
const elem=this.elem
|
|||
|
|
elem.prev().val(color)
|
|||
|
|
applyTheme(elem.data('key'),color)
|
|||
|
|
},
|
|||
|
|
done: function(color) {
|
|||
|
|
const elem=this.elem
|
|||
|
|
elem.prev().val(color)
|
|||
|
|
applyTheme(elem.data('key'),color)
|
|||
|
|
},
|
|||
|
|
close: function(color){
|
|||
|
|
const elem=this.elem
|
|||
|
|
elem.prev().val(color)
|
|||
|
|
applyTheme(elem.data('key'),color)
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function resetTheme() {
|
|||
|
|
customTheme={}
|
|||
|
|
addStyle('demo-customTheme',getCSS(customTheme))
|
|||
|
|
renderColorPicker()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function applyTheme(key,val){
|
|||
|
|
customTheme = {...customTheme,...{[key]:val} }
|
|||
|
|
addStyle('demo-customTheme',getCSS(customTheme))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function applyColorPalette(isDark=false){
|
|||
|
|
customTheme={...customTheme, ...originalData[isDark ? 'ColorPaletteDark' : 'ColorPaletteLight']}
|
|||
|
|
addStyle('demo-customTheme',getCSS(customTheme))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getCSS(cssVarsObj){
|
|||
|
|
return `:root {\n ${
|
|||
|
|
Object.entries(cssVarsObj)
|
|||
|
|
.map(([key,val])=> ` ${key}: ${val};`)
|
|||
|
|
.join('\n')
|
|||
|
|
}\n}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function dropdownCSS(){
|
|||
|
|
const hasPrefix = $('input[name="theme-prefix"]').val()
|
|||
|
|
const overrideCSS = await(await fetch('./static/src/override.css')).text()
|
|||
|
|
const varsCSS = getCSS({...originalData.Default, ...customTheme})
|
|||
|
|
let finalCSS=`
|
|||
|
|
${hasPrefix
|
|||
|
|
? varsCSS.replace(':root',`:root${hasPrefix}`)
|
|||
|
|
: varsCSS}\n
|
|||
|
|
${hasPrefix
|
|||
|
|
? `${hasPrefix}{${overrideCSS}}`
|
|||
|
|
: overrideCSS}`;
|
|||
|
|
|
|||
|
|
// css-next 插件太大,暂时用 less
|
|||
|
|
finalCSS = (await window.less.render(finalCSS)).css
|
|||
|
|
const alink=document.createElement("a")
|
|||
|
|
alink.download='layui-theme-dark-custom.css'
|
|||
|
|
alink.href=URL.createObjectURL(new Blob([finalCSS]))
|
|||
|
|
document.body.appendChild(alink)
|
|||
|
|
alink.click()
|
|||
|
|
document.body.removeChild(alink)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function addStyle(id,cssStr) {
|
|||
|
|
var el=document.getElementById(id)||document.createElement('style')
|
|||
|
|
if(!el.isConnected) {
|
|||
|
|
el.type='text/css';
|
|||
|
|
el.id=id;
|
|||
|
|
document.head.appendChild(el);
|
|||
|
|
}
|
|||
|
|
el.textContent=cssStr;
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
</script>
|