@dooboostore/simple-web-component 1.0.1 → 1.0.3
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/README.md +28 -33
- package/dist/cjs/decorators/{elementDefind.js → elementDefine.js} +6 -6
- package/dist/cjs/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
- package/dist/cjs/decorators/query.js.map +1 -1
- package/dist/cjs/decorators/queryAll.js.map +1 -1
- package/dist/cjs/elements/SwcChoose.js +1 -1
- package/dist/cjs/elements/SwcChoose.js.map +1 -1
- package/dist/cjs/elements/SwcForOf.js +7 -77
- package/dist/cjs/elements/SwcForOf.js.map +2 -2
- package/dist/cjs/elements/SwcHTMLElementBase.js +102 -0
- package/dist/cjs/elements/SwcHTMLElementBase.js.map +7 -0
- package/dist/cjs/elements/SwcIf.js +6 -14
- package/dist/cjs/elements/SwcIf.js.map +2 -2
- package/dist/cjs/elements/SwcObject.js +115 -0
- package/dist/cjs/elements/SwcObject.js.map +7 -0
- package/dist/cjs/elements/SwcOther.js +1 -1
- package/dist/cjs/elements/SwcOther.js.map +1 -1
- package/dist/cjs/elements/SwcWhen.js +1 -1
- package/dist/cjs/elements/SwcWhen.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/esm/decorators/{elementDefind.js → elementDefine.js} +3 -3
- package/dist/esm/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
- package/dist/esm/decorators/query.js.map +1 -1
- package/dist/esm/decorators/queryAll.js.map +1 -1
- package/dist/esm/elements/SwcChoose.js +2 -2
- package/dist/esm/elements/SwcChoose.js.map +1 -1
- package/dist/esm/elements/SwcForOf.js +8 -78
- package/dist/esm/elements/SwcForOf.js.map +2 -2
- package/dist/esm/elements/SwcHTMLElementBase.js +83 -0
- package/dist/esm/elements/SwcHTMLElementBase.js.map +7 -0
- package/dist/esm/elements/SwcIf.js +7 -15
- package/dist/esm/elements/SwcIf.js.map +2 -2
- package/dist/esm/elements/SwcObject.js +96 -0
- package/dist/esm/elements/SwcObject.js.map +7 -0
- package/dist/esm/elements/SwcOther.js +2 -2
- package/dist/esm/elements/SwcOther.js.map +1 -1
- package/dist/esm/elements/SwcWhen.js +2 -2
- package/dist/esm/elements/SwcWhen.js.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +192 -97
- package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
- package/dist/types/decorators/{elementDefind.d.ts → elementDefine.d.ts} +2 -2
- package/dist/types/decorators/{elementDefind.d.ts.map → elementDefine.d.ts.map} +1 -1
- package/dist/types/elements/SwcForOf.d.ts +2 -4
- package/dist/types/elements/SwcForOf.d.ts.map +1 -1
- package/dist/types/elements/SwcHTMLElementBase.d.ts +14 -0
- package/dist/types/elements/SwcHTMLElementBase.d.ts.map +1 -0
- package/dist/types/elements/SwcIf.d.ts +2 -2
- package/dist/types/elements/SwcIf.d.ts.map +1 -1
- package/dist/types/elements/SwcObject.d.ts +14 -0
- package/dist/types/elements/SwcObject.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +192 -97
- package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
- package/package.json +1 -1
- package/src/decorators/{elementDefind.ts → elementDefine.ts} +1 -1
- package/src/decorators/query.ts +1 -1
- package/src/decorators/queryAll.ts +1 -1
- package/src/elements/SwcChoose.ts +2 -2
- package/src/elements/SwcForOf.ts +12 -87
- package/src/elements/SwcHTMLElementBase.ts +93 -0
- package/src/elements/SwcIf.ts +8 -27
- package/src/elements/SwcObject.ts +78 -0
- package/src/elements/SwcOther.ts +2 -2
- package/src/elements/SwcWhen.ts +2 -2
- package/src/index.ts +3 -1
package/src/elements/SwcIf.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementDefine, template, style } from '../index';
|
|
2
|
+
import { SwcHTMLElementBase } from './SwcHTMLElementBase';
|
|
2
3
|
|
|
3
|
-
@
|
|
4
|
-
export class SwcIf extends
|
|
4
|
+
@elementDefine({ tagName: 'swc-if', useShadow: true })
|
|
5
|
+
export class SwcIf extends SwcHTMLElementBase {
|
|
5
6
|
private _value: any = false;
|
|
6
|
-
private _masterTplNodes: Node[] = [];
|
|
7
7
|
private _observer: MutationObserver | null = null;
|
|
8
8
|
|
|
9
9
|
constructor() {
|
|
@@ -21,28 +21,18 @@ export class SwcIf extends HTMLElement {
|
|
|
21
21
|
|
|
22
22
|
@style
|
|
23
23
|
styles() {
|
|
24
|
-
return
|
|
25
|
-
:host { display: contents; }
|
|
26
|
-
`;
|
|
24
|
+
return `:host { display: contents; }`;
|
|
27
25
|
}
|
|
28
26
|
|
|
29
27
|
@template
|
|
30
28
|
renderTemplate() {
|
|
31
|
-
return
|
|
32
|
-
<slot id="tpl-slot" style="display:none;"></slot>
|
|
33
|
-
`;
|
|
29
|
+
return `<slot id="tpl-slot" style="display:none;"></slot>`;
|
|
34
30
|
}
|
|
35
31
|
|
|
36
32
|
connectedCallback() {
|
|
37
|
-
|
|
38
|
-
if (tplSlot) {
|
|
39
|
-
// 초기 자식들을 템플릿으로 보관
|
|
40
|
-
this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));
|
|
41
|
-
}
|
|
42
|
-
|
|
33
|
+
this.initCore();
|
|
43
34
|
this._observer = new MutationObserver(() => this.render());
|
|
44
35
|
this._observer.observe(this, { attributes: true });
|
|
45
|
-
|
|
46
36
|
this.render();
|
|
47
37
|
}
|
|
48
38
|
|
|
@@ -54,38 +44,30 @@ export class SwcIf extends HTMLElement {
|
|
|
54
44
|
if (!this.shadowRoot) return;
|
|
55
45
|
|
|
56
46
|
const attrValue = this.getAttribute('value');
|
|
57
|
-
if (attrValue !== null && attrValue.includes('{{')) return;
|
|
47
|
+
if (attrValue !== null && attrValue.includes('{{')) return;
|
|
58
48
|
|
|
59
|
-
// 로직 결정: attribute가 있으면 우선, 없으면 property 사용
|
|
60
49
|
let displayValue = attrValue !== null ? attrValue : this._value;
|
|
61
|
-
|
|
62
|
-
// "false", "null", "undefined" 문자열 처리 및 기본 truthy 체크
|
|
63
50
|
let isTruthy = !!displayValue;
|
|
64
51
|
if (typeof displayValue === 'string') {
|
|
65
52
|
if (displayValue === 'false' || displayValue === '0' || displayValue === '') isTruthy = false;
|
|
66
53
|
else {
|
|
67
|
-
// 식인 경우 평가 시도 (예: "10 > 5")
|
|
68
54
|
try {
|
|
69
55
|
isTruthy = !!new Function(`return ${displayValue}`)();
|
|
70
56
|
} catch (e) {
|
|
71
|
-
// 단순 문자열이면 true로 간주
|
|
72
57
|
isTruthy = true;
|
|
73
58
|
}
|
|
74
59
|
}
|
|
75
60
|
}
|
|
76
61
|
|
|
77
|
-
// 1. 기존에 렌더링된 노드들 삭제
|
|
78
62
|
Array.from(this.children).forEach(c => {
|
|
79
63
|
if (c.getAttribute('slot') === 'if-content') {
|
|
80
64
|
c.remove();
|
|
81
65
|
}
|
|
82
66
|
});
|
|
83
67
|
|
|
84
|
-
// 2. Shadow DOM의 컨텐츠 슬롯 삭제
|
|
85
68
|
const existingSlot = this.shadowRoot.querySelector('slot[name="if-content"]');
|
|
86
69
|
if (existingSlot) existingSlot.remove();
|
|
87
70
|
|
|
88
|
-
// 3. 조건이 참일 때만 노드들을 복제해서 삽입
|
|
89
71
|
if (isTruthy && this._masterTplNodes.length > 0) {
|
|
90
72
|
const contentSlot = document.createElement('slot');
|
|
91
73
|
contentSlot.name = 'if-content';
|
|
@@ -95,7 +77,6 @@ export class SwcIf extends HTMLElement {
|
|
|
95
77
|
const clone = tplNode.cloneNode(true);
|
|
96
78
|
if (clone.nodeType === Node.ELEMENT_NODE) {
|
|
97
79
|
(clone as HTMLElement).setAttribute('slot', 'if-content');
|
|
98
|
-
(clone as HTMLElement).style.display = '';
|
|
99
80
|
} else if (clone.nodeType === Node.TEXT_NODE) {
|
|
100
81
|
if (clone.textContent?.trim().length === 0) return;
|
|
101
82
|
const span = document.createElement('span');
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { elementDefine, template, style } from '../index';
|
|
2
|
+
import { SwcHTMLElementBase } from './SwcHTMLElementBase';
|
|
3
|
+
|
|
4
|
+
@elementDefine({ tagName: 'swc-object', useShadow: true })
|
|
5
|
+
export class SwcObject extends SwcHTMLElementBase {
|
|
6
|
+
private _value: any = {};
|
|
7
|
+
private _renderedNodes: Node[] = [];
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
set value(val: any) {
|
|
14
|
+
if (typeof val !== 'object' || val === null) val = {};
|
|
15
|
+
this._value = this.createReactiveProxy(val, () => this.updateUI());
|
|
16
|
+
this.render();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get value(): any {
|
|
20
|
+
return this._value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@style
|
|
24
|
+
styles() {
|
|
25
|
+
return `:host { display: contents; }`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@template
|
|
29
|
+
renderTemplate() {
|
|
30
|
+
return `<slot id="tpl-slot" style="display:none;"></slot>`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
connectedCallback() {
|
|
34
|
+
this.initCore();
|
|
35
|
+
this.render();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private updateUI() {
|
|
39
|
+
this._renderedNodes.forEach(node => {
|
|
40
|
+
this.applyData(node, this._value);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private render() {
|
|
45
|
+
if (!this.shadowRoot || this._masterTplNodes.length === 0) return;
|
|
46
|
+
|
|
47
|
+
this._renderedNodes.forEach(n => {
|
|
48
|
+
if (n.parentElement === this) this.removeChild(n);
|
|
49
|
+
});
|
|
50
|
+
this._renderedNodes = [];
|
|
51
|
+
|
|
52
|
+
let slot = this.shadowRoot.querySelector('slot[name="obj-content"]');
|
|
53
|
+
if (!slot) {
|
|
54
|
+
slot = document.createElement('slot');
|
|
55
|
+
(slot as HTMLSlotElement).name = 'obj-content';
|
|
56
|
+
this.shadowRoot.appendChild(slot);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this._masterTplNodes.forEach(tplNode => {
|
|
60
|
+
const clone = tplNode.cloneNode(true);
|
|
61
|
+
if (clone.nodeType === Node.ELEMENT_NODE) {
|
|
62
|
+
(clone as HTMLElement).setAttribute('slot', 'obj-content');
|
|
63
|
+
} else if (clone.nodeType === Node.TEXT_NODE) {
|
|
64
|
+
if (clone.textContent?.trim().length === 0) return;
|
|
65
|
+
const span = document.createElement('span');
|
|
66
|
+
span.setAttribute('slot', 'obj-content');
|
|
67
|
+
span.appendChild(clone);
|
|
68
|
+
this.appendChild(span);
|
|
69
|
+
this._renderedNodes.push(span);
|
|
70
|
+
this.applyData(span, this._value);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this.appendChild(clone);
|
|
74
|
+
this._renderedNodes.push(clone);
|
|
75
|
+
this.applyData(clone, this._value);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
package/src/elements/SwcOther.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementDefine, template, style } from '../index';
|
|
2
2
|
|
|
3
|
-
@
|
|
3
|
+
@elementDefine({ tagName: 'swc-other', useShadow: true })
|
|
4
4
|
export class SwcOther extends HTMLElement {
|
|
5
5
|
@style
|
|
6
6
|
styles() {
|
package/src/elements/SwcWhen.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { elementDefine, template, style } from '../index';
|
|
2
2
|
|
|
3
|
-
@
|
|
3
|
+
@elementDefine({ tagName: 'swc-when', useShadow: true })
|
|
4
4
|
export class SwcWhen extends HTMLElement {
|
|
5
5
|
@style
|
|
6
6
|
styles() {
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './decorators/
|
|
1
|
+
export * from './decorators/elementDefine';
|
|
2
2
|
export * from './decorators/template';
|
|
3
3
|
export * from './decorators/style';
|
|
4
4
|
export * from './decorators/attributeChanged';
|
|
@@ -10,3 +10,5 @@ export * from './elements/SwcIf';
|
|
|
10
10
|
export * from './elements/SwcChoose';
|
|
11
11
|
export * from './elements/SwcWhen';
|
|
12
12
|
export * from './elements/SwcOther';
|
|
13
|
+
export * from './elements/SwcObject';
|
|
14
|
+
export * from './elements/SwcHTMLElementBase';
|