2026-05-29 23:55:18 +08:00
|
|
|
import * as bootstrap from 'bootstrap'
|
|
|
|
|
import 'bootstrap/dist/css/bootstrap.min.css'
|
|
|
|
|
import 'bootstrap-icons/font/bootstrap-icons.css'
|
|
|
|
|
import { Hash, LocalStorage, RefreshState } from '@web/state'
|
|
|
|
|
|
|
|
|
|
const GlobalStates = { Hash, LocalStorage }
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @web/bootstrap
|
|
|
|
|
* 自包含的 Bootstrap 5.3 集成引擎
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
const Bootstrap = {
|
|
|
|
|
// 原始 Bootstrap 实例引用
|
|
|
|
|
...bootstrap,
|
2026-05-30 09:41:48 +08:00
|
|
|
/**
|
|
|
|
|
* 绑定暗色模式
|
|
|
|
|
* @param {Object} state NewState 对象 (如 LocalStorage)
|
|
|
|
|
* @param {string} key 键名 (如 'darkMode')
|
|
|
|
|
*/
|
|
|
|
|
bindDarkMode: (state, key) => {
|
|
|
|
|
if (typeof document === 'undefined') return
|
|
|
|
|
const htmlNode = document.documentElement
|
|
|
|
|
const updateTheme = (val) => {
|
|
|
|
|
htmlNode.setAttribute('data-bs-theme', val ? 'dark' : 'light')
|
|
|
|
|
}
|
|
|
|
|
if (state && key) {
|
|
|
|
|
state.__watch(key, updateTheme)
|
|
|
|
|
updateTheme(state[key])
|
|
|
|
|
}
|
|
|
|
|
},
|
2026-05-29 23:55:18 +08:00
|
|
|
|
2026-05-30 09:41:48 +08:00
|
|
|
/**
|
|
|
|
|
* 动态配置主题变量
|
|
|
|
|
* @param {Object} config { primary: '#6366f1', ... }
|
|
|
|
|
*/
|
|
|
|
|
config: (config = {}) => {
|
|
|
|
|
if (typeof document === 'undefined') return
|
|
|
|
|
const root = document.documentElement
|
|
|
|
|
const colors = ['primary', 'secondary', 'success', 'info', 'warning', 'danger', 'light', 'dark']
|
|
|
|
|
|
|
|
|
|
colors.forEach(name => {
|
|
|
|
|
const hex = config[name]
|
|
|
|
|
if (hex) {
|
|
|
|
|
root.style.setProperty(`--bs-${name}`, hex)
|
|
|
|
|
const rgb = Bootstrap._hexToRgb(hex)
|
|
|
|
|
if (rgb) root.style.setProperty(`--bs-${name}-rgb`, `${rgb.r}, ${rgb.g}, ${rgb.b}`)
|
2026-05-29 23:55:18 +08:00
|
|
|
}
|
2026-05-30 09:41:48 +08:00
|
|
|
})
|
|
|
|
|
},
|
2026-05-29 23:55:18 +08:00
|
|
|
|
|
|
|
|
_hexToRgb: (hex) => {
|
|
|
|
|
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
|
|
|
|
|
return result ? {
|
|
|
|
|
r: parseInt(result[1], 16),
|
|
|
|
|
g: parseInt(result[2], 16),
|
|
|
|
|
b: parseInt(result[3], 16)
|
|
|
|
|
} : null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export { Bootstrap }
|
|
|
|
|
export default Bootstrap
|