kosui 0.1.2 → 0.4.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.
Files changed (238) hide show
  1. package/README.md +34 -3
  2. package/dist/alert/alert.svelte +16 -157
  3. package/dist/alert/alert.svelte.d.ts +3 -26
  4. package/dist/alert/index.d.ts +1 -1
  5. package/dist/alert/index.js +1 -1
  6. package/dist/autocomplete/autocomplete.svelte +126 -12
  7. package/dist/autocomplete/autocomplete.svelte.d.ts +30 -6
  8. package/dist/autocomplete/index.d.ts +1 -5
  9. package/dist/autocomplete/index.js +1 -5
  10. package/dist/avatar/avatar.svelte +16 -10
  11. package/dist/badge/badge.svelte +31 -20
  12. package/dist/badge/badge.svelte.d.ts +8 -4
  13. package/dist/badge/index.d.ts +1 -1
  14. package/dist/base.d.ts +4 -8
  15. package/dist/base.js +14 -28
  16. package/dist/box/box.svelte +2 -14
  17. package/dist/box/box.svelte.d.ts +0 -2
  18. package/dist/breadcrumbs/breadcrumbs.svelte +38 -19
  19. package/dist/breadcrumbs/breadcrumbs.svelte.d.ts +6 -4
  20. package/dist/breadcrumbs/index.d.ts +1 -1
  21. package/dist/breadcrumbs/index.js +1 -1
  22. package/dist/button/button.svelte +96 -31
  23. package/dist/button/button.svelte.d.ts +11 -5
  24. package/dist/button/index.d.ts +1 -1
  25. package/dist/button/index.js +1 -1
  26. package/dist/chip/chip.svelte +62 -14
  27. package/dist/chip/chip.svelte.d.ts +2 -1
  28. package/dist/command/action.svelte.js +13 -18
  29. package/dist/command/command-palette.svelte +163 -0
  30. package/dist/command/command-palette.svelte.d.ts +11 -0
  31. package/dist/command/index.d.ts +1 -8
  32. package/dist/command/index.js +1 -8
  33. package/dist/common/divider.svelte +10 -5
  34. package/dist/common/divider.svelte.d.ts +3 -3
  35. package/dist/common/index.d.ts +0 -2
  36. package/dist/common/index.js +0 -2
  37. package/dist/dialog/dialog-provider.svelte +70 -0
  38. package/dist/dialog/dialog-provider.svelte.d.ts +7 -0
  39. package/dist/dialog/dialog.svelte +33 -35
  40. package/dist/dialog/dialog.svelte.d.ts +4 -8
  41. package/dist/dialog/dialogs.svelte.d.ts +49 -0
  42. package/dist/dialog/dialogs.svelte.js +73 -0
  43. package/dist/dialog/index.d.ts +2 -3
  44. package/dist/dialog/index.js +2 -3
  45. package/dist/fab/fab.svelte +30 -10
  46. package/dist/fab/fab.svelte.d.ts +3 -2
  47. package/dist/index.d.ts +0 -1
  48. package/dist/index.js +0 -1
  49. package/dist/input/field.d.ts +8 -0
  50. package/dist/input/field.js +7 -0
  51. package/dist/input/index.d.ts +2 -1
  52. package/dist/input/index.js +2 -1
  53. package/dist/input/input.svelte +21 -66
  54. package/dist/input/input.svelte.d.ts +6 -16
  55. package/dist/link/link.svelte +33 -42
  56. package/dist/link/link.svelte.d.ts +4 -3
  57. package/dist/markdown/index.d.ts +2 -25
  58. package/dist/markdown/index.js +0 -24
  59. package/dist/markdown/markdown-tokens.svelte +166 -6
  60. package/dist/markdown/markdown-tokens.svelte.d.ts +2 -0
  61. package/dist/markdown/markdown.svelte +62 -173
  62. package/dist/markdown/markdown.svelte.d.ts +7 -27
  63. package/dist/markdown/parse.d.ts +5 -0
  64. package/dist/markdown/parse.js +30 -0
  65. package/dist/markdown/types.d.ts +28 -0
  66. package/dist/markdown/types.js +1 -0
  67. package/dist/menu/index.d.ts +3 -6
  68. package/dist/menu/index.js +3 -6
  69. package/dist/menu/menu-actions.svelte +44 -38
  70. package/dist/menu/menu-context.d.ts +4 -0
  71. package/dist/menu/menu-context.js +2 -0
  72. package/dist/menu/menu-group.svelte +40 -0
  73. package/dist/menu/menu-group.svelte.d.ts +11 -0
  74. package/dist/menu/menu-item.svelte +31 -54
  75. package/dist/menu/menu-item.svelte.d.ts +7 -5
  76. package/dist/menu/menu.svelte +160 -15
  77. package/dist/menu/menu.svelte.d.ts +15 -4
  78. package/dist/merge-props.d.ts +1 -1
  79. package/dist/merge-props.js +10 -5
  80. package/dist/modal/modal.svelte +60 -83
  81. package/dist/modal/modal.svelte.d.ts +5 -4
  82. package/dist/popover/index.d.ts +1 -1
  83. package/dist/popover/index.js +1 -1
  84. package/dist/popover/popover.svelte +58 -111
  85. package/dist/popover/popover.svelte.d.ts +6 -8
  86. package/dist/progress/circular-progress.svelte +64 -30
  87. package/dist/progress/circular-progress.svelte.d.ts +7 -8
  88. package/dist/shortcut/index.d.ts +2 -2
  89. package/dist/shortcut/index.js +1 -1
  90. package/dist/shortcut/shortcut-hint.svelte +36 -0
  91. package/dist/shortcut/shortcut-hint.svelte.d.ts +9 -0
  92. package/dist/shortcut/shortcut.d.ts +19 -14
  93. package/dist/shortcut/shortcut.js +105 -52
  94. package/dist/skeleton/skeleton.svelte +13 -8
  95. package/dist/skeleton/skeleton.svelte.d.ts +2 -5
  96. package/dist/slider/index.d.ts +1 -8
  97. package/dist/slider/index.js +1 -8
  98. package/dist/slider/slider.svelte +180 -211
  99. package/dist/slider/slider.svelte.d.ts +11 -32
  100. package/dist/switch/index.d.ts +1 -2
  101. package/dist/switch/index.js +1 -2
  102. package/dist/switch/switch.svelte +36 -60
  103. package/dist/switch/switch.svelte.d.ts +6 -17
  104. package/dist/textarea/index.d.ts +1 -1
  105. package/dist/textarea/index.js +1 -1
  106. package/dist/textarea/textarea.svelte +23 -63
  107. package/dist/textarea/textarea.svelte.d.ts +8 -18
  108. package/dist/theme.css +191 -0
  109. package/dist/toggle/index.d.ts +0 -1
  110. package/dist/toggle/index.js +0 -1
  111. package/dist/toggle/toggle-button.svelte +72 -38
  112. package/dist/toggle/toggle-button.svelte.d.ts +4 -4
  113. package/dist/toggle/toggle-context.d.ts +10 -0
  114. package/dist/toggle/toggle-context.js +2 -0
  115. package/dist/toggle/toggle-group.svelte +41 -22
  116. package/dist/toggle/toggle-group.svelte.d.ts +7 -4
  117. package/dist/tooltip/tooltip.svelte +67 -26
  118. package/dist/tooltip/tooltip.svelte.d.ts +10 -4
  119. package/dist/utils.d.ts +9 -3
  120. package/dist/utils.js +10 -0
  121. package/package.json +21 -13
  122. package/dist/autocomplete/autocomplete-content.svelte +0 -47
  123. package/dist/autocomplete/autocomplete-content.svelte.d.ts +0 -10
  124. package/dist/autocomplete/autocomplete-context.svelte.d.ts +0 -12
  125. package/dist/autocomplete/autocomplete-context.svelte.js +0 -34
  126. package/dist/autocomplete/autocomplete-input.svelte +0 -36
  127. package/dist/autocomplete/autocomplete-input.svelte.d.ts +0 -5
  128. package/dist/autocomplete/autocomplete-item.svelte +0 -68
  129. package/dist/autocomplete/autocomplete-item.svelte.d.ts +0 -11
  130. package/dist/base.css +0 -71
  131. package/dist/bindable.svelte.d.ts +0 -7
  132. package/dist/bindable.svelte.js +0 -25
  133. package/dist/command/command-content.svelte +0 -15
  134. package/dist/command/command-content.svelte.d.ts +0 -8
  135. package/dist/command/command-context.svelte.d.ts +0 -5
  136. package/dist/command/command-context.svelte.js +0 -13
  137. package/dist/command/command-input.svelte +0 -44
  138. package/dist/command/command-input.svelte.d.ts +0 -7
  139. package/dist/command/command-item.svelte +0 -66
  140. package/dist/command/command-item.svelte.d.ts +0 -11
  141. package/dist/command/command-search.svelte +0 -28
  142. package/dist/command/command-search.svelte.d.ts +0 -5
  143. package/dist/command/command.svelte +0 -19
  144. package/dist/command/command.svelte.d.ts +0 -8
  145. package/dist/command/commander.svelte +0 -107
  146. package/dist/command/commander.svelte.d.ts +0 -9
  147. package/dist/common/header.svelte +0 -35
  148. package/dist/common/header.svelte.d.ts +0 -10
  149. package/dist/common/item-context.svelte.d.ts +0 -12
  150. package/dist/common/item-context.svelte.js +0 -77
  151. package/dist/dialog/dialog-button.svelte +0 -25
  152. package/dist/dialog/dialog-button.svelte.d.ts +0 -32
  153. package/dist/dialog/dialoguer-context.svelte.d.ts +0 -53
  154. package/dist/dialog/dialoguer-context.svelte.js +0 -85
  155. package/dist/dialog/dialoguer.svelte +0 -65
  156. package/dist/dialog/dialoguer.svelte.d.ts +0 -7
  157. package/dist/markdown/markdown-blockquote.svelte +0 -14
  158. package/dist/markdown/markdown-blockquote.svelte.d.ts +0 -7
  159. package/dist/markdown/markdown-br.svelte +0 -12
  160. package/dist/markdown/markdown-br.svelte.d.ts +0 -7
  161. package/dist/markdown/markdown-code.svelte +0 -14
  162. package/dist/markdown/markdown-code.svelte.d.ts +0 -7
  163. package/dist/markdown/markdown-codespan.svelte +0 -15
  164. package/dist/markdown/markdown-codespan.svelte.d.ts +0 -7
  165. package/dist/markdown/markdown-context.svelte.d.ts +0 -26
  166. package/dist/markdown/markdown-context.svelte.js +0 -30
  167. package/dist/markdown/markdown-def.svelte +0 -15
  168. package/dist/markdown/markdown-def.svelte.d.ts +0 -7
  169. package/dist/markdown/markdown-del.svelte +0 -14
  170. package/dist/markdown/markdown-del.svelte.d.ts +0 -7
  171. package/dist/markdown/markdown-em.svelte +0 -14
  172. package/dist/markdown/markdown-em.svelte.d.ts +0 -7
  173. package/dist/markdown/markdown-escape.svelte +0 -8
  174. package/dist/markdown/markdown-escape.svelte.d.ts +0 -5
  175. package/dist/markdown/markdown-heading.svelte +0 -16
  176. package/dist/markdown/markdown-heading.svelte.d.ts +0 -7
  177. package/dist/markdown/markdown-hr.svelte +0 -12
  178. package/dist/markdown/markdown-hr.svelte.d.ts +0 -7
  179. package/dist/markdown/markdown-html.svelte +0 -9
  180. package/dist/markdown/markdown-html.svelte.d.ts +0 -5
  181. package/dist/markdown/markdown-image.svelte +0 -12
  182. package/dist/markdown/markdown-image.svelte.d.ts +0 -7
  183. package/dist/markdown/markdown-link.svelte +0 -17
  184. package/dist/markdown/markdown-link.svelte.d.ts +0 -7
  185. package/dist/markdown/markdown-list-item.svelte +0 -14
  186. package/dist/markdown/markdown-list-item.svelte.d.ts +0 -7
  187. package/dist/markdown/markdown-list.svelte +0 -19
  188. package/dist/markdown/markdown-list.svelte.d.ts +0 -7
  189. package/dist/markdown/markdown-paragraph.svelte +0 -16
  190. package/dist/markdown/markdown-paragraph.svelte.d.ts +0 -7
  191. package/dist/markdown/markdown-space.svelte +0 -8
  192. package/dist/markdown/markdown-space.svelte.d.ts +0 -5
  193. package/dist/markdown/markdown-strong.svelte +0 -15
  194. package/dist/markdown/markdown-strong.svelte.d.ts +0 -7
  195. package/dist/markdown/markdown-table-cell.svelte +0 -16
  196. package/dist/markdown/markdown-table-cell.svelte.d.ts +0 -7
  197. package/dist/markdown/markdown-table.svelte +0 -36
  198. package/dist/markdown/markdown-table.svelte.d.ts +0 -7
  199. package/dist/markdown/markdown-text.svelte +0 -8
  200. package/dist/markdown/markdown-text.svelte.d.ts +0 -5
  201. package/dist/markdown/markdown-token.svelte +0 -25
  202. package/dist/markdown/markdown-token.svelte.d.ts +0 -7
  203. package/dist/menu/menu-content.svelte +0 -47
  204. package/dist/menu/menu-content.svelte.d.ts +0 -10
  205. package/dist/menu/menu-context.svelte.d.ts +0 -18
  206. package/dist/menu/menu-context.svelte.js +0 -118
  207. package/dist/menu/menu-trigger-button.svelte +0 -31
  208. package/dist/menu/menu-trigger-button.svelte.d.ts +0 -5
  209. package/dist/menu/menu-trigger.svelte +0 -42
  210. package/dist/menu/menu-trigger.svelte.d.ts +0 -10
  211. package/dist/ordered-html-elements.d.ts +0 -7
  212. package/dist/ordered-html-elements.js +0 -29
  213. package/dist/portal/index.d.ts +0 -2
  214. package/dist/portal/index.js +0 -2
  215. package/dist/portal/portal.svelte +0 -15
  216. package/dist/portal/portal.svelte.d.ts +0 -8
  217. package/dist/portal/proxy.svelte +0 -13
  218. package/dist/portal/proxy.svelte.d.ts +0 -7
  219. package/dist/shortcut/shortcut-badge.svelte +0 -41
  220. package/dist/shortcut/shortcut-badge.svelte.d.ts +0 -11
  221. package/dist/slider/slider-context.svelte.d.ts +0 -50
  222. package/dist/slider/slider-context.svelte.js +0 -198
  223. package/dist/slider/slider-handle-label-arrow.svelte +0 -18
  224. package/dist/slider/slider-handle-label-arrow.svelte.d.ts +0 -6
  225. package/dist/slider/slider-handle-label.svelte +0 -35
  226. package/dist/slider/slider-handle-label.svelte.d.ts +0 -6
  227. package/dist/slider/slider-handle.svelte +0 -54
  228. package/dist/slider/slider-handle.svelte.d.ts +0 -6
  229. package/dist/slider/slider-mark-dot.svelte +0 -25
  230. package/dist/slider/slider-mark-dot.svelte.d.ts +0 -6
  231. package/dist/slider/slider-mark-label.svelte +0 -37
  232. package/dist/slider/slider-mark-label.svelte.d.ts +0 -9
  233. package/dist/slider/slider-mark.svelte +0 -33
  234. package/dist/slider/slider-mark.svelte.d.ts +0 -9
  235. package/dist/switch/switch-thumb.svelte +0 -52
  236. package/dist/switch/switch-thumb.svelte.d.ts +0 -7
  237. package/dist/toggle/toggle-context.svelte.d.ts +0 -9
  238. package/dist/toggle/toggle-context.svelte.js +0 -32
@@ -3,62 +3,59 @@
3
3
  import { mergeProps } from "../merge-props.js";
4
4
  import { Shortcut } from "../shortcut/index.js";
5
5
  import {
6
- noop,
6
+ cn,
7
7
  type ClassName,
8
- type ElementRef,
9
8
  type ToggleEventWithTarget,
10
9
  } from "../utils.js";
11
- import * as floatingUi from "@floating-ui/dom";
12
10
  import type { Snippet } from "svelte";
11
+ import { prefersReducedMotion } from "svelte/motion";
13
12
  import type { HTMLAttributes } from "svelte/elements";
14
13
  import { scale } from "svelte/transition";
15
- import { twMerge, type ClassNameValue } from "tailwind-merge";
14
+
15
+ type Side = "top" | "right" | "bottom" | "left";
16
+ export type PopoverPlacement = Side | `${Side}-start` | `${Side}-end`;
16
17
 
17
18
  export type PopoverProps = {
18
- arrow?: boolean;
19
- arrowClass?: ClassNameValue;
20
- placement?: floatingUi.Placement;
21
- strategy?: floatingUi.Strategy;
19
+ placement?: PopoverPlacement;
22
20
  open?: boolean;
23
21
  anchorEl?: HTMLElement;
24
22
  onKeydownWhileOpen?: (event: KeyboardEvent) => void;
25
23
  children: Snippet;
24
+ el?: HTMLDivElement;
26
25
  } & ClassName &
27
- ElementRef &
28
- HTMLAttributes<HTMLDivElement>;
29
-
30
- type Side = "top" | "bottom" | "left" | "right";
26
+ Omit<HTMLAttributes<HTMLDivElement>, "class">;
27
+
28
+ const AREAS: Record<PopoverPlacement, string> = {
29
+ top: "top span-all",
30
+ "top-start": "top span-right",
31
+ "top-end": "top span-left",
32
+ bottom: "bottom span-all",
33
+ "bottom-start": "bottom span-right",
34
+ "bottom-end": "bottom span-left",
35
+ left: "left span-all",
36
+ "left-start": "left span-bottom",
37
+ "left-end": "left span-top",
38
+ right: "right span-all",
39
+ "right-start": "right span-bottom",
40
+ "right-end": "right span-top",
41
+ };
31
42
  </script>
32
43
 
33
44
  <script lang="ts">
34
45
  let {
35
- arrow = false,
36
46
  placement = "top",
37
- strategy = "fixed",
38
47
  open = $bindable(false),
39
48
  anchorEl,
40
49
  children,
41
50
  onKeydownWhileOpen,
42
51
  el: popoverEl = $bindable(),
43
- ref = noop,
44
- arrowClass,
45
52
  class: className,
46
53
  ...restProps
47
54
  }: PopoverProps = $props();
48
55
 
49
- let arrowEl: HTMLDivElement | undefined = $state();
50
-
51
- function getArrowRotation(placement: Side) {
52
- if (placement === "top") {
53
- return "rotateZ(0deg)";
54
- } else if (placement === "right") {
55
- return "rotateZ(90deg)";
56
- } else if (placement === "bottom") {
57
- return "rotateZ(180deg)";
58
- } else if (placement === "left") {
59
- return "rotateZ(270deg)";
60
- }
61
- }
56
+ let side = $derived(placement.split("-")[0] as Side);
57
+ let vertical = $derived(side === "top" || side === "bottom");
58
+ let centered = $derived(!placement.includes("-"));
62
59
 
63
60
  function handleEscape(event: KeyboardEvent) {
64
61
  if (popoverEl && Shortcut.ESCAPE.matches(event)) {
@@ -80,101 +77,51 @@
80
77
  }
81
78
  }
82
79
 
83
- function handleClickInside(event: MouseEvent) {
84
- event.stopImmediatePropagation();
85
- }
86
-
87
80
  function onbeforetoggle(event: ToggleEventWithTarget<HTMLDivElement>) {
88
- if (event.newState === "closed") {
89
- open = false;
90
- } else {
91
- open = true;
92
- }
81
+ open = event.newState === "open";
93
82
  }
94
83
 
95
84
  $effect(() => {
96
- if (popoverEl) {
97
- popoverEl.showPopover();
98
- events.on("keydown", handleEscape);
99
- events.on("keydown", onKeydownWhileOpen);
100
- events.on("mousedown", handleClickOutside);
101
-
102
- return () => {
103
- events.remove("keydown", handleEscape);
104
- events.remove("keydown", onKeydownWhileOpen);
105
- events.remove("mousedown", handleClickOutside);
106
- };
85
+ if (!open || !popoverEl) return;
86
+ if (!popoverEl.matches(":popover-open")) {
87
+ popoverEl.showPopover({ source: anchorEl });
107
88
  }
89
+ events.on("keydown", handleEscape);
90
+ events.on("keydown", onKeydownWhileOpen);
91
+ events.on("mousedown", handleClickOutside);
92
+
93
+ return () => {
94
+ events.remove("keydown", handleEscape);
95
+ events.remove("keydown", onKeydownWhileOpen);
96
+ events.remove("mousedown", handleClickOutside);
97
+ };
108
98
  });
109
-
110
- $effect(() => {
111
- if (anchorEl && popoverEl) {
112
- return floatingUi.autoUpdate(anchorEl, popoverEl, updatePosition);
113
- }
114
- });
115
-
116
- async function updatePosition() {
117
- if (anchorEl && popoverEl && arrowEl) {
118
- const computedPosition = await floatingUi.computePosition(
119
- anchorEl,
120
- popoverEl,
121
- {
122
- placement,
123
- middleware: [
124
- floatingUi.offset(6),
125
- floatingUi.flip(),
126
- floatingUi.shift({ padding: 5 }),
127
- floatingUi.arrow({ element: arrowEl }),
128
- ],
129
- strategy,
130
- },
131
- );
132
-
133
- Object.assign(popoverEl.style, {
134
- left: `${computedPosition.x}px`,
135
- top: `${computedPosition.y}px`,
136
- });
137
-
138
- if (computedPosition.middlewareData.arrow) {
139
- const arrow = computedPosition.middlewareData.arrow;
140
-
141
- const side = computedPosition.placement.split("-")[0] as Side;
142
-
143
- const staticSide = {
144
- top: "bottom",
145
- right: "left",
146
- bottom: "top",
147
- left: "right",
148
- }[side];
149
-
150
- Object.assign(arrowEl.style, {
151
- left: arrow.x != null ? `${arrow.x}px` : "",
152
- top: arrow.y != null ? `${arrow.y}px` : "",
153
- [staticSide]: "-4px",
154
- transform: getArrowRotation(side),
155
- });
156
- }
157
- }
158
- }
159
99
  </script>
160
100
 
161
101
  {#if open}
162
102
  <div
163
103
  bind:this={popoverEl}
164
- use:ref
165
104
  popover="manual"
166
- class={twMerge(className)}
167
- transition:scale={{ duration: 150, start: 0.95 }}
168
- {...mergeProps(restProps, { onbeforetoggle, onclick: handleClickInside })}
105
+ class={cn(className)}
106
+ style:position-area={anchorEl && AREAS[placement]}
107
+ style:position-try-fallbacks={anchorEl &&
108
+ (vertical
109
+ ? "flip-block, flip-inline, flip-block flip-inline"
110
+ : "flip-inline, flip-block, flip-block flip-inline")}
111
+ style:inset={anchorEl && "auto"}
112
+ style:margin={anchorEl && (centered ? "6px" : vertical ? "6px 0" : "0 6px")}
113
+ style:justify-self={anchorEl && vertical && centered
114
+ ? "anchor-center"
115
+ : undefined}
116
+ style:align-self={anchorEl && !vertical && centered
117
+ ? "anchor-center"
118
+ : undefined}
119
+ transition:scale={{
120
+ duration: prefersReducedMotion.current ? 0 : 150,
121
+ start: 0.95,
122
+ }}
123
+ {...mergeProps(restProps, { onbeforetoggle })}
169
124
  >
170
125
  {@render children()}
171
- <div
172
- bind:this={arrowEl}
173
- class={twMerge(
174
- arrowClass,
175
- "absolute size-2 rotate-45",
176
- arrow ? "block" : "hidden",
177
- )}
178
- ></div>
179
126
  </div>
180
127
  {/if}
@@ -1,18 +1,16 @@
1
- import { type ClassName, type ElementRef } from "../utils.js";
2
- import * as floatingUi from "@floating-ui/dom";
1
+ import { type ClassName } from "../utils.js";
3
2
  import type { Snippet } from "svelte";
4
3
  import type { HTMLAttributes } from "svelte/elements";
5
- import { type ClassNameValue } from "tailwind-merge";
4
+ type Side = "top" | "right" | "bottom" | "left";
5
+ export type PopoverPlacement = Side | `${Side}-start` | `${Side}-end`;
6
6
  export type PopoverProps = {
7
- arrow?: boolean;
8
- arrowClass?: ClassNameValue;
9
- placement?: floatingUi.Placement;
10
- strategy?: floatingUi.Strategy;
7
+ placement?: PopoverPlacement;
11
8
  open?: boolean;
12
9
  anchorEl?: HTMLElement;
13
10
  onKeydownWhileOpen?: (event: KeyboardEvent) => void;
14
11
  children: Snippet;
15
- } & ClassName & ElementRef & HTMLAttributes<HTMLDivElement>;
12
+ el?: HTMLDivElement;
13
+ } & ClassName & Omit<HTMLAttributes<HTMLDivElement>, "class">;
16
14
  declare const Popover: import("svelte").Component<PopoverProps, {}, "el" | "open">;
17
15
  type Popover = ReturnType<typeof Popover>;
18
16
  export default Popover;
@@ -1,50 +1,83 @@
1
1
  <script lang="ts" module>
2
+ import {
3
+ baseClasses,
4
+ type ColorProp,
5
+ type Size,
6
+ type SizeProp,
7
+ } from "../base.js";
8
+ import { cn, type ClassName } from "../utils.js";
2
9
  import type { Snippet } from "svelte";
10
+ import type { SVGAttributes } from "svelte/elements";
11
+
3
12
  export type CircularProgressProps = {
4
- children?: Snippet;
5
13
  progress?: number;
6
- size?: string | number;
7
- trackColor?: string;
8
- textColor?: string;
9
- color?: string;
10
- class?: string;
14
+ children?: Snippet;
15
+ el?: SVGSVGElement;
16
+ } & ColorProp &
17
+ SizeProp &
18
+ ClassName &
19
+ Omit<SVGAttributes<SVGSVGElement>, "children" | "class" | "color">;
20
+
21
+ const SIZES: Record<Size, string> = {
22
+ xs: "size-4",
23
+ sm: "size-6",
24
+ md: "size-8",
25
+ lg: "size-10",
26
+ xl: "size-12",
11
27
  };
28
+ const CIRCUMFERENCE = 2 * Math.PI * 10;
12
29
  </script>
13
30
 
14
31
  <script lang="ts">
15
- const DASH_ARRAY = 2 * 3.1415926535 * 10;
16
-
17
- const {
18
- children,
32
+ let {
19
33
  progress,
20
- size = 24,
21
- trackColor = "color-mix(in srgb, currentColor 10%, transparent)",
22
- textColor = "currentColor",
23
- color = "currentColor",
34
+ children,
35
+ el = $bindable(),
36
+ color = "primary",
37
+ size = "sm",
24
38
  class: className,
39
+ "aria-label": ariaLabel = "Loading",
40
+ ...restProps
25
41
  }: CircularProgressProps = $props();
42
+
43
+ let fraction = $derived(
44
+ progress === undefined ? undefined : Math.min(Math.max(progress, 0), 1),
45
+ );
26
46
  </script>
27
47
 
28
48
  <svg
49
+ bind:this={el}
29
50
  xmlns="http://www.w3.org/2000/svg"
30
- width={size}
31
- height={size}
32
51
  viewBox="0 0 24 24"
33
52
  fill="transparent"
34
- class={className}
35
- class:circular={progress === undefined}
53
+ role="progressbar"
54
+ aria-label={ariaLabel}
55
+ aria-valuemin={0}
56
+ aria-valuemax={100}
57
+ aria-valuenow={fraction === undefined
58
+ ? undefined
59
+ : Math.round(fraction * 100)}
60
+ class={cn("shrink-0", SIZES[size], baseClasses({ color }), className)}
61
+ class:spin={fraction === undefined}
62
+ {...restProps}
36
63
  >
37
- <circle cx="50%" cy="50%" r="10px" stroke={trackColor} stroke-width="2px" />
38
64
  <circle
39
- class:path={progress === undefined}
40
- cx="50%"
41
- cy="50%"
42
- r="10px"
43
- stroke={color}
44
- stroke-width="2px"
65
+ cx="12"
66
+ cy="12"
67
+ r="10"
68
+ stroke="color-mix(in srgb, currentColor 10%, transparent)"
69
+ stroke-width="2"
70
+ />
71
+ <circle
72
+ class={[fraction === undefined && "dash"]}
73
+ cx="12"
74
+ cy="12"
75
+ r="10"
76
+ stroke="currentColor"
77
+ stroke-width="2"
45
78
  stroke-linecap="round"
46
- stroke-dasharray={DASH_ARRAY}
47
- stroke-dashoffset={(1 - (progress ?? 1)) * DASH_ARRAY}
79
+ stroke-dasharray={CIRCUMFERENCE}
80
+ stroke-dashoffset={(1 - (fraction ?? 1)) * CIRCUMFERENCE}
48
81
  transform-origin="center"
49
82
  transform="rotate(-90)"
50
83
  />
@@ -54,18 +87,18 @@
54
87
  font-size="7"
55
88
  text-anchor="middle"
56
89
  dominant-baseline="central"
57
- fill={textColor}
90
+ fill="currentColor"
58
91
  >
59
92
  {@render children?.()}
60
93
  </text>
61
94
  </svg>
62
95
 
63
96
  <style>@layer components {
64
- .circular {
97
+ .spin {
65
98
  animation: rotate 2s linear infinite;
66
99
  }
67
100
 
68
- .path {
101
+ .dash {
69
102
  animation: dash 1.5s ease-in-out infinite;
70
103
  }
71
104
 
@@ -74,6 +107,7 @@
74
107
  transform: rotate(360deg);
75
108
  }
76
109
  }
110
+
77
111
  @keyframes dash {
78
112
  0% {
79
113
  stroke-dasharray: 1, 200;
@@ -1,13 +1,12 @@
1
+ import { type ColorProp, type SizeProp } from "../base.js";
2
+ import { type ClassName } from "../utils.js";
1
3
  import type { Snippet } from "svelte";
4
+ import type { SVGAttributes } from "svelte/elements";
2
5
  export type CircularProgressProps = {
3
- children?: Snippet;
4
6
  progress?: number;
5
- size?: string | number;
6
- trackColor?: string;
7
- textColor?: string;
8
- color?: string;
9
- class?: string;
10
- };
11
- declare const CircularProgress: import("svelte").Component<CircularProgressProps, {}, "">;
7
+ children?: Snippet;
8
+ el?: SVGSVGElement;
9
+ } & ColorProp & SizeProp & ClassName & Omit<SVGAttributes<SVGSVGElement>, "children" | "class" | "color">;
10
+ declare const CircularProgress: import("svelte").Component<CircularProgressProps, {}, "el">;
12
11
  type CircularProgress = ReturnType<typeof CircularProgress>;
13
12
  export default CircularProgress;
@@ -1,2 +1,2 @@
1
- export { default as ShortcutBadge, type ShortcutBadgeProps, } from "./shortcut-badge.svelte";
2
- export { Shortcut } from "./shortcut.js";
1
+ export { Shortcut, type ShortcutOptions } from "./shortcut.js";
2
+ export { default as ShortcutHint, type ShortcutHintProps, } from "./shortcut-hint.svelte";
@@ -1,2 +1,2 @@
1
- export { default as ShortcutBadge, } from "./shortcut-badge.svelte";
2
1
  export { Shortcut } from "./shortcut.js";
2
+ export { default as ShortcutHint, } from "./shortcut-hint.svelte";
@@ -0,0 +1,36 @@
1
+ <script module lang="ts">
2
+ import { cn, type ClassName, type ElementRef } from "../utils.js";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+ import type { Shortcut } from "./shortcut.js";
5
+
6
+ export type ShortcutHintProps = {
7
+ shortcut: Shortcut;
8
+ } & ElementRef &
9
+ ClassName &
10
+ HTMLAttributes<HTMLElement>;
11
+ </script>
12
+
13
+ <script lang="ts">
14
+ let {
15
+ shortcut,
16
+ el = $bindable(),
17
+ class: className,
18
+ ...restProps
19
+ }: ShortcutHintProps = $props();
20
+ </script>
21
+
22
+ <kbd
23
+ bind:this={el}
24
+ class={cn("inline-flex shrink-0 gap-1 font-sans text-xs", className)}
25
+ {...restProps}
26
+ >
27
+ <span class="sr-only">{shortcut}</span>
28
+ {#each shortcut.keys() as key, index (index)}
29
+ <kbd
30
+ aria-hidden="true"
31
+ class="inline-flex h-[1.75em] min-w-[1.75em] items-center justify-center rounded border border-b-2 border-m3-outline-variant bg-m3-surface-container-low px-[0.4em] text-m3-on-surface-variant"
32
+ >
33
+ {key}
34
+ </kbd>
35
+ {/each}
36
+ </kbd>
@@ -0,0 +1,9 @@
1
+ import { type ClassName, type ElementRef } from "../utils.js";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ import type { Shortcut } from "./shortcut.js";
4
+ export type ShortcutHintProps = {
5
+ shortcut: Shortcut;
6
+ } & ElementRef & ClassName & HTMLAttributes<HTMLElement>;
7
+ declare const ShortcutHint: import("svelte").Component<ShortcutHintProps, {}, "el">;
8
+ type ShortcutHint = ReturnType<typeof ShortcutHint>;
9
+ export default ShortcutHint;
@@ -1,20 +1,25 @@
1
- export declare class Shortcut {
1
+ export type ShortcutOptions = {
2
2
  key: string;
3
- alt: boolean;
4
- ctrl: boolean;
5
- meta: boolean;
6
- shift: boolean;
7
- constructor(shortcut: {
8
- key: string;
9
- alt?: boolean;
10
- ctrl?: boolean;
11
- meta?: boolean;
12
- shift?: boolean;
13
- });
3
+ mod?: boolean;
4
+ ctrl?: boolean;
5
+ alt?: boolean;
6
+ shift?: boolean;
7
+ meta?: boolean;
8
+ };
9
+ export declare function isApple(): boolean;
10
+ export declare class Shortcut {
11
+ #private;
12
+ readonly key: string;
13
+ readonly mod: boolean;
14
+ readonly ctrl: boolean;
15
+ readonly alt: boolean;
16
+ readonly shift: boolean;
17
+ readonly meta: boolean;
18
+ constructor({ key, mod, ctrl, alt, shift, meta }: ShortcutOptions);
19
+ equals(other: Shortcut): boolean;
14
20
  matches(event: KeyboardEvent): boolean;
15
- toChar(): string;
21
+ keys(): string[];
16
22
  toString(): string;
17
- [Symbol.iterator](): Iterator<string>;
18
23
  static isChar(event: KeyboardEvent): boolean;
19
24
  static fromEvent(event: KeyboardEvent): Shortcut;
20
25
  static ARROW_UP: Shortcut;