# ZjsComponent **ZjsComponent** is a lightweight, zero-dependency Web Component for building modular, reusable front-end UI components. It allows dynamic loading of HTML+JS fragments with local script scoping, simple lifecycle hooks, and isolated DOM composition without needing a full framework. A single component is simply a fragment of valid HTML that s downloaded and inserted into the DOM. Scripts in that fragment are scoped to that fragment alone. An instance of a **ZjsComponent** is created for that fragment which will have specific functions (identified by the component author) created as methods on that instance. To insert a component, which can be a full and rich component containing complex sub-DOM and methods on the object, do this: ```html ``` A single component is a fragment of valid HTML that contains: 1. Zero or more HTML elements, 2. Zero or more ` ``` You can load it from your server or bundle it with your app. --- ## 🧩 Usage To use a `zjs-component`, place the custom tag in your HTML and set the `remote-src` attribute to point to an external `.zjsc` HTML fragment. All attributes are passed to the fragment script as component attributes. > The `display=...` attribute is special: it is used to set the > `style.display` of the element, allowing the caller/user of the component to > set the display to `inline`, `block`, `inline-block`, `none`, etc. ```html ``` > **Note** To ease development, change your editor/IDE settings to treat > `.zjsc` files exactly the same as it does `.html` files. You definitely want > this so that your editor/IDE does all the correct syntax highlighting, > autocompletion and code-formatting for `.zjsc` files that it does for > `.html` files. --- ## 📦 Fragment Structure (`.zjsc` file) Each remote fragment may contain: - Any HTML content - Multiple ` ``` Example usage of above component: ``` ``` --- ## 🧠 Lifecycle Hooks The following optional functions can be defined in the fragment script: - **`onConnected()`** called after the fragment loads and scripts are bound - **`onDisconnected()`** called when the component is removed from the DOM These functions, like all functions defined in the script element within a `.zjsc` page, have `this` bound to the `zjs-component` instance. --- ## 📡 Calling Component Methods Use the global `ZjsComponent.send()` function to call exported methods from within the fragment: ```html ``` You can also invoke methods from outside the component: ```js ZjsComponent.send("#my-component", "someMethod", arg1, arg2); ``` Where: - First argument: selector, DOM node, or internal instance ID - Second argument: name of the exported method - Remaining arguments: passed to the method Within methods the `this` variable works as you would expect, referencing the current instance of the component. --- ## 🔍 Debugging If the component has a `debug` attribute, its internal script `exports` object will be accessible as `window.__zjsDebugClosure` in the console. ```html ``` --- ## 🔐 Security Note ZjsComponent uses `new Function()` to execute remote scripts, so only load fragments from **trusted sources**. Avoid including user-generated content. --- ## ✅ Features Summary - ✅ Load reusable HTML+JS fragments into any page - ✅ DOM isolation (children stay inside component tag) - ✅ Lifecycle hooks (`onConnected`, `onDisconnected`) - ✅ Method calling via `ZjsComponent.send()` - ✅ Script scoping per fragment - ✅ Pass attributes as parameters --- ## 🚫 Limitations - No reactive state (manual DOM updates) - No Shadow DOM or scoped styles (yet) - Breakpoints in DevTools may behave oddly due to dynamic script loading --- ## 📄 License [MIT4H License](../LICENSE)