@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.
Files changed (69) hide show
  1. package/README.md +28 -33
  2. package/dist/cjs/decorators/{elementDefind.js → elementDefine.js} +6 -6
  3. package/dist/cjs/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
  4. package/dist/cjs/decorators/query.js.map +1 -1
  5. package/dist/cjs/decorators/queryAll.js.map +1 -1
  6. package/dist/cjs/elements/SwcChoose.js +1 -1
  7. package/dist/cjs/elements/SwcChoose.js.map +1 -1
  8. package/dist/cjs/elements/SwcForOf.js +7 -77
  9. package/dist/cjs/elements/SwcForOf.js.map +2 -2
  10. package/dist/cjs/elements/SwcHTMLElementBase.js +102 -0
  11. package/dist/cjs/elements/SwcHTMLElementBase.js.map +7 -0
  12. package/dist/cjs/elements/SwcIf.js +6 -14
  13. package/dist/cjs/elements/SwcIf.js.map +2 -2
  14. package/dist/cjs/elements/SwcObject.js +115 -0
  15. package/dist/cjs/elements/SwcObject.js.map +7 -0
  16. package/dist/cjs/elements/SwcOther.js +1 -1
  17. package/dist/cjs/elements/SwcOther.js.map +1 -1
  18. package/dist/cjs/elements/SwcWhen.js +1 -1
  19. package/dist/cjs/elements/SwcWhen.js.map +1 -1
  20. package/dist/cjs/index.js +3 -1
  21. package/dist/cjs/index.js.map +2 -2
  22. package/dist/esm/decorators/{elementDefind.js → elementDefine.js} +3 -3
  23. package/dist/esm/decorators/{elementDefind.js.map → elementDefine.js.map} +2 -2
  24. package/dist/esm/decorators/query.js.map +1 -1
  25. package/dist/esm/decorators/queryAll.js.map +1 -1
  26. package/dist/esm/elements/SwcChoose.js +2 -2
  27. package/dist/esm/elements/SwcChoose.js.map +1 -1
  28. package/dist/esm/elements/SwcForOf.js +8 -78
  29. package/dist/esm/elements/SwcForOf.js.map +2 -2
  30. package/dist/esm/elements/SwcHTMLElementBase.js +83 -0
  31. package/dist/esm/elements/SwcHTMLElementBase.js.map +7 -0
  32. package/dist/esm/elements/SwcIf.js +7 -15
  33. package/dist/esm/elements/SwcIf.js.map +2 -2
  34. package/dist/esm/elements/SwcObject.js +96 -0
  35. package/dist/esm/elements/SwcObject.js.map +7 -0
  36. package/dist/esm/elements/SwcOther.js +2 -2
  37. package/dist/esm/elements/SwcOther.js.map +1 -1
  38. package/dist/esm/elements/SwcWhen.js +2 -2
  39. package/dist/esm/elements/SwcWhen.js.map +1 -1
  40. package/dist/esm/index.js +3 -1
  41. package/dist/esm/index.js.map +2 -2
  42. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +192 -97
  43. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  44. package/dist/types/decorators/{elementDefind.d.ts → elementDefine.d.ts} +2 -2
  45. package/dist/types/decorators/{elementDefind.d.ts.map → elementDefine.d.ts.map} +1 -1
  46. package/dist/types/elements/SwcForOf.d.ts +2 -4
  47. package/dist/types/elements/SwcForOf.d.ts.map +1 -1
  48. package/dist/types/elements/SwcHTMLElementBase.d.ts +14 -0
  49. package/dist/types/elements/SwcHTMLElementBase.d.ts.map +1 -0
  50. package/dist/types/elements/SwcIf.d.ts +2 -2
  51. package/dist/types/elements/SwcIf.d.ts.map +1 -1
  52. package/dist/types/elements/SwcObject.d.ts +14 -0
  53. package/dist/types/elements/SwcObject.d.ts.map +1 -0
  54. package/dist/types/index.d.ts +3 -1
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +192 -97
  57. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  58. package/package.json +1 -1
  59. package/src/decorators/{elementDefind.ts → elementDefine.ts} +1 -1
  60. package/src/decorators/query.ts +1 -1
  61. package/src/decorators/queryAll.ts +1 -1
  62. package/src/elements/SwcChoose.ts +2 -2
  63. package/src/elements/SwcForOf.ts +12 -87
  64. package/src/elements/SwcHTMLElementBase.ts +93 -0
  65. package/src/elements/SwcIf.ts +8 -27
  66. package/src/elements/SwcObject.ts +78 -0
  67. package/src/elements/SwcOther.ts +2 -2
  68. package/src/elements/SwcWhen.ts +2 -2
  69. package/src/index.ts +3 -1
@@ -1,9 +1,9 @@
1
- import { elementDefind, template, style } from '../index';
1
+ import { elementDefine, template, style } from '../index';
2
+ import { SwcHTMLElementBase } from './SwcHTMLElementBase';
2
3
 
3
- @elementDefind({ tagName: 'swc-if', useShadow: true })
4
- export class SwcIf extends HTMLElement {
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
- const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;
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
+ }
@@ -1,6 +1,6 @@
1
- import { elementDefind, template, style } from '../index';
1
+ import { elementDefine, template, style } from '../index';
2
2
 
3
- @elementDefind({ tagName: 'swc-other', useShadow: true })
3
+ @elementDefine({ tagName: 'swc-other', useShadow: true })
4
4
  export class SwcOther extends HTMLElement {
5
5
  @style
6
6
  styles() {
@@ -1,6 +1,6 @@
1
- import { elementDefind, template, style } from '../index';
1
+ import { elementDefine, template, style } from '../index';
2
2
 
3
- @elementDefind({ tagName: 'swc-when', useShadow: true })
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/elementDefind';
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';