The document discusses a presentation by Knut Herrmann on building custom HTML tags (web components) using vanilla JavaScript. It provides examples of creating a <domino-view> web component that can render Notes/Domino views by defining custom element classes, handling attributes and properties, adding events, using shadow DOM, templates, and deployment strategies. The presentation suggests the HCL or Domino community could create a set of reusable Domino-based web components like <domino-view>, <domino-form>, <domino-datetime-field>, etc. to improve frontend development.
23. CollabSphere 2019
Woburn, MA | October 28-30
23
<domino-view>
attributes
events
properties
events
<domino-view
db="myDb"
view="myView">
</domino-view>
<script>
document
.querySelector("domino-view")
.addEventListener(
"handleRowClick",
event => doSomethingWith(event.detail)
);
</script>
Custom Elements
24. CollabSphere 2019
Woburn, MA | October 28-30
24
<domino-view>
attributes
properties
events
class DominoElement extends HTMLElement {
handleRowClick = (rowData) =>
this.dispatchEvent(
new CustomEvent("handleRowClick",
{detail: rowData}));
render = () =>
this._isConnected &&
/* render Domino view here */
...
handleRowClick={this.handleRowClick}
...
Custom Elements
events
25. CollabSphere 2019
Woburn, MA | October 28-30
25
<domino-view>
attributes
properties
events
<domino-form>
attributes
properties
events
application
demo 5
Custom Elements
events
26. CollabSphere 2019
Woburn, MA | October 28-30
26
Shadow DOM
encapsulates custom components
by hidden separated DOM
27. CollabSphere 2019
Woburn, MA | October 28-30
27
https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM
Shadow DOM
28. CollabSphere 2019
Woburn, MA | October 28-30
28
isolated DOM
simple CSS selectors
cheap style checks
fast
Shadow DOM
29. CollabSphere 2019
Woburn, MA | October 28-30
29
class DominoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: 'open'});
}
Shadow DOM
30. CollabSphere 2019
Woburn, MA | October 28-30
30
.domino-view__header-row {
color: var(--header-color);
}
<style>
domino-view {
height: 300px;
color: blue;
--header-color: green;
}
</style>
<domino-view … ></domino-view>
shadow host
shadow DOM
CSS custom properties
User defined styles overwrite
custom element’s styles
Shadow DOM
31. CollabSphere 2019
Woburn, MA | October 28-30
31
:host {
all: initial;
display: block;
height: 100%;
}
:host([hidden]) {
display: none;
}
Inheritable styles
(background, color, font, line-height, etc.)
continue to inherit in shadow DOM
unlessshadow DOM
demo 6
Shadow DOM
32. CollabSphere 2019
Woburn, MA | October 28-30
32
Templates
placeholder for declaring the structure
of a custom element
33. CollabSphere 2019
Woburn, MA | October 28-30
33
parsed once
instantiated during
runtime any number of
times
Templates
34. CollabSphere 2019
Woburn, MA | October 28-30
34
const template = document.createElement('template');
template.innerHTML = `
<style>:host { ... }</style>
<h2>This is an example for Templates.</h2>
<slot></slot>
<p>Content...</p>
`;
class DominoElement extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: 'open'});
this.shadowRoot.appendChild(
template.content.cloneNode(true));
}
Templates
35. CollabSphere 2019
Woburn, MA | October 28-30
35
const template = document.createElement('template');
template.innerHTML = `
<style>:host { ... }</style>
<h2>This is an example for Templates.</h2>
<slot></slot>
<p>Content...</p>
`;
<domino-view ...>
<b>This will be placed into slot.</b>
</domino-view>
demo 7
Templates
36. CollabSphere 2019
Woburn, MA | October 28-30
36
Deployment
…
<script type="module"
src="https://server/WebComponents.nsf/domino-view.js">
</script>
demo XPages
… or publishing on NPM
38. CollabSphere 2019
Woburn, MA | October 28-30
38
Compatibility
Use Web Components
Build Web Components
*
*
*with workarounds/limitations now – better in future releases https://custom-elements-everywhere.com/
39. CollabSphere 2019
Woburn, MA | October 28-30
39
https://www.polymer-project.org/
Tools for Web Component development
https://stenciljs.com/
40. CollabSphere 2019
Woburn, MA | October 28-30
Production ready free Web components
40
…
https://vaadin.com/components
43. CollabSphere 2019
Woburn, MA | October 28-30
43
Suggestion: HCL or community
creates a cool set of Web Components
<domino-view>
<domino-datetime-field>
<domino-form>
<domino-folder>
<domino-agent>
<domino-what-ever>
<domino-login>
<domino-for-ever>
<domino-richtext-field>