@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.js CHANGED
@@ -2302,7 +2302,7 @@
2302
2302
  previousYearBtn.setAttribute("type", "button");
2303
2303
  previousYearBtn.appendChild(
2304
2304
  createElement(ChevronsLeft, {
2305
- class: ["opacity-50 size-4 shrink-0 pointer-events-none"],
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-50 size-4 shrink-0 pointer-events-none"],
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-50 size-4 shrink-0 pointer-events-none"],
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-50 size-4 shrink-0 pointer-events-none"],
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
- "flex-1",
2838
- "h-full",
2839
- "border-0",
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-50 size-4 transition-transform duration-200"],
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
- }).before("h-button");
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-50 size-4 transition-transform duration-200"],
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
- "dark:has-[aria-invalid=true]:ring-negative/40",
8125
- "dark:has-[input:invalid]:ring-negative/40",
8126
- "has-[aria-invalid=true]:border-negative",
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-50 size-4 transition-transform duration-200"],
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)]", "outline-none", "flex-1", "h-full", "border-0", "md:text-sm", "text-base");
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
- }).before("h-button");
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-[18rem]", "[&>ul]:border-r", "[&>ul:last-of-type]:border-r-0");
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.0.0";
9294
+ var version = "1.1.0";
9254
9295
 
9255
9296
  // src/index.js
9256
9297
  window.Harmonia = { getBreakpointListener, addColorSchemeListener, getColorScheme, removeColorSchemeListener, setColorScheme, version };