@furystack/shades 11.0.35 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +86 -0
- package/esm/compile-route.spec.d.ts +2 -0
- package/esm/compile-route.spec.d.ts.map +1 -0
- package/esm/compile-route.spec.js +34 -0
- package/esm/compile-route.spec.js.map +1 -0
- package/esm/components/route-link.d.ts.map +1 -1
- package/esm/components/route-link.js +4 -5
- package/esm/components/route-link.js.map +1 -1
- package/esm/components/route-link.spec.js +1 -1
- package/esm/components/route-link.spec.js.map +1 -1
- package/esm/css-generator.d.ts +50 -0
- package/esm/css-generator.d.ts.map +1 -0
- package/esm/css-generator.js +107 -0
- package/esm/css-generator.js.map +1 -0
- package/esm/css-generator.spec.d.ts +2 -0
- package/esm/css-generator.spec.d.ts.map +1 -0
- package/esm/css-generator.spec.js +162 -0
- package/esm/css-generator.spec.js.map +1 -0
- package/esm/index.d.ts +2 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -1
- package/esm/models/css-object.d.ts +33 -0
- package/esm/models/css-object.d.ts.map +1 -0
- package/esm/models/css-object.js +2 -0
- package/esm/models/css-object.js.map +1 -0
- package/esm/models/index.d.ts +1 -0
- package/esm/models/index.d.ts.map +1 -1
- package/esm/models/index.js +1 -0
- package/esm/models/index.js.map +1 -1
- package/esm/shade.d.ts +18 -2
- package/esm/shade.d.ts.map +1 -1
- package/esm/shade.js +8 -0
- package/esm/shade.js.map +1 -1
- package/esm/shade.spec.d.ts +2 -0
- package/esm/shade.spec.d.ts.map +1 -0
- package/esm/shade.spec.js +197 -0
- package/esm/shade.spec.js.map +1 -0
- package/esm/style-manager.d.ts +65 -0
- package/esm/style-manager.d.ts.map +1 -0
- package/esm/style-manager.js +95 -0
- package/esm/style-manager.js.map +1 -0
- package/esm/style-manager.spec.d.ts +2 -0
- package/esm/style-manager.spec.d.ts.map +1 -0
- package/esm/style-manager.spec.js +179 -0
- package/esm/style-manager.spec.js.map +1 -0
- package/esm/styled-element.spec.d.ts +2 -0
- package/esm/styled-element.spec.d.ts.map +1 -0
- package/esm/styled-element.spec.js +86 -0
- package/esm/styled-element.spec.js.map +1 -0
- package/esm/styled-shade.spec.d.ts +2 -0
- package/esm/styled-shade.spec.d.ts.map +1 -0
- package/esm/styled-shade.spec.js +66 -0
- package/esm/styled-shade.spec.js.map +1 -0
- package/package.json +1 -1
- package/src/compile-route.spec.ts +39 -0
- package/src/components/route-link.spec.tsx +1 -1
- package/src/components/route-link.tsx +4 -5
- package/src/css-generator.spec.ts +183 -0
- package/src/css-generator.ts +117 -0
- package/src/index.ts +2 -0
- package/src/models/css-object.ts +34 -0
- package/src/models/index.ts +1 -0
- package/src/shade.spec.tsx +238 -0
- package/src/shade.ts +29 -2
- package/src/style-manager.spec.ts +229 -0
- package/src/style-manager.ts +104 -0
- package/src/styled-element.spec.tsx +117 -0
- package/src/styled-shade.spec.ts +86 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base CSS properties - subset of CSSStyleDeclaration
|
|
3
|
+
*/
|
|
4
|
+
export type CSSProperties = Partial<CSSStyleDeclaration>;
|
|
5
|
+
/**
|
|
6
|
+
* Selector key pattern for pseudo-classes and nested selectors
|
|
7
|
+
* Examples: '&:hover', '&:active', '& .className', '& > div'
|
|
8
|
+
*/
|
|
9
|
+
export type SelectorKey = `&${string}`;
|
|
10
|
+
/**
|
|
11
|
+
* CSS object supporting nested selectors for component-level styling.
|
|
12
|
+
*
|
|
13
|
+
* Use this type for the `css` property in Shade components to define
|
|
14
|
+
* styles that are injected as a stylesheet during component registration.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const styles: CSSObject = {
|
|
19
|
+
* padding: '16px',
|
|
20
|
+
* backgroundColor: 'white',
|
|
21
|
+
* '&:hover': {
|
|
22
|
+
* backgroundColor: '#f0f0f0'
|
|
23
|
+
* },
|
|
24
|
+
* '& .title': {
|
|
25
|
+
* fontWeight: 'bold'
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export type CSSObject = CSSProperties & {
|
|
31
|
+
[K in SelectorKey]?: CSSProperties;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=css-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-object.d.ts","sourceRoot":"","sources":["../../src/models/css-object.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAExD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,MAAM,EAAE,CAAA;AAEtC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG;KACrC,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa;CACnC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-object.js","sourceRoot":"","sources":["../../src/models/css-object.ts"],"names":[],"mappings":""}
|
package/esm/models/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
|
package/esm/models/index.js
CHANGED
package/esm/models/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
|
package/esm/shade.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Constructable } from '@furystack/inject';
|
|
2
|
-
import type { ChildrenList, PartialElement, RenderOptions } from './models/index.js';
|
|
2
|
+
import type { ChildrenList, CSSObject, PartialElement, RenderOptions } from './models/index.js';
|
|
3
3
|
export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
|
|
4
4
|
/**
|
|
5
5
|
* Explicit shadow dom name. Will fall back to 'shade-{guid}' if not provided
|
|
@@ -30,9 +30,25 @@ export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
|
|
|
30
30
|
*/
|
|
31
31
|
elementBase?: Constructable<TElementBase>;
|
|
32
32
|
/**
|
|
33
|
-
* A default style that will be applied to the element
|
|
33
|
+
* A default style that will be applied to the element as inline styles.
|
|
34
|
+
* Can be overridden by external styles on instances.
|
|
34
35
|
*/
|
|
35
36
|
style?: Partial<CSSStyleDeclaration>;
|
|
37
|
+
/**
|
|
38
|
+
* CSS styles injected as a stylesheet during component registration.
|
|
39
|
+
* Supports pseudo-selectors (&:hover, &:active) and nested selectors (& .class).
|
|
40
|
+
* Use this for component-level styling that doesn't need per-instance overrides.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* css: {
|
|
45
|
+
* padding: '16px',
|
|
46
|
+
* '&:hover': { backgroundColor: '#f0f0f0' },
|
|
47
|
+
* '& .title': { fontWeight: 'bold' }
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
css?: CSSObject;
|
|
36
52
|
};
|
|
37
53
|
/**
|
|
38
54
|
* Factory method for creating Shade components
|
package/esm/shade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAM/F,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,SAAS,WAAW,IAAI;IACnE;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAErF;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KACzC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAE/E;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAEzC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAEpC;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,EAAE,SAAS,CAAA;CAChB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,EAAE,YAAY,SAAS,WAAW,GAAG,WAAW,EAC1E,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,MAiO7B,OAAO,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,EAAE,WAAW,YAAY,KAgB9D,GAAG,CAAC,OAEpB,CAAA"}
|
package/esm/shade.js
CHANGED
|
@@ -3,6 +3,7 @@ import { ObservableValue } from '@furystack/utils';
|
|
|
3
3
|
import { LocationService } from './services/location-service.js';
|
|
4
4
|
import { ResourceManager } from './services/resource-manager.js';
|
|
5
5
|
import { attachProps, attachStyles } from './shade-component.js';
|
|
6
|
+
import { StyleManager } from './style-manager.js';
|
|
6
7
|
/**
|
|
7
8
|
* Factory method for creating Shade components
|
|
8
9
|
* @param o The options object for component creation
|
|
@@ -13,6 +14,10 @@ export const Shade = (o) => {
|
|
|
13
14
|
const customElementName = o.shadowDomName;
|
|
14
15
|
const existing = customElements.get(customElementName);
|
|
15
16
|
if (!existing) {
|
|
17
|
+
// Register CSS styles if provided
|
|
18
|
+
if (o.css) {
|
|
19
|
+
StyleManager.registerComponentStyles(customElementName, o.css, o.elementBaseName);
|
|
20
|
+
}
|
|
16
21
|
const ElementBase = o.elementBase || HTMLElement;
|
|
17
22
|
customElements.define(customElementName, class extends ElementBase {
|
|
18
23
|
_renderCount = 0;
|
|
@@ -189,6 +194,9 @@ export const Shade = (o) => {
|
|
|
189
194
|
});
|
|
190
195
|
el.props = props || {};
|
|
191
196
|
el.shadeChildren = children;
|
|
197
|
+
if (o.elementBaseName) {
|
|
198
|
+
el.setAttribute('is', customElementName);
|
|
199
|
+
}
|
|
192
200
|
attachStyles(el, { style: o.style });
|
|
193
201
|
attachProps(el, props);
|
|
194
202
|
return el;
|
package/esm/shade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AA+DjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,CAAqC,EACrC,EAAE;IACF,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,CAAC,CAAC,aAAa,CAAA;IAEzC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,kCAAkC;QAClC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,YAAY,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,CAAC,CAAA;QACnF,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,WAAW,CAAA;QAEhD,cAAc,CAAC,MAAM,CACnB,iBAAiB,EACjB,KAAM,SAAS,WAA0C;YAC/C,YAAY,GAAG,CAAC,CAAA;YAExB;;eAEG;YACI,cAAc;gBACnB,OAAO,IAAI,CAAC,YAAY,CAAA;YAC1B,CAAC;YAEM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;YAEvC,iBAAiB;gBACtB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBACrC,IAAI,CAAC,eAAe,EAAE,CAAA;YACxB,CAAC;YAEM,KAAK,CAAC,oBAAoB;gBAC/B,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBACrC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;gBACjD,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;YAClB,CAAC;YAED;;eAEG;YACI,KAAK,CAAuE;YAEnF;;eAEG;YACI,aAAa,CAAe;YAEnC;;;eAGG;YACI,MAAM,GAAG,CAAC,OAA4C,EAAE,EAAE;gBAC/D,IAAI,CAAC,YAAY,EAAE,CAAA;gBACnB,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC1B,CAAC,CAAA;YAED;;eAEG;YACK,gBAAgB,GAAG,GAAwC,EAAE;gBACnE,MAAM,aAAa,GAAwC;oBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,aAAa;oBAC5B,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,IAAI,CAAC,YAAY;oBAC9B,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;wBAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;wBACpE,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;oBAC/E,CAAC;oBACD,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAC9B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnF,cAAc,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CACpC,IAAI,CAAC,eAAe,CAAC,aAAa,CAChC,kBAAkB,GAAG,EAAE,EACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EAC5E,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAC7B;oBAEH,cAAc,EAAE,CAAI,GAAW,EAAE,YAAe,EAAE,WAAW,GAAG,YAAY,EAAE,EAAE;wBAC9E,MAAM,cAAc,GAAG,GAAG,EAAE;4BAC1B,MAAM,KAAK,GAAG,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;4BACvC,OAAO,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAO,CAAC,CAAC,CAAC,YAAY,CAAA;wBACxD,CAAC,CAAA;wBAED,MAAM,YAAY,GAAG,CAAC,KAAQ,EAAE,EAAE;4BAChC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gCACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;gCACtC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;4BACrC,CAAC;4BACD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gCACpE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;4BAC5B,CAAC;wBACH,CAAC,CAAA;wBAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CACnD,kBAAkB,GAAG,EAAE,EACvB,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC,CAC5C,CAAA;wBAED,MAAM,sBAAsB,GAAG,CAAC,CAAe,EAAE,EAAE;4BACjD,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;gCACnD,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAO,CAAC,IAAI,YAAY,CAAC,CAAA;4BAC7E,CAAC;wBACH,CAAC,CAAA;wBAED,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,GAAG,gBAAgB,EAAE,GAAG,EAAE;4BAC7E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;4BAC1D,MAAM,WAAW,GAAG,kCAAkC,CAAA;4BACtD,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAA;4BACxD,cAAc,CAAC,SAAS,GAAG,CAAC,CAA2C,EAAE,EAAE;gCACzE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;oCACvB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gCAC5B,CAAC;4BACH,CAAC,CAAA;4BACD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gCAClD,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;4BAC5C,CAAC,CAAC,CAAA;4BAEF,OAAO;gCACL,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;oCACrB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;oCAC7D,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;oCAC9B,cAAc,CAAC,KAAK,EAAE,CAAA;gCACxB,CAAC;6BACF,CAAA;wBACH,CAAC,CAAC,CAAA;wBAEF,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;wBAElC,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAClF,IAAI,CAAC,eAAe,EAAE,CACvB,CAAA;oBACH,CAAC;oBACD,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;iBAC7E,CAAA;gBAED,OAAO,aAAa,CAAA;YACtB,CAAC,CAAA;YAED;;eAEG;YACI,eAAe;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBAEzD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBACxD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;gBACrB,CAAC;gBAED,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACzE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAA;gBAC/B,CAAC;gBAED,IAAI,YAAY,YAAY,WAAW,EAAE,CAAC;oBACxC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;gBACpC,CAAC;gBACD,IAAI,YAAY,YAAY,gBAAgB,EAAE,CAAC;oBAC7C,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;gBACpC,CAAC;YACH,CAAC;YAED;;eAEG;YACI,eAAe;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBAC7E,IAAI,aAAa,YAAY,OAAO,EAAE,CAAC;oBACrC,aAAa;yBACV,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;yBAC3C,KAAK,CAAC,GAAG,EAAE;wBACV,MAAM;oBACR,CAAC,CAAC,CAAA;gBACN,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAA;gBAC9B,CAAC;YACH,CAAC;YAEO,OAAO,GAAwB,SAAS,CAAA;YAExC,SAAS,CAAW;YAEpB,qBAAqB;gBAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;gBAC/B,OAAO,MAAM,EAAE,CAAC;oBACd,IAAK,MAAsB,CAAC,QAAQ,EAAE,CAAC;wBACrC,OAAQ,MAAsB,CAAC,QAAQ,CAAA;oBACzC,CAAC;oBACD,MAAM,GAAG,MAAM,CAAC,aAAa,CAAA;gBAC/B,CAAC;YACH,CAAC;YAED,IAAW,QAAQ;gBACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,OAAO,IAAI,CAAC,SAAS,CAAA;gBACvB,CAAC;gBAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;gBACzE,IAAI,SAAS,IAAI,SAAS,YAAY,QAAQ,EAAE,CAAC;oBAC/C,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;gBAC/C,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,SAAS,GAAG,UAAU,CAAA;oBAC3B,OAAO,UAAU,CAAA;gBACnB,CAAC;gBACD,wDAAwD;gBACxD,OAAO,IAAI,QAAQ,EAAE,CAAA;YACvB,CAAC;YAED,IAAW,QAAQ,CAAC,CAAW;gBAC7B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YACpB,CAAC;SACF,EACD,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAC/D,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC,aAAa,gCAAgC,CAAC,CAAA;IACtG,CAAC;IAED,OAAO,CAAC,KAA4C,EAAE,QAAuB,EAAE,EAAE;QAC/E,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QACzD,MAAM,EAAE,GAAG,IAAK,WAAwC,CAAC;YACvD,GAAI,KAAwE;SAC7E,CAAwB,CAAA;QAEzB,EAAE,CAAC,KAAK,GAAG,KAAK,IAAK,EAA4C,CAAA;QACjE,EAAE,CAAC,aAAa,GAAG,QAAQ,CAAA;QAE3B,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACtB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;QAC1C,CAAC;QAED,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACpC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAEtB,OAAO,EAAiB,CAAA;IAC1B,CAAC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shade.spec.d.ts","sourceRoot":"","sources":["../src/shade.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Injector } from '@furystack/inject';
|
|
2
|
+
import { sleepAsync, usingAsync } from '@furystack/utils';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
4
|
+
import { initializeShadeRoot } from './initialize.js';
|
|
5
|
+
import { createComponent } from './shade-component.js';
|
|
6
|
+
import { Shade } from './shade.js';
|
|
7
|
+
describe('Shade edge cases', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
document.body.innerHTML = '';
|
|
13
|
+
});
|
|
14
|
+
describe('duplicate shadowDomName error', () => {
|
|
15
|
+
it('should throw an error when registering a duplicate shadowDomName', () => {
|
|
16
|
+
// First registration should succeed
|
|
17
|
+
Shade({
|
|
18
|
+
shadowDomName: 'shade-duplicate-test',
|
|
19
|
+
render: () => createComponent("div", null, "First"),
|
|
20
|
+
});
|
|
21
|
+
// Second registration with the same name should throw
|
|
22
|
+
expect(() => {
|
|
23
|
+
Shade({
|
|
24
|
+
shadowDomName: 'shade-duplicate-test',
|
|
25
|
+
render: () => createComponent("div", null, "Second"),
|
|
26
|
+
});
|
|
27
|
+
}).toThrow("A custom shade with shadow DOM name 'shade-duplicate-test' has already been registered!");
|
|
28
|
+
});
|
|
29
|
+
it('should include the duplicate name in the error message', () => {
|
|
30
|
+
const uniqueName = `shade-duplicate-name-in-error-${Date.now()}`;
|
|
31
|
+
Shade({
|
|
32
|
+
shadowDomName: uniqueName,
|
|
33
|
+
render: () => createComponent("div", null, "First"),
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
Shade({
|
|
37
|
+
shadowDomName: uniqueName,
|
|
38
|
+
render: () => createComponent("div", null, "Second"),
|
|
39
|
+
});
|
|
40
|
+
// Should not reach here
|
|
41
|
+
expect.fail('Expected an error to be thrown');
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
expect(e.message).toContain(uniqueName);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('injector from props', () => {
|
|
49
|
+
it('should use props injector for child component instead of inheriting from parent', async () => {
|
|
50
|
+
await usingAsync(new Injector(), async (rootInjector) => {
|
|
51
|
+
const propsInjector = new Injector();
|
|
52
|
+
const rootElement = document.getElementById('root');
|
|
53
|
+
let parentCapturedInjector;
|
|
54
|
+
let childCapturedInjector;
|
|
55
|
+
const ChildComponent = Shade({
|
|
56
|
+
shadowDomName: 'shade-injector-child-props-test',
|
|
57
|
+
render: ({ injector }) => {
|
|
58
|
+
childCapturedInjector = injector;
|
|
59
|
+
return createComponent("div", null, "Child");
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const ParentComponent = Shade({
|
|
63
|
+
shadowDomName: 'shade-injector-parent-props-test',
|
|
64
|
+
render: ({ injector, children }) => {
|
|
65
|
+
parentCapturedInjector = injector;
|
|
66
|
+
return createComponent("div", null, children);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
initializeShadeRoot({
|
|
70
|
+
injector: rootInjector,
|
|
71
|
+
rootElement,
|
|
72
|
+
jsxElement: (createComponent(ParentComponent, null,
|
|
73
|
+
createComponent(ChildComponent, { injector: propsInjector }))),
|
|
74
|
+
});
|
|
75
|
+
await sleepAsync(10);
|
|
76
|
+
// Parent should use root injector (inherited from parent)
|
|
77
|
+
expect(parentCapturedInjector).toBe(rootInjector);
|
|
78
|
+
// Child should use the props injector, not the parent's
|
|
79
|
+
expect(childCapturedInjector).toBe(propsInjector);
|
|
80
|
+
expect(childCapturedInjector).not.toBe(rootInjector);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('BroadcastChannel cross-tab communication', () => {
|
|
85
|
+
it('should update stored state when receiving BroadcastChannel message with matching key', async () => {
|
|
86
|
+
const mockedStorage = new Map();
|
|
87
|
+
const store = {
|
|
88
|
+
getItem: (key) => mockedStorage.get(key) || null,
|
|
89
|
+
setItem: (key, value) => mockedStorage.set(key, value),
|
|
90
|
+
length: 0,
|
|
91
|
+
clear: () => mockedStorage.clear(),
|
|
92
|
+
key: (index) => Array.from(mockedStorage.keys())[index] || null,
|
|
93
|
+
removeItem: (key) => mockedStorage.delete(key),
|
|
94
|
+
};
|
|
95
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
96
|
+
const rootElement = document.getElementById('root');
|
|
97
|
+
const stateKey = 'broadcast-test-key';
|
|
98
|
+
const ExampleComponent = Shade({
|
|
99
|
+
shadowDomName: 'shade-broadcast-channel-test',
|
|
100
|
+
render: ({ useStoredState }) => {
|
|
101
|
+
const [value] = useStoredState(stateKey, 'initial', store);
|
|
102
|
+
return createComponent("div", { id: "value" }, value);
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
initializeShadeRoot({
|
|
106
|
+
injector,
|
|
107
|
+
rootElement,
|
|
108
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
109
|
+
});
|
|
110
|
+
await sleepAsync(50);
|
|
111
|
+
expect(document.getElementById('value')?.textContent).toBe('initial');
|
|
112
|
+
// Simulate cross-tab message via BroadcastChannel
|
|
113
|
+
const channel = new BroadcastChannel('useStoredState-broadcast-channel');
|
|
114
|
+
channel.postMessage({ key: stateKey, value: 'updated-from-other-tab' });
|
|
115
|
+
await sleepAsync(50);
|
|
116
|
+
expect(document.getElementById('value')?.textContent).toBe('updated-from-other-tab');
|
|
117
|
+
channel.close();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
it('should ignore BroadcastChannel messages with different key', async () => {
|
|
121
|
+
const mockedStorage = new Map();
|
|
122
|
+
const store = {
|
|
123
|
+
getItem: (key) => mockedStorage.get(key) || null,
|
|
124
|
+
setItem: (key, value) => mockedStorage.set(key, value),
|
|
125
|
+
length: 0,
|
|
126
|
+
clear: () => mockedStorage.clear(),
|
|
127
|
+
key: (index) => Array.from(mockedStorage.keys())[index] || null,
|
|
128
|
+
removeItem: (key) => mockedStorage.delete(key),
|
|
129
|
+
};
|
|
130
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
131
|
+
const rootElement = document.getElementById('root');
|
|
132
|
+
const stateKey = 'broadcast-filter-test-key';
|
|
133
|
+
const ExampleComponent = Shade({
|
|
134
|
+
shadowDomName: 'shade-broadcast-channel-filter-test',
|
|
135
|
+
render: ({ useStoredState }) => {
|
|
136
|
+
const [value] = useStoredState(stateKey, 'initial', store);
|
|
137
|
+
return createComponent("div", { id: "value" }, value);
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
initializeShadeRoot({
|
|
141
|
+
injector,
|
|
142
|
+
rootElement,
|
|
143
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
144
|
+
});
|
|
145
|
+
await sleepAsync(50);
|
|
146
|
+
expect(document.getElementById('value')?.textContent).toBe('initial');
|
|
147
|
+
// Simulate cross-tab message with different key
|
|
148
|
+
const channel = new BroadcastChannel('useStoredState-broadcast-channel');
|
|
149
|
+
channel.postMessage({ key: 'different-key', value: 'should-be-ignored' });
|
|
150
|
+
await sleepAsync(50);
|
|
151
|
+
// Value should remain unchanged
|
|
152
|
+
expect(document.getElementById('value')?.textContent).toBe('initial');
|
|
153
|
+
channel.close();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
it('should cleanup BroadcastChannel on component disposal', async () => {
|
|
157
|
+
const mockedStorage = new Map();
|
|
158
|
+
const store = {
|
|
159
|
+
getItem: (key) => mockedStorage.get(key) || null,
|
|
160
|
+
setItem: (key, value) => mockedStorage.set(key, value),
|
|
161
|
+
length: 0,
|
|
162
|
+
clear: () => mockedStorage.clear(),
|
|
163
|
+
key: (index) => Array.from(mockedStorage.keys())[index] || null,
|
|
164
|
+
removeItem: (key) => mockedStorage.delete(key),
|
|
165
|
+
};
|
|
166
|
+
await usingAsync(new Injector(), async (injector) => {
|
|
167
|
+
const rootElement = document.getElementById('root');
|
|
168
|
+
const stateKey = 'broadcast-cleanup-test-key';
|
|
169
|
+
const ExampleComponent = Shade({
|
|
170
|
+
shadowDomName: 'shade-broadcast-channel-cleanup-test',
|
|
171
|
+
render: ({ useStoredState }) => {
|
|
172
|
+
const [value] = useStoredState(stateKey, 'initial', store);
|
|
173
|
+
return createComponent("div", { id: "value" }, value);
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
initializeShadeRoot({
|
|
177
|
+
injector,
|
|
178
|
+
rootElement,
|
|
179
|
+
jsxElement: createComponent(ExampleComponent, null),
|
|
180
|
+
});
|
|
181
|
+
await sleepAsync(50);
|
|
182
|
+
expect(document.getElementById('value')?.textContent).toBe('initial');
|
|
183
|
+
// Remove the component from DOM
|
|
184
|
+
document.body.innerHTML = '';
|
|
185
|
+
await sleepAsync(50);
|
|
186
|
+
// Create a new channel to send a message (simulating another tab)
|
|
187
|
+
const channel = new BroadcastChannel('useStoredState-broadcast-channel');
|
|
188
|
+
// This should not cause any errors since the component's channel should be closed
|
|
189
|
+
channel.postMessage({ key: stateKey, value: 'should-not-crash' });
|
|
190
|
+
await sleepAsync(50);
|
|
191
|
+
channel.close();
|
|
192
|
+
// Test passes if no errors occur
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=shade.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shade.spec.js","sourceRoot":"","sources":["../src/shade.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CSSObject } from './models/css-object.js';
|
|
2
|
+
/**
|
|
3
|
+
* Singleton that manages component CSS injection.
|
|
4
|
+
* Creates and maintains a shared `<style>` element in the document head,
|
|
5
|
+
* and tracks registered component styles to avoid duplicates.
|
|
6
|
+
*/
|
|
7
|
+
declare class StyleManagerClass {
|
|
8
|
+
private styleElement;
|
|
9
|
+
private registeredComponents;
|
|
10
|
+
/**
|
|
11
|
+
* Gets or creates the shared style element
|
|
12
|
+
* @returns The style element for CSS injection
|
|
13
|
+
*/
|
|
14
|
+
private getStyleElement;
|
|
15
|
+
/**
|
|
16
|
+
* Registers CSS styles for a component.
|
|
17
|
+
* Styles are only injected once per component (based on shadowDomName).
|
|
18
|
+
*
|
|
19
|
+
* @param shadowDomName - The unique component identifier (used as CSS selector)
|
|
20
|
+
* @param cssObject - The CSSObject containing styles and nested selectors
|
|
21
|
+
* @param elementBaseName - Optional base element name for customized built-in elements (e.g., 'a', 'button').
|
|
22
|
+
* When provided, generates selector like `a[is="component-name"]` instead of `component-name`
|
|
23
|
+
* @returns True if styles were injected, false if already registered
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Regular custom element
|
|
28
|
+
* StyleManager.registerComponentStyles('my-button', {
|
|
29
|
+
* padding: '12px',
|
|
30
|
+
* '&:hover': { backgroundColor: 'blue' }
|
|
31
|
+
* })
|
|
32
|
+
*
|
|
33
|
+
* // Customized built-in element (extends anchor)
|
|
34
|
+
* StyleManager.registerComponentStyles('my-link', {
|
|
35
|
+
* color: 'blue',
|
|
36
|
+
* '&:hover': { textDecoration: 'underline' }
|
|
37
|
+
* }, 'a')
|
|
38
|
+
* // Generates: a[is="my-link"] { color: blue; }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
registerComponentStyles(shadowDomName: string, cssObject: CSSObject, elementBaseName?: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Checks if a component's styles have already been registered
|
|
44
|
+
* @param shadowDomName - The component identifier to check
|
|
45
|
+
* @returns True if styles are already registered
|
|
46
|
+
*/
|
|
47
|
+
isRegistered(shadowDomName: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Gets all registered component names (for debugging/testing)
|
|
50
|
+
* @returns Set of registered component names
|
|
51
|
+
*/
|
|
52
|
+
getRegisteredComponents(): ReadonlySet<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Clears all registered styles (useful for testing)
|
|
55
|
+
*/
|
|
56
|
+
clear(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Singleton instance for managing component CSS styles.
|
|
60
|
+
* Use this to register component-level styles that support
|
|
61
|
+
* pseudo-selectors and nested selectors.
|
|
62
|
+
*/
|
|
63
|
+
export declare const StyleManager: StyleManagerClass;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=style-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-manager.d.ts","sourceRoot":"","sources":["../src/style-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;;GAIG;AACH,cAAM,iBAAiB;IACrB,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,oBAAoB,CAAoB;IAEhD;;;OAGG;IACH,OAAO,CAAC,eAAe;IASvB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACI,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO;IAiB9G;;;;OAIG;IACI,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAInD;;;OAGG;IACI,uBAAuB,IAAI,WAAW,CAAC,MAAM,CAAC;IAIrD;;OAEG;IACI,KAAK,IAAI,IAAI;CAQrB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,mBAA0B,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { generateCSS } from './css-generator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Singleton that manages component CSS injection.
|
|
4
|
+
* Creates and maintains a shared `<style>` element in the document head,
|
|
5
|
+
* and tracks registered component styles to avoid duplicates.
|
|
6
|
+
*/
|
|
7
|
+
class StyleManagerClass {
|
|
8
|
+
styleElement = null;
|
|
9
|
+
registeredComponents = new Set();
|
|
10
|
+
/**
|
|
11
|
+
* Gets or creates the shared style element
|
|
12
|
+
* @returns The style element for CSS injection
|
|
13
|
+
*/
|
|
14
|
+
getStyleElement() {
|
|
15
|
+
if (!this.styleElement) {
|
|
16
|
+
this.styleElement = document.createElement('style');
|
|
17
|
+
this.styleElement.setAttribute('data-shades-styles', '');
|
|
18
|
+
document.head.appendChild(this.styleElement);
|
|
19
|
+
}
|
|
20
|
+
return this.styleElement;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Registers CSS styles for a component.
|
|
24
|
+
* Styles are only injected once per component (based on shadowDomName).
|
|
25
|
+
*
|
|
26
|
+
* @param shadowDomName - The unique component identifier (used as CSS selector)
|
|
27
|
+
* @param cssObject - The CSSObject containing styles and nested selectors
|
|
28
|
+
* @param elementBaseName - Optional base element name for customized built-in elements (e.g., 'a', 'button').
|
|
29
|
+
* When provided, generates selector like `a[is="component-name"]` instead of `component-name`
|
|
30
|
+
* @returns True if styles were injected, false if already registered
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // Regular custom element
|
|
35
|
+
* StyleManager.registerComponentStyles('my-button', {
|
|
36
|
+
* padding: '12px',
|
|
37
|
+
* '&:hover': { backgroundColor: 'blue' }
|
|
38
|
+
* })
|
|
39
|
+
*
|
|
40
|
+
* // Customized built-in element (extends anchor)
|
|
41
|
+
* StyleManager.registerComponentStyles('my-link', {
|
|
42
|
+
* color: 'blue',
|
|
43
|
+
* '&:hover': { textDecoration: 'underline' }
|
|
44
|
+
* }, 'a')
|
|
45
|
+
* // Generates: a[is="my-link"] { color: blue; }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
registerComponentStyles(shadowDomName, cssObject, elementBaseName) {
|
|
49
|
+
if (this.registeredComponents.has(shadowDomName)) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const selector = elementBaseName ? `${elementBaseName}[is="${shadowDomName}"]` : shadowDomName;
|
|
53
|
+
const css = generateCSS(selector, cssObject);
|
|
54
|
+
if (css) {
|
|
55
|
+
const styleElement = this.getStyleElement();
|
|
56
|
+
styleElement.textContent += `\n/* ${shadowDomName} */\n${css}\n`;
|
|
57
|
+
this.registeredComponents.add(shadowDomName);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Checks if a component's styles have already been registered
|
|
64
|
+
* @param shadowDomName - The component identifier to check
|
|
65
|
+
* @returns True if styles are already registered
|
|
66
|
+
*/
|
|
67
|
+
isRegistered(shadowDomName) {
|
|
68
|
+
return this.registeredComponents.has(shadowDomName);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gets all registered component names (for debugging/testing)
|
|
72
|
+
* @returns Set of registered component names
|
|
73
|
+
*/
|
|
74
|
+
getRegisteredComponents() {
|
|
75
|
+
return this.registeredComponents;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Clears all registered styles (useful for testing)
|
|
79
|
+
*/
|
|
80
|
+
clear() {
|
|
81
|
+
this.registeredComponents.clear();
|
|
82
|
+
if (this.styleElement) {
|
|
83
|
+
this.styleElement.textContent = '';
|
|
84
|
+
this.styleElement.remove();
|
|
85
|
+
this.styleElement = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Singleton instance for managing component CSS styles.
|
|
91
|
+
* Use this to register component-level styles that support
|
|
92
|
+
* pseudo-selectors and nested selectors.
|
|
93
|
+
*/
|
|
94
|
+
export const StyleManager = new StyleManagerClass();
|
|
95
|
+
//# sourceMappingURL=style-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-manager.js","sourceRoot":"","sources":["../src/style-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD;;;;GAIG;AACH,MAAM,iBAAiB;IACb,YAAY,GAA4B,IAAI,CAAA;IAC5C,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;IAEhD;;;OAGG;IACK,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YACnD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;YACxD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACI,uBAAuB,CAAC,aAAqB,EAAE,SAAoB,EAAE,eAAwB;QAClG,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,QAAQ,aAAa,IAAI,CAAC,CAAC,CAAC,aAAa,CAAA;QAC9F,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC5C,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;YAC3C,YAAY,CAAC,WAAW,IAAI,QAAQ,aAAa,QAAQ,GAAG,IAAI,CAAA;YAChE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,aAAqB;QACvC,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACrD,CAAC;IAED;;;OAGG;IACI,uBAAuB;QAC5B,OAAO,IAAI,CAAC,oBAAoB,CAAA;IAClC,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAA;QACjC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,EAAE,CAAA;YAClC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA;YAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-manager.spec.d.ts","sourceRoot":"","sources":["../src/style-manager.spec.ts"],"names":[],"mappings":""}
|