Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Important: starcounter-include component was designed for Starcounter 2 family and no longer supported in Starcounter 3. There will be no further development or improvements.

<starcounter-include> Build Status

<starcounter-include> is a custom element that lets you load partial HTML views into your Starcounter page, it uses

  • <imported-template> - You can take full control over loaded <script>s and <link rel="import">s. Thanks to HTML Imports - caching, script execution, etc. is completely native.

You can use Shadow DOM v1 features to apply Document Fragment with custom HTML composition and slots to tune the presentation of HTML Elements given by the partial HTML view. It lets you blend and apply your desired look & feel to elements given by your and even other apps - which were mixed due to Starcounter mappings.

For more details see articles:

Kinds of compositions

<starcounter-include> recognizes 4 kinds of HTML compositions:

  • Fallback composition - a single <style>:host{display: block;}</style><slot></slot> to display all things from light DOM in case no composition was provided
  • Default composition - composition (or multiple concatenated compositions) found in the partial HTML view (<template is="declarative-shadow-dom"> part)
  • Parent composition - composition found in the parent HTML view (content of <starcounter-include ...><template is="declarative-shadow-dom" presentation="parent">). It's used to enforce by parent view a given composition for any kind of elements.
  • Custom composition - stored composition provided in JSON by BlendingProvider
  • Temporary composition - explicit composition set directly in the shadow root of starcounter-include (for example by Chrome DevTools or <starcounter-layout-html-editor> in BlendingEditor)

Small sample

If you have /app/sub/page/path.html:

<template><h1>Hello {{username}}</h1></template>

and merged/blended JSON view-model

SubPageViewModel={App: {username: "World"Html: "/app/sub/page/path.html"}}

You can put it on screen with

<starcounter-includeview-model="{{ SubPageViewModel }}"></starcounter-include>

To produce

<h1>Hello World</h1>

Related custom elements

Features

  • Applies two-way databinding, even for nested asynchronously loaded <polymer-element>s,
  • Multiple (concatenated) templates per partial HTML view,
  • Polymer's <template> features (binding, repeat, if, etc.),
  • HTML Imports features:
  • Sends request for template only once (HTML Import's caching),
  • Supports <script>, <link>, <style> tags to be executed once,
  • Supports <script>, <style> tags per template instance,
  • Easy way to attach presentation expressed in declarative Shadow DOM,
  • Blocks rendering of Shadow DOM until <link rel="stylesheet">s are loaded, unless loaded asynchronously (see below).

High-level docs

You can read more on Blendable Web Apps in Starcounter docs

Partial HTML views limitations

  • It should be W3C compliant Document body,
  • It should contain at least one <template> tag in root node.

Partial JSON view-model conventions

  • View-model contains Html property with path to file (:construction:, or just inline markup).

Install

Starcounter has it already pre-installed, under /sys/starcounter-include/starcounter-include.html, but if you want to use it separately as well.

Install the component using Bower:

$ bower install starcounter-include --save

Or download as ZIP.

Usage

  1. Import Web Components' polyfill (if needed):

    <scriptsrc="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  2. Import Custom Element:

    <linkrel="import" href="bower_components/starcounter-include/starcounter-include.html">
  3. Start using it!

    <starcounter-includeview-model="{{ViewModel}}"></starcounter-include>

    or without mustache-style data-binding:

    document.querySelector("starcounter-include").viewModel=ViewModel;

    or with inline JSON:

    <starcounter-includeview-model="{&quot;Html&quot;: &quot;/path/to/file.html&quot;, &quot;some&quot;: &quot;data&quot;}"></starcounter-include>

Attributes

AttributeOptionsDefaultDescription
partialJSONSet to provide partial JSON view-model. It's also a partial property.
partial-idStringRead-only attribute that represents PartialID fetched from partial JSON. It's also a partialId property.
view-modelJSONAlias for partial
compositionStringRead-only attribute that reflects currently used composition kind

Properties

PropertyOptionsDefaultDescription
partialObjectObject containing partial JSON view-model, bindable with Polymer
partialIdStringPartial Id used to identify partial, usually it's fetched from partial.{compositionProvider}.PartialId.
viewModelObjectAlias for partial
compositionProviderStringCompositionProvider_0Key/app name of composition provider. could be overwritten per instance scInclude.compositionProvider or globally by changing the prototype, like: customElements.get('starcounter-include').prototype.compositionProvider = 'CustomProvider_7'

Events

NameDetailDescription
starcounter-include-composition-savedString stored compositionTriggered once composition is saved
partial-changedObject{value: storedComposition, path: 'partial.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
view-model-changedObject{value: storedComposition, path: 'viewModel.{compositionProvider}.Composition'}Polymer notification protocol compliant event to notify about partial.{compositionProvider}.Composition change, triggered once composition is saved.
presentation-loadednoneWhen all links from a stamped presentation finished loading (with success or failure).

Render-blocking links

To mimic native behavior of markup for Declarative Shadow DOM and to avoid FOUC the element will "block rendering" until all <link rel="stylesheet">s are loaded or throw an error.

You can opt-out by using the same technique you can use to asynchronously load the stylesheet into a static document:

<linkrel="preload" href="/path/to/styles.css" as="style" onload="this.rel='stylesheet'">

The blocked rendering is achieved by setting visibility: hidden on shadow host - <strcounter-include> element.

Test suite

Caveats

ShadyCSS

In browsers with Shadow DOM polyfilled using ShadyDOM and ShadyCSS, styles may still leak. This seems to be related to the limitation in the polyfill and its API.

  • it does not cover Vanilla JS custom elements automatically and API does not provide sufficient methods to cover our case,
  • shadow roots provided without template (compositions from DB) and different for every instance of the element seems not to be covered by polyfill at all,
  • style scoping methods that transform HTML markup seems to be broken when element is being upgraded. ShadyCSS is going to be refactored soon, so we prefer to wait with heavy workarounds.

Please prepare your selectors more carefully. Feel free to report issues with your specific use-cases. We will try to provide a solution that works now, and make sure we will eventually cover them in a nice way.

History

For detailed changelog, check Releases.

License

MIT

About

Custom Element to include HTML partials/templates from Starcounter

Topics

Resources

Contributing

Stars

0 stars

Watchers

23 watching

Forks

Releases

Packages

Used by

Contributors

Languages