Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hotforfeature/origami
Angular + Polymer
https://github.com/hotforfeature/origami
angular angular2 material-design polymer polymer2 webcomponents
Last synced: 2 days ago
JSON representation
Angular + Polymer
- Host: GitHub
- URL: https://github.com/hotforfeature/origami
- Owner: hotforfeature
- License: mit
- Created: 2017-03-30T20:00:37.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2023-01-03T19:01:33.000Z (about 2 years ago)
- Last Synced: 2024-04-14T19:52:51.218Z (10 months ago)
- Topics: angular, angular2, material-design, polymer, polymer2, webcomponents
- Language: TypeScript
- Size: 2.65 MB
- Stars: 161
- Watchers: 17
- Forks: 33
- Open Issues: 24
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Origami
_Origami is the art of folding paper with angles to form beautiful creations._
Angular + Polymer
[![NPM Package](https://badge.fury.io/js/%40codebakery%2Forigami.svg)](https://www.npmjs.com/package/@codebakery/origami)
[![Test Status](https://saucelabs.com/browser-matrix/codebakery-origami.svg)](https://saucelabs.com/open_sauce/user/codebakery-origami)
## Summary
[Angular and custom elements are BFFs](https://custom-elements-everywhere.com/). With Polymer, there are a few gaps that Origami fills. The library is divided into several modules that can be imported individually to address these gaps.
- [Angular Form Support](forms/README.md)
- [ShadyCSS Support](styles/README.md#shadycss)
- [Style Modules](styles/README.md#style-modules)
- [Polymer `` Stamping](templates/README.md)
- [Polyfill Utilities](polyfills/README.md)To setup Origami, follow these steps:
1. [Install and import](#install) `OrigamiModule`
2. Set up [polyfills](#polyfills)
3. [Prepare dependencies](#prepare-dependencies-es5-only) if targeting ES5
4. Read the [Usage Summary](#usage-summary)## Install
> Upgrading from Origami v2? Follow [this guide](UPGRADE.md).
```sh
npm install @codebakery/origami
```Import each module as described in the links above, or if you need all of the modules you can simply import `OrigamiModule`. Include `CUSTOM_ELEMENTS_SCHEMA` to enable custom elements in Angular templates.
```ts
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule } from '@angular/router';
// If @angular/router is not used, import modules individually
// and use IncludeStylesNoRouterModule instead of IncludeStylesModule.
import { OrigamiModule } from '@codebakery/origami';
import { AppComponent } from './app.component';@NgModule({
imports: [BrowserModule, FormsModule, RouterModule, OrigamiModule],
declarations: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
bootstrap: [AppComponent]
})
export class AppModule {}
```## Polyfills
[Polyfills](polyfills/README.md) are needed to support browsers that do not support all webcomponent features. To quickly set up polyfills, use the Origami CLI.
```sh
npm install @webcomponents/webcomponentsjs
./node_modules/.bin/origami polyfill
```### Wait for WebComponentsReady
Some imports (such as Polymer's `TemplateStamp` mixin) have side effects that require certain features to be immediately available. For example, `TemplateStamp` expects `HTMLTemplateElement` to be defined. These imports should be deferred until after `webcomponentsReady()` resolves.
```ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { webcomponentsReady } from '@codebakery/origami/polyfills';webcomponentsReady()
.then(() => {
// requires "module": "esnext" in tsconfig.json "compilerOptions" and
// "angularCompilerOptions": {
// "entryModule": "app/app.module#AppModule"
// }
return import('./app/app.module');
})
.then(({ AppModule }) => {
platformBrowserDynamic().bootstrapModule(AppModule);
});
```## Prepare Dependencies (ES5 only)
Angular will not transpile `node_modules/`, and a common pattern among webcomponents is to be distributed as ES2015 classes. Use Origami's CLI to effeciently transpile dependencies to ES5 or back to ES2015 before building.
Example:
```sh
origami prepare es5 node_modules/{@polymer/*,@vaadin/*,@webcomponents/shadycss}# to restore to ES2015
origami prepare es2015 node_modules/{@polymer/*,@vaadin/*,@webcomponents/shadycss}# for more info
origami --help
```> Note that `@webcomponents/webcomponentsjs` should _not_ be transpiled. However, `@webcomponents/shadycss` _should_ be if it's used.
The CLI can also restore the previous ES2015 files for projects that compile to both targets.
It is recommended to add a script before `ng build` and `ng serve` tasks in `package.json`.
```json
{
"scripts": {
"prepare:es5": "origami prepare es5 node_modules/{@polymer/*,@vaadin/*,@webcomponents/shadycss}",
"prepare:es2015": "origami prepare es2015 node_modules/{@polymer/*,@vaadin/*,@webcomponents/shadycss}",
"start": "npm run prepare:es5 && ng serve es5App",
"start:es2015": "npm run prepare:es2015 && ng serve es2015App",
"build": "npm run prepare:es5 && ng build es5App --prod",
"build:es2015": "npm run prepare:es2015 && ng build es2015App --prod"
}
}
```## Usage Summary
### [Angular Form Support](forms/README.md)
Add the `origami` attribute to any custom element using `[ngModel]`, `[formControl]` or `[formControlName]`.
> Requires the `@angular/forms` module.
```ts
import { Component } from '@angular/core';
import '@polymer/paper-input/paper-input';@Component({
selector: 'app-component',
template: `
Angular value: {{value}}
`
})
export class AppComponent {
value: string;
}
```### [ShadyCSS Support](styles/README.md#shadycss)
Enables the use of CSS custom properties in Angular styles on browsers that do not support them via [ShadyCSS](https://github.com/webcomponents/shadycss), with some [limitations](styles/README.md#limitations).
```ts
import { Component } from '@angular/core';
import '@polymer/paper-button/paper-button';@Component({
selector: 'app-component',
styles: [
`
paper-button {
--paper-button-ink-color: blue;
}
`
],
template: `
Blue Ink!
`
})
export class AppComponent {}
```### [Style Modules](styles/README.md#style-modules)
Allows for [style modules](https://www.polymer-project.org/3.0/docs/devguide/style-shadow-dom#style-modules) defined in Polymer to be injected into Angular components.
> Requires the `@angular/router` module. Use `IncludeStylesNoRouterModule` if `@angular/router` is not used.
```ts
import { Component } from '@angular/core';
import { IncludeStyles } from '@codebakery/origami/styles';
import '@polymer/iron-flex-layout/iron-flex-layout-classes';@IncludeStyles('iron-flex')
@Component({
selector: 'app-component',
styles: [':host { display: block; }'], // See Limitations
template: `
Column 1
Column 2
`
})
export class AppComponent {}
```### [Polymer `` Stamping](templates/README.md)
Call `polymerHost()` and add it to the providers for a component that uses Polymer's data binding syntax in `` elements. Add `ngNonBindable` to all `` elements.
```ts
import { Component } from '@angular/core';
import { polymerHost } from '@codebakery/origami/templates';
import '@polymer/iron-list/iron-list';@Component({
selector: 'app-component',
template: `
[[getLabel(item)]]
`,
providers: [polymerHost(AppComponent)]
})
export class AppComponent {
items = [1, 2, 3];getLabel(item: number) {
return `# ${item}`;
}itemClicked(event: Event) {
console.log(event);
}
}
```