omim
Version:
Material Design for Omi.
362 lines (282 loc) • 8.35 kB
Markdown
# Omim
Cross **frameworks** and **themes** components by [Omi](https://github.com/Tencent/omi).
* [DOCS & REPL](https://tencent.github.io/omi/packages/omim/docs/build/index.html)

## Features
* Render by Custom Elements of Web Components
* Any framework can use the components, such as Omi, React, Preact, Vue and Angular
* Support both JSX and native HTML elements
* Each element can be used independently
* Super easy to change theme colors, fonts and rounded corners
* Extended HTML capabilities, you can pass false attributes to elements through string `'0'` or string `'false'`
## Cross Frameworks
* [Using Omim in Omi](https://tencent.github.io/omi/packages/omim/demos/icon-button/omi.html) & [Source Code](https://github.com/Tencent/omi/blob/master/packages/omim/demos/icon-button/omi.js)
* [Using Omim in React](https://tencent.github.io/omi/packages/omim/test-react/build/index.html) & [Source Code](https://github.com/Tencent/omi/blob/master/packages/omim/test-react/src/HookTest.js)
* [Using Omim in Vue](https://tencent.github.io/omi/packages/omim/test-vue/dist/index.html) & [Source Code](https://github.com/Tencent/omi/blob/master/packages/omim/test-vue/app.vue)
## Usage
### Via script
```html
<script src="https://unpkg.com/omi"></script>
<script src="https://unpkg.com/omim@latest/button/index.js"></script>
<m-button>I am button</m-button>
```
### Via npm
``` bash
npm install omim
```
Then:
```js
import 'omim/button'
```
Then use the element in Omi, React, Vue or Angular:
``` html
<m-button>I am button</m-button>
```
It can also be used in pure js:
```js
var button = document.createElement('m-button')
button.innerHTML = 'I am button'
document.body.append(button)
button.addEventListener('click', function () {
console.log('Clicked!')
})
//or
//document.body.innerHTML = '<m-button>I am button</m-button>'
```
## Change Theme
```js
document.body.style.setProperty('--mdc-theme-primary', 'red')
document.body.style.setProperty('--mdc-theme-secondary', 'blue')
document.body.style.setProperty('--mdc-shape-small-component-radius', '2px')
```
All the config:
```
--mdc-theme-primary: #0072d9;
--mdc-theme-secondary: #2170b8;
--mdc-theme-error: #f5222d;
--mdc-theme-surface: #ffffff;
--mdc-theme-on-primary: #ffffff;
--mdc-theme-on-secondary: #ffffff;
--mdc-theme-on-error: #ffffff;
--mdc-theme-on-surface: #000000;
--mdc-theme-background: #ffffff;
--mdc-shape-small-component-radius: 4px;
--mdc-shape-medium-component-radius: 4px;
--mdc-shape-large-component-radius: 0px;
--mdc-typography--font-family: Roboto, sans-serif;
```
## HTML Extention
You can set boolean prop to false from markup by 0 or false string.
```js
define('my-element', class extends WeElement {
static defaultProps = {
show: true
}
static propTypes = {
show: Boolean
}
render(props) {
...
...
}
})
```
Use:
```html
<my-element show="false"></my-element>
```
or
```html
<my-element show="0"></my-element>
```
## Usage in Vue
```html
<script>
import 'omim/icon-button'
export default {
name: 'HelloWorld',
data: function() {
return {
result: false
}
},
methods: {
myEvent: function(evt) {
this.result = evt.detail.isOn
}
}
}
</script>
<template>
<div class="component">
<p>The switch is {{result? 'on' : 'off'}}</p>
<m-icon-button color="red" icons="['favorite', 'favorite_border']" @change="myEvent"></m-icon-button>
</div>
</template>
```
## Usage in Preact
```jsx
import { useState } from 'preact'
import 'omim/icon-button'
export default function SomeComponent(props) {
const [result, setSwitch] = useState(false)
return (
<div>
<p>The switch is {result ? 'on' : 'off'}</p>
<m-icon-button color="red" icons="['favorite', 'favorite_border']" onChange={e => setSwitch(e.detail.isOn)}>
</m-icon-button>
</div>
)
}
```
## Usage in React
```jsx
/** @jsx nativeEvents */
import nativeEvents from 'jsx-native-events'
import { useState } from 'react'
import 'omim/icon-button'
export default function SomeComponent(props) {
const [result, setSwitch] = useState(false)
return (
<div>
<p>The switch is {result ? 'on' : 'off'}</p>
<m-icon-button color="red" icons="['favorite', 'favorite_border']" onEventChange={e => setSwitch(e.detail.isOn)}>
</m-icon-button>
</div>
)
}
```
Many thanks to calebdwilliams's [jsx-native-events](https://github.com/calebdwilliams/jsx-native-events#readme).
> Note that in order to display icon in react or vue app, you need to put this in HTML:
```html
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
```
## Contribution
### CMD
Build component:
```bash
npm run build -- component-name
```
Build all components:
```bash
npm run build-all
```
Build demo:
```bash
npm start demo-name
```
Publish:
```bash
npm publish --access public
```
To prevent duplication of development, PR submission fills in owner to lock the component.
为了防止重复开发,先 PR 提交填下 owner 锁定该组件。
| **Components** | **Owner** | **State** |
| ------------------------------- | ----------------------------------- |----------------------------------- |
| button | member |done |
| icon | member |done |
| text-field | member |done |
| card | wscats |done |
| chip | hulei |done |
| dialog | zainchen |done |
| elevation | liulinboyi |done |
| image-list| member |done |
| checkbox| member |done |
| radio| lihengjun |done |
| select| member |done |
| slider| member |done |
| switch| zainchen |done |
| layout-grid| member |done |
| linear-progress| member |done |
| list| zainchen |done |
| menu| member|done |
| snackbar| member |done |
| tab | FAKER-A |done |
| tag | mtonhuang |done |
| top-app-bar| zainchen |done |
| typography| member |done |
| drawer | zainchen |done |
| badge | member |done |
| fab | member |done |
| icon-button | member |done |
| toolbar | hulei |done |
| avatar | member |done |
| tree | member |done |
| table | member |done |
| nav | member |done |
| action-sheet | member |done |
| row | member |done |
| chart bar| member |done |
| chart line| member |done |
| chart scatter| member |done |
| chart pie| member |done |
| chart doughnut| member |done |
| chart radar| member |done |
| chart polar area| member |done |
| chart bubble| member |done |
| chart bar line| member |done |
| pagination| member |done |
| color-picker| member |done |
| loading |member| done |
| path-progress | member | done |
| popover | member | done |
| rate | member | done|
| step | member | done |
| toast | member | done|
| paper | zainchen | done|
| transfer list | member | done|
| editor | member | done|
| input (lable,button)| | |
| input-number | | |
| input-table | | |
| bottom nav | member | done|
| expansion | member | done |
| toggle buttons | member | done|
| locate | member | done|
| player | 132yse | done|
| finger | member | done |
| scroll | member | done |
| welcome to add a new element! | |
| welcome to add a new element! | |
| welcome to add a new element! | |
## Todo
### TypeScript Auto Complete(todo)
```jsx
interface ButtonProps {
href?: string,
disabled?: boolean,
type?: 'default' | 'primary' | 'danger',
onClick?: (e: any) => void
}
const TAG = 'm-button'
declare global {
namespace JSX {
interface IntrinsicElements {
[TAG]: Omi.Props & ButtonProps
}
}
}
@tag(TAG)
export default class Button extends WeElement<ButtonProps, {}> {
...
...
...
```
### Omim Page Templates(todo)
[Coming!](https://github.com/Tencent/omi/tree/master/packages/omim/templates)
### Bug?(todo)
```js
import Button from '@import/core/button'
```
The above code cannot register custom elements.
```js
import '@import/core/button'
```
The above code can register custom elements.
Why??
### Links
* [material.io docs](https://material.io/develop/web/components/buttons/)
* [material.io demo](https://material-components.github.io/material-components-web-catalog/#/)
* [material-theme-builder](https://material-theme-builder.glitch.me/)
* [material-components-web](https://github.com/material-components/material-components-web)
* [material-icons](https://material.io/tools/icons/?style=baseline)