@14ch/svelte-ui 0.0.71 → 0.0.73

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.
@@ -19,6 +19,8 @@
19
19
  button {
20
20
  background: transparent;
21
21
  border: none;
22
+ /* UA 既定の color: buttontext は継承より強く、ダークテーマでも黒のままになる */
23
+ color: inherit;
22
24
  font-size: inherit;
23
25
  font-weight: inherit;
24
26
  cursor: pointer;
@@ -157,6 +157,8 @@
157
157
  --svelte-ui-form-bg: var(--base-50-transparent);
158
158
  /* サーフェス背景色 */
159
159
  --svelte-ui-surface-color: var(--white);
160
+ /* 浮き上がる面(ポップアップ・ダイアログ等)。ライトは白より明るくできないため地の面と同じ */
161
+ --svelte-ui-surface-elevated-color: var(--svelte-ui-surface-color);
160
162
  --svelte-ui-surface-accent-color: var(--base-50-transparent);
161
163
  --svelte-ui-surface-inverse-color: var(--base-800-transparent);
162
164
  /* スケルトン色 */
@@ -174,6 +176,10 @@
174
176
  --svelte-ui-disabled-bg: var(--base-50-transparent);
175
177
  /* Glass色 */
176
178
  --svelte-ui-glass-bg: var(--base-50-transparent);
179
+ /* 影の色(浮き上がり表現) */
180
+ --svelte-ui-shadow-color-strong: rgba(0, 0, 0, 0.2);
181
+ --svelte-ui-shadow-color: rgba(0, 0, 0, 0.14);
182
+ --svelte-ui-shadow-color-weak: rgba(0, 0, 0, 0.12);
177
183
  }
178
184
 
179
185
  /* ====================================
@@ -199,6 +205,8 @@
199
205
  --svelte-ui-form-bg: var(--white-100-transparent);
200
206
  /* サーフェス背景色 */
201
207
  --svelte-ui-surface-color: var(--base-950);
208
+ /* 浮き上がる面。暗いテーマでは「明るい=手前」で奥行きを示すため一段明るくする */
209
+ --svelte-ui-surface-elevated-color: var(--base-900);
202
210
  --svelte-ui-surface-accent-color: var(--white-50-transparent);
203
211
  --svelte-ui-surface-inverse-color: var(--white-800-transparent);
204
212
  /* スケルトン色 */
@@ -214,6 +222,10 @@
214
222
  --svelte-ui-disabled-bg: var(--white-100-transparent);
215
223
  /* Glass色 */
216
224
  --svelte-ui-glass-bg: var(--white-100-transparent);
225
+ /* 影の色(浮き上がり表現)。暗い背景では黒い影が沈んで見えないため濃くする */
226
+ --svelte-ui-shadow-color-strong: rgba(0, 0, 0, 0.6);
227
+ --svelte-ui-shadow-color: rgba(0, 0, 0, 0.45);
228
+ --svelte-ui-shadow-color-weak: rgba(0, 0, 0, 0.4);
217
229
  }
218
230
 
219
231
  :where(:root),
@@ -369,7 +381,7 @@
369
381
  --svelte-ui-nav-children-offset: 8px;
370
382
  /* Nav: sub-menu */
371
383
  --svelte-ui-nav-sub-popup-min-width: 160px;
372
- --svelte-ui-nav-sub-popup-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
384
+ --svelte-ui-nav-sub-popup-shadow: 0 4px 16px var(--svelte-ui-shadow-color-weak);
373
385
  --svelte-ui-nav-item-child-indent: 32px;
374
386
  --svelte-ui-nav-bottom-sheet-overlay-bg: rgba(0, 0, 0, 0.4);
375
387
  --svelte-ui-nav-bottom-sheet-border-radius: 16px 16px 0 0;
@@ -581,7 +593,7 @@
581
593
  --svelte-ui-combobox-border-radius: var(--svelte-ui-form-border-radius);
582
594
  --svelte-ui-combobox-border-radius-rounded: var(--svelte-ui-form-border-radius-rounded);
583
595
  --svelte-ui-combobox-border-color: var(--svelte-ui-border-weak-color);
584
- --svelte-ui-combobox-bg: var(--svelte-ui-surface-color);
596
+ --svelte-ui-combobox-bg: var(--svelte-ui-surface-elevated-color);
585
597
  --svelte-ui-combobox-dropdown-icon-color: var(--svelte-ui-dropdown-icon-color);
586
598
  --svelte-ui-combobox-option-hover-bg: var(--svelte-ui-hover-overlay);
587
599
  --svelte-ui-combobox-option-selected-bg: var(--svelte-ui-select-overlay);
@@ -684,7 +696,7 @@
684
696
  --svelte-ui-snackbar-z-index: 9999;
685
697
  --svelte-ui-snackbar-font-size: var(--svelte-ui-font-size);
686
698
  --svelte-ui-snackbar-line-height: 1.4;
687
- --svelte-ui-snackbar-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
699
+ --svelte-ui-snackbar-shadow: 0 4px 12px var(--svelte-ui-shadow-color);
688
700
  --svelte-ui-snackbar-action-font-size: var(--svelte-ui-font-size-xs);
689
701
  --svelte-ui-snackbar-action-font-weight: 600;
690
702
  --svelte-ui-snackbar-action-padding: 4px 8px;
@@ -700,7 +712,7 @@
700
712
  --svelte-ui-snackbar-default-filled-text-color: var(--svelte-ui-text-inverse-color);
701
713
  --svelte-ui-snackbar-default-outlined-bg: color-mix(
702
714
  in srgb,
703
- var(--svelte-ui-surface-color) 85%,
715
+ var(--svelte-ui-surface-elevated-color) 85%,
704
716
  transparent
705
717
  );
706
718
  --svelte-ui-snackbar-default-outlined-text-color: var(--svelte-ui-text-color);
@@ -714,7 +726,7 @@
714
726
  --svelte-ui-snackbar-info-filled-text-color: var(--svelte-ui-text-on-filled-color);
715
727
  --svelte-ui-snackbar-info-outlined-bg: color-mix(
716
728
  in srgb,
717
- var(--svelte-ui-surface-color) 85%,
729
+ var(--svelte-ui-surface-elevated-color) 85%,
718
730
  transparent
719
731
  );
720
732
  --svelte-ui-snackbar-info-outlined-text-color: var(--svelte-ui-info-color);
@@ -728,7 +740,7 @@
728
740
  --svelte-ui-snackbar-success-filled-text-color: var(--svelte-ui-text-on-filled-color);
729
741
  --svelte-ui-snackbar-success-outlined-bg: color-mix(
730
742
  in srgb,
731
- var(--svelte-ui-surface-color) 85%,
743
+ var(--svelte-ui-surface-elevated-color) 85%,
732
744
  transparent
733
745
  );
734
746
  --svelte-ui-snackbar-success-outlined-text-color: var(--svelte-ui-success-color);
@@ -742,7 +754,7 @@
742
754
  --svelte-ui-snackbar-warning-filled-text-color: var(--svelte-ui-text-on-filled-color);
743
755
  --svelte-ui-snackbar-warning-outlined-bg: color-mix(
744
756
  in srgb,
745
- var(--svelte-ui-surface-color) 85%,
757
+ var(--svelte-ui-surface-elevated-color) 85%,
746
758
  transparent
747
759
  );
748
760
  --svelte-ui-snackbar-warning-outlined-text-color: var(--svelte-ui-warning-color);
@@ -756,7 +768,7 @@
756
768
  --svelte-ui-snackbar-error-filled-text-color: var(--svelte-ui-text-on-filled-color);
757
769
  --svelte-ui-snackbar-error-outlined-bg: color-mix(
758
770
  in srgb,
759
- var(--svelte-ui-surface-color) 85%,
771
+ var(--svelte-ui-surface-elevated-color) 85%,
760
772
  transparent
761
773
  );
762
774
  --svelte-ui-snackbar-error-outlined-text-color: var(--svelte-ui-error-color);
@@ -927,6 +939,8 @@
927
939
  button {
928
940
  background: transparent;
929
941
  border: none;
942
+ /* UA 既定の color: buttontext は継承より強く、ダークテーマでも黒のままになる */
943
+ color: inherit;
930
944
  font-size: inherit;
931
945
  font-weight: inherit;
932
946
  cursor: pointer;
@@ -163,6 +163,8 @@
163
163
 
164
164
  /* サーフェス背景色 */
165
165
  --svelte-ui-surface-color: var(--white);
166
+ /* 浮き上がる面(ポップアップ・ダイアログ等)。ライトは白より明るくできないため地の面と同じ */
167
+ --svelte-ui-surface-elevated-color: var(--svelte-ui-surface-color);
166
168
  --svelte-ui-surface-accent-color: var(--base-50-transparent);
167
169
  --svelte-ui-surface-inverse-color: var(--base-800-transparent);
168
170
 
@@ -187,6 +189,11 @@
187
189
 
188
190
  /* Glass色 */
189
191
  --svelte-ui-glass-bg: var(--base-50-transparent);
192
+
193
+ /* 影の色(浮き上がり表現) */
194
+ --svelte-ui-shadow-color-strong: rgba(0, 0, 0, 0.2);
195
+ --svelte-ui-shadow-color: rgba(0, 0, 0, 0.14);
196
+ --svelte-ui-shadow-color-weak: rgba(0, 0, 0, 0.12);
190
197
  }
191
198
 
192
199
  /* ====================================
@@ -217,6 +224,8 @@
217
224
 
218
225
  /* サーフェス背景色 */
219
226
  --svelte-ui-surface-color: var(--base-950);
227
+ /* 浮き上がる面。暗いテーマでは「明るい=手前」で奥行きを示すため一段明るくする */
228
+ --svelte-ui-surface-elevated-color: var(--base-900);
220
229
  --svelte-ui-surface-accent-color: var(--white-50-transparent);
221
230
  --svelte-ui-surface-inverse-color: var(--white-800-transparent);
222
231
 
@@ -238,6 +247,11 @@
238
247
 
239
248
  /* Glass色 */
240
249
  --svelte-ui-glass-bg: var(--white-100-transparent);
250
+
251
+ /* 影の色(浮き上がり表現)。暗い背景では黒い影が沈んで見えないため濃くする */
252
+ --svelte-ui-shadow-color-strong: rgba(0, 0, 0, 0.6);
253
+ --svelte-ui-shadow-color: rgba(0, 0, 0, 0.45);
254
+ --svelte-ui-shadow-color-weak: rgba(0, 0, 0, 0.4);
241
255
  }
242
256
 
243
257
  :where(:root),
@@ -407,7 +421,7 @@
407
421
  --svelte-ui-nav-children-offset: 8px;
408
422
  /* Nav: sub-menu */
409
423
  --svelte-ui-nav-sub-popup-min-width: 160px;
410
- --svelte-ui-nav-sub-popup-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
424
+ --svelte-ui-nav-sub-popup-shadow: 0 4px 16px var(--svelte-ui-shadow-color-weak);
411
425
  --svelte-ui-nav-item-child-indent: 32px;
412
426
  --svelte-ui-nav-bottom-sheet-overlay-bg: rgba(0, 0, 0, 0.4);
413
427
  --svelte-ui-nav-bottom-sheet-border-radius: 16px 16px 0 0;
@@ -631,7 +645,7 @@
631
645
  --svelte-ui-combobox-border-radius: var(--svelte-ui-form-border-radius);
632
646
  --svelte-ui-combobox-border-radius-rounded: var(--svelte-ui-form-border-radius-rounded);
633
647
  --svelte-ui-combobox-border-color: var(--svelte-ui-border-weak-color);
634
- --svelte-ui-combobox-bg: var(--svelte-ui-surface-color);
648
+ --svelte-ui-combobox-bg: var(--svelte-ui-surface-elevated-color);
635
649
  --svelte-ui-combobox-dropdown-icon-color: var(--svelte-ui-dropdown-icon-color);
636
650
  --svelte-ui-combobox-option-hover-bg: var(--svelte-ui-hover-overlay);
637
651
  --svelte-ui-combobox-option-selected-bg: var(--svelte-ui-select-overlay);
@@ -744,7 +758,7 @@
744
758
  --svelte-ui-snackbar-z-index: 9999;
745
759
  --svelte-ui-snackbar-font-size: var(--svelte-ui-font-size);
746
760
  --svelte-ui-snackbar-line-height: 1.4;
747
- --svelte-ui-snackbar-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
761
+ --svelte-ui-snackbar-shadow: 0 4px 12px var(--svelte-ui-shadow-color);
748
762
  --svelte-ui-snackbar-action-font-size: var(--svelte-ui-font-size-xs);
749
763
  --svelte-ui-snackbar-action-font-weight: 600;
750
764
  --svelte-ui-snackbar-action-padding: 4px 8px;
@@ -761,7 +775,7 @@
761
775
  --svelte-ui-snackbar-default-filled-text-color: var(--svelte-ui-text-inverse-color);
762
776
  --svelte-ui-snackbar-default-outlined-bg: color-mix(
763
777
  in srgb,
764
- var(--svelte-ui-surface-color) 85%,
778
+ var(--svelte-ui-surface-elevated-color) 85%,
765
779
  transparent
766
780
  );
767
781
  --svelte-ui-snackbar-default-outlined-text-color: var(--svelte-ui-text-color);
@@ -776,7 +790,7 @@
776
790
  --svelte-ui-snackbar-info-filled-text-color: var(--svelte-ui-text-on-filled-color);
777
791
  --svelte-ui-snackbar-info-outlined-bg: color-mix(
778
792
  in srgb,
779
- var(--svelte-ui-surface-color) 85%,
793
+ var(--svelte-ui-surface-elevated-color) 85%,
780
794
  transparent
781
795
  );
782
796
  --svelte-ui-snackbar-info-outlined-text-color: var(--svelte-ui-info-color);
@@ -791,7 +805,7 @@
791
805
  --svelte-ui-snackbar-success-filled-text-color: var(--svelte-ui-text-on-filled-color);
792
806
  --svelte-ui-snackbar-success-outlined-bg: color-mix(
793
807
  in srgb,
794
- var(--svelte-ui-surface-color) 85%,
808
+ var(--svelte-ui-surface-elevated-color) 85%,
795
809
  transparent
796
810
  );
797
811
  --svelte-ui-snackbar-success-outlined-text-color: var(--svelte-ui-success-color);
@@ -806,7 +820,7 @@
806
820
  --svelte-ui-snackbar-warning-filled-text-color: var(--svelte-ui-text-on-filled-color);
807
821
  --svelte-ui-snackbar-warning-outlined-bg: color-mix(
808
822
  in srgb,
809
- var(--svelte-ui-surface-color) 85%,
823
+ var(--svelte-ui-surface-elevated-color) 85%,
810
824
  transparent
811
825
  );
812
826
  --svelte-ui-snackbar-warning-outlined-text-color: var(--svelte-ui-warning-color);
@@ -821,7 +835,7 @@
821
835
  --svelte-ui-snackbar-error-filled-text-color: var(--svelte-ui-text-on-filled-color);
822
836
  --svelte-ui-snackbar-error-outlined-bg: color-mix(
823
837
  in srgb,
824
- var(--svelte-ui-surface-color) 85%,
838
+ var(--svelte-ui-surface-elevated-color) 85%,
825
839
  transparent
826
840
  );
827
841
  --svelte-ui-snackbar-error-outlined-text-color: var(--svelte-ui-error-color);
@@ -506,6 +506,10 @@
506
506
  return `calendar-date-${date.format('YYYY-MM-DD')}`;
507
507
  };
508
508
 
509
+ // id 未指定でも aria の参照先が作れるようフォールバックを持つ
510
+ const fallbackId = `datepicker-calendar-${Math.random().toString(36).substring(2, 15)}`;
511
+ const monthLabelId = $derived(`${id ?? fallbackId}-month-label`);
512
+
509
513
  const handleMouseEnter = (date: dayjs.Dayjs) => {
510
514
  if (mode !== 'range' || isOutOfRange(date)) return;
511
515
  hoveredDate = date;
@@ -584,6 +588,7 @@
584
588
  </div>
585
589
  <button
586
590
  type="button"
591
+ id={monthLabelId}
587
592
  class="datepicker-calendar__header__month-label-button"
588
593
  aria-live="polite"
589
594
  aria-atomic="true"
@@ -632,7 +637,7 @@
632
637
  {/each}
633
638
  </div>
634
639
  {:else}
635
- <div class="datepicker-calendar__date-selection" role="grid" aria-labelledby="month-label">
640
+ <div class="datepicker-calendar__date-selection" role="grid" aria-labelledby={monthLabelId}>
636
641
  <div class="datepicker-calendar__day-list" role="row">
637
642
  {#each DAY_ARRAY as day}
638
643
  <div class="datepicker-calendar__day-item" role="columnheader">
@@ -730,7 +735,8 @@
730
735
  .datepicker-calendar__month-button {
731
736
  padding: 8px;
732
737
  border-radius: var(--svelte-ui-border-radius);
733
- background-color: var(--svelte-ui-surface-color);
738
+ /* 器(ポップアップ)の色に追従させる */
739
+ background-color: transparent;
734
740
  color: var(--svelte-ui-datepicker-date-color);
735
741
  font-size: var(--svelte-ui-font-size);
736
742
  cursor: pointer;
@@ -143,9 +143,19 @@
143
143
 
144
144
  const dialogClasses = $derived('');
145
145
 
146
- const ariaLabelledby = $derived(title ? 'dialog-title' : undefined);
146
+ // id 未指定でも aria の参照先が作れるようフォールバックを持つ
147
+ const fallbackId = `dialog-${Math.random().toString(36).substring(2, 15)}`;
148
+ const baseId = $derived(id ?? fallbackId);
149
+ const titleId = $derived(`${baseId}-dialog-title`);
150
+ const descriptionId = $derived(`${baseId}-dialog-description`);
151
+
152
+ // 名前は 1 つだけ与える。aria-labelledby は aria-label より優先されるため、両方は付けない。
153
+ // header を差し替えるとタイトル要素が描画されないので、そのときは title を aria-label で渡す
154
+ const hasTitleElement = $derived(!!title && !header);
155
+ const ariaLabelValue = $derived(ariaLabel || (title && !hasTitleElement ? title : undefined));
156
+ const ariaLabelledby = $derived(!ariaLabelValue && hasTitleElement ? titleId : undefined);
147
157
  const ariaDescribedbyValue = $derived(
148
- ariaDescribedby || (description ? 'dialog-description' : undefined)
158
+ ariaDescribedby || (description ? descriptionId : undefined)
149
159
  );
150
160
  </script>
151
161
 
@@ -158,7 +168,7 @@
158
168
  {onOpen}
159
169
  {onClose}
160
170
  componentType="Dialog"
161
- {ariaLabel}
171
+ ariaLabel={ariaLabelValue}
162
172
  {ariaLabelledby}
163
173
  ariaDescribedby={ariaDescribedbyValue}
164
174
  customClass={dialogClasses}
@@ -171,14 +181,14 @@
171
181
  {#if header}
172
182
  {@render header()}
173
183
  {:else}
174
- <div class="dialog__title" id={id ? `${id}-dialog-title` : undefined}>
184
+ <div class="dialog__title" id={titleId}>
175
185
  {title || ''}
176
186
  </div>
177
187
  {/if}
178
188
  </div>
179
189
  {/if}
180
190
  {#if description}
181
- <div class="dialog__description" id={id ? `${id}-dialog-description` : undefined}>
191
+ <div class="dialog__description" id={descriptionId}>
182
192
  {description}
183
193
  </div>
184
194
  {/if}
@@ -93,7 +93,7 @@
93
93
  focusFirstOnOpen = false,
94
94
 
95
95
  // ARIA/アクセシビリティ
96
- ariaLabel = 'Drawer',
96
+ ariaLabel,
97
97
  ariaDescribedby,
98
98
 
99
99
  // イベントハンドラー
@@ -108,17 +108,17 @@
108
108
  // =========================================================================
109
109
  /** Opens the drawer. */
110
110
  export const open = (): void => {
111
- modalRef?.open(title || ariaLabel);
111
+ modalRef?.open(title || ariaLabelValue);
112
112
  };
113
113
 
114
114
  /** Closes the drawer. */
115
115
  export const close = (): void => {
116
- modalRef?.close(title || ariaLabel);
116
+ modalRef?.close(title || ariaLabelValue);
117
117
  };
118
118
 
119
119
  /** Toggles between open and closed. */
120
120
  export const toggle = (): void => {
121
- modalRef?.toggle(title || ariaLabel);
121
+ modalRef?.toggle(title || ariaLabelValue);
122
122
  };
123
123
 
124
124
  /** @internal Completes the close animation. Called automatically. */
@@ -157,9 +157,19 @@
157
157
  ['drawer-wrapper', `drawer-wrapper--${position}`].filter(Boolean).join(' ')
158
158
  );
159
159
 
160
- const ariaLabelledby = $derived(title ? 'drawer-title' : undefined);
160
+ // id 未指定でも aria の参照先が作れるようフォールバックを持つ
161
+ const fallbackId = `drawer-${Math.random().toString(36).substring(2, 15)}`;
162
+ const baseId = $derived(id ?? fallbackId);
163
+ const titleId = $derived(`${baseId}-drawer-title`);
164
+ const descriptionId = $derived(`${baseId}-drawer-description`);
165
+
166
+ // 名前は 1 つだけ与える。aria-labelledby は aria-label より優先されるため、両方は付けない。
167
+ // header を差し替えるとタイトル要素が描画されないので、そのときは title を aria-label で渡す
168
+ const hasTitleElement = $derived(!!title && !header);
169
+ const ariaLabelValue = $derived(ariaLabel ?? (hasTitleElement ? undefined : title || 'Drawer'));
170
+ const ariaLabelledby = $derived(!ariaLabelValue && hasTitleElement ? titleId : undefined);
161
171
  const ariaDescribedbyValue = $derived(
162
- ariaDescribedby || (description ? 'drawer-description' : undefined)
172
+ ariaDescribedby || (description ? descriptionId : undefined)
163
173
  );
164
174
  </script>
165
175
 
@@ -172,27 +182,30 @@
172
182
  {onOpen}
173
183
  {onClose}
174
184
  componentType="Drawer"
175
- {ariaLabel}
185
+ ariaLabel={ariaLabelValue}
176
186
  {ariaLabelledby}
177
187
  ariaDescribedby={ariaDescribedbyValue}
178
188
  customClass={drawerClasses}
179
189
  customStyles={drawerStyles()}
180
190
  id={id ? `${id}-modal` : undefined}
181
191
  >
182
- <div class="drawer drawer--{position} {scrollable ? 'drawer--scrollable' : ''}" data-testid="drawer">
192
+ <div
193
+ class="drawer drawer--{position} {scrollable ? 'drawer--scrollable' : ''}"
194
+ data-testid="drawer"
195
+ >
183
196
  {#if header || title}
184
197
  <div class="drawer__header">
185
198
  {#if header}
186
199
  {@render header()}
187
200
  {:else}
188
- <div class="drawer__title" id={id ? `${id}-drawer-title` : undefined}>
201
+ <div class="drawer__title" id={titleId}>
189
202
  {title || ''}
190
203
  </div>
191
204
  {/if}
192
205
  </div>
193
206
  {/if}
194
207
  {#if description}
195
- <div class="drawer__description" id={id ? `${id}-drawer-description` : undefined}>
208
+ <div class="drawer__description" id={descriptionId}>
196
209
  {description}
197
210
  </div>
198
211
  {/if}
@@ -488,24 +488,24 @@
488
488
  -webkit-backdrop-filter: var(--svelte-ui-glass-blur);
489
489
  }
490
490
  .fab.fab--shadow {
491
- box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
491
+ box-shadow: 0px 3px 5px -1px var(--svelte-ui-shadow-color-strong), 0px 6px 10px 0px var(--svelte-ui-shadow-color), 0px 1px 18px 0px var(--svelte-ui-shadow-color-weak);
492
492
  }
493
493
  .fab.fab--outlined.fab--shadow {
494
- box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
494
+ box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 3px 5px -1px var(--svelte-ui-shadow-color-strong), 0px 6px 10px 0px var(--svelte-ui-shadow-color), 0px 1px 18px 0px var(--svelte-ui-shadow-color-weak);
495
495
  }
496
496
  @media (hover: hover) {
497
497
  .fab.fab--shadow:hover {
498
- box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
498
+ box-shadow: 0px 5px 5px -3px var(--svelte-ui-shadow-color-strong), 0px 8px 10px 1px var(--svelte-ui-shadow-color), 0px 3px 14px 2px var(--svelte-ui-shadow-color-weak);
499
499
  }
500
500
  .fab.fab--outlined.fab--shadow:hover {
501
- box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
501
+ box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 5px 5px -3px var(--svelte-ui-shadow-color-strong), 0px 8px 10px 1px var(--svelte-ui-shadow-color), 0px 3px 14px 2px var(--svelte-ui-shadow-color-weak);
502
502
  }
503
503
  }
504
504
  .fab.fab--shadow:active {
505
- box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
505
+ box-shadow: 0px 7px 8px -4px var(--svelte-ui-shadow-color-strong), 0px 12px 17px 2px var(--svelte-ui-shadow-color), 0px 5px 22px 4px var(--svelte-ui-shadow-color-weak);
506
506
  }
507
507
  .fab.fab--outlined.fab--shadow:active {
508
- box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
508
+ box-shadow: inset 0 0 0 var(--svelte-ui-border-width) currentColor, 0px 7px 8px -4px var(--svelte-ui-shadow-color-strong), 0px 12px 17px 2px var(--svelte-ui-shadow-color), 0px 5px 22px 4px var(--svelte-ui-shadow-color-weak);
509
509
  }
510
510
  .fab.fab--no-motion, .fab.fab--no-motion::before {
511
511
  transition-duration: 0.01s;
@@ -305,10 +305,13 @@
305
305
  }
306
306
  }}
307
307
  aria-label={t('fileUploader.uploadFile')}
308
- aria-describedby={`${id}-help`}
308
+ aria-describedby={`${id}-description`}
309
309
  >
310
310
  {#if value && value.length > 0}
311
- <div class="file-uploader__description file-uploader__description--with-file">
311
+ <div
312
+ id={`${id}-description`}
313
+ class="file-uploader__description file-uploader__description--with-file"
314
+ >
312
315
  <Icon
313
316
  size={iconSize}
314
317
  filled={iconFilled}
@@ -340,7 +343,7 @@
340
343
  {/each}
341
344
  </ul>
342
345
  {:else}
343
- <div class="file-uploader__description">
346
+ <div id={`${id}-description`} class="file-uploader__description">
344
347
  <Icon
345
348
  size={iconSize}
346
349
  filled={iconFilled}
@@ -283,8 +283,8 @@
283
283
  .modal {
284
284
  padding: 0;
285
285
  border-width: 0;
286
- background-color: var(--svelte-ui-surface-color);
287
- box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12);
286
+ background-color: var(--svelte-ui-surface-elevated-color);
287
+ box-shadow: 0 11px 15px -7px var(--svelte-ui-shadow-color-strong), 0 24px 38px 3px var(--svelte-ui-shadow-color), 0 9px 46px 8px var(--svelte-ui-shadow-color-weak);
288
288
  }
289
289
 
290
290
  .modal::backdrop {
@@ -60,7 +60,6 @@
60
60
  isChild?: boolean;
61
61
  /** Whether this item's children are currently visible. */
62
62
  isChildrenVisible?: boolean;
63
-
64
63
  };
65
64
 
66
65
  let {
@@ -84,7 +83,11 @@
84
83
  textColor,
85
84
  selectedTextColor,
86
85
  selectedBarColor,
87
- childrenVariant = variant === 'mobile' ? 'bottom-sheet' : variant === 'vertical' ? 'accordion' : 'bar',
86
+ childrenVariant = variant === 'mobile'
87
+ ? 'bottom-sheet'
88
+ : variant === 'vertical'
89
+ ? 'accordion'
90
+ : 'bar',
88
91
  customStyle,
89
92
  customChildrenStyle,
90
93
  customChildrenContainerStyle,
@@ -93,8 +96,7 @@
93
96
  isSelected = false,
94
97
  isDisabled = false,
95
98
  isChild = false,
96
- isChildrenVisible = $bindable(false),
97
-
99
+ isChildrenVisible = $bindable(false)
98
100
  }: NavItemProps = $props();
99
101
 
100
102
  // =========================================================================
@@ -139,14 +141,17 @@
139
141
  container?.querySelector<HTMLElement>('[data-nav-item-child]:not([tabindex="-1"])')?.focus();
140
142
 
141
143
  $effect(() => {
142
- if (isChildrenVisible && childrenVariant === 'bottom-sheet') tick().then(() => focusFirstChild(bottomSheetEl));
144
+ if (isChildrenVisible && childrenVariant === 'bottom-sheet')
145
+ tick().then(() => focusFirstChild(bottomSheetEl));
143
146
  });
144
147
 
145
148
  const popupPosition = $derived<PopupPosition>(
146
149
  variant === 'vertical' ? 'right-top' : variant === 'mobile' ? 'top-center' : 'bottom-left'
147
150
  );
148
151
 
149
- const showChevron = $derived(hasChildren && chevron && variant !== 'mobile' && childrenVariant !== 'expanded');
152
+ const showChevron = $derived(
153
+ hasChildren && chevron && variant !== 'mobile' && childrenVariant !== 'expanded'
154
+ );
150
155
 
151
156
  // popup の方向に合わせたアイコン。それ以外は expand_more
152
157
  const chevronIcon = $derived(
@@ -342,7 +347,12 @@
342
347
 
343
348
  <!-- accordion / expanded サブメニュー -->
344
349
  {#if childrenVariant === 'expanded' || (childrenVariant === 'accordion' && isChildrenVisible)}
345
- <div class="nav-item__children" role="presentation" style={customChildrenContainerStyle} transition:slide={{ duration: 200 }}>
350
+ <div
351
+ class="nav-item__children"
352
+ role="presentation"
353
+ style={customChildrenContainerStyle}
354
+ transition:slide={{ duration: 200 }}
355
+ >
346
356
  {#each item.children! as child}
347
357
  <NavItem
348
358
  item={child}
@@ -652,7 +662,7 @@
652
662
  left: 0;
653
663
  right: 0;
654
664
  z-index: 1001;
655
- background-color: var(--svelte-ui-surface-color);
665
+ background-color: var(--svelte-ui-surface-elevated-color);
656
666
  border-radius: var(--svelte-ui-nav-bottom-sheet-border-radius);
657
667
  padding: var(--svelte-ui-nav-bottom-sheet-padding);
658
668
  display: flex;
@@ -582,8 +582,8 @@
582
582
  :popover-open {
583
583
  border: solid 1px var(--svelte-ui-border-weak-color);
584
584
  border-radius: var(--svelte-ui-popup-border-radius);
585
- box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12);
586
- background: var(--svelte-ui-surface-color);
585
+ box-shadow: 0 11px 15px -7px var(--svelte-ui-shadow-color-strong), 0 24px 38px 3px var(--svelte-ui-shadow-color), 0 9px 46px 8px var(--svelte-ui-shadow-color-weak);
586
+ background: var(--svelte-ui-surface-elevated-color);
587
587
  color: var(--svelte-ui-text-color);
588
588
  z-index: 1000; /* Popupを最前面に表示 */
589
589
  }
@@ -640,8 +640,8 @@
640
640
  border-top-right-radius: var(--svelte-ui-popup-mobile-border-radius);
641
641
  border-bottom-left-radius: 0;
642
642
  border-bottom-right-radius: 0;
643
- box-shadow: 0 -4px 6px -1px rgba(0, 0, 0, 0.1), 0 -2px 4px -1px rgba(0, 0, 0, 0.06);
644
- background: var(--svelte-ui-surface-color);
643
+ box-shadow: 0 -4px 6px -1px var(--svelte-ui-shadow-color-weak), 0 -2px 4px -1px var(--svelte-ui-shadow-color-weak);
644
+ background: var(--svelte-ui-surface-elevated-color);
645
645
  z-index: var(--svelte-ui-z-modal);
646
646
  overflow-y: auto;
647
647
  overflow-x: hidden;
@@ -318,9 +318,9 @@
318
318
 
319
319
  <style>@charset "UTF-8";
320
320
  .popup-menu {
321
- background-color: var(--svelte-ui-surface-color);
321
+ background-color: var(--svelte-ui-surface-elevated-color);
322
322
  border-radius: 4px;
323
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
323
+ box-shadow: 0 4px 12px var(--svelte-ui-shadow-color);
324
324
  outline: none;
325
325
  min-width: 160px;
326
326
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@14ch/svelte-ui",
3
3
  "description": "Modern Svelte UI components library with TypeScript support",
4
4
  "private": false,
5
- "version": "0.0.71",
5
+ "version": "0.0.73",
6
6
  "type": "module",
7
7
  "keywords": [
8
8
  "svelte",