@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.
Files changed (41) hide show
  1. package/generated/components/bordered-button.js +1 -1
  2. package/generated/components/bordered-prominent-button.js +1 -1
  3. package/generated/components/borderless-button.js +1 -1
  4. package/generated/components/date-picker.js +4 -3
  5. package/generated/components/glass-button.js +1 -1
  6. package/generated/components/glass-prominent-button.js +1 -1
  7. package/generated/components/image-view.js +10 -11
  8. package/generated/components/label-view.js +13 -10
  9. package/generated/components/labeled-content.js +43 -23
  10. package/generated/components/menu-view.js +3 -2
  11. package/generated/components/navigation-title.js +22 -16
  12. package/generated/components/picker-view.js +13 -8
  13. package/generated/components/progress-view.js +4 -3
  14. package/generated/components/scroll-view.js +26 -7
  15. package/generated/components/section-view.js +33 -17
  16. package/generated/components/table-view.js +5 -6
  17. package/generated/components/text-field.js +3 -2
  18. package/generated/components/toggle-view.js +3 -2
  19. package/generated/components/tool-bar-item.js +2 -2
  20. package/generated/internal/utils/ensure-placeholder.d.ts +1 -1
  21. package/generated/internal/utils/ensure-placeholder.js +8 -9
  22. package/generated/internal/utils/index.d.ts +0 -3
  23. package/generated/internal/utils/index.js +0 -3
  24. package/generated/internal/vendor/morphdom.d.ts +6 -0
  25. package/generated/internal/vendor/morphdom.js +720 -0
  26. package/generated/morphdom/html.d.ts +8 -0
  27. package/generated/morphdom/html.js +37 -0
  28. package/generated/morphdom/index.d.ts +6 -0
  29. package/generated/morphdom/index.js +6 -0
  30. package/generated/morphdom/morph.d.ts +4 -0
  31. package/generated/morphdom/morph.js +9 -0
  32. package/generated/morphdom/query-morph.d.ts +5 -0
  33. package/generated/morphdom/query-morph.js +12 -0
  34. package/package.json +4 -3
  35. package/web-components.html-data/en.json +3 -0
  36. package/generated/internal/utils/render-label-icon.d.ts +0 -2
  37. package/generated/internal/utils/render-label-icon.js +0 -19
  38. package/generated/internal/utils/render-label-title.d.ts +0 -2
  39. package/generated/internal/utils/render-label-title.js +0 -16
  40. package/generated/internal/utils/render-label.d.ts +0 -1
  41. 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
+ '<': '&lt;',
4
+ '>': '&gt;',
5
+ '"': '&quot;',
6
+ "'": '&#39;',
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,6 @@
1
+ export { default as html } from './html';
2
+ export * from './html';
3
+ export { default as morph } from './morph';
4
+ export * from './morph';
5
+ export { default as queryMorph } from './query-morph';
6
+ export * from './query-morph';
@@ -0,0 +1,6 @@
1
+ export { default as html } from './html';
2
+ export * from './html';
3
+ export { default as morph } from './morph';
4
+ export * from './morph';
5
+ export { default as queryMorph } from './query-morph';
6
+ export * from './query-morph';
@@ -0,0 +1,4 @@
1
+ import type { TrustedMarkup } from './html';
2
+ export default function (template: TrustedMarkup, fromEl?: Element, options?: {
3
+ cb: () => void;
4
+ }): void;
@@ -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,5 @@
1
+ import type { TrustedMarkup } from './html';
2
+ export default function (scopedSelector: string, template: TrustedMarkup, container?: Element, options?: {
3
+ cb?: () => boolean;
4
+ removeIf?: boolean;
5
+ }): void;
@@ -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.86",
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",
@@ -420,6 +420,9 @@
420
420
  {
421
421
  "name": "navigation-inline-subtitle"
422
422
  },
423
+ {
424
+ "name": "navigation-icon"
425
+ },
423
426
  {
424
427
  "name": "navigation-bar-title-display-mode"
425
428
  }
@@ -1,2 +0,0 @@
1
- import type { LabelView } from '../../components';
2
- export default function (label: LabelView, systemImage: string | null): void;
@@ -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,2 +0,0 @@
1
- import type { LabelView } from '../../components';
2
- export default function (label: LabelView, textContent: string | null): void;
@@ -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
- }