@konomi-app/ui 5.1.0 → 5.2.1

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/index.cjs CHANGED
@@ -291,6 +291,7 @@ updateItemStatus_fn = function(key, itemKey, status) {
291
291
  // src/overlay-dialog.ts
292
292
  var import_lit2 = require("lit");
293
293
  var import_decorators = require("lit/decorators.js");
294
+ var import_keyed = require("lit/directives/keyed.js");
294
295
  var import_unsafe_html = require("lit/directives/unsafe-html.js");
295
296
 
296
297
  // src/styles.ts
@@ -307,7 +308,7 @@ var overlayStyles = import_lit.css`
307
308
  --dialog-z-index: 1000;
308
309
  --dialog-backdrop-color: rgb(255 255 255 / 0.73);
309
310
  --dialog-backdrop-blur: 4px;
310
- --dialog-transition-duration: 250ms;
311
+ --dialog-transition-duration: 280ms;
311
312
 
312
313
  /* Card */
313
314
  --dialog-card-bg: #fff;
@@ -397,7 +398,6 @@ var overlayStyles = import_lit.css`
397
398
  min-height: var(--dialog-card-min-height);
398
399
  position: relative;
399
400
  overflow: hidden;
400
- transition: all var(--dialog-transition-duration) ease;
401
401
  }
402
402
 
403
403
  @media (min-width: 640px) {
@@ -409,22 +409,101 @@ var overlayStyles = import_lit.css`
409
409
  }
410
410
  }
411
411
 
412
+ /* ─── Card Open / Close Animations ─── */
413
+
414
+ @keyframes card-enter {
415
+ from {
416
+ opacity: 0;
417
+ transform: translateY(28px) scale(0.96);
418
+ filter: blur(6px);
419
+ }
420
+ to {
421
+ opacity: 1;
422
+ transform: translateY(0) scale(1);
423
+ filter: blur(0);
424
+ }
425
+ }
426
+
427
+ @keyframes card-exit {
428
+ from {
429
+ opacity: 1;
430
+ transform: translateY(0) scale(1);
431
+ filter: blur(0);
432
+ }
433
+ to {
434
+ opacity: 0;
435
+ transform: translateY(14px) scale(0.97);
436
+ filter: blur(4px);
437
+ }
438
+ }
439
+
440
+ .backdrop[data-open] .card {
441
+ animation: card-enter 420ms cubic-bezier(0.16, 1, 0.3, 1) both;
442
+ }
443
+
444
+ .card[data-closing] {
445
+ animation: card-exit 300ms cubic-bezier(0.4, 0, 1, 1) both;
446
+ pointer-events: none;
447
+ }
448
+
412
449
  /* ─── Card Body ─── */
413
450
 
414
451
  .card-body {
415
452
  flex: 1;
416
453
  display: flex;
417
454
  flex-direction: column;
418
- align-items: center;
455
+ align-items: stretch;
419
456
  justify-content: center;
457
+ width: 100%;
458
+ }
459
+
460
+ /* ─── Body Inner (animated content wrapper) ─── */
461
+
462
+ @keyframes body-enter {
463
+ from {
464
+ opacity: 0;
465
+ transform: translateY(10px);
466
+ filter: blur(3px);
467
+ }
468
+ to {
469
+ opacity: 1;
470
+ transform: translateY(0);
471
+ filter: blur(0);
472
+ }
473
+ }
474
+
475
+ .body-inner {
476
+ display: flex;
477
+ flex-direction: column;
478
+ align-items: center;
420
479
  gap: 16px;
421
480
  width: 100%;
481
+ animation: body-enter 380ms 60ms cubic-bezier(0.16, 1, 0.3, 1) both;
422
482
  }
423
483
 
424
484
  /* ─── Spinner ─── */
425
485
 
426
- .spinner {
486
+ @keyframes spinner-enter {
487
+ from {
488
+ opacity: 0;
489
+ transform: scale(0.5);
490
+ }
491
+ to {
492
+ opacity: 1;
493
+ transform: scale(1);
494
+ }
495
+ }
496
+
497
+ /* spin と spinner-enter は同じ transform を書き換えるため衝突する。
498
+ ラッパーでスケール/フェードを担い、.spinner は回転専用にする。 */
499
+ .spinner-wrap {
427
500
  font-size: var(--dialog-spinner-size);
501
+ width: 1em;
502
+ height: 1em;
503
+ animation: spinner-enter 450ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
504
+ }
505
+
506
+ .spinner {
428
507
  width: 1em;
429
508
  height: 1em;
430
509
  border-radius: 50%;
@@ -465,6 +544,19 @@ var overlayStyles = import_lit.css`
465
544
 
466
545
  /* ─── Icon ─── */
467
546
 
547
+ @keyframes icon-enter {
548
+ from {
549
+ opacity: 0;
550
+ transform: scale(0.4) rotate(-12deg);
551
+ filter: blur(4px);
552
+ }
553
+ to {
554
+ opacity: 1;
555
+ transform: scale(1) rotate(0deg);
556
+ filter: blur(0);
557
+ }
558
+ }
559
+
468
560
  .icon-container {
469
561
  width: 64px;
470
562
  height: 64px;
@@ -473,6 +565,7 @@ var overlayStyles = import_lit.css`
473
565
  align-items: center;
474
566
  justify-content: center;
475
567
  flex-shrink: 0;
568
+ animation: icon-enter 500ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
476
569
  }
477
570
 
478
571
  .icon-container svg {
@@ -598,6 +691,7 @@ var overlayStyles = import_lit.css`
598
691
  gap: 8px;
599
692
  width: 100%;
600
693
  margin-top: 8px;
694
+ animation: body-enter 320ms 160ms cubic-bezier(0.16, 1, 0.3, 1) both;
601
695
  }
602
696
 
603
697
  @media (min-width: 640px) {
@@ -617,7 +711,8 @@ var overlayStyles = import_lit.css`
617
711
  font-weight: 500;
618
712
  transition:
619
713
  background-color 150ms ease,
620
- transform 80ms ease;
714
+ transform 80ms ease,
715
+ box-shadow 150ms ease;
621
716
  min-width: 100px;
622
717
  text-align: center;
623
718
  }
@@ -633,6 +728,7 @@ var overlayStyles = import_lit.css`
633
728
 
634
729
  .btn-confirm:hover {
635
730
  background-color: var(--dialog-primary-hover);
731
+ box-shadow: 0 4px 12px rgb(59 130 246 / 0.35);
636
732
  }
637
733
 
638
734
  .btn-cancel {
@@ -656,11 +752,48 @@ var overlayStyles = import_lit.css`
656
752
  list-style: none;
657
753
  }
658
754
 
755
+ @keyframes task-item-enter {
756
+ from {
757
+ opacity: 0;
758
+ transform: translateX(-8px);
759
+ }
760
+ to {
761
+ opacity: 1;
762
+ transform: translateX(0);
763
+ }
764
+ }
765
+
659
766
  .task-item {
660
767
  display: flex;
661
768
  align-items: center;
662
769
  gap: 12px;
663
770
  font-size: 14px;
771
+ animation: task-item-enter 300ms cubic-bezier(0.16, 1, 0.3, 1) both;
772
+ }
773
+
774
+ .task-item:nth-child(1) {
775
+ animation-delay: 40ms;
776
+ }
777
+ .task-item:nth-child(2) {
778
+ animation-delay: 80ms;
779
+ }
780
+ .task-item:nth-child(3) {
781
+ animation-delay: 120ms;
782
+ }
783
+ .task-item:nth-child(4) {
784
+ animation-delay: 160ms;
785
+ }
786
+ .task-item:nth-child(5) {
787
+ animation-delay: 200ms;
788
+ }
789
+ .task-item:nth-child(6) {
790
+ animation-delay: 240ms;
791
+ }
792
+ .task-item:nth-child(7) {
793
+ animation-delay: 280ms;
794
+ }
795
+ .task-item:nth-child(8) {
796
+ animation-delay: 320ms;
664
797
  }
665
798
 
666
799
  .task-icon {
@@ -710,6 +843,7 @@ var overlayStyles = import_lit.css`
710
843
 
711
844
  .task-label {
712
845
  color: #6b7280;
846
+ transition: color 250ms ease;
713
847
  }
714
848
 
715
849
  .task-label[data-status='active'] {
@@ -717,8 +851,21 @@ var overlayStyles = import_lit.css`
717
851
  font-weight: 500;
718
852
  }
719
853
 
854
+ @keyframes task-done-flash {
855
+ 0% {
856
+ transform: translateX(0);
857
+ }
858
+ 30% {
859
+ transform: translateX(4px);
860
+ }
861
+ 100% {
862
+ transform: translateX(0);
863
+ }
864
+ }
865
+
720
866
  .task-label[data-status='done'] {
721
867
  color: var(--dialog-success);
868
+ animation: task-done-flash 350ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
722
869
  }
723
870
 
724
871
  .task-label[data-status='error'] {
@@ -727,7 +874,6 @@ var overlayStyles = import_lit.css`
727
874
 
728
875
  .task-label[data-status='skipped'] {
729
876
  color: #9ca3af;
730
- text-decoration: line-through;
731
877
  }
732
878
 
733
879
  /* ─── Queue ellipsis ─── */
@@ -763,17 +909,54 @@ var overlayStyles = import_lit.css`
763
909
  margin-bottom: 8px;
764
910
  }
765
911
 
912
+ @keyframes step-dot-enter {
913
+ from {
914
+ opacity: 0;
915
+ transform: scale(0.4);
916
+ }
917
+ to {
918
+ opacity: 1;
919
+ transform: scale(1);
920
+ }
921
+ }
922
+
923
+ @keyframes step-pulse {
924
+ 0% {
925
+ box-shadow:
926
+ 0 0 0 0 rgb(59 130 246 / 0.5),
927
+ 0 0 0 3px rgb(59 130 246 / 0.2);
928
+ }
929
+ 70% {
930
+ box-shadow:
931
+ 0 0 0 7px rgb(59 130 246 / 0),
932
+ 0 0 0 3px rgb(59 130 246 / 0.2);
933
+ }
934
+ 100% {
935
+ box-shadow:
936
+ 0 0 0 0 rgb(59 130 246 / 0),
937
+ 0 0 0 3px rgb(59 130 246 / 0.2);
938
+ }
939
+ }
940
+
766
941
  .step-dot {
767
942
  width: 8px;
768
943
  height: 8px;
769
944
  border-radius: 50%;
770
945
  background-color: #d1d5db;
771
- transition: background-color 200ms ease;
946
+ transition:
947
+ background-color 250ms ease,
948
+ transform 250ms cubic-bezier(0.34, 1.56, 0.64, 1),
949
+ width 250ms cubic-bezier(0.34, 1.56, 0.64, 1);
950
+ animation: step-dot-enter 400ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
772
951
  }
773
952
 
774
953
  .step-dot[data-status='active'] {
775
954
  background-color: var(--dialog-primary);
776
- box-shadow: 0 0 0 3px rgb(59 130 246 / 0.2);
955
+ width: 20px;
956
+ border-radius: 4px;
957
+ animation:
958
+ step-dot-enter 400ms cubic-bezier(0.34, 1.56, 0.64, 1) both,
959
+ step-pulse 2s 400ms infinite;
777
960
  }
778
961
 
779
962
  .step-dot[data-status='done'] {
@@ -793,6 +976,7 @@ var overlayStyles = import_lit.css`
793
976
  max-width: 24px;
794
977
  height: 2px;
795
978
  background-color: #e5e7eb;
979
+ transition: background-color 400ms ease;
796
980
  }
797
981
  `;
798
982
 
@@ -801,6 +985,8 @@ var OverlayDialog = class extends import_lit2.LitElement {
801
985
  constructor() {
802
986
  super(...arguments);
803
987
  this._state = createInitialState();
988
+ this._bodyKey = 0;
989
+ this._isClosing = false;
804
990
  this._beforeUnloadHandler = (e) => e.preventDefault();
805
991
  this._onKeyDown = (e) => {
806
992
  if (e.key === "Escape" && this._state.open) {
@@ -814,13 +1000,24 @@ var OverlayDialog = class extends import_lit2.LitElement {
814
1000
  this._state = { ...this.controller.state };
815
1001
  this._unsubscribe = this.controller.subscribe((s) => {
816
1002
  const wasOpen = this._state.open;
817
- this._state = s;
818
- this._syncBodyScroll(s.open);
1003
+ const prevDialogType = this._state.dialogType;
819
1004
  if (s.open && !wasOpen) {
1005
+ this._isClosing = false;
1006
+ clearTimeout(this._closeTimer);
820
1007
  window.addEventListener("beforeunload", this._beforeUnloadHandler);
821
1008
  } else if (!s.open && wasOpen) {
1009
+ this._isClosing = true;
1010
+ clearTimeout(this._closeTimer);
1011
+ this._closeTimer = setTimeout(() => {
1012
+ this._isClosing = false;
1013
+ }, 320);
822
1014
  window.removeEventListener("beforeunload", this._beforeUnloadHandler);
823
1015
  }
1016
+ if (s.open && s.dialogType !== prevDialogType) {
1017
+ this._bodyKey++;
1018
+ }
1019
+ this._state = s;
1020
+ this._syncBodyScroll(s.open);
824
1021
  });
825
1022
  }
826
1023
  window.addEventListener("keydown", this._onKeyDown);
@@ -829,6 +1026,7 @@ var OverlayDialog = class extends import_lit2.LitElement {
829
1026
  super.disconnectedCallback();
830
1027
  this._unsubscribe?.();
831
1028
  this._syncBodyScroll(false);
1029
+ clearTimeout(this._closeTimer);
832
1030
  window.removeEventListener("beforeunload", this._beforeUnloadHandler);
833
1031
  window.removeEventListener("keydown", this._onKeyDown);
834
1032
  }
@@ -904,9 +1102,11 @@ var OverlayDialog = class extends import_lit2.LitElement {
904
1102
  }
905
1103
  _renderSpinner() {
906
1104
  return import_lit2.html`
907
- <div class="spinner">
908
- <div class="spinner-half">
909
- <div class="spinner-inner"></div>
1105
+ <div class="spinner-wrap">
1106
+ <div class="spinner">
1107
+ <div class="spinner-half">
1108
+ <div class="spinner-inner"></div>
1109
+ </div>
910
1110
  </div>
911
1111
  </div>
912
1112
  `;
@@ -1093,9 +1293,11 @@ var OverlayDialog = class extends import_lit2.LitElement {
1093
1293
  const showHeaderTitle = s.title && s.dialogType !== "alert" && s.dialogType !== "confirm";
1094
1294
  return import_lit2.html`
1095
1295
  <div class="backdrop" ?data-open=${s.open} @click=${this._onBackdropClick}>
1096
- <div class="card">
1296
+ <div class="card" ?data-closing=${this._isClosing}>
1097
1297
  ${showHeaderTitle ? import_lit2.html`<p class="dialog-title">${s.title}</p>` : import_lit2.nothing}
1098
- <div class="card-body">${this._renderBody()}</div>
1298
+ <div class="card-body">
1299
+ ${(0, import_keyed.keyed)(this._bodyKey, import_lit2.html`<div class="body-inner">${this._renderBody()}</div>`)}
1300
+ </div>
1099
1301
  <div
1100
1302
  class="progress-bar"
1101
1303
  style="width:${s.progress ?? 0}%;opacity:${s.progress !== null ? 1 : 0}"
@@ -1112,6 +1314,12 @@ __decorateClass([
1112
1314
  __decorateClass([
1113
1315
  (0, import_decorators.state)()
1114
1316
  ], OverlayDialog.prototype, "_state", 2);
1317
+ __decorateClass([
1318
+ (0, import_decorators.state)()
1319
+ ], OverlayDialog.prototype, "_bodyKey", 2);
1320
+ __decorateClass([
1321
+ (0, import_decorators.state)()
1322
+ ], OverlayDialog.prototype, "_isClosing", 2);
1115
1323
  OverlayDialog = __decorateClass([
1116
1324
  (0, import_decorators.customElement)("overlay-dialog")
1117
1325
  ], OverlayDialog);