svelte-comp 1.3.3 → 1.3.5

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.
Files changed (120) hide show
  1. package/README.md +12 -11
  2. package/dist/App.svelte +540 -540
  3. package/dist/app.css +2 -3
  4. package/dist/app.d.ts +10 -0
  5. package/dist/lib/Accordion.svelte +14 -14
  6. package/dist/lib/Button.svelte +23 -8
  7. package/dist/lib/Card.svelte +6 -6
  8. package/dist/lib/Carousel.svelte +16 -16
  9. package/dist/lib/Carousel.svelte.d.ts +1 -1
  10. package/dist/lib/CheckBox.svelte +2 -2
  11. package/dist/lib/CodeView.svelte +6 -5
  12. package/dist/lib/ContextMenu.svelte +19 -13
  13. package/dist/lib/Dialog.svelte +3 -3
  14. package/dist/lib/Field.svelte +1 -1
  15. package/dist/lib/FilePicker.svelte +66 -11
  16. package/dist/lib/FilePicker.svelte.d.ts +6 -1
  17. package/dist/lib/Hamburger.svelte +12 -12
  18. package/dist/lib/Menu.svelte +18 -18
  19. package/dist/lib/NoticeBase.svelte +5 -5
  20. package/dist/lib/Select.svelte +2 -2
  21. package/dist/lib/Slider.svelte +1 -1
  22. package/dist/lib/Splitter.svelte +15 -6
  23. package/dist/lib/Switch.svelte +5 -4
  24. package/dist/lib/Tabs.svelte +6 -6
  25. package/dist/lib/ThemeToggle.svelte +1 -0
  26. package/dist/lib/TimePickerNew.svelte +634 -0
  27. package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
  28. package/dist/lib/Tooltip.svelte +7 -7
  29. package/dist/lib/Topbar.svelte +6 -6
  30. package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
  31. package/dist/lib/__tests__/Accordion.test.js +171 -0
  32. package/dist/lib/__tests__/Badge.test.d.ts +1 -0
  33. package/dist/lib/__tests__/Badge.test.js +41 -0
  34. package/dist/lib/__tests__/Button.test.d.ts +1 -0
  35. package/dist/lib/__tests__/Button.test.js +269 -0
  36. package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
  37. package/dist/lib/__tests__/Calendar.test.js +171 -0
  38. package/dist/lib/__tests__/Card.test.d.ts +1 -0
  39. package/dist/lib/__tests__/Card.test.js +148 -0
  40. package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
  41. package/dist/lib/__tests__/Carousel.test.js +439 -0
  42. package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
  43. package/dist/lib/__tests__/CheckBox.test.js +152 -0
  44. package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
  45. package/dist/lib/__tests__/CodeView.test.js +157 -0
  46. package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
  47. package/dist/lib/__tests__/ColorPicker.test.js +93 -0
  48. package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
  49. package/dist/lib/__tests__/ContextMenu.test.js +67 -0
  50. package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
  51. package/dist/lib/__tests__/DatePicker.test.js +108 -0
  52. package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
  53. package/dist/lib/__tests__/Dialog.test.js +183 -0
  54. package/dist/lib/__tests__/Field.test.d.ts +1 -0
  55. package/dist/lib/__tests__/Field.test.js +190 -0
  56. package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
  57. package/dist/lib/__tests__/FilePicker.test.js +179 -0
  58. package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
  59. package/dist/lib/__tests__/Form.integration.test.js +158 -0
  60. package/dist/lib/__tests__/Form.test.d.ts +1 -0
  61. package/dist/lib/__tests__/Form.test.js +463 -0
  62. package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
  63. package/dist/lib/__tests__/Hamburger.test.js +161 -0
  64. package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
  65. package/dist/lib/__tests__/InstallPWA.test.js +15 -0
  66. package/dist/lib/__tests__/Menu.test.d.ts +1 -0
  67. package/dist/lib/__tests__/Menu.test.js +285 -0
  68. package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
  69. package/dist/lib/__tests__/NoticeBase.test.js +60 -0
  70. package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
  71. package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
  72. package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
  73. package/dist/lib/__tests__/Pagination.test.js +168 -0
  74. package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
  75. package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
  76. package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
  77. package/dist/lib/__tests__/ProgressBar.test.js +69 -0
  78. package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
  79. package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
  80. package/dist/lib/__tests__/Radio.test.d.ts +1 -0
  81. package/dist/lib/__tests__/Radio.test.js +127 -0
  82. package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
  83. package/dist/lib/__tests__/SearchInput.test.js +80 -0
  84. package/dist/lib/__tests__/Select.test.d.ts +1 -0
  85. package/dist/lib/__tests__/Select.test.js +408 -0
  86. package/dist/lib/__tests__/Slider.test.d.ts +1 -0
  87. package/dist/lib/__tests__/Slider.test.js +213 -0
  88. package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
  89. package/dist/lib/__tests__/Splitter.test.js +87 -0
  90. package/dist/lib/__tests__/Switch.test.d.ts +1 -0
  91. package/dist/lib/__tests__/Switch.test.js +97 -0
  92. package/dist/lib/__tests__/Table.test.d.ts +1 -0
  93. package/dist/lib/__tests__/Table.test.js +349 -0
  94. package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
  95. package/dist/lib/__tests__/Tabs.test.js +262 -0
  96. package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
  97. package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
  98. package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
  99. package/dist/lib/__tests__/TimePicker.test.js +146 -0
  100. package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
  101. package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
  102. package/dist/lib/__tests__/Toast.test.d.ts +1 -0
  103. package/dist/lib/__tests__/Toast.test.js +135 -0
  104. package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
  105. package/dist/lib/__tests__/Tooltip.test.js +171 -0
  106. package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
  107. package/dist/lib/__tests__/Topbar.test.js +25 -0
  108. package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
  109. package/dist/lib/__tests__/setupLangContext.js +65 -0
  110. package/dist/lib/__tests__/storage.test.d.ts +1 -0
  111. package/dist/lib/__tests__/storage.test.js +124 -0
  112. package/dist/lib/__tests__/utils.test.d.ts +1 -0
  113. package/dist/lib/__tests__/utils.test.js +11 -0
  114. package/dist/lib/index.d.ts +1 -0
  115. package/dist/lib/index.js +1 -0
  116. package/dist/lib/lang.d.ts +4 -0
  117. package/dist/lib/lang.js +4 -0
  118. package/dist/styles.css +2 -0
  119. package/dist/utils/index.js +15 -4
  120. package/package.json +12 -12
@@ -117,7 +117,7 @@
117
117
  });
118
118
 
119
119
  const triggerBase =
120
- "fixed top-4 left-4 inline-flex items-center justify-center h-8 w-8 rounded-md border border-[var(--border-color-default)] bg-[var(--color-bg-secondary)] hover:bg-[var(--color-bg-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-color-focus)] transition-colors z-[var(--z-modal)]";
120
+ "fixed top-4 left-4 inline-flex items-center justify-center h-8 w-8 rounded-[var(--radius-md)] [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11 border border-[var(--border-color-default)] bg-[var(--color-bg-secondary)] hover:bg-[var(--color-bg-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-color-focus)] transition-colors z-[var(--z-modal)]";
121
121
 
122
122
  const triggerClass = $derived(cx(triggerBase, externalClass));
123
123
  </script>
@@ -133,19 +133,19 @@
133
133
  <span class="relative block w-5 h-3.5">
134
134
  <span
135
135
  class={cx(
136
- "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-transform duration-200",
136
+ "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-transform duration-[var(--transition-fast)]",
137
137
  open ? "translate-y-[-50%] rotate-45" : "translate-y-[calc(-50%_-_6px)]"
138
138
  )}
139
139
  ></span>
140
140
  <span
141
141
  class={cx(
142
- "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-opacity duration-200 translate-y-[-50%]",
142
+ "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-opacity duration-[var(--transition-fast)] translate-y-[-50%]",
143
143
  open ? "opacity-0" : "opacity-100"
144
144
  )}
145
145
  ></span>
146
146
  <span
147
147
  class={cx(
148
- "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-transform duration-200",
148
+ "absolute left-0 top-1/2 h-[2px] w-full bg-current transition-transform duration-[var(--transition-fast)]",
149
149
  open
150
150
  ? "translate-y-[-50%] -rotate-45"
151
151
  : "translate-y-[calc(-50%_+_6px)]"
@@ -165,26 +165,26 @@
165
165
  style={`width:${typeof width === "number" ? `${width}px` : width}`}
166
166
  >
167
167
  {#if header}
168
- <div class="p-4 border-b border-[var(--border-color-default)]">
168
+ <div class="p-[var(--spacing-md)] border-b border-[var(--border-color-default)]">
169
169
  {@render header?.()}
170
170
  </div>
171
171
  {/if}
172
172
 
173
- <div class="flex-1 overflow-y-auto pt-10" tabindex="-1">
173
+ <div class="flex-1 overflow-y-auto" tabindex="-1">
174
174
  {#if menuItems.length === 0}
175
- <div class="text-xs opacity-70 px-3 py-2 text-center">No items</div>
175
+ <div class="[font-size:var(--text-xs)] opacity-70 px-[calc(var(--spacing-sm)+var(--spacing-xs))] py-[var(--spacing-sm)] text-center">No items</div>
176
176
  {:else}
177
- <ul class="grid gap-2 p-4">
177
+ <ul class="grid gap-[var(--spacing-sm)] p-[var(--spacing-md)]">
178
178
  {#each menuItems as it (it.id)}
179
179
  {#if it.type === "section"}
180
- <li class="px-3 pt-2 mt-3 text-[var(--color-text-muted)] text-[var(--text-xs)] lowercase tracking-wide opacity-70">
180
+ <li class="px-[calc(var(--spacing-sm)+var(--spacing-xs))] pt-[var(--spacing-sm)] mt-[calc(var(--spacing-sm)+var(--spacing-xs))] text-[var(--color-text-muted)] [font-size:var(--text-xs)] lowercase tracking-wide opacity-70">
181
181
  {it.label}
182
182
  </li>
183
183
  {:else}
184
184
  <li>
185
185
  <button
186
186
  type="button"
187
- class="w-full text-left px-3 py-2 rounded-md hover:bg-[var(--color-bg-hover)] focus:outline-[var(--border-color-focus)] focus:outline-2 transition-colors"
187
+ class="w-full text-left px-[calc(var(--spacing-sm)+var(--spacing-xs))] py-[var(--spacing-sm)] rounded-[var(--radius-md)] hover:bg-[var(--color-bg-hover)] focus:outline-[var(--border-color-focus)] focus:outline-2 transition-colors"
188
188
  aria-current={activeItem === it.id ? "page" : undefined}
189
189
  onclick={() => {
190
190
  onSelect?.(it.id);
@@ -201,7 +201,7 @@
201
201
  </div>
202
202
 
203
203
  {#if footer}
204
- <div class="p-4 border-t border-[var(--border-color-default)]">
204
+ <div class="p-[var(--spacing-md)] border-t border-[var(--border-color-default)]">
205
205
  {@render footer?.()}
206
206
  </div>
207
207
  {/if}
@@ -209,7 +209,7 @@
209
209
 
210
210
  <button
211
211
  type="button"
212
- class="flex-1 bg-black/40"
212
+ class="flex-1 bg-[oklch(0_0_0/0.4)]"
213
213
  aria-hidden="true"
214
214
  onclick={closeMenu}
215
215
  ></button>
@@ -61,20 +61,20 @@
61
61
  let subMenuLeft = $state(0);
62
62
 
63
63
  const sizes: Record<SizeKey, string> = {
64
- xs: "h-7 px-3",
65
- sm: "h-8 px-3",
66
- md: "h-9 px-4",
67
- lg: "h-10 px-4",
68
- xl: "h-11 px-5",
64
+ xs: "h-[calc(var(--spacing-md)+var(--spacing-sm)+var(--spacing-xs))] px-[calc(var(--spacing-sm)+var(--spacing-xs))]",
65
+ sm: "h-[var(--spacing-xl)] px-[calc(var(--spacing-sm)+var(--spacing-xs))]",
66
+ md: "h-[calc(var(--spacing-xl)+var(--spacing-xs))] px-[var(--spacing-md)]",
67
+ lg: "h-[calc(var(--spacing-xl)+var(--spacing-sm))] px-[var(--spacing-md)]",
68
+ xl: "h-[calc(var(--spacing-xl)+var(--spacing-sm)+var(--spacing-xs))] px-[calc(var(--spacing-md)+var(--spacing-xs))]",
69
69
  };
70
70
 
71
71
  const navBase =
72
- "flex items-stretch pl-2 gap-1 border-b relative z-10 bg-[var(--color-bg-surface)] text-[var(--color-text-default)] border-[var(--border-color-default)]";
72
+ "flex items-stretch pl-[var(--spacing-sm)] gap-[var(--spacing-xs)] border-b relative z-10 bg-[var(--color-bg-surface)] text-[var(--color-text-default)] border-[var(--border-color-default)]";
73
73
 
74
74
  const subMenuGutter = 8;
75
75
 
76
76
  const topButtonBase =
77
- "px-4 rounded-xs leading-none transition-colors outline-none focus-visible:shadow-[inset_0_0_0_2px_var(--border-color-focus)]";
77
+ "px-[var(--spacing-md)] rounded-[var(--radius-sm)] leading-none transition-colors outline-none [@media(pointer:coarse)]:min-h-11 focus-visible:shadow-[inset_0_0_0_2px_var(--border-color-focus)]";
78
78
 
79
79
  const topButtonActive =
80
80
  "bg-[var(--color-bg-muted)] text-[var(--color-text-default)]";
@@ -480,7 +480,7 @@
480
480
  <div
481
481
  bind:this={menuRefs[menuItem.name]}
482
482
  class={cx(
483
- "fixed z-50 min-w-44 p-2 rounded-xs shadow-[0_2px_4px_var(--shadow-color)] ",
483
+ "fixed z-50 min-w-44 p-[var(--spacing-sm)] rounded-[var(--radius-sm)] shadow-[0_2px_4px_var(--shadow-color)] ",
484
484
  "border border-[var(--border-color-default)] bg-[var(--color-bg-surface)]"
485
485
  )}
486
486
  style={menuStyle}
@@ -491,7 +491,7 @@
491
491
  {#each menuItem.actions as action, i (actionKey(action, i))}
492
492
  {#if isSeparator(action)}
493
493
  <div
494
- class="my-1 mx-1 border-t border-[var(--border-color-default)]"
494
+ class="my-[var(--spacing-xs)] mx-[var(--spacing-xs)] border-t border-[var(--border-color-default)]"
495
495
  role="separator"
496
496
  ></div>
497
497
  {:else}
@@ -501,8 +501,8 @@
501
501
  type="button"
502
502
  role="menuitem"
503
503
  class={cx(
504
- "relative text-left rounded-xs transition-colors outline-none px-1.5 py-0.5 my-1 mr-1 min-w-full flex items-center",
505
- "gap-3 hover:bg-[var(--color-bg-muted)] focus-visible:bg-[var(--color-bg-muted)]",
504
+ "relative text-left rounded-[var(--radius-sm)] transition-colors outline-none px-[calc(var(--spacing-sm)+var(--spacing-xs)/2)] py-[calc(var(--spacing-xs)/2)] my-[var(--spacing-xs)] mr-[var(--spacing-xs)] min-w-full flex items-center",
505
+ "gap-[calc(var(--spacing-sm)+var(--spacing-xs))] hover:bg-[var(--color-bg-muted)] focus-visible:bg-[var(--color-bg-muted)]",
506
506
  "focus-visible:shadow-[inset_0_0_0_2px_var(--border-color-focus)]",
507
507
  textCls
508
508
  )}
@@ -528,11 +528,11 @@
528
528
  focusMenuAction(menuItem, i);
529
529
  }}
530
530
  >
531
- <span class="flex items-center gap-2 flex-1 min-w-0">
531
+ <span class="flex items-center gap-[var(--spacing-sm)] flex-1 min-w-0">
532
532
  <span class="truncate">{actionText(action)}</span>
533
533
  </span>
534
534
 
535
- <span class="flex items-center shrink-0 ml-auto gap-1">
535
+ <span class="flex items-center shrink-0 ml-auto gap-[var(--spacing-xs)]">
536
536
  {#if actionShortcut(action)}
537
537
  <span
538
538
  class={cx(
@@ -562,7 +562,7 @@
562
562
  <div
563
563
  bind:this={subMenuRefs[actionId(action)]}
564
564
  class={cx(
565
- "fixed z-50 min-w-44 p-2 rounded-xs shadow-[0_2px_4px_var(--shadow-color)]",
565
+ "fixed z-50 min-w-44 p-[var(--spacing-sm)] rounded-[var(--radius-sm)] shadow-[0_2px_4px_var(--shadow-color)]",
566
566
  "border border-[var(--border-color-default)] bg-[var(--color-bg-surface)]"
567
567
  )}
568
568
  style={subMenuStyle}
@@ -574,7 +574,7 @@
574
574
  {#each action.submenu as sub, j (actionKey(sub, j))}
575
575
  {#if isSeparator(sub)}
576
576
  <div
577
- class="my-1 mx-1 border-t border-[var(--border-color-default)]"
577
+ class="my-[var(--spacing-xs)] mx-[var(--spacing-xs)] border-t border-[var(--border-color-default)]"
578
578
  role="separator"
579
579
  ></div>
580
580
  {:else}
@@ -583,8 +583,8 @@
583
583
  type="button"
584
584
  role="menuitem"
585
585
  class={cx(
586
- "relative text-left rounded-xs transition-colors outline-none px-1.5 py-0.5",
587
- "my-1 mr-1 w-full flex items-center justify-between gap-3",
586
+ "relative text-left rounded-[var(--radius-sm)] transition-colors outline-none px-[calc(var(--spacing-sm)+var(--spacing-xs)/2)] py-[calc(var(--spacing-xs)/2)]",
587
+ "my-[var(--spacing-xs)] mr-[var(--spacing-xs)] w-full flex items-center justify-between gap-[calc(var(--spacing-sm)+var(--spacing-xs))]",
588
588
  "hover:bg-[var(--color-bg-muted)] focus-visible:bg-[var(--color-bg-muted)]",
589
589
  "focus-visible:shadow-[inset_0_0_0_2px_var(--border-color-focus)]",
590
590
  "decoration-[var(--color-text-default)]",
@@ -595,7 +595,7 @@
595
595
  onmouseenter={() => (activeSubIndex = j)}
596
596
  onfocus={() => (activeSubIndex = j)}
597
597
  >
598
- <span class="flex items-center gap-2 flex-1 min-w-0">
598
+ <span class="flex items-center gap-[var(--spacing-sm)] flex-1 min-w-0">
599
599
  <span class="truncate">{actionText(sub)}</span>
600
600
  </span>
601
601
 
@@ -69,8 +69,8 @@
69
69
 
70
70
  const sizeClasses = $derived(
71
71
  size === "md"
72
- ? "gap-3 px-4 py-3 rounded-[var(--radius-lg)]"
73
- : "gap-2 px-3 py-1.5 rounded-[var(--radius-md)]"
72
+ ? "gap-[calc(var(--spacing-sm)+var(--spacing-xs))] px-[var(--spacing-md)] py-[calc(var(--spacing-sm)+var(--spacing-xs))] rounded-[var(--radius-lg)]"
73
+ : "gap-[var(--spacing-sm)] px-[calc(var(--spacing-sm)+var(--spacing-xs))] py-[calc(var(--spacing-sm)+var(--spacing-xs)/2)] rounded-[var(--radius-md)]"
74
74
  );
75
75
 
76
76
  const iconClass = $derived(size === "md" ? "w-5 h-5" : "w-4 h-4");
@@ -78,20 +78,20 @@
78
78
  const titleClass = $derived(
79
79
  size === "md"
80
80
  ? "font-[var(--font-weight-medium)] truncate [font-size:var(--text-md)] max-sm:[font-size:var(--text-sm)]"
81
- : "font-[var(--font-weight-medium)] truncate text-sm"
81
+ : "font-[var(--font-weight-medium)] truncate [font-size:var(--text-sm)]"
82
82
  );
83
83
 
84
84
  const messageClass = $derived(
85
85
  size === "md"
86
86
  ? "line-clamp-3 [font-size:var(--text-sm)] max-sm:[font-size:var(--text-xs)]"
87
- : "truncate text-xs"
87
+ : "truncate [font-size:var(--text-xs)]"
88
88
  );
89
89
 
90
90
  const rootClass = $derived(
91
91
  cx(
92
92
  "flex items-center border border-[var(--border-color-default)]",
93
93
  sizeClasses,
94
- !inline && "shadow-lg backdrop-blur-sm",
94
+ !inline && "shadow-[0_8px_16px_var(--shadow-color)] backdrop-blur-sm",
95
95
  variantClasses(variant),
96
96
  externalClass
97
97
  )
@@ -102,7 +102,7 @@
102
102
  let menuPosition = $state<"top" | "bottom">("bottom");
103
103
 
104
104
  const base =
105
- "relative w-full outline-none appearance-none cursor-pointer transition-colors duration-[var(--transition-fast)] ease-[var(--timing-default)] box-border rounded-[var(--radius-md)] border focus:border-[var(--border-color-focus)] focus:ring-2 focus:ring-[var(--border-color-focus)] [color:var(--color-text-default)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed";
105
+ "relative w-full outline-none appearance-none cursor-pointer transition-colors duration-[var(--transition-fast)] ease-[var(--timing-default)] box-border rounded-[var(--radius-md)] border focus:border-[var(--border-color-focus)] focus:ring-2 focus:ring-[var(--border-color-focus)] [color:var(--color-text-default)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed [@media(pointer:coarse)]:min-h-11";
106
106
 
107
107
  const sizes: Record<SizeKey, string> = {
108
108
  xs: "px-2 pr-6 h-6",
@@ -152,7 +152,7 @@
152
152
 
153
153
  const itemBaseClass = $derived(
154
154
  cx(
155
- "w-full text-left px-4 py-2 transition-colors duration-[var(--transition-fast)] cursor-pointer",
155
+ "w-full text-left px-4 py-2 transition-colors duration-[var(--transition-fast)] cursor-pointer [@media(pointer:coarse)]:min-h-11",
156
156
  TEXT[sz]
157
157
  )
158
158
  );
@@ -172,7 +172,7 @@
172
172
  if (disabled) return;
173
173
  const span = max - min;
174
174
  const big = Math.max(step || 1, Math.round(span / 10));
175
- let v = value;
175
+ let v: number;
176
176
 
177
177
  switch (e.key) {
178
178
  case "ArrowLeft":
@@ -83,7 +83,7 @@
83
83
  }
84
84
 
85
85
  function onDrag(e: PointerEvent): void {
86
- if (!isDragging) return;
86
+ if (!isDragging || containerSize <= 0) return;
87
87
 
88
88
  const currentPos = direction === "horizontal" ? e.clientX : e.clientY;
89
89
  const delta = currentPos - startPos;
@@ -124,8 +124,11 @@
124
124
  </div>
125
125
 
126
126
  <div
127
- class="touch-none select-none z-10 cursor-col-resize bg-[var(--color-bg-muted)] hover:bg-[var(--color-bg-hover)] transition-colors"
128
- style="width: {dividerSize}px"
127
+ role="separator"
128
+ aria-orientation="vertical"
129
+ aria-label="Resize handle"
130
+ class="touch-none select-none z-10 cursor-col-resize bg-[var(--color-bg-muted)] hover:bg-[var(--color-bg-hover)] transition-colors [@media(pointer:coarse)]:min-w-11"
131
+ style="width: {dividerSize}px; min-width: {dividerSize}px"
129
132
  onpointerdown={startDrag}
130
133
  ></div>
131
134
 
@@ -138,12 +141,18 @@
138
141
  </div>
139
142
 
140
143
  <div
141
- class="touch-none select-none z-10 cursor-row-resize bg-[var(--color-bg-muted)] hover:bg-[var(--color-bg-hover)] transition-colors"
142
- style="height: {dividerSize}px"
144
+ role="separator"
145
+ aria-orientation="horizontal"
146
+ aria-label="Resize handle"
147
+ class="touch-none select-none z-10 cursor-row-resize bg-[var(--color-bg-muted)] hover:bg-[var(--color-bg-hover)] transition-colors [@media(pointer:coarse)]:min-h-11"
148
+ style="height: {dividerSize}px; min-height: {dividerSize}px"
143
149
  onpointerdown={startDrag}
144
150
  ></div>
145
151
 
146
- <div class="overflow-auto min-w-0 min-h-0" style="height: calc(100% - {size}% - {dividerSize}px)">
152
+ <div
153
+ class="overflow-auto min-w-0 min-h-0"
154
+ style="height: calc(100% - {size}% - {dividerSize}px)"
155
+ >
147
156
  {@render second?.()}
148
157
  </div>
149
158
  {/if}
@@ -103,6 +103,7 @@
103
103
  isDisabled
104
104
  ? "opacity-[var(--opacity-disabled)] cursor-not-allowed"
105
105
  : "cursor-pointer",
106
+ "[@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11",
106
107
  justifyClass
107
108
  )
108
109
  );
@@ -114,21 +115,21 @@
114
115
  const knobClass = $derived(
115
116
  cx(
116
117
  knob[sz],
117
- "rounded-full bg-white border border-[var(--border-color-default)] shadow-sm"
118
+ "rounded-full bg-[var(--color-text-inverse,#fff)] border border-[var(--border-color-default)] shadow-[0_1px_2px_var(--shadow-color)]"
118
119
  )
119
120
  );
120
121
  </script>
121
122
 
122
123
  <label class={rootClass} for={inputId}>
123
124
  {#if topLabel}
124
- <span class="text-[var(--color-text-muted)] {TEXT[sz]}">
125
+ <span class={cx("text-[var(--color-text-muted)]", TEXT[sz])}>
125
126
  {topLabel}
126
127
  </span>
127
128
  {/if}
128
129
 
129
130
  <div class="inline-flex items-center gap-2">
130
131
  {#if leftLabel}
131
- <span class="text-[var(--color-text-muted)] {TEXT[sz]}">
132
+ <span class={cx("text-[var(--color-text-muted)]", TEXT[sz])}>
132
133
  {leftLabel}
133
134
  </span>
134
135
  {/if}
@@ -159,7 +160,7 @@
159
160
  </button>
160
161
 
161
162
  {#if rightLabel}
162
- <span class="text-[var(--color-text-muted)] {TEXT[sz]}">
163
+ <span class={cx("text-[var(--color-text-muted)]", TEXT[sz])}>
163
164
  {rightLabel}
164
165
  </span>
165
166
  {/if}
@@ -90,7 +90,7 @@
90
90
  0,
91
91
  enabled.findIndex((t) => t.id === activeTab)
92
92
  );
93
- let next = idx;
93
+ let next: number;
94
94
 
95
95
  if (e.key === "ArrowRight") next = (idx + 1) % enabled.length;
96
96
  else if (e.key === "ArrowLeft")
@@ -115,27 +115,27 @@
115
115
  };
116
116
 
117
117
  const base =
118
- "inline-flex items-center justify-center font-medium transition-colors duration-150 focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-[var(--border-color-focus)] focus-visible:ring-offset-0 focus:outline-none disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed";
118
+ "inline-flex items-center justify-center font-medium transition-colors duration-[var(--transition-fast)] focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-[var(--border-color-focus)] focus-visible:ring-offset-0 focus:outline-none disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed [@media(pointer:coarse)]:min-h-11";
119
119
 
120
120
  const variants = $derived({
121
121
  default: {
122
- base: "border-b-2 border-transparent text-[var(--color-text-muted)]",
122
+ base: "border-b-2 border-transparent text-[var(--color-text-default)]",
123
123
  active:
124
124
  "bg-[var(--color-bg-secondary)] !text-[var(--color-text-default)] border-[var(--border-color-strong)]",
125
125
  hover:
126
126
  "hover:text-[var(--color-text-default)] hover:bg-[var(--color-bg-muted)]",
127
127
  },
128
128
  underline: {
129
- base: "border-b-2 border-transparent text-[var(--color-text-muted)]",
129
+ base: "border-b-2 border-transparent text-[var(--color-text-default)]",
130
130
  active:
131
131
  "border-[var(--border-color-focus)] !text-[var(--color-text-default)]",
132
132
  hover:
133
133
  "hover:text-[var(--color-text-default)] hover:border-[var(--border-color-strong)]",
134
134
  },
135
135
  pills: {
136
- base: "text-[var(--color-text-muted)] border border-transparent font-medium",
136
+ base: "text-[var(--color-text-default)] border border-transparent font-medium",
137
137
  active:
138
- "bg-[var(--color-bg-primary)] text-white border-[var(--color-bg-primary)]",
138
+ "bg-[var(--color-bg-primary)] text-[var(--color-text-default)] border-[var(--color-bg-primary)] font-[var(--font-weight-semibold)]",
139
139
  hover:
140
140
  "hover:bg-[var(--color-bg-secondary)] hover:text-[var(--color-text-default)]",
141
141
  },
@@ -48,6 +48,7 @@
48
48
  border border-[var(--border-color-default)] bg-[var(--color-bg-secondary)]
49
49
  hover:bg-[var(--color-bg-hover)] focus-visible:outline-none focus-visible:ring-2
50
50
  focus-visible:ring-[var(--border-color-focus)] transition-colors
51
+ [@media(pointer:coarse)]:min-h-11 [@media(pointer:coarse)]:min-w-11
51
52
  disabled:opacity-[var(--opacity-disabled)]
52
53
  disabled:cursor-not-allowed
53
54
  disabled:brightness-100