mirror of
https://github.com/MercuryWorkshop/dreamlandjs.git
synced 2025-05-16 15:40:01 -04:00
alicecss overhaul
This commit is contained in:
parent
92fc04197a
commit
654e44dbd7
2 changed files with 58 additions and 23 deletions
3
AliceJS.d.ts
vendored
3
AliceJS.d.ts
vendored
|
@ -21,7 +21,8 @@ declare function stateful<T>(target: T): Stateful<T>;
|
||||||
declare function handle<T>(references: AliceJSReferenceSink<T>, callback: (value: T) => void): void;
|
declare function handle<T>(references: AliceJSReferenceSink<T>, callback: (value: T) => void): void;
|
||||||
|
|
||||||
declare function css(strings: TemplateStringsArray, ...values: any): string;
|
declare function css(strings: TemplateStringsArray, ...values: any): string;
|
||||||
declare var styled: { new: typeof css };
|
declare function rule(strings: TemplateStringsArray, ...values: any): string;
|
||||||
|
declare var styled: { new: typeof css, rule: typeof rule };
|
||||||
|
|
||||||
type DLCSS = string;
|
type DLCSS = string;
|
||||||
|
|
||||||
|
|
78
AliceJS.js
78
AliceJS.js
|
@ -30,7 +30,7 @@ Object.defineProperty(window, "use", {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Object.assign(window, { h, html, stateful, handle, useValue, css, styled: { new: css } });
|
Object.assign(window, { h, html, stateful, handle, useValue, css, rule, styled: { new: css, rule: rule } });
|
||||||
|
|
||||||
// This wraps the target in a proxy, doing 2 things:
|
// This wraps the target in a proxy, doing 2 things:
|
||||||
// - whenever a property is accessed, update the reference stack
|
// - whenever a property is accessed, update the reference stack
|
||||||
|
@ -173,6 +173,10 @@ export function h(type, props, ...children) {
|
||||||
let elm = type.apply(newthis, [slot]);
|
let elm = type.apply(newthis, [slot]);
|
||||||
elm.$ = newthis;
|
elm.$ = newthis;
|
||||||
newthis.root = elm;
|
newthis.root = elm;
|
||||||
|
if (newthis.css) {
|
||||||
|
elm.classList.add(newthis.css);
|
||||||
|
elm.classList.add("self");
|
||||||
|
}
|
||||||
return elm;
|
return elm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,6 +338,33 @@ export function h(type, props, ...children) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useProp("class", classlist => {
|
||||||
|
if (typeof classlist === "string") {
|
||||||
|
elm.className = classlist;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAJSReferences(classlist)) {
|
||||||
|
handle(classlist, classname => elm.className = classname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const name of classlist) {
|
||||||
|
if (isAJSReferences(name)) {
|
||||||
|
let oldvalue = null;
|
||||||
|
handle(name, value => {
|
||||||
|
if (typeof oldvalue === "string") {
|
||||||
|
elm.classList.remove(oldvalue);
|
||||||
|
}
|
||||||
|
elm.classList.add(value);
|
||||||
|
oldvalue = value;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
elm.classList.add(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// apply the non-reactive properties
|
// apply the non-reactive properties
|
||||||
for (const name in props) {
|
for (const name in props) {
|
||||||
const prop = props[name];
|
const prop = props[name];
|
||||||
|
@ -346,11 +377,6 @@ export function h(type, props, ...children) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useProp("css", classname => {
|
|
||||||
elm.classList.add(classname);
|
|
||||||
elm.classList.add("self");
|
|
||||||
});
|
|
||||||
|
|
||||||
return elm;
|
return elm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,11 +419,6 @@ function JSXAddChild(child, cb) {
|
||||||
|
|
||||||
// Where properties are assigned to elements, and where the *non-reactive* syntax sugar goes
|
// Where properties are assigned to elements, and where the *non-reactive* syntax sugar goes
|
||||||
function JSXAddAttributes(elm, name, prop) {
|
function JSXAddAttributes(elm, name, prop) {
|
||||||
if (name === "class") {
|
|
||||||
elm.className = prop;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof prop === "function" && name === "mount") {
|
if (typeof prop === "function" && name === "mount") {
|
||||||
prop(elm);
|
prop(elm);
|
||||||
return;
|
return;
|
||||||
|
@ -433,7 +454,7 @@ function JSXAddAttributes(elm, name, prop) {
|
||||||
elm.setAttribute(name, prop);
|
elm.setAttribute(name, prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse_css(uid, css) {
|
function scopify_css(uid, css) {
|
||||||
const virtualDoc = document.implementation.createHTMLDocument("");
|
const virtualDoc = document.implementation.createHTMLDocument("");
|
||||||
const virtualStyleElement = document.createElement("style");
|
const virtualStyleElement = document.createElement("style");
|
||||||
virtualDoc.body.appendChild(virtualStyleElement);
|
virtualDoc.body.appendChild(virtualStyleElement);
|
||||||
|
@ -452,8 +473,8 @@ function parse_css(uid, css) {
|
||||||
|
|
||||||
return cssParsed;
|
return cssParsed;
|
||||||
}
|
}
|
||||||
export function css(strings, ...values) {
|
function tagcss(strings, values, isblock) {
|
||||||
const uid = `alicecss-${Array(16)
|
const uid = `dream-${Array(16)
|
||||||
.fill(0)
|
.fill(0)
|
||||||
.map(() => {
|
.map(() => {
|
||||||
return Math.floor(Math.random() * 16).toString(16);
|
return Math.floor(Math.random() * 16).toString(16);
|
||||||
|
@ -477,10 +498,13 @@ export function css(strings, ...values) {
|
||||||
flattened_template[current_i] = String(val);
|
flattened_template[current_i] = String(val);
|
||||||
let parsed = flattened_template.join("");
|
let parsed = flattened_template.join("");
|
||||||
if (parsed != oldparsed)
|
if (parsed != oldparsed)
|
||||||
styleElement.textContent = parse_css(
|
if (isblock)
|
||||||
uid,
|
styleElement.textContent = scopify_css(
|
||||||
parsed,
|
uid,
|
||||||
);
|
parsed,
|
||||||
|
);
|
||||||
|
else
|
||||||
|
styleElement.textContent = `.${uid} { ${parsed}; }`
|
||||||
oldparsed = parsed;
|
oldparsed = parsed;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -489,13 +513,23 @@ export function css(strings, ...values) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
styleElement.textContent = parse_css(
|
if (isblock) {
|
||||||
uid,
|
styleElement.textContent = scopify_css(
|
||||||
flattened_template.join(""),
|
uid,
|
||||||
);
|
flattened_template.join(""),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
styleElement.textContent = `.${uid} { ${flattened_template.join("")}; }`
|
||||||
|
}
|
||||||
|
|
||||||
return uid;
|
return uid;
|
||||||
}
|
}
|
||||||
|
export function rule(strings, ...values) {
|
||||||
|
return tagcss(strings, values, false)
|
||||||
|
}
|
||||||
|
export function css(strings, ...values) {
|
||||||
|
return tagcss(strings, values, true);
|
||||||
|
}
|
||||||
|
|
||||||
export function html(strings, ...values) {
|
export function html(strings, ...values) {
|
||||||
let flattened = "";
|
let flattened = "";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue