@gelabs/ovr 0.1.1 → 0.2.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/chunk-3KIDW4LT.js +13 -0
- package/dist/chunk-4SZXBT56.js +26 -0
- package/dist/chunk-55FQP2DO.js +46 -0
- package/dist/{chunk-JV7QQ22Q.js → chunk-5YYR37CF.js} +10 -1
- package/dist/chunk-5Z2IAD5I.js +72 -0
- package/dist/chunk-BBQBKQA4.js +31 -0
- package/dist/chunk-BIQ2J75Y.js +54 -0
- package/dist/chunk-E2D7QT6N.js +92 -0
- package/dist/chunk-EGKFELO3.js +15 -0
- package/dist/chunk-EYFZWQ4J.js +74 -0
- package/dist/chunk-GDOCD7LT.js +46 -0
- package/dist/chunk-IF5UAVIE.js +25 -0
- package/dist/chunk-JEYT63LE.js +25 -0
- package/dist/chunk-K3KIBHJF.js +20 -0
- package/dist/chunk-M35R6JLA.js +142 -0
- package/dist/chunk-MDTRBOPQ.js +22 -0
- package/dist/chunk-NSCIBSCW.js +24 -0
- package/dist/chunk-OE525ZER.js +31 -0
- package/dist/chunk-OWCGEEAZ.js +107 -0
- package/dist/chunk-QCRVT2SS.js +18 -0
- package/dist/chunk-SETIN6XP.js +95 -0
- package/dist/chunk-WOPU6DI7.js +77 -0
- package/dist/chunk-XQTVSNHC.js +18 -0
- package/dist/core-i18n.d.ts +2 -2
- package/dist/core-i18n.js +1 -1
- package/dist/data-db.d.ts +1 -4
- package/dist/data-mock-store.js +53 -1
- package/dist/data-prisma-store.d.ts +3 -1
- package/dist/data-prisma-store.js +84 -1
- package/dist/data-seed-runner.d.ts +2 -1
- package/dist/data.d.ts +13 -1
- package/dist/offline.d.ts +126 -0
- package/dist/offline.js +376 -0
- package/dist/{types-DrrNO_Ak.d.ts → types-CtBC5-TW.d.ts} +8 -0
- package/dist/ui-components-admin/admin-nav.d.ts +7 -0
- package/dist/ui-components-admin/admin-nav.js +83 -0
- package/dist/ui-components-admin/issuance-form.d.ts +15 -0
- package/dist/ui-components-admin/issuance-form.js +367 -0
- package/dist/ui-components-admin/stat-card.d.ts +10 -0
- package/dist/ui-components-admin/stat-card.js +29 -0
- package/dist/ui-components-admin/ticket-preview.d.ts +9 -0
- package/dist/ui-components-admin/ticket-preview.js +13 -0
- package/dist/ui-components-admin/tickets-table.d.ts +8 -0
- package/dist/ui-components-admin/tickets-table.js +50 -0
- package/dist/ui-components-citizen/citizen-nav.d.ts +5 -0
- package/dist/ui-components-citizen/citizen-nav.js +33 -0
- package/dist/ui-components-citizen/payment-form.d.ts +14 -0
- package/dist/ui-components-citizen/payment-form.js +168 -0
- package/dist/ui-components-citizen/payment-qr-dialog.d.ts +30 -0
- package/dist/ui-components-citizen/payment-qr-dialog.js +9 -0
- package/dist/ui-components-citizen/ticket-not-found.d.ts +5 -0
- package/dist/ui-components-citizen/ticket-not-found.js +21 -0
- package/dist/ui-components-citizen/violation-history-table.d.ts +16 -0
- package/dist/ui-components-citizen/violation-history-table.js +77 -0
- package/dist/ui-components-shared/amount-summary.d.ts +8 -0
- package/dist/ui-components-shared/amount-summary.js +7 -0
- package/dist/ui-components-shared/money.d.ts +9 -0
- package/dist/ui-components-shared/money.js +5 -0
- package/dist/ui-components-shared/municipal-seal.d.ts +11 -0
- package/dist/ui-components-shared/municipal-seal.js +6 -0
- package/dist/ui-components-shared/official-header.d.ts +5 -0
- package/dist/ui-components-shared/official-header.js +7 -0
- package/dist/ui-components-shared/print-button.d.ts +8 -0
- package/dist/ui-components-shared/print-button.js +17 -0
- package/dist/ui-components-shared/seal.d.ts +12 -0
- package/dist/ui-components-shared/seal.js +2 -0
- package/dist/ui-components-shared/site-header.d.ts +13 -0
- package/dist/ui-components-shared/site-header.js +40 -0
- package/dist/ui-components-shared/sonner.d.ts +6 -0
- package/dist/ui-components-shared/sonner.js +38 -0
- package/dist/ui-components-shared/status-badge.d.ts +9 -0
- package/dist/ui-components-shared/status-badge.js +3 -0
- package/dist/ui-components-shared/theme-toggle.d.ts +7 -0
- package/dist/ui-components-shared/theme-toggle.js +6 -0
- package/dist/ui-components-shared/ticket-receipt.d.ts +12 -0
- package/dist/ui-components-shared/ticket-receipt.js +158 -0
- package/dist/ui-components-shared/violations-table.d.ts +8 -0
- package/dist/ui-components-shared/violations-table.js +7 -0
- package/dist/ui-components-ui/alert.js +2 -74
- package/dist/ui-components-ui/badge.d.ts +1 -1
- package/dist/ui-components-ui/badge.js +2 -46
- package/dist/ui-components-ui/button.d.ts +2 -2
- package/dist/ui-components-ui/card.js +2 -95
- package/dist/ui-components-ui/checkbox.js +2 -31
- package/dist/ui-components-ui/dialog.js +3 -142
- package/dist/ui-components-ui/input.js +2 -20
- package/dist/ui-components-ui/label.js +2 -18
- package/dist/ui-components-ui/separator.js +2 -24
- package/dist/ui-components-ui/skeleton.js +2 -15
- package/dist/ui-components-ui/table.js +2 -107
- package/dist/ui-components-ui/textarea.js +2 -18
- package/dist/ui-config.d.ts +19 -2
- package/dist/ui-config.js +2 -36
- package/dist/ui-server.d.ts +1 -1
- package/dist/ui-server.js +1 -1
- package/package.json +24 -4
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Button } from './chunk-I4WDVYHX.js';
|
|
2
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
3
|
+
import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
|
|
4
|
+
import { XIcon } from 'lucide-react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function Dialog({ ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(Dialog$1.Root, { "data-slot": "dialog", ...props });
|
|
9
|
+
}
|
|
10
|
+
function DialogTrigger({ ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(Dialog$1.Trigger, { "data-slot": "dialog-trigger", ...props });
|
|
12
|
+
}
|
|
13
|
+
function DialogPortal({ ...props }) {
|
|
14
|
+
return /* @__PURE__ */ jsx(Dialog$1.Portal, { "data-slot": "dialog-portal", ...props });
|
|
15
|
+
}
|
|
16
|
+
function DialogClose({ ...props }) {
|
|
17
|
+
return /* @__PURE__ */ jsx(Dialog$1.Close, { "data-slot": "dialog-close", ...props });
|
|
18
|
+
}
|
|
19
|
+
function DialogOverlay({
|
|
20
|
+
className,
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
Dialog$1.Backdrop,
|
|
25
|
+
{
|
|
26
|
+
"data-slot": "dialog-overlay",
|
|
27
|
+
className: cn(
|
|
28
|
+
"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
function DialogContent({
|
|
36
|
+
className,
|
|
37
|
+
children,
|
|
38
|
+
showCloseButton = true,
|
|
39
|
+
...props
|
|
40
|
+
}) {
|
|
41
|
+
return /* @__PURE__ */ jsxs(DialogPortal, { children: [
|
|
42
|
+
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
43
|
+
/* @__PURE__ */ jsxs(
|
|
44
|
+
Dialog$1.Popup,
|
|
45
|
+
{
|
|
46
|
+
"data-slot": "dialog-content",
|
|
47
|
+
className: cn(
|
|
48
|
+
"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
49
|
+
className
|
|
50
|
+
),
|
|
51
|
+
...props,
|
|
52
|
+
children: [
|
|
53
|
+
children,
|
|
54
|
+
showCloseButton && /* @__PURE__ */ jsxs(
|
|
55
|
+
Dialog$1.Close,
|
|
56
|
+
{
|
|
57
|
+
"data-slot": "dialog-close",
|
|
58
|
+
render: /* @__PURE__ */ jsx(
|
|
59
|
+
Button,
|
|
60
|
+
{
|
|
61
|
+
variant: "ghost",
|
|
62
|
+
className: "absolute top-2 right-2",
|
|
63
|
+
size: "icon-sm"
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
XIcon,
|
|
69
|
+
{}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
] });
|
|
79
|
+
}
|
|
80
|
+
function DialogHeader({ className, ...props }) {
|
|
81
|
+
return /* @__PURE__ */ jsx(
|
|
82
|
+
"div",
|
|
83
|
+
{
|
|
84
|
+
"data-slot": "dialog-header",
|
|
85
|
+
className: cn("flex flex-col gap-2", className),
|
|
86
|
+
...props
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function DialogFooter({
|
|
91
|
+
className,
|
|
92
|
+
showCloseButton = false,
|
|
93
|
+
children,
|
|
94
|
+
...props
|
|
95
|
+
}) {
|
|
96
|
+
return /* @__PURE__ */ jsxs(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
"data-slot": "dialog-footer",
|
|
100
|
+
className: cn(
|
|
101
|
+
"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
|
|
102
|
+
className
|
|
103
|
+
),
|
|
104
|
+
...props,
|
|
105
|
+
children: [
|
|
106
|
+
children,
|
|
107
|
+
showCloseButton && /* @__PURE__ */ jsx(Dialog$1.Close, { render: /* @__PURE__ */ jsx(Button, { variant: "outline" }), children: "Close" })
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
function DialogTitle({ className, ...props }) {
|
|
113
|
+
return /* @__PURE__ */ jsx(
|
|
114
|
+
Dialog$1.Title,
|
|
115
|
+
{
|
|
116
|
+
"data-slot": "dialog-title",
|
|
117
|
+
className: cn(
|
|
118
|
+
"font-heading text-base leading-none font-medium",
|
|
119
|
+
className
|
|
120
|
+
),
|
|
121
|
+
...props
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
function DialogDescription({
|
|
126
|
+
className,
|
|
127
|
+
...props
|
|
128
|
+
}) {
|
|
129
|
+
return /* @__PURE__ */ jsx(
|
|
130
|
+
Dialog$1.Description,
|
|
131
|
+
{
|
|
132
|
+
"data-slot": "dialog-description",
|
|
133
|
+
className: cn(
|
|
134
|
+
"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
|
|
135
|
+
className
|
|
136
|
+
),
|
|
137
|
+
...props
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Button } from './chunk-I4WDVYHX.js';
|
|
2
|
+
import { useTheme } from './chunk-E2D7QT6N.js';
|
|
3
|
+
import { Sun, Moon } from 'lucide-react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function ThemeToggle({ className }) {
|
|
7
|
+
const { resolvedTheme, setTheme } = useTheme();
|
|
8
|
+
const isDark = resolvedTheme === "dark";
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
Button,
|
|
11
|
+
{
|
|
12
|
+
variant: "ghost",
|
|
13
|
+
size: "icon",
|
|
14
|
+
"aria-label": "Toggle theme",
|
|
15
|
+
className,
|
|
16
|
+
onClick: () => setTheme(isDark ? "light" : "dark"),
|
|
17
|
+
children: isDark ? /* @__PURE__ */ jsx(Sun, { className: "size-5" }) : /* @__PURE__ */ jsx(Moon, { className: "size-5" })
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { ThemeToggle };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { Separator as Separator$1 } from '@base-ui/react/separator';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
function Separator({
|
|
6
|
+
className,
|
|
7
|
+
orientation = "horizontal",
|
|
8
|
+
...props
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsx(
|
|
11
|
+
Separator$1,
|
|
12
|
+
{
|
|
13
|
+
"data-slot": "separator",
|
|
14
|
+
orientation,
|
|
15
|
+
className: cn(
|
|
16
|
+
"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Separator };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Badge } from './chunk-55FQP2DO.js';
|
|
2
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var STATUS = {
|
|
6
|
+
OUTSTANDING: {
|
|
7
|
+
label: "Outstanding",
|
|
8
|
+
className: "border border-amber-300 bg-amber-50 text-amber-700 dark:border-amber-400/30 dark:bg-amber-400/10 dark:text-amber-300"
|
|
9
|
+
},
|
|
10
|
+
OVERDUE: {
|
|
11
|
+
label: "Overdue",
|
|
12
|
+
className: "border border-red-300 bg-red-50 text-red-700 dark:border-red-400/30 dark:bg-red-400/10 dark:text-red-300"
|
|
13
|
+
},
|
|
14
|
+
PAID: {
|
|
15
|
+
label: "Paid",
|
|
16
|
+
className: "border border-emerald-300 bg-emerald-50 text-emerald-700 dark:border-emerald-400/30 dark:bg-emerald-400/10 dark:text-emerald-300"
|
|
17
|
+
},
|
|
18
|
+
CONTESTED: {
|
|
19
|
+
label: "Contested",
|
|
20
|
+
className: "border border-sky-300 bg-sky-50 text-sky-700 dark:border-sky-400/30 dark:bg-sky-400/10 dark:text-sky-300"
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
function StatusBadge({
|
|
24
|
+
status,
|
|
25
|
+
className
|
|
26
|
+
}) {
|
|
27
|
+
const s = STATUS[status];
|
|
28
|
+
return /* @__PURE__ */ jsx(Badge, { className: cn(s.className, className), children: s.label });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { StatusBadge };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Table({ className, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"div",
|
|
7
|
+
{
|
|
8
|
+
"data-slot": "table-container",
|
|
9
|
+
className: "relative w-full overflow-x-auto",
|
|
10
|
+
children: /* @__PURE__ */ jsx(
|
|
11
|
+
"table",
|
|
12
|
+
{
|
|
13
|
+
"data-slot": "table",
|
|
14
|
+
className: cn("w-full caption-bottom text-sm", className),
|
|
15
|
+
...props
|
|
16
|
+
}
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
function TableHeader({ className, ...props }) {
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
"thead",
|
|
24
|
+
{
|
|
25
|
+
"data-slot": "table-header",
|
|
26
|
+
className: cn("[&_tr]:border-b", className),
|
|
27
|
+
...props
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function TableBody({ className, ...props }) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"tbody",
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "table-body",
|
|
36
|
+
className: cn("[&_tr:last-child]:border-0", className),
|
|
37
|
+
...props
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function TableFooter({ className, ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
"tfoot",
|
|
44
|
+
{
|
|
45
|
+
"data-slot": "table-footer",
|
|
46
|
+
className: cn(
|
|
47
|
+
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
|
|
48
|
+
className
|
|
49
|
+
),
|
|
50
|
+
...props
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
function TableRow({ className, ...props }) {
|
|
55
|
+
return /* @__PURE__ */ jsx(
|
|
56
|
+
"tr",
|
|
57
|
+
{
|
|
58
|
+
"data-slot": "table-row",
|
|
59
|
+
className: cn(
|
|
60
|
+
"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",
|
|
61
|
+
className
|
|
62
|
+
),
|
|
63
|
+
...props
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function TableHead({ className, ...props }) {
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
"th",
|
|
70
|
+
{
|
|
71
|
+
"data-slot": "table-head",
|
|
72
|
+
className: cn(
|
|
73
|
+
"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
|
|
74
|
+
className
|
|
75
|
+
),
|
|
76
|
+
...props
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
function TableCell({ className, ...props }) {
|
|
81
|
+
return /* @__PURE__ */ jsx(
|
|
82
|
+
"td",
|
|
83
|
+
{
|
|
84
|
+
"data-slot": "table-cell",
|
|
85
|
+
className: cn(
|
|
86
|
+
"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",
|
|
87
|
+
className
|
|
88
|
+
),
|
|
89
|
+
...props
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
function TableCaption({
|
|
94
|
+
className,
|
|
95
|
+
...props
|
|
96
|
+
}) {
|
|
97
|
+
return /* @__PURE__ */ jsx(
|
|
98
|
+
"caption",
|
|
99
|
+
{
|
|
100
|
+
"data-slot": "table-caption",
|
|
101
|
+
className: cn("mt-4 text-sm text-muted-foreground", className),
|
|
102
|
+
...props
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Textarea({ className, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"textarea",
|
|
7
|
+
{
|
|
8
|
+
"data-slot": "textarea",
|
|
9
|
+
className: cn(
|
|
10
|
+
"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
11
|
+
className
|
|
12
|
+
),
|
|
13
|
+
...props
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { Textarea };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Card({
|
|
5
|
+
className,
|
|
6
|
+
size = "default",
|
|
7
|
+
...props
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
"data-slot": "card",
|
|
13
|
+
"data-size": size,
|
|
14
|
+
className: cn(
|
|
15
|
+
"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
...props
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function CardHeader({ className, ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
"data-slot": "card-header",
|
|
27
|
+
className: cn(
|
|
28
|
+
"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
function CardTitle({ className, ...props }) {
|
|
36
|
+
return /* @__PURE__ */ jsx(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
"data-slot": "card-title",
|
|
40
|
+
className: cn(
|
|
41
|
+
"font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
|
|
42
|
+
className
|
|
43
|
+
),
|
|
44
|
+
...props
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
function CardDescription({ className, ...props }) {
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
"data-slot": "card-description",
|
|
53
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
54
|
+
...props
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
function CardAction({ className, ...props }) {
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
"div",
|
|
61
|
+
{
|
|
62
|
+
"data-slot": "card-action",
|
|
63
|
+
className: cn(
|
|
64
|
+
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
|
65
|
+
className
|
|
66
|
+
),
|
|
67
|
+
...props
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function CardContent({ className, ...props }) {
|
|
72
|
+
return /* @__PURE__ */ jsx(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
"data-slot": "card-content",
|
|
76
|
+
className: cn("px-4 group-data-[size=sm]/card:px-3", className),
|
|
77
|
+
...props
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
function CardFooter({ className, ...props }) {
|
|
82
|
+
return /* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
"data-slot": "card-footer",
|
|
86
|
+
className: cn(
|
|
87
|
+
"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3",
|
|
88
|
+
className
|
|
89
|
+
),
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Seal({ className }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs(
|
|
6
|
+
"svg",
|
|
7
|
+
{
|
|
8
|
+
viewBox: "0 0 64 64",
|
|
9
|
+
role: "img",
|
|
10
|
+
"aria-label": "Municipal seal",
|
|
11
|
+
className: cn("size-10", className),
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
"circle",
|
|
15
|
+
{
|
|
16
|
+
cx: "32",
|
|
17
|
+
cy: "32",
|
|
18
|
+
r: "30",
|
|
19
|
+
className: "fill-card stroke-primary",
|
|
20
|
+
strokeWidth: "2.5"
|
|
21
|
+
}
|
|
22
|
+
),
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
"circle",
|
|
25
|
+
{
|
|
26
|
+
cx: "32",
|
|
27
|
+
cy: "32",
|
|
28
|
+
r: "24",
|
|
29
|
+
className: "fill-none stroke-primary/25",
|
|
30
|
+
strokeWidth: "1"
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
/* @__PURE__ */ jsx("circle", { cx: "32", cy: "25", r: "6", className: "fill-warning" }),
|
|
34
|
+
[...Array(7)].map((_, i) => {
|
|
35
|
+
const a = Math.PI / 8 * (i - 3);
|
|
36
|
+
const x1 = 32 + Math.sin(a) * 9;
|
|
37
|
+
const y1 = 25 - Math.cos(a) * 9;
|
|
38
|
+
const x2 = 32 + Math.sin(a) * 12;
|
|
39
|
+
const y2 = 25 - Math.cos(a) * 12;
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
"line",
|
|
42
|
+
{
|
|
43
|
+
x1,
|
|
44
|
+
y1,
|
|
45
|
+
x2,
|
|
46
|
+
y2,
|
|
47
|
+
className: "stroke-warning",
|
|
48
|
+
strokeWidth: "1.6",
|
|
49
|
+
strokeLinecap: "round"
|
|
50
|
+
},
|
|
51
|
+
i
|
|
52
|
+
);
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"path",
|
|
56
|
+
{
|
|
57
|
+
d: "M14 40 q4.5 -4 9 0 t9 0 t9 0 t9 0",
|
|
58
|
+
className: "fill-none stroke-brand",
|
|
59
|
+
strokeWidth: "2.2",
|
|
60
|
+
strokeLinecap: "round"
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
/* @__PURE__ */ jsx(
|
|
64
|
+
"path",
|
|
65
|
+
{
|
|
66
|
+
d: "M14 46 q4.5 -4 9 0 t9 0 t9 0 t9 0",
|
|
67
|
+
className: "fill-none stroke-brand/70",
|
|
68
|
+
strokeWidth: "2.2",
|
|
69
|
+
strokeLinecap: "round"
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { Seal };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cn } from './chunk-77QBZC7J.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Label({ className, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"label",
|
|
7
|
+
{
|
|
8
|
+
"data-slot": "label",
|
|
9
|
+
className: cn(
|
|
10
|
+
"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",
|
|
11
|
+
className
|
|
12
|
+
),
|
|
13
|
+
...props
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { Label };
|
package/dist/core-i18n.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as CopyOverrides, D as Dictionary } from './types-
|
|
2
|
-
export { b as baseCopy } from './types-
|
|
1
|
+
import { C as CopyOverrides, D as Dictionary } from './types-CtBC5-TW.js';
|
|
2
|
+
export { b as baseCopy } from './types-CtBC5-TW.js';
|
|
3
3
|
import { M as MunicipalityConfig } from './schema-CdsFQxIg.js';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
package/dist/core-i18n.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { baseCopy, mergeCopy } from './chunk-
|
|
1
|
+
export { baseCopy, mergeCopy } from './chunk-5YYR37CF.js';
|
package/dist/data-db.d.ts
CHANGED
package/dist/data-mock-store.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { round2, computeCharges, makePaymentRef, fullName,
|
|
1
|
+
import { round2, computeCharges, makePaymentRef, fullName, addDays, makeBillNo, makeOrderOfPaymentNo, makeOvrTicketNo, enrich } from './chunk-B634JHKZ.js';
|
|
2
2
|
import 'server-only';
|
|
3
3
|
import { promises } from 'fs';
|
|
4
4
|
import os from 'os';
|
|
@@ -93,6 +93,58 @@ function createMockStore(rules, seed) {
|
|
|
93
93
|
await writeStore(store2);
|
|
94
94
|
return enrichRec(rec, now);
|
|
95
95
|
},
|
|
96
|
+
async leaseSeqs(count) {
|
|
97
|
+
const data = await readStore();
|
|
98
|
+
const n = Math.max(1, Math.min(500, count));
|
|
99
|
+
const start = data.counter;
|
|
100
|
+
const seqs = Array.from({ length: n }, (_, i) => start + i);
|
|
101
|
+
data.counter += n;
|
|
102
|
+
await writeStore(data);
|
|
103
|
+
return { year: (/* @__PURE__ */ new Date()).getFullYear(), seqs };
|
|
104
|
+
},
|
|
105
|
+
async pushTicket(input) {
|
|
106
|
+
const data = await readStore();
|
|
107
|
+
const existing = data.tickets.find(
|
|
108
|
+
(t) => norm(t.ovrTicketNo) === norm(input.ovrTicketNo)
|
|
109
|
+
);
|
|
110
|
+
if (existing) return enrichRec(existing, /* @__PURE__ */ new Date());
|
|
111
|
+
const created = new Date(input.createdAt);
|
|
112
|
+
const officer = OFFICERS.find((o) => o.id === input.officerId) ?? OFFICERS[0];
|
|
113
|
+
const violations = input.violations.map((v) => {
|
|
114
|
+
const c = CATALOG.find((x) => x.code === v.catalogCode);
|
|
115
|
+
if (!c) throw new Error(`Unknown violation code: ${v.catalogCode}`);
|
|
116
|
+
return {
|
|
117
|
+
catalogCode: c.code,
|
|
118
|
+
title: c.title,
|
|
119
|
+
basicFine: c.basicFine,
|
|
120
|
+
details: v.details?.trim() || void 0
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
if (violations.length === 0) {
|
|
124
|
+
throw new Error("A ticket must include at least one violation.");
|
|
125
|
+
}
|
|
126
|
+
const basicFinesTotal = violations.reduce((s, v) => s + v.basicFine, 0);
|
|
127
|
+
const seq = parseInt(input.ovrTicketNo.split("-").pop() ?? "", 10) || data.counter;
|
|
128
|
+
const rec = {
|
|
129
|
+
ovrTicketNo: input.ovrTicketNo,
|
|
130
|
+
orderOfPaymentNo: makeOrderOfPaymentNo(input.ovrTicketNo),
|
|
131
|
+
billNo: makeBillNo(created, officer.office, officer.badgeNo ?? "X000", seq),
|
|
132
|
+
violator: input.violator,
|
|
133
|
+
apprehendedAt: input.apprehendedAt,
|
|
134
|
+
placeOfViolation: input.placeOfViolation?.trim() || void 0,
|
|
135
|
+
officer,
|
|
136
|
+
violations,
|
|
137
|
+
remarks: input.remarks?.trim() || void 0,
|
|
138
|
+
assessedAt: input.createdAt,
|
|
139
|
+
dueDate: addDays(created, rules.dueWindowDays).toISOString(),
|
|
140
|
+
basicFinesTotal,
|
|
141
|
+
paymentStatus: "UNPAID",
|
|
142
|
+
createdAt: input.createdAt
|
|
143
|
+
};
|
|
144
|
+
data.tickets.unshift(rec);
|
|
145
|
+
await writeStore(data);
|
|
146
|
+
return enrichRec(rec, /* @__PURE__ */ new Date());
|
|
147
|
+
},
|
|
96
148
|
async searchTicket(ovrTicketNo, lastName) {
|
|
97
149
|
const store2 = await readStore();
|
|
98
150
|
const rec = store2.tickets.find(
|