@swiftwc/ui 0.0.0-dev.66 → 0.0.0-dev.68
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/client/index.d.ts +4 -1
- package/generated/client/index.js +50 -35
- package/generated/components/h-stack.d.ts +4 -0
- package/generated/components/h-stack.js +4 -0
- package/generated/components/index.d.ts +1 -0
- package/generated/components/index.js +1 -0
- package/generated/components/label-view.d.ts +5 -0
- package/generated/components/label-view.js +5 -0
- package/generated/components/toggle-view.d.ts +28 -0
- package/generated/components/toggle-view.js +222 -0
- package/generated/components/v-stack.d.ts +4 -0
- package/generated/components/v-stack.js +4 -0
- package/generated/css/index.css +110 -31
- package/generated/events/index.d.ts +1 -0
- package/generated/events/index.js +1 -0
- package/generated/events/toggle-view.d.ts +9 -0
- package/generated/events/toggle-view.js +1 -0
- package/generated/tpl/html.d.ts +5 -0
- package/generated/tpl/html.js +3 -0
- package/generated/tpl/index.d.ts +4 -0
- package/generated/tpl/index.js +4 -0
- package/generated/tpl/render.d.ts +2 -0
- package/generated/tpl/render.js +135 -0
- package/package.json +3 -2
- package/scss/_components.scss +2 -0
- package/scss/components/_date-picker.scss +15 -15
- package/scss/components/_h-stack.scss +17 -1
- package/scss/components/_index.scss +4 -0
- package/scss/components/_menu-view.scss +53 -49
- package/scss/components/_picker-view.scss +38 -39
- package/scss/components/_scroll-view-proxy.scss +4 -2
- package/scss/components/_section-view.scss +23 -22
- package/scss/components/_table-view.scss +6 -6
- package/scss/components/_text-field.scss +26 -26
- package/scss/components/_toggle-view.scss +79 -0
- package/scss/components/_tool-bar.scss +52 -52
- package/scss/mixins/_index.scss +9 -2
- package/scss/placeholders/_lists.scss +14 -12
- package/scss/transitions/_menu-view.scss +17 -15
- package/web-components.html-data/en.json +175 -0
package/generated/css/index.css
CHANGED
|
@@ -1134,6 +1134,10 @@
|
|
|
1134
1134
|
:where(table-view)::part(table-footer-leading-stack),
|
|
1135
1135
|
:where(table-view)::part(table-footer-principal-stack),
|
|
1136
1136
|
:where(table-view)::part(table-footer-trailing-stack),
|
|
1137
|
+
:where(toggle-view)::part(toggle-stack),
|
|
1138
|
+
:where(toggle-view)::part(toggle-label-stack),
|
|
1139
|
+
:where(toggle-view)::part(toggle-input-stack),
|
|
1140
|
+
:where(toggle-view)::part(text-field-form-input),
|
|
1137
1141
|
:where(text-field)::part(text-field-stack),
|
|
1138
1142
|
:where(text-field)::part(text-field-label-stack),
|
|
1139
1143
|
:where(text-field)::part(text-field-input-stack),
|
|
@@ -1421,8 +1425,8 @@
|
|
|
1421
1425
|
:where(detail-placeholder > scroll-view) {
|
|
1422
1426
|
overflow: clip auto;
|
|
1423
1427
|
pointer-events: all;
|
|
1424
|
-
overscroll-behavior: contain;
|
|
1425
1428
|
-webkit-overflow-scrolling: touch;
|
|
1429
|
+
overscroll-behavior: contain;
|
|
1426
1430
|
container: scroll-view/size;
|
|
1427
1431
|
padding-block: var(--safe-area-inset-top) var(--safe-area-inset-bottom);
|
|
1428
1432
|
padding-inline: var(--safe-area-inset-left) var(--safe-area-inset-right);
|
|
@@ -1911,8 +1915,8 @@
|
|
|
1911
1915
|
}
|
|
1912
1916
|
:where(navigation-stack > scroll-view, navigation-split-view > scroll-view, [is=sidebar-view] > scroll-view, body-view > scroll-view, [is=full-screen] > scroll-view, [is=sheet-view] > scroll-view) {
|
|
1913
1917
|
overflow: clip auto;
|
|
1914
|
-
overscroll-behavior: contain;
|
|
1915
1918
|
-webkit-overflow-scrolling: touch;
|
|
1919
|
+
overscroll-behavior: contain;
|
|
1916
1920
|
padding-block: var(--safe-area-inset-top) var(--safe-area-inset-bottom);
|
|
1917
1921
|
padding-inline: var(--safe-area-inset-left) var(--safe-area-inset-right);
|
|
1918
1922
|
container: scroll-view/size;
|
|
@@ -1993,8 +1997,6 @@
|
|
|
1993
1997
|
:where(scroll-view-proxy:has(> v-stack, > h-stack) > v-stack,
|
|
1994
1998
|
scroll-view-proxy:has(> v-stack, > h-stack) > h-stack) {
|
|
1995
1999
|
position: relative;
|
|
1996
|
-
overscroll-behavior: contain;
|
|
1997
|
-
-webkit-overflow-scrolling: touch;
|
|
1998
2000
|
scrollbar-width: thin;
|
|
1999
2001
|
container: scroll-view-proxy/inline-size;
|
|
2000
2002
|
}
|
|
@@ -2010,10 +2012,14 @@
|
|
|
2010
2012
|
:where(scroll-view-proxy:has(> v-stack, > h-stack) > v-stack) {
|
|
2011
2013
|
overflow: clip auto;
|
|
2012
2014
|
scroll-snap-type: block mandatory;
|
|
2015
|
+
-webkit-overflow-scrolling: touch;
|
|
2016
|
+
overscroll-behavior-block: contain;
|
|
2013
2017
|
}
|
|
2014
2018
|
:where(scroll-view-proxy:has(> v-stack, > h-stack) > h-stack) {
|
|
2015
2019
|
overflow: auto clip;
|
|
2016
2020
|
scroll-snap-type: inline mandatory;
|
|
2021
|
+
-webkit-overflow-scrolling: touch;
|
|
2022
|
+
overscroll-behavior-inline: contain;
|
|
2017
2023
|
}
|
|
2018
2024
|
:where(scroll-view-proxy:has(> v-stack, > h-stack) > h-stack[padding]) {
|
|
2019
2025
|
scroll-padding-inline: 1rem;
|
|
@@ -2039,9 +2045,36 @@
|
|
|
2039
2045
|
:where(h-stack[template="auto spacer auto"]) {
|
|
2040
2046
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
2041
2047
|
}
|
|
2048
|
+
:where(h-stack[template="repeat(1,spacer)"]) {
|
|
2049
|
+
grid-template-columns: repeat(1, minmax(0, 1fr));
|
|
2050
|
+
}
|
|
2051
|
+
:where(h-stack[template="repeat(2,spacer)"]) {
|
|
2052
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
2053
|
+
}
|
|
2054
|
+
:where(h-stack[template="repeat(3,spacer)"]) {
|
|
2055
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
2056
|
+
}
|
|
2042
2057
|
:where(h-stack[template="repeat(4,spacer)"]) {
|
|
2043
2058
|
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
2044
2059
|
}
|
|
2060
|
+
:where(h-stack[template="repeat(5,spacer)"]) {
|
|
2061
|
+
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
2062
|
+
}
|
|
2063
|
+
:where(h-stack[template="repeat(6,spacer)"]) {
|
|
2064
|
+
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
2065
|
+
}
|
|
2066
|
+
:where(h-stack[template="repeat(7,spacer)"]) {
|
|
2067
|
+
grid-template-columns: repeat(7, minmax(0, 1fr));
|
|
2068
|
+
}
|
|
2069
|
+
:where(h-stack[template="repeat(8,spacer)"]) {
|
|
2070
|
+
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
2071
|
+
}
|
|
2072
|
+
:where(h-stack[template="repeat(9,spacer)"]) {
|
|
2073
|
+
grid-template-columns: repeat(9, minmax(0, 1fr));
|
|
2074
|
+
}
|
|
2075
|
+
:where(h-stack[template="repeat(10,spacer)"]) {
|
|
2076
|
+
grid-template-columns: repeat(10, minmax(0, 1fr));
|
|
2077
|
+
}
|
|
2045
2078
|
:where(h-stack[template="repeat(2,spacer) auto"]) {
|
|
2046
2079
|
grid-template-columns: repeat(2, minmax(0, 1fr)) auto;
|
|
2047
2080
|
}
|
|
@@ -2575,14 +2608,6 @@
|
|
|
2575
2608
|
grid-template-rows: auto 1fr auto;
|
|
2576
2609
|
grid-template-areas: "top-bar" "spacer" "bottom-bar";
|
|
2577
2610
|
}
|
|
2578
|
-
:where(tool-bar > *:not(sidebar-toggle), tool-bar > sidebar-toggle > tool-bar-item, tab-view > sidebar-toggle > tool-bar-item, navigation-split-view > sidebar-toggle > tool-bar-item) {
|
|
2579
|
-
backdrop-filter: var(--liquid-glass-backdrop-filter);
|
|
2580
|
-
box-shadow: var(--toolbar-cell-box-shadow);
|
|
2581
|
-
min-inline-size: var(--toolbar-cell-min-size);
|
|
2582
|
-
transform: var(--toolbar-cell-scale, );
|
|
2583
|
-
filter: var(--toolbar-cell-filter, );
|
|
2584
|
-
opacity: var(--toolbar-cell-opacity, );
|
|
2585
|
-
}
|
|
2586
2611
|
:where(tool-bar)::part(top-bar), :where(tool-bar)::part(bottom-bar) {
|
|
2587
2612
|
position: relative;
|
|
2588
2613
|
padding-inline: var(--safe-area-inset-left, 0px) var(--safe-area-inset-right, 0px);
|
|
@@ -2609,6 +2634,14 @@
|
|
|
2609
2634
|
column-gap: var(--toolbar-col-gap);
|
|
2610
2635
|
padding-inline: var(--toolbar-col-gap) var(--toolbar-col-gap);
|
|
2611
2636
|
}
|
|
2637
|
+
:where(tool-bar > *:not(sidebar-toggle), tool-bar > sidebar-toggle > tool-bar-item, tab-view > sidebar-toggle > tool-bar-item, navigation-split-view > sidebar-toggle > tool-bar-item) {
|
|
2638
|
+
backdrop-filter: var(--liquid-glass-backdrop-filter);
|
|
2639
|
+
box-shadow: var(--toolbar-cell-box-shadow);
|
|
2640
|
+
min-inline-size: var(--toolbar-cell-min-size);
|
|
2641
|
+
transform: var(--toolbar-cell-scale, );
|
|
2642
|
+
filter: var(--toolbar-cell-filter, );
|
|
2643
|
+
opacity: var(--toolbar-cell-opacity, );
|
|
2644
|
+
}
|
|
2612
2645
|
@media (min-width: 37rem) and (min-height: 27.75rem) {
|
|
2613
2646
|
:where([is=sheet-view] tool-bar)::part(top-bar), :where([is=sheet-view] tool-bar)::part(bottom-bar) {
|
|
2614
2647
|
--safe-area-inset-left: 0px;
|
|
@@ -3088,6 +3121,52 @@
|
|
|
3088
3121
|
}
|
|
3089
3122
|
}
|
|
3090
3123
|
}
|
|
3124
|
+
@layer sw-components {
|
|
3125
|
+
:where(toggle-view) {
|
|
3126
|
+
grid-template-columns: minmax(0, 1fr);
|
|
3127
|
+
grid-template-rows: minmax(0, 1fr);
|
|
3128
|
+
--toggle--trigger-bg: lightgray;
|
|
3129
|
+
}
|
|
3130
|
+
:where(toggle-view)::part(toggle-stack) {
|
|
3131
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
3132
|
+
grid-template-rows: minmax(0, 1fr);
|
|
3133
|
+
column-gap: var(--labeled-content-column-gap);
|
|
3134
|
+
}
|
|
3135
|
+
:where(toggle-view)::part(toggle-label-stack) {
|
|
3136
|
+
color: var(--secondary);
|
|
3137
|
+
}
|
|
3138
|
+
:where(toggle-view)::part(toggle-input-stack) {
|
|
3139
|
+
place-items: stretch;
|
|
3140
|
+
place-content: stretch;
|
|
3141
|
+
}
|
|
3142
|
+
:where(toggle-view)::part(toggle-form-input):focus {
|
|
3143
|
+
outline: blue solid 5px;
|
|
3144
|
+
}
|
|
3145
|
+
:where(toggle-view)::part(toggle-form-input) {
|
|
3146
|
+
text-align: end;
|
|
3147
|
+
position: relative;
|
|
3148
|
+
display: grid;
|
|
3149
|
+
outline: red solid 3px;
|
|
3150
|
+
border-radius: 2rem;
|
|
3151
|
+
inline-size: 4rem;
|
|
3152
|
+
block-size: 1rem;
|
|
3153
|
+
background: var(--toggle--trigger-bg);
|
|
3154
|
+
}
|
|
3155
|
+
:where(toggle-view)::part(toggle-form-input)::before {
|
|
3156
|
+
content: "";
|
|
3157
|
+
display: grid;
|
|
3158
|
+
position: absolute;
|
|
3159
|
+
inset: 0 auto auto 0;
|
|
3160
|
+
inline-size: 1rem;
|
|
3161
|
+
block-size: 1rem;
|
|
3162
|
+
border-radius: 1rem;
|
|
3163
|
+
backdrop-filter: var(--liquid-glass-backdrop-filter);
|
|
3164
|
+
box-shadow: var(--liquid-glass-box-shadow);
|
|
3165
|
+
}
|
|
3166
|
+
toggle-view[aria-checked=true] {
|
|
3167
|
+
--toggle--trigger-bg: green;
|
|
3168
|
+
}
|
|
3169
|
+
}
|
|
3091
3170
|
@layer sw-components {
|
|
3092
3171
|
:where(labeled-content) {
|
|
3093
3172
|
container: labeled-content/inline-size;
|
|
@@ -3250,8 +3329,8 @@
|
|
|
3250
3329
|
pointer-events: none;
|
|
3251
3330
|
}
|
|
3252
3331
|
:where(menu-view)::part(menu-form) {
|
|
3253
|
-
overscroll-behavior: contain;
|
|
3254
3332
|
-webkit-overflow-scrolling: touch;
|
|
3333
|
+
overscroll-behavior: contain;
|
|
3255
3334
|
--menu--dialog-max-inline-size: anchor-size();
|
|
3256
3335
|
--menu--dialog-max-block-size: anchor-size();
|
|
3257
3336
|
}
|
|
@@ -3302,7 +3381,7 @@
|
|
|
3302
3381
|
--menu--dialog-max-inline-size: anchor-size();
|
|
3303
3382
|
--menu--dialog-max-block-size: anchor-size();
|
|
3304
3383
|
}
|
|
3305
|
-
menu-view[open]:not(tool-bar-item > menu-view) {
|
|
3384
|
+
:where(menu-view[open]:not(tool-bar-item > menu-view)) {
|
|
3306
3385
|
--menu--summary-scale: scale(0.01);
|
|
3307
3386
|
--menu--summary-filter: blur(10px);
|
|
3308
3387
|
}
|
|
@@ -4209,6 +4288,21 @@
|
|
|
4209
4288
|
grid-template-areas: "header" "main" "footer";
|
|
4210
4289
|
gap: 0.5rem;
|
|
4211
4290
|
}
|
|
4291
|
+
:where(section-view)::part(section-header-stack), :where(section-view)::part(section-footer-stack) {
|
|
4292
|
+
pointer-events: none;
|
|
4293
|
+
}
|
|
4294
|
+
:where(section-view)::part(section-header-stack) {
|
|
4295
|
+
grid-area: header;
|
|
4296
|
+
}
|
|
4297
|
+
:where(section-view)::part(section-main-stack) {
|
|
4298
|
+
grid-area: main;
|
|
4299
|
+
}
|
|
4300
|
+
:where(section-view)::part(section-footer-stack) {
|
|
4301
|
+
grid-area: footer;
|
|
4302
|
+
}
|
|
4303
|
+
:where(section-view)::part(section-header-stack) {
|
|
4304
|
+
order: -1;
|
|
4305
|
+
}
|
|
4212
4306
|
:where(section-view:has(> [slot=header]):not(:has(> [slot=footer]))) {
|
|
4213
4307
|
grid-template-rows: auto minmax(max-content, 1fr);
|
|
4214
4308
|
grid-template-areas: "header" "main";
|
|
@@ -4227,21 +4321,6 @@
|
|
|
4227
4321
|
:where(section-view:not(:has(> [slot=footer])))::part(section-footer-stack) {
|
|
4228
4322
|
display: none;
|
|
4229
4323
|
}
|
|
4230
|
-
:where(section-view)::part(section-header-stack), :where(section-view)::part(section-footer-stack) {
|
|
4231
|
-
pointer-events: none;
|
|
4232
|
-
}
|
|
4233
|
-
:where(section-view)::part(section-header-stack) {
|
|
4234
|
-
grid-area: header;
|
|
4235
|
-
}
|
|
4236
|
-
:where(section-view)::part(section-main-stack) {
|
|
4237
|
-
grid-area: main;
|
|
4238
|
-
}
|
|
4239
|
-
:where(section-view)::part(section-footer-stack) {
|
|
4240
|
-
grid-area: footer;
|
|
4241
|
-
}
|
|
4242
|
-
:where(section-view)::part(section-header-stack) {
|
|
4243
|
-
order: -1;
|
|
4244
|
-
}
|
|
4245
4324
|
section-view {
|
|
4246
4325
|
/* :where(&:not(& &))::part(section-footer-stack),
|
|
4247
4326
|
:where(&:not(& &))::part(section-header-stack) {
|
|
@@ -4302,7 +4381,7 @@
|
|
|
4302
4381
|
border-radius: 0 0 var(--insetlist-item-border-radius) var(--insetlist-item-border-radius);
|
|
4303
4382
|
border-top: 1px solid var(--separator);
|
|
4304
4383
|
}
|
|
4305
|
-
:where(
|
|
4384
|
+
:where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-header-leading-stack), :where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-header-principal-stack), :where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-header-trailing-stack), :where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-footer-leading-stack), :where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-footer-principal-stack), :where(table-view:not(table-view table-view, list-view table-view, [is=form-view] table-view))::part(table-footer-trailing-stack) {
|
|
4306
4385
|
grid-auto-flow: column;
|
|
4307
4386
|
grid-template-columns: minmax(0, 1fr);
|
|
4308
4387
|
column-gap: var(--toolbar-col-gap);
|
|
@@ -5317,8 +5396,8 @@
|
|
|
5317
5396
|
z-index: -1;
|
|
5318
5397
|
}
|
|
5319
5398
|
:where([is=tab-bar] > [is=form-view]) {
|
|
5320
|
-
overscroll-behavior: contain;
|
|
5321
5399
|
-webkit-overflow-scrolling: touch;
|
|
5400
|
+
overscroll-behavior: contain;
|
|
5322
5401
|
pointer-events: all;
|
|
5323
5402
|
touch-action: none;
|
|
5324
5403
|
grid-auto-flow: column;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
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
|
+
const start = node;
|
|
49
|
+
const end = document.createComment(MARKER);
|
|
50
|
+
start.after(end);
|
|
51
|
+
parts.push({ type: 'child', start, end, committed: undefined });
|
|
52
|
+
descriptorIndex++;
|
|
53
|
+
}
|
|
54
|
+
else if (node.nodeType === Node.ELEMENT_NODE) {
|
|
55
|
+
const el = node;
|
|
56
|
+
for (const attr of Array.from(el.attributes)) {
|
|
57
|
+
if (attr.value === MARKER) {
|
|
58
|
+
const desc = descriptors[descriptorIndex];
|
|
59
|
+
if (desc.type === 'attr') {
|
|
60
|
+
parts.push({ type: 'attr', el, name: desc.name, committed: undefined });
|
|
61
|
+
descriptorIndex++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { fragment, parts };
|
|
68
|
+
}
|
|
69
|
+
// --- Committing values into parts (the only thing that runs per update) -
|
|
70
|
+
function isTemplateResult(v) {
|
|
71
|
+
return !!v && typeof v === 'object' && 'strings' in v && 'values' in v;
|
|
72
|
+
}
|
|
73
|
+
function toNode(value) {
|
|
74
|
+
if (value instanceof Node)
|
|
75
|
+
return value;
|
|
76
|
+
if (isTemplateResult(value)) {
|
|
77
|
+
const { fragment, parts } = createInstance(prepare(value.strings));
|
|
78
|
+
parts.forEach((part, i) => {
|
|
79
|
+
const v = value.values[i];
|
|
80
|
+
part.type === 'child' ? commitChild(part, v) : commitAttr(part, v);
|
|
81
|
+
});
|
|
82
|
+
return fragment;
|
|
83
|
+
}
|
|
84
|
+
return document.createTextNode(String(value));
|
|
85
|
+
}
|
|
86
|
+
function commitChild(part, value) {
|
|
87
|
+
if (value === part.committed)
|
|
88
|
+
return; // dirty-check, skip untouched parts
|
|
89
|
+
// clear everything between start/end
|
|
90
|
+
let n = part.start.nextSibling;
|
|
91
|
+
while (n && n !== part.end) {
|
|
92
|
+
const next = n.nextSibling;
|
|
93
|
+
n.remove();
|
|
94
|
+
n = next;
|
|
95
|
+
}
|
|
96
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
97
|
+
if (item === null || item === undefined || item === false)
|
|
98
|
+
continue;
|
|
99
|
+
part.end.before(toNode(item));
|
|
100
|
+
}
|
|
101
|
+
part.committed = value;
|
|
102
|
+
}
|
|
103
|
+
function commitAttr(part, value) {
|
|
104
|
+
if (value === part.committed)
|
|
105
|
+
return;
|
|
106
|
+
if (value === null || value === undefined || value === false) {
|
|
107
|
+
part.el.removeAttribute(part.name);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
part.el.setAttribute(part.name, String(value));
|
|
111
|
+
}
|
|
112
|
+
part.committed = value;
|
|
113
|
+
}
|
|
114
|
+
// --- Public render() ----------------------------------------------------
|
|
115
|
+
export default function (result, container) {
|
|
116
|
+
const prepared = prepare(result.strings);
|
|
117
|
+
let instance = instanceCache.get(container);
|
|
118
|
+
if (!instance || instance.strings !== result.strings) {
|
|
119
|
+
// first render, OR the template shape changed entirely — full (re)build
|
|
120
|
+
container.textContent = '';
|
|
121
|
+
const { fragment, parts } = createInstance(prepared);
|
|
122
|
+
container.append(fragment);
|
|
123
|
+
instance = { strings: result.strings, fragmentRoot: fragment, parts };
|
|
124
|
+
instanceCache.set(container, instance);
|
|
125
|
+
}
|
|
126
|
+
// same template shape as last time → patch existing DOM nodes only,
|
|
127
|
+
// no innerHTML, no re-clone, no focus/scroll loss
|
|
128
|
+
instance.parts.forEach((part, i) => {
|
|
129
|
+
const value = result.values[i];
|
|
130
|
+
if (part.type === 'child')
|
|
131
|
+
commitChild(part, value);
|
|
132
|
+
else
|
|
133
|
+
commitAttr(part, value);
|
|
134
|
+
});
|
|
135
|
+
}
|
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.68",
|
|
4
4
|
"description": "Elegant SwiftUI-inspired web components for standalone web apps and web extensions.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -63,11 +63,12 @@
|
|
|
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: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: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
|
+
"build:barrels:tpl": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/tpl --exclude \".\\.test\\.ts\"",
|
|
71
72
|
"build:barrels:decorators": "barrelsby --noHeader --delete --singleQuotes --noSemicolon --exportDefault --directory ./js/internal/decorators",
|
|
72
73
|
"format:check": "prettier . --check",
|
|
73
74
|
"format:write": "prettier . --write",
|
package/scss/_components.scss
CHANGED
|
@@ -5,26 +5,26 @@
|
|
|
5
5
|
:where(&) {
|
|
6
6
|
grid-template-columns: minmax(0, 1fr);
|
|
7
7
|
grid-template-rows: minmax(0, 1fr);
|
|
8
|
-
}
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
&::part(date-picker-stack) {
|
|
10
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
11
|
+
grid-template-rows: minmax(0, 1fr);
|
|
12
|
+
}
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
&::part(date-picker-label-stack) {
|
|
15
|
+
// display: grid;
|
|
16
|
+
}
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
&::part(date-picker-input-stack) {
|
|
19
|
+
place-items: stretch;
|
|
20
|
+
place-content: stretch;
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
grid-auto-flow: column;
|
|
23
|
+
}
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
&::part(date-picker-form-input) {
|
|
26
|
+
text-align: end;
|
|
27
|
+
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -3,7 +3,23 @@
|
|
|
3
3
|
@use 'sass:string';
|
|
4
4
|
@use 'sass:list';
|
|
5
5
|
|
|
6
|
-
$h-stack-templates: (
|
|
6
|
+
$h-stack-templates: (
|
|
7
|
+
(auto minmax(0, 1fr)),
|
|
8
|
+
(minmax(0, 1fr) auto),
|
|
9
|
+
(auto minmax(0, 1fr) auto auto),
|
|
10
|
+
(auto minmax(0, 1fr) auto),
|
|
11
|
+
(repeat(1, minmax(0, 1fr))),
|
|
12
|
+
(repeat(2, minmax(0, 1fr))),
|
|
13
|
+
(repeat(3, minmax(0, 1fr))),
|
|
14
|
+
(repeat(4, minmax(0, 1fr))),
|
|
15
|
+
(repeat(5, minmax(0, 1fr))),
|
|
16
|
+
(repeat(6, minmax(0, 1fr))),
|
|
17
|
+
(repeat(7, minmax(0, 1fr))),
|
|
18
|
+
(repeat(8, minmax(0, 1fr))),
|
|
19
|
+
(repeat(9, minmax(0, 1fr))),
|
|
20
|
+
(repeat(10, minmax(0, 1fr))),
|
|
21
|
+
(repeat(2, minmax(0, 1fr)) auto)
|
|
22
|
+
);
|
|
7
23
|
|
|
8
24
|
@layer #{vars.$components-layer} {
|
|
9
25
|
h-stack {
|
|
@@ -70,6 +70,10 @@
|
|
|
70
70
|
:where(table-view)::part(table-footer-leading-stack),
|
|
71
71
|
:where(table-view)::part(table-footer-principal-stack),
|
|
72
72
|
:where(table-view)::part(table-footer-trailing-stack),
|
|
73
|
+
:where(toggle-view)::part(toggle-stack),
|
|
74
|
+
:where(toggle-view)::part(toggle-label-stack),
|
|
75
|
+
:where(toggle-view)::part(toggle-input-stack),
|
|
76
|
+
:where(toggle-view)::part(text-field-form-input),
|
|
73
77
|
:where(text-field)::part(text-field-stack),
|
|
74
78
|
:where(text-field)::part(text-field-label-stack),
|
|
75
79
|
:where(text-field)::part(text-field-input-stack),
|