• Stars
    star
    518
  • Rank 85,414 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 8 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Zero configuration Preact widgets renderer in any host DOM

Build Status Code Coverage downloads version gzip size module formats: umd, cjs, and es Supports Preact and React MIT License

Preact Habitat

A 900 Bytes module for that will make plugging in Preact components and widgets in any CMS or website as fun as lego!

Demos

Login Widget Source Code 💻

Login Widget Integration pen Codepen Demo 🖋

Installation

npm install --save preact-habitat

Core Features

  • 2 ways to passing props from DOM.
  • Multiple rendering options.
  • Light weight ( < 1KB ).
  • Compatible with React widgets through preact-compat.
  • In use in high traffic web applications.

Basic Usage Example

import habitat from 'preact-habitat';
import WidgetAwesome from './components/WidgetAwesome';

const { render } = habitat(WidgetAwesome);

/**
** other selecors options:
**
** ".classname"  for querying DOM element by its class name
**
** "#div-id"  for querying DOM element by its ID value
**
** "[data-attribute-example='widget-here']"  for querying DOM element by its data attribute name & val
**
**/

render({
  selector: '.some-class', // Searches and mounts in <div class="some-class"></div>
  defaultProps: undefined, // Default props for all widgets
  inline: false,
  clean: false,
  clientSpecified: false
});

in webpack.config.js or any other build tool bundle output format should be UMD:

output: {
  libraryTarget: 'umd'
}

in the DOM you'd like to mount your widget in:

<div class="some-class"> <!-- as specified in render, habitat will mount the component in this-->
  <script type="application/json">
    {
      "title": "Widget Title passed as prop",
      "theme": "red",
      "anotherProp": "Thanks for trying this widget out!"
    }
  </script>
</div>

Now, build your production ready preact widget and you're all set, TADA! 🎉

API Docs

habitat(...)

accepts a single Preact component as its only argument

example:
import { h } form 'preact';
import habitat from 'preact-habitat';

const Widget = () => <h1>Hello, World!</h1>;

const { render } = habitat(Widget); // NOTE: pass Widget and not <Widget />

render({
  ...
});

render(options)

render function accepts an options Object which supports the following properties:

option.selector

String: .myclass, #myid, [data-selector="my-data-attr"]

DOM Element selector used to retrieve the DOM elements you want to mount the widget in

option.defaultProps

Object: {} || undefined (default)

Default props to be rendered throughout widgets, you can replace each value declaring props.

option.inline

Boolean: true || false (default)

Set to true if you want to use the parent DOM node as a host for your widget without specifing any selectors.

example:

<div class="beautiful-container">
  <!-- inline set to true will make this widget render in it's parent 
      wrapper class="beautiful-container" without using selector option-->
  <script async src="cdn.preactwidget..."></script>
</div>

option.clean

Boolean: true || false (default)

clean will remove all the innerHTML from the HTMl element the widget will mount in.

example:

if we set the widget to be mounted inside the selector ".beautiful-container" with {clean: true} it will remove the Loading div as soon as it renders.

<div class="beautiful-container">
  <div class="loader">LOADING...</div>
</div>

<script async src="cdn.preactwidget..."></script>

option.clientSpecified

Boolean: true || false (default)

This option allows who ever using the script to specifit the selector which they'd like to mount the widget in

<div class="beautiful-container">
  <div class="loader">LOADING...</div>
</div>

<script async src="cdn.preactwidget..." data-mount-in=".beautiful-container"></script>

Passing Props

There are 2 ways to pass props, either via data-attributes or application/json script tag

via props script

Simply add a <script> tag with type="application/json" or type="text/props" and ensure the content is valid JSON. multiple script tags will be merged together and passed down.

<div class="beautiful-container" data-prop-name="preact habitat" data-prop-version="v3.0.0" data-prop-theme-color="green">
  <script type="application/json">
    {
      "name": "preact habitat",
      "version":"v3.0.0",
      "themeColor": "green"
    }
  </script>
</div>

via data-attribute

the data attribute has to always start with data-prop- examples:

data-prop-name will be available in your component as name

data-prop-version will be available in your component as version

data-prop-theme-color will be available in your component as themeColor NOTE the lowerCamelCase when there's a -

<div class="beautiful-container" data-prop-name="preact habitat" data-prop-version="v3.0.0" data-prop-theme-color="green">
  
</div>

License

MIT - Copyright (c) Zouhir Chahoud

Credits

Artwork By: Oleg Turbaba, Dribble

More Repositories

1

jarvis

A very intelligent browser based Webpack dashboard
JavaScript
5,438
star
2

lqip-loader

Low Quality Image Placeholders (LQIP) for Webpack
JavaScript
1,210
star
3

lqip

Low Quality Image Placeholders (LQIP) Module for Node
JavaScript
433
star
4

preact-phiber

The 3kb alternative to React Fiber with the same API
CSS
30
star
5

lqip-cli

Node CLI for Low Quality Image Placeholders (LQIP)
JavaScript
26
star
6

preact-widgets-boilerplate

A boilerplate for creating portable Preact widgets that can be plugged into any web page!
JavaScript
26
star
7

browser-media-support

Your browser's container formats and codecs support in your pocket.
JavaScript
25
star
8

eslint-config-standard-preact

JavaScript
22
star
9

lqip-loader-example

JavaScript
14
star
10

express-es6-basic-auth-rest-api

JavaScript
13
star
11

matrix-hackernews-client

Preact HN with canvas background rendered off the main thread in a web worker
JavaScript
7
star
12

mojical

JavaScript
6
star
13

mediarecorder-polyfill

JavaScript
4
star
14

pull-to-refresh

JavaScript
4
star
15

blog2

JavaScript
2
star
16

widget-template

JavaScript
2
star
17

devfeeds

JavaScript, Frontend and Engineering Blogs I daily read 📖 ☕
2
star
18

vscode-northem-dark-theme

A north-bluish, dark clean and elegant syntax theme for VS Code
2
star
19

ai-tv

JavaScript
1
star
20

twitter-interactive

CSS
1
star
21

contoso-drive

Responsive dual-screen APIs demo
CSS
1
star
22

preact-widget-scripts

JavaScript
1
star
23

payment-request-demo

Preact \React app demonstrating Web Payments.
JavaScript
1
star
24

http-server-bench

Rust
1
star
25

preact-habitat-youtube

preact-habitat example and demo
JavaScript
1
star