svelte-ag 1.0.35 → 1.0.37
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.
- package/dist/lib/api/query/query.svelte.d.ts.map +1 -1
- package/dist/lib/api/query/query.svelte.js +3 -5
- package/dist/lib/components/breakpoint-badge/BreakpointBadge.svelte +11 -20
- package/dist/lib/components/breakpoint-badge/BreakpointBadge.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/context.svelte.d.ts +12 -10
- package/dist/lib/components/sidebar/context.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/context.svelte.js +14 -12
- package/dist/lib/components/sidebar/sidebar-content.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-group-action.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-group-label.svelte +4 -1
- package/dist/lib/components/sidebar/sidebar-group-label.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/sidebar-inset.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-menu-action.svelte +2 -2
- package/dist/lib/components/sidebar/sidebar-menu-badge.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-menu-button.svelte +6 -5
- package/dist/lib/components/sidebar/sidebar-menu-button.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/sidebar-menu-sub-button.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-menu-sub.svelte +1 -1
- package/dist/lib/components/sidebar/sidebar-provider.svelte +17 -6
- package/dist/lib/components/sidebar/sidebar-provider.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/sidebar-rail.svelte +3 -3
- package/dist/lib/components/sidebar/sidebar-trigger.svelte +1 -0
- package/dist/lib/components/sidebar/sidebar-trigger.svelte.d.ts.map +1 -1
- package/dist/lib/components/sidebar/sidebar.svelte +22 -11
- package/dist/lib/components/sidebar/sidebar.svelte.d.ts +2 -0
- package/dist/lib/components/sidebar/sidebar.svelte.d.ts.map +1 -1
- package/dist/lib/vite/vite-plugin-component-source-collector.d.ts +1 -1
- package/dist/lib/vite/vite-plugin-component-source-collector.d.ts.map +1 -1
- package/dist/lib/vite/vite-plugin-component-source-collector.js +9 -2
- package/package.json +4 -4
- package/src/lib/api/query/query.svelte.ts +3 -5
- package/src/lib/components/breakpoint-badge/BreakpointBadge.svelte +11 -20
- package/src/lib/components/sidebar/context.svelte.ts +15 -16
- package/src/lib/components/sidebar/sidebar-content.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-group-action.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-group-label.svelte +4 -1
- package/src/lib/components/sidebar/sidebar-inset.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-menu-action.svelte +2 -2
- package/src/lib/components/sidebar/sidebar-menu-badge.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-menu-button.svelte +6 -5
- package/src/lib/components/sidebar/sidebar-menu-sub-button.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-menu-sub.svelte +1 -1
- package/src/lib/components/sidebar/sidebar-provider.svelte +17 -6
- package/src/lib/components/sidebar/sidebar-rail.svelte +3 -3
- package/src/lib/components/sidebar/sidebar-trigger.svelte +1 -0
- package/src/lib/components/sidebar/sidebar.svelte +22 -11
- package/src/lib/vite/vite-plugin-component-source-collector.ts +11 -2
|
@@ -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;
|
|
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
|
-
|
|
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="
|
|
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;
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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
|
-
|
|
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';
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
focus-visible:ring-2
|
|
23
23
|
[&>svg]:size-4 [&>svg]:shrink-0
|
|
24
24
|
`,
|
|
25
|
-
|
|
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;
|
|
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-[
|
|
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-[
|
|
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]:
|
|
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-[
|
|
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.
|
|
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.
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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: (
|
|
31
|
+
open: box.with(
|
|
32
|
+
() => open,
|
|
33
|
+
(v) => (open = v)
|
|
34
|
+
),
|
|
30
35
|
setOpen: (value: boolean, side: 'left' | 'right' = 'left') => {
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
if (sidebar.isMobile) {
|
|
37
|
+
sidebar.openMobile[side] = value;
|
|
38
|
+
} else {
|
|
39
|
+
open[side] = value;
|
|
40
|
+
}
|
|
41
|
+
onOpenChange?.(value, side);
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
|
|
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;
|
|
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',
|
|
@@ -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;
|
|
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.
|
|
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
|
-
|
|
49
|
-
|
|
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-
|
|
87
|
-
data-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;
|
|
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"}
|
|
@@ -15,6 +15,6 @@ interface Options {
|
|
|
15
15
|
*/
|
|
16
16
|
safePackages: string[];
|
|
17
17
|
}
|
|
18
|
-
export default function componentSourceCollector(opts?: Options): Plugin
|
|
18
|
+
export default function componentSourceCollector(opts?: Options): Promise<Plugin>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=vite-plugin-component-source-collector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-component-source-collector.d.ts","sourceRoot":"","sources":["../../../src/lib/vite/vite-plugin-component-source-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin-component-source-collector.d.ts","sourceRoot":"","sources":["../../../src/lib/vite/vite-plugin-component-source-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAMnD,UAAU,OAAO;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAKD,wBAA8B,wBAAwB,CAAC,IAAI,GAAE,OAA8B,GAAG,OAAO,CAAC,MAAM,CAAC,CAoK5G"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { exists, writeIfDifferent } from 'ts-ag';
|
|
2
2
|
import { readFile } from 'fs/promises';
|
|
3
3
|
import { resolve, join, relative, dirname } from 'path';
|
|
4
|
+
import { open } from 'fs/promises';
|
|
4
5
|
/** All unique component directories */
|
|
5
6
|
const componentFiles = new Set();
|
|
6
|
-
export default function componentSourceCollector(opts = { safePackages: [] }) {
|
|
7
|
+
export default async function componentSourceCollector(opts = { safePackages: [] }) {
|
|
7
8
|
// constants
|
|
8
9
|
const outFileName = opts.outputFile ?? 'component-sources.css';
|
|
9
10
|
const classRegex = /class(?:=|:)/;
|
|
@@ -15,6 +16,7 @@ export default function componentSourceCollector(opts = { safePackages: [] }) {
|
|
|
15
16
|
let firstRound = true;
|
|
16
17
|
let initialTransformDone = false;
|
|
17
18
|
let initialTransformTimer = null;
|
|
19
|
+
// init
|
|
18
20
|
function shouldAdd(code) {
|
|
19
21
|
return classRegex.test(code);
|
|
20
22
|
}
|
|
@@ -26,7 +28,7 @@ export default function componentSourceCollector(opts = { safePackages: [] }) {
|
|
|
26
28
|
(!/\.pnpm|.vite/.test(file) || opts.safePackages.some((p) => file.includes(`node_modules/${p}`)))) {
|
|
27
29
|
const cleanedFileName = file.replace(/\?v=.*$/, '');
|
|
28
30
|
const relativeFilePath = relative(dirname(outputFilePath), cleanedFileName);
|
|
29
|
-
if (relativeFilePath !==
|
|
31
|
+
if (relativeFilePath !== outFileName) {
|
|
30
32
|
// Dont add itself
|
|
31
33
|
componentFiles.add(relativeFilePath);
|
|
32
34
|
}
|
|
@@ -42,6 +44,10 @@ export default function componentSourceCollector(opts = { safePackages: [] }) {
|
|
|
42
44
|
}
|
|
43
45
|
}, 1000); // adjust delay as needed
|
|
44
46
|
}
|
|
47
|
+
async function touch(path) {
|
|
48
|
+
const handle = await open(path, 'a');
|
|
49
|
+
await handle.close();
|
|
50
|
+
}
|
|
45
51
|
const writeOutFile = async () => {
|
|
46
52
|
const lines = Array.from(componentFiles)
|
|
47
53
|
.map((d) => `@source '${d}';`)
|
|
@@ -63,6 +69,7 @@ export default function componentSourceCollector(opts = { safePackages: [] }) {
|
|
|
63
69
|
config = resolved;
|
|
64
70
|
root = config.root;
|
|
65
71
|
outputFilePath = resolve(root, outFileName);
|
|
72
|
+
await touch(outputFilePath);
|
|
66
73
|
if (config.command === 'build' && firstRound) {
|
|
67
74
|
componentFiles.clear();
|
|
68
75
|
firstRound = false;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svelte-ag",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.37",
|
|
4
4
|
"description": "Useful svelte components",
|
|
5
5
|
"bugs": "https://github.com/ageorgeh/svelte-ag/issues",
|
|
6
6
|
"repository": {
|
|
@@ -78,13 +78,13 @@
|
|
|
78
78
|
"@tailwindcss/typography": "^0.5.19",
|
|
79
79
|
"@tailwindcss/vite": "^4.2.1",
|
|
80
80
|
"@types/node": "^24.11.0",
|
|
81
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
81
|
+
"@typescript/native-preview": "7.0.0-dev.20260301.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
|
-
"globals": "^17.
|
|
85
|
+
"globals": "^17.4.0",
|
|
86
86
|
"husky": "^9.1.7",
|
|
87
|
-
"lint-staged": "^16.
|
|
87
|
+
"lint-staged": "^16.3.1",
|
|
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
|
-
|
|
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="
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
focus-visible:ring-2
|
|
23
23
|
[&>svg]:size-4 [&>svg]:shrink-0
|
|
24
24
|
`,
|
|
25
|
-
|
|
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-[
|
|
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-[
|
|
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]:
|
|
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-[
|
|
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.
|
|
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.
|
|
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: (
|
|
31
|
+
open: box.with(
|
|
32
|
+
() => open,
|
|
33
|
+
(v) => (open = v)
|
|
34
|
+
),
|
|
30
35
|
setOpen: (value: boolean, side: 'left' | 'right' = 'left') => {
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
if (sidebar.isMobile) {
|
|
37
|
+
sidebar.openMobile[side] = value;
|
|
38
|
+
} else {
|
|
39
|
+
open[side] = value;
|
|
40
|
+
}
|
|
41
|
+
onOpenChange?.(value, side);
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
|
|
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',
|
|
@@ -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.
|
|
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
|
-
|
|
49
|
-
|
|
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-
|
|
87
|
-
data-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,6 +2,7 @@ import type { Plugin, ResolvedConfig } from 'vite';
|
|
|
2
2
|
import { exists, writeIfDifferent } from 'ts-ag';
|
|
3
3
|
import { readFile } from 'fs/promises';
|
|
4
4
|
import { resolve, join, relative, dirname } from 'path';
|
|
5
|
+
import { open } from 'fs/promises';
|
|
5
6
|
|
|
6
7
|
interface Options {
|
|
7
8
|
/**
|
|
@@ -23,7 +24,7 @@ interface Options {
|
|
|
23
24
|
/** All unique component directories */
|
|
24
25
|
const componentFiles = new Set<string>();
|
|
25
26
|
|
|
26
|
-
export default function componentSourceCollector(opts: Options = { safePackages: [] }): Plugin {
|
|
27
|
+
export default async function componentSourceCollector(opts: Options = { safePackages: [] }): Promise<Plugin> {
|
|
27
28
|
// constants
|
|
28
29
|
const outFileName = opts.outputFile ?? 'component-sources.css';
|
|
29
30
|
const classRegex = /class(?:=|:)/;
|
|
@@ -38,6 +39,7 @@ export default function componentSourceCollector(opts: Options = { safePackages:
|
|
|
38
39
|
let initialTransformDone = false;
|
|
39
40
|
let initialTransformTimer: NodeJS.Timeout | null = null;
|
|
40
41
|
|
|
42
|
+
// init
|
|
41
43
|
function shouldAdd(code: string) {
|
|
42
44
|
return classRegex.test(code);
|
|
43
45
|
}
|
|
@@ -53,7 +55,7 @@ export default function componentSourceCollector(opts: Options = { safePackages:
|
|
|
53
55
|
const cleanedFileName = file.replace(/\?v=.*$/, '');
|
|
54
56
|
const relativeFilePath = relative(dirname(outputFilePath), cleanedFileName);
|
|
55
57
|
|
|
56
|
-
if (relativeFilePath !==
|
|
58
|
+
if (relativeFilePath !== outFileName) {
|
|
57
59
|
// Dont add itself
|
|
58
60
|
componentFiles.add(relativeFilePath);
|
|
59
61
|
}
|
|
@@ -70,6 +72,11 @@ export default function componentSourceCollector(opts: Options = { safePackages:
|
|
|
70
72
|
}, 1000); // adjust delay as needed
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
async function touch(path: string) {
|
|
76
|
+
const handle = await open(path, 'a');
|
|
77
|
+
await handle.close();
|
|
78
|
+
}
|
|
79
|
+
|
|
73
80
|
const writeOutFile = async () => {
|
|
74
81
|
const lines = Array.from(componentFiles)
|
|
75
82
|
.map((d) => `@source '${d}';`)
|
|
@@ -95,6 +102,8 @@ export default function componentSourceCollector(opts: Options = { safePackages:
|
|
|
95
102
|
root = config.root;
|
|
96
103
|
outputFilePath = resolve(root, outFileName);
|
|
97
104
|
|
|
105
|
+
await touch(outputFilePath);
|
|
106
|
+
|
|
98
107
|
if (config.command === 'build' && firstRound) {
|
|
99
108
|
componentFiles.clear();
|
|
100
109
|
firstRound = false;
|