@gelabs/ovr 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/chunk-3KIDW4LT.js +13 -0
  2. package/dist/chunk-4SZXBT56.js +26 -0
  3. package/dist/chunk-55FQP2DO.js +46 -0
  4. package/dist/{chunk-JV7QQ22Q.js → chunk-5YYR37CF.js} +10 -1
  5. package/dist/chunk-5Z2IAD5I.js +72 -0
  6. package/dist/chunk-BBQBKQA4.js +31 -0
  7. package/dist/chunk-BIQ2J75Y.js +54 -0
  8. package/dist/chunk-E2D7QT6N.js +92 -0
  9. package/dist/chunk-EGKFELO3.js +15 -0
  10. package/dist/chunk-EYFZWQ4J.js +74 -0
  11. package/dist/chunk-GDOCD7LT.js +46 -0
  12. package/dist/chunk-IF5UAVIE.js +25 -0
  13. package/dist/chunk-JEYT63LE.js +25 -0
  14. package/dist/chunk-K3KIBHJF.js +20 -0
  15. package/dist/chunk-M35R6JLA.js +142 -0
  16. package/dist/chunk-MDTRBOPQ.js +22 -0
  17. package/dist/chunk-NSCIBSCW.js +24 -0
  18. package/dist/chunk-OE525ZER.js +31 -0
  19. package/dist/chunk-OWCGEEAZ.js +107 -0
  20. package/dist/chunk-QCRVT2SS.js +18 -0
  21. package/dist/chunk-SETIN6XP.js +95 -0
  22. package/dist/chunk-WOPU6DI7.js +77 -0
  23. package/dist/chunk-XQTVSNHC.js +18 -0
  24. package/dist/core-i18n.d.ts +2 -2
  25. package/dist/core-i18n.js +1 -1
  26. package/dist/data-db.d.ts +1 -4
  27. package/dist/data-mock-store.js +53 -1
  28. package/dist/data-prisma-store.d.ts +3 -1
  29. package/dist/data-prisma-store.js +84 -1
  30. package/dist/data-seed-runner.d.ts +2 -1
  31. package/dist/data.d.ts +13 -1
  32. package/dist/offline.d.ts +126 -0
  33. package/dist/offline.js +376 -0
  34. package/dist/{types-DrrNO_Ak.d.ts → types-CtBC5-TW.d.ts} +8 -0
  35. package/dist/ui-components-admin/admin-nav.d.ts +7 -0
  36. package/dist/ui-components-admin/admin-nav.js +83 -0
  37. package/dist/ui-components-admin/issuance-form.d.ts +15 -0
  38. package/dist/ui-components-admin/issuance-form.js +367 -0
  39. package/dist/ui-components-admin/stat-card.d.ts +10 -0
  40. package/dist/ui-components-admin/stat-card.js +29 -0
  41. package/dist/ui-components-admin/ticket-preview.d.ts +9 -0
  42. package/dist/ui-components-admin/ticket-preview.js +13 -0
  43. package/dist/ui-components-admin/tickets-table.d.ts +8 -0
  44. package/dist/ui-components-admin/tickets-table.js +50 -0
  45. package/dist/ui-components-citizen/citizen-nav.d.ts +5 -0
  46. package/dist/ui-components-citizen/citizen-nav.js +33 -0
  47. package/dist/ui-components-citizen/payment-form.d.ts +14 -0
  48. package/dist/ui-components-citizen/payment-form.js +168 -0
  49. package/dist/ui-components-citizen/payment-qr-dialog.d.ts +30 -0
  50. package/dist/ui-components-citizen/payment-qr-dialog.js +9 -0
  51. package/dist/ui-components-citizen/ticket-not-found.d.ts +5 -0
  52. package/dist/ui-components-citizen/ticket-not-found.js +21 -0
  53. package/dist/ui-components-citizen/violation-history-table.d.ts +16 -0
  54. package/dist/ui-components-citizen/violation-history-table.js +77 -0
  55. package/dist/ui-components-shared/amount-summary.d.ts +8 -0
  56. package/dist/ui-components-shared/amount-summary.js +7 -0
  57. package/dist/ui-components-shared/money.d.ts +9 -0
  58. package/dist/ui-components-shared/money.js +5 -0
  59. package/dist/ui-components-shared/municipal-seal.d.ts +11 -0
  60. package/dist/ui-components-shared/municipal-seal.js +6 -0
  61. package/dist/ui-components-shared/official-header.d.ts +5 -0
  62. package/dist/ui-components-shared/official-header.js +7 -0
  63. package/dist/ui-components-shared/print-button.d.ts +8 -0
  64. package/dist/ui-components-shared/print-button.js +17 -0
  65. package/dist/ui-components-shared/seal.d.ts +12 -0
  66. package/dist/ui-components-shared/seal.js +2 -0
  67. package/dist/ui-components-shared/site-header.d.ts +13 -0
  68. package/dist/ui-components-shared/site-header.js +40 -0
  69. package/dist/ui-components-shared/sonner.d.ts +6 -0
  70. package/dist/ui-components-shared/sonner.js +38 -0
  71. package/dist/ui-components-shared/status-badge.d.ts +9 -0
  72. package/dist/ui-components-shared/status-badge.js +3 -0
  73. package/dist/ui-components-shared/theme-toggle.d.ts +7 -0
  74. package/dist/ui-components-shared/theme-toggle.js +6 -0
  75. package/dist/ui-components-shared/ticket-receipt.d.ts +12 -0
  76. package/dist/ui-components-shared/ticket-receipt.js +158 -0
  77. package/dist/ui-components-shared/violations-table.d.ts +8 -0
  78. package/dist/ui-components-shared/violations-table.js +7 -0
  79. package/dist/ui-components-ui/alert.js +2 -74
  80. package/dist/ui-components-ui/badge.d.ts +1 -1
  81. package/dist/ui-components-ui/badge.js +2 -46
  82. package/dist/ui-components-ui/button.d.ts +2 -2
  83. package/dist/ui-components-ui/card.js +2 -95
  84. package/dist/ui-components-ui/checkbox.js +2 -31
  85. package/dist/ui-components-ui/dialog.js +3 -142
  86. package/dist/ui-components-ui/input.js +2 -20
  87. package/dist/ui-components-ui/label.js +2 -18
  88. package/dist/ui-components-ui/separator.js +2 -24
  89. package/dist/ui-components-ui/skeleton.js +2 -15
  90. package/dist/ui-components-ui/table.js +2 -107
  91. package/dist/ui-components-ui/textarea.js +2 -18
  92. package/dist/ui-config.d.ts +19 -2
  93. package/dist/ui-config.js +2 -36
  94. package/dist/ui-server.d.ts +1 -1
  95. package/dist/ui-server.js +1 -1
  96. package/package.json +24 -4
  97. package/prisma/migrations/20260611112111_init/migration.sql +142 -0
  98. package/prisma/migrations/20260611112121_add_ticket_sequence/migration.sql +4 -0
  99. package/prisma/migrations/20260612000000_split_violator_address/migration.sql +26 -0
  100. package/prisma/migrations/20260612000100_barangay_optional/migration.sql +2 -0
  101. package/prisma/migrations/migration_lock.toml +3 -0
@@ -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 };
@@ -1,5 +1,5 @@
1
- import { C as CopyOverrides, D as Dictionary } from './types-DrrNO_Ak.js';
2
- export { b as baseCopy } from './types-DrrNO_Ak.js';
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-JV7QQ22Q.js';
1
+ export { baseCopy, mergeCopy } from './chunk-5YYR37CF.js';
package/dist/data-db.d.ts CHANGED
@@ -1,4 +1 @@
1
- export * from '@gelabs/ovr-data/db';
2
- import './generated/client';
3
- import '@gelabs/ovr-data/prisma-store';
4
- import '@gelabs/ovr-data/seed-runner';
1
+ export declare const prisma: import("./generated/client").PrismaClient;
@@ -1,4 +1,4 @@
1
- import { round2, computeCharges, makePaymentRef, fullName, makeOvrTicketNo, addDays, makeBillNo, makeOrderOfPaymentNo, enrich } from './chunk-B634JHKZ.js';
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(
@@ -1 +1,3 @@
1
- export * from '@gelabs/ovr-data/prisma-store';
1
+ import type { RulesConfig } from "./config.js";
2
+ import type { DataStore } from "./data.js";
3
+ export declare function createPrismaStore(rules: RulesConfig): DataStore;