turbo-mount 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b885def4f5b0da21d8937c2f17af9ee780454f7ffd56e8aa5cd30c89ca0e22e
4
- data.tar.gz: c5ae1bf2a8e3abb49ffeb44323526a6adb2b96456b2ad39b1b179cc8dec414eb
3
+ metadata.gz: '0318ba2497956b4a56bc035a5a39e617bf0b171b039823fd61fe131294ca5815'
4
+ data.tar.gz: 6a078a433b9766915496ac9d86d9df81782eec209c495ccefcb978643c810a39
5
5
  SHA512:
6
- metadata.gz: b7d2163fe0dfe8a1cbb3297dd00f7460c50b95c96cf99952fde4c2683b02477c34ac2f96c12eff3f6c4f641e09c1f8b5fe9ccb179f51ed4858a2384069cd625b
7
- data.tar.gz: e00ff7429ae63e63d9ae0a9b2572ad144b11c2531b2ac849bb52ed3c100934fb2d0de041f519844c92aab0cc9a4f90ed87a22e8079134d056e9e063d99714d73
6
+ metadata.gz: 75dd9c6f8b0760791c40d3db5b07cf95056bc199550d95c5a86cec1686a8f11eb0594ad7e1d4d4c015867289371f18e2b1cc7f1ccb6738e24b8342a42e7b8f1c
7
+ data.tar.gz: 1ac86acfbb7d0e5c01e61c791e6ba058d78ae01092bdd1dc5cdd0059a5309922888a59cd0afad63541c2c517c478f159d351ef2e0da326ddddf1b48d6c9de534
data/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.3] - 2024-05-12
11
+
12
+ ### Added
13
+
14
+ - Add a mount target to the base controller. ([@skryukov])
15
+ - Add `registerComponents` helper for vite. ([@skryukov])
16
+ - Allow to omit the `application` property in the constructor. ([@skryukov])
17
+ `TurboMount` will try to find the application in the `window.Stimulus` and will initialize new one if not found.
18
+
19
+ ## [0.2.2] - 2024-05-09
20
+
21
+ ### Fixed
22
+
23
+ - Export plugins. ([@skryukov])
24
+
10
25
  ## [0.2.0] - 2024-05-09
11
26
 
12
27
  ### Added
@@ -21,7 +36,9 @@ and this project adheres to [Semantic Versioning].
21
36
 
22
37
  [@skryukov]: https://github.com/skryukov
23
38
 
24
- [Unreleased]: https://github.com/skryukov/turbo-mount/compare/v0.2.0...HEAD
39
+ [Unreleased]: https://github.com/skryukov/turbo-mount/compare/v0.2.3...HEAD
40
+ [0.2.3]: https://github.com/skryukov/turbo-mount/commits/v0.2.3
41
+ [0.2.2]: https://github.com/skryukov/turbo-mount/commits/v0.2.2
25
42
  [0.2.0]: https://github.com/skryukov/turbo-mount/commits/v0.2.0
26
43
  [0.1.0]: https://github.com/skryukov/turbo-mount/commits/v0.1.0
27
44
 
data/README.md CHANGED
@@ -6,35 +6,72 @@
6
6
 
7
7
  ## Installation
8
8
 
9
- Install the gem and add to the application's Gemfile by executing:
9
+ Add the following line to your Gemfile:
10
10
 
11
- $ bundle add turbo-mount
11
+ ```ruby
12
+ gem "turbo-mount"
13
+ ```
12
14
 
13
- If bundler is not being used to manage dependencies, install the gem by executing:
15
+ For projects utilizing build tools such as [Vite](http://vite-ruby.netlify.app), also install `turbo-mount` package:
14
16
 
15
- $ gem install turbo-mount
17
+ ```bash
18
+ npm install turbo-mount
19
+ # or with yarn
20
+ yarn add turbo-mount
21
+ ```
16
22
 
17
23
  ## Usage
18
24
 
19
- First, you need to initialize `TurboMount` and register the components you want to use:
25
+ ### Initialization
26
+
27
+ To begin using `TurboMount`, start by initializing the library and registering the components you intend to use. Below are the steps to set up `TurboMount` with different configurations.
28
+
29
+ #### Standard Initialization
30
+
31
+ Import the necessary modules and initialize ```TurboMount``` with your application and the desired plugin. Here's how to set it up with a React plugin:
32
+
33
+ ```js
34
+ import { Application } from "@hotwired/stimulus";
35
+ import { TurboMount } from "turbo-mount";
36
+ import plugin from "turbo-mount/react";
37
+ import { SketchPicker } from 'react-color';
38
+
39
+ const application = Application.start();
40
+ const turboMount = new TurboMount({ application, plugin });
41
+
42
+ turboMount.register('SketchPicker', SketchPicker);
43
+ ```
44
+
45
+ #### Simplified Initialization
46
+
47
+ If you prefer not to specify the `application` explicitly, `TurboMount` can automatically detect or initialize it. This approach uses the `window.Stimulus` if available; otherwise, it initializes a new Stimulus application:
20
48
 
21
49
  ```js
22
- import { Application } from "@hotwired/stimulus"
50
+ import { TurboMount } from "turbo-mount";
51
+ import plugin from "turbo-mount/react";
52
+ import { SketchPicker } from 'react-color';
53
+
54
+ const turboMount = new TurboMount({ plugin });
55
+
56
+ turboMount.register('SketchPicker', SketchPicker);
57
+ ```
23
58
 
24
- const application = Application.start()
59
+ #### Plugin-Specific Initialization
25
60
 
26
- import { TurboMount } from "turbo-mount"
27
- import plugin from "turbo-mount/react"
61
+ For a more streamlined setup, you can directly import a specialized version of `TurboMount`:
28
62
 
29
- // Initialize TurboMount and register the react stimulus controller
30
- const turboMount = new TurboMount({application, plugin});
63
+ ```js
64
+ import { TurboMountReact } from "turbo-mount/react";
65
+ import { SketchPicker } from 'react-color';
66
+
67
+ const turboMount = new TurboMountReact();
31
68
 
32
- // Register the components you want to use
33
- import { SketchPicker } from 'react-color'
34
69
  turboMount.register('SketchPicker', SketchPicker);
35
70
  ```
36
71
 
37
- Now you can use view helpers to mount the components:
72
+ ### View Helpers
73
+
74
+ Use the following helpers to mount components in your views:
38
75
 
39
76
  ```erb
40
77
  <%= turbo_mount_component("SketchPicker", framework: "react", props: {color: "#034"}) %>
@@ -44,11 +81,21 @@ Now you can use view helpers to mount the components:
44
81
  <%= turbo_mount_react_component("SketchPicker", props: {color: "#430"}) %>
45
82
  ```
46
83
 
47
- In case you need to customize the component's behavior, or pass functions as props, you can create a custom controller:
84
+ ### Supported Frameworks
48
85
 
49
- ```js
50
- // javascript/controllers/turbo_mount_react_sketch_picker_controller.js
86
+ `TurboMount` supports the following frameworks:
87
+
88
+ - React `"turbo-mount/react"`
89
+ - Vue `"turbo-mount/vue"`
90
+ - Svelte `"turbo-mount/svelte"`
91
+
92
+ It's possible to add support for other frameworks by creating custom controller class extending `TurboMountController` and providing a plugin. See included plugins for examples.
93
+
94
+ ### Custom Controllers
95
+
96
+ To customize component behavior or pass functions as props, create a custom controller:
51
97
 
98
+ ```js
52
99
  import { TurboMountReactController } from "turbo-mount"
53
100
 
54
101
  export default class extends TurboMountReactController {
@@ -68,7 +115,42 @@ export default class extends TurboMountReactController {
68
115
  Then pass this controller the register method:
69
116
 
70
117
  ```js
71
- turboMount.register('SketchPicker', SketchPicker, TurboMountReactController);
118
+ import SketchController from "controllers/turbo_mount/sketch_picker_controller"
119
+
120
+ turboMount.register('SketchPicker', SketchPicker, SketchController);
121
+ ```
122
+
123
+ ### Vite Integration
124
+
125
+ `TurboMount` includes a `registerComponents` function that automates the loading of components (requires `stimulus-vite-helpers` package). It also accepts an optional `controllers` property to autoload customized controllers:
126
+
127
+ ```js
128
+ import { TurboMount } from "turbo-mount/react";
129
+ import { registerComponents } from "turbo-mount/vite";
130
+
131
+ const controllers = import.meta.glob("./**/*_controller.js", { eager: true });
132
+ const components = import.meta.glob(`/components/**/*.jsx`, { eager: true });
133
+
134
+ const turboMount = new TurboMount();
135
+ registerComponents({ turboMount, components, controllers });
136
+ ```
137
+
138
+ The `registerComponents` helper searches for controllers in the following paths:
139
+ - `controllers/turbo-mount/${framework}/${controllerName}`
140
+ - `controllers/turbo-mount/${framework}-${controllerName}`
141
+ - `controllers/turbo-mount-${framework}-${controllerName}`
142
+ - `controllers/turbo-mount/${controllerName}`
143
+ - `controllers/turbo-mount-${controllerName}`
144
+
145
+ ### Mount target
146
+
147
+ To specify a non-root mount target, use the `data-<%= controller_name %>-target="mount"` attribute:
148
+
149
+ ```erb
150
+ <%= turbo_mount_react_component("SketchPicker", props: {color: "#430"}) do |controller_name| %>
151
+ <h3>Color picker</h3>
152
+ <div data-<%= controller_name %>-target="mount"></div>
153
+ <% end %>
72
154
  ```
73
155
 
74
156
  ## Development
@@ -1,6 +1,6 @@
1
+ import { TurboMountController, TurboMount } from 'turbo-mount';
1
2
  import { createElement } from 'react';
2
3
  import { createRoot } from 'react-dom/client';
3
- import { TurboMountController } from 'turbo-mount';
4
4
 
5
5
  class TurboMountReactController extends TurboMountController {
6
6
  constructor() {
@@ -10,13 +10,20 @@ class TurboMountReactController extends TurboMountController {
10
10
  mountComponent(el, Component, props) {
11
11
  const root = createRoot(el);
12
12
  root.render(createElement(Component, props));
13
- return () => { root.unmount(); };
13
+ return () => {
14
+ root.unmount();
15
+ };
14
16
  }
15
17
  }
16
18
 
17
19
  const plugin = {
18
20
  framework: "react",
19
- controller: TurboMountReactController
21
+ controller: TurboMountReactController,
20
22
  };
23
+ class TurboMountReact extends TurboMount {
24
+ constructor(props) {
25
+ super(Object.assign(Object.assign({}, props), { plugin }));
26
+ }
27
+ }
21
28
 
22
- export { plugin as default };
29
+ export { TurboMountReact as TurboMount, TurboMountReact, plugin as default };
@@ -1,2 +1,2 @@
1
- import{createElement as r}from"react";import{createRoot as t}from"react-dom/client";import{TurboMountController as o}from"turbo-mount";const e={framework:"react",controller:class extends o{constructor(){super(...arguments),this.framework="react"}mountComponent(o,e,n){const m=t(o);return m.render(r(e,n)),()=>{m.unmount()}}}};export{e as default};
1
+ import{TurboMountController as r,TurboMount as t}from"turbo-mount";import{createElement as o}from"react";import{createRoot as e}from"react-dom/client";const n={framework:"react",controller:class extends r{constructor(){super(...arguments),this.framework="react"}mountComponent(r,t,n){const s=e(r);return s.render(o(t,n)),()=>{s.unmount()}}}};class s extends t{constructor(r){super(Object.assign(Object.assign({},r),{plugin:n}))}}export{s as TurboMount,s as TurboMountReact,n as default};
2
2
  //# sourceMappingURL=react.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.min.js","sources":["../../src/plugins/react/index.ts","../../src/plugins/react/turbo-mount-react-controller.ts"],"sourcesContent":["import {Plugin} from \"turbo-mount\";\n\nimport {TurboMountReactController} from \"./turbo-mount-react-controller\";\n\nconst plugin: Plugin = {\n framework: \"react\",\n controller: TurboMountReactController\n}\n\nexport default plugin;\n","import {ComponentType, createElement} from \"react\";\nimport {createRoot} from \"react-dom/client\";\nimport {TurboMountController} from \"turbo-mount\";\n\nexport class TurboMountReactController extends TurboMountController<ComponentType> {\n framework = \"react\"\n\n mountComponent(el: Element, Component: ComponentType, props: object) {\n const root = createRoot(el);\n root.render(createElement(Component, props))\n\n return () => { root.unmount() }\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","root","createRoot","render","createElement","unmount"],"mappings":"uIAIA,MAAMA,EAAiB,CACnBC,UAAW,QACXC,WCFE,cAAyCC,EAA/C,WAAAC,uBACIC,KAASJ,UAAG,OAQf,CANG,cAAAK,CAAeC,EAAaC,EAA0BC,GAClD,MAAMC,EAAOC,EAAWJ,GAGxB,OAFAG,EAAKE,OAAOC,EAAcL,EAAWC,IAE9B,KAAQC,EAAKI,SAAS,CAChC"}
1
+ {"version":3,"file":"react.min.js","sources":["../../src/plugins/react/index.ts","../../src/plugins/react/turbo-mount-react-controller.ts"],"sourcesContent":["import { Plugin, TurboMount, TurboMountProps } from \"turbo-mount\";\n\nimport { TurboMountReactController } from \"./turbo-mount-react-controller\";\n\nconst plugin: Plugin = {\n framework: \"react\",\n controller: TurboMountReactController,\n};\n\nexport class TurboMountReact<T> extends TurboMount<T> {\n constructor(props: Omit<TurboMountProps, \"plugin\">) {\n super({ ...props, plugin });\n }\n}\n\nexport { TurboMountReact as TurboMount };\n\nexport default plugin;\n","import { ComponentType, createElement } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { TurboMountController } from \"turbo-mount\";\n\nexport class TurboMountReactController extends TurboMountController<ComponentType> {\n framework = \"react\";\n\n mountComponent(el: Element, Component: ComponentType, props: object) {\n const root = createRoot(el);\n root.render(createElement(Component, props));\n\n return () => {\n root.unmount();\n };\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","root","createRoot","render","createElement","unmount","TurboMountReact","TurboMount","super","Object","assign"],"mappings":"uJAIA,MAAMA,EAAiB,CACrBC,UAAW,QACXC,WCFI,cAAyCC,EAA/C,WAAAC,uBACEC,KAASJ,UAAG,OAUb,CARC,cAAAK,CAAeC,EAAaC,EAA0BC,GACpD,MAAMC,EAAOC,EAAWJ,GAGxB,OAFAG,EAAKE,OAAOC,EAAcL,EAAWC,IAE9B,KACLC,EAAKI,SAAS,CAEjB,IDLG,MAAOC,UAA2BC,EACtC,WAAAZ,CAAYK,GACVQ,MAAWC,OAAAC,OAAAD,OAAAC,OAAA,GAAAV,GAAO,CAAAT,WACnB"}
@@ -1,4 +1,4 @@
1
- import { TurboMountController } from 'turbo-mount';
1
+ import { TurboMountController, TurboMount } from 'turbo-mount';
2
2
 
3
3
  class TurboMountSvelteController extends TurboMountController {
4
4
  constructor() {
@@ -7,13 +7,20 @@ class TurboMountSvelteController extends TurboMountController {
7
7
  }
8
8
  mountComponent(el, Component, props) {
9
9
  const component = new Component({ target: el, props });
10
- return () => { component.$destroy(); };
10
+ return () => {
11
+ component.$destroy();
12
+ };
11
13
  }
12
14
  }
13
15
 
14
16
  const plugin = {
15
17
  framework: "svelte",
16
- controller: TurboMountSvelteController
18
+ controller: TurboMountSvelteController,
17
19
  };
20
+ class TurboMountSvelte extends TurboMount {
21
+ constructor(props) {
22
+ super(Object.assign(Object.assign({}, props), { plugin }));
23
+ }
24
+ }
18
25
 
19
- export { plugin as default };
26
+ export { TurboMountSvelte as TurboMount, TurboMountSvelte, plugin as default };
@@ -1,2 +1,2 @@
1
- import{TurboMountController as t}from"turbo-mount";const o={framework:"svelte",controller:class extends t{constructor(){super(...arguments),this.framework="svelte"}mountComponent(t,o,r){const e=new o({target:t,props:r});return()=>{e.$destroy()}}}};export{o as default};
1
+ import{TurboMountController as t,TurboMount as s}from"turbo-mount";const e={framework:"svelte",controller:class extends t{constructor(){super(...arguments),this.framework="svelte"}mountComponent(t,s,e){const o=new s({target:t,props:e});return()=>{o.$destroy()}}}};class o extends s{constructor(t){super(Object.assign(Object.assign({},t),{plugin:e}))}}export{o as TurboMount,o as TurboMountSvelte,e as default};
2
2
  //# sourceMappingURL=svelte.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"svelte.min.js","sources":["../../src/plugins/svelte/index.ts","../../src/plugins/svelte/turbo-mount-svelte-controller.ts"],"sourcesContent":["import {Plugin} from \"turbo-mount\";\n\nimport {TurboMountSvelteController} from \"./turbo-mount-svelte-controller\";\n\nconst plugin: Plugin = {\n framework: \"svelte\",\n controller: TurboMountSvelteController\n}\n\nexport default plugin;\n","import {ComponentType} from \"svelte\";\nimport {TurboMountController} from \"turbo-mount\";\n\nexport class TurboMountSvelteController extends TurboMountController<ComponentType> {\n framework = \"svelte\"\n\n mountComponent(el: Element, Component: ComponentType, props: object) {\n const component = new Component({ target: el, props })\n\n return () => { component.$destroy() }\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","component","target","$destroy"],"mappings":"mDAIA,MAAMA,EAAiB,CACnBC,UAAW,SACXC,WCHE,cAA0CC,EAAhD,WAAAC,uBACIC,KAASJ,UAAG,QAOf,CALG,cAAAK,CAAeC,EAAaC,EAA0BC,GAClD,MAAMC,EAAY,IAAIF,EAAU,CAAEG,OAAQJ,EAAIE,UAE9C,MAAO,KAAQC,EAAUE,UAAU,CACtC"}
1
+ {"version":3,"file":"svelte.min.js","sources":["../../src/plugins/svelte/index.ts","../../src/plugins/svelte/turbo-mount-svelte-controller.ts"],"sourcesContent":["import { Plugin, TurboMount, TurboMountProps } from \"turbo-mount\";\n\nimport { TurboMountSvelteController } from \"./turbo-mount-svelte-controller\";\n\nconst plugin: Plugin = {\n framework: \"svelte\",\n controller: TurboMountSvelteController,\n};\n\nexport class TurboMountSvelte<T> extends TurboMount<T> {\n constructor(props: Omit<TurboMountProps, \"plugin\">) {\n super({ ...props, plugin });\n }\n}\n\nexport { TurboMountSvelte as TurboMount };\nexport default plugin;\n","import { ComponentType } from \"svelte\";\nimport { TurboMountController } from \"turbo-mount\";\n\nexport class TurboMountSvelteController extends TurboMountController<ComponentType> {\n framework = \"svelte\";\n\n mountComponent(el: Element, Component: ComponentType, props: object) {\n const component = new Component({ target: el, props });\n\n return () => {\n component.$destroy();\n };\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","component","target","$destroy","TurboMountSvelte","TurboMount","super","Object","assign"],"mappings":"mEAIA,MAAMA,EAAiB,CACrBC,UAAW,SACXC,WCHI,cAA0CC,EAAhD,WAAAC,uBACEC,KAASJ,UAAG,QASb,CAPC,cAAAK,CAAeC,EAAaC,EAA0BC,GACpD,MAAMC,EAAY,IAAIF,EAAU,CAAEG,OAAQJ,EAAIE,UAE9C,MAAO,KACLC,EAAUE,UAAU,CAEvB,IDHG,MAAOC,UAA4BC,EACvC,WAAAV,CAAYK,GACVM,MAAWC,OAAAC,OAAAD,OAAAC,OAAA,GAAAR,GAAO,CAAAT,WACnB"}
@@ -1,5 +1,5 @@
1
+ import { TurboMountController, TurboMount } from 'turbo-mount';
1
2
  import { createApp } from 'vue';
2
- import { TurboMountController } from 'turbo-mount';
3
3
 
4
4
  class TurboMountVueController extends TurboMountController {
5
5
  constructor() {
@@ -9,13 +9,20 @@ class TurboMountVueController extends TurboMountController {
9
9
  mountComponent(el, Component, props) {
10
10
  const app = createApp(Component, props);
11
11
  app.mount(el);
12
- return () => { app.unmount(); };
12
+ return () => {
13
+ app.unmount();
14
+ };
13
15
  }
14
16
  }
15
17
 
16
18
  const plugin = {
17
19
  framework: "vue",
18
- controller: TurboMountVueController
20
+ controller: TurboMountVueController,
19
21
  };
22
+ class TurboMountVue extends TurboMount {
23
+ constructor(props) {
24
+ super(Object.assign(Object.assign({}, props), { plugin }));
25
+ }
26
+ }
20
27
 
21
- export { plugin as default };
28
+ export { TurboMountVue as TurboMount, TurboMountVue, plugin as default };
@@ -1,2 +1,2 @@
1
- import{createApp as o}from"vue";import{TurboMountController as t}from"turbo-mount";const r={framework:"vue",controller:class extends t{constructor(){super(...arguments),this.framework="vue"}mountComponent(t,r,e){const n=o(r,e);return n.mount(t),()=>{n.unmount()}}}};export{r as default};
1
+ import{TurboMountController as o,TurboMount as t}from"turbo-mount";import{createApp as r}from"vue";const n={framework:"vue",controller:class extends o{constructor(){super(...arguments),this.framework="vue"}mountComponent(o,t,n){const s=r(t,n);return s.mount(o),()=>{s.unmount()}}}};class s extends t{constructor(o){super(Object.assign(Object.assign({},o),{plugin:n}))}}export{s as TurboMount,s as TurboMountVue,n as default};
2
2
  //# sourceMappingURL=vue.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vue.min.js","sources":["../../src/plugins/vue/index.ts","../../src/plugins/vue/turbo-mount-vue-controller.ts"],"sourcesContent":["import {Plugin} from \"turbo-mount\";\n\nimport {TurboMountVueController} from \"./turbo-mount-vue-controller\";\n\nconst plugin: Plugin = {\n framework: \"vue\",\n controller: TurboMountVueController\n}\n\nexport default plugin;\n","import { createApp, App } from \"vue\";\nimport {TurboMountController} from \"turbo-mount\";\n\nexport class TurboMountVueController extends TurboMountController<App> {\n framework = \"vue\"\n\n mountComponent(el: Element, Component: App, props: object) {\n const app = createApp(Component, props as Record<string, unknown>);\n app.mount(el)\n\n return () => { app.unmount() }\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","app","createApp","mount","unmount"],"mappings":"mFAIA,MAAMA,EAAiB,CACnBC,UAAW,MACXC,WCHE,cAAuCC,EAA7C,WAAAC,uBACIC,KAASJ,UAAG,KAQf,CANG,cAAAK,CAAeC,EAAaC,EAAgBC,GACxC,MAAMC,EAAMC,EAAUH,EAAWC,GAGjC,OAFAC,EAAIE,MAAML,GAEH,KAAQG,EAAIG,SAAS,CAC/B"}
1
+ {"version":3,"file":"vue.min.js","sources":["../../src/plugins/vue/index.ts","../../src/plugins/vue/turbo-mount-vue-controller.ts"],"sourcesContent":["import { Plugin, TurboMount, TurboMountProps } from \"turbo-mount\";\n\nimport { TurboMountVueController } from \"./turbo-mount-vue-controller\";\n\nconst plugin: Plugin = {\n framework: \"vue\",\n controller: TurboMountVueController,\n};\n\nexport class TurboMountVue<T> extends TurboMount<T> {\n constructor(props: Omit<TurboMountProps, \"plugin\">) {\n super({ ...props, plugin });\n }\n}\n\nexport { TurboMountVue as TurboMount };\n\nexport default plugin;\n","import { createApp, App } from \"vue\";\nimport { TurboMountController } from \"turbo-mount\";\n\nexport class TurboMountVueController extends TurboMountController<App> {\n framework = \"vue\";\n\n mountComponent(el: Element, Component: App, props: object) {\n const app = createApp(Component, props as Record<string, unknown>);\n app.mount(el);\n\n return () => {\n app.unmount();\n };\n }\n}\n"],"names":["plugin","framework","controller","TurboMountController","constructor","this","mountComponent","el","Component","props","app","createApp","mount","unmount","TurboMountVue","TurboMount","super","Object","assign"],"mappings":"mGAIA,MAAMA,EAAiB,CACrBC,UAAW,MACXC,WCHI,cAAuCC,EAA7C,WAAAC,uBACEC,KAASJ,UAAG,KAUb,CARC,cAAAK,CAAeC,EAAaC,EAAgBC,GAC1C,MAAMC,EAAMC,EAAUH,EAAWC,GAGjC,OAFAC,EAAIE,MAAML,GAEH,KACLG,EAAIG,SAAS,CAEhB,IDJG,MAAOC,UAAyBC,EACpC,WAAAX,CAAYK,GACVO,MAAWC,OAAAC,OAAAD,OAAAC,OAAA,GAAAT,GAAO,CAAAT,WACnB"}
@@ -1,4 +1,4 @@
1
- import { Controller } from '@hotwired/stimulus';
1
+ import { Controller, Application } from '@hotwired/stimulus';
2
2
 
3
3
  class TurboMountController extends Controller {
4
4
  connect() {
@@ -15,7 +15,7 @@ class TurboMountController extends Controller {
15
15
  return this.propsValue;
16
16
  }
17
17
  get mountElement() {
18
- return this.element;
18
+ return this.hasMountTarget ? this.mountTarget : this.element;
19
19
  }
20
20
  get resolvedComponent() {
21
21
  return this.resolveComponent(this.componentValue);
@@ -31,22 +31,35 @@ class TurboMountController extends Controller {
31
31
  }
32
32
  TurboMountController.values = {
33
33
  props: Object,
34
- component: String
34
+ component: String,
35
+ };
36
+ TurboMountController.targets = ["mount"];
37
+
38
+ const camelToKebabCase = (str) => {
39
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
35
40
  };
36
41
 
37
42
  class TurboMount {
38
- constructor(props) {
43
+ constructor({ application, plugin }) {
39
44
  var _a;
40
45
  this.components = new Map();
41
- this.application = props.application;
42
- this.framework = props.plugin.framework;
43
- this.baseController = props.plugin.controller;
46
+ this.application = this.findOrStartApplication(application);
47
+ this.framework = plugin.framework;
48
+ this.baseController = plugin.controller;
44
49
  (_a = this.application).turboMount || (_a.turboMount = {});
45
50
  this.application.turboMount[this.framework] = this;
46
51
  if (this.baseController) {
47
52
  this.application.register(`turbo-mount-${this.framework}`, this.baseController);
48
53
  }
49
54
  }
55
+ findOrStartApplication(hydratedApp) {
56
+ let application = hydratedApp || window.Stimulus;
57
+ if (!application) {
58
+ application = Application.start();
59
+ window.Stimulus = application;
60
+ }
61
+ return application;
62
+ }
50
63
  register(name, component, controller) {
51
64
  controller || (controller = this.baseController);
52
65
  if (this.components.has(name)) {
@@ -54,7 +67,7 @@ class TurboMount {
54
67
  }
55
68
  this.components.set(name, component);
56
69
  if (controller) {
57
- const controllerName = `turbo-mount-${this.framework}-${this.camelToKebabCase(name)}`;
70
+ const controllerName = `turbo-mount-${this.framework}-${camelToKebabCase(name)}`;
58
71
  this.application.register(controllerName, controller);
59
72
  }
60
73
  }
@@ -65,9 +78,6 @@ class TurboMount {
65
78
  }
66
79
  return component;
67
80
  }
68
- camelToKebabCase(str) {
69
- return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
70
- }
71
81
  }
72
82
 
73
83
  export { TurboMount, TurboMountController };
@@ -1,2 +1,2 @@
1
- import{Controller as t}from"@hotwired/stimulus";class o extends t{connect(){this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}disconnect(){this.umountComponent()}propsValueChanged(){this.umountComponent(),this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}get componentProps(){return this.propsValue}get mountElement(){return this.element}get resolvedComponent(){return this.resolveComponent(this.componentValue)}umountComponent(){this._umountComponentCallback&&this._umountComponentCallback(),this._umountComponentCallback=void 0}resolveComponent(t){return this.application.turboMount[this.framework].resolve(t)}}o.values={props:Object,component:String};class n{constructor(t){var o;this.components=new Map,this.application=t.application,this.framework=t.plugin.framework,this.baseController=t.plugin.controller,(o=this.application).turboMount||(o.turboMount={}),this.application.turboMount[this.framework]=this,this.baseController&&this.application.register(`turbo-mount-${this.framework}`,this.baseController)}register(t,o,n){if(n||(n=this.baseController),this.components.has(t))throw new Error(`Component '${t}' is already registered.`);if(this.components.set(t,o),n){const o=`turbo-mount-${this.framework}-${this.camelToKebabCase(t)}`;this.application.register(o,n)}}resolve(t){const o=this.components.get(t);if(!o)throw new Error(`Unknown component: ${t}`);return o}camelToKebabCase(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}}export{n as TurboMount,o as TurboMountController};
1
+ import{Controller as t,Application as o}from"@hotwired/stimulus";class n extends t{connect(){this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}disconnect(){this.umountComponent()}propsValueChanged(){this.umountComponent(),this._umountComponentCallback||(this._umountComponentCallback=this.mountComponent(this.mountElement,this.resolvedComponent,this.componentProps))}get componentProps(){return this.propsValue}get mountElement(){return this.hasMountTarget?this.mountTarget:this.element}get resolvedComponent(){return this.resolveComponent(this.componentValue)}umountComponent(){this._umountComponentCallback&&this._umountComponentCallback(),this._umountComponentCallback=void 0}resolveComponent(t){return this.application.turboMount[this.framework].resolve(t)}}n.values={props:Object,component:String},n.targets=["mount"];class e{constructor({application:t,plugin:o}){var n;this.components=new Map,this.application=this.findOrStartApplication(t),this.framework=o.framework,this.baseController=o.controller,(n=this.application).turboMount||(n.turboMount={}),this.application.turboMount[this.framework]=this,this.baseController&&this.application.register(`turbo-mount-${this.framework}`,this.baseController)}findOrStartApplication(t){let n=t||window.Stimulus;return n||(n=o.start(),window.Stimulus=n),n}register(t,o,n){if(n||(n=this.baseController),this.components.has(t))throw new Error(`Component '${t}' is already registered.`);if(this.components.set(t,o),n){const o=`turbo-mount-${this.framework}-${e=t,e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}`;this.application.register(o,n)}var e}resolve(t){const o=this.components.get(t);if(!o)throw new Error(`Unknown component: ${t}`);return o}}export{e as TurboMount,n as TurboMountController};
2
2
  //# sourceMappingURL=turbo-mount.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"turbo-mount.min.js","sources":["../src/turbo-mount-controller.ts","../src/turbo-mount.ts"],"sourcesContent":["import {Controller} from \"@hotwired/stimulus\"\nimport {ApplicationWithTurboMount} from \"./turbo-mount\";\n\nexport abstract class TurboMountController<T> extends Controller {\n static values = {\n props: Object,\n component: String\n }\n declare readonly propsValue: object;\n declare readonly componentValue: string;\n\n abstract framework: string;\n\n abstract mountComponent(el: Element, Component: T, props: object): () => void;\n\n _umountComponentCallback?: () => void;\n\n connect() {\n this._umountComponentCallback ||= this.mountComponent(this.mountElement, this.resolvedComponent, this.componentProps);\n }\n\n disconnect() {\n this.umountComponent();\n }\n\n propsValueChanged() {\n this.umountComponent();\n this._umountComponentCallback ||= this.mountComponent(this.mountElement, this.resolvedComponent, this.componentProps);\n }\n\n get componentProps() {\n return this.propsValue;\n }\n\n get mountElement() {\n return this.element;\n }\n\n get resolvedComponent() {\n return this.resolveComponent(this.componentValue);\n }\n\n umountComponent() {\n this._umountComponentCallback && this._umountComponentCallback();\n this._umountComponentCallback = undefined;\n }\n\n resolveComponent(component: string): T {\n const app = this.application as ApplicationWithTurboMount<T>\n return app.turboMount[this.framework].resolve(component);\n }\n}\n\n\n","import {Application, ControllerConstructor} from '@hotwired/stimulus';\n\nexport interface ApplicationWithTurboMount<T> extends Application {\n turboMount: { [framework: string]: TurboMount<T> };\n}\n\nexport type Plugin = {\n framework: string;\n controller: ControllerConstructor;\n}\n\nexport class TurboMount<T> {\n components: Map<string, T>;\n application: ApplicationWithTurboMount<T>;\n framework: string;\n baseController?: ControllerConstructor;\n\n constructor(props: { application: Application, plugin: Plugin }) {\n this.components = new Map();\n this.application = props.application as ApplicationWithTurboMount<T>;\n this.framework = props.plugin.framework;\n this.baseController = props.plugin.controller;\n\n this.application.turboMount ||= {};\n this.application.turboMount[this.framework] = this;\n\n if (this.baseController) {\n this.application.register(`turbo-mount-${this.framework}`, this.baseController);\n }\n }\n\n register(name: string, component: T, controller?: ControllerConstructor) {\n controller ||= this.baseController;\n if (this.components.has(name)) {\n throw new Error(`Component '${name}' is already registered.`);\n }\n this.components.set(name, component);\n\n if (controller) {\n const controllerName = `turbo-mount-${this.framework}-${this.camelToKebabCase(name)}`;\n this.application.register(controllerName, controller);\n }\n }\n\n resolve(name: string) {\n const component = this.components.get(name);\n if (!component) {\n throw new Error(`Unknown component: ${name}`);\n }\n return component;\n }\n\n camelToKebabCase(str: string) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n }\n}\n"],"names":["TurboMountController","Controller","connect","this","_umountComponentCallback","mountComponent","mountElement","resolvedComponent","componentProps","disconnect","umountComponent","propsValueChanged","propsValue","element","resolveComponent","componentValue","undefined","component","application","turboMount","framework","resolve","values","props","Object","String","TurboMount","constructor","components","Map","plugin","baseController","controller","_a","register","name","has","Error","set","controllerName","camelToKebabCase","get","str","replace","toLowerCase"],"mappings":"gDAGM,MAAgBA,UAAgCC,EAclD,OAAAC,GACIC,KAAKC,2BAALD,KAAKC,yBAA6BD,KAAKE,eAAeF,KAAKG,aAAcH,KAAKI,kBAAmBJ,KAAKK,gBACzG,CAED,UAAAC,GACIN,KAAKO,iBACR,CAED,iBAAAC,GACIR,KAAKO,kBACLP,KAAKC,2BAALD,KAAKC,yBAA6BD,KAAKE,eAAeF,KAAKG,aAAcH,KAAKI,kBAAmBJ,KAAKK,gBACzG,CAED,kBAAIA,GACA,OAAOL,KAAKS,UACf,CAED,gBAAIN,GACA,OAAOH,KAAKU,OACf,CAED,qBAAIN,GACA,OAAOJ,KAAKW,iBAAiBX,KAAKY,eACrC,CAED,eAAAL,GACIP,KAAKC,0BAA4BD,KAAKC,2BACtCD,KAAKC,8BAA2BY,CACnC,CAED,gBAAAF,CAAiBG,GAEb,OADYd,KAAKe,YACNC,WAAWhB,KAAKiB,WAAWC,QAAQJ,EACjD,EA9CMjB,EAAAsB,OAAS,CACZC,MAAOC,OACPP,UAAWQ,cCKNC,EAMT,WAAAC,CAAYJ,SACRpB,KAAKyB,WAAa,IAAIC,IACtB1B,KAAKe,YAAcK,EAAML,YACzBf,KAAKiB,UAAYG,EAAMO,OAAOV,UAC9BjB,KAAK4B,eAAiBR,EAAMO,OAAOE,YAEnCC,EAAA9B,KAAKe,aAAYC,aAAAc,EAAAd,WAAe,CAAA,GAChChB,KAAKe,YAAYC,WAAWhB,KAAKiB,WAAajB,KAE1CA,KAAK4B,gBACL5B,KAAKe,YAAYgB,SAAS,eAAe/B,KAAKiB,YAAajB,KAAK4B,eAEvE,CAED,QAAAG,CAASC,EAAclB,EAAce,GAEjC,GADAA,IAAAA,EAAe7B,KAAK4B,gBAChB5B,KAAKyB,WAAWQ,IAAID,GACpB,MAAM,IAAIE,MAAM,cAAcF,6BAIlC,GAFAhC,KAAKyB,WAAWU,IAAIH,EAAMlB,GAEtBe,EAAY,CACZ,MAAMO,EAAiB,eAAepC,KAAKiB,aAAajB,KAAKqC,iBAAiBL,KAC9EhC,KAAKe,YAAYgB,SAASK,EAAgBP,EAC7C,CACJ,CAED,OAAAX,CAAQc,GACJ,MAAMlB,EAAYd,KAAKyB,WAAWa,IAAIN,GACtC,IAAKlB,EACD,MAAM,IAAIoB,MAAM,sBAAsBF,KAE1C,OAAOlB,CACV,CAED,gBAAAuB,CAAiBE,GACb,OAAOA,EAAIC,QAAQ,kBAAmB,SAASC,aAClD"}
1
+ {"version":3,"file":"turbo-mount.min.js","sources":["../src/turbo-mount-controller.ts","../src/turbo-mount.ts","../src/helpers.ts"],"sourcesContent":["import { Controller } from \"@hotwired/stimulus\";\nimport { ApplicationWithTurboMount } from \"./turbo-mount\";\n\nexport abstract class TurboMountController<T> extends Controller {\n static values = {\n props: Object,\n component: String,\n };\n static targets = [\"mount\"];\n\n declare readonly propsValue: object;\n declare readonly componentValue: string;\n declare readonly hasMountTarget: boolean;\n declare readonly mountTarget: Element;\n\n abstract framework: string;\n\n abstract mountComponent(el: Element, Component: T, props: object): () => void;\n\n _umountComponentCallback?: () => void;\n\n connect() {\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n disconnect() {\n this.umountComponent();\n }\n\n propsValueChanged() {\n this.umountComponent();\n this._umountComponentCallback ||= this.mountComponent(\n this.mountElement,\n this.resolvedComponent,\n this.componentProps,\n );\n }\n\n get componentProps() {\n return this.propsValue;\n }\n\n get mountElement() {\n return this.hasMountTarget ? this.mountTarget : this.element;\n }\n\n get resolvedComponent() {\n return this.resolveComponent(this.componentValue);\n }\n\n umountComponent() {\n this._umountComponentCallback && this._umountComponentCallback();\n this._umountComponentCallback = undefined;\n }\n\n resolveComponent(component: string): T {\n const app = this.application as ApplicationWithTurboMount<T>;\n return app.turboMount[this.framework].resolve(component);\n }\n}\n","import { Application, ControllerConstructor } from \"@hotwired/stimulus\";\n\nimport { camelToKebabCase } from \"./helpers\";\n\ndeclare global {\n interface Window {\n Stimulus?: Application;\n }\n}\n\nexport interface ApplicationWithTurboMount<T> extends Application {\n turboMount: { [framework: string]: TurboMount<T> };\n}\n\nexport type Plugin = {\n framework: string;\n controller: ControllerConstructor;\n};\n\nexport type TurboMountProps = {\n application?: Application;\n plugin: Plugin;\n};\n\nexport class TurboMount<T> {\n components: Map<string, T>;\n application: ApplicationWithTurboMount<T>;\n framework: string;\n baseController?: ControllerConstructor;\n\n constructor({ application, plugin }: TurboMountProps) {\n this.components = new Map();\n this.application = this.findOrStartApplication(application);\n this.framework = plugin.framework;\n this.baseController = plugin.controller;\n\n this.application.turboMount ||= {};\n this.application.turboMount[this.framework] = this;\n\n if (this.baseController) {\n this.application.register(\n `turbo-mount-${this.framework}`,\n this.baseController,\n );\n }\n }\n\n private findOrStartApplication(hydratedApp?: Application) {\n let application = hydratedApp || window.Stimulus;\n\n if (!application) {\n application = Application.start();\n window.Stimulus = application;\n }\n return application as ApplicationWithTurboMount<T>;\n }\n\n register(name: string, component: T, controller?: ControllerConstructor) {\n controller ||= this.baseController;\n if (this.components.has(name)) {\n throw new Error(`Component '${name}' is already registered.`);\n }\n this.components.set(name, component);\n\n if (controller) {\n const controllerName = `turbo-mount-${this.framework}-${camelToKebabCase(name)}`;\n this.application.register(controllerName, controller);\n }\n }\n\n resolve(name: string) {\n const component = this.components.get(name);\n if (!component) {\n throw new Error(`Unknown component: ${name}`);\n }\n return component;\n }\n}\n","export const camelToKebabCase = (str: string) => {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n};\n"],"names":["TurboMountController","Controller","connect","this","_umountComponentCallback","mountComponent","mountElement","resolvedComponent","componentProps","disconnect","umountComponent","propsValueChanged","propsValue","hasMountTarget","mountTarget","element","resolveComponent","componentValue","undefined","component","application","turboMount","framework","resolve","values","props","Object","String","targets","TurboMount","constructor","plugin","components","Map","findOrStartApplication","baseController","controller","_a","register","hydratedApp","window","Stimulus","Application","start","name","has","Error","set","controllerName","str","replace","toLowerCase","get"],"mappings":"iEAGM,MAAgBA,UAAgCC,EAkBpD,OAAAC,GACEC,KAAKC,2BAALD,KAAKC,yBAA6BD,KAAKE,eACrCF,KAAKG,aACLH,KAAKI,kBACLJ,KAAKK,gBAER,CAED,UAAAC,GACEN,KAAKO,iBACN,CAED,iBAAAC,GACER,KAAKO,kBACLP,KAAKC,2BAALD,KAAKC,yBAA6BD,KAAKE,eACrCF,KAAKG,aACLH,KAAKI,kBACLJ,KAAKK,gBAER,CAED,kBAAIA,GACF,OAAOL,KAAKS,UACb,CAED,gBAAIN,GACF,OAAOH,KAAKU,eAAiBV,KAAKW,YAAcX,KAAKY,OACtD,CAED,qBAAIR,GACF,OAAOJ,KAAKa,iBAAiBb,KAAKc,eACnC,CAED,eAAAP,GACEP,KAAKC,0BAA4BD,KAAKC,2BACtCD,KAAKC,8BAA2Bc,CACjC,CAED,gBAAAF,CAAiBG,GAEf,OADYhB,KAAKiB,YACNC,WAAWlB,KAAKmB,WAAWC,QAAQJ,EAC/C,EA1DMnB,EAAAwB,OAAS,CACdC,MAAOC,OACPP,UAAWQ,QAEN3B,EAAA4B,QAAU,CAAC,eCgBPC,EAMX,WAAAC,EAAYV,YAAEA,EAAWW,OAAEA,UACzB5B,KAAK6B,WAAa,IAAIC,IACtB9B,KAAKiB,YAAcjB,KAAK+B,uBAAuBd,GAC/CjB,KAAKmB,UAAYS,EAAOT,UACxBnB,KAAKgC,eAAiBJ,EAAOK,YAE7BC,EAAAlC,KAAKiB,aAAYC,aAAAgB,EAAAhB,WAAe,CAAA,GAChClB,KAAKiB,YAAYC,WAAWlB,KAAKmB,WAAanB,KAE1CA,KAAKgC,gBACPhC,KAAKiB,YAAYkB,SACf,eAAenC,KAAKmB,YACpBnB,KAAKgC,eAGV,CAEO,sBAAAD,CAAuBK,GAC7B,IAAInB,EAAcmB,GAAeC,OAAOC,SAMxC,OAJKrB,IACHA,EAAcsB,EAAYC,QAC1BH,OAAOC,SAAWrB,GAEbA,CACR,CAED,QAAAkB,CAASM,EAAczB,EAAciB,GAEnC,GADAA,IAAAA,EAAejC,KAAKgC,gBAChBhC,KAAK6B,WAAWa,IAAID,GACtB,MAAM,IAAIE,MAAM,cAAcF,6BAIhC,GAFAzC,KAAK6B,WAAWe,IAAIH,EAAMzB,GAEtBiB,EAAY,CACd,MAAMY,EAAiB,eAAe7C,KAAKmB,aCjEhB2B,EDiE8CL,EChEtEK,EAAIC,QAAQ,kBAAmB,SAASC,gBDiE3ChD,KAAKiB,YAAYkB,SAASU,EAAgBZ,EAC3C,CCnE2B,IAACa,CDoE9B,CAED,OAAA1B,CAAQqB,GACN,MAAMzB,EAAYhB,KAAK6B,WAAWoB,IAAIR,GACtC,IAAKzB,EACH,MAAM,IAAI2B,MAAM,sBAAsBF,KAExC,OAAOzB,CACR"}
@@ -3,27 +3,30 @@
3
3
  module Turbo
4
4
  module Mount
5
5
  module Helpers
6
- def turbo_mount_component(component_name, framework:, props: {}, tag: "div", **attrs)
6
+ def turbo_mount_component(component_name, framework:, props: {}, tag: "div", **attrs, &block)
7
7
  raise TypeError, "Component name expected" unless component_name.is_a? String
8
8
 
9
- attrs["data-controller"] = "turbo-mount-#{framework}-#{component_name.underscore.dasherize}"
10
- prefix = "data-#{attrs["data-controller"]}"
9
+ controller_name = "turbo-mount-#{framework}-#{component_name.underscore.dasherize}"
10
+ attrs["data-controller"] = controller_name
11
+ prefix = "data-#{controller_name}"
11
12
  attrs["#{prefix}-component-value"] = component_name
12
13
  attrs["#{prefix}-props-value"] = json_escape(props.to_json) if props.present?
13
14
 
14
- content_tag(tag, nil, attrs)
15
+ return content_tag(tag, nil, attrs) unless block
16
+
17
+ content_tag(tag, nil, attrs) { capture(controller_name, &block) }
15
18
  end
16
19
 
17
- def turbo_mount_react_component(component_name, **attrs)
18
- turbo_mount_component(component_name, framework: "react", **attrs)
20
+ def turbo_mount_react_component(component_name, **attrs, &block)
21
+ turbo_mount_component(component_name, framework: "react", **attrs, &block)
19
22
  end
20
23
 
21
- def turbo_mount_svelte_component(component_name, **attrs)
22
- turbo_mount_component(component_name, framework: "svelte", **attrs)
24
+ def turbo_mount_svelte_component(component_name, **attrs, &block)
25
+ turbo_mount_component(component_name, framework: "svelte", **attrs, &block)
23
26
  end
24
27
 
25
- def turbo_mount_vue_component(component_name, **attrs)
26
- turbo_mount_component(component_name, framework: "vue", **attrs)
28
+ def turbo_mount_vue_component(component_name, **attrs, &block)
29
+ turbo_mount_component(component_name, framework: "vue", **attrs, &block)
27
30
  end
28
31
  end
29
32
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Turbo
4
4
  module Mount
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.3"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-09 00:00:00.000000000 Z
11
+ date: 2024-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties