@eifi1/ui-kit 0.7.0 → 0.8.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 (233) hide show
  1. package/README.md +32 -17
  2. package/dist/chart.d.ts +3 -2
  3. package/dist/components/alert-banner.d.ts +59 -10
  4. package/dist/components/alert-banner.js +114 -8
  5. package/dist/components/alert-banner.js.map +1 -1
  6. package/dist/components/amount-input.d.ts +5 -0
  7. package/dist/components/button-group.d.ts +26 -0
  8. package/dist/components/button-group.js +49 -0
  9. package/dist/components/button-group.js.map +1 -0
  10. package/dist/components/calculator.d.ts +5 -0
  11. package/dist/components/chart-zoom.d.ts +63 -14
  12. package/dist/components/chart-zoom.js +82 -16
  13. package/dist/components/chart-zoom.js.map +1 -1
  14. package/dist/components/chip.d.ts +67 -2
  15. package/dist/components/chip.js +73 -8
  16. package/dist/components/chip.js.map +1 -1
  17. package/dist/components/confirm-dialog.d.ts +120 -0
  18. package/dist/components/confirm-dialog.js +96 -0
  19. package/dist/components/confirm-dialog.js.map +1 -0
  20. package/dist/components/copy-button.d.ts +62 -0
  21. package/dist/components/copy-button.js +95 -0
  22. package/dist/components/copy-button.js.map +1 -0
  23. package/dist/components/data-table-filter-popover.d.ts +1 -1
  24. package/dist/components/data-table-filters.d.ts +1 -1
  25. package/dist/components/data-table-pagination.d.ts +5 -1
  26. package/dist/components/data-table-pagination.js +71 -58
  27. package/dist/components/data-table-pagination.js.map +1 -1
  28. package/dist/components/data-table-sort.d.ts +28 -5
  29. package/dist/components/data-table-sort.js +11 -7
  30. package/dist/components/data-table-sort.js.map +1 -1
  31. package/dist/components/data-table.d.ts +1 -1
  32. package/dist/components/data-table.js +544 -423
  33. package/dist/components/data-table.js.map +1 -1
  34. package/dist/components/date-picker.d.ts +51 -5
  35. package/dist/components/date-picker.js +152 -40
  36. package/dist/components/date-picker.js.map +1 -1
  37. package/dist/components/description-list.d.ts +60 -0
  38. package/dist/components/description-list.js +112 -0
  39. package/dist/components/description-list.js.map +1 -0
  40. package/dist/components/disclosure.d.ts +37 -2
  41. package/dist/components/disclosure.js +14 -5
  42. package/dist/components/disclosure.js.map +1 -1
  43. package/dist/components/facing-pair.d.ts +2 -0
  44. package/dist/components/file-button.d.ts +19 -1
  45. package/dist/components/file-button.js +8 -1
  46. package/dist/components/file-button.js.map +1 -1
  47. package/dist/components/file-dropzone.d.ts +56 -9
  48. package/dist/components/file-dropzone.js +100 -70
  49. package/dist/components/file-dropzone.js.map +1 -1
  50. package/dist/components/floating-panel.d.ts +107 -0
  51. package/dist/components/floating-panel.js +206 -0
  52. package/dist/components/floating-panel.js.map +1 -0
  53. package/dist/components/full-bleed-dialog.d.ts +12 -1
  54. package/dist/components/full-bleed-dialog.js +26 -5
  55. package/dist/components/full-bleed-dialog.js.map +1 -1
  56. package/dist/components/modal.d.ts +6 -2
  57. package/dist/components/modal.js +2 -1
  58. package/dist/components/modal.js.map +1 -1
  59. package/dist/components/number-field.d.ts +5 -0
  60. package/dist/components/number-input.d.ts +5 -0
  61. package/dist/components/numpad-sheet.d.ts +5 -0
  62. package/dist/components/progress-bar.d.ts +54 -0
  63. package/dist/components/progress-bar.js +94 -0
  64. package/dist/components/progress-bar.js.map +1 -0
  65. package/dist/components/scroll-area.d.ts +53 -0
  66. package/dist/components/scroll-area.js +86 -0
  67. package/dist/components/scroll-area.js.map +1 -0
  68. package/dist/components/separator.d.ts +23 -0
  69. package/dist/components/separator.js +24 -0
  70. package/dist/components/separator.js.map +1 -0
  71. package/dist/components/series-chart-ticks.d.ts +34 -1
  72. package/dist/components/series-chart-ticks.js +83 -1
  73. package/dist/components/series-chart-ticks.js.map +1 -1
  74. package/dist/components/series-chart.d.ts +314 -19
  75. package/dist/components/series-chart.js +510 -120
  76. package/dist/components/series-chart.js.map +1 -1
  77. package/dist/components/settings-fields.d.ts +2 -0
  78. package/dist/components/skeleton.d.ts +36 -0
  79. package/dist/components/skeleton.js +35 -0
  80. package/dist/components/skeleton.js.map +1 -0
  81. package/dist/components/stat-tile.d.ts +60 -6
  82. package/dist/components/stat-tile.js +60 -26
  83. package/dist/components/stat-tile.js.map +1 -1
  84. package/dist/components/table.d.ts +83 -0
  85. package/dist/components/table.js +166 -0
  86. package/dist/components/table.js.map +1 -0
  87. package/dist/components/time-input.d.ts +2 -0
  88. package/dist/components/toggle-legend.d.ts +3 -2
  89. package/dist/components/toggle-legend.js +1 -1
  90. package/dist/components/toggle-legend.js.map +1 -1
  91. package/dist/components/tooltip.d.ts +10 -4
  92. package/dist/components/tooltip.js +23 -6
  93. package/dist/components/tooltip.js.map +1 -1
  94. package/dist/components/tree-view.d.ts +129 -0
  95. package/dist/components/tree-view.js +376 -0
  96. package/dist/components/tree-view.js.map +1 -0
  97. package/dist/components/treemap.d.ts +9 -2
  98. package/dist/components/treemap.js +2 -1
  99. package/dist/components/treemap.js.map +1 -1
  100. package/dist/components/ui.d.ts +92 -14
  101. package/dist/components/ui.js +112 -30
  102. package/dist/components/ui.js.map +1 -1
  103. package/dist/components/use-table-state.d.ts +1 -1
  104. package/dist/{data-table-filters-noy0Abvi.d.ts → data-table-filters-CF1PXqjQ.d.ts} +73 -3
  105. package/dist/data-table.d.ts +2 -2
  106. package/dist/data-table.js.map +1 -1
  107. package/dist/hooks/use-copy-to-clipboard.d.ts +28 -0
  108. package/dist/hooks/use-copy-to-clipboard.js +81 -0
  109. package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
  110. package/dist/hooks/use-debounce.d.ts +43 -0
  111. package/dist/hooks/use-debounce.js +56 -0
  112. package/dist/hooks/use-debounce.js.map +1 -0
  113. package/dist/hooks/use-file-drop.d.ts +72 -0
  114. package/dist/hooks/use-file-drop.js +57 -0
  115. package/dist/hooks/use-file-drop.js.map +1 -0
  116. package/dist/i18n/defaults.d.ts +5 -0
  117. package/dist/i18n/defaults.js +7 -1
  118. package/dist/i18n/defaults.js.map +1 -1
  119. package/dist/i18n/kit-labels.d.ts +17 -0
  120. package/dist/i18n/kit-labels.js +6 -2
  121. package/dist/i18n/kit-labels.js.map +1 -1
  122. package/dist/i18n/locales/de-CH-informal.d.ts +43 -0
  123. package/dist/i18n/locales/de-CH-informal.js +8 -0
  124. package/dist/i18n/locales/de-CH-informal.js.map +1 -0
  125. package/dist/i18n/locales/de-CH.d.ts +5 -0
  126. package/dist/i18n/locales/de-CH.js +1 -14
  127. package/dist/i18n/locales/de-CH.js.map +1 -1
  128. package/dist/i18n/locales/de-informal.d.ts +64 -0
  129. package/dist/i18n/locales/de-informal.js +37 -0
  130. package/dist/i18n/locales/de-informal.js.map +1 -0
  131. package/dist/i18n/locales/de.d.ts +5 -0
  132. package/dist/i18n/locales/de.js +25 -0
  133. package/dist/i18n/locales/de.js.map +1 -1
  134. package/dist/i18n/locales/es.d.ts +5 -0
  135. package/dist/i18n/locales/es.js +25 -0
  136. package/dist/i18n/locales/es.js.map +1 -1
  137. package/dist/i18n/locales/fr.d.ts +5 -0
  138. package/dist/i18n/locales/fr.js +25 -0
  139. package/dist/i18n/locales/fr.js.map +1 -1
  140. package/dist/i18n/locales/hu.d.ts +5 -0
  141. package/dist/i18n/locales/hu.js +25 -0
  142. package/dist/i18n/locales/hu.js.map +1 -1
  143. package/dist/i18n/locales/it.d.ts +5 -0
  144. package/dist/i18n/locales/it.js +25 -0
  145. package/dist/i18n/locales/it.js.map +1 -1
  146. package/dist/i18n/locales/zh.d.ts +5 -0
  147. package/dist/i18n/locales/zh.js +25 -0
  148. package/dist/i18n/locales/zh.js.map +1 -1
  149. package/dist/i18n/swiss.d.ts +13 -0
  150. package/dist/i18n/swiss.js +19 -0
  151. package/dist/i18n/swiss.js.map +1 -0
  152. package/dist/index.d.ts +26 -11
  153. package/dist/index.js +22 -0
  154. package/dist/index.js.map +1 -1
  155. package/dist/lib/dates.d.ts +37 -1
  156. package/dist/lib/dates.js +19 -0
  157. package/dist/lib/dates.js.map +1 -1
  158. package/dist/rhf/form.d.ts +2 -0
  159. package/dist/rhf.d.ts +2 -0
  160. package/dist/search/command-palette.d.ts +15 -1
  161. package/dist/search/command-palette.js +10 -2
  162. package/dist/search/command-palette.js.map +1 -1
  163. package/dist/shell/app-shell.js +2 -2
  164. package/dist/shell/app-shell.js.map +1 -1
  165. package/dist/wizard/stepper-nav.d.ts +35 -2
  166. package/dist/wizard/stepper-nav.js +54 -22
  167. package/dist/wizard/stepper-nav.js.map +1 -1
  168. package/dist/wizard/types.d.ts +107 -5
  169. package/dist/wizard/types.js +2 -1
  170. package/dist/wizard/types.js.map +1 -1
  171. package/dist/wizard/use-wizard.js +141 -21
  172. package/dist/wizard/use-wizard.js.map +1 -1
  173. package/dist/wizard/wizard-summary.d.ts +10 -2
  174. package/dist/wizard/wizard-summary.js +3 -1
  175. package/dist/wizard/wizard-summary.js.map +1 -1
  176. package/dist/wizard.d.ts +4 -1
  177. package/dist/wizard.js.map +1 -1
  178. package/package.json +1 -1
  179. package/src/components/alert-banner.tsx +211 -20
  180. package/src/components/button-group.tsx +75 -0
  181. package/src/components/chart-zoom.tsx +158 -20
  182. package/src/components/chip.tsx +160 -9
  183. package/src/components/confirm-dialog.tsx +242 -0
  184. package/src/components/copy-button.tsx +158 -0
  185. package/src/components/data-table-pagination.tsx +19 -6
  186. package/src/components/data-table-sort.ts +49 -10
  187. package/src/components/data-table.tsx +293 -24
  188. package/src/components/date-picker.tsx +262 -57
  189. package/src/components/description-list.tsx +174 -0
  190. package/src/components/disclosure.tsx +58 -5
  191. package/src/components/file-button.tsx +22 -2
  192. package/src/components/file-dropzone.tsx +198 -100
  193. package/src/components/floating-panel.tsx +341 -0
  194. package/src/components/full-bleed-dialog.tsx +48 -5
  195. package/src/components/modal.tsx +9 -2
  196. package/src/components/progress-bar.tsx +163 -0
  197. package/src/components/scroll-area.tsx +129 -0
  198. package/src/components/separator.tsx +37 -0
  199. package/src/components/series-chart-ticks.ts +135 -0
  200. package/src/components/series-chart.tsx +934 -67
  201. package/src/components/skeleton.tsx +65 -0
  202. package/src/components/stat-tile.tsx +160 -27
  203. package/src/components/table.tsx +263 -0
  204. package/src/components/toggle-legend.tsx +4 -3
  205. package/src/components/tooltip.tsx +40 -12
  206. package/src/components/tree-view.tsx +589 -0
  207. package/src/components/treemap.tsx +10 -2
  208. package/src/components/ui.tsx +268 -42
  209. package/src/data-table.ts +2 -0
  210. package/src/hooks/use-copy-to-clipboard.ts +122 -0
  211. package/src/hooks/use-debounce.ts +105 -0
  212. package/src/hooks/use-file-drop.ts +123 -0
  213. package/src/i18n/defaults.ts +6 -0
  214. package/src/i18n/kit-labels.tsx +19 -0
  215. package/src/i18n/locales/de-CH-informal.ts +10 -0
  216. package/src/i18n/locales/de-CH.ts +1 -16
  217. package/src/i18n/locales/de-informal.ts +61 -0
  218. package/src/i18n/locales/de.ts +25 -0
  219. package/src/i18n/locales/es.ts +25 -0
  220. package/src/i18n/locales/fr.ts +25 -0
  221. package/src/i18n/locales/hu.ts +25 -0
  222. package/src/i18n/locales/it.ts +25 -0
  223. package/src/i18n/locales/zh.ts +25 -0
  224. package/src/i18n/swiss.ts +25 -0
  225. package/src/index.ts +29 -0
  226. package/src/lib/dates.ts +48 -0
  227. package/src/search/command-palette.tsx +29 -3
  228. package/src/shell/app-shell.tsx +2 -2
  229. package/src/wizard/stepper-nav.tsx +102 -28
  230. package/src/wizard/types.ts +106 -4
  231. package/src/wizard/use-wizard.ts +211 -31
  232. package/src/wizard/wizard-summary.tsx +24 -12
  233. package/src/wizard.ts +3 -2
@@ -13,8 +13,22 @@ import { createPortal } from "react-dom";
13
13
  import { cn } from "../lib/cn";
14
14
  import { useEscapeKey } from "../hooks/use-dismiss";
15
15
  import { useAnchoredRect, type AnchorRect } from "../hooks/use-anchored-rect";
16
+ import { dirOf, type Direction } from "../lib/direction";
16
17
 
17
- type TooltipSide = "top" | "bottom" | "left" | "right";
18
+ /** Where the bubble sits. `start` / `end` follow the reading direction — `end` is the
19
+ * right in LTR and the left in RTL — and are what a layout that mirrors should ask
20
+ * for. `left` / `right` stay physical, for a bubble tied to something that does not
21
+ * mirror (a chart axis, a map). */
22
+ export type TooltipSide = "top" | "bottom" | "left" | "right" | "start" | "end";
23
+
24
+ /** The placement the maths works in: a logical side resolved against the trigger. */
25
+ type PhysicalSide = "top" | "bottom" | "left" | "right";
26
+
27
+ function physicalSide(side: TooltipSide, dir: Direction): PhysicalSide {
28
+ if (side === "start") return dir === "rtl" ? "right" : "left";
29
+ if (side === "end") return dir === "rtl" ? "left" : "right";
30
+ return side;
31
+ }
18
32
 
19
33
  /** The floating bubble itself. Uses the shared surface/border/text tokens so it
20
34
  * reads as part of the app's chrome (like the top bar and cards) rather than the
@@ -37,6 +51,10 @@ const sidePositionClass: Record<TooltipSide, string> = {
37
51
  bottom: "top-full left-1/2 -translate-x-1/2 mt-1",
38
52
  left: "right-full top-1/2 -translate-y-1/2 mr-1",
39
53
  right: "left-full top-1/2 -translate-y-1/2 ml-1",
54
+ // Logical insets, so CSS resolves the side from the inherited direction with no
55
+ // JavaScript: `end-full` pins the bubble's END edge to the trigger's start.
56
+ start: "end-full top-1/2 -translate-y-1/2 me-1",
57
+ end: "start-full top-1/2 -translate-y-1/2 ms-1",
40
58
  };
41
59
 
42
60
  /**
@@ -248,7 +266,7 @@ const TOOLTIP_GAP = 4;
248
266
  * against the glass reads as clipped even when every character is on screen. */
249
267
  const TOOLTIP_MARGIN = 4;
250
268
 
251
- const portalTransformBySide: Record<TooltipSide, string> = {
269
+ const portalTransformBySide: Record<PhysicalSide, string> = {
252
270
  right: "translate(0, -50%)",
253
271
  left: "translate(-100%, -50%)",
254
272
  top: "translate(-50%, -100%)",
@@ -259,7 +277,7 @@ const portalTransformBySide: Record<TooltipSide, string> = {
259
277
  * with {@link portalTransformBySide}, which shifts the box onto that point. */
260
278
  function tooltipAnchor(
261
279
  r: AnchorRect,
262
- side: TooltipSide,
280
+ side: PhysicalSide,
263
281
  ): { left: number; top: number } {
264
282
  switch (side) {
265
283
  case "right":
@@ -287,10 +305,10 @@ export interface TooltipPlacement {
287
305
  left: number;
288
306
  top: number;
289
307
  /** Which side it ended up on, which need not be the one that was asked for. */
290
- side: TooltipSide;
308
+ side: PhysicalSide;
291
309
  }
292
310
 
293
- const opposite: Record<TooltipSide, TooltipSide> = {
311
+ const opposite: Record<PhysicalSide, PhysicalSide> = {
294
312
  left: "right",
295
313
  right: "left",
296
314
  top: "bottom",
@@ -300,7 +318,7 @@ const opposite: Record<TooltipSide, TooltipSide> = {
300
318
  /** Whether the bubble clears the viewport edge on `side` of the trigger. */
301
319
  function roomOn(
302
320
  r: AnchorRect,
303
- side: TooltipSide,
321
+ side: PhysicalSide,
304
322
  size: TooltipSize,
305
323
  viewport: TooltipViewport,
306
324
  ): boolean {
@@ -359,7 +377,7 @@ function clamp(value: number, low: number, high: number): number {
359
377
  */
360
378
  export function placeTooltip(
361
379
  r: AnchorRect,
362
- side: TooltipSide,
380
+ side: PhysicalSide,
363
381
  size: TooltipSize,
364
382
  viewport: TooltipViewport,
365
383
  ): TooltipPlacement {
@@ -394,6 +412,14 @@ function PortalTooltip({
394
412
  const triggerRef = useRef<HTMLSpanElement | null>(null);
395
413
  const bubbleRef = useRef<HTMLSpanElement | null>(null);
396
414
  const [visible, setVisible] = useState(false);
415
+ // The trigger's reading direction, read when the bubble is asked for (an event, not a
416
+ // render): it resolves `start` / `end`, and the portalled bubble — which has left the
417
+ // subtree it would have inherited `dir` from — carries it too.
418
+ const [dir, setDir] = useState<Direction>("ltr");
419
+ const show = (el: Element) => {
420
+ setDir(dirOf(el));
421
+ setVisible(true);
422
+ };
397
423
  const id = useId();
398
424
  // Escape closes it outright, since this variant's bubble only exists while it is
399
425
  // shown. The next mouseenter/focus brings it back, which is the behaviour WCAG
@@ -424,11 +450,12 @@ function PortalTooltip({
424
450
  });
425
451
  }, [visible, rect, label]);
426
452
 
427
- const point = rect ? tooltipAnchor(rect, side) : null;
453
+ const physical = physicalSide(side, dir);
454
+ const point = rect ? tooltipAnchor(rect, physical) : null;
428
455
  // Unmeasured on the very first pass, where the anchor point plus the side's
429
456
  // own transform is exactly what this always did. One layout effect later the
430
457
  // size is known and the placement is decided properly.
431
- const placed = rect && room ? placeTooltip(rect, side, room.size, room.viewport) : null;
458
+ const placed = rect && room ? placeTooltip(rect, physical, room.size, room.viewport) : null;
432
459
 
433
460
  return (
434
461
  <>
@@ -440,9 +467,9 @@ function PortalTooltip({
440
467
  {...rest}
441
468
  ref={triggerRef}
442
469
  className={cn("relative inline-flex", className)}
443
- onMouseEnter={() => setVisible(true)}
470
+ onMouseEnter={(e) => show(e.currentTarget)}
444
471
  onMouseLeave={() => setVisible(false)}
445
- onFocus={() => setVisible(true)}
472
+ onFocus={(e) => show(e.currentTarget)}
446
473
  onBlur={() => setVisible(false)}
447
474
  >
448
475
  {describedBy(children, visible ? id : undefined)}
@@ -455,6 +482,7 @@ function PortalTooltip({
455
482
  ref={bubbleRef}
456
483
  id={id}
457
484
  role="tooltip"
485
+ dir={dir}
458
486
  data-private={redact ? "" : undefined}
459
487
  style={
460
488
  placed
@@ -463,7 +491,7 @@ function PortalTooltip({
463
491
  position: "fixed",
464
492
  left: point.left,
465
493
  top: point.top,
466
- transform: portalTransformBySide[side],
494
+ transform: portalTransformBySide[physical],
467
495
  }
468
496
  }
469
497
  className={cn(TOOLTIP_SURFACE, "pointer-events-none z-50")}