@govnepal/ui 0.3.0 → 0.5.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/Accordion.d.ts +17 -0
- package/dist/Accordion.d.ts.map +1 -0
- package/dist/Accordion.js +19 -0
- package/dist/Accordion.js.map +1 -0
- package/dist/AddressBlock.d.ts +28 -0
- package/dist/AddressBlock.d.ts.map +1 -0
- package/dist/AddressBlock.js +10 -0
- package/dist/AddressBlock.js.map +1 -0
- package/dist/AmountInput.d.ts +18 -0
- package/dist/AmountInput.d.ts.map +1 -0
- package/dist/AmountInput.js +7 -0
- package/dist/AmountInput.js.map +1 -0
- package/dist/ApplicationStatusTracker.d.ts +19 -0
- package/dist/ApplicationStatusTracker.d.ts.map +1 -0
- package/dist/ApplicationStatusTracker.js +16 -0
- package/dist/ApplicationStatusTracker.js.map +1 -0
- package/dist/ApprovalDecisionPanel.d.ts +8 -0
- package/dist/ApprovalDecisionPanel.d.ts.map +1 -0
- package/dist/ApprovalDecisionPanel.js +24 -0
- package/dist/ApprovalDecisionPanel.js.map +1 -0
- package/dist/AuditLogItem.d.ts +18 -0
- package/dist/AuditLogItem.d.ts.map +1 -0
- package/dist/AuditLogItem.js +6 -0
- package/dist/AuditLogItem.js.map +1 -0
- package/dist/BottomNavigation.d.ts +18 -0
- package/dist/BottomNavigation.d.ts.map +1 -0
- package/dist/BottomNavigation.js +6 -0
- package/dist/BottomNavigation.js.map +1 -0
- package/dist/CameraCapture.d.ts +21 -0
- package/dist/CameraCapture.d.ts.map +1 -0
- package/dist/CameraCapture.js +8 -0
- package/dist/CameraCapture.js.map +1 -0
- package/dist/CaptureStatus.d.ts +24 -0
- package/dist/CaptureStatus.d.ts.map +1 -0
- package/dist/CaptureStatus.js +12 -0
- package/dist/CaptureStatus.js.map +1 -0
- package/dist/CitizenProfileCard.d.ts +19 -0
- package/dist/CitizenProfileCard.d.ts.map +1 -0
- package/dist/CitizenProfileCard.js +7 -0
- package/dist/CitizenProfileCard.js.map +1 -0
- package/dist/CookieBanner.d.ts +18 -0
- package/dist/CookieBanner.d.ts.map +1 -0
- package/dist/CookieBanner.js +9 -0
- package/dist/CookieBanner.js.map +1 -0
- package/dist/DataGrid.d.ts +25 -0
- package/dist/DataGrid.d.ts.map +1 -0
- package/dist/DataGrid.js +27 -0
- package/dist/DataGrid.js.map +1 -0
- package/dist/DatePicker.d.ts +23 -0
- package/dist/DatePicker.d.ts.map +1 -0
- package/dist/DatePicker.js +15 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DocumentPreview.d.ts +18 -0
- package/dist/DocumentPreview.d.ts.map +1 -0
- package/dist/DocumentPreview.js +6 -0
- package/dist/DocumentPreview.js.map +1 -0
- package/dist/DuplicateMatchWarning.d.ts +16 -0
- package/dist/DuplicateMatchWarning.d.ts.map +1 -0
- package/dist/DuplicateMatchWarning.js +6 -0
- package/dist/DuplicateMatchWarning.js.map +1 -0
- package/dist/EmptyState.d.ts +13 -0
- package/dist/EmptyState.d.ts.map +1 -0
- package/dist/EmptyState.js +11 -0
- package/dist/EmptyState.js.map +1 -0
- package/dist/ExportAction.d.ts +15 -0
- package/dist/ExportAction.d.ts.map +1 -0
- package/dist/ExportAction.js +11 -0
- package/dist/ExportAction.js.map +1 -0
- package/dist/FeedbackWidget.d.ts +13 -0
- package/dist/FeedbackWidget.d.ts.map +1 -0
- package/dist/FeedbackWidget.js +17 -0
- package/dist/FeedbackWidget.js.map +1 -0
- package/dist/FileUpload.d.ts +19 -0
- package/dist/FileUpload.d.ts.map +1 -0
- package/dist/FileUpload.js +18 -0
- package/dist/FileUpload.js.map +1 -0
- package/dist/FilterBar.d.ts +26 -0
- package/dist/FilterBar.d.ts.map +1 -0
- package/dist/FilterBar.js +11 -0
- package/dist/FilterBar.js.map +1 -0
- package/dist/LoadingState.d.ts +17 -0
- package/dist/LoadingState.d.ts.map +1 -0
- package/dist/LoadingState.js +20 -0
- package/dist/LoadingState.js.map +1 -0
- package/dist/MaskedValue.d.ts +21 -0
- package/dist/MaskedValue.d.ts.map +1 -0
- package/dist/MaskedValue.js +18 -0
- package/dist/MaskedValue.js.map +1 -0
- package/dist/OfficerReviewPanel.d.ts +18 -0
- package/dist/OfficerReviewPanel.d.ts.map +1 -0
- package/dist/OfficerReviewPanel.js +7 -0
- package/dist/OfficerReviewPanel.js.map +1 -0
- package/dist/OfflineBanner.d.ts +11 -0
- package/dist/OfflineBanner.d.ts.map +1 -0
- package/dist/OfflineBanner.js +11 -0
- package/dist/OfflineBanner.js.map +1 -0
- package/dist/OtpInput.d.ts +21 -0
- package/dist/OtpInput.d.ts.map +1 -0
- package/dist/OtpInput.js +11 -0
- package/dist/OtpInput.js.map +1 -0
- package/dist/PasswordInput.d.ts +18 -0
- package/dist/PasswordInput.d.ts.map +1 -0
- package/dist/PasswordInput.js +18 -0
- package/dist/PasswordInput.js.map +1 -0
- package/dist/ProgressBar.d.ts +8 -0
- package/dist/ProgressBar.d.ts.map +1 -0
- package/dist/ProgressBar.js +18 -0
- package/dist/ProgressBar.js.map +1 -0
- package/dist/QrCode.d.ts +22 -0
- package/dist/QrCode.d.ts.map +1 -0
- package/dist/QrCode.js +6 -0
- package/dist/QrCode.js.map +1 -0
- package/dist/SearchBox.d.ts +16 -0
- package/dist/SearchBox.d.ts.map +1 -0
- package/dist/SearchBox.js +16 -0
- package/dist/SearchBox.js.map +1 -0
- package/dist/SessionTimeoutWarning.d.ts +17 -0
- package/dist/SessionTimeoutWarning.d.ts.map +1 -0
- package/dist/SessionTimeoutWarning.js +17 -0
- package/dist/SessionTimeoutWarning.js.map +1 -0
- package/dist/Sidebar.d.ts +16 -0
- package/dist/Sidebar.d.ts.map +1 -0
- package/dist/Sidebar.js +6 -0
- package/dist/Sidebar.js.map +1 -0
- package/dist/Table.d.ts +22 -0
- package/dist/Table.d.ts.map +1 -0
- package/dist/Table.js +6 -0
- package/dist/Table.js.map +1 -0
- package/dist/generated/statusTaxonomy.js +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Accordion (components/accordion.md) — several independent expandable sections of long content.
|
|
4
|
+
* Each header is a <button> with aria-expanded/aria-controls; focus stays on the header after
|
|
5
|
+
* toggling (never jumps into the revealed content). Multiple sections may be open. For a single
|
|
6
|
+
* inline aside, use Details instead.
|
|
7
|
+
*/
|
|
8
|
+
export interface AccordionSection {
|
|
9
|
+
id: string;
|
|
10
|
+
title: ReactNode;
|
|
11
|
+
content: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function Accordion({ sections, className }: {
|
|
14
|
+
sections: AccordionSection[];
|
|
15
|
+
className?: string;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=Accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAqCtG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from "react";
|
|
4
|
+
import { cx } from "./cx.js";
|
|
5
|
+
export function Accordion({ sections, className }) {
|
|
6
|
+
const baseId = useId();
|
|
7
|
+
const [open, setOpen] = useState(new Set());
|
|
8
|
+
const toggle = (id) => setOpen((prev) => {
|
|
9
|
+
const next = new Set(prev);
|
|
10
|
+
next.has(id) ? next.delete(id) : next.add(id);
|
|
11
|
+
return next;
|
|
12
|
+
});
|
|
13
|
+
return (_jsx("div", { className: cx("gov-accordion", className), children: sections.map((section) => {
|
|
14
|
+
const expanded = open.has(section.id);
|
|
15
|
+
const panelId = `${baseId}-${section.id}`;
|
|
16
|
+
return (_jsxs("div", { className: "gov-accordion__section", children: [_jsxs("button", { type: "button", className: "gov-accordion__header", "aria-expanded": expanded, "aria-controls": panelId, onClick: () => toggle(section.id), children: [section.title, _jsx("svg", { className: "gov-accordion__chevron", viewBox: "0 0 24 24", "aria-hidden": "true", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M6 9l6 6 6-6" }) })] }), _jsx("div", { id: panelId, className: "gov-accordion__panel", hidden: !expanded, children: section.content })] }, section.id));
|
|
17
|
+
}) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=Accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sourceRoot":"","sources":["../src/Accordion.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAc7B,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAwD;IACrG,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAC5B,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,YAC3C,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACrC,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uBAAuB,mBAClB,QAAQ,mBACR,OAAO,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,aAEhC,OAAO,CAAC,KAAK,EACd,cAAK,SAAS,EAAC,wBAAwB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,YAC3K,eAAM,CAAC,EAAC,cAAc,GAAG,GACrB,IACC,EACT,cAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,sBAAsB,EAAC,MAAM,EAAE,CAAC,QAAQ,YACjE,OAAO,CAAC,OAAO,GACZ,KAfqC,OAAO,CAAC,EAAE,CAgBjD,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type SelectOption } from "./Select.js";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Address block (components/address-block.md) — a Nepal address as a cascading Province → District →
|
|
5
|
+
* Local level → Ward → Tole group. Each select is filtered by its parent (official lists,
|
|
6
|
+
* data/nepal-fields.yaml); changing a parent resets its children. Values are official codes, not
|
|
7
|
+
* free text. The app supplies the option lists and handles the cascade filtering.
|
|
8
|
+
*/
|
|
9
|
+
export interface AddressValue {
|
|
10
|
+
province?: string;
|
|
11
|
+
district?: string;
|
|
12
|
+
localLevel?: string;
|
|
13
|
+
ward?: string;
|
|
14
|
+
tole?: string;
|
|
15
|
+
}
|
|
16
|
+
interface AddressBlockProps {
|
|
17
|
+
legend: ReactNode;
|
|
18
|
+
value: AddressValue;
|
|
19
|
+
onChange: (next: AddressValue) => void;
|
|
20
|
+
provinces: SelectOption[];
|
|
21
|
+
/** Districts for the chosen province (app-filtered). */
|
|
22
|
+
districts: SelectOption[];
|
|
23
|
+
/** Local levels for the chosen district (app-filtered). */
|
|
24
|
+
localLevels: SelectOption[];
|
|
25
|
+
}
|
|
26
|
+
export declare function AddressBlock({ legend, value, onChange, provinces, districts, localLevels }: AddressBlockProps): import("react").JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=AddressBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddressBlock.d.ts","sourceRoot":"","sources":["../src/AddressBlock.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,wDAAwD;IACxD,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,2DAA2D;IAC3D,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,iBAAiB,+BAkB7G"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Select } from "./Select.js";
|
|
4
|
+
import { TextInput } from "./TextInput.js";
|
|
5
|
+
import { Stack } from "./layout.js";
|
|
6
|
+
export function AddressBlock({ legend, value, onChange, provinces, districts, localLevels }) {
|
|
7
|
+
const set = (patch) => onChange({ ...value, ...patch });
|
|
8
|
+
return (_jsxs("fieldset", { style: { border: 0, padding: 0, margin: 0 }, children: [_jsx("legend", { className: "gov-field__label", style: { marginBlockEnd: "var(--gov-space-3)" }, children: legend }), _jsxs(Stack, { gap: 4, children: [_jsx(Select, { label: "Province", placeholder: "Select your province", options: provinces, value: value.province ?? "", onChange: (e) => set({ province: e.target.value, district: "", localLevel: "" }) }), _jsx(Select, { label: "District", placeholder: "Select your district", options: districts, value: value.district ?? "", disabled: !value.province, onChange: (e) => set({ district: e.target.value, localLevel: "" }) }), _jsx(Select, { label: "Municipality / Rural Municipality", placeholder: "Select your local level", options: localLevels, value: value.localLevel ?? "", disabled: !value.district, onChange: (e) => set({ localLevel: e.target.value }) }), _jsx(TextInput, { label: "Ward", widthChars: 2, inputMode: "numeric", value: value.ward ?? "", onChange: (e) => set({ ward: e.target.value }) }), _jsx(TextInput, { label: "Tole / street", value: value.tole ?? "", onChange: (e) => set({ tole: e.target.value }) })] })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=AddressBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddressBlock.js","sourceRoot":"","sources":["../src/AddressBlock.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA4BpC,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAqB;IAC5G,MAAM,GAAG,GAAG,CAAC,KAA4B,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC/E,OAAO,CACL,oBAAU,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aACnD,iBAAQ,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAE,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAG,MAAM,GAAU,EACvG,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aAEX,KAAC,MAAM,IAAC,KAAK,EAAC,UAAU,EAAC,WAAW,EAAC,sBAAsB,EAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EACzG,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,GAAI,EACtF,KAAC,MAAM,IAAC,KAAK,EAAC,UAAU,EAAC,WAAW,EAAC,sBAAsB,EAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EACzG,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,GAAI,EACnG,KAAC,MAAM,IAAC,KAAK,EAAC,mCAAmC,EAAC,WAAW,EAAC,yBAAyB,EAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE,EACzI,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAI,EACrF,KAAC,SAAS,IAAC,KAAK,EAAC,MAAM,EAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAI,EACtI,KAAC,SAAS,IAAC,KAAK,EAAC,eAAe,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAI,IACtG,IACC,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Amount input (components/amount-input.md) — a currency field with the रु prefix. Built on
|
|
4
|
+
* TextInput's prefixed variant. Grouping (१,५०,०००, lakh/crore) is presentation applied by the app
|
|
5
|
+
* on the displayed value; the submitted machine value stays Arabic digits ungrouped (§3.1). The रु
|
|
6
|
+
* prefix is context, never a value the citizen types or deletes.
|
|
7
|
+
*/
|
|
8
|
+
interface AmountInputProps {
|
|
9
|
+
label: ReactNode;
|
|
10
|
+
id?: string;
|
|
11
|
+
hint?: ReactNode;
|
|
12
|
+
error?: ReactNode;
|
|
13
|
+
value?: string;
|
|
14
|
+
onChange?: (raw: string) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function AmountInput({ label, id, hint, error, value, onChange }: AmountInputProps): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=AmountInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmountInput.d.ts","sourceRoot":"","sources":["../src/AmountInput.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,UAAU,gBAAgB;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAcxF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { TextInput } from "./TextInput.js";
|
|
4
|
+
export function AmountInput({ label, id, hint, error, value, onChange }) {
|
|
5
|
+
return (_jsx(TextInput, { id: id, label: label, hint: hint, error: error, prefix: "\u0930\u0941", inputMode: "numeric", widthChars: 10, value: value, onChange: (e) => onChange?.(e.target.value.replace(/[^\d]/g, "")) }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=AmountInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmountInput.js","sourceRoot":"","sources":["../src/AmountInput.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkB3C,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAoB;IACvF,OAAO,CACL,KAAC,SAAS,IACR,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,MAAM,EAAC,cAAI,EACX,SAAS,EAAC,SAAS,EACnB,UAAU,EAAE,EAAE,EACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GACjE,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type StatusId } from "./generated/statusTaxonomy.js";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Application status tracker (components/application-status-tracker.md) — where a citizen's
|
|
5
|
+
* application is in the official status sequence (§7.4), rendered from the taxonomy. The current
|
|
6
|
+
* status is aria-current and stated in words; a status that requires action shows a next-step link
|
|
7
|
+
* beside it — a warning without a way to act is a dead end (§7.3.2).
|
|
8
|
+
*/
|
|
9
|
+
interface TrackerProps {
|
|
10
|
+
/** The taxonomy statuses this service moves through, in order. */
|
|
11
|
+
sequence: StatusId[];
|
|
12
|
+
current: StatusId;
|
|
13
|
+
/** A next-step action, shown beside the current status when it requires action. */
|
|
14
|
+
action?: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function ApplicationStatusTracker({ sequence, current, action, className }: TrackerProps): import("react").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=ApplicationStatusTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationStatusTracker.d.ts","sourceRoot":"","sources":["../src/ApplicationStatusTracker.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,UAAU,YAAY;IACpB,kEAAkE;IAClE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,QAAQ,CAAC;IAClB,mFAAmF;IACnF,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,+BA4B9F"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cx } from "./cx.js";
|
|
4
|
+
import { useTheme } from "./ThemeProvider.js";
|
|
5
|
+
import { STATUS_TAXONOMY } from "./generated/statusTaxonomy.js";
|
|
6
|
+
export function ApplicationStatusTracker({ sequence, current, action, className }) {
|
|
7
|
+
const { language } = useTheme();
|
|
8
|
+
const currentIndex = sequence.indexOf(current);
|
|
9
|
+
return (_jsx("ol", { className: cx("gov-status-tracker", className), children: sequence.map((id, i) => {
|
|
10
|
+
const entry = STATUS_TAXONOMY[id];
|
|
11
|
+
const label = language === "ne" ? entry.label_ne : entry.label;
|
|
12
|
+
const state = i < currentIndex ? "complete" : i === currentIndex ? "current" : "upcoming";
|
|
13
|
+
return (_jsxs("li", { className: cx("gov-status-tracker__step", state !== "upcoming" && `gov-status-tracker__step--${state}`), "aria-current": state === "current" ? "step" : undefined, children: [_jsx("span", { className: "gov-status-tracker__marker", "aria-hidden": "true", children: state === "complete" ? "✓" : "" }), _jsxs("span", { children: [label, state === "current" && entry.requiresAction && action && (_jsx("span", { style: { display: "block", marginBlockStart: "var(--gov-space-2)" }, children: action }))] })] }, id));
|
|
14
|
+
}) }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ApplicationStatusTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationStatusTracker.js","sourceRoot":"","sources":["../src/ApplicationStatusTracker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAiB,MAAM,+BAA+B,CAAC;AAkB/E,MAAM,UAAU,wBAAwB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAgB;IAC7F,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO,CACL,aAAI,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,YAC/C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YAC/D,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1F,OAAO,CACL,cAEE,SAAS,EAAE,EAAE,CAAC,0BAA0B,EAAE,KAAK,KAAK,UAAU,IAAI,6BAA6B,KAAK,EAAE,CAAC,kBACzF,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAEtD,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAAE,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAQ,EACxG,2BACG,KAAK,EACL,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,IAAI,MAAM,IAAI,CACxD,eAAM,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAG,MAAM,GAAQ,CAC3F,IACI,KAVF,EAAE,CAWJ,CACN,CAAC;QACJ,CAAC,CAAC,GACC,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface ApprovalDecisionPanelProps {
|
|
2
|
+
onApprove: () => void;
|
|
3
|
+
onRequestCorrection: (reason: string) => void;
|
|
4
|
+
onReject: (reason: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function ApprovalDecisionPanel({ onApprove, onRequestCorrection, onReject }: ApprovalDecisionPanelProps): import("react").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ApprovalDecisionPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDecisionPanel.d.ts","sourceRoot":"","sources":["../src/ApprovalDecisionPanel.tsx"],"names":[],"mappings":"AAiBA,UAAU,0BAA0B;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,0BAA0B,+BAoC7G"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Button } from "./Button.js";
|
|
5
|
+
import { ConfirmationDialog } from "./ConfirmationDialog.js";
|
|
6
|
+
import { Textarea } from "./Textarea.js";
|
|
7
|
+
import { useTheme } from "./ThemeProvider.js";
|
|
8
|
+
export function ApprovalDecisionPanel({ onApprove, onRequestCorrection, onReject }) {
|
|
9
|
+
const { language } = useTheme();
|
|
10
|
+
const [pending, setPending] = useState(null);
|
|
11
|
+
const [reason, setReason] = useState("");
|
|
12
|
+
const t = (ne, en) => (language === "ne" ? ne : en);
|
|
13
|
+
const close = () => { setPending(null); setReason(""); };
|
|
14
|
+
return (_jsxs("div", { className: "gov-cluster", children: [_jsx(Button, { type: "button", onClick: onApprove, children: t("निवेदन स्वीकृत गर्नुहोस्", "Approve application") }), _jsx(Button, { variant: "secondary", type: "button", onClick: () => setPending("correction"), children: t("सुधार अनुरोध गर्नुहोस्", "Request correction") }), _jsx(Button, { variant: "destructive", type: "button", onClick: () => setPending("reject"), children: t("निवेदन अस्वीकृत गर्नुहोस्", "Reject application") }), _jsx(ConfirmationDialog, { open: pending !== null, destructive: pending === "reject", title: pending === "reject" ? t("निवेदन अस्वीकृत गर्ने?", "Reject this application?") : t("सुधार अनुरोध गर्ने?", "Request a correction?"), confirmLabel: pending === "reject" ? t("अस्वीकृत गर्नुहोस्", "Reject application") : t("सुधार अनुरोध गर्नुहोस्", "Request correction"), onCancel: close, onConfirm: () => {
|
|
15
|
+
if (!reason.trim())
|
|
16
|
+
return; // A reason is required (§9.1).
|
|
17
|
+
if (pending === "reject")
|
|
18
|
+
onReject(reason);
|
|
19
|
+
else
|
|
20
|
+
onRequestCorrection(reason);
|
|
21
|
+
close();
|
|
22
|
+
}, children: _jsx(Textarea, { label: t("कारण (नागरिकलाई देखाइनेछ)", "Reason (shown to the citizen)"), value: reason, onChange: (e) => setReason(e.target.value), error: !reason.trim() ? t("कारण लेख्नुहोस्", "Enter a reason") : undefined }) })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ApprovalDecisionPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDecisionPanel.js","sourceRoot":"","sources":["../src/ApprovalDecisionPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Audit log item (components/audit-log-item.md) — one immutable audit-trail entry: who did what,
|
|
4
|
+
* when (NPT, labelled), from where, and why (§9.1). Reads as a coherent sentence to a screen reader;
|
|
5
|
+
* no interactive edit controls (audit entries are records, never edited).
|
|
6
|
+
*/
|
|
7
|
+
interface AuditLogItemProps {
|
|
8
|
+
actor: ReactNode;
|
|
9
|
+
action: ReactNode;
|
|
10
|
+
/** Already formatted in NPT with the timezone label. */
|
|
11
|
+
timestamp: ReactNode;
|
|
12
|
+
reason?: ReactNode;
|
|
13
|
+
reference?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function AuditLogItem({ actor, action, timestamp, reason, reference, className }: AuditLogItemProps): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=AuditLogItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogItem.d.ts","sourceRoot":"","sources":["../src/AuditLogItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AACH,UAAU,iBAAiB;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,wDAAwD;IACxD,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAazG"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./cx.js";
|
|
3
|
+
export function AuditLogItem({ actor, action, timestamp, reason, reference, className }) {
|
|
4
|
+
return (_jsxs("li", { className: cx("gov-audit-item", className), children: [_jsxs("div", { children: [_jsx("strong", { children: actor }), " ", action, reference && _jsxs(_Fragment, { children: [" \u00B7 ", _jsx("span", { className: "gov-audit-item__ref", children: reference })] })] }), _jsxs("div", { className: "gov-audit-item__meta", children: [timestamp, reason && _jsxs(_Fragment, { children: [" \u2014 ", reason] })] })] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=AuditLogItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogItem.js","sourceRoot":"","sources":["../src/AuditLogItem.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAiB7B,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAqB;IACxG,OAAO,CACL,cAAI,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,aAC5C,0BACE,2BAAS,KAAK,GAAU,OAAE,MAAM,EAC/B,SAAS,IAAI,0CAAK,eAAM,SAAS,EAAC,qBAAqB,YAAE,SAAS,GAAQ,IAAG,IAC1E,EACN,eAAK,SAAS,EAAC,sBAAsB,aAClC,SAAS,EACT,MAAM,IAAI,0CAAM,MAAM,IAAI,IACvB,IACH,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Bottom navigation (components/bottom-navigation.md) — the citizen mobile app's primary nav, fixed
|
|
4
|
+
* at the bottom. 3–5 destinations, each an icon PLUS a label (never icon-only, §5.4); the current
|
|
5
|
+
* one marked aria-current and by more than colour.
|
|
6
|
+
*/
|
|
7
|
+
export interface BottomNavItem {
|
|
8
|
+
label: ReactNode;
|
|
9
|
+
href: string;
|
|
10
|
+
icon: ReactNode;
|
|
11
|
+
current?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function BottomNavigation({ items, label, className }: {
|
|
14
|
+
items: BottomNavItem[];
|
|
15
|
+
label?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=BottomNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomNavigation.d.ts","sourceRoot":"","sources":["../src/BottomNavigation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAiB,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAWvI"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./cx.js";
|
|
3
|
+
export function BottomNavigation({ items, label = "Primary", className }) {
|
|
4
|
+
return (_jsx("nav", { "aria-label": label, className: cx("gov-bottom-nav", className), children: items.map((item, i) => (_jsxs("a", { href: item.href, className: "gov-bottom-nav__item", "aria-current": item.current ? "page" : undefined, children: [_jsx("span", { "aria-hidden": "true", children: item.icon }), item.label] }, i))) }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=BottomNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomNavigation.js","sourceRoot":"","sources":["../src/BottomNavigation.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAc7B,MAAM,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,SAAS,EAAkE;IACtI,OAAO,CACL,4BAAiB,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,YAC/D,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,aAAW,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAC,sBAAsB,kBAAe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAC1G,8BAAkB,MAAM,YAAE,IAAI,CAAC,IAAI,GAAQ,EAC1C,IAAI,CAAC,KAAK,KAFL,CAAC,CAGL,CACL,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Camera capture (components/camera-capture.md) — capture a document/portrait photo on a device, with
|
|
4
|
+
* quality guidance and a preview before accepting (§8.1.2). This component frames the capture flow
|
|
5
|
+
* and ALWAYS offers a file-upload fallback (no dead ends, §4.1); the actual getUserMedia handling is
|
|
6
|
+
* wired by the app (device/permission specifics vary), which passes the live view and controls in.
|
|
7
|
+
*/
|
|
8
|
+
interface CameraCaptureProps {
|
|
9
|
+
/** Plain framing guidance, e.g. "Fit the whole certificate in the frame". */
|
|
10
|
+
guidance: ReactNode;
|
|
11
|
+
/** The live viewfinder node from the app (a <video>), or a captured preview. */
|
|
12
|
+
view: ReactNode;
|
|
13
|
+
onCapture: () => void;
|
|
14
|
+
/** The file-upload fallback, always present. */
|
|
15
|
+
fallback: ReactNode;
|
|
16
|
+
captureLabel?: ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function CameraCapture({ guidance, view, onCapture, fallback, captureLabel, className }: CameraCaptureProps): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=CameraCapture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraCapture.d.ts","sourceRoot":"","sources":["../src/CameraCapture.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD;;;;;GAKG;AACH,UAAU,kBAAkB;IAC1B,6EAA6E;IAC7E,QAAQ,EAAE,SAAS,CAAC;IACpB,gFAAgF;IAChF,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gDAAgD;IAChD,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAA2B,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BAYhI"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { cx } from "./cx.js";
|
|
5
|
+
export function CameraCapture({ guidance, view, onCapture, fallback, captureLabel = "Take photo", className }) {
|
|
6
|
+
return (_jsxs("div", { className: cx("gov-camera-capture", className), children: [_jsx("p", { className: "gov-text-secondary", children: guidance }), _jsx("div", { className: "gov-capture-frame", children: view }), _jsx("div", { className: "gov-cluster", style: { marginBlockStart: "var(--gov-space-3)" }, children: _jsx("button", { type: "button", className: "gov-button gov-button--primary", onClick: onCapture, children: captureLabel }) }), _jsx("div", { style: { marginBlockStart: "var(--gov-space-4)" }, children: fallback })] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=CameraCapture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraCapture.js","sourceRoot":"","sources":["../src/CameraCapture.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAoB7B,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,EAAE,SAAS,EAAsB;IAC/H,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,aACjD,YAAG,SAAS,EAAC,oBAAoB,YAAE,QAAQ,GAAK,EAChD,cAAK,SAAS,EAAC,mBAAmB,YAAE,IAAI,GAAO,EAC/C,cAAK,SAAS,EAAC,aAAa,EAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAC5E,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,gCAAgC,EAAC,OAAO,EAAE,SAAS,YAAG,YAAY,GAAU,GACxG,EAEN,cAAK,KAAK,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAG,QAAQ,GAAO,IACpE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Biometric capture status (components/biometric-capture-status.md and the fingerprint/face/iris
|
|
4
|
+
* variants) — the live state of an officer-operated capture step. State is shown by icon + text +
|
|
5
|
+
* colour, never colour alone (§4.1), announced politely as it changes. The raw biometric sample is
|
|
6
|
+
* NEVER rendered here (§9.1) — only capture status and quality.
|
|
7
|
+
*
|
|
8
|
+
* One component covers the fingerprint / face / iris cases; the `kind` only affects the label.
|
|
9
|
+
*/
|
|
10
|
+
type CaptureState = "idle" | "capturing" | "pass" | "retry" | "error";
|
|
11
|
+
interface CaptureStatusProps {
|
|
12
|
+
state: CaptureState;
|
|
13
|
+
/** Plain message, e.g. "Captured — good quality" or "Move slightly and try again". */
|
|
14
|
+
message: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function CaptureStatus({ state, message, className }: CaptureStatusProps): import("react").JSX.Element;
|
|
18
|
+
/** Face capture frame — the viewfinder guide (never renders the sample; §9.1). */
|
|
19
|
+
export declare function FaceCaptureFrame({ children, className }: {
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
className?: string;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=CaptureStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureStatus.d.ts","sourceRoot":"","sources":["../src/CaptureStatus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;;;GAOG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAItE,UAAU,kBAAkB;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,sFAAsF;IACtF,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BAQ9E;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAMrG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "./cx.js";
|
|
3
|
+
const ICON = { idle: "○", capturing: "…", pass: "✓", retry: "↻", error: "✕" };
|
|
4
|
+
export function CaptureStatus({ state, message, className }) {
|
|
5
|
+
const tone = state === "pass" ? "pass" : state === "retry" ? "retry" : state === "error" ? "error" : "";
|
|
6
|
+
return (_jsxs("div", { className: cx("gov-capture-status", tone && `gov-capture-status--${tone}`, className), role: "status", "aria-live": "polite", children: [_jsx("span", { className: "gov-capture-status__icon", "aria-hidden": "true", children: ICON[state] }), _jsx("span", { children: message })] }));
|
|
7
|
+
}
|
|
8
|
+
/** Face capture frame — the viewfinder guide (never renders the sample; §9.1). */
|
|
9
|
+
export function FaceCaptureFrame({ children, className }) {
|
|
10
|
+
return (_jsx("div", { className: cx("gov-capture-frame", className), role: "img", "aria-label": "Face capture guide", children: children ?? "Align the face within the frame" }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=CaptureStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureStatus.js","sourceRoot":"","sources":["../src/CaptureStatus.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAY7B,MAAM,IAAI,GAAiC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAS5G,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAsB;IAC7E,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxG,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,IAAI,IAAI,uBAAuB,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,EAAC,QAAQ,eAAW,QAAQ,aAC1H,eAAM,SAAS,EAAC,0BAA0B,iBAAa,MAAM,YAAE,IAAI,CAAC,KAAK,CAAC,GAAQ,EAClF,yBAAO,OAAO,GAAQ,IAClB,CACP,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAgD;IACpG,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAAE,IAAI,EAAC,KAAK,gBAAY,oBAAoB,YAC3F,QAAQ,IAAI,iCAAiC,GAC1C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { type SummaryRow } from "./SummaryList.js";
|
|
3
|
+
/**
|
|
4
|
+
* Citizen profile card (components/citizen-profile-card.md) — an officer's view of a citizen's key
|
|
5
|
+
* details, name Nepali-first, sensitive identifiers masked by default (§9.1). Shows only the fields
|
|
6
|
+
* the officer's task needs (data minimisation); caste/ethnicity never in default views (§7.1). The
|
|
7
|
+
* app supplies rows whose sensitive values are already MaskedValue components.
|
|
8
|
+
*/
|
|
9
|
+
interface CitizenProfileCardProps {
|
|
10
|
+
nameNe: string;
|
|
11
|
+
nameEn?: string;
|
|
12
|
+
/** Detail rows; sensitive values should be MaskedValue instances (§9.1). */
|
|
13
|
+
rows: SummaryRow[];
|
|
14
|
+
photo?: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function CitizenProfileCard({ nameNe, nameEn, rows, photo, className }: CitizenProfileCardProps): import("react").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=CitizenProfileCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CitizenProfileCard.d.ts","sourceRoot":"","sources":["../src/CitizenProfileCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;GAKG;AACH,UAAU,uBAAuB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAarG"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card } from "./Card.js";
|
|
3
|
+
import { SummaryList } from "./SummaryList.js";
|
|
4
|
+
export function CitizenProfileCard({ nameNe, nameEn, rows, photo, className }) {
|
|
5
|
+
return (_jsxs(Card, { className: className, children: [_jsxs("div", { style: { display: "flex", gap: "var(--gov-space-4)", alignItems: "center" }, children: [photo && _jsx("div", { style: { flexShrink: 0 }, children: photo }), _jsxs("div", { children: [_jsx("h3", { style: { margin: 0 }, lang: "ne", children: nameNe }), nameEn && _jsx("p", { className: "gov-text-secondary", style: { margin: 0 }, lang: "en", children: nameEn })] })] }), _jsx(SummaryList, { rows: rows })] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=CitizenProfileCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CitizenProfileCard.js","sourceRoot":"","sources":["../src/CitizenProfileCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAiBhE,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAA2B;IACpG,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,SAAS,aACxB,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,aAC7E,KAAK,IAAI,cAAK,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,YAAG,KAAK,GAAO,EACtD,0BACE,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAC,IAAI,YAAE,MAAM,GAAM,EAChD,MAAM,IAAI,YAAG,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAC,IAAI,YAAE,MAAM,GAAK,IACrF,IACF,EACN,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,IACtB,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Cookie consent banner (components/cookie-banner.md) — opt-in consent for NON-essential cookies
|
|
4
|
+
* only (§9.1.2). Reject is exactly as prominent as Accept — no dark patterns. Non-blocking: it does
|
|
5
|
+
* not wall off public information, and the choice is revisitable from the footer (the app persists
|
|
6
|
+
* it). Strictly necessary cookies never trigger this.
|
|
7
|
+
*/
|
|
8
|
+
interface CookieBannerProps {
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
onAccept: () => void;
|
|
11
|
+
onReject: () => void;
|
|
12
|
+
acceptLabel?: ReactNode;
|
|
13
|
+
rejectLabel?: ReactNode;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function CookieBanner({ children, onAccept, onReject, acceptLabel, rejectLabel, className }: CookieBannerProps): import("react").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=CookieBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CookieBanner.d.ts","sourceRoot":"","sources":["../src/CookieBanner.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC;;;;;GAKG;AACH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAwC,EAAE,WAAsB,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAe5J"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cx } from "./cx.js";
|
|
4
|
+
import { Container } from "./layout.js";
|
|
5
|
+
import { Button } from "./Button.js";
|
|
6
|
+
export function CookieBanner({ children, onAccept, onReject, acceptLabel = "Accept analytics cookies", rejectLabel = "Reject", className }) {
|
|
7
|
+
return (_jsx("div", { className: cx("gov-cookie-banner", className), role: "region", "aria-label": "Cookie consent", children: _jsx(Container, { children: _jsxs("div", { className: "gov-cookie-banner__inner", children: [_jsx("div", { children: children }), _jsxs("div", { className: "gov-cookie-banner__actions", children: [_jsx(Button, { variant: "secondary", type: "button", onClick: onReject, children: rejectLabel }), _jsx(Button, { variant: "secondary", type: "button", onClick: onAccept, children: acceptLabel })] })] }) }) }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=CookieBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CookieBanner.js","sourceRoot":"","sources":["../src/CookieBanner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,GAAG,0BAA0B,EAAE,WAAW,GAAG,QAAQ,EAAE,SAAS,EAAqB;IAC3J,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAAE,IAAI,EAAC,QAAQ,gBAAY,gBAAgB,YAC3F,KAAC,SAAS,cACR,eAAK,SAAS,EAAC,0BAA0B,aACvC,wBAAM,QAAQ,GAAO,EAErB,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,QAAQ,YAAG,WAAW,GAAU,EACnF,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,QAAQ,YAAG,WAAW,GAAU,IAC/E,IACF,GACI,GACR,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Data grid (components/data-grid.md) — a dense, sortable officer table built on real table
|
|
4
|
+
* semantics. Sortable headers are buttons exposing aria-sort; never a div grid. Nepali text columns
|
|
5
|
+
* sort by Devanagari collation via a comparator the app can supply (§7.3). This adds sort to the
|
|
6
|
+
* table's semantics; row selection and sticky headers are opt-in via props/CSS.
|
|
7
|
+
*/
|
|
8
|
+
export interface GridColumn<T> {
|
|
9
|
+
key: string;
|
|
10
|
+
header: ReactNode;
|
|
11
|
+
render: (row: T) => ReactNode;
|
|
12
|
+
numeric?: boolean;
|
|
13
|
+
/** Return a comparable value for sorting; omit to make the column unsortable. */
|
|
14
|
+
sortValue?: (row: T) => string | number;
|
|
15
|
+
}
|
|
16
|
+
export declare function DataGrid<T>({ caption, columns, rows, getRowKey, locale, className }: {
|
|
17
|
+
caption?: ReactNode;
|
|
18
|
+
columns: GridColumn<T>[];
|
|
19
|
+
rows: T[];
|
|
20
|
+
getRowKey: (row: T, index: number) => string | number;
|
|
21
|
+
/** "ne" sorts Nepali columns with Devanagari collation (§7.3). */
|
|
22
|
+
locale?: string;
|
|
23
|
+
className?: string;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=DataGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.d.ts","sourceRoot":"","sources":["../src/DataGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAa,EAAE,SAAS,EAAE,EAAE;IAC3F,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IACtD,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAiDA"}
|
package/dist/DataGrid.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { cx } from "./cx.js";
|
|
5
|
+
export function DataGrid({ caption, columns, rows, getRowKey, locale = "en", className }) {
|
|
6
|
+
const [sort, setSort] = useState(null);
|
|
7
|
+
const sorted = (() => {
|
|
8
|
+
if (!sort)
|
|
9
|
+
return rows;
|
|
10
|
+
const col = columns.find((c) => c.key === sort.key);
|
|
11
|
+
if (!col?.sortValue)
|
|
12
|
+
return rows;
|
|
13
|
+
const collator = new Intl.Collator(locale === "ne" ? "ne-NP" : "en");
|
|
14
|
+
return [...rows].sort((a, b) => {
|
|
15
|
+
const av = col.sortValue(a);
|
|
16
|
+
const bv = col.sortValue(b);
|
|
17
|
+
const cmp = typeof av === "number" && typeof bv === "number" ? av - bv : collator.compare(String(av), String(bv));
|
|
18
|
+
return sort.dir === "asc" ? cmp : -cmp;
|
|
19
|
+
});
|
|
20
|
+
})();
|
|
21
|
+
const toggleSort = (key) => setSort((prev) => (prev?.key === key ? { key, dir: prev.dir === "asc" ? "desc" : "asc" } : { key, dir: "asc" }));
|
|
22
|
+
return (_jsxs("table", { className: cx("gov-table", className), children: [caption && _jsx("caption", { children: caption }), _jsx("thead", { children: _jsx("tr", { children: columns.map((col) => {
|
|
23
|
+
const ariaSort = sort?.key === col.key ? (sort.dir === "asc" ? "ascending" : "descending") : col.sortValue ? "none" : undefined;
|
|
24
|
+
return (_jsx("th", { scope: "col", "aria-sort": ariaSort, className: col.numeric ? "gov-table__num" : undefined, children: col.sortValue ? (_jsxs("button", { type: "button", className: "gov-icon-button", style: { minBlockSize: "auto", padding: 0, background: "none", font: "inherit", fontWeight: "inherit" }, onClick: () => toggleSort(col.key), children: [col.header, " ", sort?.key === col.key ? (sort.dir === "asc" ? "▲" : "▼") : "⇅"] })) : col.header }, col.key));
|
|
25
|
+
}) }) }), _jsx("tbody", { children: sorted.map((row, i) => (_jsx("tr", { children: columns.map((col) => (_jsx("td", { className: col.numeric ? "gov-table__num" : undefined, children: col.render(row) }, col.key))) }, getRowKey(row, i)))) })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=DataGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.js","sourceRoot":"","sources":["../src/DataGrid.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Date picker (components/date-picker.md) — accessible day/month/year fields, preferred over a custom
|
|
4
|
+
* calendar grid on citizen forms (more robust with assistive tech and low-end devices). BS leads in
|
|
5
|
+
* the Nepali UI, AD in English; conversion is never silent (§3.1). The `calendar` label is stated,
|
|
6
|
+
* not assumed. The machine value stays ISO/AD; this is the entry surface.
|
|
7
|
+
*/
|
|
8
|
+
export interface DateParts {
|
|
9
|
+
day?: string;
|
|
10
|
+
month?: string;
|
|
11
|
+
year?: string;
|
|
12
|
+
}
|
|
13
|
+
interface DatePickerProps {
|
|
14
|
+
legend: ReactNode;
|
|
15
|
+
/** Which calendar these fields are entered in — shown to the citizen, never assumed. */
|
|
16
|
+
calendar?: "BS" | "AD";
|
|
17
|
+
value: DateParts;
|
|
18
|
+
onChange: (parts: DateParts) => void;
|
|
19
|
+
error?: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export declare function DatePicker({ legend, calendar, value, onChange, error }: DatePickerProps): import("react").JSX.Element;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=DatePicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../src/DatePicker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,eAAe,+BAmBvF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { cx } from "./cx.js";
|
|
5
|
+
import { useTheme } from "./ThemeProvider.js";
|
|
6
|
+
export function DatePicker({ legend, calendar, value, onChange, error }) {
|
|
7
|
+
const { language } = useTheme();
|
|
8
|
+
const base = useId();
|
|
9
|
+
const cal = calendar ?? (language === "ne" ? "BS" : "AD");
|
|
10
|
+
const errorId = error ? `${base}-error` : undefined;
|
|
11
|
+
const set = (patch) => onChange({ ...value, ...patch });
|
|
12
|
+
const L = { day: language === "ne" ? "दिन" : "Day", month: language === "ne" ? "महिना" : "Month", year: language === "ne" ? "वर्ष" : "Year" };
|
|
13
|
+
return (_jsxs("fieldset", { style: { border: 0, padding: 0, margin: 0 }, "aria-describedby": errorId, children: [_jsxs("legend", { className: "gov-field__label", children: [legend, " (", cal, ")"] }), _jsxs("div", { className: "gov-cluster", style: { marginBlockStart: "var(--gov-space-2)" }, children: [_jsxs("label", { children: [L.day, _jsx("input", { className: "gov-input gov-input--width-2", inputMode: "numeric", maxLength: 2, value: value.day ?? "", onChange: (e) => set({ day: e.target.value.replace(/\D/g, "") }), "aria-invalid": error ? true : undefined })] }), _jsxs("label", { children: [L.month, _jsx("input", { className: "gov-input gov-input--width-2", inputMode: "numeric", maxLength: 2, value: value.month ?? "", onChange: (e) => set({ month: e.target.value.replace(/\D/g, "") }), "aria-invalid": error ? true : undefined })] }), _jsxs("label", { children: [L.year, _jsx("input", { className: "gov-input gov-input--width-4", inputMode: "numeric", maxLength: 4, value: value.year ?? "", onChange: (e) => set({ year: e.target.value.replace(/\D/g, "") }), "aria-invalid": error ? true : undefined })] })] }), error && _jsx("span", { className: "gov-field__error", id: errorId, children: error })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=DatePicker.js.map
|