# 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)