@arqel-dev/ui 0.17.0 → 0.18.0
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/ArqelNotificationsPage-MBJBYFHW.js +6 -0
- package/dist/ArqelNotificationsPage-MBJBYFHW.js.map +1 -0
- package/dist/{UserMenu-B5XbC_Gy.d.ts → UserMenu-QlwvvZRU.d.ts} +2 -1
- package/dist/chunk-6YGRTXEL.js +87 -0
- package/dist/chunk-6YGRTXEL.js.map +1 -0
- package/dist/chunk-CH7YLELO.js +137 -0
- package/dist/chunk-CH7YLELO.js.map +1 -0
- package/dist/{chunk-K7QY56XN.js → chunk-D2MUCHFN.js} +5 -119
- package/dist/chunk-D2MUCHFN.js.map +1 -0
- package/dist/{chunk-X2X6YDOX.js → chunk-EXA6DWLB.js} +11 -3
- package/dist/chunk-EXA6DWLB.js.map +1 -0
- package/dist/chunk-U4MPY2XT.js +91 -0
- package/dist/chunk-U4MPY2XT.js.map +1 -0
- package/dist/chunk-XK2P6CSK.js +8 -0
- package/dist/chunk-XK2P6CSK.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -3
- package/dist/pages.d.ts +26 -1
- package/dist/pages.js +4 -1
- package/dist/pages.js.map +1 -1
- package/dist/primitives.js +3 -2
- package/dist/shell.d.ts +37 -3
- package/dist/shell.js +166 -7
- package/dist/shell.js.map +1 -1
- package/dist/utils.d.ts +16 -1
- package/dist/utils.js +1 -0
- package/package.json +6 -6
- package/dist/chunk-K7QY56XN.js.map +0 -1
- package/dist/chunk-R4BOUU6Y.js +0 -55
- package/dist/chunk-R4BOUU6Y.js.map +0 -1
- package/dist/chunk-X2X6YDOX.js.map +0 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ArqelNotificationsPage as default } from './chunk-CH7YLELO.js';
|
|
2
|
+
import './chunk-6YGRTXEL.js';
|
|
3
|
+
import './chunk-H23VX3RR.js';
|
|
4
|
+
import './chunk-B7ULUJVO.js';
|
|
5
|
+
//# sourceMappingURL=ArqelNotificationsPage-MBJBYFHW.js.map
|
|
6
|
+
//# sourceMappingURL=ArqelNotificationsPage-MBJBYFHW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ArqelNotificationsPage-MBJBYFHW.js"}
|
|
@@ -40,11 +40,12 @@ declare function Sidebar({ items: itemsProp, brand, footer, className }: Sidebar
|
|
|
40
40
|
interface TopbarProps {
|
|
41
41
|
brand?: ReactNode;
|
|
42
42
|
search?: ReactNode;
|
|
43
|
+
notifications?: ReactNode;
|
|
43
44
|
userMenu?: ReactNode;
|
|
44
45
|
tenantSwitcher?: ReactNode;
|
|
45
46
|
className?: string;
|
|
46
47
|
}
|
|
47
|
-
declare function Topbar({ brand, search, userMenu, tenantSwitcher, className }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
declare function Topbar({ brand, search, notifications, userMenu, tenantSwitcher, className, }: TopbarProps): react_jsx_runtime.JSX.Element;
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* `<UserMenu>` — authenticated-user dropdown for the Topbar `userMenu` slot.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { cn } from './chunk-B7ULUJVO.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function Card({ className, ...props }) {
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
"data-slot": "card",
|
|
10
|
+
className: cn(
|
|
11
|
+
"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
|
|
12
|
+
className
|
|
13
|
+
),
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function CardHeader({ className, ...props }) {
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
"div",
|
|
21
|
+
{
|
|
22
|
+
"data-slot": "card-header",
|
|
23
|
+
className: cn(
|
|
24
|
+
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
|
25
|
+
className
|
|
26
|
+
),
|
|
27
|
+
...props
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function CardTitle({ className, ...props }) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "card-title",
|
|
36
|
+
className: cn("leading-none font-semibold", className),
|
|
37
|
+
...props
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function CardDescription({ className, ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
"data-slot": "card-description",
|
|
46
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
47
|
+
...props
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
function CardAction({ className, ...props }) {
|
|
52
|
+
return /* @__PURE__ */ jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
"data-slot": "card-action",
|
|
56
|
+
className: cn(
|
|
57
|
+
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
58
|
+
className
|
|
59
|
+
),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
function CardContent({ className, ...props }) {
|
|
65
|
+
return /* @__PURE__ */ jsx(
|
|
66
|
+
"div",
|
|
67
|
+
{
|
|
68
|
+
"data-slot": "card-content",
|
|
69
|
+
className: cn("px-6", className),
|
|
70
|
+
...props
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function CardFooter({ className, ...props }) {
|
|
75
|
+
return /* @__PURE__ */ jsx(
|
|
76
|
+
"div",
|
|
77
|
+
{
|
|
78
|
+
"data-slot": "card-footer",
|
|
79
|
+
className: cn("flex items-center px-6 [.border-t]:pt-6", className),
|
|
80
|
+
...props
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
|
|
86
|
+
//# sourceMappingURL=chunk-6YGRTXEL.js.map
|
|
87
|
+
//# sourceMappingURL=chunk-6YGRTXEL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadcn/ui/card.tsx"],"names":[],"mappings":";;;;AAIA,SAAS,IAAA,CAAK,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAClE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,mFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,0JAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACvE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,MACpD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,gEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9B,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yCAAA,EAA2C,SAAS,CAAA;AAAA,MACjE,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-6YGRTXEL.js","sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n"]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Card } from './chunk-6YGRTXEL.js';
|
|
2
|
+
import { Button } from './chunk-H23VX3RR.js';
|
|
3
|
+
import { cn } from './chunk-B7ULUJVO.js';
|
|
4
|
+
import { useArqelTranslations } from '@arqel-dev/react/utils';
|
|
5
|
+
import { usePage, Link, router } from '@inertiajs/react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function readTitle(item) {
|
|
9
|
+
const title = item.data["title"];
|
|
10
|
+
if (typeof title === "string" && title.trim()) return title;
|
|
11
|
+
return item.type;
|
|
12
|
+
}
|
|
13
|
+
function readBody(item) {
|
|
14
|
+
const body = item.data["body"] ?? item.data["message"];
|
|
15
|
+
return typeof body === "string" && body.trim() ? body : void 0;
|
|
16
|
+
}
|
|
17
|
+
function markRead(id) {
|
|
18
|
+
router.post(
|
|
19
|
+
`/admin/notifications/${id}/read`,
|
|
20
|
+
{},
|
|
21
|
+
{ preserveScroll: true, only: ["history", "notifications"] }
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
function markAllRead() {
|
|
25
|
+
router.post(
|
|
26
|
+
"/admin/notifications/read-all",
|
|
27
|
+
{},
|
|
28
|
+
{ preserveScroll: true, only: ["history", "notifications"] }
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function destroy(id) {
|
|
32
|
+
router.delete(`/admin/notifications/${id}`, { preserveScroll: true });
|
|
33
|
+
}
|
|
34
|
+
function decodePaginationLabel(label) {
|
|
35
|
+
return label.replace(/«/g, "\xAB").replace(/»/g, "\xBB");
|
|
36
|
+
}
|
|
37
|
+
function ArqelNotificationsPage() {
|
|
38
|
+
const t = useArqelTranslations();
|
|
39
|
+
const { history, filter } = usePage().props;
|
|
40
|
+
const items = history.data;
|
|
41
|
+
const hasUnread = items.some((item) => item.read_at === null);
|
|
42
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 p-4", children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
44
|
+
/* @__PURE__ */ jsx("h1", { className: "text-lg font-semibold", children: t("arqel.notifications.title", "Notifications") }),
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-sm", children: [
|
|
47
|
+
/* @__PURE__ */ jsx(
|
|
48
|
+
Link,
|
|
49
|
+
{
|
|
50
|
+
href: "/admin/notifications?filter=all",
|
|
51
|
+
className: cn(
|
|
52
|
+
"rounded-sm px-2 py-1",
|
|
53
|
+
filter === "all" ? "bg-accent font-medium text-accent-foreground" : "text-muted-foreground hover:text-foreground"
|
|
54
|
+
),
|
|
55
|
+
children: t("arqel.notifications.filter_all", "All")
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsx(
|
|
59
|
+
Link,
|
|
60
|
+
{
|
|
61
|
+
href: "/admin/notifications?filter=unread",
|
|
62
|
+
className: cn(
|
|
63
|
+
"rounded-sm px-2 py-1",
|
|
64
|
+
filter === "unread" ? "bg-accent font-medium text-accent-foreground" : "text-muted-foreground hover:text-foreground"
|
|
65
|
+
),
|
|
66
|
+
children: t("arqel.notifications.filter_unread", "Unread")
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
hasUnread && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: markAllRead, children: t("arqel.notifications.mark_all_read", "Mark all as read") })
|
|
71
|
+
] })
|
|
72
|
+
] }),
|
|
73
|
+
items.length === 0 ? /* @__PURE__ */ jsx(Card, { className: "p-6 text-center text-sm text-muted-foreground", children: t("arqel.notifications.empty", "No notifications") }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: items.map((item) => {
|
|
74
|
+
const title = readTitle(item);
|
|
75
|
+
const body = readBody(item);
|
|
76
|
+
const unread = item.read_at === null;
|
|
77
|
+
return /* @__PURE__ */ jsxs(
|
|
78
|
+
Card,
|
|
79
|
+
{
|
|
80
|
+
className: cn(
|
|
81
|
+
"flex flex-row items-start justify-between gap-4 p-4",
|
|
82
|
+
unread && "bg-accent/50"
|
|
83
|
+
),
|
|
84
|
+
children: [
|
|
85
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-start gap-2", children: [
|
|
86
|
+
/* @__PURE__ */ jsx(
|
|
87
|
+
"span",
|
|
88
|
+
{
|
|
89
|
+
"aria-hidden": "true",
|
|
90
|
+
className: cn(
|
|
91
|
+
"mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full",
|
|
92
|
+
unread ? "bg-primary" : "bg-transparent"
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col", children: [
|
|
97
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: title }),
|
|
98
|
+
body && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: body }),
|
|
99
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: item.created_at })
|
|
100
|
+
] })
|
|
101
|
+
] }),
|
|
102
|
+
/* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
103
|
+
unread && /* @__PURE__ */ jsx(Button, { variant: "outline", size: "sm", onClick: () => markRead(item.id), children: t("arqel.notifications.mark_read", "Mark as read") }),
|
|
104
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => destroy(item.id), children: t("arqel.notifications.delete", "Delete") })
|
|
105
|
+
] })
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
item.id
|
|
109
|
+
);
|
|
110
|
+
}) }),
|
|
111
|
+
history.links.length > 0 && /* @__PURE__ */ jsx(
|
|
112
|
+
"nav",
|
|
113
|
+
{
|
|
114
|
+
className: "flex flex-wrap items-center gap-1 text-sm",
|
|
115
|
+
"aria-label": t("table.pagination.label", "Pagination"),
|
|
116
|
+
children: history.links.map(
|
|
117
|
+
(link) => link.url ? /* @__PURE__ */ jsx(
|
|
118
|
+
Link,
|
|
119
|
+
{
|
|
120
|
+
href: link.url,
|
|
121
|
+
className: cn(
|
|
122
|
+
"rounded-sm px-2 py-1",
|
|
123
|
+
link.active ? "bg-accent font-medium text-accent-foreground" : "text-muted-foreground hover:text-foreground"
|
|
124
|
+
),
|
|
125
|
+
children: decodePaginationLabel(link.label)
|
|
126
|
+
},
|
|
127
|
+
link.url
|
|
128
|
+
) : /* @__PURE__ */ jsx("span", { className: "rounded-sm px-2 py-1 text-muted-foreground/50", children: decodePaginationLabel(link.label) }, link.label)
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
] });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export { ArqelNotificationsPage };
|
|
136
|
+
//# sourceMappingURL=chunk-CH7YLELO.js.map
|
|
137
|
+
//# sourceMappingURL=chunk-CH7YLELO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pages/ArqelNotificationsPage.tsx"],"names":[],"mappings":"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","file":"chunk-CH7YLELO.js","sourcesContent":["/**\n * Default Inertia page for `arqel::notifications`.\n *\n * Renders the paginated notification history emitted by\n * `Arqel\\Core\\Http\\Controllers\\NotificationController::index`\n * (`{ history: paginator, filter: 'all' | 'unread' }`). The page-prop\n * is named `history` — *not* `notifications` — because `notifications`\n * is already a shared Inertia prop (`{unread_count, recent}`, see\n * `HandleArqelInertiaRequests`) consumed by the `<NotificationBell>`\n * mounted on every page's topbar. Reusing that key here would let this\n * page's paginator silently overwrite the shared prop and break the\n * bell (see branch review, milestone 0.19).\n *\n * The paginator serializes each item as `{id, type, data, read_at,\n * created_at}` — same shape as the `notifications.recent` array the\n * `<NotificationBell>` dropdown consumes, so titles/bodies follow the\n * same `data.title` / `data.body` convention.\n *\n * Per-item actions do scoped Inertia visits (`only: ['history']` for\n * mark-as-read, a plain reload for delete) so the list refreshes\n * without a full page navigation.\n */\n\nimport { useArqelTranslations } from '@arqel-dev/react/utils';\nimport type { NotificationItem } from '@arqel-dev/types/inertia';\nimport { Link, router, usePage } from '@inertiajs/react';\nimport type { JSX } from 'react';\nimport { Button } from '../action/Button.js';\nimport { Card } from '../shadcn/ui/card.js';\nimport { cn } from '../utils/cn.js';\n\ninterface LaravelPaginationLink {\n url: string | null;\n label: string;\n active: boolean;\n}\n\ninterface NotificationsPaginator {\n data: NotificationItem[];\n links: LaravelPaginationLink[];\n meta: Record<string, unknown>;\n}\n\ninterface ArqelNotificationsPageProps {\n history: NotificationsPaginator;\n filter: 'all' | 'unread';\n [key: string]: unknown;\n}\n\nfunction readTitle(item: NotificationItem): string {\n const title = item.data['title'];\n if (typeof title === 'string' && title.trim()) return title;\n return item.type;\n}\n\nfunction readBody(item: NotificationItem): string | undefined {\n const body = item.data['body'] ?? item.data['message'];\n return typeof body === 'string' && body.trim() ? body : undefined;\n}\n\nfunction markRead(id: string): void {\n router.post(\n `/admin/notifications/${id}/read`,\n {},\n { preserveScroll: true, only: ['history', 'notifications'] },\n );\n}\n\nfunction markAllRead(): void {\n router.post(\n '/admin/notifications/read-all',\n {},\n { preserveScroll: true, only: ['history', 'notifications'] },\n );\n}\n\nfunction destroy(id: string): void {\n router.delete(`/admin/notifications/${id}`, { preserveScroll: true });\n}\n\n/**\n * Laravel's paginator emits prev/next labels as HTML entities\n * (`« Previous`, `Next »`). Decode the small, known set we\n * expect rather than reaching for `dangerouslySetInnerHTML` — the\n * labels are server-controlled but there is no reason to accept\n * arbitrary markup here.\n */\nfunction decodePaginationLabel(label: string): string {\n return label.replace(/«/g, '«').replace(/»/g, '»');\n}\n\nexport default function ArqelNotificationsPage(): JSX.Element {\n const t = useArqelTranslations();\n const { history, filter } = usePage<ArqelNotificationsPageProps>().props;\n\n const items = history.data;\n const hasUnread = items.some((item) => item.read_at === null);\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <h1 className=\"text-lg font-semibold\">{t('arqel.notifications.title', 'Notifications')}</h1>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1 text-sm\">\n <Link\n href=\"/admin/notifications?filter=all\"\n className={cn(\n 'rounded-sm px-2 py-1',\n filter === 'all'\n ? 'bg-accent font-medium text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {t('arqel.notifications.filter_all', 'All')}\n </Link>\n <Link\n href=\"/admin/notifications?filter=unread\"\n className={cn(\n 'rounded-sm px-2 py-1',\n filter === 'unread'\n ? 'bg-accent font-medium text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {t('arqel.notifications.filter_unread', 'Unread')}\n </Link>\n </div>\n {hasUnread && (\n <Button variant=\"outline\" size=\"sm\" onClick={markAllRead}>\n {t('arqel.notifications.mark_all_read', 'Mark all as read')}\n </Button>\n )}\n </div>\n </div>\n\n {items.length === 0 ? (\n <Card className=\"p-6 text-center text-sm text-muted-foreground\">\n {t('arqel.notifications.empty', 'No notifications')}\n </Card>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) => {\n const title = readTitle(item);\n const body = readBody(item);\n const unread = item.read_at === null;\n\n return (\n <Card\n key={item.id}\n className={cn(\n 'flex flex-row items-start justify-between gap-4 p-4',\n unread && 'bg-accent/50',\n )}\n >\n <div className=\"flex min-w-0 flex-1 items-start gap-2\">\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full',\n unread ? 'bg-primary' : 'bg-transparent',\n )}\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"font-medium\">{title}</span>\n {body && <span className=\"text-sm text-muted-foreground\">{body}</span>}\n <span className=\"text-xs text-muted-foreground\">{item.created_at}</span>\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {unread && (\n <Button variant=\"outline\" size=\"sm\" onClick={() => markRead(item.id)}>\n {t('arqel.notifications.mark_read', 'Mark as read')}\n </Button>\n )}\n <Button variant=\"ghost\" size=\"sm\" onClick={() => destroy(item.id)}>\n {t('arqel.notifications.delete', 'Delete')}\n </Button>\n </div>\n </Card>\n );\n })}\n </div>\n )}\n\n {history.links.length > 0 && (\n <nav\n className=\"flex flex-wrap items-center gap-1 text-sm\"\n aria-label={t('table.pagination.label', 'Pagination')}\n >\n {history.links.map((link) =>\n link.url ? (\n <Link\n key={link.url}\n href={link.url}\n className={cn(\n 'rounded-sm px-2 py-1',\n link.active\n ? 'bg-accent font-medium text-accent-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {decodePaginationLabel(link.label)}\n </Link>\n ) : (\n <span key={link.label} className=\"rounded-sm px-2 py-1 text-muted-foreground/50\">\n {decodePaginationLabel(link.label)}\n </span>\n ),\n )}\n </nav>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Separator } from './chunk-
|
|
1
|
+
import { Separator } from './chunk-U4MPY2XT.js';
|
|
2
2
|
import { cn } from './chunk-B7ULUJVO.js';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
-
import { Slot, Checkbox as Checkbox$1, Label as Label$1, Select as Select$1 } from 'radix-ui';
|
|
7
6
|
import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
|
|
7
|
+
import { Checkbox as Checkbox$1, Label as Label$1, Select as Select$1 } from 'radix-ui';
|
|
8
8
|
|
|
9
9
|
var alertVariants = cva(
|
|
10
10
|
"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
|
|
@@ -64,120 +64,6 @@ function AlertDescription({
|
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
|
-
var badgeVariants = cva(
|
|
68
|
-
"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
|
|
69
|
-
{
|
|
70
|
-
variants: {
|
|
71
|
-
variant: {
|
|
72
|
-
default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
|
73
|
-
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
|
74
|
-
destructive: "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
|
|
75
|
-
outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
76
|
-
ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
77
|
-
link: "text-primary underline-offset-4 [a&]:hover:underline"
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
defaultVariants: {
|
|
81
|
-
variant: "default"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
);
|
|
85
|
-
function Badge({
|
|
86
|
-
className,
|
|
87
|
-
variant = "default",
|
|
88
|
-
asChild = false,
|
|
89
|
-
...props
|
|
90
|
-
}) {
|
|
91
|
-
const Comp = asChild ? Slot.Root : "span";
|
|
92
|
-
return /* @__PURE__ */ jsx(
|
|
93
|
-
Comp,
|
|
94
|
-
{
|
|
95
|
-
"data-slot": "badge",
|
|
96
|
-
"data-variant": variant,
|
|
97
|
-
className: cn(badgeVariants({ variant }), className),
|
|
98
|
-
...props
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
function Card({ className, ...props }) {
|
|
103
|
-
return /* @__PURE__ */ jsx(
|
|
104
|
-
"div",
|
|
105
|
-
{
|
|
106
|
-
"data-slot": "card",
|
|
107
|
-
className: cn(
|
|
108
|
-
"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
|
|
109
|
-
className
|
|
110
|
-
),
|
|
111
|
-
...props
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
function CardHeader({ className, ...props }) {
|
|
116
|
-
return /* @__PURE__ */ jsx(
|
|
117
|
-
"div",
|
|
118
|
-
{
|
|
119
|
-
"data-slot": "card-header",
|
|
120
|
-
className: cn(
|
|
121
|
-
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
|
122
|
-
className
|
|
123
|
-
),
|
|
124
|
-
...props
|
|
125
|
-
}
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
function CardTitle({ className, ...props }) {
|
|
129
|
-
return /* @__PURE__ */ jsx(
|
|
130
|
-
"div",
|
|
131
|
-
{
|
|
132
|
-
"data-slot": "card-title",
|
|
133
|
-
className: cn("leading-none font-semibold", className),
|
|
134
|
-
...props
|
|
135
|
-
}
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
function CardDescription({ className, ...props }) {
|
|
139
|
-
return /* @__PURE__ */ jsx(
|
|
140
|
-
"div",
|
|
141
|
-
{
|
|
142
|
-
"data-slot": "card-description",
|
|
143
|
-
className: cn("text-sm text-muted-foreground", className),
|
|
144
|
-
...props
|
|
145
|
-
}
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
function CardAction({ className, ...props }) {
|
|
149
|
-
return /* @__PURE__ */ jsx(
|
|
150
|
-
"div",
|
|
151
|
-
{
|
|
152
|
-
"data-slot": "card-action",
|
|
153
|
-
className: cn(
|
|
154
|
-
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
155
|
-
className
|
|
156
|
-
),
|
|
157
|
-
...props
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
function CardContent({ className, ...props }) {
|
|
162
|
-
return /* @__PURE__ */ jsx(
|
|
163
|
-
"div",
|
|
164
|
-
{
|
|
165
|
-
"data-slot": "card-content",
|
|
166
|
-
className: cn("px-6", className),
|
|
167
|
-
...props
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
function CardFooter({ className, ...props }) {
|
|
172
|
-
return /* @__PURE__ */ jsx(
|
|
173
|
-
"div",
|
|
174
|
-
{
|
|
175
|
-
"data-slot": "card-footer",
|
|
176
|
-
className: cn("flex items-center px-6 [.border-t]:pt-6", className),
|
|
177
|
-
...props
|
|
178
|
-
}
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
67
|
function Checkbox({
|
|
182
68
|
className,
|
|
183
69
|
...props
|
|
@@ -605,6 +491,6 @@ function Textarea({ className, ...props }) {
|
|
|
605
491
|
);
|
|
606
492
|
}
|
|
607
493
|
|
|
608
|
-
export { Alert, AlertDescription, AlertTitle,
|
|
609
|
-
//# sourceMappingURL=chunk-
|
|
610
|
-
//# sourceMappingURL=chunk-
|
|
494
|
+
export { Alert, AlertDescription, AlertTitle, Checkbox, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Label, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Textarea };
|
|
495
|
+
//# sourceMappingURL=chunk-D2MUCHFN.js.map
|
|
496
|
+
//# sourceMappingURL=chunk-D2MUCHFN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadcn/ui/alert.tsx","../src/shadcn/ui/checkbox.tsx","../src/shadcn/ui/label.tsx","../src/shadcn/ui/field.tsx","../src/shadcn/ui/select.tsx","../src/shadcn/ui/textarea.tsx"],"names":["jsx","CheckboxPrimitive","LabelPrimitive","cva","SelectPrimitive","jsxs","CheckIcon"],"mappings":"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","file":"chunk-D2MUCHFN.js","sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/utils/cn\"\n\nconst alertVariants = cva(\n \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import * as React from \"react\"\nimport { CheckIcon } from \"lucide-react\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Checkbox({\n className,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\n","import * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/utils/cn\"\nimport { Label } from \"@/shadcn/ui/label\"\nimport { Separator } from \"@/shadcn/ui/separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n \"has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/utils/cn\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"]}
|
|
@@ -602,7 +602,14 @@ function groupItems(items) {
|
|
|
602
602
|
}
|
|
603
603
|
return Array.from(groups.entries());
|
|
604
604
|
}
|
|
605
|
-
function Topbar({
|
|
605
|
+
function Topbar({
|
|
606
|
+
brand,
|
|
607
|
+
search,
|
|
608
|
+
notifications,
|
|
609
|
+
userMenu,
|
|
610
|
+
tenantSwitcher,
|
|
611
|
+
className
|
|
612
|
+
}) {
|
|
606
613
|
return /* @__PURE__ */ jsxs(
|
|
607
614
|
"header",
|
|
608
615
|
{
|
|
@@ -623,6 +630,7 @@ function Topbar({ brand, search, userMenu, tenantSwitcher, className }) {
|
|
|
623
630
|
/* @__PURE__ */ jsx("div", { className: "hidden min-w-0 flex-1 md:block", children: search }),
|
|
624
631
|
/* @__PURE__ */ jsxs("div", { className: "ml-auto flex min-w-0 items-center gap-2 md:ml-0", children: [
|
|
625
632
|
tenantSwitcher,
|
|
633
|
+
notifications,
|
|
626
634
|
userMenu
|
|
627
635
|
] })
|
|
628
636
|
]
|
|
@@ -721,5 +729,5 @@ function UserMenu({ user, logoutUrl, profileUrl, className }) {
|
|
|
721
729
|
}
|
|
722
730
|
|
|
723
731
|
export { AppShell, Footer, MainContent, Sidebar2 as Sidebar, Topbar, UserMenu };
|
|
724
|
-
//# sourceMappingURL=chunk-
|
|
725
|
-
//# sourceMappingURL=chunk-
|
|
732
|
+
//# sourceMappingURL=chunk-EXA6DWLB.js.map
|
|
733
|
+
//# sourceMappingURL=chunk-EXA6DWLB.js.map
|