@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.
Files changed (134) hide show
  1. package/dist/Accordion.d.ts +17 -0
  2. package/dist/Accordion.d.ts.map +1 -0
  3. package/dist/Accordion.js +19 -0
  4. package/dist/Accordion.js.map +1 -0
  5. package/dist/AddressBlock.d.ts +28 -0
  6. package/dist/AddressBlock.d.ts.map +1 -0
  7. package/dist/AddressBlock.js +10 -0
  8. package/dist/AddressBlock.js.map +1 -0
  9. package/dist/AmountInput.d.ts +18 -0
  10. package/dist/AmountInput.d.ts.map +1 -0
  11. package/dist/AmountInput.js +7 -0
  12. package/dist/AmountInput.js.map +1 -0
  13. package/dist/ApplicationStatusTracker.d.ts +19 -0
  14. package/dist/ApplicationStatusTracker.d.ts.map +1 -0
  15. package/dist/ApplicationStatusTracker.js +16 -0
  16. package/dist/ApplicationStatusTracker.js.map +1 -0
  17. package/dist/ApprovalDecisionPanel.d.ts +8 -0
  18. package/dist/ApprovalDecisionPanel.d.ts.map +1 -0
  19. package/dist/ApprovalDecisionPanel.js +24 -0
  20. package/dist/ApprovalDecisionPanel.js.map +1 -0
  21. package/dist/AuditLogItem.d.ts +18 -0
  22. package/dist/AuditLogItem.d.ts.map +1 -0
  23. package/dist/AuditLogItem.js +6 -0
  24. package/dist/AuditLogItem.js.map +1 -0
  25. package/dist/BottomNavigation.d.ts +18 -0
  26. package/dist/BottomNavigation.d.ts.map +1 -0
  27. package/dist/BottomNavigation.js +6 -0
  28. package/dist/BottomNavigation.js.map +1 -0
  29. package/dist/CameraCapture.d.ts +21 -0
  30. package/dist/CameraCapture.d.ts.map +1 -0
  31. package/dist/CameraCapture.js +8 -0
  32. package/dist/CameraCapture.js.map +1 -0
  33. package/dist/CaptureStatus.d.ts +24 -0
  34. package/dist/CaptureStatus.d.ts.map +1 -0
  35. package/dist/CaptureStatus.js +12 -0
  36. package/dist/CaptureStatus.js.map +1 -0
  37. package/dist/CitizenProfileCard.d.ts +19 -0
  38. package/dist/CitizenProfileCard.d.ts.map +1 -0
  39. package/dist/CitizenProfileCard.js +7 -0
  40. package/dist/CitizenProfileCard.js.map +1 -0
  41. package/dist/CookieBanner.d.ts +18 -0
  42. package/dist/CookieBanner.d.ts.map +1 -0
  43. package/dist/CookieBanner.js +9 -0
  44. package/dist/CookieBanner.js.map +1 -0
  45. package/dist/DataGrid.d.ts +25 -0
  46. package/dist/DataGrid.d.ts.map +1 -0
  47. package/dist/DataGrid.js +27 -0
  48. package/dist/DataGrid.js.map +1 -0
  49. package/dist/DatePicker.d.ts +23 -0
  50. package/dist/DatePicker.d.ts.map +1 -0
  51. package/dist/DatePicker.js +15 -0
  52. package/dist/DatePicker.js.map +1 -0
  53. package/dist/DocumentPreview.d.ts +18 -0
  54. package/dist/DocumentPreview.d.ts.map +1 -0
  55. package/dist/DocumentPreview.js +6 -0
  56. package/dist/DocumentPreview.js.map +1 -0
  57. package/dist/DuplicateMatchWarning.d.ts +16 -0
  58. package/dist/DuplicateMatchWarning.d.ts.map +1 -0
  59. package/dist/DuplicateMatchWarning.js +6 -0
  60. package/dist/DuplicateMatchWarning.js.map +1 -0
  61. package/dist/EmptyState.d.ts +13 -0
  62. package/dist/EmptyState.d.ts.map +1 -0
  63. package/dist/EmptyState.js +11 -0
  64. package/dist/EmptyState.js.map +1 -0
  65. package/dist/ExportAction.d.ts +15 -0
  66. package/dist/ExportAction.d.ts.map +1 -0
  67. package/dist/ExportAction.js +11 -0
  68. package/dist/ExportAction.js.map +1 -0
  69. package/dist/FeedbackWidget.d.ts +13 -0
  70. package/dist/FeedbackWidget.d.ts.map +1 -0
  71. package/dist/FeedbackWidget.js +17 -0
  72. package/dist/FeedbackWidget.js.map +1 -0
  73. package/dist/FileUpload.d.ts +19 -0
  74. package/dist/FileUpload.d.ts.map +1 -0
  75. package/dist/FileUpload.js +18 -0
  76. package/dist/FileUpload.js.map +1 -0
  77. package/dist/FilterBar.d.ts +26 -0
  78. package/dist/FilterBar.d.ts.map +1 -0
  79. package/dist/FilterBar.js +11 -0
  80. package/dist/FilterBar.js.map +1 -0
  81. package/dist/LoadingState.d.ts +17 -0
  82. package/dist/LoadingState.d.ts.map +1 -0
  83. package/dist/LoadingState.js +20 -0
  84. package/dist/LoadingState.js.map +1 -0
  85. package/dist/MaskedValue.d.ts +21 -0
  86. package/dist/MaskedValue.d.ts.map +1 -0
  87. package/dist/MaskedValue.js +18 -0
  88. package/dist/MaskedValue.js.map +1 -0
  89. package/dist/OfficerReviewPanel.d.ts +18 -0
  90. package/dist/OfficerReviewPanel.d.ts.map +1 -0
  91. package/dist/OfficerReviewPanel.js +7 -0
  92. package/dist/OfficerReviewPanel.js.map +1 -0
  93. package/dist/OfflineBanner.d.ts +11 -0
  94. package/dist/OfflineBanner.d.ts.map +1 -0
  95. package/dist/OfflineBanner.js +11 -0
  96. package/dist/OfflineBanner.js.map +1 -0
  97. package/dist/OtpInput.d.ts +21 -0
  98. package/dist/OtpInput.d.ts.map +1 -0
  99. package/dist/OtpInput.js +11 -0
  100. package/dist/OtpInput.js.map +1 -0
  101. package/dist/PasswordInput.d.ts +18 -0
  102. package/dist/PasswordInput.d.ts.map +1 -0
  103. package/dist/PasswordInput.js +18 -0
  104. package/dist/PasswordInput.js.map +1 -0
  105. package/dist/ProgressBar.d.ts +8 -0
  106. package/dist/ProgressBar.d.ts.map +1 -0
  107. package/dist/ProgressBar.js +18 -0
  108. package/dist/ProgressBar.js.map +1 -0
  109. package/dist/QrCode.d.ts +22 -0
  110. package/dist/QrCode.d.ts.map +1 -0
  111. package/dist/QrCode.js +6 -0
  112. package/dist/QrCode.js.map +1 -0
  113. package/dist/SearchBox.d.ts +16 -0
  114. package/dist/SearchBox.d.ts.map +1 -0
  115. package/dist/SearchBox.js +16 -0
  116. package/dist/SearchBox.js.map +1 -0
  117. package/dist/SessionTimeoutWarning.d.ts +17 -0
  118. package/dist/SessionTimeoutWarning.d.ts.map +1 -0
  119. package/dist/SessionTimeoutWarning.js +17 -0
  120. package/dist/SessionTimeoutWarning.js.map +1 -0
  121. package/dist/Sidebar.d.ts +16 -0
  122. package/dist/Sidebar.d.ts.map +1 -0
  123. package/dist/Sidebar.js +6 -0
  124. package/dist/Sidebar.js.map +1 -0
  125. package/dist/Table.d.ts +22 -0
  126. package/dist/Table.d.ts.map +1 -0
  127. package/dist/Table.js +6 -0
  128. package/dist/Table.js.map +1 -0
  129. package/dist/generated/statusTaxonomy.js +1 -1
  130. package/dist/index.d.ts +32 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +40 -0
  133. package/dist/index.js.map +1 -1
  134. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../src/DatePicker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAuB9C,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAmB;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,CAAC,KAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAE9I,OAAO,CACL,oBAAU,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,sBAAoB,OAAO,aAC9E,kBAAQ,SAAS,EAAC,kBAAkB,aAAE,MAAM,QAAI,GAAG,SAAW,EAC9D,eAAK,SAAS,EAAC,aAAa,EAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAC5E,4BAAQ,CAAC,CAAC,GAAG,EAAC,gBAAO,SAAS,EAAC,8BAA8B,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAgB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAI,IAAQ,EAC5O,4BAAQ,CAAC,CAAC,KAAK,EAAC,gBAAO,SAAS,EAAC,8BAA8B,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAgB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAI,IAAQ,EAClP,4BAAQ,CAAC,CAAC,IAAI,EAAC,gBAAO,SAAS,EAAC,8BAA8B,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAE,CAAC,EAAE,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,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAgB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAI,IAAQ,IAC3O,EACL,KAAK,IAAI,eAAM,SAAS,EAAC,kBAAkB,EAAC,EAAE,EAAE,OAAO,YAAG,KAAK,GAAQ,IAC/D,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Document preview (components/document-preview.md) — a bounded preview of an uploaded/generated
4
+ * document so the user can confirm it before proceeding (§8.1.2). The image alt describes what it is
5
+ * ("Preview of uploaded citizenship certificate"), never "image"; controls are labelled buttons.
6
+ */
7
+ interface DocumentPreviewProps {
8
+ src: string;
9
+ /** Describes the document, used as the alt text — never "image". */
10
+ alt: string;
11
+ fileName?: string;
12
+ fileSize?: string;
13
+ actions?: ReactNode;
14
+ className?: string;
15
+ }
16
+ export declare function DocumentPreview({ src, alt, fileName, fileSize, actions, className }: DocumentPreviewProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=DocumentPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentPreview.d.ts","sourceRoot":"","sources":["../src/DocumentPreview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AACH,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,+BAYzG"}
@@ -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 DocumentPreview({ src, alt, fileName, fileSize, actions, className }) {
4
+ return (_jsxs("div", { className: cx("gov-doc-preview", className), children: [_jsx("img", { src: src, alt: alt, style: { maxInlineSize: "100%", maxBlockSize: "16rem", border: "var(--gov-border-width-sm) solid var(--gov-color-border-default)", borderRadius: "var(--gov-radius-md)" } }), (fileName || fileSize) && (_jsxs("p", { className: "gov-text-secondary gov-text-small", children: [fileName, fileName && fileSize ? " · " : "", fileSize] })), actions && _jsx("div", { className: "gov-cluster", children: actions })] }));
5
+ }
6
+ //# sourceMappingURL=DocumentPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentPreview.js","sourceRoot":"","sources":["../src/DocumentPreview.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAiB7B,MAAM,UAAU,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAwB;IACxG,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,aAC9C,cAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,kEAAkE,EAAE,YAAY,EAAE,sBAAsB,EAAE,GAAI,EACrM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CACzB,aAAG,SAAS,EAAC,mCAAmC,aAC7C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,IACpD,CACL,EACA,OAAO,IAAI,cAAK,SAAS,EAAC,aAAa,YAAE,OAAO,GAAO,IACpD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Duplicate match warning (components/duplicate-match-warning.md) — during NID enrolment, a possible
4
+ * duplicate was found. It routes to HUMAN adjudication, never an auto-reject (a false match must not
5
+ * silently deny a citizen their identity). Announced assertively; compared identifiers are masked
6
+ * (§9.1). Non-accusatory language — a possible match is not proof.
7
+ */
8
+ interface DuplicateMatchWarningProps {
9
+ title?: ReactNode;
10
+ children: ReactNode;
11
+ /** The adjudication actions (confirm same / not a match / escalate). */
12
+ actions?: ReactNode;
13
+ }
14
+ export declare function DuplicateMatchWarning({ title, children, actions }: DuplicateMatchWarningProps): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=DuplicateMatchWarning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DuplicateMatchWarning.d.ts","sourceRoot":"","sources":["../src/DuplicateMatchWarning.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;GAKG;AACH,UAAU,0BAA0B;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,0BAA0B,+BAS7F"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert } from "./Alert.js";
3
+ export function DuplicateMatchWarning({ title, children, actions }) {
4
+ return (_jsxs("div", { children: [_jsx(Alert, { variant: "warning", title: title ?? "A possible duplicate record was found", live: true, children: children }), actions && _jsx("div", { className: "gov-cluster", style: { marginBlockStart: "var(--gov-space-3)" }, children: actions })] }));
5
+ }
6
+ //# sourceMappingURL=DuplicateMatchWarning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DuplicateMatchWarning.js","sourceRoot":"","sources":["../src/DuplicateMatchWarning.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAenC,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAA8B;IAC5F,OAAO,CACL,0BACE,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,EAAC,KAAK,EAAE,KAAK,IAAI,uCAAuC,EAAE,IAAI,kBACnF,QAAQ,GACH,EACP,OAAO,IAAI,cAAK,SAAS,EAAC,aAAa,EAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAG,OAAO,GAAO,IACvG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Empty state (components/empty-state.md) — explain why a list/results area is empty and what to do
4
+ * next. Never shown during loading (that is LoadingState); never a bare "No data". Distinguish
5
+ * no-data (nothing exists yet) from no-results (a filter excluded everything) via the message/action.
6
+ */
7
+ export declare function EmptyState({ title, children, action, className }: {
8
+ title: ReactNode;
9
+ children?: ReactNode;
10
+ action?: ReactNode;
11
+ className?: string;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAQpJ"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./cx.js";
3
+ /**
4
+ * Empty state (components/empty-state.md) — explain why a list/results area is empty and what to do
5
+ * next. Never shown during loading (that is LoadingState); never a bare "No data". Distinguish
6
+ * no-data (nothing exists yet) from no-results (a filter excluded everything) via the message/action.
7
+ */
8
+ export function EmptyState({ title, children, action, className }) {
9
+ return (_jsxs("div", { className: cx("gov-empty-state", className), children: [_jsx("p", { className: "gov-empty-state__title", children: title }), children && _jsx("p", { children: children }), action && _jsx("div", { className: "gov-empty-state__action", children: action })] }));
10
+ }
11
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../src/EmptyState.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAsF;IACnJ,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,aAC9C,YAAG,SAAS,EAAC,wBAAwB,YAAE,KAAK,GAAK,EAChD,QAAQ,IAAI,sBAAI,QAAQ,GAAK,EAC7B,MAAM,IAAI,cAAK,SAAS,EAAC,yBAAyB,YAAE,MAAM,GAAO,IAC9D,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Export action (components/export-action.md) — export the current data view to a file, stating the
4
+ * format (and, in copy, the scope). Sensitive fields follow the same masking/authorization rules on
5
+ * export (§9.1). Large exports should show progress (the app wires that).
6
+ */
7
+ interface ExportActionProps {
8
+ format: "CSV" | "PDF";
9
+ onExport: () => void;
10
+ exporting?: boolean;
11
+ children?: ReactNode;
12
+ }
13
+ export declare function ExportAction({ format, onExport, exporting, children }: ExportActionProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=ExportAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportAction.d.ts","sourceRoot":"","sources":["../src/ExportAction.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;GAIG;AACH,UAAU,iBAAiB;IACzB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAiB,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAShG"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Button } from "./Button.js";
4
+ import { useTheme } from "./ThemeProvider.js";
5
+ export function ExportAction({ format, onExport, exporting = false, children }) {
6
+ const { language } = useTheme();
7
+ const label = children ?? (language === "ne" ? `${format} मा निर्यात गर्नुहोस्` : `Export to ${format}`);
8
+ const busy = language === "ne" ? "निर्यात हुँदै…" : "Exporting…";
9
+ return (_jsx(Button, { variant: "secondary", type: "button", loading: exporting, loadingLabel: busy, onClick: onExport, children: label }));
10
+ }
11
+ //# sourceMappingURL=ExportAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportAction.js","sourceRoot":"","sources":["../src/ExportAction.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAc9C,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAqB;IAC/F,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,uBAAuB,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;IACjE,OAAO,CACL,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,YAChG,KAAK,GACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Feedback widget (components/feedback-widget.md) — the lightweight "was this page useful?" prompt
3
+ * plus a route to report a problem (guidelines/10-governance/03-governance.md). One-tap, never
4
+ * inserted mid-task, never a blocking modal, never bundled with analytics consent (§2.1, §9.1.2).
5
+ */
6
+ interface FeedbackWidgetProps {
7
+ onRespond: (useful: boolean) => void;
8
+ reportHref: string;
9
+ className?: string;
10
+ }
11
+ export declare function FeedbackWidget({ onRespond, reportHref, className }: FeedbackWidgetProps): import("react").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=FeedbackWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../src/FeedbackWidget.tsx"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,UAAU,mBAAmB;IAC3B,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB,+BAuBvF"}
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { cx } from "./cx.js";
5
+ import { useTheme } from "./ThemeProvider.js";
6
+ import { Button } from "./Button.js";
7
+ export function FeedbackWidget({ onRespond, reportHref, className }) {
8
+ const { language } = useTheme();
9
+ const [done, setDone] = useState(false);
10
+ const q = language === "ne" ? "के यो पृष्ठ उपयोगी थियो?" : "Was this page useful?";
11
+ const yes = language === "ne" ? "उपयोगी" : "Yes";
12
+ const no = language === "ne" ? "उपयोगी छैन" : "No";
13
+ const thanks = language === "ne" ? "धन्यवाद।" : "Thank you for your feedback.";
14
+ const report = language === "ne" ? "यस पृष्ठको समस्या रिपोर्ट गर्नुहोस्" : "Report a problem with this page";
15
+ return (_jsxs("div", { className: cx("gov-feedback", className), children: [done ? (_jsx("span", { children: thanks })) : (_jsxs(_Fragment, { children: [_jsx("span", { children: q }), _jsx(Button, { variant: "secondary", size: "sm", type: "button", onClick: () => { onRespond(true); setDone(true); }, children: yes }), _jsx(Button, { variant: "secondary", size: "sm", type: "button", onClick: () => { onRespond(false); setDone(true); }, children: no })] })), _jsx("a", { className: "gov-link", href: reportHref, children: report })] }));
16
+ }
17
+ //# sourceMappingURL=FeedbackWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackWidget.js","sourceRoot":"","sources":["../src/FeedbackWidget.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAuB;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACnF,MAAM,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,MAAM,EAAE,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA8B,CAAC;IAC/E,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,iCAAiC,CAAC;IAE7G,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,aAC1C,IAAI,CAAC,CAAC,CAAC,CACN,yBAAO,MAAM,GAAQ,CACtB,CAAC,CAAC,CAAC,CACF,8BACE,yBAAO,CAAC,GAAQ,EAChB,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAG,GAAG,GAAU,EACtH,KAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAG,EAAE,GAAU,IACrH,CACJ,EACD,YAAG,SAAS,EAAC,UAAU,EAAC,IAAI,EAAE,UAAU,YAAG,MAAM,GAAK,IAClD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * File upload (components/file-upload.md) — upload a document with the accepted types and size limit
4
+ * stated UP FRONT (before selection), via a real <input type="file"> with a bound label. Never a
5
+ * drag-only drop zone (§4.1 — no drag-only interactions). Errors say what to do, never "Error 413"
6
+ * (§3.1); the rest of the form is never lost on a failed upload (§7.1) — the app owns that.
7
+ */
8
+ interface FileUploadProps {
9
+ label: ReactNode;
10
+ id?: string;
11
+ /** e.g. ["jpg","png","pdf"] — stated before selection. */
12
+ accept?: string[];
13
+ maxMb?: number;
14
+ error?: ReactNode;
15
+ onSelect?: (file: File | null) => void;
16
+ }
17
+ export declare function FileUpload({ label, id, accept, maxMb, error, onSelect }: FileUploadProps): import("react").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=FileUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../src/FileUpload.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI9C;;;;;GAKG;AACH,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAA8B,EAAE,KAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,+BA2BpH"}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from "react";
4
+ import { cx } from "./cx.js";
5
+ import { useTheme } from "./ThemeProvider.js";
6
+ export function FileUpload({ label, id, accept = ["jpg", "png", "pdf"], maxMb = 5, error, onSelect }) {
7
+ const { language } = useTheme();
8
+ const generatedId = useId();
9
+ const fieldId = id ?? generatedId;
10
+ const hintId = `${fieldId}-hint`;
11
+ const errorId = error ? `${fieldId}-error` : undefined;
12
+ const types = accept.map((t) => t.toUpperCase()).join(", ");
13
+ const hint = language === "ne"
14
+ ? `${maxMb} MB भन्दा सानो ${types} फाइल अपलोड गर्नुहोस्`
15
+ : `Upload a ${types} smaller than ${maxMb} MB`;
16
+ return (_jsxs("div", { className: cx("gov-field", error ? "gov-field--error" : undefined), children: [_jsx("label", { className: "gov-field__label", htmlFor: fieldId, children: label }), _jsx("span", { className: "gov-field__hint", id: hintId, children: hint }), _jsx("input", { id: fieldId, type: "file", accept: accept.map((t) => `.${t}`).join(","), "aria-describedby": [hintId, errorId].filter(Boolean).join(" "), "aria-invalid": error ? true : undefined, onChange: (e) => onSelect?.(e.target.files?.[0] ?? null) }), error && _jsx("span", { className: "gov-field__error", id: errorId, children: error })] }));
17
+ }
18
+ //# sourceMappingURL=FileUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUpload.js","sourceRoot":"","sources":["../src/FileUpload.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAkB9C,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAmB;IACnH,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,WAAW,CAAC;IAClC,MAAM,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,IAAI,GACR,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,GAAG,KAAK,kBAAkB,KAAK,uBAAuB;QACxD,CAAC,CAAC,YAAY,KAAK,iBAAiB,KAAK,KAAK,CAAC;IAEnD,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,aACrE,gBAAO,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,OAAO,YAAG,KAAK,GAAS,EACrE,eAAM,SAAS,EAAC,iBAAiB,EAAC,EAAE,EAAE,MAAM,YAAG,IAAI,GAAQ,EAC3D,gBACE,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,sBAC1B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAC/C,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EACtC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GACxD,EACD,KAAK,IAAI,eAAM,SAAS,EAAC,kBAAkB,EAAC,EAAE,EAAE,OAAO,YAAG,KAAK,GAAQ,IACpE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Filter bar (components/filter-bar.md) — narrow a list/table by facets, with applied filters shown
4
+ * as removable tags so the current view is always clear. Each applied tag's remove control is a
5
+ * labelled icon-button ("Remove filter: …"); the updated result count is announced politely; the
6
+ * empty case uses empty-state's no-results with a "Clear filters" action. The app supplies the
7
+ * filter controls; this frames them plus the applied-tags row and count.
8
+ */
9
+ export interface AppliedFilter {
10
+ id: string;
11
+ label: ReactNode;
12
+ /** For the remove control's accessible name, e.g. "Under review". */
13
+ value: string;
14
+ }
15
+ interface FilterBarProps {
16
+ /** The filter controls (selects, date pickers). */
17
+ children: ReactNode;
18
+ applied: AppliedFilter[];
19
+ onRemove: (id: string) => void;
20
+ onClear: () => void;
21
+ resultCount?: number;
22
+ className?: string;
23
+ }
24
+ export declare function FilterBar({ children, applied, onRemove, onClear, resultCount, className }: FilterBarProps): import("react").JSX.Element;
25
+ export {};
26
+ //# sourceMappingURL=FilterBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBar.d.ts","sourceRoot":"","sources":["../src/FilterBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,mDAAmD;IACnD,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,cAAc,+BA4BzG"}
@@ -0,0 +1,11 @@
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
+ export function FilterBar({ children, applied, onRemove, onClear, resultCount, className }) {
6
+ const { language } = useTheme();
7
+ const clear = language === "ne" ? "फिल्टर हटाउनुहोस्" : "Clear filters";
8
+ const removeLabel = (v) => (language === "ne" ? `फिल्टर हटाउनुहोस्: ${v}` : `Remove filter: ${v}`);
9
+ return (_jsxs("div", { className: cx("gov-filter-bar", className), style: { display: "flex", flexDirection: "column", gap: "var(--gov-space-3)", padding: "var(--gov-space-4)", background: "var(--gov-color-background-secondary)", borderRadius: "var(--gov-radius-md)" }, children: [_jsx("div", { className: "gov-cluster", children: children }), applied.length > 0 && (_jsxs("div", { className: "gov-cluster", children: [applied.map((f) => (_jsxs("span", { className: "gov-tag", children: [f.label, _jsx("button", { type: "button", className: "gov-icon-button", style: { minInlineSize: "auto", minBlockSize: "auto", padding: 0 }, "aria-label": removeLabel(f.value), onClick: () => onRemove(f.id), children: _jsx("span", { "aria-hidden": "true", children: "\u2715" }) })] }, f.id))), _jsx("button", { type: "button", className: "gov-link", style: { background: "none", border: 0, cursor: "pointer" }, onClick: onClear, children: clear })] })), resultCount !== undefined && (_jsx("p", { className: "gov-text-secondary gov-text-small", "aria-live": "polite", children: language === "ne" ? `${resultCount} नतिजा` : `${resultCount} results` }))] }));
10
+ }
11
+ //# sourceMappingURL=FilterBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBar.js","sourceRoot":"","sources":["../src/FilterBar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA0B9C,MAAM,UAAU,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAkB;IACxG,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC;IACxE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAE3G,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,uCAAuC,EAAE,YAAY,EAAE,sBAAsB,EAAE,aACvP,cAAK,SAAS,EAAC,aAAa,YAAE,QAAQ,GAAO,EAC5C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,eAAK,SAAS,EAAC,aAAa,aACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,gBAAiB,SAAS,EAAC,SAAS,aACjC,CAAC,CAAC,KAAK,EACR,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,EAAC,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,gBAAc,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,YACnL,8BAAkB,MAAM,uBAAS,GAC1B,KAJA,CAAC,CAAC,EAAE,CAKR,CACR,CAAC,EACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,YAAG,KAAK,GAAU,IACtI,CACP,EACA,WAAW,KAAK,SAAS,IAAI,CAC5B,YAAG,SAAS,EAAC,mCAAmC,eAAW,QAAQ,YAChE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,UAAU,GACpE,CACL,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Loading state (components/loading-state.md) — content is on its way. Announced via role="status"
3
+ * with an accessible name; the animation is the one sanctioned continuous loop (§5.5) and collapses
4
+ * under reduced-motion (the status is still announced, so no information is lost). For a known-length
5
+ * operation with a percentage, use ProgressBar instead.
6
+ */
7
+ export declare function LoadingState({ label, className }: {
8
+ label?: string;
9
+ className?: string;
10
+ }): import("react").JSX.Element;
11
+ /** A skeleton placeholder shaped like the incoming content (pulses no faster than slow, §5.5). */
12
+ export declare function Skeleton({ width, height, className }: {
13
+ width?: string;
14
+ height?: string;
15
+ className?: string;
16
+ }): import("react").JSX.Element;
17
+ //# sourceMappingURL=LoadingState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingState.d.ts","sourceRoot":"","sources":["../src/LoadingState.tsx"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BASxF;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAc,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAErH"}
@@ -0,0 +1,20 @@
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
+ /**
6
+ * Loading state (components/loading-state.md) — content is on its way. Announced via role="status"
7
+ * with an accessible name; the animation is the one sanctioned continuous loop (§5.5) and collapses
8
+ * under reduced-motion (the status is still announced, so no information is lost). For a known-length
9
+ * operation with a percentage, use ProgressBar instead.
10
+ */
11
+ export function LoadingState({ label, className }) {
12
+ const { language } = useTheme();
13
+ const text = label ?? (language === "ne" ? "लोड हुँदै…" : "Loading…");
14
+ return (_jsxs("div", { className: cx("gov-loading", className), role: "status", children: [_jsx("span", { className: "gov-spinner", "aria-hidden": "true" }), _jsx("span", { className: "gov-visually-hidden", children: text })] }));
15
+ }
16
+ /** A skeleton placeholder shaped like the incoming content (pulses no faster than slow, §5.5). */
17
+ export function Skeleton({ width, height = "1em", className }) {
18
+ return _jsx("span", { className: cx("gov-skeleton", className), "aria-hidden": "true", style: { display: "block", inlineSize: width, blockSize: height } });
19
+ }
20
+ //# sourceMappingURL=LoadingState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingState.js","sourceRoot":"","sources":["../src/LoadingState.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAA0C;IACvF,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,IAAI,EAAC,QAAQ,aACzD,eAAM,SAAS,EAAC,aAAa,iBAAa,MAAM,GAAG,EACnD,eAAM,SAAS,EAAC,qBAAqB,YAAE,IAAI,GAAQ,IAC/C,CACP,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,EAA2D;IACpH,OAAO,eAAM,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,iBAAc,MAAM,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAI,CAAC;AAClJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Masked value (components/masked-value.md) — a sensitive identifier masked by default, revealed
3
+ * only by an explicit, permission-gated, audited action (§9.1). The reveal control is present only
4
+ * when `canReveal` is true (the role check happens in the app), and `onReveal` records the audit
5
+ * event. The masked state is announced as masked, not read digit by digit.
6
+ */
7
+ interface MaskedValueProps {
8
+ value: string;
9
+ /** How many trailing characters to show, e.g. 4 → ••••2345. */
10
+ visibleChars?: number;
11
+ /** Whether the current user's role permits revealing (§9.1). */
12
+ canReveal?: boolean;
13
+ /** Called when revealed — record the audit event (who/when). */
14
+ onReveal?: () => void;
15
+ /** What is revealed, for the control's accessible name, e.g. "citizenship number". */
16
+ name: string;
17
+ className?: string;
18
+ }
19
+ export declare function MaskedValue({ value, visibleChars, canReveal, onReveal, name, className }: MaskedValueProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=MaskedValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskedValue.d.ts","sourceRoot":"","sources":["../src/MaskedValue.tsx"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,YAAgB,EAAE,SAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,gBAAgB,+BA0BtH"}
@@ -0,0 +1,18 @@
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
+ import { useTheme } from "./ThemeProvider.js";
6
+ export function MaskedValue({ value, visibleChars = 4, canReveal = false, onReveal, name, className }) {
7
+ const { language } = useTheme();
8
+ const [revealed, setRevealed] = useState(false);
9
+ const masked = "••••" + value.slice(-visibleChars);
10
+ const show = language === "ne" ? `${name} देखाउनुहोस्` : `Show ${name}`;
11
+ const hide = language === "ne" ? `${name} लुकाउनुहोस्` : `Hide ${name}`;
12
+ return (_jsxs("span", { className: cx("gov-masked", className), children: [_jsx("span", { "aria-label": revealed ? undefined : `${name}, masked`, children: revealed ? value : masked }), canReveal && (_jsx("button", { type: "button", className: "gov-icon-button", "aria-label": revealed ? hide : show, "aria-pressed": revealed, onClick: () => {
13
+ if (!revealed)
14
+ onReveal?.();
15
+ setRevealed((r) => !r);
16
+ }, children: _jsx("span", { "aria-hidden": "true", children: revealed ? "🙈" : "👁" }) }))] }));
17
+ }
18
+ //# sourceMappingURL=MaskedValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskedValue.js","sourceRoot":"","sources":["../src/MaskedValue.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAqB9C,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAoB;IACrH,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;IAExE,OAAO,CACL,gBAAM,SAAS,EAAE,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,aAC1C,6BAAkB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,YAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAQ,EAC7F,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,iBAAiB,gBACf,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,kBACpB,QAAQ,EACtB,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,QAAQ;wBAAE,QAAQ,EAAE,EAAE,CAAC;oBAC5B,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,YAED,8BAAkB,MAAM,YAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAQ,GACjD,CACV,IACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Officer review panel (components/officer-review-panel.md) — the officer's working surface for a
4
+ * review (§7.4): the application's details, its documents, its history, and the decision actions,
5
+ * with clear landmark/heading structure so a screen-reader user can move between them. A composition
6
+ * shell; the sections are the profile card, document previews, status/audit, and the decision panel
7
+ * supplied by the app.
8
+ */
9
+ interface OfficerReviewPanelProps {
10
+ details: ReactNode;
11
+ documents?: ReactNode;
12
+ history?: ReactNode;
13
+ decision: ReactNode;
14
+ className?: string;
15
+ }
16
+ export declare function OfficerReviewPanel({ details, documents, history, decision, className }: OfficerReviewPanelProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=OfficerReviewPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfficerReviewPanel.d.ts","sourceRoot":"","sources":["../src/OfficerReviewPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;;;GAMG;AACH,UAAU,uBAAuB;IAC/B,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,uBAAuB,+BAW/G"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./cx.js";
3
+ import { Stack } from "./layout.js";
4
+ export function OfficerReviewPanel({ details, documents, history, decision, className }) {
5
+ return (_jsx("div", { className: cx("gov-review-panel", className), children: _jsxs(Stack, { gap: 8, children: [_jsx("section", { "aria-label": "Applicant details", children: details }), documents && _jsx("section", { "aria-label": "Documents", children: documents }), history && _jsx("section", { "aria-label": "History", children: history }), _jsx("section", { "aria-label": "Decision", children: decision })] }) }));
6
+ }
7
+ //# sourceMappingURL=OfficerReviewPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfficerReviewPanel.js","sourceRoot":"","sources":["../src/OfficerReviewPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAiBpC,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAA2B;IAC9G,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,SAAS,CAAC,YAC/C,MAAC,KAAK,IAAC,GAAG,EAAE,CAAC,aACX,gCAAoB,mBAAmB,YAAE,OAAO,GAAW,EAC1D,SAAS,IAAI,gCAAoB,WAAW,YAAE,SAAS,GAAW,EAClE,OAAO,IAAI,gCAAoB,SAAS,YAAE,OAAO,GAAW,EAC7D,gCAAoB,UAAU,YAAE,QAAQ,GAAW,IAC7C,GACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Offline banner (components/offline-banner.md) — the connection is lost; state what still works and
4
+ * how retry behaves (§8.1.2). Announced politely on appear; never colour alone — the sentence
5
+ * carries the meaning (§4.1). Driven by real connectivity detection in the app; never a dead end.
6
+ */
7
+ export declare function OfflineBanner({ children, className }: {
8
+ children: ReactNode;
9
+ className?: string;
10
+ }): import("react").JSX.Element;
11
+ //# sourceMappingURL=OfflineBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineBanner.d.ts","sourceRoot":"","sources":["../src/OfflineBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BASjG"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cx } from "./cx.js";
3
+ /**
4
+ * Offline banner (components/offline-banner.md) — the connection is lost; state what still works and
5
+ * how retry behaves (§8.1.2). Announced politely on appear; never colour alone — the sentence
6
+ * carries the meaning (§4.1). Driven by real connectivity detection in the app; never a dead end.
7
+ */
8
+ export function OfflineBanner({ children, className }) {
9
+ return (_jsxs("div", { className: cx("gov-offline-banner", className), role: "status", "aria-live": "polite", children: [_jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", "aria-hidden": "true", fill: "currentColor", children: _jsx("path", { d: "M12 2a10 10 0 100 20 10 10 0 000-20zm-1 5h2v6h-2V7zm0 8h2v2h-2v-2z" }) }), _jsx("span", { children: children })] }));
10
+ }
11
+ //# sourceMappingURL=OfflineBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineBanner.js","sourceRoot":"","sources":["../src/OfflineBanner.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IAChG,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAAE,IAAI,EAAC,QAAQ,eAAW,QAAQ,aACnF,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,IAAI,EAAC,cAAc,YACpF,eAAM,CAAC,EAAC,oEAAoE,GAAG,GAC3E,EACN,yBAAO,QAAQ,GAAQ,IACnB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * One-time-code input (components/otp-input.md) — enter a short SMS code. A single accessible field
4
+ * with autocomplete="one-time-code" and inputmode="numeric" so the OS offers autofill and pasting
5
+ * the whole code fills it. The resend control is disabled with a countdown; never allow instant
6
+ * infinite resend. A non-SMS fallback path is the app's responsibility (§8.1.6, citizens abroad).
7
+ */
8
+ interface OtpInputProps {
9
+ label: ReactNode;
10
+ id?: string;
11
+ length?: number;
12
+ error?: ReactNode;
13
+ value?: string;
14
+ onChange?: (code: string) => void;
15
+ /** Seconds until resend is allowed; the control is disabled until 0. */
16
+ resendIn?: number;
17
+ onResend?: () => void;
18
+ }
19
+ export declare function OtpInput({ label, id, length, error, value, onChange, resendIn, onResend }: OtpInputProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=OtpInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtpInput.d.ts","sourceRoot":"","sources":["../src/OtpInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C;;;;;GAKG;AACH,UAAU,aAAa;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAY,EAAE,QAAQ,EAAE,EAAE,aAAa,+BA0BhH"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from "react";
4
+ import { cx } from "./cx.js";
5
+ export function OtpInput({ label, id, length = 6, error, value, onChange, resendIn = 0, onResend }) {
6
+ const generatedId = useId();
7
+ const fieldId = id ?? generatedId;
8
+ const errorId = error ? `${fieldId}-error` : undefined;
9
+ return (_jsxs("div", { className: cx("gov-field", error ? "gov-field--error" : undefined), children: [_jsx("label", { className: "gov-field__label", htmlFor: fieldId, children: label }), _jsx("input", { id: fieldId, className: "gov-input gov-input--masked", style: { inlineSize: `${length + 4}ch` }, inputMode: "numeric", autoComplete: "one-time-code", maxLength: length, value: value, "aria-invalid": error ? true : undefined, "aria-describedby": errorId, onChange: (e) => onChange?.(e.target.value.replace(/[^\d]/g, "").slice(0, length)) }), _jsxs("button", { type: "button", className: "gov-link", disabled: resendIn > 0, onClick: onResend, style: { background: "none", border: 0, padding: 0, cursor: resendIn > 0 ? "not-allowed" : "pointer" }, children: ["Resend code", resendIn > 0 ? ` (available in ${resendIn}s)` : ""] }), error && _jsx("span", { className: "gov-field__error", id: errorId, children: error })] }));
10
+ }
11
+ //# sourceMappingURL=OtpInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OtpInput.js","sourceRoot":"","sources":["../src/OtpInput.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAoB7B,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAiB;IAC/G,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,WAAW,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvD,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,aACrE,gBAAO,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,OAAO,YAAG,KAAK,GAAS,EACrE,gBACE,EAAE,EAAE,OAAO,EACX,SAAS,EAAC,6BAA6B,EACvC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,EACxC,SAAS,EAAC,SAAS,EACnB,YAAY,EAAC,eAAe,EAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,kBACE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,sBACpB,OAAO,EACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAClF,EACF,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,UAAU,EAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,4BAC9K,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,IACvD,EACR,KAAK,IAAI,eAAM,SAAS,EAAC,kBAAkB,EAAC,EAAE,EAAE,OAAO,YAAG,KAAK,GAAQ,IACpE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type InputHTMLAttributes, type ReactNode } from "react";
2
+ /**
3
+ * Password input (components/password-input.md) — a password field with a show/hide toggle and NO
4
+ * paste-blocking (blocking paste breaks password managers and harms security, §4.1). The toggle is a
5
+ * real button whose accessible name reflects state (aria-pressed). Requirements are described up
6
+ * front via aria-describedby, never sprung as a post-submit gotcha.
7
+ */
8
+ interface PasswordInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "id" | "type"> {
9
+ label: ReactNode;
10
+ id?: string;
11
+ hint?: ReactNode;
12
+ error?: ReactNode;
13
+ /** current-password (sign-in) or new-password (create account) for manager integration. */
14
+ autoComplete?: "current-password" | "new-password";
15
+ }
16
+ export declare function PasswordInput({ label, id, hint, error, autoComplete, className, ...rest }: PasswordInputProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=PasswordInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordInput.d.ts","sourceRoot":"","sources":["../src/PasswordInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlF;;;;;GAKG;AACH,UAAU,kBAAmB,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC7F,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAAC;CACpD;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAiC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,+BAqClI"}
@@ -0,0 +1,18 @@
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
+ import { useTheme } from "./ThemeProvider.js";
6
+ export function PasswordInput({ label, id, hint, error, autoComplete = "current-password", className, ...rest }) {
7
+ const { language } = useTheme();
8
+ const generatedId = useId();
9
+ const fieldId = id ?? generatedId;
10
+ const hintId = hint ? `${fieldId}-hint` : undefined;
11
+ const errorId = error ? `${fieldId}-error` : undefined;
12
+ const describedBy = [hintId, errorId].filter(Boolean).join(" ") || undefined;
13
+ const [shown, setShown] = useState(false);
14
+ const show = language === "ne" ? "पासवर्ड देखाउनुहोस्" : "Show password";
15
+ const hide = language === "ne" ? "पासवर्ड लुकाउनुहोस्" : "Hide password";
16
+ return (_jsxs("div", { className: cx("gov-field", error ? "gov-field--error" : undefined), children: [_jsx("label", { className: "gov-field__label", htmlFor: fieldId, children: label }), hint && _jsx("span", { className: "gov-field__hint", id: hintId, children: hint }), _jsxs("span", { className: "gov-password", children: [_jsx("input", { id: fieldId, type: shown ? "text" : "password", className: cx("gov-input", className), autoComplete: autoComplete, "aria-describedby": describedBy, "aria-invalid": error ? true : undefined, ...rest }), _jsx("button", { type: "button", className: "gov-password__toggle", "aria-pressed": shown, "aria-label": shown ? hide : show, onClick: () => setShown((s) => !s), children: shown ? (language === "ne" ? "लुकाउनुहोस्" : "Hide") : (language === "ne" ? "देखाउनुहोस्" : "Show") })] }), error && (_jsxs("span", { className: "gov-field__error", id: errorId, children: [_jsx("svg", { className: "gov-field__error-icon", viewBox: "0 0 24 24", "aria-hidden": "true", fill: "currentColor", children: _jsx("path", { d: "M12 2a10 10 0 100 20 10 10 0 000-20zm-1 5h2v6h-2V7zm0 8h2v2h-2v-2z" }) }), error] }))] }));
17
+ }
18
+ //# sourceMappingURL=PasswordInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordInput.js","sourceRoot":"","sources":["../src/PasswordInput.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,QAAQ,EAA4C,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiB9C,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,kBAAkB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAsB;IACjI,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,WAAW,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;IAC7E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC;IACzE,MAAM,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC;IAEzE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,aACrE,gBAAO,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,OAAO,YAAG,KAAK,GAAS,EACpE,IAAI,IAAI,eAAM,SAAS,EAAC,iBAAiB,EAAC,EAAE,EAAE,MAAM,YAAG,IAAI,GAAQ,EACpE,gBAAM,SAAS,EAAC,cAAc,aAC5B,gBACE,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EACjC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EACrC,YAAY,EAAE,YAAY,sBACR,WAAW,kBACf,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,KAClC,IAAI,GACR,EACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,kBAAe,KAAK,gBAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAC5I,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAC7F,IACJ,EACN,KAAK,IAAI,CACR,gBAAM,SAAS,EAAC,kBAAkB,EAAC,EAAE,EAAE,OAAO,aAC5C,cAAK,SAAS,EAAC,uBAAuB,EAAC,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,IAAI,EAAC,cAAc,YAAC,eAAM,CAAC,EAAC,oEAAoE,GAAG,GAAM,EACtL,KAAK,IACD,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function ProgressBar({ value, max, label, className }: {
3
+ value: number;
4
+ max?: number;
5
+ label: ReactNode;
6
+ className?: string;
7
+ }): ReactNode;
8
+ //# sourceMappingURL=ProgressBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../src/ProgressBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAYvC,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,GAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAqBpJ"}