@swiftwc/ui 0.0.0-dev.86 → 0.0.0-dev.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/generated/components/bordered-button.js +1 -1
- package/generated/components/bordered-prominent-button.js +1 -1
- package/generated/components/borderless-button.js +1 -1
- package/generated/components/date-picker.js +4 -3
- package/generated/components/glass-button.js +1 -1
- package/generated/components/glass-prominent-button.js +1 -1
- package/generated/components/image-view.js +10 -11
- package/generated/components/label-view.js +13 -10
- package/generated/components/labeled-content.js +43 -23
- package/generated/components/menu-view.js +3 -2
- package/generated/components/navigation-title.js +22 -16
- package/generated/components/picker-view.js +13 -8
- package/generated/components/progress-view.js +4 -3
- package/generated/components/scroll-view.js +26 -7
- package/generated/components/section-view.js +33 -17
- package/generated/components/table-view.js +5 -6
- package/generated/components/text-field.js +3 -2
- package/generated/components/toggle-view.js +3 -2
- package/generated/components/tool-bar-item.js +2 -2
- package/generated/internal/utils/ensure-placeholder.d.ts +1 -1
- package/generated/internal/utils/ensure-placeholder.js +8 -9
- package/generated/internal/utils/index.d.ts +0 -3
- package/generated/internal/utils/index.js +0 -3
- package/generated/internal/vendor/morphdom.d.ts +6 -0
- package/generated/internal/vendor/morphdom.js +720 -0
- package/generated/morphdom/html.d.ts +8 -0
- package/generated/morphdom/html.js +37 -0
- package/generated/morphdom/index.d.ts +6 -0
- package/generated/morphdom/index.js +6 -0
- package/generated/morphdom/morph.d.ts +4 -0
- package/generated/morphdom/morph.js +9 -0
- package/generated/morphdom/query-morph.d.ts +5 -0
- package/generated/morphdom/query-morph.js +12 -0
- package/package.json +4 -3
- package/web-components.html-data/en.json +3 -0
- package/generated/internal/utils/render-label-icon.d.ts +0 -2
- package/generated/internal/utils/render-label-icon.js +0 -19
- package/generated/internal/utils/render-label-title.d.ts +0 -2
- package/generated/internal/utils/render-label-title.js +0 -16
- package/generated/internal/utils/render-label.d.ts +0 -1
- package/generated/internal/utils/render-label.js +0 -19
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type RawValue = string | number | boolean | null | undefined | RawValue[];
|
|
2
|
+
export declare class TrustedMarkup {
|
|
3
|
+
readonly value: string;
|
|
4
|
+
constructor(value: string);
|
|
5
|
+
toString(): string;
|
|
6
|
+
}
|
|
7
|
+
export default function (strings: TemplateStringsArray, ...values: (RawValue | TrustedMarkup)[]): TrustedMarkup;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const ESCAPE_MAP = {
|
|
2
|
+
'&': '&',
|
|
3
|
+
'<': '<',
|
|
4
|
+
'>': '>',
|
|
5
|
+
'"': '"',
|
|
6
|
+
"'": ''',
|
|
7
|
+
};
|
|
8
|
+
function escapeHtml(str) {
|
|
9
|
+
return str.replace(/[&<>"']/g, (ch) => ESCAPE_MAP[ch]);
|
|
10
|
+
}
|
|
11
|
+
// values built via `raw` itself are trusted markup; wrap them so `stringify`
|
|
12
|
+
// knows to skip escaping — same idea as lit-html's `unsafeHTML`
|
|
13
|
+
export class TrustedMarkup {
|
|
14
|
+
value;
|
|
15
|
+
constructor(value) {
|
|
16
|
+
this.value = value;
|
|
17
|
+
}
|
|
18
|
+
toString() {
|
|
19
|
+
return this.value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function stringify(value) {
|
|
23
|
+
if (value === null || value === undefined || value === false)
|
|
24
|
+
return '';
|
|
25
|
+
if (value instanceof TrustedMarkup)
|
|
26
|
+
return value.value;
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return value.map(stringify).join('');
|
|
29
|
+
return escapeHtml(String(value));
|
|
30
|
+
}
|
|
31
|
+
export default function (strings, ...values) {
|
|
32
|
+
let out = strings[0];
|
|
33
|
+
for (let i = 0; i < values.length; i++) {
|
|
34
|
+
out += stringify(values[i]) + strings[i + 1];
|
|
35
|
+
}
|
|
36
|
+
return new TrustedMarkup(out.replace(/>\s+</g, '><').trim());
|
|
37
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import morphdom from '../internal/vendor/morphdom';
|
|
2
|
+
export default function (template, fromEl, options) {
|
|
3
|
+
if (!fromEl)
|
|
4
|
+
return;
|
|
5
|
+
morphdom(fromEl, template.toString(), {
|
|
6
|
+
onBeforeElUpdated: (fromEl, toEl) => !fromEl.isEqualNode(toEl),
|
|
7
|
+
onBeforeElChildrenUpdated: (fromEl, toEl) => !toEl.matches('image-view,navigation-title'), // NOTE: image-view will alter it's contents! This is required to not empty it up again!
|
|
8
|
+
});
|
|
9
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { $ } from '../internal/utils';
|
|
2
|
+
import morph from './morph';
|
|
3
|
+
export default function (scopedSelector, template, container, options) {
|
|
4
|
+
if (false === options?.cb?.())
|
|
5
|
+
return;
|
|
6
|
+
if ('boolean' === typeof options?.removeIf && options?.removeIf)
|
|
7
|
+
return container?.querySelector(`:scope>${scopedSelector}`)?.remove();
|
|
8
|
+
const fromEl = container?.querySelector(`:scope>${scopedSelector}`) ?? container?.appendChild($(template.toString(), '>1'));
|
|
9
|
+
if (!fromEl)
|
|
10
|
+
return;
|
|
11
|
+
morph(template, fromEl);
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swiftwc/ui",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.87",
|
|
4
4
|
"description": "Elegant SwiftUI-inspired web components for standalone web apps and web extensions.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -58,17 +58,18 @@
|
|
|
58
58
|
"scripts": {
|
|
59
59
|
"prebuild": "rm -rf generated",
|
|
60
60
|
"build": "npm run build:ts && npm run build:scss && npm run build:manifest && npm run build:barrels",
|
|
61
|
-
"postbuild": "npm run format:write",
|
|
61
|
+
"postbuild": "npm run format:write && vitest run --dom",
|
|
62
62
|
"build:ts:watch": "npm run prebuild && tsc --watch",
|
|
63
63
|
"build:ts": "tsc",
|
|
64
64
|
"build:scss": "sass --style=expanded --no-source-map scss/index.scss generated/css/index.css",
|
|
65
65
|
"build:manifest": "tsx scripts/make-manifest.ts",
|
|
66
|
-
"build:barrels": "npm run build:barrels:components && npm run build:barrels:events && npm run build:barrels:buses && npm run build:barrels:tpl && npm run build:barrels:i18n",
|
|
66
|
+
"build:barrels": "npm run build:barrels:components && npm run build:barrels:events && npm run build:barrels:buses && npm run build:barrels:tpl && npm run build:barrels:morphdom && npm run build:barrels:i18n",
|
|
67
67
|
"build:barrels:components": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --directory ./js/components --exclude \".\\.test\\.ts\"",
|
|
68
68
|
"build:barrels:events": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --directory ./js/events --exclude \".\\.test\\.ts\"",
|
|
69
69
|
"build:barrels:buses": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/buses",
|
|
70
70
|
"build:barrels:i18n": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --fullPathname --directory ./js/i18n/locales",
|
|
71
71
|
"build:barrels:tpl": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/tpl --exclude \".\\.test\\.ts\"",
|
|
72
|
+
"build:barrels:morphdom": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/morphdom --exclude \".\\.test\\.ts\"",
|
|
72
73
|
"build:barrels:decorators": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/internal/decorators",
|
|
73
74
|
"format:check": "prettier . --check",
|
|
74
75
|
"format:write": "prettier . --write",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import $ from './cash';
|
|
2
|
-
export default function (label, systemImage) {
|
|
3
|
-
const img = label.querySelector(':scope>[slot=icon]');
|
|
4
|
-
// image ??= this.appendChild($(`<i slot="icon" style="line-height: 1.05"></i>`, '>1'))
|
|
5
|
-
// image.setAttribute('class', `ph ph-${newValue}`)
|
|
6
|
-
if (systemImage) {
|
|
7
|
-
if (!img) {
|
|
8
|
-
// const newImg = $(`<i slot="icon" style="line-height: 1.05" class="ph ph-${systemImage}"></i>`, '>1')
|
|
9
|
-
const newImg = $(`<image-view slot="icon"></image-view>`, '>1');
|
|
10
|
-
newImg.setAttribute('system-name', systemImage);
|
|
11
|
-
// DOM manipulation last
|
|
12
|
-
label.appendChild(newImg);
|
|
13
|
-
}
|
|
14
|
-
else if (systemImage !== img.getAttribute('system-name'))
|
|
15
|
-
img.setAttribute('system-name', systemImage);
|
|
16
|
-
}
|
|
17
|
-
else
|
|
18
|
-
img?.remove();
|
|
19
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import $ from './cash';
|
|
2
|
-
export default function (label, textContent) {
|
|
3
|
-
const span = label.querySelector(':scope>:not([slot])');
|
|
4
|
-
if (textContent) {
|
|
5
|
-
if (!span) {
|
|
6
|
-
// const newSpan = $(`<span></span>`, '>1')
|
|
7
|
-
// newSpan.textContent = title
|
|
8
|
-
// DOM manipulation last
|
|
9
|
-
label.appendChild(Object.assign($(`<span></span>`, '>1'), { textContent }));
|
|
10
|
-
}
|
|
11
|
-
else if (textContent !== span.textContent)
|
|
12
|
-
span.textContent = textContent;
|
|
13
|
-
}
|
|
14
|
-
else
|
|
15
|
-
span?.remove();
|
|
16
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function (selector: string, template: string, container?: Element, title?: string | null, systemImage?: string | null): void;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import $ from './cash';
|
|
2
|
-
import renderLabelIcon from './render-label-icon';
|
|
3
|
-
import renderLabelTitle from './render-label-title';
|
|
4
|
-
export default function (selector, template, container, title, systemImage) {
|
|
5
|
-
const existing = container?.querySelector(selector);
|
|
6
|
-
if (existing) {
|
|
7
|
-
for (const { name, value } of $(template, '>1').attributes)
|
|
8
|
-
if (!existing.hasAttribute(name))
|
|
9
|
-
existing.setAttribute(name, value);
|
|
10
|
-
renderLabelIcon(existing, systemImage ?? null);
|
|
11
|
-
renderLabelTitle(existing, title ?? null);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
const newLabel = $(template, '>1');
|
|
15
|
-
renderLabelIcon(newLabel, systemImage ?? null);
|
|
16
|
-
renderLabelTitle(newLabel, title ?? null);
|
|
17
|
-
container?.appendChild(newLabel);
|
|
18
|
-
}
|
|
19
|
-
}
|