svelte-ag 1.0.34 → 1.0.36

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 (43) hide show
  1. package/dist/lib/api/query/query.svelte.d.ts.map +1 -1
  2. package/dist/lib/api/query/query.svelte.js +3 -5
  3. package/dist/lib/components/breakpoint-badge/BreakpointBadge.svelte +11 -20
  4. package/dist/lib/components/breakpoint-badge/BreakpointBadge.svelte.d.ts.map +1 -1
  5. package/dist/lib/components/sidebar/context.svelte.d.ts +12 -10
  6. package/dist/lib/components/sidebar/context.svelte.d.ts.map +1 -1
  7. package/dist/lib/components/sidebar/context.svelte.js +14 -12
  8. package/dist/lib/components/sidebar/sidebar-content.svelte +1 -1
  9. package/dist/lib/components/sidebar/sidebar-group-action.svelte +1 -1
  10. package/dist/lib/components/sidebar/sidebar-group-label.svelte +4 -1
  11. package/dist/lib/components/sidebar/sidebar-group-label.svelte.d.ts.map +1 -1
  12. package/dist/lib/components/sidebar/sidebar-inset.svelte +1 -1
  13. package/dist/lib/components/sidebar/sidebar-menu-action.svelte +2 -2
  14. package/dist/lib/components/sidebar/sidebar-menu-badge.svelte +1 -1
  15. package/dist/lib/components/sidebar/sidebar-menu-button.svelte +6 -5
  16. package/dist/lib/components/sidebar/sidebar-menu-button.svelte.d.ts.map +1 -1
  17. package/dist/lib/components/sidebar/sidebar-menu-sub-button.svelte +1 -1
  18. package/dist/lib/components/sidebar/sidebar-menu-sub.svelte +1 -1
  19. package/dist/lib/components/sidebar/sidebar-provider.svelte +17 -6
  20. package/dist/lib/components/sidebar/sidebar-provider.svelte.d.ts.map +1 -1
  21. package/dist/lib/components/sidebar/sidebar-rail.svelte +3 -3
  22. package/dist/lib/components/sidebar/sidebar-trigger.svelte +1 -0
  23. package/dist/lib/components/sidebar/sidebar-trigger.svelte.d.ts.map +1 -1
  24. package/dist/lib/components/sidebar/sidebar.svelte +22 -11
  25. package/dist/lib/components/sidebar/sidebar.svelte.d.ts +2 -0
  26. package/dist/lib/components/sidebar/sidebar.svelte.d.ts.map +1 -1
  27. package/package.json +6 -6
  28. package/src/lib/api/query/query.svelte.ts +3 -5
  29. package/src/lib/components/breakpoint-badge/BreakpointBadge.svelte +11 -20
  30. package/src/lib/components/sidebar/context.svelte.ts +15 -16
  31. package/src/lib/components/sidebar/sidebar-content.svelte +1 -1
  32. package/src/lib/components/sidebar/sidebar-group-action.svelte +1 -1
  33. package/src/lib/components/sidebar/sidebar-group-label.svelte +4 -1
  34. package/src/lib/components/sidebar/sidebar-inset.svelte +1 -1
  35. package/src/lib/components/sidebar/sidebar-menu-action.svelte +2 -2
  36. package/src/lib/components/sidebar/sidebar-menu-badge.svelte +1 -1
  37. package/src/lib/components/sidebar/sidebar-menu-button.svelte +6 -5
  38. package/src/lib/components/sidebar/sidebar-menu-sub-button.svelte +1 -1
  39. package/src/lib/components/sidebar/sidebar-menu-sub.svelte +1 -1
  40. package/src/lib/components/sidebar/sidebar-provider.svelte +17 -6
  41. package/src/lib/components/sidebar/sidebar-rail.svelte +3 -3
  42. package/src/lib/components/sidebar/sidebar-trigger.svelte +1 -0
  43. package/src/lib/components/sidebar/sidebar.svelte +22 -11
@@ -1 +1 @@
1
- {"version":3,"file":"query.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/query/query.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAInH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAK5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnE,qBAAa,KAAK,CAChB,GAAG,SAAS,YAAY,EACxB,IAAI,SAAS,GAAG,CAAC,MAAM,CAAC,EACxB,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC;;gBAyBzC,EACV,IAAI,EACJ,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EACN,EAAE;QACD,IAAI,EAAE,IAAI,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,CAAC,EAAE;YACL,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1C,CAAC;KACH;IAgBK,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IA+BxD,IAAI,QAAQ,WAEX;IACD,IAAI,QAAQ,YAEX;IACD,UAAU;IAMV,IAAI,MAAM,gBAET;IACD,IAAI,IAAI,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAEnD;IACD,IAAI,SAAS,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtD;CACF;AAED,qBAAa,SAAS,CACpB,GAAG,SAAS,YAAY,EACxB,IAAI,SAAS,GAAG,CAAC,MAAM,CAAC,EACxB,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC;;gBA6BnD,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAChC,MAAM,EAAE,KAAK,EACb,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;YAkBlC,KAAK;IAOnB;;;OAGG;YACW,eAAe;IAqBvB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;CAkB3F"}
1
+ {"version":3,"file":"query.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/query/query.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAInH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnE,qBAAa,KAAK,CAChB,GAAG,SAAS,YAAY,EACxB,IAAI,SAAS,GAAG,CAAC,MAAM,CAAC,EACxB,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC;;gBAyBzC,EACV,IAAI,EACJ,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EACN,EAAE;QACD,IAAI,EAAE,IAAI,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,CAAC,EAAE;YACL,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1C,CAAC;KACH;IAgBK,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IA+BxD,IAAI,QAAQ,WAEX;IACD,IAAI,QAAQ,YAEX;IACD,UAAU;IAMV,IAAI,MAAM,gBAET;IACD,IAAI,IAAI,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAEnD;IACD,IAAI,SAAS,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtD;CACF;AAED,qBAAa,SAAS,CACpB,GAAG,SAAS,YAAY,EACxB,IAAI,SAAS,GAAG,CAAC,MAAM,CAAC,EACxB,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,QAAQ,CAAC;;gBA6BnD,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAChC,MAAM,EAAE,KAAK,EACb,YAAY,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;YAkBlC,KAAK;IAOnB;;;OAGG;YACW,eAAe;IAqBvB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;CAkB3F"}
@@ -1,7 +1,5 @@
1
1
  import { stringify } from 'devalue';
2
2
  import Bottleneck from 'bottleneck';
3
- import * as env from '$env/static/public';
4
- import { sleep } from 'radash';
5
3
  import { cacheKey } from './utils.svelte.js';
6
4
  export class Query {
7
5
  // -------- Constants --------
@@ -111,9 +109,9 @@ export class Requestor {
111
109
  }
112
110
  // Makes the actual call to the api
113
111
  async fetch(input) {
114
- if ('PUBLIC_ENVIRONMENT' in env && env.PUBLIC_ENVIRONMENT === 'development') {
115
- await sleep(1000);
116
- }
112
+ // if ('PUBLIC_ENVIRONMENT' in env && env.PUBLIC_ENVIRONMENT === 'development') {
113
+ // await sleep(1000);
114
+ // }
117
115
  return await this.#limiter.schedule(() => this.#request(this.#path, this.#method, input));
118
116
  }
119
117
  /**
@@ -11,78 +11,69 @@
11
11
  bgClass: 'bg-red-100',
12
12
  borderClass: 'border-red-300',
13
13
  textClass: 'text-red-600',
14
- hideClass: 'sm:hidden',
15
- rounded: 'rounded-md'
14
+ hideClass: 'sm:hidden'
16
15
  },
17
16
  {
18
17
  name: 'sm',
19
18
  bgClass: 'bg-blue-100',
20
19
  borderClass: 'border-blue-300',
21
20
  textClass: 'text-blue-600',
22
- hideClass: 'hidden sm:block md:hidden',
23
- rounded: 'rounded-md'
21
+ hideClass: 'hidden sm:block md:hidden'
24
22
  },
25
23
  {
26
24
  name: 'md',
27
25
  bgClass: 'bg-purple-100',
28
26
  borderClass: 'border-purple-300',
29
27
  textClass: 'text-purple-600',
30
- hideClass: 'hidden md:block lg:hidden',
31
- rounded: 'rounded-md'
28
+ hideClass: 'hidden md:block lg:hidden'
32
29
  },
33
30
  {
34
31
  name: 'lg',
35
32
  bgClass: 'bg-green-100',
36
33
  borderClass: 'border-green-300',
37
34
  textClass: 'text-green-800',
38
- hideClass: 'hidden lg:block xl:hidden',
39
- rounded: 'rounded-md'
35
+ hideClass: 'hidden lg:block xl:hidden'
40
36
  },
41
37
  {
42
38
  name: 'xl',
43
39
  bgClass: 'bg-orange-100',
44
40
  borderClass: 'border-orange-300',
45
41
  textClass: 'text-orange-600',
46
- hideClass: 'hidden xl:block 2xl:hidden',
47
- rounded: 'rounded-md'
42
+ hideClass: 'hidden xl:block 2xl:hidden'
48
43
  },
49
44
  {
50
45
  name: '2xl',
51
46
  bgClass: 'bg-yellow-100',
52
47
  borderClass: 'border-yellow-300',
53
48
  textClass: 'text-yellow-600',
54
- hideClass: 'hidden 2xl:block 3xl:hidden',
55
- rounded: 'rounded-md'
49
+ hideClass: 'hidden 2xl:block 3xl:hidden'
56
50
  },
57
51
  {
58
52
  name: '3xl',
59
53
  bgClass: 'bg-blue-100',
60
54
  borderClass: 'border-blue-300',
61
55
  textClass: 'text-blue-600',
62
- hideClass: 'hidden 3xl:block 4xl:hidden',
63
- rounded: 'rounded-md'
56
+ hideClass: 'hidden 3xl:block 4xl:hidden'
64
57
  },
65
58
  {
66
59
  name: '4xl',
67
60
  bgClass: 'bg-red-100',
68
61
  borderClass: 'border-red-300',
69
62
  textClass: 'text-red-600',
70
- hideClass: 'hidden 4xl:block 5xl:hidden',
71
- rounded: 'rounded-md'
63
+ hideClass: 'hidden 4xl:block 5xl:hidden'
72
64
  }
73
65
  ];
74
66
  </script>
75
67
 
76
68
  {#if dev}
77
- <div class="w-fit">
69
+ <div class="w-fit" data-testid="breakpoint-badge">
78
70
  {#each breakpoints as bp (bp.name)}
79
71
  <div
80
- class="{bp.rounded}
72
+ class="
73
+ rounded-md border px-2 text-xs font-bold
81
74
  {bp.bgClass}
82
75
  {bp.hideClass}
83
- border
84
76
  {bp.borderClass}
85
- px-2 text-xs font-bold
86
77
  {bp.textClass}"
87
78
  >
88
79
  {bp.name}
@@ -1 +1 @@
1
- {"version":3,"file":"BreakpointBadge.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/breakpoint-badge/BreakpointBadge.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,0BAA0B,GAAG;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AA6F5D,QAAA,MAAM,eAAe,gEAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"BreakpointBadge.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/breakpoint-badge/BreakpointBadge.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,MAAM,0BAA0B,GAAG;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAoF5D,QAAA,MAAM,eAAe,gEAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -1,11 +1,11 @@
1
- type Getter<T> = () => T;
1
+ import type { WritableBox } from 'svelte-toolbelt';
2
2
  export type SidebarStateProps = {
3
3
  /**
4
4
  * A getter function that returns the current open state of the sidebar.
5
5
  * We use a getter function here to support `bind:open` on the `Sidebar.Provider`
6
6
  * component.
7
7
  */
8
- open: Getter<{
8
+ open: WritableBox<{
9
9
  left: boolean;
10
10
  right: boolean;
11
11
  }>;
@@ -19,21 +19,23 @@ export type SidebarStateProps = {
19
19
  declare class SidebarState {
20
20
  #private;
21
21
  readonly props: SidebarStateProps;
22
- open: {
22
+ openMobile: {
23
23
  left: boolean;
24
24
  right: boolean;
25
25
  };
26
- openMobile: boolean;
27
26
  setOpen: SidebarStateProps['setOpen'];
28
- state: {
29
- left: string;
30
- right: string;
31
- };
32
27
  constructor(props: SidebarStateProps);
28
+ get open(): {
29
+ left: boolean;
30
+ right: boolean;
31
+ };
32
+ set open(v: {
33
+ left: boolean;
34
+ right: boolean;
35
+ });
33
36
  get isMobile(): boolean;
34
37
  handleShortcutKeydown: (e: KeyboardEvent) => void;
35
- setOpenMobile: (value: boolean) => void;
36
- toggle: (side?: "left" | "right") => boolean | void;
38
+ toggle: (side?: "left" | "right") => void;
37
39
  }
38
40
  /**
39
41
  * Instantiates a new `SidebarState` instance and sets it in the context.
@@ -1 +1 @@
1
- {"version":3,"file":"context.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/context.svelte.ts"],"names":[],"mappings":"AAIA,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAEzB,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAEhD;;;;OAIG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,cAAM,YAAY;;IAChB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,IAAI;cAZiB,OAAO;eAAS,OAAO;MAYA;IAC5C,UAAU,UAAiB;IAC3B,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEtC,KAAK;;;MAKF;gBAES,KAAK,EAAE,iBAAiB;IAQpC,IAAI,QAAQ,YAEX;IAGD,qBAAqB,GAAI,GAAG,aAAa,UAKvC;IAEF,aAAa,GAAI,OAAO,OAAO,UAE7B;IAEF,MAAM,GAAI,OAAM,MAAM,GAAG,OAAgB,oBAEvC;CACH;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAEzC"}
1
+ {"version":3,"file":"context.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/context.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;OAIG;IACH,IAAI,EAAE,WAAW,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAErD;;;;OAIG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,cAAM,YAAY;;IAChB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAGlC,UAAU;;;MAAyC;IACnD,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAG1B,KAAK,EAAE,iBAAiB;IAOpC,IAAI,IAAI;cAzBkB,OAAO;eAAS,OAAO;MA2BhD;IACD,IAAI,IAAI,CAAC,CAAC;cA5BgB,OAAO;eAAS,OAAO;KA4BvC,EAET;IAID,IAAI,QAAQ,YAEX;IAGD,qBAAqB,GAAI,GAAG,aAAa,UAKvC;IAEF,MAAM,GAAI,OAAM,MAAM,GAAG,OAAgB,UAGvC;CACH;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAEzC"}
@@ -3,21 +3,23 @@ import { getContext, setContext } from 'svelte';
3
3
  import { SIDEBAR_KEYBOARD_SHORTCUT } from './constants.js';
4
4
  class SidebarState {
5
5
  props;
6
- open = $derived.by(() => this.props.open());
7
- openMobile = $state(false);
6
+ // open = $derived.by(() => this.props.open.current);
7
+ #open;
8
+ openMobile = $state({ left: false, right: false });
8
9
  setOpen;
9
10
  #isMobile;
10
- state = $derived.by(() => {
11
- return {
12
- left: this.open.left ? 'expanded' : 'collapsed',
13
- right: this.open.right ? 'expanded' : 'collapsed'
14
- };
15
- });
16
11
  constructor(props) {
17
12
  this.setOpen = props.setOpen;
18
13
  this.#isMobile = new IsMobile();
14
+ this.#open = props.open;
19
15
  this.props = props;
20
16
  }
17
+ get open() {
18
+ return this.props.open.current;
19
+ }
20
+ set open(v) {
21
+ this.#open.current = v;
22
+ }
21
23
  // Convenience getter for checking if the sidebar is mobile
22
24
  // without this, we would need to use `sidebar.isMobile.current` everywhere
23
25
  get isMobile() {
@@ -30,11 +32,11 @@ class SidebarState {
30
32
  this.toggle();
31
33
  }
32
34
  };
33
- setOpenMobile = (value) => {
34
- this.openMobile = value;
35
- };
36
35
  toggle = (side = 'left') => {
37
- return this.#isMobile.current ? (this.openMobile = !this.openMobile) : this.setOpen(!this.open[side], side);
36
+ if (this.#isMobile.current)
37
+ return this.setOpen(!this.openMobile[side], side);
38
+ else
39
+ return this.setOpen(!this.open[side], side);
38
40
  };
39
41
  }
40
42
  const SYMBOL_KEY = 'scn-sidebar';
@@ -17,7 +17,7 @@
17
17
  class={cn(
18
18
  `
19
19
  flex min-h-0 flex-1 flex-col gap-2 overflow-auto
20
- group-data-[collapsible=icon]:overflow-hidden
20
+ group-data-[collapsible=icon]:group-data-[open=false]:overflow-hidden
21
21
  `,
22
22
  className
23
23
  )}
@@ -28,7 +28,7 @@
28
28
  after:absolute after:-inset-2
29
29
  after:md:hidden
30
30
  `,
31
- 'group-data-[collapsible=icon]:hidden',
31
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
32
32
  className
33
33
  ),
34
34
  'data-sidebar': 'group-action',
@@ -22,7 +22,10 @@
22
22
  focus-visible:ring-2
23
23
  [&>svg]:size-4 [&>svg]:shrink-0
24
24
  `,
25
- 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',
25
+ `
26
+ group-data-[collapsible=icon]:group-data-[open=false]:-mt-8
27
+ group-data-[collapsible=icon]:group-data-[open=false]:opacity-0
28
+ `,
26
29
  className
27
30
  ),
28
31
  'data-sidebar': 'group-label',
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-group-label.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-group-label.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CACvD,CAAC;AAyCJ,QAAA,MAAM,iBAAiB,yDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"sidebar-group-label.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-group-label.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAErD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CACvD,CAAC;AA4CJ,QAAA,MAAM,iBAAiB,yDAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -20,7 +20,7 @@
20
20
  `
21
21
  md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl
22
22
  md:peer-data-[variant=inset]:shadow-sm
23
- md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2
23
+ md:peer-data-[open=false]:peer-data-[variant=inset]:ml-2
24
24
  `,
25
25
  className
26
26
  )}
@@ -34,13 +34,13 @@
34
34
  'peer-data-[size=sm]/menu-button:top-1',
35
35
  'peer-data-[size=default]/menu-button:top-1.5',
36
36
  'peer-data-[size=lg]/menu-button:top-2.5',
37
- 'group-data-[collapsible=icon]:hidden',
37
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
38
38
  showOnHover &&
39
39
  `
40
40
  group-focus-within/menu-item:opacity-100
41
41
  group-hover/menu-item:opacity-100
42
42
  peer-data-[active=true]/menu-button:text-sidebar-accent-foreground
43
- data-[state=open]:opacity-100
43
+ data-[open=true]:opacity-100
44
44
  md:opacity-0
45
45
  `,
46
46
  className
@@ -26,7 +26,7 @@
26
26
  'peer-data-[size=sm]/menu-button:top-1',
27
27
  'peer-data-[size=default]/menu-button:top-1.5',
28
28
  'peer-data-[size=lg]/menu-button:top-2.5',
29
- 'group-data-[collapsible=icon]:hidden',
29
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
30
30
  className
31
31
  )}
32
32
  {...restProps}
@@ -6,7 +6,8 @@
6
6
  peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring
7
7
  transition-[width,height,padding] outline-none
8
8
  group-has-data-[sidebar=menu-action]/menu-item:pr-8
9
- group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2!
9
+ group-data-[collapsible=icon]:group-data-[open=false]:size-8!
10
+ group-data-[collapsible=icon]:group-data-[open=false]:p-2!
10
11
  hover:bg-sidebar-accent hover:text-sidebar-accent-foreground
11
12
  focus-visible:ring-2
12
13
  active:bg-sidebar-accent active:text-sidebar-accent-foreground
@@ -14,7 +15,7 @@
14
15
  aria-disabled:pointer-events-none aria-disabled:opacity-50
15
16
  data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium
16
17
  data-[active=true]:text-sidebar-accent-foreground
17
- data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground
18
+ data-[open=true]:hover:bg-sidebar-accent data-[open=true]:hover:text-sidebar-accent-foreground
18
19
  [&>span:last-child]:truncate
19
20
  [&>svg]:size-4 [&>svg]:shrink-0
20
21
  `),
@@ -32,7 +33,7 @@
32
33
  sm: 'h-7 text-xs',
33
34
  lg: `
34
35
  h-12 text-sm
35
- group-data-[collapsible=icon]:p-0!
36
+ group-data-[collapsible=icon]:group-data-[open=false]:p-0!
36
37
  `
37
38
  }
38
39
  },
@@ -118,7 +119,7 @@
118
119
  <Tooltip.Content
119
120
  side="right"
120
121
  align="center"
121
- hidden={sidebar.state[side] !== 'collapsed' || sidebar.isMobile}
122
+ hidden={sidebar.open[side] === false || sidebar.isMobile}
122
123
  children={tooltipContent}
123
124
  {...tooltipContentProps}
124
125
  />
@@ -140,7 +141,7 @@
140
141
  <Tooltip.Content
141
142
  side="right"
142
143
  align="center"
143
- hidden={sidebar.state[side] !== 'collapsed' || sidebar.isMobile}
144
+ hidden={sidebar.open[side] === false || sidebar.isMobile}
144
145
  children={tooltipContent}
145
146
  {...tooltipContentProps}
146
147
  />
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-menu-button.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-menu-button.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAuCpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC,SAAS,CAAC,CAAC;AACjG,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAG7F,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,GAAG;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACvF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CACvD,CAAC;AAuFJ,QAAA,MAAM,iBAAiB,uEAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"sidebar-menu-button.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-menu-button.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAwCpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC,SAAS,CAAC,CAAC;AACjG,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAG7F,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,GAAG;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACvF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CACvD,CAAC;AAuFJ,QAAA,MAAM,iBAAiB,uEAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -34,7 +34,7 @@
34
34
  'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',
35
35
  size === 'sm' && 'text-xs',
36
36
  size === 'md' && 'text-sm',
37
- 'group-data-[collapsible=icon]:hidden',
37
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
38
38
  className
39
39
  ),
40
40
  'data-sidebar': 'menu-sub-button',
@@ -16,7 +16,7 @@
16
16
  data-sidebar="menu-sub"
17
17
  class={cn(
18
18
  'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',
19
- 'group-data-[collapsible=icon]:hidden',
19
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
20
20
  className
21
21
  )}
22
22
  {...restProps}
@@ -5,6 +5,8 @@
5
5
  import type { HTMLAttributes } from 'svelte/elements';
6
6
  import { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON } from './constants.js';
7
7
  import { setSidebar } from './context.svelte.js';
8
+ import { browser } from '$app/environment';
9
+ import { box } from 'svelte-toolbelt';
8
10
 
9
11
  let {
10
12
  ref = $bindable(null),
@@ -12,7 +14,7 @@
12
14
  left: true,
13
15
  right: true
14
16
  }),
15
- onOpenChange = () => {},
17
+ onOpenChange,
16
18
  class: className,
17
19
  style,
18
20
  children,
@@ -26,13 +28,22 @@
26
28
  } = $props();
27
29
 
28
30
  const sidebar = setSidebar({
29
- open: () => open,
31
+ open: box.with(
32
+ () => open,
33
+ (v) => (open = v)
34
+ ),
30
35
  setOpen: (value: boolean, side: 'left' | 'right' = 'left') => {
31
- open[side] = value;
32
- onOpenChange(value, side);
36
+ if (sidebar.isMobile) {
37
+ sidebar.openMobile[side] = value;
38
+ } else {
39
+ open[side] = value;
40
+ }
41
+ onOpenChange?.(value, side);
33
42
 
34
- // This sets the cookie to keep the sidebar state.
35
- document.cookie = `${SIDEBAR_COOKIE_NAME}-${side}=${open[side]}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
43
+ if (browser) {
44
+ // This sets the cookie to keep the sidebar state.
45
+ document.cookie = `${SIDEBAR_COOKIE_NAME}-${side}=${open[side]}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
46
+ }
36
47
  }
37
48
  });
38
49
  </script>
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-provider.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-provider.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG;IACvE,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CAChE,CAAC;AAkDJ,QAAA,MAAM,eAAe,kEAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"sidebar-provider.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-provider.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG;IACvE,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CAChE,CAAC;AA6DJ,QAAA,MAAM,eAAe,kEAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -42,9 +42,9 @@
42
42
  [[data-side=right][data-state=collapsed]_&]:cursor-w-resize
43
43
  `,
44
44
  `
45
- group-data-[collapsible=offcanvas]:translate-x-0
46
- group-data-[collapsible=offcanvas]:after:left-full
47
- group-data-[collapsible=offcanvas]:hover:bg-sidebar
45
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:translate-x-0
46
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:after:left-full
47
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:hover:bg-sidebar
48
48
  `,
49
49
  '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',
50
50
  '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',
@@ -22,6 +22,7 @@
22
22
  type="button"
23
23
  onclick={(e) => {
24
24
  onclick?.(e);
25
+ console.log('TOggling', side);
25
26
  sidebar.toggle(side);
26
27
  }}
27
28
  data-sidebar="trigger"
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-trigger.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-trigger.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG5C,KAAK,gBAAgB,GAAI,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACtD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,CAAC;AA4BJ,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"sidebar-trigger.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar-trigger.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG5C,KAAK,gBAAgB,GAAI,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACtD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,CAAC;AA6BJ,QAAA,MAAM,cAAc,yDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -9,18 +9,25 @@
9
9
  let {
10
10
  ref = $bindable(null),
11
11
  side = 'left',
12
+ sideMobile,
12
13
  variant = 'sidebar',
13
14
  collapsible = 'offcanvas',
15
+ open,
14
16
  class: className,
15
17
  children,
16
18
  ...restProps
17
19
  }: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
18
20
  side?: 'left' | 'right';
21
+ sideMobile?: 'left' | 'right' | 'top' | 'bottom';
19
22
  variant?: 'sidebar' | 'floating' | 'inset';
20
23
  collapsible?: 'offcanvas' | 'icon' | 'none';
24
+ open?: boolean;
21
25
  } = $props();
22
26
 
23
27
  const sidebar = useSidebar();
28
+
29
+ // svelte-ignore state_referenced_locally
30
+ if (open !== undefined) sidebar.setOpen(open, side);
24
31
  </script>
25
32
 
26
33
  {#if collapsible === 'none'}
@@ -40,16 +47,20 @@
40
47
  {@render children?.()}
41
48
  </div>
42
49
  {:else if sidebar.isMobile}
43
- <Sheet.Root bind:open={() => sidebar.openMobile, (v) => sidebar.setOpenMobile(v)} {...restProps}>
50
+ <Sheet.Root bind:open={() => sidebar.openMobile[side], (v) => sidebar.setOpen(v, side)} {...restProps}>
44
51
  <Sheet.Content
45
52
  data-sidebar="sidebar"
46
53
  data-mobile="true"
47
- class="
48
- w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground
49
- [&>button]:hidden
50
- "
54
+ class={cn(
55
+ `
56
+ bg-sidebar p-0 text-sidebar-foreground
57
+ [&>button]:hidden
58
+ `,
59
+ sideMobile === 'top' || sideMobile === 'bottom' ? '' : 'w-(--sidebar-width)',
60
+ className
61
+ )}
51
62
  style="--sidebar-width: {SIDEBAR_WIDTH_MOBILE};"
52
- {side}
63
+ side={sideMobile ?? side}
53
64
  >
54
65
  <div class="flex h-full w-full flex-col">
55
66
  {@render children?.()}
@@ -63,7 +74,7 @@
63
74
  `
64
75
  peer relative hidden w-(--sidebar-width) flex-auto grow-0 flex-col overflow-hidden bg-sidebar
65
76
  text-sidebar-foreground transition-[width] duration-200 ease-linear
66
- data-[collapsible=offcanvas]:w-0
77
+ data-[collapsible=offcanvas]:data-[open=false]:w-0
67
78
  data-[variant=floating]:rounded-lg data-[variant=floating]:border data-[variant=floating]:border-sidebar-border
68
79
  data-[variant=floating]:shadow-sm
69
80
  md:flex
@@ -72,10 +83,10 @@
72
83
  variant === 'floating' || variant === 'inset'
73
84
  ? `
74
85
  m-2
75
- data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon))]
86
+ data-[collapsible=icon]:data-[open=false]:w-[calc(var(--sidebar-width-icon))]
76
87
  `
77
88
  : `
78
- data-[collapsible=icon]:w-(--sidebar-width-icon)
89
+ data-[collapsible=icon]:data-[open=false]:w-(--sidebar-width-icon)
79
90
  data-[side=left]:border-r
80
91
  data-[side=right]:border-l
81
92
  `,
@@ -83,8 +94,8 @@
83
94
  className
84
95
  )}
85
96
  data-sidebar="sidebar"
86
- data-state={sidebar.state[side]}
87
- data-collapsible={sidebar.state[side] === 'collapsed' ? collapsible : ''}
97
+ data-open={sidebar.open[side]}
98
+ data-collapsible={collapsible}
88
99
  data-variant={variant}
89
100
  data-side={side}
90
101
  {...restProps}
@@ -2,8 +2,10 @@ import type { WithElementRef } from 'bits-ui';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  type $$ComponentProps = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
4
4
  side?: 'left' | 'right';
5
+ sideMobile?: 'left' | 'right' | 'top' | 'bottom';
5
6
  variant?: 'sidebar' | 'floating' | 'inset';
6
7
  collapsible?: 'offcanvas' | 'icon' | 'none';
8
+ open?: boolean;
7
9
  };
8
10
  declare const Sidebar: import("svelte").Component<$$ComponentProps, {}, "ref">;
9
11
  type Sidebar = ReturnType<typeof Sidebar>;
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;CAC7C,CAAC;AA4EJ,QAAA,MAAM,OAAO,yDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"sidebar.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/sidebar.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIrD,KAAK,gBAAgB,GAAI,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG;IACvE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACjD,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAqFJ,QAAA,MAAM,OAAO,yDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-ag",
3
- "version": "1.0.34",
3
+ "version": "1.0.36",
4
4
  "description": "Useful svelte components",
5
5
  "bugs": "https://github.com/ageorgeh/svelte-ag/issues",
6
6
  "repository": {
@@ -60,13 +60,13 @@
60
60
  "sveltekit-superforms": "2.30.0",
61
61
  "tailwind-merge": "^3.5.0",
62
62
  "tailwind-variants": "^3.2.2",
63
- "ts-ag": "^1.0.19",
63
+ "ts-ag": "^1.0.23",
64
64
  "valibot": "^1.2.0"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@actions/languageserver": "^0.3.46",
68
68
  "@eslint/js": "^10.0.1",
69
- "@iconify/json": "^2.2.443",
69
+ "@iconify/json": "^2.2.444",
70
70
  "@iconify/tailwind4": "^1.2.1",
71
71
  "@iconify/types": "^2.0.0",
72
72
  "@internationalized/date": "^3.11.0",
@@ -77,14 +77,14 @@
77
77
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
78
78
  "@tailwindcss/typography": "^0.5.19",
79
79
  "@tailwindcss/vite": "^4.2.1",
80
- "@types/node": "^24.10.15",
81
- "@typescript/native-preview": "7.0.0-dev.20260227.1",
80
+ "@types/node": "^24.11.0",
81
+ "@typescript/native-preview": "7.0.0-dev.20260228.1",
82
82
  "eslint": "^10.0.2",
83
83
  "eslint-plugin-better-tailwindcss": "^4.3.1",
84
84
  "eslint-plugin-svelte": "^3.15.0",
85
85
  "globals": "^17.3.0",
86
86
  "husky": "^9.1.7",
87
- "lint-staged": "^16.2.7",
87
+ "lint-staged": "^16.3.0",
88
88
  "prettier": "^3.8.1",
89
89
  "prettier-plugin-packagejson": "^3.0.0",
90
90
  "prettier-plugin-svelte": "^3.5.0",
@@ -4,8 +4,6 @@ import { stringify } from 'devalue';
4
4
  import Bottleneck from 'bottleneck';
5
5
  import type { Cache } from './cache.svelte';
6
6
 
7
- import * as env from '$env/static/public';
8
- import { sleep } from 'radash';
9
7
  import { cacheKey } from './utils.svelte.js';
10
8
  import type { BatchDetails } from './entrypoint.svelte';
11
9
 
@@ -179,9 +177,9 @@ export class Requestor<
179
177
 
180
178
  // Makes the actual call to the api
181
179
  private async fetch(input: ApiInput<API, Path, Method>): Promise<ApiResponse<API, Path, Method>> {
182
- if ('PUBLIC_ENVIRONMENT' in env && env.PUBLIC_ENVIRONMENT === 'development') {
183
- await sleep(1000);
184
- }
180
+ // if ('PUBLIC_ENVIRONMENT' in env && env.PUBLIC_ENVIRONMENT === 'development') {
181
+ // await sleep(1000);
182
+ // }
185
183
  return await this.#limiter.schedule(() => this.#request(this.#path, this.#method, input));
186
184
  }
187
185
 
@@ -11,78 +11,69 @@
11
11
  bgClass: 'bg-red-100',
12
12
  borderClass: 'border-red-300',
13
13
  textClass: 'text-red-600',
14
- hideClass: 'sm:hidden',
15
- rounded: 'rounded-md'
14
+ hideClass: 'sm:hidden'
16
15
  },
17
16
  {
18
17
  name: 'sm',
19
18
  bgClass: 'bg-blue-100',
20
19
  borderClass: 'border-blue-300',
21
20
  textClass: 'text-blue-600',
22
- hideClass: 'hidden sm:block md:hidden',
23
- rounded: 'rounded-md'
21
+ hideClass: 'hidden sm:block md:hidden'
24
22
  },
25
23
  {
26
24
  name: 'md',
27
25
  bgClass: 'bg-purple-100',
28
26
  borderClass: 'border-purple-300',
29
27
  textClass: 'text-purple-600',
30
- hideClass: 'hidden md:block lg:hidden',
31
- rounded: 'rounded-md'
28
+ hideClass: 'hidden md:block lg:hidden'
32
29
  },
33
30
  {
34
31
  name: 'lg',
35
32
  bgClass: 'bg-green-100',
36
33
  borderClass: 'border-green-300',
37
34
  textClass: 'text-green-800',
38
- hideClass: 'hidden lg:block xl:hidden',
39
- rounded: 'rounded-md'
35
+ hideClass: 'hidden lg:block xl:hidden'
40
36
  },
41
37
  {
42
38
  name: 'xl',
43
39
  bgClass: 'bg-orange-100',
44
40
  borderClass: 'border-orange-300',
45
41
  textClass: 'text-orange-600',
46
- hideClass: 'hidden xl:block 2xl:hidden',
47
- rounded: 'rounded-md'
42
+ hideClass: 'hidden xl:block 2xl:hidden'
48
43
  },
49
44
  {
50
45
  name: '2xl',
51
46
  bgClass: 'bg-yellow-100',
52
47
  borderClass: 'border-yellow-300',
53
48
  textClass: 'text-yellow-600',
54
- hideClass: 'hidden 2xl:block 3xl:hidden',
55
- rounded: 'rounded-md'
49
+ hideClass: 'hidden 2xl:block 3xl:hidden'
56
50
  },
57
51
  {
58
52
  name: '3xl',
59
53
  bgClass: 'bg-blue-100',
60
54
  borderClass: 'border-blue-300',
61
55
  textClass: 'text-blue-600',
62
- hideClass: 'hidden 3xl:block 4xl:hidden',
63
- rounded: 'rounded-md'
56
+ hideClass: 'hidden 3xl:block 4xl:hidden'
64
57
  },
65
58
  {
66
59
  name: '4xl',
67
60
  bgClass: 'bg-red-100',
68
61
  borderClass: 'border-red-300',
69
62
  textClass: 'text-red-600',
70
- hideClass: 'hidden 4xl:block 5xl:hidden',
71
- rounded: 'rounded-md'
63
+ hideClass: 'hidden 4xl:block 5xl:hidden'
72
64
  }
73
65
  ];
74
66
  </script>
75
67
 
76
68
  {#if dev}
77
- <div class="w-fit">
69
+ <div class="w-fit" data-testid="breakpoint-badge">
78
70
  {#each breakpoints as bp (bp.name)}
79
71
  <div
80
- class="{bp.rounded}
72
+ class="
73
+ rounded-md border px-2 text-xs font-bold
81
74
  {bp.bgClass}
82
75
  {bp.hideClass}
83
- border
84
76
  {bp.borderClass}
85
- px-2 text-xs font-bold
86
77
  {bp.textClass}"
87
78
  >
88
79
  {bp.name}
@@ -1,8 +1,7 @@
1
1
  import { IsMobile } from '$shadcn/hooks/is-mobile.svelte.js';
2
2
  import { getContext, setContext } from 'svelte';
3
3
  import { SIDEBAR_KEYBOARD_SHORTCUT } from './constants.js';
4
-
5
- type Getter<T> = () => T;
4
+ import type { WritableBox } from 'svelte-toolbelt';
6
5
 
7
6
  export type SidebarStateProps = {
8
7
  /**
@@ -10,7 +9,7 @@ export type SidebarStateProps = {
10
9
  * We use a getter function here to support `bind:open` on the `Sidebar.Provider`
11
10
  * component.
12
11
  */
13
- open: Getter<{ left: boolean; right: boolean }>;
12
+ open: WritableBox<{ left: boolean; right: boolean }>;
14
13
 
15
14
  /**
16
15
  * A function that sets the open state of the sidebar. To support `bind:open`, we need
@@ -22,23 +21,26 @@ export type SidebarStateProps = {
22
21
 
23
22
  class SidebarState {
24
23
  readonly props: SidebarStateProps;
25
- open = $derived.by(() => this.props.open());
26
- openMobile = $state(false);
24
+ // open = $derived.by(() => this.props.open.current);
25
+ #open: WritableBox<{ left: boolean; right: boolean }>;
26
+ openMobile = $state({ left: false, right: false });
27
27
  setOpen: SidebarStateProps['setOpen'];
28
28
  #isMobile: IsMobile;
29
- state = $derived.by(() => {
30
- return {
31
- left: this.open.left ? 'expanded' : 'collapsed',
32
- right: this.open.right ? 'expanded' : 'collapsed'
33
- };
34
- });
35
29
 
36
30
  constructor(props: SidebarStateProps) {
37
31
  this.setOpen = props.setOpen;
38
32
  this.#isMobile = new IsMobile();
33
+ this.#open = props.open;
39
34
  this.props = props;
40
35
  }
41
36
 
37
+ get open() {
38
+ return this.props.open.current;
39
+ }
40
+ set open(v) {
41
+ this.#open.current = v;
42
+ }
43
+
42
44
  // Convenience getter for checking if the sidebar is mobile
43
45
  // without this, we would need to use `sidebar.isMobile.current` everywhere
44
46
  get isMobile() {
@@ -53,12 +55,9 @@ class SidebarState {
53
55
  }
54
56
  };
55
57
 
56
- setOpenMobile = (value: boolean) => {
57
- this.openMobile = value;
58
- };
59
-
60
58
  toggle = (side: 'left' | 'right' = 'left') => {
61
- return this.#isMobile.current ? (this.openMobile = !this.openMobile) : this.setOpen(!this.open[side], side);
59
+ if (this.#isMobile.current) return this.setOpen(!this.openMobile[side], side);
60
+ else return this.setOpen(!this.open[side], side);
62
61
  };
63
62
  }
64
63
 
@@ -17,7 +17,7 @@
17
17
  class={cn(
18
18
  `
19
19
  flex min-h-0 flex-1 flex-col gap-2 overflow-auto
20
- group-data-[collapsible=icon]:overflow-hidden
20
+ group-data-[collapsible=icon]:group-data-[open=false]:overflow-hidden
21
21
  `,
22
22
  className
23
23
  )}
@@ -28,7 +28,7 @@
28
28
  after:absolute after:-inset-2
29
29
  after:md:hidden
30
30
  `,
31
- 'group-data-[collapsible=icon]:hidden',
31
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
32
32
  className
33
33
  ),
34
34
  'data-sidebar': 'group-action',
@@ -22,7 +22,10 @@
22
22
  focus-visible:ring-2
23
23
  [&>svg]:size-4 [&>svg]:shrink-0
24
24
  `,
25
- 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',
25
+ `
26
+ group-data-[collapsible=icon]:group-data-[open=false]:-mt-8
27
+ group-data-[collapsible=icon]:group-data-[open=false]:opacity-0
28
+ `,
26
29
  className
27
30
  ),
28
31
  'data-sidebar': 'group-label',
@@ -20,7 +20,7 @@
20
20
  `
21
21
  md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl
22
22
  md:peer-data-[variant=inset]:shadow-sm
23
- md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2
23
+ md:peer-data-[open=false]:peer-data-[variant=inset]:ml-2
24
24
  `,
25
25
  className
26
26
  )}
@@ -34,13 +34,13 @@
34
34
  'peer-data-[size=sm]/menu-button:top-1',
35
35
  'peer-data-[size=default]/menu-button:top-1.5',
36
36
  'peer-data-[size=lg]/menu-button:top-2.5',
37
- 'group-data-[collapsible=icon]:hidden',
37
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
38
38
  showOnHover &&
39
39
  `
40
40
  group-focus-within/menu-item:opacity-100
41
41
  group-hover/menu-item:opacity-100
42
42
  peer-data-[active=true]/menu-button:text-sidebar-accent-foreground
43
- data-[state=open]:opacity-100
43
+ data-[open=true]:opacity-100
44
44
  md:opacity-0
45
45
  `,
46
46
  className
@@ -26,7 +26,7 @@
26
26
  'peer-data-[size=sm]/menu-button:top-1',
27
27
  'peer-data-[size=default]/menu-button:top-1.5',
28
28
  'peer-data-[size=lg]/menu-button:top-2.5',
29
- 'group-data-[collapsible=icon]:hidden',
29
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
30
30
  className
31
31
  )}
32
32
  {...restProps}
@@ -6,7 +6,8 @@
6
6
  peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring
7
7
  transition-[width,height,padding] outline-none
8
8
  group-has-data-[sidebar=menu-action]/menu-item:pr-8
9
- group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2!
9
+ group-data-[collapsible=icon]:group-data-[open=false]:size-8!
10
+ group-data-[collapsible=icon]:group-data-[open=false]:p-2!
10
11
  hover:bg-sidebar-accent hover:text-sidebar-accent-foreground
11
12
  focus-visible:ring-2
12
13
  active:bg-sidebar-accent active:text-sidebar-accent-foreground
@@ -14,7 +15,7 @@
14
15
  aria-disabled:pointer-events-none aria-disabled:opacity-50
15
16
  data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium
16
17
  data-[active=true]:text-sidebar-accent-foreground
17
- data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground
18
+ data-[open=true]:hover:bg-sidebar-accent data-[open=true]:hover:text-sidebar-accent-foreground
18
19
  [&>span:last-child]:truncate
19
20
  [&>svg]:size-4 [&>svg]:shrink-0
20
21
  `),
@@ -32,7 +33,7 @@
32
33
  sm: 'h-7 text-xs',
33
34
  lg: `
34
35
  h-12 text-sm
35
- group-data-[collapsible=icon]:p-0!
36
+ group-data-[collapsible=icon]:group-data-[open=false]:p-0!
36
37
  `
37
38
  }
38
39
  },
@@ -118,7 +119,7 @@
118
119
  <Tooltip.Content
119
120
  side="right"
120
121
  align="center"
121
- hidden={sidebar.state[side] !== 'collapsed' || sidebar.isMobile}
122
+ hidden={sidebar.open[side] === false || sidebar.isMobile}
122
123
  children={tooltipContent}
123
124
  {...tooltipContentProps}
124
125
  />
@@ -140,7 +141,7 @@
140
141
  <Tooltip.Content
141
142
  side="right"
142
143
  align="center"
143
- hidden={sidebar.state[side] !== 'collapsed' || sidebar.isMobile}
144
+ hidden={sidebar.open[side] === false || sidebar.isMobile}
144
145
  children={tooltipContent}
145
146
  {...tooltipContentProps}
146
147
  />
@@ -34,7 +34,7 @@
34
34
  'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',
35
35
  size === 'sm' && 'text-xs',
36
36
  size === 'md' && 'text-sm',
37
- 'group-data-[collapsible=icon]:hidden',
37
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
38
38
  className
39
39
  ),
40
40
  'data-sidebar': 'menu-sub-button',
@@ -16,7 +16,7 @@
16
16
  data-sidebar="menu-sub"
17
17
  class={cn(
18
18
  'mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5',
19
- 'group-data-[collapsible=icon]:hidden',
19
+ 'group-data-[collapsible=icon]:group-data-[open=false]:hidden',
20
20
  className
21
21
  )}
22
22
  {...restProps}
@@ -5,6 +5,8 @@
5
5
  import type { HTMLAttributes } from 'svelte/elements';
6
6
  import { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON } from './constants.js';
7
7
  import { setSidebar } from './context.svelte.js';
8
+ import { browser } from '$app/environment';
9
+ import { box } from 'svelte-toolbelt';
8
10
 
9
11
  let {
10
12
  ref = $bindable(null),
@@ -12,7 +14,7 @@
12
14
  left: true,
13
15
  right: true
14
16
  }),
15
- onOpenChange = () => {},
17
+ onOpenChange,
16
18
  class: className,
17
19
  style,
18
20
  children,
@@ -26,13 +28,22 @@
26
28
  } = $props();
27
29
 
28
30
  const sidebar = setSidebar({
29
- open: () => open,
31
+ open: box.with(
32
+ () => open,
33
+ (v) => (open = v)
34
+ ),
30
35
  setOpen: (value: boolean, side: 'left' | 'right' = 'left') => {
31
- open[side] = value;
32
- onOpenChange(value, side);
36
+ if (sidebar.isMobile) {
37
+ sidebar.openMobile[side] = value;
38
+ } else {
39
+ open[side] = value;
40
+ }
41
+ onOpenChange?.(value, side);
33
42
 
34
- // This sets the cookie to keep the sidebar state.
35
- document.cookie = `${SIDEBAR_COOKIE_NAME}-${side}=${open[side]}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
43
+ if (browser) {
44
+ // This sets the cookie to keep the sidebar state.
45
+ document.cookie = `${SIDEBAR_COOKIE_NAME}-${side}=${open[side]}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
46
+ }
36
47
  }
37
48
  });
38
49
  </script>
@@ -42,9 +42,9 @@
42
42
  [[data-side=right][data-state=collapsed]_&]:cursor-w-resize
43
43
  `,
44
44
  `
45
- group-data-[collapsible=offcanvas]:translate-x-0
46
- group-data-[collapsible=offcanvas]:after:left-full
47
- group-data-[collapsible=offcanvas]:hover:bg-sidebar
45
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:translate-x-0
46
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:after:left-full
47
+ group-data-[collapsible=offcanvas]:group-data-[open=false]:hover:bg-sidebar
48
48
  `,
49
49
  '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',
50
50
  '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',
@@ -22,6 +22,7 @@
22
22
  type="button"
23
23
  onclick={(e) => {
24
24
  onclick?.(e);
25
+ console.log('TOggling', side);
25
26
  sidebar.toggle(side);
26
27
  }}
27
28
  data-sidebar="trigger"
@@ -9,18 +9,25 @@
9
9
  let {
10
10
  ref = $bindable(null),
11
11
  side = 'left',
12
+ sideMobile,
12
13
  variant = 'sidebar',
13
14
  collapsible = 'offcanvas',
15
+ open,
14
16
  class: className,
15
17
  children,
16
18
  ...restProps
17
19
  }: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
18
20
  side?: 'left' | 'right';
21
+ sideMobile?: 'left' | 'right' | 'top' | 'bottom';
19
22
  variant?: 'sidebar' | 'floating' | 'inset';
20
23
  collapsible?: 'offcanvas' | 'icon' | 'none';
24
+ open?: boolean;
21
25
  } = $props();
22
26
 
23
27
  const sidebar = useSidebar();
28
+
29
+ // svelte-ignore state_referenced_locally
30
+ if (open !== undefined) sidebar.setOpen(open, side);
24
31
  </script>
25
32
 
26
33
  {#if collapsible === 'none'}
@@ -40,16 +47,20 @@
40
47
  {@render children?.()}
41
48
  </div>
42
49
  {:else if sidebar.isMobile}
43
- <Sheet.Root bind:open={() => sidebar.openMobile, (v) => sidebar.setOpenMobile(v)} {...restProps}>
50
+ <Sheet.Root bind:open={() => sidebar.openMobile[side], (v) => sidebar.setOpen(v, side)} {...restProps}>
44
51
  <Sheet.Content
45
52
  data-sidebar="sidebar"
46
53
  data-mobile="true"
47
- class="
48
- w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground
49
- [&>button]:hidden
50
- "
54
+ class={cn(
55
+ `
56
+ bg-sidebar p-0 text-sidebar-foreground
57
+ [&>button]:hidden
58
+ `,
59
+ sideMobile === 'top' || sideMobile === 'bottom' ? '' : 'w-(--sidebar-width)',
60
+ className
61
+ )}
51
62
  style="--sidebar-width: {SIDEBAR_WIDTH_MOBILE};"
52
- {side}
63
+ side={sideMobile ?? side}
53
64
  >
54
65
  <div class="flex h-full w-full flex-col">
55
66
  {@render children?.()}
@@ -63,7 +74,7 @@
63
74
  `
64
75
  peer relative hidden w-(--sidebar-width) flex-auto grow-0 flex-col overflow-hidden bg-sidebar
65
76
  text-sidebar-foreground transition-[width] duration-200 ease-linear
66
- data-[collapsible=offcanvas]:w-0
77
+ data-[collapsible=offcanvas]:data-[open=false]:w-0
67
78
  data-[variant=floating]:rounded-lg data-[variant=floating]:border data-[variant=floating]:border-sidebar-border
68
79
  data-[variant=floating]:shadow-sm
69
80
  md:flex
@@ -72,10 +83,10 @@
72
83
  variant === 'floating' || variant === 'inset'
73
84
  ? `
74
85
  m-2
75
- data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon))]
86
+ data-[collapsible=icon]:data-[open=false]:w-[calc(var(--sidebar-width-icon))]
76
87
  `
77
88
  : `
78
- data-[collapsible=icon]:w-(--sidebar-width-icon)
89
+ data-[collapsible=icon]:data-[open=false]:w-(--sidebar-width-icon)
79
90
  data-[side=left]:border-r
80
91
  data-[side=right]:border-l
81
92
  `,
@@ -83,8 +94,8 @@
83
94
  className
84
95
  )}
85
96
  data-sidebar="sidebar"
86
- data-state={sidebar.state[side]}
87
- data-collapsible={sidebar.state[side] === 'collapsed' ? collapsible : ''}
97
+ data-open={sidebar.open[side]}
98
+ data-collapsible={collapsible}
88
99
  data-variant={variant}
89
100
  data-side={side}
90
101
  {...restProps}