@swiftwc/ui 0.0.0-dev.1 → 0.0.0-dev.100
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/README.md +15 -0
- package/generated/buses/alert-dialog.d.ts +2 -0
- package/generated/buses/alert-dialog.js +1 -0
- package/generated/buses/confirmation-dialog.d.ts +2 -0
- package/generated/buses/confirmation-dialog.js +1 -0
- package/generated/buses/index.d.ts +6 -0
- package/generated/buses/index.js +6 -0
- package/generated/buses/lifecycle-observer.d.ts +2 -0
- package/generated/buses/lifecycle-observer.js +1 -0
- package/generated/client/index.d.ts +30 -2
- package/generated/client/index.js +279 -8
- package/generated/components/alert-dialog.d.ts +11 -0
- package/generated/components/alert-dialog.js +102 -0
- package/generated/components/body-view.d.ts +13 -0
- package/generated/components/body-view.js +17 -0
- package/generated/components/bordered-button.d.ts +17 -0
- package/generated/components/bordered-button.js +56 -0
- package/generated/components/bordered-prominent-button.d.ts +17 -0
- package/generated/components/bordered-prominent-button.js +56 -0
- package/generated/components/borderless-button.d.ts +17 -0
- package/generated/components/borderless-button.js +56 -0
- package/generated/components/color-scheme.d.ts +12 -0
- package/generated/components/color-scheme.js +54 -0
- package/generated/components/confirmation-dialog.d.ts +12 -0
- package/generated/components/confirmation-dialog.js +116 -0
- package/generated/components/content-unavailable.d.ts +30 -0
- package/generated/components/content-unavailable.js +82 -0
- package/generated/components/date-picker.d.ts +52 -0
- package/generated/components/date-picker.js +480 -0
- package/generated/components/disclosure-group.d.ts +17 -0
- package/generated/components/disclosure-group.js +66 -0
- package/generated/components/fine-tooltip.d.ts +15 -0
- package/generated/components/fine-tooltip.js +111 -0
- package/generated/components/form-view.d.ts +16 -0
- package/generated/components/form-view.js +65 -0
- package/generated/components/glass-button.d.ts +16 -0
- package/generated/components/glass-button.js +53 -0
- package/generated/components/glass-prominent-button.d.ts +16 -0
- package/generated/components/glass-prominent-button.js +53 -0
- package/generated/components/h-stack.d.ts +22 -0
- package/generated/components/h-stack.js +26 -0
- package/generated/components/image-view.d.ts +18 -0
- package/generated/components/image-view.js +68 -0
- package/generated/components/index.d.ts +47 -1
- package/generated/components/index.js +47 -6
- package/generated/components/label-view.d.ts +27 -0
- package/generated/components/label-view.js +87 -0
- package/generated/components/labeled-content.d.ts +33 -0
- package/generated/components/labeled-content.js +161 -0
- package/generated/components/list-view.d.ts +15 -0
- package/generated/components/list-view.js +22 -0
- package/generated/components/menu-view.d.ts +20 -0
- package/generated/components/menu-view.js +140 -0
- package/generated/components/navigation-large-title.d.ts +18 -0
- package/generated/components/navigation-large-title.js +188 -0
- package/generated/components/navigation-split-view.d.ts +15 -0
- package/generated/components/navigation-split-view.js +25 -0
- package/generated/components/navigation-stack.d.ts +15 -0
- package/generated/components/navigation-stack.js +29 -0
- package/generated/components/navigation-title.d.ts +18 -0
- package/generated/components/navigation-title.js +72 -0
- package/generated/components/picker-view.d.ts +68 -0
- package/generated/components/picker-view.js +1153 -0
- package/generated/components/plain-button.d.ts +7 -0
- package/generated/components/plain-button.js +22 -0
- package/generated/components/progress-view.d.ts +20 -0
- package/generated/components/progress-view.js +125 -0
- package/generated/components/screen-view.d.ts +5 -0
- package/generated/components/screen-view.js +11 -0
- package/generated/components/scroll-view-proxy.d.ts +13 -0
- package/generated/components/scroll-view-proxy.js +17 -0
- package/generated/components/scroll-view.d.ts +22 -0
- package/generated/components/scroll-view.js +237 -0
- package/generated/components/search-view.d.ts +12 -0
- package/generated/components/search-view.js +27 -0
- package/generated/components/section-view.d.ts +21 -0
- package/generated/components/section-view.js +64 -0
- package/generated/components/sheet-view.d.ts +11 -0
- package/generated/components/sheet-view.js +45 -0
- package/generated/components/sidebar-toggle.d.ts +15 -0
- package/generated/components/sidebar-toggle.js +88 -0
- package/generated/components/sidebar-view.d.ts +10 -0
- package/generated/components/sidebar-view.js +37 -0
- package/generated/components/sticky-container.d.ts +11 -0
- package/generated/components/sticky-container.js +26 -0
- package/generated/components/tab-bar.d.ts +10 -0
- package/generated/components/tab-bar.js +40 -0
- package/generated/components/tab-item.d.ts +10 -0
- package/generated/components/tab-item.js +134 -0
- package/generated/components/tab-view.d.ts +31 -0
- package/generated/components/tab-view.js +198 -0
- package/generated/components/table-view.d.ts +26 -0
- package/generated/components/table-view.js +161 -0
- package/generated/components/text-field.d.ts +42 -0
- package/generated/components/text-field.js +526 -0
- package/generated/components/toggle-view.d.ts +43 -0
- package/generated/components/toggle-view.js +371 -0
- package/generated/components/tool-bar-item-group.d.ts +13 -0
- package/generated/components/tool-bar-item-group.js +31 -0
- package/generated/components/tool-bar-item.d.ts +16 -0
- package/generated/components/tool-bar-item.js +69 -0
- package/generated/components/tool-bar.d.ts +26 -0
- package/generated/components/tool-bar.js +95 -0
- package/generated/components/v-keyboard.d.ts +18 -0
- package/generated/components/v-keyboard.js +87 -0
- package/generated/components/v-stack.d.ts +25 -0
- package/generated/components/v-stack.js +29 -0
- package/generated/css/index.css +10644 -0
- package/generated/events/alert-dialog.d.ts +13 -0
- package/generated/events/alert-dialog.js +1 -0
- package/generated/events/confirmation-dialog.d.ts +14 -0
- package/generated/events/confirmation-dialog.js +1 -0
- package/generated/events/date-picker.d.ts +13 -0
- package/generated/events/date-picker.js +1 -0
- package/generated/events/index.d.ts +9 -0
- package/generated/events/index.js +9 -0
- package/generated/events/lifecycle-observer.d.ts +18 -0
- package/generated/events/lifecycle-observer.js +1 -0
- package/generated/events/picker-view.d.ts +29 -0
- package/generated/events/picker-view.js +1 -0
- package/generated/events/scroll-view.d.ts +18 -0
- package/generated/events/scroll-view.js +1 -0
- package/generated/events/tab-view.d.ts +54 -0
- package/generated/events/tab-view.js +1 -0
- package/generated/events/text-field.d.ts +13 -0
- package/generated/events/text-field.js +1 -0
- package/generated/events/toggle-view.d.ts +14 -0
- package/generated/events/toggle-view.js +1 -0
- package/generated/i18n/index.d.ts +33 -0
- package/generated/i18n/index.js +164 -0
- package/generated/i18n/locales/el.d.ts +16 -0
- package/generated/i18n/locales/el.js +16 -0
- package/generated/i18n/locales/en.d.ts +16 -0
- package/generated/i18n/locales/en.js +16 -0
- package/generated/i18n/locales/index.d.ts +4 -0
- package/generated/i18n/locales/index.js +4 -0
- package/generated/index.js +1 -1
- package/generated/internal/class/cleanup-registry.d.ts +5 -0
- package/generated/internal/class/cleanup-registry.js +38 -0
- package/generated/internal/class/css-style-observer.d.ts +8 -0
- package/generated/internal/class/css-style-observer.js +26 -0
- package/generated/internal/class/form-associated-base.d.ts +16 -0
- package/generated/internal/class/form-associated-base.js +78 -0
- package/generated/internal/class/mutation-observer-set.d.ts +9 -0
- package/generated/internal/class/mutation-observer-set.js +42 -0
- package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
- package/generated/internal/class/mutation-observer-singleton.js +64 -0
- package/generated/internal/class/navigation-path.d.ts +15 -0
- package/generated/internal/class/navigation-path.js +84 -0
- package/generated/internal/class/navigation-view.d.ts +8 -0
- package/generated/internal/class/navigation-view.js +72 -0
- package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
- package/generated/internal/class/resize-observer-singleton.js +22 -0
- package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
- package/generated/internal/decorators/adaptive-slot.js +50 -0
- package/generated/internal/decorators/custom-element.d.ts +5 -0
- package/generated/internal/decorators/custom-element.js +5 -0
- package/generated/internal/decorators/index.d.ts +6 -0
- package/generated/internal/decorators/index.js +6 -0
- package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
- package/generated/internal/decorators/microtask-on-connected.js +67 -0
- package/generated/internal/privateNamespace.d.ts +14 -0
- package/generated/internal/privateNamespace.js +168 -0
- package/generated/internal/utils/add.d.ts +1 -0
- package/generated/internal/utils/add.js +7 -0
- package/generated/internal/utils/cash/ancestors.d.ts +1 -0
- package/generated/internal/utils/cash/ancestors.js +27 -0
- package/generated/internal/utils/cash/index.d.ts +24 -0
- package/generated/internal/utils/cash/index.js +27 -0
- package/generated/internal/utils/cash/next-all.d.ts +1 -0
- package/generated/internal/utils/cash/next-all.js +10 -0
- package/generated/internal/utils/cash/next.d.ts +1 -0
- package/generated/internal/utils/cash/next.js +9 -0
- package/generated/internal/utils/cash/prev-all.d.ts +1 -0
- package/generated/internal/utils/cash/prev-all.js +10 -0
- package/generated/internal/utils/cash/prev.d.ts +1 -0
- package/generated/internal/utils/cash/prev.js +9 -0
- package/generated/internal/utils/cash/prop.d.ts +18 -0
- package/generated/internal/utils/cash/prop.js +30 -0
- package/generated/internal/utils/cash/siblings.d.ts +1 -0
- package/generated/internal/utils/cash/siblings.js +10 -0
- package/generated/internal/utils/clamp.d.ts +1 -0
- package/generated/internal/utils/clamp.js +4 -0
- package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
- package/generated/internal/utils/compare-big-decimals.js +80 -0
- package/generated/internal/utils/css-time.d.ts +1 -0
- package/generated/internal/utils/css-time.js +3 -0
- package/generated/internal/utils/debounce.d.ts +1 -0
- package/generated/internal/utils/debounce.js +13 -0
- package/generated/internal/utils/define-translations.d.ts +1 -0
- package/generated/internal/utils/define-translations.js +3 -0
- package/generated/internal/utils/dev-flags.d.ts +3 -0
- package/generated/internal/utils/dev-flags.js +5 -0
- package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
- package/generated/internal/utils/ensure-placeholder.js +41 -0
- package/generated/internal/utils/frame.d.ts +1 -0
- package/generated/internal/utils/frame.js +6 -0
- package/generated/internal/utils/index.d.ts +20 -1
- package/generated/internal/utils/index.js +23 -1
- package/generated/internal/utils/is-inside.d.ts +1 -0
- package/generated/internal/utils/is-inside.js +4 -0
- package/generated/internal/utils/kebab-case.d.ts +1 -1
- package/generated/internal/utils/kebab-case.js +6 -9
- package/generated/internal/utils/list-active.d.ts +7 -0
- package/generated/internal/utils/list-active.js +83 -0
- package/generated/internal/utils/microtask.d.ts +1 -0
- package/generated/internal/utils/microtask.js +3 -0
- package/generated/internal/utils/onoff.d.ts +45 -0
- package/generated/internal/utils/onoff.js +31 -0
- package/generated/internal/utils/set.d.ts +1 -0
- package/generated/internal/utils/set.js +7 -0
- package/generated/internal/utils/sleep.d.ts +1 -0
- package/generated/internal/utils/sleep.js +3 -0
- package/generated/internal/utils/slow-hide-show.d.ts +1 -0
- package/generated/internal/utils/slow-hide-show.js +16 -0
- package/generated/internal/utils/timeout.d.ts +5 -0
- package/generated/internal/utils/timeout.js +16 -0
- package/generated/internal/utils/touch-glass.d.ts +7 -0
- package/generated/internal/utils/touch-glass.js +19 -0
- package/generated/internal/vendor/morphdom.d.ts +6 -0
- package/generated/internal/vendor/morphdom.js +720 -0
- package/generated/morphdom/index.d.ts +8 -0
- package/generated/morphdom/index.js +8 -0
- package/generated/morphdom/morph.d.ts +4 -0
- package/generated/morphdom/morph.js +10 -0
- package/generated/morphdom/query-morph.d.ts +5 -0
- package/generated/morphdom/query-morph.js +12 -0
- package/generated/morphdom/render-to-string.d.ts +12 -0
- package/generated/morphdom/render-to-string.js +48 -0
- package/generated/morphdom/unsafe-html.d.ts +2 -0
- package/generated/morphdom/unsafe-html.js +4 -0
- package/generated/namespace-browser/base.d.ts +45 -0
- package/generated/namespace-browser/base.js +115 -0
- package/generated/namespace-browser/event.d.ts +10 -0
- package/generated/namespace-browser/event.js +1 -0
- package/generated/namespace-browser/index.d.ts +7 -0
- package/generated/namespace-browser/index.js +1 -0
- package/generated/snapshot/index.d.ts +9 -0
- package/generated/snapshot/index.js +60 -0
- package/generated/tpl/html.d.ts +5 -0
- package/generated/tpl/html.js +7 -0
- package/generated/tpl/index.d.ts +6 -0
- package/generated/tpl/index.js +6 -0
- package/generated/tpl/is-template-result.d.ts +3 -0
- package/generated/tpl/is-template-result.js +1 -0
- package/generated/tpl/render.d.ts +2 -0
- package/generated/tpl/render.js +132 -0
- package/package.json +49 -8
- package/scss/_base.scss +5 -0
- package/scss/_components.scss +90 -0
- package/scss/_final.scss +1 -0
- package/scss/_functions.scss +31 -0
- package/scss/_maps.scss +293 -0
- package/scss/_mixins.scss +7 -0
- package/scss/_placeholders.scss +3 -0
- package/scss/_transitions.scss +32 -0
- package/scss/_utils.scss +9 -0
- package/scss/_vars.scss +68 -0
- package/scss/base/_layout.scss +66 -0
- package/scss/base/_reboot.scss +191 -0
- package/scss/base/_root.scss +415 -0
- package/scss/colors/_index.scss +881 -0
- package/scss/components/_alert-dialog.scss +111 -0
- package/scss/components/_body-view.scss +17 -0
- package/scss/components/_bordered-button.scss +59 -0
- package/scss/components/_bordered-prominent-button.scss +65 -0
- package/scss/components/_borderless-button.scss +45 -0
- package/scss/components/_confirmation-dialog.scss +102 -0
- package/scss/components/_content-unavailable.scss +57 -0
- package/scss/components/_date-picker.scss +30 -0
- package/scss/components/_detail-placeholder.scss +153 -0
- package/scss/components/_disclosure-group.scss +179 -0
- package/scss/components/_fine-tooltip.scss +84 -0
- package/scss/components/_form-view.scss +234 -0
- package/scss/components/_full-screen.scss +15 -0
- package/scss/components/_glass-button.scss +61 -0
- package/scss/components/_glass-prominent-button.scss +71 -0
- package/scss/components/_group-box.scss +27 -0
- package/scss/components/_h-divider.scss +13 -0
- package/scss/components/_h-flex-stack.scss +23 -0
- package/scss/components/_h-stack.scss +28 -0
- package/scss/components/_image-view.scss +20 -0
- package/scss/components/_index.scss +264 -0
- package/scss/components/_label-view copy.scss.txt +420 -0
- package/scss/components/_label-view.scss +371 -0
- package/scss/components/_label-view.scss.txt +536 -0
- package/scss/components/_labeled-content.scss +75 -0
- package/scss/components/_list-view.scss +270 -0
- package/scss/components/_menu-view.scss +223 -0
- package/scss/components/_navigation-large-title.scss +44 -0
- package/scss/components/_navigation-split-view.scss +424 -0
- package/scss/components/_navigation-stack.scss +11 -0
- package/scss/components/_navigation-title.scss +10 -0
- package/scss/components/_picker-view.scss +329 -0
- package/scss/components/_plain-button.scss +19 -0
- package/scss/components/_progress-view.scss +98 -0
- package/scss/components/_scroll-view-proxy.scss +81 -0
- package/scss/components/_scroll-view-toolbars.scss +132 -0
- package/scss/components/_scroll-view.scss +134 -0
- package/scss/components/_search-view.scss +23 -0
- package/scss/components/_section-view.scss +120 -0
- package/scss/components/_sheet-view.scss +103 -0
- package/scss/components/_sidebar-toggle.scss +121 -0
- package/scss/components/_sidebar-view.scss +53 -0
- package/scss/components/_sticky-container.scss +42 -0
- package/scss/components/_tab-bar.scss +268 -0
- package/scss/components/_tab-item.scss +25 -0
- package/scss/components/_tab-view.scss +312 -0
- package/scss/components/_table-column.scss +54 -0
- package/scss/components/_table-row.scss +240 -0
- package/scss/components/_table-view.scss +232 -0
- package/scss/components/_text-field.scss +57 -0
- package/scss/components/_text-view.scss +57 -0
- package/scss/components/_toggle-view.scss +161 -0
- package/scss/components/_tool-bar-item-group.scss +48 -0
- package/scss/components/_tool-bar-item.scss +97 -0
- package/scss/components/_tool-bar.scss +153 -0
- package/scss/components/_v-divider.scss +13 -0
- package/scss/components/_v-flex-stack.scss +29 -0
- package/scss/components/_v-keyboard.scss +14 -0
- package/scss/components/_v-stack.scss +24 -0
- package/scss/final/_touch-glass.scss +98 -0
- package/scss/index.scss +18 -1
- package/scss/mixins/_button.scss +44 -0
- package/scss/mixins/_color.scss +16 -0
- package/scss/mixins/_dialog.scss +89 -0
- package/scss/mixins/_index.scss +473 -0
- package/scss/placeholders/_buttons.scss +118 -0
- package/scss/placeholders/_lists.scss +622 -0
- package/scss/transitions/_alert-dialog.scss +18 -0
- package/scss/transitions/_bwd.navbar.scss +19 -0
- package/scss/transitions/_bwd.scss +39 -0
- package/scss/transitions/_confirmation-dialog.scss +27 -0
- package/scss/transitions/_disclosure-group.scss +35 -0
- package/scss/transitions/_fine-tooltip.scss +21 -0
- package/scss/transitions/_fwd.navbar.scss +41 -0
- package/scss/transitions/_fwd.scss +24 -0
- package/scss/transitions/_glass-button.scss +12 -0
- package/scss/transitions/_glass-prominent-button.scss +12 -0
- package/scss/transitions/_index.scss +74 -0
- package/scss/transitions/_menu-view.scss +28 -0
- package/scss/transitions/_navigation-split-view.scss +23 -0
- package/scss/transitions/_progress-view.scss +23 -0
- package/scss/transitions/_sheet-view.scss +30 -0
- package/scss/transitions/_sidebar-view.scss +36 -0
- package/scss/transitions/_tab-bar.scss +20 -0
- package/scss/utils/_frame.scss +103 -0
- package/scss/utils/_index.scss +54 -0
- package/scss/utils/_scroll-view.scss +14 -0
- package/scss/utils/_spacing.scss +25 -0
- package/scss/utils/_stacks.scss +112 -0
- package/web-components.css-data/en.json +28 -0
- package/web-components.html-data/en.json +2604 -0
- package/generated/internal/snapshot.d.ts +0 -5
- package/generated/internal/snapshot.js +0 -23
- package/generated/styles.css +0 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as morph } from './morph';
|
|
2
|
+
export * from './morph';
|
|
3
|
+
export { default as queryMorph } from './query-morph';
|
|
4
|
+
export * from './query-morph';
|
|
5
|
+
export { default as renderToString } from './render-to-string';
|
|
6
|
+
export * from './render-to-string';
|
|
7
|
+
export { default as unsafeHtml } from './unsafe-html';
|
|
8
|
+
export * from './unsafe-html';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as morph } from './morph';
|
|
2
|
+
export * from './morph';
|
|
3
|
+
export { default as queryMorph } from './query-morph';
|
|
4
|
+
export * from './query-morph';
|
|
5
|
+
export { default as renderToString } from './render-to-string';
|
|
6
|
+
export * from './render-to-string';
|
|
7
|
+
export { default as unsafeHtml } from './unsafe-html';
|
|
8
|
+
export * from './unsafe-html';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import morphdom from '../internal/vendor/morphdom';
|
|
2
|
+
import renderToString from './render-to-string';
|
|
3
|
+
export default function (markup, fromEl, options) {
|
|
4
|
+
if (!fromEl)
|
|
5
|
+
return;
|
|
6
|
+
morphdom(fromEl, renderToString(markup).toString(), {
|
|
7
|
+
onBeforeElUpdated: (fromEl, toEl) => !fromEl.isEqualNode(toEl),
|
|
8
|
+
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!
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -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, '>1'));
|
|
9
|
+
if (!fromEl)
|
|
10
|
+
return;
|
|
11
|
+
morph(template, fromEl);
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type TemplateResult } from '../tpl';
|
|
2
|
+
export declare class TrustedMarkup {
|
|
3
|
+
readonly value: string;
|
|
4
|
+
constructor(value: string);
|
|
5
|
+
toString(): string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Flatten a TemplateResult (from `html`) into an escaped TrustedMarkup
|
|
9
|
+
* string. Use this only at morph/queryMorph call sites — anywhere feeding
|
|
10
|
+
* `render()` should keep passing the raw TemplateResult straight through.
|
|
11
|
+
*/
|
|
12
|
+
export default function renderToString(template: TemplateResult): TrustedMarkup;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isTemplateResult } from '../tpl';
|
|
2
|
+
// morph.ts and queryMorph.ts only need something with `.toString()` that
|
|
3
|
+
// yields a safe, escaped HTML string — this is that, built on top of the
|
|
4
|
+
// same TemplateResult instead of a separate tag function.
|
|
5
|
+
// values built via `raw` itself are trusted markup; wrap them so `stringify`
|
|
6
|
+
// knows to skip escaping — same idea as lit-html's `unsafeHTML`
|
|
7
|
+
export class TrustedMarkup {
|
|
8
|
+
value;
|
|
9
|
+
constructor(value) {
|
|
10
|
+
this.value = value;
|
|
11
|
+
}
|
|
12
|
+
toString() {
|
|
13
|
+
return this.value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const ESCAPE_MAP = {
|
|
17
|
+
'&': '&',
|
|
18
|
+
'<': '<',
|
|
19
|
+
'>': '>',
|
|
20
|
+
'"': '"',
|
|
21
|
+
"'": ''',
|
|
22
|
+
};
|
|
23
|
+
function escapeHtml(str) {
|
|
24
|
+
return str.replace(/[&<>"']/g, (ch) => ESCAPE_MAP[ch]);
|
|
25
|
+
}
|
|
26
|
+
function stringifyValue(value) {
|
|
27
|
+
if (value === null || value === undefined || value === false)
|
|
28
|
+
return '';
|
|
29
|
+
if (value instanceof TrustedMarkup)
|
|
30
|
+
return value.value;
|
|
31
|
+
if (isTemplateResult(value))
|
|
32
|
+
return renderToString(value).value;
|
|
33
|
+
if (Array.isArray(value))
|
|
34
|
+
return value.map(stringifyValue).join('');
|
|
35
|
+
return escapeHtml(String(value));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Flatten a TemplateResult (from `html`) into an escaped TrustedMarkup
|
|
39
|
+
* string. Use this only at morph/queryMorph call sites — anywhere feeding
|
|
40
|
+
* `render()` should keep passing the raw TemplateResult straight through.
|
|
41
|
+
*/
|
|
42
|
+
export default function renderToString(template) {
|
|
43
|
+
let out = template.strings[0];
|
|
44
|
+
for (let i = 0; i < template.values.length; i++) {
|
|
45
|
+
out += stringifyValue(template.values[i]) + template.strings[i + 1];
|
|
46
|
+
}
|
|
47
|
+
return new TrustedMarkup(out.replace(/>\s+</g, '><').trim());
|
|
48
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare abstract class DialogBase extends HTMLDialogElement {
|
|
2
|
+
static polyfillExtends: "dialog";
|
|
3
|
+
static polyfillConnectedCallback(el: HTMLDialogElement): void;
|
|
4
|
+
static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
|
|
5
|
+
static polyfillAttributeChangedCallback(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
6
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
7
|
+
disconnectedCallback(): void;
|
|
8
|
+
connectedCallback(): void;
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class InputBase extends HTMLInputElement {
|
|
11
|
+
static polyfillExtends: "input";
|
|
12
|
+
static polyfillConnectedCallback(el: HTMLInputElement): void;
|
|
13
|
+
static polyfillDisconnectedCallback(el: HTMLInputElement): void;
|
|
14
|
+
static polyfillAttributeChangedCallback(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
15
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
16
|
+
disconnectedCallback(): void;
|
|
17
|
+
connectedCallback(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare abstract class ButtonBase extends HTMLButtonElement {
|
|
20
|
+
static polyfillExtends: "button";
|
|
21
|
+
static polyfillConnectedCallback(el: HTMLButtonElement): void;
|
|
22
|
+
static polyfillDisconnectedCallback(el: HTMLButtonElement): void;
|
|
23
|
+
static polyfillAttributeChangedCallback(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
24
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
25
|
+
disconnectedCallback(): void;
|
|
26
|
+
connectedCallback(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare abstract class DetailsBase extends HTMLDetailsElement {
|
|
29
|
+
static polyfillExtends: "details";
|
|
30
|
+
static polyfillConnectedCallback(el: HTMLDetailsElement): void;
|
|
31
|
+
static polyfillDisconnectedCallback(el: HTMLDetailsElement): void;
|
|
32
|
+
static polyfillAttributeChangedCallback(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
33
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
34
|
+
disconnectedCallback(): void;
|
|
35
|
+
connectedCallback(): void;
|
|
36
|
+
}
|
|
37
|
+
export declare abstract class FormBase extends HTMLFormElement {
|
|
38
|
+
static polyfillExtends: "form";
|
|
39
|
+
static polyfillConnectedCallback(el: HTMLFormElement): void;
|
|
40
|
+
static polyfillDisconnectedCallback(el: HTMLFormElement): void;
|
|
41
|
+
static polyfillAttributeChangedCallback(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
42
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
connectedCallback(): void;
|
|
45
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
export class DialogBase extends HTMLDialogElement {
|
|
2
|
+
static polyfillExtends = 'dialog';
|
|
3
|
+
static polyfillConnectedCallback(el) { }
|
|
4
|
+
static polyfillDisconnectedCallback(el) { }
|
|
5
|
+
static polyfillAttributeChangedCallback(entries) { } //MutationRecord[]) {}
|
|
6
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
7
|
+
const ctor = this.constructor;
|
|
8
|
+
const entry = {
|
|
9
|
+
attributeName: name,
|
|
10
|
+
oldValue,
|
|
11
|
+
target: this,
|
|
12
|
+
};
|
|
13
|
+
ctor.polyfillAttributeChangedCallback([entry]);
|
|
14
|
+
}
|
|
15
|
+
disconnectedCallback() {
|
|
16
|
+
const ctor = this.constructor;
|
|
17
|
+
ctor.polyfillDisconnectedCallback(this);
|
|
18
|
+
}
|
|
19
|
+
connectedCallback() {
|
|
20
|
+
const ctor = this.constructor;
|
|
21
|
+
ctor.polyfillConnectedCallback(this);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class InputBase extends HTMLInputElement {
|
|
25
|
+
static polyfillExtends = 'input';
|
|
26
|
+
static polyfillConnectedCallback(el) { }
|
|
27
|
+
static polyfillDisconnectedCallback(el) { }
|
|
28
|
+
static polyfillAttributeChangedCallback(entries) { } //MutationRecord[]) {}
|
|
29
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
30
|
+
const ctor = this.constructor;
|
|
31
|
+
const entry = {
|
|
32
|
+
attributeName: name,
|
|
33
|
+
oldValue,
|
|
34
|
+
target: this,
|
|
35
|
+
};
|
|
36
|
+
ctor.polyfillAttributeChangedCallback([entry]);
|
|
37
|
+
}
|
|
38
|
+
disconnectedCallback() {
|
|
39
|
+
const ctor = this.constructor;
|
|
40
|
+
ctor.polyfillDisconnectedCallback(this);
|
|
41
|
+
}
|
|
42
|
+
connectedCallback() {
|
|
43
|
+
const ctor = this.constructor;
|
|
44
|
+
ctor.polyfillConnectedCallback(this);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class ButtonBase extends HTMLButtonElement {
|
|
48
|
+
static polyfillExtends = 'button';
|
|
49
|
+
static polyfillConnectedCallback(el) { }
|
|
50
|
+
static polyfillDisconnectedCallback(el) { }
|
|
51
|
+
static polyfillAttributeChangedCallback(entries) { } //MutationRecord[]) {}
|
|
52
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
53
|
+
const ctor = this.constructor;
|
|
54
|
+
const entry = {
|
|
55
|
+
attributeName: name,
|
|
56
|
+
oldValue,
|
|
57
|
+
target: this,
|
|
58
|
+
};
|
|
59
|
+
ctor.polyfillAttributeChangedCallback([entry]);
|
|
60
|
+
}
|
|
61
|
+
disconnectedCallback() {
|
|
62
|
+
const ctor = this.constructor;
|
|
63
|
+
ctor.polyfillDisconnectedCallback(this);
|
|
64
|
+
}
|
|
65
|
+
connectedCallback() {
|
|
66
|
+
const ctor = this.constructor;
|
|
67
|
+
ctor.polyfillConnectedCallback(this);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class DetailsBase extends HTMLDetailsElement {
|
|
71
|
+
static polyfillExtends = 'details';
|
|
72
|
+
static polyfillConnectedCallback(el) { }
|
|
73
|
+
static polyfillDisconnectedCallback(el) { }
|
|
74
|
+
static polyfillAttributeChangedCallback(entries) { } //MutationRecord[]) {}
|
|
75
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
76
|
+
const ctor = this.constructor;
|
|
77
|
+
const entry = {
|
|
78
|
+
attributeName: name,
|
|
79
|
+
oldValue,
|
|
80
|
+
target: this,
|
|
81
|
+
};
|
|
82
|
+
ctor.polyfillAttributeChangedCallback([entry]);
|
|
83
|
+
}
|
|
84
|
+
disconnectedCallback() {
|
|
85
|
+
const ctor = this.constructor;
|
|
86
|
+
ctor.polyfillDisconnectedCallback(this);
|
|
87
|
+
}
|
|
88
|
+
connectedCallback() {
|
|
89
|
+
const ctor = this.constructor;
|
|
90
|
+
ctor.polyfillConnectedCallback(this);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class FormBase extends HTMLFormElement {
|
|
94
|
+
static polyfillExtends = 'form';
|
|
95
|
+
static polyfillConnectedCallback(el) { }
|
|
96
|
+
static polyfillDisconnectedCallback(el) { }
|
|
97
|
+
static polyfillAttributeChangedCallback(entries) { } //MutationRecord[]) {}
|
|
98
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
99
|
+
const ctor = this.constructor;
|
|
100
|
+
const entry = {
|
|
101
|
+
attributeName: name,
|
|
102
|
+
oldValue,
|
|
103
|
+
target: this,
|
|
104
|
+
};
|
|
105
|
+
ctor.polyfillAttributeChangedCallback([entry]);
|
|
106
|
+
}
|
|
107
|
+
disconnectedCallback() {
|
|
108
|
+
const ctor = this.constructor;
|
|
109
|
+
ctor.polyfillDisconnectedCallback(this);
|
|
110
|
+
}
|
|
111
|
+
connectedCallback() {
|
|
112
|
+
const ctor = this.constructor;
|
|
113
|
+
ctor.polyfillConnectedCallback(this);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TypedEventTargetMethods<M> {
|
|
2
|
+
addEventListener: {
|
|
3
|
+
<K extends keyof M>(type: K, listener: (this: HTMLElement, ev: M[K] extends Event ? M[K] : never) => void, options?: boolean | AddEventListenerOptions): void;
|
|
4
|
+
(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
|
|
5
|
+
};
|
|
6
|
+
removeEventListener: {
|
|
7
|
+
<K extends keyof M>(type: K, listener: (this: HTMLElement, ev: M[K] extends Event ? M[K] : never) => void, options?: boolean | EventListenerOptions): void;
|
|
8
|
+
(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type WebComponentCtor = typeof HTMLElement & {
|
|
2
|
+
observedAttributes?: string[];
|
|
3
|
+
polyfillExtends?: string;
|
|
4
|
+
polyfillConnectedCallback(el: HTMLElement): void;
|
|
5
|
+
polyfillDisconnectedCallback(el: HTMLElement): void;
|
|
6
|
+
polyfillAttributeChangedCallback?(entries: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class Snapshot {
|
|
2
|
+
#private;
|
|
3
|
+
static get breakpoints(): ReadonlyMap<string, boolean> | undefined;
|
|
4
|
+
static on: EventTarget;
|
|
5
|
+
static readonly waitReady: Promise<[void, void]>;
|
|
6
|
+
static waitReadyFor<T extends HTMLElement>(element: T): Promise<T | null>;
|
|
7
|
+
static get config(): Record<string, string> | undefined;
|
|
8
|
+
static setOwnConfig(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { devFlags, onoff } from '../internal/utils';
|
|
2
|
+
export class Snapshot {
|
|
3
|
+
static #readyCalled = false;
|
|
4
|
+
static #config;
|
|
5
|
+
static #listeners;
|
|
6
|
+
static #breakpoints;
|
|
7
|
+
static get breakpoints() {
|
|
8
|
+
return this.#breakpoints;
|
|
9
|
+
}
|
|
10
|
+
static on = new EventTarget();
|
|
11
|
+
static waitReady = Promise.all([
|
|
12
|
+
'complete' === document.readyState ? Promise.resolve() : new Promise((r) => self.addEventListener('load', () => r(), { once: true })),
|
|
13
|
+
(async () => {
|
|
14
|
+
if (!this.#readyCalled)
|
|
15
|
+
await this.setOwnConfig();
|
|
16
|
+
})(), // Lazy config read promise, triggered on first access
|
|
17
|
+
]);
|
|
18
|
+
static async waitReadyFor(element) {
|
|
19
|
+
if (!element.isConnected)
|
|
20
|
+
return null;
|
|
21
|
+
await this.waitReady;
|
|
22
|
+
return element.isConnected ? element : null;
|
|
23
|
+
}
|
|
24
|
+
static get config() {
|
|
25
|
+
return this.#config;
|
|
26
|
+
}
|
|
27
|
+
static async setOwnConfig() {
|
|
28
|
+
if (!this.#readyCalled)
|
|
29
|
+
this.#readyCalled = true;
|
|
30
|
+
if ('complete' !== document.readyState)
|
|
31
|
+
await new Promise((r) => self.addEventListener('load', r, { once: true }));
|
|
32
|
+
this.#getOwnConfig();
|
|
33
|
+
}
|
|
34
|
+
static #getOwnConfig() {
|
|
35
|
+
const style = self.getComputedStyle(document.documentElement, '::before'), content = style.getPropertyValue('content'), unquoted = content.replace(/^"(.*)"$/, '$1'); // Remove quotes around the content
|
|
36
|
+
try {
|
|
37
|
+
this.#config = Object.fromEntries(new URLSearchParams(unquoted).entries()); // {"none": ""}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
console.error('could-not-parse-config');
|
|
41
|
+
}
|
|
42
|
+
for (const off of this.#listeners ?? [])
|
|
43
|
+
off?.();
|
|
44
|
+
this.#listeners = new Set();
|
|
45
|
+
const mediaQueryList = self.matchMedia(`(pointer: fine) and (min-width: ${this.#config['ipad-sheet-view-inline-size']}) and (min-height: ${this.#config['ipad-sheet-view-height']})`);
|
|
46
|
+
this.#breakpoints = new Map([['fine_dialog_sheet', mediaQueryList.matches]]);
|
|
47
|
+
this.#listeners.add(onoff('change', (evt) => this.#handleMediaChange(evt, 'fine_dialog_sheet:change'), mediaQueryList).on());
|
|
48
|
+
if (devFlags.debug)
|
|
49
|
+
console.debug(this.#config);
|
|
50
|
+
}
|
|
51
|
+
static #handleMediaChange = ({ type, matches, media }, kind) => {
|
|
52
|
+
if (devFlags.debug)
|
|
53
|
+
console.debug(`${Snapshot.name} ⚡️ ${type}`);
|
|
54
|
+
this.#breakpoints?.set('fine_dialog_sheet', matches);
|
|
55
|
+
this.on.dispatchEvent(new MediaQueryListEvent(kind, {
|
|
56
|
+
matches,
|
|
57
|
+
media,
|
|
58
|
+
}));
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Purely structural — captures strings/values as-is. render.ts relies on
|
|
2
|
+
// `strings` identity (TemplateStringsArray) for its template cache, so this
|
|
3
|
+
// must stay exactly this shape: no wrapping, no cloning, no new object
|
|
4
|
+
// allocation beyond the literal { strings, values }.
|
|
5
|
+
export default function (strings, ...values) {
|
|
6
|
+
return { strings, values };
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default (v) => !!v && typeof v === 'object' && 'strings' in v && 'values' in v;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// --- Template preparation (runs ONCE per unique template literal) -----
|
|
2
|
+
const MARKER = '\uD83D\uDD25PART\uD83D\uDD25'; // unlikely-collision sentinel
|
|
3
|
+
const templateCache = new WeakMap();
|
|
4
|
+
function prepare(strings) {
|
|
5
|
+
let cached = templateCache.get(strings);
|
|
6
|
+
if (cached)
|
|
7
|
+
return cached;
|
|
8
|
+
const partDescriptors = [];
|
|
9
|
+
let htmlStr = '';
|
|
10
|
+
strings.forEach((chunk, i) => {
|
|
11
|
+
htmlStr += chunk;
|
|
12
|
+
if (i < strings.length - 1) {
|
|
13
|
+
// Is this interpolation inside an attribute value?
|
|
14
|
+
// e.g. `...aria-checked="${...}"` — chunk ends with `attr="` or `attr='` or `attr=`
|
|
15
|
+
const attrMatch = /([a-zA-Z0-9_-]+)=(["']?)$/.exec(chunk);
|
|
16
|
+
if (attrMatch) {
|
|
17
|
+
partDescriptors.push({ type: 'attr', name: attrMatch[1] });
|
|
18
|
+
htmlStr += MARKER; // becomes the attribute's value
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
partDescriptors.push({ type: 'child' });
|
|
22
|
+
// start/end comment pair — gives us a stable region to patch later,
|
|
23
|
+
// and room to grow into list/array rendering without a redesign
|
|
24
|
+
htmlStr += `<!--${MARKER}-->`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
const element = document.createElement('template');
|
|
29
|
+
element.innerHTML = htmlStr;
|
|
30
|
+
cached = { element, partDescriptors };
|
|
31
|
+
templateCache.set(strings, cached);
|
|
32
|
+
return cached;
|
|
33
|
+
}
|
|
34
|
+
const instanceCache = new WeakMap();
|
|
35
|
+
function createInstance(prepared) {
|
|
36
|
+
const fragment = prepared.element.content.cloneNode(true);
|
|
37
|
+
const parts = [];
|
|
38
|
+
// Walk the clone once, in the same order `prepare()` emitted markers,
|
|
39
|
+
// and bind each descriptor to a real node.
|
|
40
|
+
const walker = document.createTreeWalker(fragment, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT);
|
|
41
|
+
let descriptorIndex = 0;
|
|
42
|
+
const descriptors = prepared.partDescriptors;
|
|
43
|
+
let node;
|
|
44
|
+
while ((node = walker.nextNode())) {
|
|
45
|
+
if (descriptorIndex >= descriptors.length)
|
|
46
|
+
break;
|
|
47
|
+
if (node.nodeType === Node.COMMENT_NODE && node.data === MARKER) {
|
|
48
|
+
parts.push({ type: 'child', anchor: node, nodes: [], committed: undefined });
|
|
49
|
+
descriptorIndex++;
|
|
50
|
+
}
|
|
51
|
+
else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
52
|
+
const el = node;
|
|
53
|
+
for (const attr of Array.from(el.attributes)) {
|
|
54
|
+
if (attr.value === MARKER) {
|
|
55
|
+
const desc = descriptors[descriptorIndex];
|
|
56
|
+
if (desc.type === 'attr') {
|
|
57
|
+
parts.push({ type: 'attr', el, name: desc.name, committed: undefined });
|
|
58
|
+
descriptorIndex++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { fragment, parts };
|
|
65
|
+
}
|
|
66
|
+
// --- Committing values into parts (the only thing that runs per update) -
|
|
67
|
+
function isTemplateResult(v) {
|
|
68
|
+
return !!v && typeof v === 'object' && 'strings' in v && 'values' in v;
|
|
69
|
+
}
|
|
70
|
+
function toNode(value) {
|
|
71
|
+
if (value instanceof Node)
|
|
72
|
+
return value;
|
|
73
|
+
if (isTemplateResult(value)) {
|
|
74
|
+
const { fragment, parts } = createInstance(prepare(value.strings));
|
|
75
|
+
parts.forEach((part, i) => {
|
|
76
|
+
const v = value.values[i];
|
|
77
|
+
part.type === 'child' ? commitChild(part, v) : commitAttr(part, v);
|
|
78
|
+
});
|
|
79
|
+
return fragment;
|
|
80
|
+
}
|
|
81
|
+
return document.createTextNode(String(value));
|
|
82
|
+
}
|
|
83
|
+
function commitChild(part, value) {
|
|
84
|
+
if (value === part.committed)
|
|
85
|
+
return; // dirty-check, skip untouched parts
|
|
86
|
+
for (const n of part.nodes)
|
|
87
|
+
n.remove();
|
|
88
|
+
const nodes = [];
|
|
89
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
90
|
+
if (item === null || item === undefined || item === false)
|
|
91
|
+
continue;
|
|
92
|
+
const node = toNode(item);
|
|
93
|
+
const inserted = node instanceof DocumentFragment ? Array.from(node.childNodes) : [node];
|
|
94
|
+
part.anchor.before(node);
|
|
95
|
+
nodes.push(...inserted);
|
|
96
|
+
}
|
|
97
|
+
part.nodes = nodes;
|
|
98
|
+
part.committed = value;
|
|
99
|
+
}
|
|
100
|
+
function commitAttr(part, value) {
|
|
101
|
+
if (value === part.committed)
|
|
102
|
+
return;
|
|
103
|
+
if (value === null || value === undefined || value === false) {
|
|
104
|
+
part.el.removeAttribute(part.name);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
part.el.setAttribute(part.name, String(value));
|
|
108
|
+
}
|
|
109
|
+
part.committed = value;
|
|
110
|
+
}
|
|
111
|
+
// --- Public render() ----------------------------------------------------
|
|
112
|
+
export default function (result, container) {
|
|
113
|
+
const prepared = prepare(result.strings);
|
|
114
|
+
let instance = instanceCache.get(container);
|
|
115
|
+
if (!instance || instance.strings !== result.strings) {
|
|
116
|
+
// first render, OR the template shape changed entirely — full (re)build
|
|
117
|
+
container.textContent = '';
|
|
118
|
+
const { fragment, parts } = createInstance(prepared);
|
|
119
|
+
container.append(fragment);
|
|
120
|
+
instance = { strings: result.strings, fragmentRoot: fragment, parts };
|
|
121
|
+
instanceCache.set(container, instance);
|
|
122
|
+
}
|
|
123
|
+
// same template shape as last time → patch existing DOM nodes only,
|
|
124
|
+
// no innerHTML, no re-clone, no focus/scroll loss
|
|
125
|
+
instance.parts.forEach((part, i) => {
|
|
126
|
+
const value = result.values[i];
|
|
127
|
+
if (part.type === 'child')
|
|
128
|
+
commitChild(part, value);
|
|
129
|
+
else
|
|
130
|
+
commitAttr(part, value);
|
|
131
|
+
});
|
|
132
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swiftwc/ui",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
4
|
-
"description": "Elegant SwiftUI-inspired web components for
|
|
3
|
+
"version": "0.0.0-dev.100",
|
|
4
|
+
"description": "Elegant SwiftUI-inspired web components for standalone web apps and web extensions.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -15,10 +15,16 @@
|
|
|
15
15
|
"url": "git+https://github.com/swiftwc/ui.git",
|
|
16
16
|
"directory": "packages/ui"
|
|
17
17
|
},
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/swiftwc/ui/issues"
|
|
20
|
+
},
|
|
18
21
|
"files": [
|
|
19
22
|
"generated",
|
|
20
|
-
"scss"
|
|
23
|
+
"scss",
|
|
24
|
+
"web-components.html-data",
|
|
25
|
+
"web-components.css-data"
|
|
21
26
|
],
|
|
27
|
+
"sass": "scss/index.scss",
|
|
22
28
|
"keywords": [
|
|
23
29
|
"components",
|
|
24
30
|
"ui",
|
|
@@ -38,18 +44,53 @@
|
|
|
38
44
|
"types": "./generated/client/index.d.ts",
|
|
39
45
|
"default": "./generated/client/index.js"
|
|
40
46
|
},
|
|
41
|
-
"./
|
|
47
|
+
"./events": {
|
|
48
|
+
"types": "./generated/events/index.d.ts",
|
|
49
|
+
"default": "./generated/events/index.js"
|
|
50
|
+
},
|
|
51
|
+
"./css": "./generated/css/index.css",
|
|
52
|
+
"./scss": "./scss/index.scss",
|
|
53
|
+
"./scss/*": "./scss/*.scss",
|
|
54
|
+
"./customElements/en": "./custom-elements/en.json",
|
|
55
|
+
"./webComponentsHTMLData/en": "./web-components.html-data/en.json",
|
|
56
|
+
"./webComponentsCSSData/en": "./web-components.css-data/en.json"
|
|
42
57
|
},
|
|
43
58
|
"bin": {
|
|
44
59
|
"swiftwc": "./generated/index.js"
|
|
45
60
|
},
|
|
46
61
|
"scripts": {
|
|
47
62
|
"prebuild": "rm -rf generated",
|
|
48
|
-
"build": "npm run build:ts && npm run build:scss",
|
|
63
|
+
"build": "npm run build:ts && npm run build:scss && npm run build:manifest && npm run build:barrels",
|
|
64
|
+
"postbuild": "npm run format:write && vitest run --dom",
|
|
65
|
+
"build:ts:watch": "npm run prebuild && tsc --watch",
|
|
49
66
|
"build:ts": "tsc",
|
|
50
|
-
"build:scss": "sass --no-source-map scss/index.scss generated/
|
|
67
|
+
"build:scss": "sass --style=expanded --no-source-map scss/index.scss generated/css/index.css",
|
|
68
|
+
"build:manifest": "tsx scripts/make-manifest.ts && prettier ./web-components.html-data/en.json && prettier ./web-components.css-data/en.json --write",
|
|
69
|
+
"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",
|
|
70
|
+
"build:barrels:components": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --directory ./js/components --exclude \".\\.test\\.ts\"",
|
|
71
|
+
"build:barrels:events": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --directory ./js/events --exclude \".\\.test\\.ts\"",
|
|
72
|
+
"build:barrels:buses": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/buses",
|
|
73
|
+
"build:barrels:i18n": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --fullPathname --directory ./js/i18n/locales",
|
|
74
|
+
"build:barrels:tpl": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/tpl --exclude \".\\.test\\.ts\"",
|
|
75
|
+
"build:barrels:morphdom": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/morphdom --exclude \".\\.test\\.ts\"",
|
|
76
|
+
"build:barrels:decorators": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/internal/decorators",
|
|
77
|
+
"format:check": "prettier . --check",
|
|
78
|
+
"format:write": "prettier . --write",
|
|
79
|
+
"lint:scripts": "tsc -p tsconfig.scripts.json --noEmit",
|
|
80
|
+
"test": "vitest --dom",
|
|
81
|
+
"prepackage": "rm -rf generated",
|
|
82
|
+
"package": "npm run build:ts && npm run build:scss",
|
|
83
|
+
"version:pkg": "npm version $npm_config_bump --no-git-tag-version --preid=dev"
|
|
51
84
|
},
|
|
52
85
|
"devDependencies": {
|
|
53
|
-
"
|
|
54
|
-
|
|
86
|
+
"doctrine": "^3.0.0",
|
|
87
|
+
"element-internals-polyfill": "^3.0.2",
|
|
88
|
+
"gonzales-pe": "^4.3.0",
|
|
89
|
+
"happy-dom": "^20.7.0",
|
|
90
|
+
"sass": "^1.98.0",
|
|
91
|
+
"ts-morph": "^28.0.0",
|
|
92
|
+
"tsx": "^4.21.0",
|
|
93
|
+
"vitest": "^4.0.18"
|
|
94
|
+
},
|
|
95
|
+
"customElements": "custom-elements/en.json"
|
|
55
96
|
}
|