@ramstack/alpinegear-template 1.4.3 → 1.4.4

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 CHANGED
@@ -1,216 +1,182 @@
1
- # @ramstack/alpinegear-template
2
- [![NPM](https://img.shields.io/npm/v/@ramstack/alpinegear-template)](https://www.npmjs.com/package/@ramstack/alpinegear-template)
3
- [![MIT](https://img.shields.io/github/license/rameel/ramstack.alpinegear.js)](https://github.com/rameel/ramstack.alpinegear.js/blob/main/LICENSE)
4
-
5
- `@ramstack/alpinegear-template` is a plugin for [Alpine.js](https://alpinejs.dev/) that provides the `x-template` directive.
6
-
7
- This directive allows you to define a template once anywhere in the DOM and reference it by its ID.
8
-
9
- This helps avoid duplicating templates, simplifying markup and making it easier to manage.
10
-
11
- Moreover, it enables recursive templates, allowing you to create components like a **tree view** with ease,
12
- something that would otherwise be quite complex to implement.
13
-
14
- > [!Note]
15
- > This package is part of the **[`@ramstack/alpinegear-main`](https://www.npmjs.com/package/@ramstack/alpinegear-main)** bundle.
16
- > If you are using the main bundle, you don't need to install this package separately.
17
-
18
- ## Installation
19
-
20
- ### Using CDN
21
- To include the CDN version of this plugin, add the following `<script>` tag before the core `alpine.js` file:
22
-
23
- ```html
24
- <!-- alpine.js plugin -->
25
- <script src="https://cdn.jsdelivr.net/npm/@ramstack/alpinegear-template@1/alpinegear-template.min.js" defer></script>
26
-
27
- <!-- alpine.js -->
28
- <script src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js" defer></script>
29
- ```
30
-
31
- ### Using NPM
32
- Alternatively, you can install the plugin via `npm`:
33
-
34
- ```bash
35
- npm install --save @ramstack/alpinegear-template
36
- ```
37
-
38
- Then initialize it in your bundle:
39
-
40
- ```js
41
- import Alpine from "alpinejs";
42
- import template from "@ramstack/alpinegear-template";
43
-
44
- Alpine.plugin(template);
45
- Alpine.start();
46
- ```
47
-
48
- ## Usage
49
- Here's a simple example where the template definition is separated from the main markup:
50
-
51
- ```html
52
- <template id="columns-template">
53
- <td x-text="item.name"></td>
54
- <td x-text="item.description"></td>
55
- </template>
56
-
57
- <div x-data="{
58
- items: [
59
- { name: 'Star', description: 'Luminous plasma sphere.' },
60
- { name: 'Planet', description: 'Body orbiting a star.' },
61
- { name: 'Galaxy', description: 'Stars and dust system.' },
62
- { name: 'Nebula', description: 'Cloud of gas in space.' }
63
- ]}">
64
- <table>
65
- <template x-for="item in items" :key="item.text">
66
- <tr x-template="columns-template"></tr>
67
- </template>
68
- </table>
69
- </div>
70
- ```
71
- 🚀 [Live demo | Alpine.js x-template: External template](https://jsfiddle.net/rameel/20boy7rq/)
72
-
73
- In this example, the table column template is extracted into a separate template (`columns-template`),
74
- which is referenced inside the loop.
75
-
76
- Note that the template uses the data context available at the point where it's referenced,
77
- as if it was defined in place.
78
-
79
- > [!TIP]
80
- > You can use multiple root elements inside a given template.
81
-
82
- > [!IMPORTANT]
83
- > * Templates should be defined using the `<template>` tag with a unique ID.
84
- > * The `x-template` directive can only be applied to non-`<template>` elements.
85
-
86
- ### Recursive Template
87
-
88
- Since you can reference a template within itself by ID, it becomes easy to render **tree-like** structures -
89
- an otherwise challenging task.
90
-
91
- Here's an example of rendering a simple file tree using `<ul>` tags:
92
-
93
- ```html
94
- <template id="treeitem">
95
- <span x-text="model.name"></span>
96
-
97
- <template x-if="model.list">
98
- <ul>
99
- <template x-for="item in model.list">
100
- <!-- Recursively apply the current template to render nested items -->
101
- <li x-template="treeitem" x-data="{ model: item }"></li>
102
- </template>
103
- </ul>
104
- </template>
105
- </template>
106
-
107
- <ul x-data="json">
108
- <li x-template="treeitem"></li>
109
- </ul>
110
-
111
- <script>
112
- const json = {
113
- model: {
114
- name: 'root',
115
- list: [
116
- {
117
- name: 'Documents',
118
- list: [
119
- { name: 'Resume.docx' },
120
- { name: 'CoverLetter.docx' }
121
- ]
122
- },
123
- {
124
- name: 'Pictures',
125
- list: [
126
- {
127
- name: 'Nature',
128
- list: [
129
- { name: 'Mountains.jpg' },
130
- { name: 'River.jpg' }
131
- ]
132
- }
133
- ]
134
- }
135
- ]
136
- }
137
- };
138
- </script>
139
- ```
140
- 🚀 [Live demo | Alpine.js x-template: Recursive template (tree rendering)](https://jsfiddle.net/rameel/8envy4o7/)
141
-
142
- This will generate the following HTML structure:
143
-
144
- * root
145
- * Documents
146
- * Resume.docx
147
- * CoverLetter.docx
148
- * Pictures
149
- * Nature
150
- * Mountains.jpg
151
- * River.jpg
152
-
153
- As you can see, we are able to render nested elements by recursively referencing the same template within itself,
154
- which opens up a lot of possibilities for complex layouts.
155
-
156
- #### Interactive Tree with Recursive Template
157
-
158
- Explore another example showcasing a recursive `x-template` to render an interactive tree with expandable folders
159
- and dynamic child addition.
160
-
161
- 🚀 [Live demo | Alpine.js x-template: Interactive Tree](https://jsfiddle.net/rameel/xwavq1to/)
162
-
163
-
164
- ## Source code
165
- You can find the source code for this plugin on GitHub:
166
-
167
- https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/template
168
-
169
- ## Related projects
170
-
171
- **[@ramstack/alpinegear-main](https://www.npmjs.com/package/@ramstack/alpinegear-main)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/main))<br>
172
- Provides a combined plugin that includes several useful directives.
173
- This package aggregates multiple individual plugins, offering a convenient all-in-one bundle.
174
- Included directives: `x-bound`, `x-format`, `x-fragment`, `x-match`, `x-template`, and `x-when`.
175
-
176
- **[@ramstack/alpinegear-bound](https://www.npmjs.com/package/@ramstack/alpinegear-bound)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/bound))<br>
177
- Provides the `x-bound` directive, which allows for two-way binding of input elements and their associated data properties.
178
- It works similarly to the binding provided by [Svelte](https://svelte.dev/docs/element-directives#bind-property)
179
- and also supports synchronizing values between two `Alpine.js` data properties.
180
-
181
- **[@ramstack/alpinegear-format](https://www.npmjs.com/package/@ramstack/alpinegear-format)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/format))<br>
182
- Provides the `x-format` directive, which allows you to easily interpolate text using a template syntax similar to what's available in `Vue.js`.
183
-
184
- **[@ramstack/alpinegear-fragment](https://www.npmjs.com/package/@ramstack/alpinegear-fragment)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/fragment))<br>
185
- Provides the `x-fragment` directive, which allows for fragment-like behavior similar to what's available in frameworks
186
- like `Vue.js` or `React`, where multiple root elements can be grouped together.
187
-
188
- **[@ramstack/alpinegear-match](https://www.npmjs.com/package/@ramstack/alpinegear-match)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/match))<br>
189
- Provides the `x-match` directive, which functions similarly to the `switch` statement in many programming languages,
190
- allowing you to conditionally render elements based on matching cases.
191
-
192
- **[@ramstack/alpinegear-when](https://www.npmjs.com/package/@ramstack/alpinegear-when)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/when))<br>
193
- Provides the `x-when` directive, which allows for conditional rendering of elements similar to `x-if`, but supports multiple root elements.
194
-
195
- **[@ramstack/alpinegear-destroy](https://www.npmjs.com/package/@ramstack/alpinegear-destroy)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/destroy))<br>
196
- Provides the `x-destroy` directive, which is the opposite of `x-init` and allows you to hook into the cleanup phase
197
- of any element, running a callback when the element is removed from the DOM.
198
-
199
- **[@ramstack/alpinegear-hotkey](https://www.npmjs.com/package/@ramstack/alpinegear-hotkey)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/hotkey))<br>
200
- Provides the `x-hotkey` directive, which allows you to easily handle keyboard shortcuts within your Alpine.js components or application.
201
-
202
- **[@ramstack/alpinegear-router](https://www.npmjs.com/package/@ramstack/alpinegear-router)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/router))<br>
203
- Provides the `x-router` and `x-route` directives, which enable client-side navigation and routing functionality within your Alpine.js application.
204
-
205
- **[@ramstack/alpinegear-dialog](https://www.npmjs.com/package/@ramstack/alpinegear-dialog)** ([README](https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/dialog))<br>
206
- Provides a headless dialog directive for Alpine.js based on the native HTML `<dialog>` element.
207
- It supports declarative composition, value-based close semantics, and both modal and non-modal dialogs,
208
- with optional Promise-based imperative control.
209
-
210
-
211
- ## Contributions
212
- Bug reports and contributions are welcome.
213
-
214
- ## License
215
- This package is released as open source under the **MIT License**.
216
- See the [LICENSE](https://github.com/rameel/ramstack.alpinegear.js/blob/main/LICENSE) file for more details.
1
+ # @ramstack/alpinegear-template
2
+ [![NPM](https://img.shields.io/npm/v/@ramstack/alpinegear-template)](https://www.npmjs.com/package/@ramstack/alpinegear-template)
3
+ [![MIT](https://img.shields.io/github/license/rameel/ramstack.alpinegear.js)](https://github.com/rameel/ramstack.alpinegear.js/blob/main/LICENSE)
4
+
5
+ `@ramstack/alpinegear-template` is a plugin for [Alpine.js](https://alpinejs.dev/) that provides the `x-template` directive.
6
+
7
+ This directive allows you to define a template once anywhere in the DOM and reference it by its ID.
8
+
9
+ This helps avoid duplicating templates, simplifying markup and making it easier to manage.
10
+
11
+ Moreover, it enables recursive templates, allowing you to create components like a **tree view** with ease,
12
+ something that would otherwise be quite complex to implement.
13
+
14
+ > [!Note]
15
+ > This package is part of the **[`@ramstack/alpinegear-main`](https://www.npmjs.com/package/@ramstack/alpinegear-main)** bundle.
16
+ > If you are using the main bundle, you don't need to install this package separately.
17
+
18
+ ## Installation
19
+
20
+ ### Using CDN
21
+ To include the CDN version of this plugin, add the following `<script>` tag before the core `alpine.js` file:
22
+
23
+ ```html
24
+ <!-- alpine.js plugin -->
25
+ <script src="https://cdn.jsdelivr.net/npm/@ramstack/alpinegear-template@1/alpinegear-template.min.js" defer></script>
26
+
27
+ <!-- alpine.js -->
28
+ <script src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/cdn.min.js" defer></script>
29
+ ```
30
+
31
+ ### Using NPM
32
+ Alternatively, you can install the plugin via `npm`:
33
+
34
+ ```bash
35
+ npm install --save @ramstack/alpinegear-template
36
+ ```
37
+
38
+ Then initialize it in your bundle:
39
+
40
+ ```js
41
+ import Alpine from "alpinejs";
42
+ import template from "@ramstack/alpinegear-template";
43
+
44
+ Alpine.plugin(template);
45
+ Alpine.start();
46
+ ```
47
+
48
+ ## Usage
49
+ Here's a simple example where the template definition is separated from the main markup:
50
+
51
+ ```html
52
+ <template id="columns-template">
53
+ <td x-text="item.name"></td>
54
+ <td x-text="item.description"></td>
55
+ </template>
56
+
57
+ <div x-data="{
58
+ items: [
59
+ { name: 'Star', description: 'Luminous plasma sphere.' },
60
+ { name: 'Planet', description: 'Body orbiting a star.' },
61
+ { name: 'Galaxy', description: 'Stars and dust system.' },
62
+ { name: 'Nebula', description: 'Cloud of gas in space.' }
63
+ ]}">
64
+ <table>
65
+ <template x-for="item in items" :key="item.text">
66
+ <tr x-template="columns-template"></tr>
67
+ </template>
68
+ </table>
69
+ </div>
70
+ ```
71
+ 🚀 [Live demo | Alpine.js x-template: External template](https://jsfiddle.net/rameel/20boy7rq/)
72
+
73
+ In this example, the table column template is extracted into a separate template (`columns-template`),
74
+ which is referenced inside the loop.
75
+
76
+ Note that the template uses the data context available at the point where it's referenced,
77
+ as if it was defined in place.
78
+
79
+ > [!TIP]
80
+ > You can use multiple root elements inside a given template.
81
+
82
+ > [!IMPORTANT]
83
+ > * Templates should be defined using the `<template>` tag with a unique ID.
84
+ > * The `x-template` directive can only be applied to non-`<template>` elements.
85
+
86
+ ### Recursive Template
87
+
88
+ Since you can reference a template within itself by ID, it becomes easy to render **tree-like** structures – an otherwise challenging task.
89
+
90
+ Here's an example of rendering a simple file tree using `<ul>` tags:
91
+
92
+ ```html
93
+ <template id="treeitem">
94
+ <span x-text="model.name"></span>
95
+
96
+ <template x-if="model.list">
97
+ <ul>
98
+ <template x-for="item in model.list">
99
+ <!-- Recursively apply the current template to render nested items -->
100
+ <li x-template="treeitem" x-data="{ model: item }"></li>
101
+ </template>
102
+ </ul>
103
+ </template>
104
+ </template>
105
+
106
+ <ul x-data="json">
107
+ <li x-template="treeitem"></li>
108
+ </ul>
109
+
110
+ <script>
111
+ const json = {
112
+ model: {
113
+ name: 'root',
114
+ list: [
115
+ {
116
+ name: 'Documents',
117
+ list: [
118
+ { name: 'Resume.docx' },
119
+ { name: 'CoverLetter.docx' }
120
+ ]
121
+ },
122
+ {
123
+ name: 'Pictures',
124
+ list: [
125
+ {
126
+ name: 'Nature',
127
+ list: [
128
+ { name: 'Mountains.jpg' },
129
+ { name: 'River.jpg' }
130
+ ]
131
+ }
132
+ ]
133
+ }
134
+ ]
135
+ }
136
+ };
137
+ </script>
138
+ ```
139
+ 🚀 [Live demo | Alpine.js x-template: Recursive template (tree rendering)](https://jsfiddle.net/rameel/8envy4o7/)
140
+
141
+ This will generate the following HTML structure:
142
+
143
+ * root
144
+ * Documents
145
+ * Resume.docx
146
+ * CoverLetter.docx
147
+ * Pictures
148
+ * Nature
149
+ * Mountains.jpg
150
+ * River.jpg
151
+
152
+ As you can see, we are able to render nested elements by recursively referencing the same template within itself,
153
+ which opens up a lot of possibilities for complex layouts.
154
+
155
+ #### Interactive Tree with Recursive Template
156
+
157
+ Explore another example showcasing a recursive `x-template` to render an interactive tree with expandable folders
158
+ and dynamic child addition.
159
+
160
+ 🚀 [Live demo | Alpine.js x-template: Interactive Tree](https://jsfiddle.net/rameel/xwavq1to/)
161
+
162
+
163
+ ## Source code
164
+ You can find the source code for this plugin on GitHub:
165
+
166
+ https://github.com/rameel/ramstack.alpinegear.js/tree/main/src/plugins/template
167
+
168
+
169
+ ## Related packages
170
+ This package is part of **[AlpineGear](https://github.com/rameel/ramstack.alpinegear.js)** —
171
+ a collection of utilities and directives for [Alpine.js](https://alpinejs.dev).
172
+
173
+ You can find the full list of related packages and their documentation here:
174
+ https://github.com/rameel/ramstack.alpinegear.js
175
+
176
+
177
+ ## Contributions
178
+ Bug reports and contributions are welcome.
179
+
180
+ ## License
181
+ This package is released as open source under the **MIT License**.
182
+ See the [LICENSE](https://github.com/rameel/ramstack.alpinegear.js/blob/main/LICENSE) file for more details.
@@ -1,30 +1,30 @@
1
- const warn = (...args) => console.warn("alpinegear.js:", ...args);
1
+ const warn = (...args) => console.warn("alpinegear.js:", ...args);
2
2
  const is_template = el => el.matches("template");
3
3
 
4
- function plugin(alpine) {
5
- alpine.directive("template", (el, { expression }) => {
6
- if (is_template(el)) {
7
- warn("x-template cannot be used on a 'template' tag");
8
- return;
9
- }
10
-
11
- const tpl = document.getElementById(expression);
12
-
13
- if (!is_template(tpl)) {
14
- warn("x-template directive can only reference the template tag");
15
- return;
16
- }
17
-
18
- // Adding a queued task ensures asynchronous content update, allowing Alpine.js
19
- // to handle context propagation for cloned elements properly.
20
- // This is important because manipulation can occur within the mutateDom function
21
- // when mutation observing is disabled, preventing proper context propagation
22
- // for cloned elements.
23
- queueMicrotask(() => {
24
- el.innerHTML = "";
25
- el.append(tpl.content.cloneNode(true));
26
- });
27
- });
4
+ function plugin(alpine) {
5
+ alpine.directive("template", (el, { expression }) => {
6
+ if (is_template(el)) {
7
+ warn("x-template cannot be used on a 'template' tag");
8
+ return;
9
+ }
10
+
11
+ const tpl = document.getElementById(expression);
12
+
13
+ if (!is_template(tpl)) {
14
+ warn("x-template directive can only reference the template tag");
15
+ return;
16
+ }
17
+
18
+ // Adding a queued task ensures asynchronous content update, allowing Alpine.js
19
+ // to handle context propagation for cloned elements properly.
20
+ // This is important because manipulation can occur within the mutateDom function
21
+ // when mutation observing is disabled, preventing proper context propagation
22
+ // for cloned elements.
23
+ queueMicrotask(() => {
24
+ el.innerHTML = "";
25
+ el.append(tpl.content.cloneNode(true));
26
+ });
27
+ });
28
28
  }
29
29
 
30
- export { plugin as template };
30
+ export { plugin as default, plugin as template };
@@ -1 +1 @@
1
- const e=(...e)=>console.warn("alpinegear.js:",...e),t=e=>e.matches("template");function n(n){n.directive("template",(n,{expression:a})=>{if(t(n))return void e("x-template cannot be used on a 'template' tag");const o=document.getElementById(a);t(o)?queueMicrotask(()=>{n.innerHTML="",n.append(o.content.cloneNode(!0))}):e("x-template directive can only reference the template tag")})}export{n as template};
1
+ const e=(...e)=>console.warn("alpinegear.js:",...e),t=e=>e.matches("template");function n(n){n.directive("template",(n,{expression:a})=>{if(t(n))return void e("x-template cannot be used on a 'template' tag");const o=document.getElementById(a);t(o)?queueMicrotask(()=>{n.innerHTML="",n.append(o.content.cloneNode(!0))}):e("x-template directive can only reference the template tag")})}export{n as default,n as template};
@@ -1,35 +1,40 @@
1
1
  (function () {
2
2
  'use strict';
3
3
 
4
- const warn = (...args) => console.warn("alpinegear.js:", ...args);
4
+ const warn = (...args) => console.warn("alpinegear.js:", ...args);
5
5
  const is_template = el => el.matches("template");
6
6
 
7
- function plugin(alpine) {
8
- alpine.directive("template", (el, { expression }) => {
9
- if (is_template(el)) {
10
- warn("x-template cannot be used on a 'template' tag");
11
- return;
12
- }
13
-
14
- const tpl = document.getElementById(expression);
15
-
16
- if (!is_template(tpl)) {
17
- warn("x-template directive can only reference the template tag");
18
- return;
19
- }
20
-
21
- // Adding a queued task ensures asynchronous content update, allowing Alpine.js
22
- // to handle context propagation for cloned elements properly.
23
- // This is important because manipulation can occur within the mutateDom function
24
- // when mutation observing is disabled, preventing proper context propagation
25
- // for cloned elements.
26
- queueMicrotask(() => {
27
- el.innerHTML = "";
28
- el.append(tpl.content.cloneNode(true));
29
- });
30
- });
7
+ const listen = (target, type, listener, options) => {
8
+ target.addEventListener(type, listener, options);
9
+ return () => target.removeEventListener(type, listener, options);
10
+ };
11
+
12
+ function plugin(alpine) {
13
+ alpine.directive("template", (el, { expression }) => {
14
+ if (is_template(el)) {
15
+ warn("x-template cannot be used on a 'template' tag");
16
+ return;
17
+ }
18
+
19
+ const tpl = document.getElementById(expression);
20
+
21
+ if (!is_template(tpl)) {
22
+ warn("x-template directive can only reference the template tag");
23
+ return;
24
+ }
25
+
26
+ // Adding a queued task ensures asynchronous content update, allowing Alpine.js
27
+ // to handle context propagation for cloned elements properly.
28
+ // This is important because manipulation can occur within the mutateDom function
29
+ // when mutation observing is disabled, preventing proper context propagation
30
+ // for cloned elements.
31
+ queueMicrotask(() => {
32
+ el.innerHTML = "";
33
+ el.append(tpl.content.cloneNode(true));
34
+ });
35
+ });
31
36
  }
32
37
 
33
- document.addEventListener("alpine:init", () => { Alpine.plugin(plugin); });
38
+ listen(document, "alpine:init", () => Alpine.plugin(plugin));
34
39
 
35
40
  })();
@@ -1 +1 @@
1
- !function(){"use strict";const e=(...e)=>console.warn("alpinegear.js:",...e),t=e=>e.matches("template");function n(n){n.directive("template",(n,{expression:a})=>{if(t(n))return void e("x-template cannot be used on a 'template' tag");const i=document.getElementById(a);t(i)?queueMicrotask(()=>{n.innerHTML="",n.append(i.content.cloneNode(!0))}):e("x-template directive can only reference the template tag")})}document.addEventListener("alpine:init",()=>{Alpine.plugin(n)})}();
1
+ !function(){"use strict";const e=(...e)=>console.warn("alpinegear.js:",...e),t=e=>e.matches("template");function n(n){n.directive("template",(n,{expression:i})=>{if(t(n))return void e("x-template cannot be used on a 'template' tag");const a=document.getElementById(i);t(a)?queueMicrotask(()=>{n.innerHTML="",n.append(a.content.cloneNode(!0))}):e("x-template directive can only reference the template tag")})}document.addEventListener("alpine:init",()=>Alpine.plugin(n),void 0)}();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramstack/alpinegear-template",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "description": "@ramstack/alpinegear-template provides 'x-template' Alpine.js directive, that enhances template management, providing better control over reusable template blocks, dynamic and recursive component rendering.",
5
5
  "author": "Rameel Burhan",
6
6
  "license": "MIT",
@@ -17,6 +17,12 @@
17
17
  "alpinejs-directive",
18
18
  "alpinejs-plugin"
19
19
  ],
20
- "main": "alpinegear-template.js",
21
- "module": "alpinegear-template.esm.js"
20
+ "exports": {
21
+ ".": {
22
+ "import": {
23
+ "production": "./alpinegear-template.esm.min.js",
24
+ "default": "./alpinegear-template.esm.js"
25
+ }
26
+ }
27
+ }
22
28
  }