Compare commits

...

4 Commits
v2.2.1 ... main

Author SHA1 Message Date
f4f4ec5024 v2.2.3
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-12 20:27:18 +00:00
ba56173966 fix(repo): no changes to commit 2026-03-12 20:27:18 +00:00
3e6e953461 v2.2.2
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 1s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
2026-03-11 19:35:16 +00:00
343d02c40d fix(decorators): patch container-responsive styles to fix stale container queries and add customElement wrapper that sets .is and warns on class/tag mismatch 2026-03-11 19:35:16 +00:00
6 changed files with 74 additions and 9 deletions

View File

@@ -1,5 +1,17 @@
# Changelog
## 2026-03-12 - 2.2.3 - fix(repo)
no changes to commit
## 2026-03-11 - 2.2.2 - fix(decorators)
patch container-responsive styles to fix stale container queries and add customElement wrapper that sets .is and warns on class/tag mismatch
- containerResponsive now derives the kebab name and replaces stale '@container <derived>' occurrences inside CSSResult cssText using unsafeCSS to correct container queries produced before decorators ran
- containerResponsive appends containerContextStyles to the component styles while preserving/processing existing static styles
- Added a customElement decorator wrapper that assigns .is on the class, logs a warning if the class name kebab-cases to a different tag name, and delegates to Lit's customElement
- ts/index.ts now re-exports customElement from the local decorator so the new behavior is used project-wide
## 2026-03-11 - 2.2.1 - fix(dees-element)
rename cssForCustom to cssForConstraint, remove DeesElement static cssFor* helpers, and add optional elementClass parameter to cssManager breakpoint helpers

View File

@@ -1,6 +1,6 @@
{
"name": "@design.estate/dees-element",
"version": "2.2.1",
"version": "2.2.3",
"private": false,
"description": "A library for creating custom elements extending the lit element class with additional functionalities.",
"main": "dist_ts/index.js",

View File

@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@design.estate/dees-element',
version: '2.2.1',
version: '2.2.3',
description: 'A library for creating custom elements extending the lit element class with additional functionalities.'
}

View File

@@ -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;
};
}

View 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);
};
}

View File

@@ -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';