@hyvor/design 2.1.8-beta.1 → 2.1.8

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.
@@ -111,7 +111,7 @@
111
111
  {/snippet}
112
112
  </ActionListItem>
113
113
  </a>
114
- <a href={SOCIAL_LINKS.bluesky} target="_blank">
114
+ <a href={SOCIAL_LINKS.blueksy} target="_blank">
115
115
  <ActionListItem>
116
116
  Bluesky
117
117
  {#snippet start()}
@@ -28,7 +28,7 @@
28
28
  position="bottom"
29
29
  text="Switch Organization"
30
30
  disabled={disableTooltip}
31
- style="height: 100%"
31
+ wrapperProps={{ style: 'height: 100%' }}
32
32
  >
33
33
  <button class="wrap" onclick={() => (show = true)} bind:this={trigger}>
34
34
  <div class="data">
@@ -2,10 +2,20 @@
2
2
  interface Props {
3
3
  size?: number | 'small' | 'medium' | 'large';
4
4
  alt?: string;
5
- [key: string]: any;
5
+ src?: string | null;
6
+ username?: string;
7
+ bg?: string;
8
+ fg?: string;
6
9
  }
7
10
 
8
- let { size = $bindable('medium'), alt = '', ...rest }: Props = $props();
11
+ let {
12
+ size = $bindable('medium'),
13
+ alt = '',
14
+ src = null,
15
+ username = '',
16
+ bg = 'var(--accent)',
17
+ fg = 'var(--accent-text)'
18
+ }: Props = $props();
9
19
 
10
20
  const sizes = {
11
21
  small: 24,
@@ -13,14 +23,50 @@
13
23
  large: 48
14
24
  };
15
25
  size = typeof size === 'number' ? size : sizes[size];
26
+
27
+ function getInitials(name: string) {
28
+ const parts = name.trim().split(/\s+/).filter(Boolean);
29
+ if (parts.length === 0) {
30
+ return '';
31
+ }
32
+ if (parts.length === 1) {
33
+ return parts[0].slice(0, 2).toUpperCase();
34
+ }
35
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
36
+ }
37
+
38
+ const initials = $derived(getInitials(username));
16
39
  </script>
17
40
 
18
- <img {alt} {...rest} style={`width: ${size}px; height: ${size}px;`} />
41
+ {#if src}
42
+ <img {src} {alt} style={`width: ${size}px; height: ${size}px;`} />
43
+ {:else}
44
+ <svg
45
+ width={size}
46
+ height={size}
47
+ viewBox="0 0 {size} {size}"
48
+ role="img"
49
+ aria-label={alt || username}
50
+ >
51
+ <circle cx={size / 2} cy={size / 2} r={size / 2} fill={bg} />
52
+ <text
53
+ x="50%"
54
+ y="50%"
55
+ dy=".35em"
56
+ text-anchor="middle"
57
+ fill={fg}
58
+ font-family="var(--font-sans-serif)"
59
+ font-size={size * 0.4}>{initials}</text
60
+ >
61
+ </svg>
62
+ {/if}
19
63
 
20
64
  <style>
21
- img {
65
+ img,
66
+ svg {
22
67
  border-radius: 50%;
23
68
  display: inline-block;
24
69
  overflow: hidden;
70
+ vertical-align: middle;
25
71
  }
26
72
  </style>
@@ -1,7 +1,10 @@
1
1
  interface Props {
2
2
  size?: number | 'small' | 'medium' | 'large';
3
3
  alt?: string;
4
- [key: string]: any;
4
+ src?: string | null;
5
+ username?: string;
6
+ bg?: string;
7
+ fg?: string;
5
8
  }
6
9
  declare const Avatar: import("svelte").Component<Props, {}, "size">;
7
10
  type Avatar = ReturnType<typeof Avatar>;
@@ -22,13 +22,16 @@
22
22
  display: inline-flex;
23
23
  cursor: pointer;
24
24
  }
25
- .stack :global(img) {
25
+ .stack :global(img),
26
+ .stack :global(svg) {
26
27
  transition: 0.2s;
27
28
  }
28
- .stack :global(img:not(:first-child)) {
29
+ .stack :global(img:not(:first-child)),
30
+ .stack :global(svg:not(:first-child)) {
29
31
  margin-left: calc(var(--local-size) * -0.5);
30
32
  }
31
- .stack:hover :global(img:not(:first-child)) {
33
+ .stack:hover :global(img:not(:first-child)),
34
+ .stack:hover :global(svg:not(:first-child)) {
32
35
  margin-left: 3px;
33
36
  }
34
37
  </style>
@@ -1,22 +1,43 @@
1
- <!-- @migration-task Error while migrating Svelte code: This migration would change the name of a slot making the component unusable -->
2
1
  <script lang="ts">
3
- import { tick, onMount, onDestroy } from 'svelte';
2
+ import { tick, onMount } from 'svelte';
4
3
  import { fade } from 'svelte/transition';
4
+ import type { Snippet } from 'svelte';
5
+ import type { HTMLAttributes } from 'svelte/elements';
6
+
7
+ interface Props {
8
+ text?: string;
9
+ position?: 'top' | 'bottom' | 'left' | 'right';
10
+ color?: 'black' | 'accent' | 'soft' | 'danger';
11
+ show?: boolean;
12
+ maxWidth?: number;
13
+ disabled?: boolean;
14
+ delay?: number;
15
+ children?: Snippet;
16
+ tooltip?: Snippet;
17
+ wrapperProps?: HTMLAttributes<HTMLDivElement>;
18
+ }
5
19
 
6
- export let text: string = '';
7
- export let position: 'top' | 'bottom' | 'left' | 'right' = 'top';
8
- export let color: 'black' | 'accent' | 'soft' | 'danger' = 'black';
9
- export let show = false;
10
- export let maxWidth: number = 300;
11
- export let disabled = false;
12
-
13
- let wrap: HTMLDivElement;
14
- let tooltip: HTMLDivElement;
20
+ let {
21
+ text = '',
22
+ position = 'top',
23
+ color = 'black',
24
+ show = $bindable(false),
25
+ maxWidth = 300,
26
+ disabled = false,
27
+ delay = 100,
28
+ children,
29
+ tooltip,
30
+ wrapperProps = {}
31
+ }: Props = $props();
32
+
33
+ let wrap: HTMLDivElement | undefined = $state();
34
+ let tooltipEl: HTMLDivElement | undefined = $state();
35
+ let showTimeout: ReturnType<typeof setTimeout>;
15
36
 
16
37
  function positionTooltip() {
17
- if (wrap && tooltip && show) {
38
+ if (wrap && tooltipEl && show) {
18
39
  const wrapRect = wrap.getBoundingClientRect();
19
- const tooltipRect = tooltip.getBoundingClientRect();
40
+ const tooltipRect = tooltipEl.getBoundingClientRect();
20
41
 
21
42
  let top, left;
22
43
 
@@ -36,36 +57,41 @@
36
57
  left = position === 'left' ? leftVal : wrapRect.right + 10;
37
58
  }
38
59
 
39
- tooltip.style.top = top + 'px';
40
- tooltip.style.left = left + 'px';
60
+ tooltipEl.style.top = top + 'px';
61
+ tooltipEl.style.left = left + 'px';
41
62
  }
42
63
  }
43
64
 
44
- async function handleMouseEnter() {
65
+ function handleMouseEnter() {
45
66
  if (!disabled) {
46
- show = true;
47
- await tick();
48
- positionTooltip();
67
+ clearTimeout(showTimeout);
68
+ showTimeout = setTimeout(async () => {
69
+ show = true;
70
+ await tick();
71
+ positionTooltip();
72
+ }, delay);
49
73
  }
50
74
  }
51
75
 
52
76
  function handleMouseLeave() {
77
+ clearTimeout(showTimeout);
53
78
  show = false;
54
79
  }
55
80
 
56
- $: {
81
+ $effect(() => {
57
82
  if (text) {
58
83
  tick().then(() => {
59
84
  positionTooltip();
60
85
  });
61
86
  }
62
- }
87
+ });
63
88
 
64
89
  onMount(() => {
65
90
  positionTooltip();
66
91
  document.addEventListener('scroll', positionTooltip);
67
92
 
68
93
  return () => {
94
+ clearTimeout(showTimeout);
69
95
  document.removeEventListener('scroll', positionTooltip);
70
96
  };
71
97
  });
@@ -73,23 +99,23 @@
73
99
 
74
100
  <div
75
101
  class="tooltip-wrap {color}"
76
- on:mouseenter={handleMouseEnter}
77
- on:mouseleave={handleMouseLeave}
102
+ onmouseenter={handleMouseEnter}
103
+ onmouseleave={handleMouseLeave}
78
104
  role="tooltip"
79
105
  bind:this={wrap}
80
- {...$$restProps}
106
+ {...wrapperProps}
81
107
  >
82
- <slot />
108
+ {@render children?.()}
83
109
 
84
110
  {#if !disabled && show}
85
111
  <div
86
112
  class="tooltip {position}"
87
113
  style:max-width={maxWidth + 'px'}
88
- bind:this={tooltip}
114
+ bind:this={tooltipEl}
89
115
  transition:fade={{ duration: 100 }}
90
116
  >
91
- {#if $$slots.tooltip}
92
- <slot name="tooltip" />
117
+ {#if tooltip}
118
+ {@render tooltip()}
93
119
  {:else}
94
120
  {text}
95
121
  {/if}
@@ -1,37 +1,17 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ interface Props {
4
+ text?: string;
5
+ position?: 'top' | 'bottom' | 'left' | 'right';
6
+ color?: 'black' | 'accent' | 'soft' | 'danger';
7
+ show?: boolean;
8
+ maxWidth?: number;
9
+ disabled?: boolean;
10
+ delay?: number;
11
+ children?: Snippet;
12
+ tooltip?: Snippet;
13
+ wrapperProps?: HTMLAttributes<HTMLDivElement>;
13
14
  }
14
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
15
- default: any;
16
- } ? Props extends Record<string, never> ? any : {
17
- children?: any;
18
- } : {});
19
- declare const Tooltip: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
20
- [x: string]: any;
21
- text?: string | undefined;
22
- position?: "top" | "bottom" | "left" | "right" | undefined;
23
- color?: "black" | "accent" | "soft" | "danger" | undefined;
24
- show?: boolean | undefined;
25
- maxWidth?: number | undefined;
26
- disabled?: boolean | undefined;
27
- }, {
28
- default: {};
29
- tooltip: {};
30
- }>, {
31
- [evt: string]: CustomEvent<any>;
32
- }, {
33
- default: {};
34
- tooltip: {};
35
- }, {}, string>;
36
- type Tooltip = InstanceType<typeof Tooltip>;
15
+ declare const Tooltip: import("svelte").Component<Props, {}, "show">;
16
+ type Tooltip = ReturnType<typeof Tooltip>;
37
17
  export default Tooltip;
package/dist/index.css CHANGED
@@ -84,10 +84,13 @@ a {
84
84
  hyphens: none;
85
85
  }
86
86
 
87
+ :root.dark .shiki {
88
+ background-color: var(--shiki-dark-bg) !important;
89
+ }
90
+
87
91
  :root.dark .shiki,
88
92
  :root.dark .shiki span {
89
93
  color: var(--shiki-dark) !important;
90
- background-color: var(--shiki-dark-bg) !important;
91
94
  font-style: var(--shiki-dark-font-style) !important;
92
95
  font-weight: var(--shiki-dark-font-weight) !important;
93
96
  text-decoration: var(--shiki-dark-text-decoration) !important;
@@ -368,7 +368,7 @@
368
368
  margin: 20px 0;
369
369
  }
370
370
 
371
- content :global(code) {
371
+ content :global(code:not(pre code)) {
372
372
  font-size: 14px;
373
373
  padding: 0.2em 0.4em;
374
374
  display: inline-block;
@@ -379,7 +379,7 @@
379
379
  line-height: normal;
380
380
  font-weight: 400;
381
381
  }
382
- :global(:root.dark) content :global(code) {
382
+ :global(:root.dark) content :global(code:not(pre code)) {
383
383
  background-color: #282c34;
384
384
  color: #e06c75;
385
385
  }