fix(decorators): patch container-responsive styles to fix stale container queries and add customElement wrapper that sets .is and warns on class/tag mismatch
This commit is contained in:
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@design.estate/dees-element',
|
||||
version: '2.2.1',
|
||||
version: '2.2.2',
|
||||
description: 'A library for creating custom elements extending the lit element class with additional functionalities.'
|
||||
}
|
||||
|
||||
@@ -1,19 +1,47 @@
|
||||
import { unsafeCSS, type CSSResult } from 'lit';
|
||||
import * as domtools from '@design.estate/dees-domtools';
|
||||
|
||||
const camelToKebab = (name: string) =>
|
||||
name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
||||
|
||||
export function containerResponsive() {
|
||||
return function (target: any) {
|
||||
const tagName: string =
|
||||
target.is || target.name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
||||
const containerStyles = domtools.breakpoints.containerContextStyles(tagName);
|
||||
|
||||
const original = target.styles;
|
||||
if (Array.isArray(original)) {
|
||||
target.styles = [...original, containerStyles];
|
||||
} else if (original) {
|
||||
target.styles = [original, containerStyles];
|
||||
// If .is differs from the regex-derived name, cssManager.cssFor*(css, this)
|
||||
// in static styles (evaluated before decorators) used the wrong container name.
|
||||
// Fix those stale references now.
|
||||
const derivedName = target.name ? camelToKebab(target.name) : null;
|
||||
if (derivedName && derivedName !== tagName) {
|
||||
const fixStyle = (style: CSSResult) => {
|
||||
if (style && style.cssText && style.cssText.includes(`@container ${derivedName}`)) {
|
||||
return unsafeCSS(
|
||||
style.cssText.replaceAll(`@container ${derivedName}`, `@container ${tagName}`)
|
||||
);
|
||||
}
|
||||
return style;
|
||||
};
|
||||
|
||||
const original = target.styles;
|
||||
if (Array.isArray(original)) {
|
||||
target.styles = original.map(fixStyle);
|
||||
} else if (original) {
|
||||
target.styles = fixStyle(original);
|
||||
}
|
||||
}
|
||||
|
||||
// Append containment context styles
|
||||
const containerStyles = domtools.breakpoints.containerContextStyles(tagName);
|
||||
const current = target.styles;
|
||||
if (Array.isArray(current)) {
|
||||
target.styles = [...current, containerStyles];
|
||||
} else if (current) {
|
||||
target.styles = [current, containerStyles];
|
||||
} else {
|
||||
target.styles = [containerStyles];
|
||||
}
|
||||
|
||||
return target;
|
||||
};
|
||||
}
|
||||
|
||||
25
ts/decorators.customelement.ts
Normal file
25
ts/decorators.customelement.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { customElement as litCustomElement } from 'lit/decorators/custom-element.js';
|
||||
|
||||
const camelToKebab = (name: string) =>
|
||||
name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
||||
|
||||
export function customElement(tagName: string) {
|
||||
return (classOrTarget: any, context?: any) => {
|
||||
// Set .is so that other decorators and utilities can read the tag name
|
||||
classOrTarget.is = tagName;
|
||||
|
||||
// Warn if class name convention doesn't match the tag
|
||||
if (classOrTarget.name) {
|
||||
const derived = camelToKebab(classOrTarget.name);
|
||||
if (derived !== tagName) {
|
||||
console.warn(
|
||||
`[dees-element] Class "${classOrTarget.name}" kebab-cases to "${derived}" but tag is "${tagName}". ` +
|
||||
`Container queries use .is ("${tagName}").`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Delegate to Lit's original decorator
|
||||
return litCustomElement(tagName)(classOrTarget, context);
|
||||
};
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export { html as static, unsafeStatic } from 'lit/static-html.js';
|
||||
|
||||
export { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
||||
|
||||
export { customElement } from 'lit/decorators/custom-element.js';
|
||||
export { customElement } from './decorators.customelement.js';
|
||||
|
||||
export { property, state, query, queryAll, queryAsync } from 'lit/decorators.js';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user