Skip to content

Commit 0c4d6e1

Browse files
authored
Merge pull request #346 from appwrite/keyboard-nav-sheet
2 parents b5bb595 + 0478e12 commit 0c4d6e1

21 files changed

+2236
-140
lines changed

v2/pink-sb/src/lib/Dialog.svelte

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import Icon from './Icon.svelte';
77
import Text from './typography/Text.svelte';
88
import { setContext } from 'svelte';
9+
import { writable } from 'svelte/store';
910
1011
export let title: string;
1112
export let open = false;
@@ -14,7 +15,7 @@
1415
1516
setContext('dialog-group', true);
1617
17-
function handleBLur(event: MouseEvent) {
18+
function handleBlur(event: MouseEvent) {
1819
if (event.target === dialog) {
1920
dialog.close();
2021
}
@@ -36,7 +37,7 @@
3637
}
3738
</script>
3839

39-
<svelte:window on:mousedown={handleBLur} on:keydown={handleKeydown} />
40+
<svelte:window on:mousedown={handleBlur} on:keydown={handleKeydown} />
4041

4142
<dialog bind:this={dialog} on:close={() => (open = false)}>
4243
<section>
@@ -48,9 +49,11 @@
4849
<Icon icon={IconX} />
4950
</Button>
5051
</Stack>
51-
<Text variant="m-400" color="--fgcolor-neutral-secondary">
52-
<slot />
53-
</Text>
52+
<div class="dialog-content">
53+
<Text variant="m-400" color="--fgcolor-neutral-secondary">
54+
<slot />
55+
</Text>
56+
</div>
5457
</header>
5558
<footer>
5659
<slot name="footer">
@@ -107,6 +110,10 @@
107110
border-bottom: var(--border-width-s) solid var(--border-neutral);
108111
background: var(--bgcolor-neutral-primary);
109112
padding-block-start: var(--space-7);
113+
114+
& .dialog-content {
115+
width: 100%;
116+
}
110117
}
111118
}
112119

v2/pink-sb/src/lib/Fieldset.svelte

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
<script lang="ts">
2+
import Badge from './Badge.svelte';
3+
import Stack from './layout/Stack.svelte';
4+
25
export let legend: string;
6+
export let badge: string | undefined = undefined;
7+
export let badgeVariant: 'primary' | 'secondary' | 'accent' = 'secondary';
38
</script>
49

510
<fieldset>
6-
<legend><span>{legend}</span></legend>
11+
<legend>
12+
<span>
13+
<Stack inline direction="row" alignItems="center" gap="xxs">
14+
<span class="legend-text">{legend}</span>
15+
{#if badge}
16+
<Badge content={badge} variant={badgeVariant} size="xs" />
17+
{/if}
18+
</Stack>
19+
</span>
20+
</legend>
721
<div class="content"><slot /></div>
822
</fieldset>
923

@@ -20,8 +34,7 @@
2034
margin-left: var(--space-6, 12px);
2135
}
2236
23-
span {
24-
padding: 0 var(--space-2, 4px);
37+
.legend-text {
2538
font-family: var(--font-family-sansserif);
2639
font-size: var(--font-size-xs, 12px);
2740
font-style: normal;

v2/pink-sb/src/lib/Logs.svelte

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,21 +286,28 @@
286286
color: var(--fgcolor-neutral-primary);
287287
font-family: var(--font-family-code), var(--mono-fallbacks);
288288
font-size: var(--font-size-xs);
289-
white-space: pre;
289+
white-space: pre-wrap;
290+
word-break: break-word;
291+
overflow-wrap: break-word;
290292
line-height: 140%;
291293
letter-spacing: 0;
292294
max-height: 600px;
293295
width: 100%;
294296
overflow-y: scroll;
295-
overflow-x: hidden;
297+
overflow-x: auto;
296298
display: flex;
297299
flex-direction: column;
298300
padding: var(--space-6);
299-
white-space: pre-line;
300301
scroll-behavior: smooth;
301302
height: var(--p-height);
302303
min-height: 10px;
303304
305+
code {
306+
white-space: pre-wrap;
307+
word-break: break-word;
308+
overflow-wrap: break-word;
309+
}
310+
304311
&.full-height {
305312
min-height: 300px;
306313
max-height: none;

v2/pink-sb/src/lib/Popover.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script lang="ts">
22
import { fade } from 'svelte/transition';
3-
import { hasContext, tick } from 'svelte';
43
import { activePopover } from './context.js';
54
import type { Placement } from '@floating-ui/dom';
5+
import { onMount, hasContext, setContext, tick } from 'svelte';
66
import { computePosition, autoUpdate, shift, offset, flip } from '@floating-ui/dom';
77
88
export let portal: boolean = false;
@@ -107,6 +107,10 @@
107107
return { destroy: cleanup };
108108
});
109109
}
110+
111+
setContext('popover-group', true);
112+
113+
onMount(() => autoUpdate(referenceElement, tooltipElement, update));
110114
</script>
111115

112116
<svelte:window on:click={onBlur} on:keydown={onKeyDown} on:resize={update} />

v2/pink-sb/src/lib/Tooltip.svelte

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
<script lang="ts">
2-
import { tick } from 'svelte';
2+
import { tick, hasContext } from 'svelte';
33
import type { Placement } from '@floating-ui/dom';
44
import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';
55
6+
export let portal: boolean = false;
67
export let placement: Placement | undefined = undefined;
78
export let padding: 'none' | 'm' = 'm';
89
export let offsetAmount: number = 6;
910
export let disabled = false;
1011
export let maxWidth = '11.25rem';
12+
export let delay: number = 0;
1113
1214
let show = false;
1315
let showing = false;
14-
const id = 'tooltip-' + Math.random().toString(36).substring(2, 9);
15-
let referenceElement: HTMLSpanElement;
16+
let delayTimeout: ReturnType<typeof setTimeout>;
17+
1618
let tooltipElement: HTMLDivElement;
19+
let referenceElement: HTMLSpanElement;
20+
const id = 'tooltip-' + Math.random().toString(36).substring(2, 9);
21+
22+
const inDialogGroup = hasContext('dialog-group');
1723
1824
async function showTooltip() {
19-
await update();
20-
showing = show = !disabled;
25+
if (disabled) return;
26+
27+
if (delayTimeout) {
28+
clearTimeout(delayTimeout);
29+
}
30+
31+
if (delay > 0) {
32+
delayTimeout = setTimeout(async () => {
33+
await update();
34+
showing = show = true;
35+
}, delay);
36+
} else {
37+
await update();
38+
showing = show = true;
39+
}
2140
}
2241
2342
function hideTooltip() {
43+
if (delayTimeout) {
44+
clearTimeout(delayTimeout);
45+
}
2446
show = false;
2547
}
2648
@@ -43,6 +65,27 @@
4365
});
4466
}
4567
68+
function portalPopover(node: HTMLElement) {
69+
if (!portal && !inDialogGroup) return;
70+
71+
const target = !inDialogGroup
72+
? document.body
73+
: // can be inside a modal/dialog
74+
document.body.querySelector<HTMLDialogElement>('dialog[open]');
75+
76+
if (target) {
77+
target.appendChild(node);
78+
}
79+
80+
return {
81+
destroy() {
82+
if (target && node.parentNode === target) {
83+
target.removeChild(node);
84+
}
85+
}
86+
};
87+
}
88+
4689
function fadeSlide(_: Node, { y = 8, duration = 200 } = {}) {
4790
return {
4891
duration,
@@ -83,6 +126,7 @@
83126
{id}
84127
transition:fadeSlide
85128
use:autoUpdateAction
129+
use:portalPopover
86130
on:transitionend={() => (showing = false)}
87131
bind:this={tooltipElement}
88132
aria-hidden={!show}

v2/pink-sb/src/lib/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ export { default as InlineInput } from './lab/InlineInput.svelte';
5353
export { default as Sonner } from './lab/Sonner.svelte';
5454
export { default as Logs } from './Logs.svelte';
5555
export { default as Spreadsheet } from './spreadsheet/index.js';
56+
export * from './spreadsheet/index.js';

v2/pink-sb/src/lib/input/Select.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
4949
const dispatch = createEventDispatcher();
5050
const inDialogGroup = hasContext('dialog-group');
51+
const inPopoverGroup = hasContext('popover-group');
5152
5253
const {
5354
elements: { trigger, menu, option },
@@ -65,7 +66,7 @@
6566
sameWidth: true
6667
},
6768
preventScroll: false,
68-
portal: inDialogGroup ? 'dialog[open]' : null,
69+
portal: inDialogGroup ? 'dialog[open]' : inPopoverGroup ? 'body' : null,
6970
onSelectedChange(event) {
7071
value = event.next?.value;
7172
dispatch('change', value);
@@ -90,7 +91,7 @@
9091
<button
9192
{...$trigger}
9293
use:trigger
93-
class="input"
94+
class="input selects"
9495
class:disabled
9596
class:readonly
9697
class:placeholder={!selectedLabel}

v2/pink-sb/src/lib/input/Textarea.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<Nullable bind:disabled bind:value />
6565
{/if}
6666
</Layout.Stack>
67+
<slot name="end"></slot>
6768
</div>
6869
</Base>
6970

v2/pink-sb/src/lib/selector/Checkbox.svelte

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
checked = !checked;
2424
}
2525
}
26+
27+
export function blur() {
28+
element.blur();
29+
}
2630
</script>
2731

2832
<Base {label} {id} {description}>

0 commit comments

Comments
 (0)