@dooboostore/simple-web-component 1.0.0 → 1.0.1

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 (86) hide show
  1. package/README.md +67 -70
  2. package/dist/cjs/decorators/addEventListener.js +42 -0
  3. package/dist/cjs/decorators/addEventListener.js.map +7 -0
  4. package/dist/cjs/decorators/attributeChanged.js +24 -4
  5. package/dist/cjs/decorators/attributeChanged.js.map +2 -2
  6. package/dist/cjs/decorators/{element.js → elementDefind.js} +91 -13
  7. package/dist/cjs/decorators/elementDefind.js.map +7 -0
  8. package/dist/cjs/decorators/query.js +53 -0
  9. package/dist/cjs/decorators/query.js.map +7 -0
  10. package/dist/cjs/decorators/queryAll.js +53 -0
  11. package/dist/cjs/decorators/queryAll.js.map +7 -0
  12. package/dist/cjs/elements/SwcChoose.js +117 -0
  13. package/dist/cjs/elements/SwcChoose.js.map +7 -0
  14. package/dist/cjs/elements/SwcForOf.js +196 -0
  15. package/dist/cjs/elements/SwcForOf.js.map +7 -0
  16. package/dist/cjs/elements/SwcIf.js +135 -0
  17. package/dist/cjs/elements/SwcIf.js.map +7 -0
  18. package/dist/cjs/elements/SwcOther.js +56 -0
  19. package/dist/cjs/elements/SwcOther.js.map +7 -0
  20. package/dist/cjs/elements/SwcWhen.js +56 -0
  21. package/dist/cjs/elements/SwcWhen.js.map +7 -0
  22. package/dist/cjs/index.js +9 -1
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/esm/decorators/addEventListener.js +23 -0
  25. package/dist/esm/decorators/addEventListener.js.map +7 -0
  26. package/dist/esm/decorators/attributeChanged.js +24 -4
  27. package/dist/esm/decorators/attributeChanged.js.map +2 -2
  28. package/dist/esm/decorators/{element.js → elementDefind.js} +89 -11
  29. package/dist/esm/decorators/elementDefind.js.map +7 -0
  30. package/dist/esm/decorators/query.js +34 -0
  31. package/dist/esm/decorators/query.js.map +7 -0
  32. package/dist/esm/decorators/queryAll.js +34 -0
  33. package/dist/esm/decorators/queryAll.js.map +7 -0
  34. package/dist/esm/elements/SwcChoose.js +98 -0
  35. package/dist/esm/elements/SwcChoose.js.map +7 -0
  36. package/dist/esm/elements/SwcForOf.js +177 -0
  37. package/dist/esm/elements/SwcForOf.js.map +7 -0
  38. package/dist/esm/elements/SwcIf.js +116 -0
  39. package/dist/esm/elements/SwcIf.js.map +7 -0
  40. package/dist/esm/elements/SwcOther.js +37 -0
  41. package/dist/esm/elements/SwcOther.js.map +7 -0
  42. package/dist/esm/elements/SwcWhen.js +37 -0
  43. package/dist/esm/elements/SwcWhen.js.map +7 -0
  44. package/dist/esm/index.js +9 -1
  45. package/dist/esm/index.js.map +2 -2
  46. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +649 -14
  47. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  48. package/dist/types/decorators/addEventListener.d.ts +16 -0
  49. package/dist/types/decorators/addEventListener.d.ts.map +1 -0
  50. package/dist/types/decorators/attributeChanged.d.ts +3 -1
  51. package/dist/types/decorators/attributeChanged.d.ts.map +1 -1
  52. package/dist/types/decorators/{element.d.ts → elementDefind.d.ts} +2 -2
  53. package/dist/types/decorators/elementDefind.d.ts.map +1 -0
  54. package/dist/types/decorators/query.d.ts +13 -0
  55. package/dist/types/decorators/query.d.ts.map +1 -0
  56. package/dist/types/decorators/queryAll.d.ts +13 -0
  57. package/dist/types/decorators/queryAll.d.ts.map +1 -0
  58. package/dist/types/elements/SwcChoose.d.ts +12 -0
  59. package/dist/types/elements/SwcChoose.d.ts.map +1 -0
  60. package/dist/types/elements/SwcForOf.d.ts +16 -0
  61. package/dist/types/elements/SwcForOf.d.ts.map +1 -0
  62. package/dist/types/elements/SwcIf.d.ts +14 -0
  63. package/dist/types/elements/SwcIf.d.ts.map +1 -0
  64. package/dist/types/elements/SwcOther.d.ts +5 -0
  65. package/dist/types/elements/SwcOther.d.ts.map +1 -0
  66. package/dist/types/elements/SwcWhen.d.ts +5 -0
  67. package/dist/types/elements/SwcWhen.d.ts.map +1 -0
  68. package/dist/types/index.d.ts +9 -1
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +649 -14
  71. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  72. package/package.json +1 -1
  73. package/src/decorators/addEventListener.ts +35 -0
  74. package/src/decorators/attributeChanged.ts +29 -6
  75. package/src/decorators/{element.ts → elementDefind.ts} +121 -11
  76. package/src/decorators/query.ts +46 -0
  77. package/src/decorators/queryAll.ts +46 -0
  78. package/src/elements/SwcChoose.ts +83 -0
  79. package/src/elements/SwcForOf.ts +170 -0
  80. package/src/elements/SwcIf.ts +111 -0
  81. package/src/elements/SwcOther.ts +14 -0
  82. package/src/elements/SwcWhen.ts +14 -0
  83. package/src/index.ts +10 -2
  84. package/dist/cjs/decorators/element.js.map +0 -7
  85. package/dist/esm/decorators/element.js.map +0 -7
  86. package/dist/types/decorators/element.d.ts.map +0 -1
@@ -0,0 +1,177 @@
1
+ var __decorate = function(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = function(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { elementDefind, template, style } from "../index.js";
11
+ let SwcForOf = class SwcForOf2 extends HTMLElement {
12
+ constructor() {
13
+ super();
14
+ this._value = [];
15
+ this._masterTplNodes = [];
16
+ }
17
+ set value(val) {
18
+ if (!Array.isArray(val))
19
+ val = [];
20
+ this._value = this.createProxy(val);
21
+ this.renderAll();
22
+ }
23
+ get value() {
24
+ return this._value;
25
+ }
26
+ createProxy(arr) {
27
+ return new Proxy(arr, {
28
+ set: (target, prop, val) => {
29
+ const isIndex = !isNaN(Number(prop));
30
+ target[prop] = val;
31
+ if (isIndex) {
32
+ this.updateSingleRow(Number(prop), val);
33
+ } else if (prop === "length" && val < target.length) {
34
+ this.renderAll();
35
+ }
36
+ return true;
37
+ },
38
+ deleteProperty: (target, prop) => {
39
+ const res = delete target[prop];
40
+ this.renderAll();
41
+ return res;
42
+ }
43
+ });
44
+ }
45
+ styles() {
46
+ return `
47
+ :host { display: contents; }
48
+ `;
49
+ }
50
+ renderTemplate() {
51
+ return `
52
+ <slot id="tpl-slot" style="display:none;"></slot>
53
+ `;
54
+ }
55
+ connectedCallback() {
56
+ const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
57
+ if (tplSlot) {
58
+ this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
59
+ }
60
+ this.renderAll();
61
+ }
62
+ updateSingleRow(index, newValue) {
63
+ const targets = this.querySelectorAll(`[slot="row-${index}"]`);
64
+ if (targets.length > 0) {
65
+ targets.forEach((target) => this.applyData(target, newValue, index));
66
+ } else {
67
+ this.renderRow(newValue, index);
68
+ }
69
+ }
70
+ applyData(node, data, index) {
71
+ const getValueByPath = (obj, path) => {
72
+ if (path === "value")
73
+ return obj;
74
+ if (path.startsWith("value.")) {
75
+ return path.split(".").slice(1).reduce((acc, part) => acc && acc[part], obj);
76
+ }
77
+ return void 0;
78
+ };
79
+ const walk = (n) => {
80
+ if (n.nodeType === Node.TEXT_NODE) {
81
+ if (!n._original)
82
+ n._original = n.textContent;
83
+ let text = n._original;
84
+ text = text.replace(/{{(.*?)}}/g, (match, path) => {
85
+ path = path.trim();
86
+ if (path === "index")
87
+ return index.toString();
88
+ const val = getValueByPath(data, path);
89
+ return val !== void 0 ? val : match;
90
+ });
91
+ if (n.textContent !== text)
92
+ n.textContent = text;
93
+ } else if (n.nodeType === Node.ELEMENT_NODE) {
94
+ const el = n;
95
+ Array.from(el.attributes).forEach((a) => {
96
+ if (!a._original)
97
+ a._original = a.value;
98
+ let val = a._original;
99
+ val = val.replace(/{{(.*?)}}/g, (match, path) => {
100
+ path = path.trim();
101
+ if (path === "index")
102
+ return index.toString();
103
+ const v = getValueByPath(data, path);
104
+ return v !== void 0 ? v : match;
105
+ });
106
+ if (a.value !== val)
107
+ a.value = val;
108
+ });
109
+ el.childNodes.forEach(walk);
110
+ }
111
+ };
112
+ walk(node);
113
+ }
114
+ renderRow(item, index) {
115
+ if (!this.shadowRoot || this._masterTplNodes.length === 0)
116
+ return;
117
+ const slotName = `row-${index}`;
118
+ if (!this.shadowRoot.querySelector(`slot[name="${slotName}"]`)) {
119
+ const slot = document.createElement("slot");
120
+ slot.name = slotName;
121
+ this.shadowRoot.appendChild(slot);
122
+ }
123
+ this._masterTplNodes.forEach((tplNode) => {
124
+ const clone = tplNode.cloneNode(true);
125
+ if (clone.nodeType === Node.ELEMENT_NODE) {
126
+ clone.setAttribute("slot", slotName);
127
+ clone.style.display = "";
128
+ } else if (clone.nodeType === Node.TEXT_NODE) {
129
+ if (clone.textContent?.trim().length === 0)
130
+ return;
131
+ const span = document.createElement("span");
132
+ span.setAttribute("slot", slotName);
133
+ span.appendChild(clone);
134
+ this.appendChild(span);
135
+ this.applyData(span, item, index);
136
+ return;
137
+ }
138
+ this.appendChild(clone);
139
+ this.applyData(clone, item, index);
140
+ });
141
+ }
142
+ renderAll() {
143
+ if (this._masterTplNodes.length === 0 || !this.shadowRoot)
144
+ return;
145
+ Array.from(this.children).forEach((c) => {
146
+ const slot = c.getAttribute("slot");
147
+ if (slot && slot.startsWith("row-")) {
148
+ c.remove();
149
+ }
150
+ });
151
+ Array.from(this.shadowRoot.querySelectorAll("slot")).forEach((s) => {
152
+ if (s.id !== "tpl-slot")
153
+ s.remove();
154
+ });
155
+ this._value.forEach((item, index) => this.renderRow(item, index));
156
+ }
157
+ };
158
+ __decorate([
159
+ style,
160
+ __metadata("design:type", Function),
161
+ __metadata("design:paramtypes", []),
162
+ __metadata("design:returntype", void 0)
163
+ ], SwcForOf.prototype, "styles", null);
164
+ __decorate([
165
+ template,
166
+ __metadata("design:type", Function),
167
+ __metadata("design:paramtypes", []),
168
+ __metadata("design:returntype", void 0)
169
+ ], SwcForOf.prototype, "renderTemplate", null);
170
+ SwcForOf = __decorate([
171
+ elementDefind({ tagName: "swc-for-of", useShadow: true }),
172
+ __metadata("design:paramtypes", [])
173
+ ], SwcForOf);
174
+ export {
175
+ SwcForOf
176
+ };
177
+ //# sourceMappingURL=SwcForOf.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/elements/SwcForOf.ts"],
4
+ "sourcesContent": ["import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-for-of', useShadow: true })\nexport class SwcForOf extends HTMLElement {\n private _value: any[] = [];\n private _masterTplNodes: Node[] = [];\n\n constructor() {\n super();\n }\n\n set value(val: any[]) {\n if (!Array.isArray(val)) val = [];\n this._value = this.createProxy(val);\n this.renderAll();\n }\n\n get value(): any[] {\n return this._value;\n }\n\n private createProxy(arr: any[]) {\n return new Proxy(arr, {\n set: (target, prop, val) => {\n const isIndex = !isNaN(Number(prop));\n target[prop as any] = val;\n\n if (isIndex) {\n this.updateSingleRow(Number(prop), val);\n } else if (prop === 'length' && val < target.length) {\n this.renderAll();\n }\n return true;\n },\n deleteProperty: (target, prop) => {\n const res = delete target[prop as any];\n this.renderAll();\n return res;\n }\n });\n }\n\n @style\n styles() {\n // display: contents를 통해 swc-for-of 태그 자체를 레이아웃에서 투명하게 만듭니다.\n return `\n :host { display: contents; }\n `;\n }\n\n @template\n renderTemplate() {\n // 감싸는 div 없이 tpl-slot만 둡니다.\n return `\n <slot id=\"tpl-slot\" style=\"display:none;\"></slot>\n `;\n }\n\n connectedCallback() {\n const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;\n if (tplSlot) {\n this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));\n }\n this.renderAll();\n }\n\n public updateSingleRow(index: number, newValue: any) {\n const targets = this.querySelectorAll(`[slot=\"row-${index}\"]`);\n if (targets.length > 0) {\n targets.forEach(target => this.applyData(target, newValue, index));\n } else {\n this.renderRow(newValue, index);\n }\n }\n\n private applyData(node: Node, data: any, index: number) {\n const getValueByPath = (obj: any, path: string) => {\n if (path === 'value') return obj;\n if (path.startsWith('value.')) {\n return path\n .split('.')\n .slice(1)\n .reduce((acc, part) => acc && acc[part], obj);\n }\n return undefined;\n };\n\n const walk = (n: Node) => {\n if (n.nodeType === Node.TEXT_NODE) {\n if (!(n as any)._original) (n as any)._original = n.textContent;\n let text = (n as any)._original;\n\n text = text.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (path === 'index') return index.toString();\n const val = getValueByPath(data, path);\n return val !== undefined ? val : match;\n });\n if (n.textContent !== text) n.textContent = text;\n } else if (n.nodeType === Node.ELEMENT_NODE) {\n const el = n as Element;\n Array.from(el.attributes).forEach(a => {\n if (!(a as any)._original) (a as any)._original = a.value;\n let val = (a as any)._original;\n\n val = val.replace(/{{(.*?)}}/g, (match: string, path: string) => {\n path = path.trim();\n if (path === 'index') return index.toString();\n const v = getValueByPath(data, path);\n return v !== undefined ? v : match;\n });\n if (a.value !== val) a.value = val;\n });\n\n // 중요: swc-choose 같은 커스텀 엘리먼트 내부의 자식들도 템플릿 치환이 필요함\n el.childNodes.forEach(walk);\n }\n };\n walk(node);\n }\n\n private renderRow(item: any, index: number) {\n if (!this.shadowRoot || this._masterTplNodes.length === 0) return;\n\n const slotName = `row-${index}`;\n // Shadow Root에 직접 슬롯 추가\n if (!this.shadowRoot.querySelector(`slot[name=\"${slotName}\"]`)) {\n const slot = document.createElement('slot');\n slot.name = slotName;\n this.shadowRoot.appendChild(slot);\n }\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', slotName);\n (clone as HTMLElement).style.display = '';\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', slotName);\n span.appendChild(clone);\n this.appendChild(span);\n this.applyData(span, item, index);\n return;\n }\n this.appendChild(clone);\n this.applyData(clone, item, index);\n });\n }\n\n private renderAll() {\n if (this._masterTplNodes.length === 0 || !this.shadowRoot) return;\n\n // 기존 데이터 노드 삭제\n Array.from(this.children).forEach(c => {\n const slot = c.getAttribute('slot');\n if (slot && slot.startsWith('row-')) {\n c.remove();\n }\n });\n\n // Shadow Root의 기존 슬롯들 삭제 (tpl-slot 제외)\n Array.from(this.shadowRoot.querySelectorAll('slot')).forEach(s => {\n if (s.id !== 'tpl-slot') s.remove();\n });\n\n this._value.forEach((item, index) => this.renderRow(item, index));\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;AAAA,SAAS,eAAe,UAAU,aAAa;AAGxC,IAAM,WAAN,MAAMA,kBAAiB,YAAW;EAIvC,cAAA;AACE,UAAK;AAJC,SAAA,SAAgB,CAAA;AAChB,SAAA,kBAA0B,CAAA;EAIlC;EAEA,IAAI,MAAM,KAAU;AAClB,QAAI,CAAC,MAAM,QAAQ,GAAG;AAAG,YAAM,CAAA;AAC/B,SAAK,SAAS,KAAK,YAAY,GAAG;AAClC,SAAK,UAAS;EAChB;EAEA,IAAI,QAAK;AACP,WAAO,KAAK;EACd;EAEQ,YAAY,KAAU;AAC5B,WAAO,IAAI,MAAM,KAAK;MACpB,KAAK,CAAC,QAAQ,MAAM,QAAO;AACzB,cAAM,UAAU,CAAC,MAAM,OAAO,IAAI,CAAC;AACnC,eAAO,IAAW,IAAI;AAEtB,YAAI,SAAS;AACX,eAAK,gBAAgB,OAAO,IAAI,GAAG,GAAG;QACxC,WAAW,SAAS,YAAY,MAAM,OAAO,QAAQ;AACnD,eAAK,UAAS;QAChB;AACA,eAAO;MACT;MACA,gBAAgB,CAAC,QAAQ,SAAQ;AAC/B,cAAM,MAAM,OAAO,OAAO,IAAW;AACrC,aAAK,UAAS;AACd,eAAO;MACT;KACD;EACH;EAGA,SAAM;AAEJ,WAAO;;;EAGT;EAGA,iBAAc;AAEZ,WAAO;;;EAGT;EAEA,oBAAiB;AACf,UAAM,UAAU,KAAK,YAAY,eAAe,UAAU;AAC1D,QAAI,SAAS;AACX,WAAK,kBAAkB,QAAQ,cAAa,EAAG,IAAI,OAAK,EAAE,UAAU,IAAI,CAAC;IAC3E;AACA,SAAK,UAAS;EAChB;EAEO,gBAAgB,OAAe,UAAa;AACjD,UAAM,UAAU,KAAK,iBAAiB,cAAc,KAAK,IAAI;AAC7D,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,QAAQ,YAAU,KAAK,UAAU,QAAQ,UAAU,KAAK,CAAC;IACnE,OAAO;AACL,WAAK,UAAU,UAAU,KAAK;IAChC;EACF;EAEQ,UAAU,MAAY,MAAW,OAAa;AACpD,UAAM,iBAAiB,CAAC,KAAU,SAAgB;AAChD,UAAI,SAAS;AAAS,eAAO;AAC7B,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,eAAO,KACJ,MAAM,GAAG,EACT,MAAM,CAAC,EACP,OAAO,CAAC,KAAK,SAAS,OAAO,IAAI,IAAI,GAAG,GAAG;MAChD;AACA,aAAO;IACT;AAEA,UAAM,OAAO,CAAC,MAAW;AACvB,UAAI,EAAE,aAAa,KAAK,WAAW;AACjC,YAAI,CAAE,EAAU;AAAY,YAAU,YAAY,EAAE;AACpD,YAAI,OAAQ,EAAU;AAEtB,eAAO,KAAK,QAAQ,cAAc,CAAC,OAAe,SAAgB;AAChE,iBAAO,KAAK,KAAI;AAChB,cAAI,SAAS;AAAS,mBAAO,MAAM,SAAQ;AAC3C,gBAAM,MAAM,eAAe,MAAM,IAAI;AACrC,iBAAO,QAAQ,SAAY,MAAM;QACnC,CAAC;AACD,YAAI,EAAE,gBAAgB;AAAM,YAAE,cAAc;MAC9C,WAAW,EAAE,aAAa,KAAK,cAAc;AAC3C,cAAM,KAAK;AACX,cAAM,KAAK,GAAG,UAAU,EAAE,QAAQ,OAAI;AACpC,cAAI,CAAE,EAAU;AAAY,cAAU,YAAY,EAAE;AACpD,cAAI,MAAO,EAAU;AAErB,gBAAM,IAAI,QAAQ,cAAc,CAAC,OAAe,SAAgB;AAC9D,mBAAO,KAAK,KAAI;AAChB,gBAAI,SAAS;AAAS,qBAAO,MAAM,SAAQ;AAC3C,kBAAM,IAAI,eAAe,MAAM,IAAI;AACnC,mBAAO,MAAM,SAAY,IAAI;UAC/B,CAAC;AACD,cAAI,EAAE,UAAU;AAAK,cAAE,QAAQ;QACjC,CAAC;AAGD,WAAG,WAAW,QAAQ,IAAI;MAC5B;IACF;AACA,SAAK,IAAI;EACX;EAEQ,UAAU,MAAW,OAAa;AACxC,QAAI,CAAC,KAAK,cAAc,KAAK,gBAAgB,WAAW;AAAG;AAE3D,UAAM,WAAW,OAAO,KAAK;AAE7B,QAAI,CAAC,KAAK,WAAW,cAAc,cAAc,QAAQ,IAAI,GAAG;AAC9D,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,OAAO;AACZ,WAAK,WAAW,YAAY,IAAI;IAClC;AAEA,SAAK,gBAAgB,QAAQ,aAAU;AACrC,YAAM,QAAQ,QAAQ,UAAU,IAAI;AACpC,UAAI,MAAM,aAAa,KAAK,cAAc;AACvC,cAAsB,aAAa,QAAQ,QAAQ;AACnD,cAAsB,MAAM,UAAU;MACzC,WAAW,MAAM,aAAa,KAAK,WAAW;AAC5C,YAAI,MAAM,aAAa,KAAI,EAAG,WAAW;AAAG;AAC5C,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,aAAa,QAAQ,QAAQ;AAClC,aAAK,YAAY,KAAK;AACtB,aAAK,YAAY,IAAI;AACrB,aAAK,UAAU,MAAM,MAAM,KAAK;AAChC;MACF;AACA,WAAK,YAAY,KAAK;AACtB,WAAK,UAAU,OAAO,MAAM,KAAK;IACnC,CAAC;EACH;EAEQ,YAAS;AACf,QAAI,KAAK,gBAAgB,WAAW,KAAK,CAAC,KAAK;AAAY;AAG3D,UAAM,KAAK,KAAK,QAAQ,EAAE,QAAQ,OAAI;AACpC,YAAM,OAAO,EAAE,aAAa,MAAM;AAClC,UAAI,QAAQ,KAAK,WAAW,MAAM,GAAG;AACnC,UAAE,OAAM;MACV;IACF,CAAC;AAGD,UAAM,KAAK,KAAK,WAAW,iBAAiB,MAAM,CAAC,EAAE,QAAQ,OAAI;AAC/D,UAAI,EAAE,OAAO;AAAY,UAAE,OAAM;IACnC,CAAC;AAED,SAAK,OAAO,QAAQ,CAAC,MAAM,UAAU,KAAK,UAAU,MAAM,KAAK,CAAC;EAClE;;AA7HA,WAAA;EADC;;;;;AASD,WAAA;EADC;;;;;AA/CU,WAAQ,WAAA;EADpB,cAAc,EAAE,SAAS,cAAc,WAAW,KAAI,CAAE;;GAC5C,QAAQ;",
6
+ "names": ["SwcForOf"]
7
+ }
@@ -0,0 +1,116 @@
1
+ var __decorate = function(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = function(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { elementDefind, template, style } from "../index.js";
11
+ let SwcIf = class SwcIf2 extends HTMLElement {
12
+ constructor() {
13
+ super();
14
+ this._value = false;
15
+ this._masterTplNodes = [];
16
+ this._observer = null;
17
+ }
18
+ set value(val) {
19
+ this._value = val;
20
+ this.render();
21
+ }
22
+ get value() {
23
+ return this._value;
24
+ }
25
+ styles() {
26
+ return `
27
+ :host { display: contents; }
28
+ `;
29
+ }
30
+ renderTemplate() {
31
+ return `
32
+ <slot id="tpl-slot" style="display:none;"></slot>
33
+ `;
34
+ }
35
+ connectedCallback() {
36
+ const tplSlot = this.shadowRoot?.getElementById("tpl-slot");
37
+ if (tplSlot) {
38
+ this._masterTplNodes = tplSlot.assignedNodes().map((n) => n.cloneNode(true));
39
+ }
40
+ this._observer = new MutationObserver(() => this.render());
41
+ this._observer.observe(this, { attributes: true });
42
+ this.render();
43
+ }
44
+ disconnectedCallback() {
45
+ this._observer?.disconnect();
46
+ }
47
+ render() {
48
+ if (!this.shadowRoot)
49
+ return;
50
+ const attrValue = this.getAttribute("value");
51
+ if (attrValue !== null && attrValue.includes("{{"))
52
+ return;
53
+ let displayValue = attrValue !== null ? attrValue : this._value;
54
+ let isTruthy = !!displayValue;
55
+ if (typeof displayValue === "string") {
56
+ if (displayValue === "false" || displayValue === "0" || displayValue === "")
57
+ isTruthy = false;
58
+ else {
59
+ try {
60
+ isTruthy = !!new Function(`return ${displayValue}`)();
61
+ } catch (e) {
62
+ isTruthy = true;
63
+ }
64
+ }
65
+ }
66
+ Array.from(this.children).forEach((c) => {
67
+ if (c.getAttribute("slot") === "if-content") {
68
+ c.remove();
69
+ }
70
+ });
71
+ const existingSlot = this.shadowRoot.querySelector('slot[name="if-content"]');
72
+ if (existingSlot)
73
+ existingSlot.remove();
74
+ if (isTruthy && this._masterTplNodes.length > 0) {
75
+ const contentSlot = document.createElement("slot");
76
+ contentSlot.name = "if-content";
77
+ this.shadowRoot.appendChild(contentSlot);
78
+ this._masterTplNodes.forEach((tplNode) => {
79
+ const clone = tplNode.cloneNode(true);
80
+ if (clone.nodeType === Node.ELEMENT_NODE) {
81
+ clone.setAttribute("slot", "if-content");
82
+ clone.style.display = "";
83
+ } else if (clone.nodeType === Node.TEXT_NODE) {
84
+ if (clone.textContent?.trim().length === 0)
85
+ return;
86
+ const span = document.createElement("span");
87
+ span.setAttribute("slot", "if-content");
88
+ span.appendChild(clone);
89
+ this.appendChild(span);
90
+ return;
91
+ }
92
+ this.appendChild(clone);
93
+ });
94
+ }
95
+ }
96
+ };
97
+ __decorate([
98
+ style,
99
+ __metadata("design:type", Function),
100
+ __metadata("design:paramtypes", []),
101
+ __metadata("design:returntype", void 0)
102
+ ], SwcIf.prototype, "styles", null);
103
+ __decorate([
104
+ template,
105
+ __metadata("design:type", Function),
106
+ __metadata("design:paramtypes", []),
107
+ __metadata("design:returntype", void 0)
108
+ ], SwcIf.prototype, "renderTemplate", null);
109
+ SwcIf = __decorate([
110
+ elementDefind({ tagName: "swc-if", useShadow: true }),
111
+ __metadata("design:paramtypes", [])
112
+ ], SwcIf);
113
+ export {
114
+ SwcIf
115
+ };
116
+ //# sourceMappingURL=SwcIf.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/elements/SwcIf.ts"],
4
+ "sourcesContent": ["import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-if', useShadow: true })\nexport class SwcIf extends HTMLElement {\n private _value: any = false;\n private _masterTplNodes: Node[] = [];\n private _observer: MutationObserver | null = null;\n\n constructor() {\n super();\n }\n\n set value(val: any) {\n this._value = val;\n this.render();\n }\n\n get value(): any {\n return this._value;\n }\n\n @style\n styles() {\n return `\n :host { display: contents; }\n `;\n }\n\n @template\n renderTemplate() {\n return `\n <slot id=\"tpl-slot\" style=\"display:none;\"></slot>\n `;\n }\n\n connectedCallback() {\n const tplSlot = this.shadowRoot?.getElementById('tpl-slot') as HTMLSlotElement;\n if (tplSlot) {\n // 초기 자식들을 템플릿으로 보관\n this._masterTplNodes = tplSlot.assignedNodes().map(n => n.cloneNode(true));\n }\n\n this._observer = new MutationObserver(() => this.render());\n this._observer.observe(this, { attributes: true });\n\n this.render();\n }\n\n disconnectedCallback() {\n this._observer?.disconnect();\n }\n\n private render() {\n if (!this.shadowRoot) return;\n\n const attrValue = this.getAttribute('value');\n if (attrValue !== null && attrValue.includes('{{')) return; // 치환 전이면 대기\n\n // 로직 결정: attribute가 있으면 우선, 없으면 property 사용\n let displayValue = attrValue !== null ? attrValue : this._value;\n\n // \"false\", \"null\", \"undefined\" 문자열 처리 및 기본 truthy 체크\n let isTruthy = !!displayValue;\n if (typeof displayValue === 'string') {\n if (displayValue === 'false' || displayValue === '0' || displayValue === '') isTruthy = false;\n else {\n // 식인 경우 평가 시도 (예: \"10 > 5\")\n try {\n isTruthy = !!new Function(`return ${displayValue}`)();\n } catch (e) {\n // 단순 문자열이면 true로 간주\n isTruthy = true;\n }\n }\n }\n\n // 1. 기존에 렌더링된 노드들 삭제\n Array.from(this.children).forEach(c => {\n if (c.getAttribute('slot') === 'if-content') {\n c.remove();\n }\n });\n\n // 2. Shadow DOM의 컨텐츠 슬롯 삭제\n const existingSlot = this.shadowRoot.querySelector('slot[name=\"if-content\"]');\n if (existingSlot) existingSlot.remove();\n\n // 3. 조건이 참일 때만 노드들을 복제해서 삽입\n if (isTruthy && this._masterTplNodes.length > 0) {\n const contentSlot = document.createElement('slot');\n contentSlot.name = 'if-content';\n this.shadowRoot.appendChild(contentSlot);\n\n this._masterTplNodes.forEach(tplNode => {\n const clone = tplNode.cloneNode(true);\n if (clone.nodeType === Node.ELEMENT_NODE) {\n (clone as HTMLElement).setAttribute('slot', 'if-content');\n (clone as HTMLElement).style.display = '';\n } else if (clone.nodeType === Node.TEXT_NODE) {\n if (clone.textContent?.trim().length === 0) return;\n const span = document.createElement('span');\n span.setAttribute('slot', 'if-content');\n span.appendChild(clone);\n this.appendChild(span);\n return;\n }\n this.appendChild(clone);\n });\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;AAAA,SAAS,eAAe,UAAU,aAAa;AAGxC,IAAM,QAAN,MAAMA,eAAc,YAAW;EAKpC,cAAA;AACE,UAAK;AALC,SAAA,SAAc;AACd,SAAA,kBAA0B,CAAA;AAC1B,SAAA,YAAqC;EAI7C;EAEA,IAAI,MAAM,KAAQ;AAChB,SAAK,SAAS;AACd,SAAK,OAAM;EACb;EAEA,IAAI,QAAK;AACP,WAAO,KAAK;EACd;EAGA,SAAM;AACJ,WAAO;;;EAGT;EAGA,iBAAc;AACZ,WAAO;;;EAGT;EAEA,oBAAiB;AACf,UAAM,UAAU,KAAK,YAAY,eAAe,UAAU;AAC1D,QAAI,SAAS;AAEX,WAAK,kBAAkB,QAAQ,cAAa,EAAG,IAAI,OAAK,EAAE,UAAU,IAAI,CAAC;IAC3E;AAEA,SAAK,YAAY,IAAI,iBAAiB,MAAM,KAAK,OAAM,CAAE;AACzD,SAAK,UAAU,QAAQ,MAAM,EAAE,YAAY,KAAI,CAAE;AAEjD,SAAK,OAAM;EACb;EAEA,uBAAoB;AAClB,SAAK,WAAW,WAAU;EAC5B;EAEQ,SAAM;AACZ,QAAI,CAAC,KAAK;AAAY;AAEtB,UAAM,YAAY,KAAK,aAAa,OAAO;AAC3C,QAAI,cAAc,QAAQ,UAAU,SAAS,IAAI;AAAG;AAGpD,QAAI,eAAe,cAAc,OAAO,YAAY,KAAK;AAGzD,QAAI,WAAW,CAAC,CAAC;AACjB,QAAI,OAAO,iBAAiB,UAAU;AACpC,UAAI,iBAAiB,WAAW,iBAAiB,OAAO,iBAAiB;AAAI,mBAAW;WACnF;AAEH,YAAI;AACF,qBAAW,CAAC,CAAC,IAAI,SAAS,UAAU,YAAY,EAAE,EAAC;QACrD,SAAS,GAAG;AAEV,qBAAW;QACb;MACF;IACF;AAGA,UAAM,KAAK,KAAK,QAAQ,EAAE,QAAQ,OAAI;AACpC,UAAI,EAAE,aAAa,MAAM,MAAM,cAAc;AAC3C,UAAE,OAAM;MACV;IACF,CAAC;AAGD,UAAM,eAAe,KAAK,WAAW,cAAc,yBAAyB;AAC5E,QAAI;AAAc,mBAAa,OAAM;AAGrC,QAAI,YAAY,KAAK,gBAAgB,SAAS,GAAG;AAC/C,YAAM,cAAc,SAAS,cAAc,MAAM;AACjD,kBAAY,OAAO;AACnB,WAAK,WAAW,YAAY,WAAW;AAEvC,WAAK,gBAAgB,QAAQ,aAAU;AACrC,cAAM,QAAQ,QAAQ,UAAU,IAAI;AACpC,YAAI,MAAM,aAAa,KAAK,cAAc;AACvC,gBAAsB,aAAa,QAAQ,YAAY;AACvD,gBAAsB,MAAM,UAAU;QACzC,WAAW,MAAM,aAAa,KAAK,WAAW;AAC5C,cAAI,MAAM,aAAa,KAAI,EAAG,WAAW;AAAG;AAC5C,gBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,eAAK,aAAa,QAAQ,YAAY;AACtC,eAAK,YAAY,KAAK;AACtB,eAAK,YAAY,IAAI;AACrB;QACF;AACA,aAAK,YAAY,KAAK;MACxB,CAAC;IACH;EACF;;AAvFA,WAAA;EADC;;;;;AAQD,WAAA;EADC;;;;;AAzBU,QAAK,WAAA;EADjB,cAAc,EAAE,SAAS,UAAU,WAAW,KAAI,CAAE;;GACxC,KAAK;",
6
+ "names": ["SwcIf"]
7
+ }
@@ -0,0 +1,37 @@
1
+ var __decorate = function(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = function(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { elementDefind, template, style } from "../index.js";
11
+ let SwcOther = class SwcOther2 extends HTMLElement {
12
+ styles() {
13
+ return `:host { display: contents; }`;
14
+ }
15
+ render() {
16
+ return `<slot></slot>`;
17
+ }
18
+ };
19
+ __decorate([
20
+ style,
21
+ __metadata("design:type", Function),
22
+ __metadata("design:paramtypes", []),
23
+ __metadata("design:returntype", void 0)
24
+ ], SwcOther.prototype, "styles", null);
25
+ __decorate([
26
+ template,
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", []),
29
+ __metadata("design:returntype", void 0)
30
+ ], SwcOther.prototype, "render", null);
31
+ SwcOther = __decorate([
32
+ elementDefind({ tagName: "swc-other", useShadow: true })
33
+ ], SwcOther);
34
+ export {
35
+ SwcOther
36
+ };
37
+ //# sourceMappingURL=SwcOther.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/elements/SwcOther.ts"],
4
+ "sourcesContent": ["import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-other', useShadow: true })\nexport class SwcOther extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;AAAA,SAAS,eAAe,UAAU,aAAa;AAGxC,IAAM,WAAN,MAAMA,kBAAiB,YAAW;EAEvC,SAAM;AACJ,WAAO;EACT;EAGA,SAAM;AACJ,WAAO;EACT;;AAPA,WAAA;EADC;;;;;AAMD,WAAA;EADC;;;;;AANU,WAAQ,WAAA;EADpB,cAAc,EAAE,SAAS,aAAa,WAAW,KAAI,CAAE;GAC3C,QAAQ;",
6
+ "names": ["SwcOther"]
7
+ }
@@ -0,0 +1,37 @@
1
+ var __decorate = function(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = function(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { elementDefind, template, style } from "../index.js";
11
+ let SwcWhen = class SwcWhen2 extends HTMLElement {
12
+ styles() {
13
+ return `:host { display: contents; }`;
14
+ }
15
+ render() {
16
+ return `<slot></slot>`;
17
+ }
18
+ };
19
+ __decorate([
20
+ style,
21
+ __metadata("design:type", Function),
22
+ __metadata("design:paramtypes", []),
23
+ __metadata("design:returntype", void 0)
24
+ ], SwcWhen.prototype, "styles", null);
25
+ __decorate([
26
+ template,
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", []),
29
+ __metadata("design:returntype", void 0)
30
+ ], SwcWhen.prototype, "render", null);
31
+ SwcWhen = __decorate([
32
+ elementDefind({ tagName: "swc-when", useShadow: true })
33
+ ], SwcWhen);
34
+ export {
35
+ SwcWhen
36
+ };
37
+ //# sourceMappingURL=SwcWhen.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/elements/SwcWhen.ts"],
4
+ "sourcesContent": ["import { elementDefind, template, style } from '../index';\n\n@elementDefind({ tagName: 'swc-when', useShadow: true })\nexport class SwcWhen extends HTMLElement {\n @style\n styles() {\n return `:host { display: contents; }`;\n }\n\n @template\n render() {\n return `<slot></slot>`;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;AAAA,SAAS,eAAe,UAAU,aAAa;AAGxC,IAAM,UAAN,MAAMA,iBAAgB,YAAW;EAEtC,SAAM;AACJ,WAAO;EACT;EAGA,SAAM;AACJ,WAAO;EACT;;AAPA,WAAA;EADC;;;;;AAMD,WAAA;EADC;;;;;AANU,UAAO,WAAA;EADnB,cAAc,EAAE,SAAS,YAAY,WAAW,KAAI,CAAE;GAC1C,OAAO;",
6
+ "names": ["SwcWhen"]
7
+ }
package/dist/esm/index.js CHANGED
@@ -1,5 +1,13 @@
1
- export * from "./decorators/element.js";
1
+ export * from "./decorators/elementDefind.js";
2
2
  export * from "./decorators/template.js";
3
3
  export * from "./decorators/style.js";
4
4
  export * from "./decorators/attributeChanged.js";
5
+ export * from "./decorators/query.js";
6
+ export * from "./decorators/queryAll.js";
7
+ export * from "./decorators/addEventListener.js";
8
+ export * from "./elements/SwcForOf.js";
9
+ export * from "./elements/SwcIf.js";
10
+ export * from "./elements/SwcChoose.js";
11
+ export * from "./elements/SwcWhen.js";
12
+ export * from "./elements/SwcOther.js";
5
13
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export * from './decorators/element';\nexport * from './decorators/template';\nexport * from './decorators/style';\nexport * from './decorators/attributeChanged';"],
5
- "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["export * from './decorators/elementDefind';\nexport * from './decorators/template';\nexport * from './decorators/style';\nexport * from './decorators/attributeChanged';\nexport * from './decorators/query';\nexport * from './decorators/queryAll';\nexport * from './decorators/addEventListener';\nexport * from './elements/SwcForOf';\nexport * from './elements/SwcIf';\nexport * from './elements/SwcChoose';\nexport * from './elements/SwcWhen';\nexport * from './elements/SwcOther';\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
6
  "names": []
7
7
  }