sheer-ui 0.4.2 → 0.4.3

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 (46) hide show
  1. package/package.json +1 -1
  2. package/src/lib/components/avatar/avatar.svelte.ts +34 -37
  3. package/src/lib/components/avatar/components/avatar-fallback.svelte +9 -6
  4. package/src/lib/components/avatar/components/avatar-image.svelte +18 -9
  5. package/src/lib/components/avatar/components/avatar.svelte +20 -16
  6. package/src/lib/components/checkbox/checkbox.svelte.ts +45 -55
  7. package/src/lib/components/checkbox/components/checkbox-group-label.svelte +9 -6
  8. package/src/lib/components/checkbox/components/checkbox-group.svelte +25 -16
  9. package/src/lib/components/checkbox/components/checkbox.svelte +39 -25
  10. package/src/lib/components/dialog/components/dialog-close.svelte +13 -8
  11. package/src/lib/components/dialog/components/dialog-content-headless.svelte +14 -11
  12. package/src/lib/components/dialog/components/dialog-description.svelte +9 -6
  13. package/src/lib/components/dialog/components/dialog-overlay.svelte +10 -7
  14. package/src/lib/components/dialog/components/dialog-title.svelte +12 -7
  15. package/src/lib/components/dialog/components/dialog-trigger.svelte +12 -7
  16. package/src/lib/components/dialog/components/dialog.svelte +10 -4
  17. package/src/lib/components/dialog/components/modal-surface.svelte +11 -8
  18. package/src/lib/components/dialog/dialog.svelte.ts +73 -61
  19. package/src/lib/components/drawer/drawer.svelte +8 -3
  20. package/src/lib/components/link-preview/components/link-preview-content.svelte +15 -8
  21. package/src/lib/components/link-preview/components/link-preview-trigger.svelte +9 -6
  22. package/src/lib/components/link-preview/components/link-preview.svelte +19 -11
  23. package/src/lib/components/link-preview/link-preview.svelte.ts +42 -43
  24. package/src/lib/components/menu/menu.svelte.ts +20 -1
  25. package/src/lib/components/meter/components/meter.svelte +18 -9
  26. package/src/lib/components/meter/meter.svelte.ts +15 -18
  27. package/src/lib/components/popover/components/popover-close.svelte +9 -6
  28. package/src/lib/components/popover/components/popover-content.svelte +12 -7
  29. package/src/lib/components/popover/components/popover-trigger.svelte +21 -10
  30. package/src/lib/components/popover/components/popover.svelte +9 -8
  31. package/src/lib/components/popover/popover.svelte.ts +68 -74
  32. package/src/lib/components/progress/components/progress.svelte +18 -9
  33. package/src/lib/components/progress/progress.svelte.ts +14 -17
  34. package/src/lib/components/separator/components/separator.svelte +15 -8
  35. package/src/lib/components/separator/separator.svelte.ts +12 -15
  36. package/src/lib/components/sidebar/sidebar-mobile-surface.svelte +8 -4
  37. package/src/lib/components/toggle/components/toggle.svelte +19 -14
  38. package/src/lib/components/toggle/toggle.svelte.ts +15 -20
  39. package/src/lib/components/tooltip/components/tooltip-content.svelte +15 -8
  40. package/src/lib/components/tooltip/components/tooltip-provider.svelte +18 -7
  41. package/src/lib/components/tooltip/components/tooltip-trigger.svelte +21 -10
  42. package/src/lib/components/tooltip/components/tooltip.svelte +34 -21
  43. package/src/lib/components/tooltip/tooltip.svelte.ts +96 -99
  44. package/src/lib/internal/escape-layer/use-escape-layer.svelte.ts +13 -29
  45. package/src/lib/internal/group-value.svelte.ts +11 -10
  46. package/src/lib/internal/native-popover.svelte.ts +6 -6
@@ -1,28 +1,21 @@
1
- import {
2
- DOMContext,
3
- boxWith,
4
- type Box,
5
- type Getter,
6
- type ReadableBox,
7
- type ReadableBoxedValues,
8
- type RefAttachment,
9
- } from '../tools/index.js';
1
+ import { DOMContext, type Getter, type RefAttachment } from '../tools/index.js';
10
2
  import { untrack } from 'svelte';
11
3
  import { on } from 'svelte/events';
12
4
  import { createAttachmentKey } from 'svelte/attachments';
13
- import type { EscapeBehaviorType, EscapeLayerImplProps } from './types.js';
5
+ import type { EscapeBehaviorType } from './types.js';
14
6
  import { kbd } from '../kbd.js';
15
7
  import { createLayerStack } from '../layer-stack.js';
16
8
  import { globalSingleton } from '../global-singleton.js';
17
9
 
18
10
  const escapeLayers = globalSingleton('bitsEscapeLayers', () =>
19
- createLayerStack<EscapeLayerState, ReadableBox<EscapeBehaviorType>>(
20
- (box) => box.current === 'close' || box.current === 'ignore',
21
- ),
11
+ createLayerStack<EscapeLayerState, Getter<EscapeBehaviorType>>((behavior) => behavior() === 'close' || behavior() === 'ignore'),
22
12
  );
23
13
 
24
- interface EscapeLayerStateOpts extends ReadableBoxedValues<Required<Omit<EscapeLayerImplProps, 'children' | 'ref'>>> {
25
- ref: Box<HTMLElement | null>;
14
+ interface EscapeLayerStateOpts {
15
+ escapeKeydownBehavior: Getter<EscapeBehaviorType>;
16
+ onEscapeKeydown: Getter<(e: KeyboardEvent) => void>;
17
+ enabled: Getter<boolean>;
18
+ ref: Getter<HTMLElement | null>;
26
19
  }
27
20
 
28
21
  export class EscapeLayerState {
@@ -34,10 +27,10 @@ export class EscapeLayerState {
34
27
 
35
28
  constructor(opts: EscapeLayerStateOpts) {
36
29
  this.opts = opts;
37
- this.domContext = new DOMContext(this.opts.ref);
30
+ this.domContext = new DOMContext(opts.ref);
38
31
 
39
32
  $effect(() => {
40
- if (!opts.enabled.current) return;
33
+ if (!opts.enabled()) return;
41
34
 
42
35
  const unsubEvents = untrack(() => {
43
36
  escapeLayers.register(this, opts.escapeKeydownBehavior);
@@ -55,9 +48,9 @@ export class EscapeLayerState {
55
48
  if (e.key !== kbd.ESCAPE || !escapeLayers.isResponsible(this)) return;
56
49
  const clonedEvent = new KeyboardEvent(e.type, e);
57
50
  e.preventDefault();
58
- const behaviorType = this.opts.escapeKeydownBehavior.current;
51
+ const behaviorType = this.opts.escapeKeydownBehavior();
59
52
  if (behaviorType !== 'close' && behaviorType !== 'defer-otherwise-close') return;
60
- this.opts.onEscapeKeydown.current(clonedEvent);
53
+ this.opts.onEscapeKeydown()(clonedEvent);
61
54
  };
62
55
  }
63
56
 
@@ -76,16 +69,7 @@ export function escapeKeydownAttachment(opts: {
76
69
  }): RefAttachment<HTMLElement> {
77
70
  return {
78
71
  [createAttachmentKey()]: (node) => {
79
- EscapeLayerState.create({
80
- escapeKeydownBehavior: boxWith(opts.escapeKeydownBehavior),
81
- onEscapeKeydown: boxWith(opts.onEscapeKeydown),
82
- enabled: boxWith(opts.enabled),
83
- // The state only reads the ref (to resolve the owner document), so a no-op setter is fine.
84
- ref: boxWith(
85
- () => node,
86
- () => {},
87
- ),
88
- });
72
+ EscapeLayerState.create({ ...opts, ref: () => node });
89
73
  },
90
74
  };
91
75
  }
@@ -1,13 +1,14 @@
1
1
  import { untrack } from 'svelte';
2
- import type { ReadableBox, WritableBox } from './tools/index.js';
3
2
 
3
+ /** The group's bindable value, as an accessor on the group's options. */
4
4
  interface GroupValue {
5
- opts: { value: WritableBox<string[]> };
5
+ value: string[];
6
6
  }
7
7
 
8
+ /** The item's `value` and `checked` as accessors over its props. */
8
9
  interface GroupItem {
9
- value: ReadableBox<string | undefined>;
10
- checked: WritableBox<boolean>;
10
+ readonly value: string | undefined;
11
+ readonly checked: boolean;
11
12
  }
12
13
 
13
14
  /**
@@ -20,17 +21,17 @@ export function joinGroup(group: GroupValue | null, item: GroupItem): () => bool
20
21
  if (!group) return () => undefined;
21
22
 
22
23
  $effect(() => {
23
- const checked = item.checked.current;
24
+ const checked = item.checked;
24
25
  untrack(() => {
25
- const value = item.value.current;
26
- const values = group.opts.value.current;
26
+ const value = item.value;
27
+ const values = group.value;
27
28
  if (!value || checked === values.includes(value)) return;
28
- group.opts.value.current = checked ? [...values, value] : values.filter((v) => v !== value);
29
+ group.value = checked ? [...values, value] : values.filter((v) => v !== value);
29
30
  });
30
31
  });
31
32
 
32
33
  return () => {
33
- const value = item.value.current;
34
- return value ? group.opts.value.current.includes(value) : undefined;
34
+ const value = item.value;
35
+ return value ? group.value.includes(value) : undefined;
35
36
  };
36
37
  }
@@ -18,13 +18,13 @@ type NativePopoverAnchor = HTMLElement | string | null | undefined | object;
18
18
  interface NativePopoverContentState {
19
19
  readonly root: {
20
20
  readonly opts: {
21
- readonly open: { readonly current: boolean };
22
- readonly onOpenChangeComplete: { readonly current: (open: boolean) => void };
21
+ readonly open: boolean;
22
+ readonly onOpenChangeComplete: (open: boolean) => void;
23
23
  };
24
24
  readonly triggerNode: HTMLElement | null;
25
25
  };
26
26
  readonly opts: {
27
- readonly ref: { readonly current: HTMLElement | null };
27
+ readonly ref: HTMLElement | null;
28
28
  };
29
29
  onEscapeKeydown?: (event: KeyboardEvent) => void;
30
30
  onInteractOutside?: (event: PointerEvent) => void;
@@ -60,8 +60,8 @@ export function useNativePopoverLifecycle(
60
60
  options: { anchor?: Getter<NativePopoverAnchor>; mode?: 'auto' | 'manual' } = {},
61
61
  ) {
62
62
  const mode = options.mode ?? 'manual';
63
- const ref = () => state.opts.ref.current;
64
- const open = () => state.root.opts.open.current;
63
+ const ref = () => state.opts.ref;
64
+ const open = () => state.root.opts.open;
65
65
 
66
66
  // The surface's own animations gate the deferred hide; a long-running descendant
67
67
  // animation (a chart entry inside a popover) must not hold the top layer.
@@ -131,7 +131,7 @@ export function useNativePopoverLifecycle(
131
131
  });
132
132
  });
133
133
 
134
- useOpenChangeComplete(open, ref, (isOpen) => state.root.opts.onOpenChangeComplete.current(isOpen));
134
+ useOpenChangeComplete(open, ref, (isOpen) => state.root.opts.onOpenChangeComplete(isOpen));
135
135
 
136
136
  if (mode === 'auto') {
137
137
  // The UA closes the popover itself (light dismiss, Escape, another auto popover opening);