🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@alemonjs/db

Package Overview
Dependencies
Maintainers
2
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@alemonjs/db - npm Package Compare versions

Comparing version
0.0.16
to
0.0.17
+14
lib/db/sql/connect.d.ts
import { Options, Sequelize } from 'sequelize';
import { SqlDialect } from '../../config';
type Config = {
dialect?: SqlDialect;
uri?: string;
host?: string;
port?: number;
user?: string;
password?: string;
database?: string;
storage?: string;
};
export declare const getSequelize: (config?: Config & Options) => Sequelize;
export {};
import { mkdirSync } from 'fs';
import { join, dirname } from 'path';
import module$1 from 'module';
import { Sequelize } from 'sequelize';
import { getDialect, getPgsqlConfig, getMysqlConfig, getSqliteConfig } from '../../config.js';
import { initLogPath, logging } from './utils.js';
const initRequire = () => { };
initRequire.resolve = () => '';
const require$1 = module$1?.createRequire?.(import.meta.url) ?? initRequire;
const appRequire = module$1?.createRequire?.(join(process.cwd(), 'package.json')) ?? require$1;
const DIALECT_DRIVER_MAP = {
pgsql: 'pg',
mysql: 'mysql2',
sqlite: 'sqlite3'
};
const normalizeDialect = (dialect) => {
if (!dialect) {
return null;
}
const value = dialect.trim().toLowerCase();
if (value === 'pgsql' || value === 'pg' || value === 'postgres' || value === 'postgresql') {
return 'pgsql';
}
if (value === 'mysql' || value === 'mariadb') {
return 'mysql';
}
if (value === 'sqlite' || value === 'sqlite3') {
return 'sqlite';
}
return null;
};
const isDriverInstalled = (packageName) => {
try {
appRequire.resolve(packageName);
return true;
}
catch {
try {
require$1.resolve(packageName);
return true;
}
catch {
return false;
}
}
};
const warnDialectFallback = (message) => {
logger.warn(`[@alemonjs/db] ${message}`);
};
const hasSqlConnectConfig = (config) => {
return Boolean(config?.uri || config?.host || config?.port || config?.user || config?.password || config?.database);
};
const getConnectConfig = (dialect, config) => {
if (dialect === 'pgsql') {
const pgsql = getPgsqlConfig();
return {
uri: config.uri || pgsql?.uri,
host: config.host || pgsql?.host,
port: config.port || pgsql?.port,
user: config.user || pgsql?.user,
password: config.password || pgsql?.password,
database: config.database || pgsql?.database
};
}
if (dialect === 'mysql') {
const mysql = getMysqlConfig();
return {
uri: config.uri || mysql?.uri,
host: config.host || mysql?.host,
port: config.port || mysql?.port,
user: config.user || mysql?.user,
password: config.password || mysql?.password,
database: config.database || mysql?.database
};
}
const sqlite = getSqliteConfig();
return {
storage: config.storage || sqlite?.storage
};
};
const createSqliteSequelize = (config) => {
const sqlite = getSqliteConfig();
const { storage, ...options } = config;
const storagePath = storage || sqlite?.storage || join(process.cwd(), 'data', 'alemonjs.sqlite');
mkdirSync(dirname(storagePath), { recursive: true });
return new Sequelize({
dialect: 'sqlite',
storage: storagePath,
logging: logging,
...options
});
};
const createMysqlSequelize = (config) => {
const mysql = getMysqlConfig();
const { host, port, user, password, database, uri, ...options } = config;
const baseConfig = {
host: '127.0.0.1',
port: 3306,
user: 'root',
password: '',
database: 'alemonjs'
};
const connectConfig = {
host: host || mysql?.host || baseConfig.host,
port: port || mysql?.port || baseConfig.port,
user: user || mysql?.user || baseConfig.user,
password: password || mysql?.password || baseConfig.password,
database: database || mysql?.database || baseConfig.database
};
const url = uri || mysql?.uri || '';
return new Sequelize(url || `mysql://${connectConfig.user}:${connectConfig.password}@${connectConfig.host}:${connectConfig.port}/${connectConfig.database}`, {
dialect: 'mysql',
logging: logging,
timezone: '+08:00',
...options
});
};
const createPgsqlSequelize = (config) => {
const pgsql = getPgsqlConfig();
const { host, port, user, password, database, uri, ...options } = config;
const baseConfig = {
host: '127.0.0.1',
port: 5432,
user: 'postgres',
password: '',
database: 'alemonjs'
};
const connectConfig = {
host: host || pgsql?.host || baseConfig.host,
port: port || pgsql?.port || baseConfig.port,
user: user || pgsql?.user || baseConfig.user,
password: password || pgsql?.password || baseConfig.password,
database: database || pgsql?.database || baseConfig.database
};
const url = uri || pgsql?.uri || '';
return new Sequelize(url || `postgres://${connectConfig.user}:${connectConfig.password}@${connectConfig.host}:${connectConfig.port}/${connectConfig.database}`, {
dialect: 'postgres',
logging: logging,
...options
});
};
const resolveAutoDialect = (config) => {
const candidates = [];
const pgsqlConfig = getConnectConfig('pgsql', config);
const mysqlConfig = getConnectConfig('mysql', config);
if (hasSqlConnectConfig(pgsqlConfig)) {
candidates.push('pgsql');
}
if (hasSqlConnectConfig(mysqlConfig)) {
candidates.push('mysql');
}
candidates.push('sqlite');
const uniqueCandidates = [...new Set(candidates)];
for (const dialect of uniqueCandidates) {
const driver = DIALECT_DRIVER_MAP[dialect];
if (isDriverInstalled(driver)) {
return {
dialect,
source: 'auto'
};
}
if (dialect !== 'sqlite') {
warnDialectFallback(`Detected ${dialect} configuration, but package "${driver}" is not installed. Skip ${dialect}.`);
}
}
return null;
};
const resolveDialect = (config) => {
const codeDialect = normalizeDialect(config.dialect);
if (codeDialect) {
const driver = DIALECT_DRIVER_MAP[codeDialect];
if (isDriverInstalled(driver)) {
return {
dialect: codeDialect,
source: 'code'
};
}
if (isDriverInstalled(DIALECT_DRIVER_MAP.sqlite)) {
return {
dialect: 'sqlite',
source: 'fallback',
warning: `Requested dialect "${codeDialect}" from code requires package "${driver}". Fallback to "sqlite".`
};
}
throw new Error(`Requested dialect "${codeDialect}" from code requires package "${driver}". Package "sqlite3" is also unavailable, SQL support cannot be used.`);
}
const configDialect = normalizeDialect(getDialect());
if (configDialect) {
const driver = DIALECT_DRIVER_MAP[configDialect];
if (isDriverInstalled(driver)) {
return {
dialect: configDialect,
source: 'config'
};
}
if (isDriverInstalled(DIALECT_DRIVER_MAP.sqlite)) {
return {
dialect: 'sqlite',
source: 'fallback',
warning: `Requested dialect "${configDialect}" from config requires package "${driver}". Fallback to "sqlite".`
};
}
throw new Error(`Requested dialect "${configDialect}" from config requires package "${driver}". Package "sqlite3" is also unavailable, SQL support cannot be used.`);
}
const autoDialect = resolveAutoDialect(config);
if (autoDialect) {
return autoDialect;
}
throw new Error('No available SQL driver found. Install one of: "pg", "mysql2", or "sqlite3".');
};
const getSequelize = (config = {}) => {
if (global.sequelize) {
return global.sequelize;
}
initLogPath();
const resolved = resolveDialect(config);
if (resolved.warning) {
warnDialectFallback(resolved.warning);
}
if (resolved.source === 'auto') {
logger.debug(`[@alemonjs/db] SQL dialect resolved to "${resolved.dialect}"`);
}
if (resolved.dialect === 'pgsql') {
global.sequelize = createPgsqlSequelize(config);
}
else if (resolved.dialect === 'mysql') {
global.sequelize = createMysqlSequelize(config);
}
else {
global.sequelize = createSqliteSequelize(config);
}
return global.sequelize;
};
export { getSequelize };
import { Attributes, FindOptions, Model, ModelAttributes, ModelCtor, ModelOptions, ModelStatic, Optional } from 'sequelize';
declare function findAllValues<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>[]>;
declare function findOneValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findOneRandomValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findAllCurrentValues<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>[]>;
declare function findOneCurrentValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findOrCreateValue<M extends Model>(this: ModelStatic<M>, options?: any): Promise<[Attributes<M>, boolean]>;
declare function deleted<M extends Model>(this: ModelStatic<M>, options?: any): Promise<number>;
export type AttributesModel<T extends ModelCtor<Model>> = T extends ModelCtor<infer M> ? (M extends Model<infer U, object> ? U : never) : never;
type ModelBaseProps = {
id: number;
created_at?: Date | null;
updated_at?: Date | null;
deleted_at?: Date | null;
};
type InitConfig<T> = ModelAttributes<Model<T & ModelBaseProps>, Optional<Attributes<Model<T & ModelBaseProps>>, keyof ModelBaseProps>>;
type Base = {
[key in string]: unknown;
};
export declare class BaseModel<T = ModelBaseProps> extends Model<T & ModelBaseProps> {
static findAllValues: typeof findAllValues;
static findOneValue: typeof findOneValue;
static findOneRandomValue: typeof findOneRandomValue;
static findAllCurrentValues: typeof findAllCurrentValues;
static findOneCurrentValue: typeof findOneCurrentValue;
static findOrCreateValue: typeof findOrCreateValue;
static deleted: typeof deleted;
static generate<T extends Base>(config: InitConfig<T>, options?: ModelOptions): ModelCtor<Model<T & ModelBaseProps>>;
}
export {};
import { DataTypes, Model } from 'sequelize';
function findAllValues(options) {
return this.findAll({
...options,
raw: true
});
}
function findOneValue(options = {}) {
return this.findOne({
...options,
raw: true
});
}
function findOneRandomValue(options = {}) {
return this.findOne({
...options,
order: this.sequelize.random(),
raw: true
});
}
function findAllCurrentValues(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.findAll({
...options,
where: where,
raw: true
});
}
function findOneCurrentValue(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.findOne({
...options,
where: where,
raw: true
});
}
function findOrCreateValue(options = {}) {
return this.findOrCreate({
...options,
raw: true
});
}
function deleted(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.update({
deleted_at: new Date()
}, {
...options,
where: where
}).then(result => result?.[0] || 0);
}
const initModelOptions = {
freezeTableName: true,
timestamps: true,
deletedAt: 'deleted_at',
createdAt: 'created_at',
updatedAt: 'updated_at'
};
const MoDelInitOptions = {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
created_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
comment: '创建时间'
},
updated_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
comment: '更新时间'
},
deleted_at: {
type: DataTypes.DATE,
allowNull: true,
comment: '删除时间'
}
};
class BaseModel extends Model {
static findAllValues = findAllValues;
static findOneValue = findOneValue;
static findOneRandomValue = findOneRandomValue;
static findAllCurrentValues = findAllCurrentValues;
static findOneCurrentValue = findOneCurrentValue;
static findOrCreateValue = findOrCreateValue;
static deleted = deleted;
static generate(config, options = {}) {
this.init({
...MoDelInitOptions,
...config
}, {
...initModelOptions,
sequelize: this.sequelize,
...options
});
return this;
}
}
export { BaseModel };
export declare const initLogPath: () => any;
export declare const logging: (sql: string) => boolean;
import { mkdirSync, appendFile } from 'fs';
import { join } from 'path';
import dayjs from 'dayjs';
import { getSqlConfig, getPgsqlConfig, getMysqlConfig, getSqliteConfig } from '../../config.js';
const initLogPath = () => {
const sql = getSqlConfig();
const pgsql = getPgsqlConfig();
const mysql = getMysqlConfig();
const sqlite = getSqliteConfig();
const dir = sql.logPath || pgsql.logPath || mysql.logPath || sqlite.logPath || join(process.cwd(), 'logs', 'db');
mkdirSync(dir, { recursive: true });
return dir;
};
const logging = (sql) => {
const dir = initLogPath();
const TIME = dayjs().format('YYYY-MM-DD');
const time = dayjs().format('YYYY-MM-DD HH:mm:ss');
appendFile(join(dir, `${TIME}.log`), `${time}\n${sql}\n`, err => {
if (err) {
logger.error('Error writing to log file:', err);
}
});
return false;
};
export { initLogPath, logging };
+1
-1

@@ -1,1 +0,1 @@

html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}.mb-1{margin-bottom:.25rem}.mb-4{margin-bottom:1rem}.mt-1{margin-top:.25rem}.block{display:block}.w-full{width:100%}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.p-8{padding:2rem}.px-4{padding-left:1rem;padding-right:1rem}.font-medium{font-weight:500}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}html,body{margin:0;display:flex;height:100%;width:100%;flex-direction:column;padding:0}#root{display:flex;flex-direction:column;margin:0;height:100%;width:100%;padding:0}body::-webkit-scrollbar{height:0px;width:0px}.container{margin-left:auto;margin-right:auto;padding-left:1.25rem;padding-right:1.25rem}*::-webkit-scrollbar{width:0px;height:0px}input,div,textarea{outline:2px solid transparent!important;outline-offset:2px!important}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-full{left:100%}.right-0{right:0}.right-3{right:.75rem}.right-full{right:100%}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.h-4{height:1rem}.h-6{height:1.5rem}.w-1\/3{width:33.333333%}.w-12{width:3rem}.w-4{width:1rem}.w-screen{width:100vw}.min-w-16{min-width:4rem}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-\[var\(--alemonjs-bar-border\)\]{border-color:var(--alemonjs-bar-border)}.border-\[var\(--alemonjs-button-border\)\]{border-color:var(--alemonjs-button-border)}.border-\[var\(--alemonjs-header-border\)\]{border-color:var(--alemonjs-header-border)}.border-\[var\(--alemonjs-input-border\)\]{border-color:var(--alemonjs-input-border)}.border-\[var\(--alemonjs-nav-border\)\]{border-color:var(--alemonjs-nav-border)}.border-\[var\(--alemonjs-notification-border\)\]{border-color:var(--alemonjs-notification-border)}.border-\[var\(--alemonjs-notification-border-warning\)\]{border-color:var(--alemonjs-notification-border-warning)}.border-\[var\(--alemonjs-notification-error-border\)\]{border-color:var(--alemonjs-notification-error-border)}.border-\[var\(--alemonjs-primary-border\)\]{border-color:var(--alemonjs-primary-border)}.border-\[var\(--alemonjs-secondary-border\)\]{border-color:var(--alemonjs-secondary-border)}.border-\[var\(--alemonjs-select-border\)\]{border-color:var(--alemonjs-select-border)}.border-\[var\(--alemonjs-sidebar-border\)\]{border-color:var(--alemonjs-sidebar-border)}.border-\[var\(--alemonjs-switch-border\)\]{border-color:var(--alemonjs-switch-border)}.border-\[var\(--alemonjs-switch-border-checked\)\]{border-color:var(--alemonjs-switch-border-checked)}.border-\[var\(--alemonjs-switch-border-disabled\)\]{border-color:var(--alemonjs-switch-border-disabled)}.border-\[var\(--alemonjs-textarea-border\)\]{border-color:var(--alemonjs-textarea-border)}.bg-\[var\(--alemonjs-bar-bg\)\]{background-color:var(--alemonjs-bar-bg)}.bg-\[var\(--alemonjs-button-bg\)\]{background-color:var(--alemonjs-button-bg)}.bg-\[var\(--alemonjs-header-bg\)\]{background-color:var(--alemonjs-header-bg)}.bg-\[var\(--alemonjs-input-bg\)\]{background-color:var(--alemonjs-input-bg)}.bg-\[var\(--alemonjs-nav-bg\)\]{background-color:var(--alemonjs-nav-bg)}.bg-\[var\(--alemonjs-notification-bg\)\]{background-color:var(--alemonjs-notification-bg)}.bg-\[var\(--alemonjs-notification-bg-warning\)\]{background-color:var(--alemonjs-notification-bg-warning)}.bg-\[var\(--alemonjs-notification-error-bg\)\]{background-color:var(--alemonjs-notification-error-bg)}.bg-\[var\(--alemonjs-primary-bg\)\]{background-color:var(--alemonjs-primary-bg)}.bg-\[var\(--alemonjs-secondary-bg\)\]{background-color:var(--alemonjs-secondary-bg)}.bg-\[var\(--alemonjs-select-bg\)\]{background-color:var(--alemonjs-select-bg)}.bg-\[var\(--alemonjs-sidebar-bg\)\]{background-color:var(--alemonjs-sidebar-bg)}.bg-\[var\(--alemonjs-switch-bg\)\]{background-color:var(--alemonjs-switch-bg)}.bg-\[var\(--alemonjs-switch-bg-checked\)\]{background-color:var(--alemonjs-switch-bg-checked)}.bg-\[var\(--alemonjs-switch-bg-disabled\)\]{background-color:var(--alemonjs-switch-bg-disabled)}.bg-\[var\(--alemonjs-textarea-bg\)\]{background-color:var(--alemonjs-textarea-bg)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-opacity-90{--tw-bg-opacity: .9}.p-2{padding:.5rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-\[var\(--alemonjs-bar-text\)\]{color:var(--alemonjs-bar-text)}.text-\[var\(--alemonjs-button-text\)\]{color:var(--alemonjs-button-text)}.text-\[var\(--alemonjs-header-text\)\]{color:var(--alemonjs-header-text)}.text-\[var\(--alemonjs-input-text\)\]{color:var(--alemonjs-input-text)}.text-\[var\(--alemonjs-nav-text\)\]{color:var(--alemonjs-nav-text)}.text-\[var\(--alemonjs-notification-error-text\)\]{color:var(--alemonjs-notification-error-text)}.text-\[var\(--alemonjs-notification-text\)\]{color:var(--alemonjs-notification-text)}.text-\[var\(--alemonjs-notification-text-warning\)\]{color:var(--alemonjs-notification-text-warning)}.text-\[var\(--alemonjs-primary-text\)\]{color:var(--alemonjs-primary-text)}.text-\[var\(--alemonjs-secondary-text\)\]{color:var(--alemonjs-secondary-text)}.text-\[var\(--alemonjs-select-text\)\]{color:var(--alemonjs-select-text)}.text-\[var\(--alemonjs-sidebar-text\)\]{color:var(--alemonjs-sidebar-text)}.text-\[var\(--alemonjs-textarea-text\)\]{color:var(--alemonjs-textarea-text)}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.hover\:border-\[var\(--alemonjs-bar-border-hover\)\]:hover{border-color:var(--alemonjs-bar-border-hover)}.hover\:border-\[var\(--alemonjs-button-border-hover\)\]:hover{border-color:var(--alemonjs-button-border-hover)}.hover\:border-\[var\(--alemonjs-input-border-hover\)\]:hover{border-color:var(--alemonjs-input-border-hover)}.hover\:border-\[var\(--alemonjs-primary-border-hover\)\]:hover{border-color:var(--alemonjs-primary-border-hover)}.hover\:border-\[var\(--alemonjs-secondary-border-hover\)\]:hover{border-color:var(--alemonjs-secondary-border-hover)}.hover\:border-\[var\(--alemonjs-select-border-hover\)\]:hover{border-color:var(--alemonjs-select-border-hover)}.hover\:border-\[var\(--alemonjs-switch-border-checked-hover\)\]:hover{border-color:var(--alemonjs-switch-border-checked-hover)}.hover\:border-\[var\(--alemonjs-switch-border-disabled-hover\)\]:hover{border-color:var(--alemonjs-switch-border-disabled-hover)}.hover\:border-\[var\(--alemonjs-switch-border-hover\)\]:hover{border-color:var(--alemonjs-switch-border-hover)}.hover\:border-\[var\(--alemonjs-tag-border-hover\)\]:hover{border-color:var(--alemonjs-tag-border-hover)}.hover\:border-\[var\(--alemonjs-textarea-border-hover\)\]:hover{border-color:var(--alemonjs-textarea-border-hover)}.hover\:bg-\[var\(--alemonjs-bar-bg-hover\)\]:hover{background-color:var(--alemonjs-bar-bg-hover)}.hover\:bg-\[var\(--alemonjs-button-bg-hover\)\]:hover{background-color:var(--alemonjs-button-bg-hover)}.hover\:bg-\[var\(--alemonjs-input-bg-hover\)\]:hover{background-color:var(--alemonjs-input-bg-hover)}.hover\:bg-\[var\(--alemonjs-primary-bg-hover\)\]:hover{background-color:var(--alemonjs-primary-bg-hover)}.hover\:bg-\[var\(--alemonjs-secondary-bg-hover\)\]:hover{background-color:var(--alemonjs-secondary-bg-hover)}.hover\:bg-\[var\(--alemonjs-select-bg-hover\)\]:hover{background-color:var(--alemonjs-select-bg-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-checked-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-checked-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-disabled-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-disabled-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-hover)}.hover\:bg-\[var\(--alemonjs-tag-bg-hover\)\]:hover{background-color:var(--alemonjs-tag-bg-hover)}.hover\:bg-\[var\(--alemonjs-textarea-bg-hover\)\]:hover{background-color:var(--alemonjs-textarea-bg-hover)}.hover\:text-\[var\(--alemonjs-bar-text-hover\)\]:hover{color:var(--alemonjs-bar-text-hover)}.hover\:text-\[var\(--alemonjs-button-text-hover\)\]:hover{color:var(--alemonjs-button-text-hover)}.hover\:text-\[var\(--alemonjs-primary-text-hover\)\]:hover{color:var(--alemonjs-primary-text-hover)}.hover\:text-\[var\(--alemonjs-secondary-text-hover\)\]:hover{color:var(--alemonjs-secondary-text-hover)}.hover\:text-\[var\(--alemonjs-tag-text-hover\)\]:hover{color:var(--alemonjs-tag-text-hover)}.focus\:border-\[var\(--alemonjs-input-border-focus\)\]:focus{border-color:var(--alemonjs-input-border-focus)}.focus\:border-\[var\(--alemonjs-select-border-focus\)\]:focus{border-color:var(--alemonjs-select-border-focus)}.focus\:border-\[var\(--alemonjs-textarea-focus-border\)\]:focus{border-color:var(--alemonjs-textarea-focus-border)}.focus\:bg-\[var\(--alemonjs-input-bg-focus\)\]:focus{background-color:var(--alemonjs-input-bg-focus)}.focus\:bg-\[var\(--alemonjs-select-bg-focus\)\]:focus{background-color:var(--alemonjs-select-bg-focus)}.focus\:bg-\[var\(--alemonjs-textarea-focus-bg\)\]:focus{background-color:var(--alemonjs-textarea-focus-bg)}.focus\:text-\[var\(--alemonjs-input-text-focus\)\]:focus{color:var(--alemonjs-input-text-focus)}.focus\:text-\[var\(--alemonjs-textarea-focus-text\)\]:focus{color:var(--alemonjs-textarea-focus-text)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[var\(--alemonjs-button-bg\)\]:focus{--tw-ring-color: var(--alemonjs-button-bg)}.disabled\:border-\[var\(--alemonjs-input-border-disabled\)\]:disabled{border-color:var(--alemonjs-input-border-disabled)}.disabled\:border-\[var\(--alemonjs-select-border-disabled\)\]:disabled{border-color:var(--alemonjs-select-border-disabled)}.disabled\:border-\[var\(--alemonjs-textarea-border-disabled\)\]:disabled{border-color:var(--alemonjs-textarea-border-disabled)}.disabled\:bg-\[var\(--alemonjs-input-bg-disabled\)\]:disabled{background-color:var(--alemonjs-input-bg-disabled)}.disabled\:bg-\[var\(--alemonjs-select-bg-disabled\)\]:disabled{background-color:var(--alemonjs-select-bg-disabled)}.disabled\:bg-\[var\(--alemonjs-textarea-bg-disabled\)\]:disabled{background-color:var(--alemonjs-textarea-bg-disabled)}.disabled\:text-\[var\(--alemonjs-input-text-disabled\)\]:disabled{color:var(--alemonjs-input-text-disabled)}.disabled\:text-\[var\(--alemonjs-textarea-text-disabled\)\]:disabled{color:var(--alemonjs-textarea-text-disabled)}.dark\:cursor-not-allowed:is(.dark *){cursor:not-allowed}.dark\:border-\[var\(--alemonjs-dark-bar-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-bar-border)}.dark\:border-\[var\(--alemonjs-dark-button-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-button-border)}.dark\:border-\[var\(--alemonjs-dark-header-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-header-border)}.dark\:border-\[var\(--alemonjs-dark-input-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-input-border)}.dark\:border-\[var\(--alemonjs-dark-nav-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-nav-border)}.dark\:border-\[var\(--alemonjs-dark-notification-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border)}.dark\:border-\[var\(--alemonjs-dark-notification-border-error\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border-error)}.dark\:border-\[var\(--alemonjs-dark-notification-border-warning\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border-warning)}.dark\:border-\[var\(--alemonjs-dark-primary-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-primary-border)}.dark\:border-\[var\(--alemonjs-dark-secondary-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-secondary-border)}.dark\:border-\[var\(--alemonjs-dark-select-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-select-border)}.dark\:border-\[var\(--alemonjs-dark-sidebar-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-sidebar-border)}.dark\:border-\[var\(--alemonjs-dark-switch-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border)}.dark\:border-\[var\(--alemonjs-dark-switch-border-checked\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border-checked)}.dark\:border-\[var\(--alemonjs-dark-switch-border-disabled\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border-disabled)}.dark\:border-\[var\(--alemonjs-dark-textarea-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-textarea-border)}.dark\:bg-\[var\(--alemonjs-dark-bar-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-bar-bg)}.dark\:bg-\[var\(--alemonjs-dark-button-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-button-bg)}.dark\:bg-\[var\(--alemonjs-dark-header-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-header-bg)}.dark\:bg-\[var\(--alemonjs-dark-input-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-input-bg)}.dark\:bg-\[var\(--alemonjs-dark-nav-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-nav-bg)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg-error\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg-error)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg-warning\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg-warning)}.dark\:bg-\[var\(--alemonjs-dark-primary-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-primary-bg)}.dark\:bg-\[var\(--alemonjs-dark-secondary-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-secondary-bg)}.dark\:bg-\[var\(--alemonjs-dark-select-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-select-bg)}.dark\:bg-\[var\(--alemonjs-dark-sidebar-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-sidebar-bg)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg-checked\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-checked)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg-disabled\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-disabled)}.dark\:bg-\[var\(--alemonjs-dark-textarea-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg)}.dark\:text-\[var\(--alemonjs-dark-bar-text\)\]:is(.dark *){color:var(--alemonjs-dark-bar-text)}.dark\:text-\[var\(--alemonjs-dark-button-text\)\]:is(.dark *){color:var(--alemonjs-dark-button-text)}.dark\:text-\[var\(--alemonjs-dark-header-text\)\]:is(.dark *){color:var(--alemonjs-dark-header-text)}.dark\:text-\[var\(--alemonjs-dark-input-text\)\]:is(.dark *){color:var(--alemonjs-dark-input-text)}.dark\:text-\[var\(--alemonjs-dark-nav-text\)\]:is(.dark *){color:var(--alemonjs-dark-nav-text)}.dark\:text-\[var\(--alemonjs-dark-notification-text\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text)}.dark\:text-\[var\(--alemonjs-dark-notification-text-error\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text-error)}.dark\:text-\[var\(--alemonjs-dark-notification-text-warning\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text-warning)}.dark\:text-\[var\(--alemonjs-dark-primary-text\)\]:is(.dark *){color:var(--alemonjs-dark-primary-text)}.dark\:text-\[var\(--alemonjs-dark-secondary-text\)\]:is(.dark *){color:var(--alemonjs-dark-secondary-text)}.dark\:text-\[var\(--alemonjs-dark-select-text\)\]:is(.dark *){color:var(--alemonjs-dark-select-text)}.dark\:text-\[var\(--alemonjs-dark-sidebar-text\)\]:is(.dark *){color:var(--alemonjs-dark-sidebar-text)}.dark\:text-\[var\(--alemonjs-dark-textarea-text\)\]:is(.dark *){color:var(--alemonjs-dark-textarea-text)}.dark\:placeholder-\[var\(--alemonjs-dark-input-placeholder\)\]:is(.dark *)::-moz-placeholder{color:var(--alemonjs-dark-input-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-input-placeholder\)\]:is(.dark *)::placeholder{color:var(--alemonjs-dark-input-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-textarea-placeholder\)\]:is(.dark *)::-moz-placeholder{color:var(--alemonjs-dark-textarea-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-textarea-placeholder\)\]:is(.dark *)::placeholder{color:var(--alemonjs-dark-textarea-placeholder)}.dark\:hover\:border-\[var\(--alemonjs-dark-bar-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-bar-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-button-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-button-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-input-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-input-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-primary-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-primary-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-secondary-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-secondary-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-select-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-select-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-checked-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-checked-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-disabled-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-disabled-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-tag-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-tag-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-textarea-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-bar-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-bar-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-button-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-button-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-input-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-input-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-primary-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-primary-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-secondary-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-secondary-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-select-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-select-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-checked-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-checked-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-disabled-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-disabled-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-tag-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-tag-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-textarea-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-bar-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-bar-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-button-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-button-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-primary-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-primary-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-secondary-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-secondary-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-tag-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-tag-text-hover)}.dark\:focus\:border-\[var\(--alemonjs-dark-input-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-input-border-focus)}.dark\:focus\:border-\[var\(--alemonjs-dark-select-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-select-border-focus)}.dark\:focus\:border-\[var\(--alemonjs-dark-textarea-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-input-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-input-bg-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-select-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-select-bg-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-textarea-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-focus)}.dark\:focus\:text-\[var\(--alemonjs-dark-input-text-focus\)\]:focus:is(.dark *){color:var(--alemonjs-dark-input-text-focus)}.dark\:focus\:text-\[var\(--alemonjs-dark-textarea-text-focus\)\]:focus:is(.dark *){color:var(--alemonjs-dark-textarea-text-focus)}.dark\:disabled\:border-\[var\(--alemonjs-dark-input-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-input-border-disabled)}.dark\:disabled\:border-\[var\(--alemonjs-dark-select-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-select-border-disabled)}.dark\:disabled\:border-\[var\(--alemonjs-dark-textarea-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-input-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-input-bg-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-select-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-select-bg-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-textarea-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-disabled)}.dark\:disabled\:text-\[var\(--alemonjs-dark-input-text-disabled\)\]:disabled:is(.dark *){color:var(--alemonjs-dark-input-text-disabled)}.dark\:disabled\:text-\[var\(--alemonjs-dark-textarea-text-disabled\)\]:disabled:is(.dark *){color:var(--alemonjs-dark-textarea-text-disabled)}
html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}.mb-1{margin-bottom:.25rem}.mb-4{margin-bottom:1rem}.mt-1{margin-top:.25rem}.block{display:block}.w-full{width:100%}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.p-8{padding:2rem}.px-4{padding-left:1rem;padding-right:1rem}.font-medium{font-weight:500}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}html,body{margin:0;display:flex;height:100%;width:100%;flex-direction:column;padding:0}#root{display:flex;flex-direction:column;margin:0;height:100%;width:100%;padding:0}body::-webkit-scrollbar{height:0px;width:0px}.container{margin-left:auto;margin-right:auto;padding-left:1.25rem;padding-right:1.25rem}*::-webkit-scrollbar{width:0px;height:0px}input,div,textarea{outline:2px solid transparent!important;outline-offset:2px!important}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-full{bottom:100%}.left-1\/2{left:50%}.left-full{left:100%}.right-3{right:.75rem}.right-full{right:100%}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.top-full{top:100%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.h-4{height:1rem}.h-6{height:1.5rem}.w-1\/3{width:33.333333%}.w-12{width:3rem}.w-4{width:1rem}.w-screen{width:100vw}.min-w-16{min-width:4rem}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-\[var\(--alemonjs-bar-border\)\]{border-color:var(--alemonjs-bar-border)}.border-\[var\(--alemonjs-button-border\)\]{border-color:var(--alemonjs-button-border)}.border-\[var\(--alemonjs-header-border\)\]{border-color:var(--alemonjs-header-border)}.border-\[var\(--alemonjs-input-border\)\]{border-color:var(--alemonjs-input-border)}.border-\[var\(--alemonjs-nav-border\)\]{border-color:var(--alemonjs-nav-border)}.border-\[var\(--alemonjs-notification-border\)\]{border-color:var(--alemonjs-notification-border)}.border-\[var\(--alemonjs-notification-border-warning\)\]{border-color:var(--alemonjs-notification-border-warning)}.border-\[var\(--alemonjs-notification-error-border\)\]{border-color:var(--alemonjs-notification-error-border)}.border-\[var\(--alemonjs-primary-border\)\]{border-color:var(--alemonjs-primary-border)}.border-\[var\(--alemonjs-secondary-border\)\]{border-color:var(--alemonjs-secondary-border)}.border-\[var\(--alemonjs-select-border\)\]{border-color:var(--alemonjs-select-border)}.border-\[var\(--alemonjs-sidebar-border\)\]{border-color:var(--alemonjs-sidebar-border)}.border-\[var\(--alemonjs-switch-border\)\]{border-color:var(--alemonjs-switch-border)}.border-\[var\(--alemonjs-switch-border-checked\)\]{border-color:var(--alemonjs-switch-border-checked)}.border-\[var\(--alemonjs-switch-border-disabled\)\]{border-color:var(--alemonjs-switch-border-disabled)}.border-\[var\(--alemonjs-textarea-border\)\]{border-color:var(--alemonjs-textarea-border)}.bg-\[var\(--alemonjs-bar-bg\)\]{background-color:var(--alemonjs-bar-bg)}.bg-\[var\(--alemonjs-button-bg\)\]{background-color:var(--alemonjs-button-bg)}.bg-\[var\(--alemonjs-header-bg\)\]{background-color:var(--alemonjs-header-bg)}.bg-\[var\(--alemonjs-input-bg\)\]{background-color:var(--alemonjs-input-bg)}.bg-\[var\(--alemonjs-nav-bg\)\]{background-color:var(--alemonjs-nav-bg)}.bg-\[var\(--alemonjs-notification-bg\)\]{background-color:var(--alemonjs-notification-bg)}.bg-\[var\(--alemonjs-notification-bg-warning\)\]{background-color:var(--alemonjs-notification-bg-warning)}.bg-\[var\(--alemonjs-notification-error-bg\)\]{background-color:var(--alemonjs-notification-error-bg)}.bg-\[var\(--alemonjs-primary-bg\)\]{background-color:var(--alemonjs-primary-bg)}.bg-\[var\(--alemonjs-secondary-bg\)\]{background-color:var(--alemonjs-secondary-bg)}.bg-\[var\(--alemonjs-select-bg\)\]{background-color:var(--alemonjs-select-bg)}.bg-\[var\(--alemonjs-sidebar-bg\)\]{background-color:var(--alemonjs-sidebar-bg)}.bg-\[var\(--alemonjs-switch-bg\)\]{background-color:var(--alemonjs-switch-bg)}.bg-\[var\(--alemonjs-switch-bg-checked\)\]{background-color:var(--alemonjs-switch-bg-checked)}.bg-\[var\(--alemonjs-switch-bg-disabled\)\]{background-color:var(--alemonjs-switch-bg-disabled)}.bg-\[var\(--alemonjs-textarea-bg\)\]{background-color:var(--alemonjs-textarea-bg)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-opacity-90{--tw-bg-opacity: .9}.p-2{padding:.5rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-\[var\(--alemonjs-bar-text\)\]{color:var(--alemonjs-bar-text)}.text-\[var\(--alemonjs-button-text\)\]{color:var(--alemonjs-button-text)}.text-\[var\(--alemonjs-header-text\)\]{color:var(--alemonjs-header-text)}.text-\[var\(--alemonjs-input-text\)\]{color:var(--alemonjs-input-text)}.text-\[var\(--alemonjs-nav-text\)\]{color:var(--alemonjs-nav-text)}.text-\[var\(--alemonjs-notification-error-text\)\]{color:var(--alemonjs-notification-error-text)}.text-\[var\(--alemonjs-notification-text\)\]{color:var(--alemonjs-notification-text)}.text-\[var\(--alemonjs-notification-text-warning\)\]{color:var(--alemonjs-notification-text-warning)}.text-\[var\(--alemonjs-primary-text\)\]{color:var(--alemonjs-primary-text)}.text-\[var\(--alemonjs-secondary-text\)\]{color:var(--alemonjs-secondary-text)}.text-\[var\(--alemonjs-select-text\)\]{color:var(--alemonjs-select-text)}.text-\[var\(--alemonjs-sidebar-text\)\]{color:var(--alemonjs-sidebar-text)}.text-\[var\(--alemonjs-textarea-text\)\]{color:var(--alemonjs-textarea-text)}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.hover\:border-\[var\(--alemonjs-bar-border-hover\)\]:hover{border-color:var(--alemonjs-bar-border-hover)}.hover\:border-\[var\(--alemonjs-button-border-hover\)\]:hover{border-color:var(--alemonjs-button-border-hover)}.hover\:border-\[var\(--alemonjs-input-border-hover\)\]:hover{border-color:var(--alemonjs-input-border-hover)}.hover\:border-\[var\(--alemonjs-primary-border-hover\)\]:hover{border-color:var(--alemonjs-primary-border-hover)}.hover\:border-\[var\(--alemonjs-secondary-border-hover\)\]:hover{border-color:var(--alemonjs-secondary-border-hover)}.hover\:border-\[var\(--alemonjs-select-border-hover\)\]:hover{border-color:var(--alemonjs-select-border-hover)}.hover\:border-\[var\(--alemonjs-switch-border-checked-hover\)\]:hover{border-color:var(--alemonjs-switch-border-checked-hover)}.hover\:border-\[var\(--alemonjs-switch-border-disabled-hover\)\]:hover{border-color:var(--alemonjs-switch-border-disabled-hover)}.hover\:border-\[var\(--alemonjs-switch-border-hover\)\]:hover{border-color:var(--alemonjs-switch-border-hover)}.hover\:border-\[var\(--alemonjs-tag-border-hover\)\]:hover{border-color:var(--alemonjs-tag-border-hover)}.hover\:border-\[var\(--alemonjs-textarea-border-hover\)\]:hover{border-color:var(--alemonjs-textarea-border-hover)}.hover\:bg-\[var\(--alemonjs-bar-bg-hover\)\]:hover{background-color:var(--alemonjs-bar-bg-hover)}.hover\:bg-\[var\(--alemonjs-button-bg-hover\)\]:hover{background-color:var(--alemonjs-button-bg-hover)}.hover\:bg-\[var\(--alemonjs-input-bg-hover\)\]:hover{background-color:var(--alemonjs-input-bg-hover)}.hover\:bg-\[var\(--alemonjs-primary-bg-hover\)\]:hover{background-color:var(--alemonjs-primary-bg-hover)}.hover\:bg-\[var\(--alemonjs-secondary-bg-hover\)\]:hover{background-color:var(--alemonjs-secondary-bg-hover)}.hover\:bg-\[var\(--alemonjs-select-bg-hover\)\]:hover{background-color:var(--alemonjs-select-bg-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-checked-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-checked-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-disabled-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-disabled-hover)}.hover\:bg-\[var\(--alemonjs-switch-bg-hover\)\]:hover{background-color:var(--alemonjs-switch-bg-hover)}.hover\:bg-\[var\(--alemonjs-tag-bg-hover\)\]:hover{background-color:var(--alemonjs-tag-bg-hover)}.hover\:bg-\[var\(--alemonjs-textarea-bg-hover\)\]:hover{background-color:var(--alemonjs-textarea-bg-hover)}.hover\:text-\[var\(--alemonjs-bar-text-hover\)\]:hover{color:var(--alemonjs-bar-text-hover)}.hover\:text-\[var\(--alemonjs-button-text-hover\)\]:hover{color:var(--alemonjs-button-text-hover)}.hover\:text-\[var\(--alemonjs-primary-text-hover\)\]:hover{color:var(--alemonjs-primary-text-hover)}.hover\:text-\[var\(--alemonjs-secondary-text-hover\)\]:hover{color:var(--alemonjs-secondary-text-hover)}.hover\:text-\[var\(--alemonjs-tag-text-hover\)\]:hover{color:var(--alemonjs-tag-text-hover)}.focus\:border-\[var\(--alemonjs-input-border-focus\)\]:focus{border-color:var(--alemonjs-input-border-focus)}.focus\:border-\[var\(--alemonjs-select-border-focus\)\]:focus{border-color:var(--alemonjs-select-border-focus)}.focus\:border-\[var\(--alemonjs-textarea-focus-border\)\]:focus{border-color:var(--alemonjs-textarea-focus-border)}.focus\:bg-\[var\(--alemonjs-input-bg-focus\)\]:focus{background-color:var(--alemonjs-input-bg-focus)}.focus\:bg-\[var\(--alemonjs-select-bg-focus\)\]:focus{background-color:var(--alemonjs-select-bg-focus)}.focus\:bg-\[var\(--alemonjs-textarea-focus-bg\)\]:focus{background-color:var(--alemonjs-textarea-focus-bg)}.focus\:text-\[var\(--alemonjs-input-text-focus\)\]:focus{color:var(--alemonjs-input-text-focus)}.focus\:text-\[var\(--alemonjs-textarea-focus-text\)\]:focus{color:var(--alemonjs-textarea-focus-text)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[var\(--alemonjs-button-bg\)\]:focus{--tw-ring-color: var(--alemonjs-button-bg)}.disabled\:border-\[var\(--alemonjs-input-border-disabled\)\]:disabled{border-color:var(--alemonjs-input-border-disabled)}.disabled\:border-\[var\(--alemonjs-select-border-disabled\)\]:disabled{border-color:var(--alemonjs-select-border-disabled)}.disabled\:border-\[var\(--alemonjs-textarea-border-disabled\)\]:disabled{border-color:var(--alemonjs-textarea-border-disabled)}.disabled\:bg-\[var\(--alemonjs-input-bg-disabled\)\]:disabled{background-color:var(--alemonjs-input-bg-disabled)}.disabled\:bg-\[var\(--alemonjs-select-bg-disabled\)\]:disabled{background-color:var(--alemonjs-select-bg-disabled)}.disabled\:bg-\[var\(--alemonjs-textarea-bg-disabled\)\]:disabled{background-color:var(--alemonjs-textarea-bg-disabled)}.disabled\:text-\[var\(--alemonjs-input-text-disabled\)\]:disabled{color:var(--alemonjs-input-text-disabled)}.disabled\:text-\[var\(--alemonjs-textarea-text-disabled\)\]:disabled{color:var(--alemonjs-textarea-text-disabled)}.dark\:cursor-not-allowed:is(.dark *){cursor:not-allowed}.dark\:border-\[var\(--alemonjs-dark-bar-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-bar-border)}.dark\:border-\[var\(--alemonjs-dark-button-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-button-border)}.dark\:border-\[var\(--alemonjs-dark-header-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-header-border)}.dark\:border-\[var\(--alemonjs-dark-input-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-input-border)}.dark\:border-\[var\(--alemonjs-dark-nav-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-nav-border)}.dark\:border-\[var\(--alemonjs-dark-notification-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border)}.dark\:border-\[var\(--alemonjs-dark-notification-border-error\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border-error)}.dark\:border-\[var\(--alemonjs-dark-notification-border-warning\)\]:is(.dark *){border-color:var(--alemonjs-dark-notification-border-warning)}.dark\:border-\[var\(--alemonjs-dark-primary-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-primary-border)}.dark\:border-\[var\(--alemonjs-dark-secondary-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-secondary-border)}.dark\:border-\[var\(--alemonjs-dark-select-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-select-border)}.dark\:border-\[var\(--alemonjs-dark-sidebar-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-sidebar-border)}.dark\:border-\[var\(--alemonjs-dark-switch-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border)}.dark\:border-\[var\(--alemonjs-dark-switch-border-checked\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border-checked)}.dark\:border-\[var\(--alemonjs-dark-switch-border-disabled\)\]:is(.dark *){border-color:var(--alemonjs-dark-switch-border-disabled)}.dark\:border-\[var\(--alemonjs-dark-textarea-border\)\]:is(.dark *){border-color:var(--alemonjs-dark-textarea-border)}.dark\:bg-\[var\(--alemonjs-dark-bar-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-bar-bg)}.dark\:bg-\[var\(--alemonjs-dark-button-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-button-bg)}.dark\:bg-\[var\(--alemonjs-dark-header-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-header-bg)}.dark\:bg-\[var\(--alemonjs-dark-input-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-input-bg)}.dark\:bg-\[var\(--alemonjs-dark-nav-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-nav-bg)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg-error\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg-error)}.dark\:bg-\[var\(--alemonjs-dark-notification-bg-warning\)\]:is(.dark *){background-color:var(--alemonjs-dark-notification-bg-warning)}.dark\:bg-\[var\(--alemonjs-dark-primary-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-primary-bg)}.dark\:bg-\[var\(--alemonjs-dark-secondary-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-secondary-bg)}.dark\:bg-\[var\(--alemonjs-dark-select-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-select-bg)}.dark\:bg-\[var\(--alemonjs-dark-sidebar-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-sidebar-bg)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg-checked\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-checked)}.dark\:bg-\[var\(--alemonjs-dark-switch-bg-disabled\)\]:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-disabled)}.dark\:bg-\[var\(--alemonjs-dark-textarea-bg\)\]:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg)}.dark\:text-\[var\(--alemonjs-dark-bar-text\)\]:is(.dark *){color:var(--alemonjs-dark-bar-text)}.dark\:text-\[var\(--alemonjs-dark-button-text\)\]:is(.dark *){color:var(--alemonjs-dark-button-text)}.dark\:text-\[var\(--alemonjs-dark-header-text\)\]:is(.dark *){color:var(--alemonjs-dark-header-text)}.dark\:text-\[var\(--alemonjs-dark-input-text\)\]:is(.dark *){color:var(--alemonjs-dark-input-text)}.dark\:text-\[var\(--alemonjs-dark-nav-text\)\]:is(.dark *){color:var(--alemonjs-dark-nav-text)}.dark\:text-\[var\(--alemonjs-dark-notification-text\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text)}.dark\:text-\[var\(--alemonjs-dark-notification-text-error\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text-error)}.dark\:text-\[var\(--alemonjs-dark-notification-text-warning\)\]:is(.dark *){color:var(--alemonjs-dark-notification-text-warning)}.dark\:text-\[var\(--alemonjs-dark-primary-text\)\]:is(.dark *){color:var(--alemonjs-dark-primary-text)}.dark\:text-\[var\(--alemonjs-dark-secondary-text\)\]:is(.dark *){color:var(--alemonjs-dark-secondary-text)}.dark\:text-\[var\(--alemonjs-dark-select-text\)\]:is(.dark *){color:var(--alemonjs-dark-select-text)}.dark\:text-\[var\(--alemonjs-dark-sidebar-text\)\]:is(.dark *){color:var(--alemonjs-dark-sidebar-text)}.dark\:text-\[var\(--alemonjs-dark-textarea-text\)\]:is(.dark *){color:var(--alemonjs-dark-textarea-text)}.dark\:placeholder-\[var\(--alemonjs-dark-input-placeholder\)\]:is(.dark *)::-moz-placeholder{color:var(--alemonjs-dark-input-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-input-placeholder\)\]:is(.dark *)::placeholder{color:var(--alemonjs-dark-input-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-textarea-placeholder\)\]:is(.dark *)::-moz-placeholder{color:var(--alemonjs-dark-textarea-placeholder)}.dark\:placeholder-\[var\(--alemonjs-dark-textarea-placeholder\)\]:is(.dark *)::placeholder{color:var(--alemonjs-dark-textarea-placeholder)}.dark\:hover\:border-\[var\(--alemonjs-dark-bar-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-bar-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-button-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-button-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-input-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-input-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-primary-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-primary-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-secondary-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-secondary-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-select-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-select-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-checked-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-checked-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-disabled-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-disabled-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-switch-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-switch-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-tag-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-tag-border-hover)}.dark\:hover\:border-\[var\(--alemonjs-dark-textarea-border-hover\)\]:hover:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-bar-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-bar-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-button-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-button-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-input-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-input-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-primary-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-primary-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-secondary-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-secondary-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-select-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-select-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-checked-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-checked-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-disabled-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-disabled-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-switch-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-switch-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-tag-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-tag-bg-hover)}.dark\:hover\:bg-\[var\(--alemonjs-dark-textarea-bg-hover\)\]:hover:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-bar-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-bar-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-button-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-button-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-primary-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-primary-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-secondary-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-secondary-text-hover)}.dark\:hover\:text-\[var\(--alemonjs-dark-tag-text-hover\)\]:hover:is(.dark *){color:var(--alemonjs-dark-tag-text-hover)}.dark\:focus\:border-\[var\(--alemonjs-dark-input-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-input-border-focus)}.dark\:focus\:border-\[var\(--alemonjs-dark-select-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-select-border-focus)}.dark\:focus\:border-\[var\(--alemonjs-dark-textarea-border-focus\)\]:focus:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-input-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-input-bg-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-select-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-select-bg-focus)}.dark\:focus\:bg-\[var\(--alemonjs-dark-textarea-bg-focus\)\]:focus:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-focus)}.dark\:focus\:text-\[var\(--alemonjs-dark-input-text-focus\)\]:focus:is(.dark *){color:var(--alemonjs-dark-input-text-focus)}.dark\:focus\:text-\[var\(--alemonjs-dark-textarea-text-focus\)\]:focus:is(.dark *){color:var(--alemonjs-dark-textarea-text-focus)}.dark\:disabled\:border-\[var\(--alemonjs-dark-input-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-input-border-disabled)}.dark\:disabled\:border-\[var\(--alemonjs-dark-select-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-select-border-disabled)}.dark\:disabled\:border-\[var\(--alemonjs-dark-textarea-border-disabled\)\]:disabled:is(.dark *){border-color:var(--alemonjs-dark-textarea-border-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-input-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-input-bg-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-select-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-select-bg-disabled)}.dark\:disabled\:bg-\[var\(--alemonjs-dark-textarea-bg-disabled\)\]:disabled:is(.dark *){background-color:var(--alemonjs-dark-textarea-bg-disabled)}.dark\:disabled\:text-\[var\(--alemonjs-dark-input-text-disabled\)\]:disabled:is(.dark *){color:var(--alemonjs-dark-input-text-disabled)}.dark\:disabled\:text-\[var\(--alemonjs-dark-textarea-text-disabled\)\]:disabled:is(.dark *){color:var(--alemonjs-dark-textarea-text-disabled)}

@@ -1,2 +0,2 @@

<!DOCTYPE html>
<!doctype html>
<html lang="en" id="__gui">

@@ -7,3 +7,3 @@ <head>

<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AlemonJS</title>
<title>ALemonJS</title>
<script type="module" crossorigin src="/assets/index.js"></script>

@@ -10,0 +10,0 @@ <link rel="stylesheet" crossorigin href="/assets/index.css">

@@ -17,2 +17,15 @@ services:

postgres:
image: postgres:16
container_name: postgres-container
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 'Postgres123456!'
POSTGRES_DB: alemonjs
ports:
- '5432:5432'
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
redis:

@@ -23,18 +36,28 @@ image: redis:7-alpine

- redis-server
- --appendonly yes # 启用 AOF 持久化
- --appendfsync everysec # 每秒同步一次
- --save 900 1 # RDB 持久化:900秒内至少1个变更
- --save 300 10 # RDB 持久化:300秒内至少10个变更
- --save 60 10000 # RDB 持久化:60秒内至少10000个变更
- --dir /data # 数据存储目录
- --dbfilename dump.rdb # RDB 文件名
- --appendfilename "appendonly.aof" # AOF 文件名
- --auto-aof-rewrite-percentage 100 # AOF 重写触发条件
- --auto-aof-rewrite-min-size 64mb # AOF 最小重写大小
- --appendonly
- 'yes'
- --appendfsync
- everysec
- --save
- 900 1
- --save
- 300 10
- --save
- 60 10000
- --dir
- /data
- --dbfilename
- dump.rdb
- --appendfilename
- appendonly.aof
- --auto-aof-rewrite-percentage
- '100'
- --auto-aof-rewrite-min-size
- 64mb
ports:
- '6379:6379'
volumes:
- redis-data:/data # 使用命名卷
- redis-data:/data
restart: unless-stopped
healthcheck: # 添加健康检查
healthcheck:
test: ['CMD', 'redis-cli', 'ping']

@@ -48,3 +71,3 @@ interval: 30s

driver: local
mysql-data:
postgres-data:
driver: local

@@ -0,6 +1,9 @@

export type SqlDialect = 'pgsql' | 'mysql' | 'sqlite';
export declare const getDbConfig: () => any;
export declare const getDialect: () => string | undefined;
export declare const getSqlConfig: () => any;
export declare const getMysqlConfig: () => any;
export declare const getPgsqlConfig: () => any;
export declare const getRedisConfig: () => any;
export declare const getSqliteConfig: () => any;
export declare const getMongoConfig: () => any;

@@ -10,2 +10,6 @@ import { getConfigValue } from 'alemonjs';

};
const getSqlConfig = () => {
const value = getConfigValue() || {};
return value?.db?.sql || value?.sql || {};
};
const getMysqlConfig = () => {

@@ -15,2 +19,6 @@ const value = getConfigValue() || {};

};
const getPgsqlConfig = () => {
const value = getConfigValue() || {};
return value?.db?.pgsql || value?.db?.pg || value?.db?.postgres || value?.db?.postgresql || value?.pgsql || value?.pg || value?.postgres || value?.postgresql || {};
};
const getRedisConfig = () => {

@@ -29,2 +37,2 @@ const value = getConfigValue() || {};

export { getDbConfig, getDialect, getMongoConfig, getMysqlConfig, getRedisConfig, getSqliteConfig };
export { getDbConfig, getDialect, getMongoConfig, getMysqlConfig, getPgsqlConfig, getRedisConfig, getSqlConfig, getSqliteConfig };

@@ -6,12 +6,12 @@ import { readFileSync } from 'fs';

const __dirname = dirname(fileURLToPath(import.meta.url));
const __dirname$1 = dirname(fileURLToPath(import.meta.url));
const activate = (context) => {
const webView = context.createSidebarWebView(context);
context.onCommand('open.db', () => {
const dir = join(__dirname, '../', 'dist', 'index.html');
const dir = join(__dirname$1, '../', 'dist', 'index.html');
const scriptReg = /<script.*?src="(.+?)".*?>/;
const styleReg = /<link.*?rel="stylesheet".*?href="(.+?)".*?>/;
const iconReg = /<link.*?rel="icon".*?href="(.+?)".*?>/g;
const styleUri = context.createExtensionDir(join(__dirname, '../', 'dist', 'assets', 'index.css'));
const scriptUri = context.createExtensionDir(join(__dirname, '../', 'dist', 'assets', 'index.js'));
const styleUri = context.createExtensionDir(join(__dirname$1, '../', 'dist', 'assets', 'index.css'));
const scriptUri = context.createExtensionDir(join(__dirname$1, '../', 'dist', 'assets', 'index.js'));
const html = readFileSync(dir, 'utf-8')

@@ -18,0 +18,0 @@ .replace(iconReg, '')

export * from './db/redis';
export * from './db/mysql/connect';
export * from './db/mysql/pub';
export * from './db/sql/connect';
export * from './db/sql/pub';
export { checkRedisHealth, closeRedis, getIoRedis, manualSave } from './db/redis.js';
export { getSequelize } from './db/mysql/connect.js';
export { BaseModel } from './db/mysql/pub.js';
export { getSequelize } from './db/sql/connect.js';
export { BaseModel } from './db/sql/pub.js';
{
"name": "@alemonjs/db",
"version": "0.0.16",
"version": "0.0.17",
"description": "数据库连接",

@@ -24,3 +24,3 @@ "author": "lemonade",

{
"name": "redis&mysql",
"name": "redis&sql",
"icon": "antd.DatabaseOutlined",

@@ -41,6 +41,21 @@ "command": "open.db"

"ioredis": "^5.4.1",
"mysql2": "^3.6.2",
"sequelize": "^6.33.0",
"dayjs": "^1.11.13"
},
"peerDependencies": {
"mysql2": "^3.6.2",
"pg": "^8.11.5",
"sqlite3": "^5.1.7"
},
"peerDependenciesMeta": {
"mysql2": {
"optional": true
},
"pg": {
"optional": true
},
"sqlite3": {
"optional": true
}
},
"devDependencies": {

@@ -47,0 +62,0 @@ "@rollup/plugin-typescript": "^11.1.6",

+108
-54
# [https://alemonjs.com/](https://alemonjs.com/)
提供 redis 和 sequelize 连接
提供 Redis 和 Sequelize 连接。
当前 SQL 方言支持:
- `pgsql`
- `mysql`
- `sqlite`
```ts
import { getIoRedis, getSequelize } from '@alemonjs/db';
// redis
export const Redis = getIoRedis();
// seuqlieze
export const sequelize = getSequelize();
```
## 使用说明
## 安装

@@ -19,72 +24,121 @@ ```sh

- alemon.config.yaml
`@alemonjs/db` 不再内置 SQL 驱动。
如果你要使用 SQL 能力,需要按实际方言额外安装对应包:
```sh
# PostgreSQL
yarn add pg -W
# MySQL
yarn add mysql2 -W
# SQLite
yarn add sqlite3 -W
```
## 方言选择规则
### 1. 代码显式传入 `dialect`
```ts
const sequelize = getSequelize({
dialect: 'pgsql'
});
```
优先级最高。
- 如果对应驱动已安装,直接使用该方言
- 如果对应驱动未安装,不会立即中断
- 会打印 `warn`
- 然后尝试回退到 `sqlite`
- 如果 `sqlite3` 也未安装,则提示当前环境无法使用 SQL 能力
### 2. 配置文件显式写了 `db.dialect`
```yaml
db:
dialect: mysql
mysql:
dialect: pgsql
```
语义与代码显式指定一致:
- 缺驱动时打印 `warn`
- 尝试回退到 `sqlite`
- 如果 `sqlite3` 也不可用,则提示无法使用
### 3. 完全未指定 `dialect`
框架会自动探测:
1. 已配置且可用的 `pgsql`
2. 已配置且可用的 `mysql`
3. `sqlite`
如果一个可用 SQL 驱动都没有,则提示安装:
- `pg`
- `mysql2`
- `sqlite3`
## 配置示例
### PostgreSQL
```yaml
db:
dialect: pgsql
pgsql:
host: '127.0.0.1'
port: '3306'
user: 'root'
password: 'Mysql123456!'
port: 5432
user: 'postgres'
password: 'Postgres123456!'
database: 'alemonjs'
redis:
host: '127.0.0.1'
port: '6379'
port: 6379
password: ''
db: '0'
db: 0
```
- use
### MySQL
### docker
- 添加国内镜像
> Settings > Docker Engine
```json
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
```yaml
db:
dialect: mysql
mysql:
host: '127.0.0.1'
port: 3306
user: 'root'
password: 'Mysql123456!'
database: 'alemonjs'
```
- 新增文件 docker-compose.yml
### SQLite
```yaml
services:
mysql:
image: mysql:8.0
container_name: mysql-container
environment:
# 密码 Mm002580!
# 用户 root
MYSQL_ROOT_PASSWORD: 'Mysql123456!'
MYSQL_ROOT_HOST: '%'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
ports:
- '3306:3306'
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/docker-dbinit.sql
redis:
image: redis:6.2-alpine
container_name: redis-container
ports:
- '6379:6379'
db:
dialect: sqlite
sqlite:
storage: './data/alemonapp.db'
```
- 新增文件 docker-dbinit.sql
## 使用示例
```sql
-- 数据库名称:alemonjs
CREATE DATABASE IF NOT EXISTS `alemonjs`
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
```ts
import { getSequelize } from '@alemonjs/db';
export const sequelize = getSequelize({
dialect: 'pgsql'
});
```
- 启动
如果你明确写了 `dialect: 'pgsql'`,但没有安装 `pg`,框架会:
```sh
docker-compose up -d
```
1. 打印 warning
2. 尝试使用 `sqlite`
3. 若 `sqlite3` 也未安装,则提示无法使用 SQL 能力
## Redis 说明
Redis 仍然内置使用 `ioredis`,不需要额外安装驱动。
import { Options, Sequelize } from 'sequelize';
type Config = {
dialect?: 'mysql' | 'sqlite';
uri?: string;
host?: string;
port?: number;
user?: string;
password?: string;
database?: string;
storage?: string;
};
export declare const getSequelize: (config?: Config & Options) => Sequelize;
export {};
import { mkdirSync } from 'fs';
import { join, dirname } from 'path';
import { Sequelize } from 'sequelize';
import { initLogPath, logging } from './utils.js';
import { getMysqlConfig, getDialect, getSqliteConfig } from '../../config.js';
const hasMysqlConfig = (mysql) => {
return !!(mysql?.host || mysql?.uri || mysql?.user || mysql?.password || mysql?.database);
};
const createSqliteSequelize = (config) => {
const sqlite = getSqliteConfig();
const { storage, ...options } = config;
const storagePath = storage || sqlite?.storage || join(process.cwd(), 'data', 'alemonjs.sqlite');
mkdirSync(dirname(storagePath), { recursive: true });
return new Sequelize({
dialect: 'sqlite',
storage: storagePath,
logging: logging,
...options
});
};
const createMysqlSequelize = (config, mysql) => {
const { host, port, user, password, database, uri, ...options } = config;
const baseConfig = {
host: '127.0.0.1',
port: 3306,
user: 'root',
password: '',
database: 'alemonjs'
};
const connectConfig = {
host: host || mysql?.host || baseConfig.host,
port: port || mysql?.port || baseConfig.port,
user: user || mysql?.user || baseConfig.user,
password: password || mysql?.password || baseConfig.password,
database: database || mysql?.database || baseConfig.database
};
const url = uri || mysql?.uri || '';
return new Sequelize(url || `mysql://${connectConfig.user}:${connectConfig.password}@${connectConfig.host}:${connectConfig.port}/${connectConfig.database}`, {
dialect: 'mysql',
logging: logging,
timezone: '+08:00',
...options
});
};
const getSequelize = (config = {}) => {
if (global.sequelize) {
return global.sequelize;
}
initLogPath();
const mysql = getMysqlConfig();
const configDialect = config.dialect || getDialect();
const useSqlite = configDialect === 'sqlite' || (!configDialect && !hasMysqlConfig(mysql) && !config.uri && !config.host);
if (useSqlite) {
global.sequelize = createSqliteSequelize(config);
}
else {
global.sequelize = createMysqlSequelize(config, mysql);
}
return global.sequelize;
};
export { getSequelize };
import { Attributes, FindOptions, Model, ModelAttributes, ModelCtor, ModelOptions, ModelStatic, Optional } from 'sequelize';
declare function findAllValues<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>[]>;
declare function findOneValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findOneRandomValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findAllCurrentValues<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>[]>;
declare function findOneCurrentValue<M extends Model>(this: ModelStatic<M>, options?: FindOptions<Attributes<M>>): Promise<Attributes<M>>;
declare function findOrCreateValue<M extends Model>(this: ModelStatic<M>, options?: any): Promise<[Attributes<M>, boolean]>;
declare function deleted<M extends Model>(this: ModelStatic<M>, options?: any): Promise<number>;
export type AttributesModel<T extends ModelCtor<Model>> = T extends ModelCtor<infer M> ? (M extends Model<infer U, object> ? U : never) : never;
type ModelBaseProps = {
id: number;
created_at?: Date | null;
updated_at?: Date | null;
deleted_at?: Date | null;
};
type InitConfig<T> = ModelAttributes<Model<T & ModelBaseProps>, Optional<Attributes<Model<T & ModelBaseProps>>, keyof ModelBaseProps>>;
type Base = {
[key in string]: unknown;
};
export declare class BaseModel<T = ModelBaseProps> extends Model<T & ModelBaseProps> {
static findAllValues: typeof findAllValues;
static findOneValue: typeof findOneValue;
static findOneRandomValue: typeof findOneRandomValue;
static findAllCurrentValues: typeof findAllCurrentValues;
static findOneCurrentValue: typeof findOneCurrentValue;
static findOrCreateValue: typeof findOrCreateValue;
static deleted: typeof deleted;
static generate<T extends Base>(config: InitConfig<T>, options?: ModelOptions): ModelCtor<Model<T & ModelBaseProps>>;
}
export {};
import { DataTypes, Model } from 'sequelize';
function findAllValues(options) {
return this.findAll({
...options,
raw: true
});
}
function findOneValue(options = {}) {
return this.findOne({
...options,
raw: true
});
}
function findOneRandomValue(options = {}) {
return this.findOne({
...options,
order: this.sequelize.random(),
raw: true
});
}
function findAllCurrentValues(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.findAll({
...options,
where: where,
raw: true
});
}
function findOneCurrentValue(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.findOne({
...options,
where: where,
raw: true
});
}
function findOrCreateValue(options = {}) {
return this.findOrCreate({
...options,
raw: true
});
}
function deleted(options = {}) {
const where = options?.where ?? {};
where['deleted_at'] = null;
return this.update({
deleted_at: new Date()
}, {
...options,
where: where
}).then(result => result?.[0] || 0);
}
const initModelOptions = {
freezeTableName: true,
timestamps: true,
deletedAt: 'deleted_at',
createdAt: 'created_at',
updatedAt: 'updated_at'
};
const MoDelInitOptions = {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
created_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
comment: '创建时间'
},
updated_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
comment: '更新时间'
},
deleted_at: {
type: DataTypes.DATE,
allowNull: true,
comment: '删除时间'
}
};
class BaseModel extends Model {
static findAllValues = findAllValues;
static findOneValue = findOneValue;
static findOneRandomValue = findOneRandomValue;
static findAllCurrentValues = findAllCurrentValues;
static findOneCurrentValue = findOneCurrentValue;
static findOrCreateValue = findOrCreateValue;
static deleted = deleted;
static generate(config, options = {}) {
this.init({
...MoDelInitOptions,
...config
}, {
...initModelOptions,
sequelize: this.sequelize,
...options
});
return this;
}
}
export { BaseModel };
export declare const initLogPath: () => any;
export declare const logging: (sql: string) => boolean;
import { mkdirSync, appendFile } from 'fs';
import { join } from 'path';
import dayjs from 'dayjs';
import { getMysqlConfig } from '../../config.js';
const initLogPath = () => {
const mysql = getMysqlConfig();
const dir = mysql.logPath || join(process.cwd(), 'logs', 'db');
mkdirSync(dir, { recursive: true });
return dir;
};
const logging = (sql) => {
const dir = initLogPath();
const TIME = dayjs().format('YYYY-MM-DD');
const time = dayjs().format('YYYY-MM-DD HH:mm:ss');
appendFile(join(dir, `${TIME}.log`), `${time}\n${sql}\n`, err => {
if (err) {
logger.error('Error writing to log file:', err);
}
});
return false;
};
export { initLogPath, logging };

Sorry, the diff of this file is too big to display