@codbex/harmonia 1.0.0 → 1.1.0
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/dist/harmonia.css +1 -1
- package/dist/harmonia.esm.js +100 -57
- package/dist/harmonia.esm.min.js +3 -3
- package/dist/harmonia.esm.min.js.map +4 -4
- package/dist/harmonia.js +98 -57
- package/dist/harmonia.min.js +2 -2
- package/dist/harmonia.min.js.map +4 -4
- package/package.json +1 -1
package/dist/harmonia.js
CHANGED
|
@@ -2302,7 +2302,7 @@
|
|
|
2302
2302
|
previousYearBtn.setAttribute("type", "button");
|
|
2303
2303
|
previousYearBtn.appendChild(
|
|
2304
2304
|
createElement(ChevronsLeft, {
|
|
2305
|
-
class: ["opacity-
|
|
2305
|
+
class: ["opacity-70 size-4 shrink-0 pointer-events-none"],
|
|
2306
2306
|
width: "16",
|
|
2307
2307
|
height: "16",
|
|
2308
2308
|
"aria-hidden": true,
|
|
@@ -2320,7 +2320,7 @@
|
|
|
2320
2320
|
previousMonthBtn.setAttribute("type", "button");
|
|
2321
2321
|
previousMonthBtn.appendChild(
|
|
2322
2322
|
createElement(ChevronLeft, {
|
|
2323
|
-
class: ["opacity-
|
|
2323
|
+
class: ["opacity-70 size-4 shrink-0 pointer-events-none"],
|
|
2324
2324
|
width: "16",
|
|
2325
2325
|
height: "16",
|
|
2326
2326
|
"aria-hidden": true,
|
|
@@ -2343,7 +2343,7 @@
|
|
|
2343
2343
|
nextMonthBtn.setAttribute("type", "button");
|
|
2344
2344
|
nextMonthBtn.appendChild(
|
|
2345
2345
|
createElement(ChevronRight, {
|
|
2346
|
-
class: ["opacity-
|
|
2346
|
+
class: ["opacity-70 size-4 shrink-0 pointer-events-none"],
|
|
2347
2347
|
width: "16",
|
|
2348
2348
|
height: "16",
|
|
2349
2349
|
"aria-hidden": true,
|
|
@@ -2361,7 +2361,7 @@
|
|
|
2361
2361
|
nextYearBtn.setAttribute("type", "button");
|
|
2362
2362
|
nextYearBtn.appendChild(
|
|
2363
2363
|
createElement(ChevronsRight, {
|
|
2364
|
-
class: ["opacity-
|
|
2364
|
+
class: ["opacity-70 size-4 shrink-0 pointer-events-none"],
|
|
2365
2365
|
width: "16",
|
|
2366
2366
|
height: "16",
|
|
2367
2367
|
"aria-hidden": true,
|
|
@@ -2784,9 +2784,28 @@
|
|
|
2784
2784
|
});
|
|
2785
2785
|
}
|
|
2786
2786
|
|
|
2787
|
+
// src/common/input-size.js
|
|
2788
|
+
function setSize(el, size3) {
|
|
2789
|
+
if (size3 === "sm") {
|
|
2790
|
+
el.classList.add("h-6.5");
|
|
2791
|
+
el.classList.remove("h-9");
|
|
2792
|
+
} else {
|
|
2793
|
+
el.classList.add("h-9");
|
|
2794
|
+
el.classList.remove("h-6.5");
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
function sizeObserver(el) {
|
|
2798
|
+
const observer = new MutationObserver(() => {
|
|
2799
|
+
setSize(el, el.getAttribute("data-size"));
|
|
2800
|
+
});
|
|
2801
|
+
setSize(el, el.getAttribute("data-size"));
|
|
2802
|
+
observer.observe(el, { attributes: true, attributeFilter: ["data-size"] });
|
|
2803
|
+
return observer;
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2787
2806
|
// src/components/datepicker.js
|
|
2788
2807
|
function datepicker_default(Alpine) {
|
|
2789
|
-
Alpine.directive("h-date-picker", (el, { original }, { Alpine: Alpine2 }) => {
|
|
2808
|
+
Alpine.directive("h-date-picker", (el, { original }, { Alpine: Alpine2, cleanup }) => {
|
|
2790
2809
|
el._h_datepicker = Alpine2.reactive({
|
|
2791
2810
|
id: void 0,
|
|
2792
2811
|
controls: `hdpc${v4_default()}`,
|
|
@@ -2815,10 +2834,7 @@
|
|
|
2815
2834
|
"transition-[color,box-shadow]",
|
|
2816
2835
|
"duration-200",
|
|
2817
2836
|
"outline-none",
|
|
2818
|
-
"h-9",
|
|
2819
2837
|
"pl-3",
|
|
2820
|
-
"pr-1",
|
|
2821
|
-
"gap-2",
|
|
2822
2838
|
"min-w-0",
|
|
2823
2839
|
"has-[input:focus-visible]:border-ring",
|
|
2824
2840
|
"has-[input:focus-visible]:ring-ring/50",
|
|
@@ -2834,18 +2850,26 @@
|
|
|
2834
2850
|
el._h_datepicker.input.classList.add(
|
|
2835
2851
|
"bg-transparent",
|
|
2836
2852
|
"outline-none",
|
|
2837
|
-
"
|
|
2838
|
-
"
|
|
2839
|
-
"border-
|
|
2853
|
+
"size-full",
|
|
2854
|
+
"pr-1",
|
|
2855
|
+
"border-r",
|
|
2856
|
+
"border-input",
|
|
2857
|
+
"aria-invalid:border-negative",
|
|
2858
|
+
"invalid:border-negative",
|
|
2840
2859
|
"focus-visible:ring-0",
|
|
2841
2860
|
"disabled:pointer-events-none",
|
|
2842
2861
|
"disabled:cursor-not-allowed",
|
|
2843
2862
|
"disabled:opacity-50",
|
|
2844
2863
|
"md:text-sm",
|
|
2845
|
-
"text-base"
|
|
2864
|
+
"text-base",
|
|
2865
|
+
"truncate"
|
|
2846
2866
|
);
|
|
2847
2867
|
el._h_datepicker.input.setAttribute("aria-autocomplete", "none");
|
|
2848
2868
|
el._h_datepicker.input.setAttribute("type", "text");
|
|
2869
|
+
const observer = sizeObserver(el);
|
|
2870
|
+
cleanup(() => {
|
|
2871
|
+
observer.disconnect();
|
|
2872
|
+
});
|
|
2849
2873
|
});
|
|
2850
2874
|
Alpine.directive("h-date-picker-trigger", (el, { original }, { effect, cleanup, Alpine: Alpine2 }) => {
|
|
2851
2875
|
if (el.tagName !== "BUTTON") {
|
|
@@ -2858,6 +2882,28 @@
|
|
|
2858
2882
|
if (!datepicker) {
|
|
2859
2883
|
throw new Error(`${original} must be inside an date-picker element`);
|
|
2860
2884
|
}
|
|
2885
|
+
el.classList.add(
|
|
2886
|
+
"cursor-pointer",
|
|
2887
|
+
"inline-flex",
|
|
2888
|
+
"items-center",
|
|
2889
|
+
"justify-center",
|
|
2890
|
+
"rounded-r-control",
|
|
2891
|
+
"h-full",
|
|
2892
|
+
"aspect-square",
|
|
2893
|
+
"bg-transparent",
|
|
2894
|
+
"hover:bg-secondary",
|
|
2895
|
+
"active:bg-secondary-active",
|
|
2896
|
+
"outline-none",
|
|
2897
|
+
"focus-visible:border-ring",
|
|
2898
|
+
"focus-visible:ring-ring/50",
|
|
2899
|
+
"focus-visible:ring-[calc(var(--spacing)*0.75)]",
|
|
2900
|
+
"[input[aria-invalid=true]~&]:ring-negative/20",
|
|
2901
|
+
"[input[aria-invalid=true]~&]:border-negative",
|
|
2902
|
+
"dark:[input[aria-invalid=true]~&]:ring-negative/40",
|
|
2903
|
+
"[input:invalid~&]:ring-negative/20",
|
|
2904
|
+
"[input:invalid~&]:border-negative",
|
|
2905
|
+
"dark:[input:invalid~&]:ring-negative/40"
|
|
2906
|
+
);
|
|
2861
2907
|
el.setAttribute("aria-controls", datepicker._h_datepicker.controls);
|
|
2862
2908
|
el.setAttribute("aria-expanded", "false");
|
|
2863
2909
|
el.setAttribute("aria-haspopup", "dialog");
|
|
@@ -2865,7 +2911,7 @@
|
|
|
2865
2911
|
el.setAttribute("data-slot", "date-picker-trigger");
|
|
2866
2912
|
el.appendChild(
|
|
2867
2913
|
createElement(Calendar, {
|
|
2868
|
-
class: ["opacity-
|
|
2914
|
+
class: ["opacity-70 text-foreground size-4"],
|
|
2869
2915
|
width: "16",
|
|
2870
2916
|
height: "16",
|
|
2871
2917
|
"aria-hidden": true,
|
|
@@ -2895,7 +2941,7 @@
|
|
|
2895
2941
|
el.removeEventListener("click", handler);
|
|
2896
2942
|
top.removeEventListener("click", close);
|
|
2897
2943
|
});
|
|
2898
|
-
})
|
|
2944
|
+
});
|
|
2899
2945
|
}
|
|
2900
2946
|
|
|
2901
2947
|
// src/components/dialog.js
|
|
@@ -3169,25 +3215,6 @@
|
|
|
3169
3215
|
});
|
|
3170
3216
|
}
|
|
3171
3217
|
|
|
3172
|
-
// src/common/input-size.js
|
|
3173
|
-
function setSize(el, size3) {
|
|
3174
|
-
if (size3 === "sm") {
|
|
3175
|
-
el.classList.add("h-6.5");
|
|
3176
|
-
el.classList.remove("h-9");
|
|
3177
|
-
} else {
|
|
3178
|
-
el.classList.add("h-9");
|
|
3179
|
-
el.classList.remove("h-6.5");
|
|
3180
|
-
}
|
|
3181
|
-
}
|
|
3182
|
-
function sizeObserver(el) {
|
|
3183
|
-
const observer = new MutationObserver(() => {
|
|
3184
|
-
setSize(el, el.getAttribute("data-size"));
|
|
3185
|
-
});
|
|
3186
|
-
setSize(el, el.getAttribute("data-size"));
|
|
3187
|
-
observer.observe(el, { attributes: true, attributeFilter: ["data-size"] });
|
|
3188
|
-
return observer;
|
|
3189
|
-
}
|
|
3190
|
-
|
|
3191
3218
|
// src/components/input.js
|
|
3192
3219
|
function input_default(Alpine) {
|
|
3193
3220
|
Alpine.directive("h-input", (el, { modifiers }, { cleanup }) => {
|
|
@@ -3388,8 +3415,11 @@
|
|
|
3388
3415
|
stepDown.setAttribute("aria-controls", input.getAttribute("id"));
|
|
3389
3416
|
stepDown.setAttribute("data-slot", "step-up-trigger");
|
|
3390
3417
|
stepDown.classList.add(
|
|
3418
|
+
"cursor-pointer",
|
|
3391
3419
|
"border-l",
|
|
3392
3420
|
"border-input",
|
|
3421
|
+
"[input[aria-invalid=true]~&]:border-negative",
|
|
3422
|
+
"[input:invalid~&]:border-negative",
|
|
3393
3423
|
"h-full",
|
|
3394
3424
|
"aspect-square",
|
|
3395
3425
|
"bg-transparent",
|
|
@@ -3398,6 +3428,7 @@
|
|
|
3398
3428
|
"outline-none",
|
|
3399
3429
|
"relative",
|
|
3400
3430
|
"before:block",
|
|
3431
|
+
"before:opacity-70",
|
|
3401
3432
|
"before:rounded-full",
|
|
3402
3433
|
"before:h-0.5",
|
|
3403
3434
|
"before:min-h-px",
|
|
@@ -3420,8 +3451,11 @@
|
|
|
3420
3451
|
stepUp.setAttribute("aria-controls", input.getAttribute("id"));
|
|
3421
3452
|
stepUp.setAttribute("data-slot", "step-up-trigger");
|
|
3422
3453
|
stepUp.classList.add(
|
|
3454
|
+
"cursor-pointer",
|
|
3423
3455
|
"border-l",
|
|
3424
3456
|
"border-input",
|
|
3457
|
+
"[input[aria-invalid=true]~&]:border-negative",
|
|
3458
|
+
"[input:invalid~&]:border-negative",
|
|
3425
3459
|
"rounded-r-control",
|
|
3426
3460
|
"h-full",
|
|
3427
3461
|
"aspect-square",
|
|
@@ -3431,6 +3465,7 @@
|
|
|
3431
3465
|
"outline-none",
|
|
3432
3466
|
"relative",
|
|
3433
3467
|
"before:block",
|
|
3468
|
+
"before:opacity-70",
|
|
3434
3469
|
"before:absolute",
|
|
3435
3470
|
"before:rounded-full",
|
|
3436
3471
|
"before:h-0.5",
|
|
@@ -3443,6 +3478,7 @@
|
|
|
3443
3478
|
"before:bg-foreground",
|
|
3444
3479
|
"before:hover:bg-secondary-foreground",
|
|
3445
3480
|
"after:block",
|
|
3481
|
+
"after:opacity-70",
|
|
3446
3482
|
"after:absolute",
|
|
3447
3483
|
"after:rounded-full",
|
|
3448
3484
|
"after:h-3",
|
|
@@ -6462,11 +6498,7 @@
|
|
|
6462
6498
|
"duration-200",
|
|
6463
6499
|
"outline-none",
|
|
6464
6500
|
"has-[input:disabled]:pointer-events-none",
|
|
6465
|
-
"has-[input:disabled]:opacity-50"
|
|
6466
|
-
"[&_svg]:pointer-events-none",
|
|
6467
|
-
"[&_svg]:shrink-0",
|
|
6468
|
-
"[&_svg]:size-4",
|
|
6469
|
-
"[&_svg]:opacity-50"
|
|
6501
|
+
"has-[input:disabled]:opacity-50"
|
|
6470
6502
|
);
|
|
6471
6503
|
el.setAttribute("data-slot", "select");
|
|
6472
6504
|
const observer = sizeObserver(el);
|
|
@@ -6704,7 +6736,7 @@
|
|
|
6704
6736
|
fakeTrigger.addEventListener("keydown", onPress);
|
|
6705
6737
|
fakeTrigger.addEventListener("click", onClick2);
|
|
6706
6738
|
const chevronDown = createElement(ChevronDown, {
|
|
6707
|
-
class: ["opacity-
|
|
6739
|
+
class: ["opacity-70 text-foreground size-4 shrink-0 pointer-events-none transition-transform duration-200"],
|
|
6708
6740
|
width: "16",
|
|
6709
6741
|
height: "16",
|
|
6710
6742
|
"aria-hidden": true,
|
|
@@ -8121,12 +8153,12 @@
|
|
|
8121
8153
|
"has-[input:focus-visible]:border-ring",
|
|
8122
8154
|
"has-[input:focus-visible]:ring-[calc(var(--spacing)*0.75)]",
|
|
8123
8155
|
"has-[input:focus-visible]:ring-ring/50",
|
|
8124
|
-
"
|
|
8125
|
-
"
|
|
8126
|
-
"has-[aria-invalid=true]:
|
|
8127
|
-
"has-[aria-invalid=true]:ring-negative/20",
|
|
8128
|
-
"has-[input:invalid]:border-negative",
|
|
8156
|
+
"has-[input[aria-invalid=true]]:ring-negative/20",
|
|
8157
|
+
"has-[input[aria-invalid=true]]:border-negative",
|
|
8158
|
+
"dark:has-[input[aria-invalid=true]]:ring-negative/40",
|
|
8129
8159
|
"has-[input:invalid]:ring-negative/20",
|
|
8160
|
+
"has-[input:invalid]:border-negative",
|
|
8161
|
+
"dark:has-[input:invalid]:ring-negative/40",
|
|
8130
8162
|
"hover:bg-secondary-hover",
|
|
8131
8163
|
"active:bg-secondary-active",
|
|
8132
8164
|
"flex",
|
|
@@ -8134,12 +8166,12 @@
|
|
|
8134
8166
|
"items-center",
|
|
8135
8167
|
"justify-between",
|
|
8136
8168
|
"gap-2",
|
|
8137
|
-
"h-9",
|
|
8138
8169
|
"rounded-control",
|
|
8139
8170
|
"border",
|
|
8140
8171
|
"bg-input-inner",
|
|
8141
8172
|
"pl-3",
|
|
8142
8173
|
"pr-2",
|
|
8174
|
+
"data-[size=sm]:pr-1",
|
|
8143
8175
|
"text-sm",
|
|
8144
8176
|
"whitespace-nowrap",
|
|
8145
8177
|
"shadow-input",
|
|
@@ -8147,17 +8179,13 @@
|
|
|
8147
8179
|
"duration-200",
|
|
8148
8180
|
"outline-none",
|
|
8149
8181
|
"has-[input:disabled]:pointer-events-none",
|
|
8150
|
-
"has-[input:disabled]:opacity-50"
|
|
8151
|
-
"[&_svg]:pointer-events-none",
|
|
8152
|
-
"[&_svg]:shrink-0",
|
|
8153
|
-
"[&_svg]:size-4",
|
|
8154
|
-
"[&_svg]:opacity-50"
|
|
8182
|
+
"has-[input:disabled]:opacity-50"
|
|
8155
8183
|
);
|
|
8156
8184
|
el.setAttribute("data-slot", "time-picker");
|
|
8157
8185
|
el.setAttribute("tabindex", "-1");
|
|
8158
8186
|
el.appendChild(
|
|
8159
8187
|
createElement(Clock, {
|
|
8160
|
-
class: ["opacity-
|
|
8188
|
+
class: ["opacity-70 text-foreground size-4 shrink-0 pointer-events-none"],
|
|
8161
8189
|
width: "16",
|
|
8162
8190
|
height: "16",
|
|
8163
8191
|
"aria-hidden": true,
|
|
@@ -8196,13 +8224,15 @@
|
|
|
8196
8224
|
};
|
|
8197
8225
|
el.addEventListener("click", handler);
|
|
8198
8226
|
el.addEventListener("keydown", handler);
|
|
8227
|
+
const observer = sizeObserver(el);
|
|
8199
8228
|
cleanup(() => {
|
|
8229
|
+
observer.disconnect();
|
|
8200
8230
|
el.removeEventListener("click", handler);
|
|
8201
8231
|
el.removeEventListener("keydown", handler);
|
|
8202
8232
|
top.removeEventListener("click", el._h_timepicker.close);
|
|
8203
8233
|
});
|
|
8204
8234
|
});
|
|
8205
|
-
Alpine.directive("h-time-picker-input", (el, { original }, { effect, Alpine: Alpine2 }) => {
|
|
8235
|
+
Alpine.directive("h-time-picker-input", (el, { original }, { effect, cleanup, Alpine: Alpine2 }) => {
|
|
8206
8236
|
if (el.tagName !== "INPUT") {
|
|
8207
8237
|
throw new Error(`${original} must be a readonly input of type "text"`);
|
|
8208
8238
|
}
|
|
@@ -8236,8 +8266,7 @@
|
|
|
8236
8266
|
timepicker._h_timepicker.id = `htp${v4_default()}`;
|
|
8237
8267
|
el.setAttribute("id", timepicker._h_timepicker.id);
|
|
8238
8268
|
}
|
|
8239
|
-
el.classList.add("cursor-pointer", "bg-transparent", "text-transparent", "text-shadow-[0_0_0_var(--foreground)]", "
|
|
8240
|
-
el.readOnly = true;
|
|
8269
|
+
el.classList.add("cursor-pointer", "bg-transparent", "text-transparent", "text-shadow-[0_0_0_var(--foreground)]", "placeholder:text-muted-foreground", "outline-none", "size-full", "border-0", "md:text-sm", "text-base", "truncate");
|
|
8241
8270
|
el.setAttribute("aria-autocomplete", "none");
|
|
8242
8271
|
el.setAttribute("aria-controls", timepicker._h_timepicker.controls);
|
|
8243
8272
|
el.setAttribute("aria-expanded", "false");
|
|
@@ -8280,11 +8309,20 @@
|
|
|
8280
8309
|
placeholder = timepicker._h_timepicker.is12Hour ? "--:-- --" : "--:--";
|
|
8281
8310
|
}
|
|
8282
8311
|
el.setAttribute("placeholder", placeholder);
|
|
8312
|
+
const preventInput = (event) => {
|
|
8313
|
+
event.preventDefault();
|
|
8314
|
+
};
|
|
8315
|
+
el.addEventListener("beforeinput", preventInput);
|
|
8316
|
+
el.addEventListener("paste", preventInput);
|
|
8283
8317
|
effect(() => {
|
|
8284
8318
|
el.setAttribute("data-state", timepicker._h_timepicker.expanded ? "open" : "closed");
|
|
8285
8319
|
el.setAttribute("aria-expanded", timepicker._h_timepicker.expanded);
|
|
8286
8320
|
});
|
|
8287
|
-
|
|
8321
|
+
cleanup(() => {
|
|
8322
|
+
el.removeEventListener("keydown", preventInput);
|
|
8323
|
+
el.removeEventListener("paste", preventInput);
|
|
8324
|
+
});
|
|
8325
|
+
});
|
|
8288
8326
|
Alpine.directive("h-time-picker-popup", (el, _, { effect, cleanup, Alpine: Alpine2 }) => {
|
|
8289
8327
|
const timepicker = Alpine2.findClosest(el.parentElement, (parent) => parent.hasOwnProperty("_h_timepicker"));
|
|
8290
8328
|
el.classList.add(
|
|
@@ -8301,6 +8339,7 @@
|
|
|
8301
8339
|
"z-50",
|
|
8302
8340
|
"shadow-md"
|
|
8303
8341
|
);
|
|
8342
|
+
el.setAttribute("id", timepicker._h_timepicker.controls);
|
|
8304
8343
|
el.setAttribute("tabindex", "-1");
|
|
8305
8344
|
el.setAttribute("role", "dialog");
|
|
8306
8345
|
el.setAttribute("aria-modal", "true");
|
|
@@ -8497,7 +8536,7 @@
|
|
|
8497
8536
|
}
|
|
8498
8537
|
}
|
|
8499
8538
|
const timeContainer = document.createElement("div");
|
|
8500
|
-
timeContainer.classList.add("hbox", "max-h-[
|
|
8539
|
+
timeContainer.classList.add("hbox", "max-h-[14rem]", "[&>ul]:border-r", "[&>ul:last-of-type]:border-r-0");
|
|
8501
8540
|
if (el.firstChild) el.classList.add("border-b");
|
|
8502
8541
|
timeContainer.setAttribute("role", "group");
|
|
8503
8542
|
timeContainer.addEventListener("click", setTime);
|
|
@@ -8584,6 +8623,7 @@
|
|
|
8584
8623
|
footer.classList.add("hbox", "justify-between", "gap-1", "border-t", "p-2");
|
|
8585
8624
|
footer.setAttribute("tabindex", "-1");
|
|
8586
8625
|
const nowButton = document.createElement("button");
|
|
8626
|
+
nowButton.setAttribute("type", "button");
|
|
8587
8627
|
nowButton.setAttribute(Alpine2.prefixed("h-button"), "");
|
|
8588
8628
|
nowButton.setAttribute("data-size", "sm");
|
|
8589
8629
|
nowButton.setAttribute("data-action", "time");
|
|
@@ -8591,6 +8631,7 @@
|
|
|
8591
8631
|
nowButton.addEventListener("click", getCurrentTime);
|
|
8592
8632
|
footer.appendChild(nowButton);
|
|
8593
8633
|
const okButton = document.createElement("button");
|
|
8634
|
+
okButton.setAttribute("type", "button");
|
|
8594
8635
|
okButton.setAttribute(Alpine2.prefixed("h-button"), "");
|
|
8595
8636
|
okButton.setAttribute("data-variant", "primary");
|
|
8596
8637
|
okButton.setAttribute("data-size", "sm");
|
|
@@ -9250,7 +9291,7 @@
|
|
|
9250
9291
|
}
|
|
9251
9292
|
|
|
9252
9293
|
// package.json
|
|
9253
|
-
var version = "1.
|
|
9294
|
+
var version = "1.1.0";
|
|
9254
9295
|
|
|
9255
9296
|
// src/index.js
|
|
9256
9297
|
window.Harmonia = { getBreakpointListener, addColorSchemeListener, getColorScheme, removeColorSchemeListener, setColorScheme, version };
|