@tonzxz/government-forms 0.1.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 (325) hide show
  1. package/FORM_CATALOG.md +44 -0
  2. package/README.md +165 -0
  3. package/dist/definitions.d.ts +1147 -0
  4. package/dist/definitions.js +60 -0
  5. package/dist/forms/iar.d.ts +172 -0
  6. package/dist/forms/iar.js +6 -0
  7. package/dist/forms/ics.d.ts +48 -0
  8. package/dist/forms/ics.js +6 -0
  9. package/dist/forms/iirup.d.ts +54 -0
  10. package/dist/forms/iirup.js +6 -0
  11. package/dist/forms/iirusp.d.ts +32 -0
  12. package/dist/forms/iirusp.js +6 -0
  13. package/dist/forms/itr.d.ts +42 -0
  14. package/dist/forms/itr.js +6 -0
  15. package/dist/forms/par.d.ts +84 -0
  16. package/dist/forms/par.js +6 -0
  17. package/dist/forms/ppelc.d.ts +34 -0
  18. package/dist/forms/ppelc.js +6 -0
  19. package/dist/forms/pr.d.ts +27 -0
  20. package/dist/forms/pr.js +6 -0
  21. package/dist/forms/property-card.d.ts +68 -0
  22. package/dist/forms/property-card.js +6 -0
  23. package/dist/forms/ptr.d.ts +54 -0
  24. package/dist/forms/ptr.js +6 -0
  25. package/dist/forms/regspi.d.ts +32 -0
  26. package/dist/forms/regspi.js +6 -0
  27. package/dist/forms/ris.d.ts +66 -0
  28. package/dist/forms/ris.js +6 -0
  29. package/dist/forms/rlsddp.d.ts +54 -0
  30. package/dist/forms/rlsddp.js +6 -0
  31. package/dist/forms/rlsddsp.d.ts +42 -0
  32. package/dist/forms/rlsddsp.js +6 -0
  33. package/dist/forms/rpci.d.ts +32 -0
  34. package/dist/forms/rpci.js +6 -0
  35. package/dist/forms/rpcppe.d.ts +32 -0
  36. package/dist/forms/rpcppe.js +6 -0
  37. package/dist/forms/rpcsp.d.ts +32 -0
  38. package/dist/forms/rpcsp.js +6 -0
  39. package/dist/forms/rrsp.d.ts +32 -0
  40. package/dist/forms/rrsp.js +6 -0
  41. package/dist/forms/rsmi.d.ts +32 -0
  42. package/dist/forms/rsmi.js +6 -0
  43. package/dist/forms/rsmp.d.ts +33 -0
  44. package/dist/forms/rsmp.js +6 -0
  45. package/dist/forms/rspi.d.ts +32 -0
  46. package/dist/forms/rspi.js +6 -0
  47. package/dist/forms/spc.d.ts +37 -0
  48. package/dist/forms/spc.js +6 -0
  49. package/dist/forms/splc.d.ts +41 -0
  50. package/dist/forms/splc.js +6 -0
  51. package/dist/forms/stock-card.d.ts +28 -0
  52. package/dist/forms/stock-card.js +6 -0
  53. package/dist/forms/wmr.d.ts +32 -0
  54. package/dist/forms/wmr.js +6 -0
  55. package/dist/gam/components/gam-report-workbench.d.ts +40 -0
  56. package/dist/gam/components/gam-report-workbench.js +2 -0
  57. package/dist/gam/components/grand-total-computation.d.ts +10 -0
  58. package/dist/gam/components/grand-total-computation.js +26 -0
  59. package/dist/gam/components/iar-preview.d.ts +30 -0
  60. package/dist/gam/components/iar-preview.js +150 -0
  61. package/dist/gam/components/ics-preview.d.ts +31 -0
  62. package/dist/gam/components/ics-preview.js +114 -0
  63. package/dist/gam/components/iirup-preview.d.ts +42 -0
  64. package/dist/gam/components/iirup-preview.js +237 -0
  65. package/dist/gam/components/itr-preview.d.ts +31 -0
  66. package/dist/gam/components/itr-preview.js +180 -0
  67. package/dist/gam/components/par-preview.d.ts +28 -0
  68. package/dist/gam/components/par-preview.js +95 -0
  69. package/dist/gam/components/ppelc-preview.d.ts +28 -0
  70. package/dist/gam/components/ppelc-preview.js +128 -0
  71. package/dist/gam/components/property-card-preview.d.ts +21 -0
  72. package/dist/gam/components/property-card-preview.js +117 -0
  73. package/dist/gam/components/ptr-preview.d.ts +36 -0
  74. package/dist/gam/components/ptr-preview.js +122 -0
  75. package/dist/gam/components/purchase-order-page-client.d.ts +66 -0
  76. package/dist/gam/components/purchase-order-page-client.js +179 -0
  77. package/dist/gam/components/reg-spi-preview.d.ts +28 -0
  78. package/dist/gam/components/reg-spi-preview.js +138 -0
  79. package/dist/gam/components/ris-form.d.ts +13 -0
  80. package/dist/gam/components/ris-form.js +20 -0
  81. package/dist/gam/components/ris-preview.d.ts +7 -0
  82. package/dist/gam/components/ris-preview.js +16 -0
  83. package/dist/gam/components/rlsddp-preview.d.ts +34 -0
  84. package/dist/gam/components/rlsddp-preview.js +251 -0
  85. package/dist/gam/components/rlsddsp-preview.d.ts +33 -0
  86. package/dist/gam/components/rlsddsp-preview.js +226 -0
  87. package/dist/gam/components/rpci-preview.d.ts +27 -0
  88. package/dist/gam/components/rpci-preview.js +123 -0
  89. package/dist/gam/components/rpcppe-preview.d.ts +28 -0
  90. package/dist/gam/components/rpcppe-preview.js +133 -0
  91. package/dist/gam/components/rpcsp-preview.d.ts +29 -0
  92. package/dist/gam/components/rpcsp-preview.js +81 -0
  93. package/dist/gam/components/rspi-preview.d.ts +23 -0
  94. package/dist/gam/components/rspi-preview.js +72 -0
  95. package/dist/gam/components/spc-preview.d.ts +23 -0
  96. package/dist/gam/components/spc-preview.js +149 -0
  97. package/dist/gam/components/splc-entry-form.d.ts +14 -0
  98. package/dist/gam/components/splc-entry-form.js +6 -0
  99. package/dist/gam/components/splc-preview.d.ts +27 -0
  100. package/dist/gam/components/splc-preview.js +192 -0
  101. package/dist/gam/components/stock-card-preview.d.ts +14 -0
  102. package/dist/gam/components/stock-card-preview.js +17 -0
  103. package/dist/gam/config/new-report-config.d.ts +1094 -0
  104. package/dist/gam/config/new-report-config.js +1478 -0
  105. package/dist/gam/purchase-order-flow.d.ts +146 -0
  106. package/dist/gam/purchase-order-flow.js +173 -0
  107. package/dist/gam/purchase-request/workflow.d.ts +19 -0
  108. package/dist/gam/purchase-request/workflow.js +45 -0
  109. package/dist/gam/types/ris-types.d.ts +37 -0
  110. package/dist/gam/types/ris-types.js +1 -0
  111. package/dist/gam/utils/export-ics-xlsx.d.ts +28 -0
  112. package/dist/gam/utils/export-ics-xlsx.js +273 -0
  113. package/dist/gam/utils/export-par-xlsx.d.ts +18 -0
  114. package/dist/gam/utils/export-par-xlsx.js +181 -0
  115. package/dist/gam/utils/export-preview-pdf.d.ts +13 -0
  116. package/dist/gam/utils/export-preview-pdf.js +270 -0
  117. package/dist/gam/utils/export-report-xlsx.d.ts +228 -0
  118. package/dist/gam/utils/export-report-xlsx.js +873 -0
  119. package/dist/gam/utils/line-totals.d.ts +6 -0
  120. package/dist/gam/utils/line-totals.js +18 -0
  121. package/dist/gam/utils/monetary-input.d.ts +6 -0
  122. package/dist/gam/utils/monetary-input.js +18 -0
  123. package/dist/gam/utils/print-element.d.ts +8 -0
  124. package/dist/gam/utils/print-element.js +157 -0
  125. package/dist/government-form.d.ts +16 -0
  126. package/dist/government-form.js +45 -0
  127. package/dist/index.d.ts +49 -0
  128. package/dist/index.js +50 -0
  129. package/dist/internal/components/configurable-form-layout.d.ts +20 -0
  130. package/dist/internal/components/configurable-form-layout.js +49 -0
  131. package/dist/internal/components/ui/badge.d.ts +7 -0
  132. package/dist/internal/components/ui/badge.js +34 -0
  133. package/dist/internal/components/ui/button.d.ts +10 -0
  134. package/dist/internal/components/ui/button.js +35 -0
  135. package/dist/internal/components/ui/calendar.d.ts +8 -0
  136. package/dist/internal/components/ui/calendar.js +77 -0
  137. package/dist/internal/components/ui/command.d.ts +19 -0
  138. package/dist/internal/components/ui/command.js +36 -0
  139. package/dist/internal/components/ui/date-input.d.ts +14 -0
  140. package/dist/internal/components/ui/date-input.js +33 -0
  141. package/dist/internal/components/ui/date-picker.d.ts +19 -0
  142. package/dist/internal/components/ui/date-picker.js +34 -0
  143. package/dist/internal/components/ui/dialog.d.ts +18 -0
  144. package/dist/internal/components/ui/dialog.js +38 -0
  145. package/dist/internal/components/ui/input-group.d.ts +18 -0
  146. package/dist/internal/components/ui/input-group.js +57 -0
  147. package/dist/internal/components/ui/input.d.ts +3 -0
  148. package/dist/internal/components/ui/input.js +12 -0
  149. package/dist/internal/components/ui/label.d.ts +3 -0
  150. package/dist/internal/components/ui/label.js +7 -0
  151. package/dist/internal/components/ui/popover.d.ts +9 -0
  152. package/dist/internal/components/ui/popover.js +23 -0
  153. package/dist/internal/components/ui/select.d.ts +17 -0
  154. package/dist/internal/components/ui/select.js +35 -0
  155. package/dist/internal/components/ui/switch.d.ts +5 -0
  156. package/dist/internal/components/ui/switch.js +8 -0
  157. package/dist/internal/components/ui/table.d.ts +10 -0
  158. package/dist/internal/components/ui/table.js +28 -0
  159. package/dist/internal/components/ui/tabs.d.ts +10 -0
  160. package/dist/internal/components/ui/tabs.js +29 -0
  161. package/dist/internal/components/ui/textarea.d.ts +3 -0
  162. package/dist/internal/components/ui/textarea.js +7 -0
  163. package/dist/internal/components/ui/tooltip.d.ts +6 -0
  164. package/dist/internal/components/ui/tooltip.js +17 -0
  165. package/dist/internal/contracts/modules/v1/reg-spi-reports/reg-spi-reports.schema.d.ts +112 -0
  166. package/dist/internal/contracts/modules/v1/reg-spi-reports/reg-spi-reports.schema.js +91 -0
  167. package/dist/internal/hooks/use-form-field-order.d.ts +7 -0
  168. package/dist/internal/hooks/use-form-field-order.js +43 -0
  169. package/dist/internal/lib/utils.d.ts +2 -0
  170. package/dist/internal/lib/utils.js +3 -0
  171. package/dist/inventory/components/inventory-item-form.d.ts +7 -0
  172. package/dist/inventory/components/inventory-item-form.js +5 -0
  173. package/dist/inventory/components/inventory-item-preview.d.ts +6 -0
  174. package/dist/inventory/components/inventory-item-preview.js +5 -0
  175. package/dist/inventory/iar.d.ts +4 -0
  176. package/dist/inventory/iar.js +4 -0
  177. package/dist/inventory/ics.d.ts +2 -0
  178. package/dist/inventory/ics.js +3 -0
  179. package/dist/inventory/iirup.d.ts +2 -0
  180. package/dist/inventory/iirup.js +3 -0
  181. package/dist/inventory/iirusp.d.ts +4 -0
  182. package/dist/inventory/iirusp.js +4 -0
  183. package/dist/inventory/index.d.ts +3 -0
  184. package/dist/inventory/index.js +4 -0
  185. package/dist/inventory/item.d.ts +3 -0
  186. package/dist/inventory/item.js +3 -0
  187. package/dist/inventory/itr.d.ts +4 -0
  188. package/dist/inventory/itr.js +4 -0
  189. package/dist/inventory/par.d.ts +2 -0
  190. package/dist/inventory/par.js +3 -0
  191. package/dist/inventory/po.d.ts +2 -0
  192. package/dist/inventory/po.js +2 -0
  193. package/dist/inventory/ppelc.d.ts +2 -0
  194. package/dist/inventory/ppelc.js +3 -0
  195. package/dist/inventory/pplc.d.ts +2 -0
  196. package/dist/inventory/pplc.js +4 -0
  197. package/dist/inventory/pr.d.ts +4 -0
  198. package/dist/inventory/pr.js +4 -0
  199. package/dist/inventory/property-card.d.ts +2 -0
  200. package/dist/inventory/property-card.js +3 -0
  201. package/dist/inventory/ptr.d.ts +2 -0
  202. package/dist/inventory/ptr.js +3 -0
  203. package/dist/inventory/regspi.d.ts +4 -0
  204. package/dist/inventory/regspi.js +4 -0
  205. package/dist/inventory/ris.d.ts +4 -0
  206. package/dist/inventory/ris.js +4 -0
  207. package/dist/inventory/rlsddp.d.ts +4 -0
  208. package/dist/inventory/rlsddp.js +4 -0
  209. package/dist/inventory/rlsddsp.d.ts +2 -0
  210. package/dist/inventory/rlsddsp.js +3 -0
  211. package/dist/inventory/rpci.d.ts +2 -0
  212. package/dist/inventory/rpci.js +3 -0
  213. package/dist/inventory/rpcppe.d.ts +2 -0
  214. package/dist/inventory/rpcppe.js +3 -0
  215. package/dist/inventory/rpcsp.d.ts +2 -0
  216. package/dist/inventory/rpcsp.js +3 -0
  217. package/dist/inventory/rrsp.d.ts +2 -0
  218. package/dist/inventory/rrsp.js +3 -0
  219. package/dist/inventory/rsmi.d.ts +4 -0
  220. package/dist/inventory/rsmi.js +4 -0
  221. package/dist/inventory/rsmp.d.ts +4 -0
  222. package/dist/inventory/rsmp.js +4 -0
  223. package/dist/inventory/rspi.d.ts +2 -0
  224. package/dist/inventory/rspi.js +3 -0
  225. package/dist/inventory/spc.d.ts +2 -0
  226. package/dist/inventory/spc.js +3 -0
  227. package/dist/inventory/splc.d.ts +3 -0
  228. package/dist/inventory/splc.js +4 -0
  229. package/dist/inventory/stock-card.d.ts +4 -0
  230. package/dist/inventory/stock-card.js +4 -0
  231. package/dist/inventory/types.d.ts +11 -0
  232. package/dist/inventory/types.js +1 -0
  233. package/dist/inventory/wmr.d.ts +4 -0
  234. package/dist/inventory/wmr.js +4 -0
  235. package/dist/lib/rpcsp-accountable-person.d.ts +1 -0
  236. package/dist/lib/rpcsp-accountable-person.js +10 -0
  237. package/dist/reports/iar/_components/create-form.d.ts +13 -0
  238. package/dist/reports/iar/_components/create-form.js +92 -0
  239. package/dist/reports/iar/_components/document-preview.d.ts +11 -0
  240. package/dist/reports/iar/_components/document-preview.js +131 -0
  241. package/dist/reports/iar/types.d.ts +97 -0
  242. package/dist/reports/iar/types.js +24 -0
  243. package/dist/reports/iirusp/_components/create-form.d.ts +17 -0
  244. package/dist/reports/iirusp/_components/create-form.js +118 -0
  245. package/dist/reports/iirusp/_components/document-preview.d.ts +8 -0
  246. package/dist/reports/iirusp/_components/document-preview.js +389 -0
  247. package/dist/reports/iirusp/types.d.ts +134 -0
  248. package/dist/reports/iirusp/types.js +29 -0
  249. package/dist/reports/iirusp/utils.d.ts +29 -0
  250. package/dist/reports/iirusp/utils.js +488 -0
  251. package/dist/reports/itr/_components/create-form.d.ts +28 -0
  252. package/dist/reports/itr/_components/create-form.js +90 -0
  253. package/dist/reports/itr/_components/document-preview.d.ts +6 -0
  254. package/dist/reports/itr/_components/document-preview.js +7 -0
  255. package/dist/reports/itr/types.d.ts +68 -0
  256. package/dist/reports/itr/types.js +27 -0
  257. package/dist/reports/itr/utils.d.ts +24 -0
  258. package/dist/reports/itr/utils.js +76 -0
  259. package/dist/reports/pr/_components/create-form.d.ts +16 -0
  260. package/dist/reports/pr/_components/create-form.js +52 -0
  261. package/dist/reports/pr/_components/document-preview.d.ts +7 -0
  262. package/dist/reports/pr/_components/document-preview.js +9 -0
  263. package/dist/reports/pr/types.d.ts +69 -0
  264. package/dist/reports/pr/types.js +1 -0
  265. package/dist/reports/pr/utils.d.ts +72 -0
  266. package/dist/reports/pr/utils.js +572 -0
  267. package/dist/reports/regspi/_components/create-form.d.ts +19 -0
  268. package/dist/reports/regspi/_components/create-form.js +33 -0
  269. package/dist/reports/regspi/_components/document-preview.d.ts +6 -0
  270. package/dist/reports/regspi/_components/document-preview.js +7 -0
  271. package/dist/reports/regspi/types.d.ts +29 -0
  272. package/dist/reports/regspi/types.js +24 -0
  273. package/dist/reports/regspi/utils.d.ts +48 -0
  274. package/dist/reports/regspi/utils.js +98 -0
  275. package/dist/reports/ris/_components/create-form.d.ts +36 -0
  276. package/dist/reports/ris/_components/create-form.js +149 -0
  277. package/dist/reports/ris/_components/document-preview.d.ts +8 -0
  278. package/dist/reports/ris/_components/document-preview.js +31 -0
  279. package/dist/reports/ris/types.d.ts +93 -0
  280. package/dist/reports/ris/types.js +1 -0
  281. package/dist/reports/rlsddp/_components/create-form.d.ts +11 -0
  282. package/dist/reports/rlsddp/_components/create-form.js +165 -0
  283. package/dist/reports/rlsddp/_components/document-preview.d.ts +8 -0
  284. package/dist/reports/rlsddp/_components/document-preview.js +15 -0
  285. package/dist/reports/rlsddp/types.d.ts +105 -0
  286. package/dist/reports/rlsddp/types.js +31 -0
  287. package/dist/reports/rrsp/components/rrsp-preview.d.ts +21 -0
  288. package/dist/reports/rrsp/components/rrsp-preview.js +155 -0
  289. package/dist/reports/rsmi/components/rsmi-create-form.d.ts +20 -0
  290. package/dist/reports/rsmi/components/rsmi-create-form.js +8 -0
  291. package/dist/reports/rsmi/components/rsmi-document-body.d.ts +15 -0
  292. package/dist/reports/rsmi/components/rsmi-document-body.js +12 -0
  293. package/dist/reports/rsmi/components/rsmi-types.d.ts +45 -0
  294. package/dist/reports/rsmi/components/rsmi-types.js +1 -0
  295. package/dist/reports/rsmi/components/rsmi-utils.d.ts +2 -0
  296. package/dist/reports/rsmi/components/rsmi-utils.js +18 -0
  297. package/dist/reports/rsmp/components/rsmp-create-modal.d.ts +5 -0
  298. package/dist/reports/rsmp/components/rsmp-create-modal.js +7 -0
  299. package/dist/reports/rsmp/components/rsmp-preview-modal.d.ts +11 -0
  300. package/dist/reports/rsmp/components/rsmp-preview-modal.js +47 -0
  301. package/dist/reports/rsmp/components/rsmp-types.d.ts +44 -0
  302. package/dist/reports/rsmp/components/rsmp-types.js +1 -0
  303. package/dist/reports/rsmp/components/rsmp-utils.d.ts +5 -0
  304. package/dist/reports/rsmp/components/rsmp-utils.js +41 -0
  305. package/dist/reports/rsmp/lib/rsmp-grouping.d.ts +14 -0
  306. package/dist/reports/rsmp/lib/rsmp-grouping.js +75 -0
  307. package/dist/reports/stock-card/_components/create-form.d.ts +13 -0
  308. package/dist/reports/stock-card/_components/create-form.js +39 -0
  309. package/dist/reports/stock-card/_components/document-preview.d.ts +7 -0
  310. package/dist/reports/stock-card/_components/document-preview.js +29 -0
  311. package/dist/reports/stock-card/types.d.ts +31 -0
  312. package/dist/reports/stock-card/types.js +1 -0
  313. package/dist/reports/stock-card/utils.d.ts +32 -0
  314. package/dist/reports/stock-card/utils.js +248 -0
  315. package/dist/reports/wmr/_components/create-form.d.ts +22 -0
  316. package/dist/reports/wmr/_components/create-form.js +61 -0
  317. package/dist/reports/wmr/_components/document-preview.d.ts +10 -0
  318. package/dist/reports/wmr/_components/document-preview.js +59 -0
  319. package/dist/reports/wmr/types.d.ts +45 -0
  320. package/dist/reports/wmr/types.js +1 -0
  321. package/dist/reports/wmr/utils.d.ts +32 -0
  322. package/dist/reports/wmr/utils.js +343 -0
  323. package/dist/styles.css +4492 -0
  324. package/extraction-manifest.json +620 -0
  325. package/package.json +197 -0
@@ -0,0 +1,6 @@
1
+ export declare function computeLineTotal(physicalCountQty: string | number, unitValue: string | number): number;
2
+ export declare function computeGrandTotal(lines: ReadonlyArray<{
3
+ physicalCountQty: string | number;
4
+ unitValue: string | number;
5
+ }>): number;
6
+ export declare function fmtAmount(value: number): string;
@@ -0,0 +1,18 @@
1
+ // Shared Unit Value breakdown helpers for the physical-count reports
2
+ // (RPCPPE, RPCI, RPCSP). The per-line total and the report grand total are
3
+ // always derived from the line's physical-count quantity and unit value, so
4
+ // the displayed total can never drift from the underlying line data.
5
+ export function computeLineTotal(physicalCountQty, unitValue) {
6
+ const qty = Number(physicalCountQty) || 0;
7
+ const value = Number(unitValue) || 0;
8
+ return qty * value;
9
+ }
10
+ export function computeGrandTotal(lines) {
11
+ return lines.reduce((sum, line) => sum + computeLineTotal(line.physicalCountQty, line.unitValue), 0);
12
+ }
13
+ export function fmtAmount(value) {
14
+ return value.toLocaleString("en-PH", {
15
+ minimumFractionDigits: 2,
16
+ maximumFractionDigits: 2,
17
+ });
18
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Keeps a monetary input non-negative and limited to two decimal places.
3
+ * Formatting separators and other non-numeric characters are removed so the
4
+ * returned value is always safe to keep in a controlled text input.
5
+ */
6
+ export declare function sanitizeMonetaryInput(value: string): string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Keeps a monetary input non-negative and limited to two decimal places.
3
+ * Formatting separators and other non-numeric characters are removed so the
4
+ * returned value is always safe to keep in a controlled text input.
5
+ */
6
+ export function sanitizeMonetaryInput(value) {
7
+ const sanitized = value.replace(/[^\d.]/g, "");
8
+ const decimalPoint = sanitized.indexOf(".");
9
+ if (decimalPoint === -1) {
10
+ return sanitized;
11
+ }
12
+ const wholeNumber = sanitized.slice(0, decimalPoint) || "0";
13
+ const decimalPlaces = sanitized
14
+ .slice(decimalPoint + 1)
15
+ .replace(/\./g, "")
16
+ .slice(0, 2);
17
+ return `${wholeNumber}.${decimalPlaces}`;
18
+ }
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function printElement(root: HTMLElement, title?: string): Promise<void>;
3
+ /**
4
+ * Prints a fresh, naturally-sized React document. This is useful for previews
5
+ * displayed inside scaled modal panes, where capturing the live DOM can make
6
+ * Chromium mispaint row-spanning table headers in its native print pipeline.
7
+ */
8
+ export declare function printReactElement(content: ReactNode, title?: string): Promise<void>;
@@ -0,0 +1,157 @@
1
+ "use client";
2
+ import { createRoot } from "react-dom/client";
3
+ /**
4
+ * print-element.ts
5
+ *
6
+ * Opens the browser print dialog so the DOCUMENT FORM itself is printed —
7
+ * never the screen, the modal, or anything else on the page.
8
+ *
9
+ * Why this approach can't fail:
10
+ * - The preview is rendered with the SAME html2canvas pipeline the
11
+ * "Download PDF" buttons use. html2canvas captures ONLY the target element,
12
+ * so the modal/backdrop/app chrome are never part of the rendered output.
13
+ * - The rendered form is placed inside a hidden same-page iframe and the
14
+ * browser prints that iframe's document. There is no popup (popup blockers
15
+ * can't interfere) and no dependence on @media print rules hiding the rest
16
+ * of the page — the iframe document contains nothing but the form.
17
+ * - The print document requests A4 paper via @page and the sheet itself is
18
+ * sized exactly to A4 in millimeters (210×297 portrait, 297×210 landscape),
19
+ * so output is A4 in standards-compliant browsers — not the default paper
20
+ * size or a letterboxed/whitespace layout.
21
+ */
22
+ import { renderPreviewToCanvas } from "./export-preview-pdf.js";
23
+ // A4 dimensions in millimeters — portrait 210×297, landscape 297×210.
24
+ const A4_PORTRAIT_MM = { width: 210, height: 297 };
25
+ const A4_LANDSCAPE_MM = { width: 297, height: 210 };
26
+ function buildPrintHtml({ imageSrc, title, landscape, }) {
27
+ const safeTitle = title.replace(/[<>&"']/g, "");
28
+ const pageMm = landscape ? A4_LANDSCAPE_MM : A4_PORTRAIT_MM;
29
+ return `<!doctype html>
30
+ <html lang="en">
31
+ <head>
32
+ <meta charset="utf-8" />
33
+ <title>${safeTitle}</title>
34
+ <style>
35
+ @page {
36
+ size: A4 ${landscape ? "landscape" : "portrait"};
37
+ margin: 0;
38
+ }
39
+ html, body {
40
+ margin: 0;
41
+ padding: 0;
42
+ background: #fff;
43
+ }
44
+ /* The print sheet is exactly A4, so the form fills the sheet with no
45
+ browser-default paper size (e.g. Letter) or letterboxing involved. */
46
+ .print-stage {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ width: ${pageMm.width}mm;
51
+ height: ${pageMm.height}mm;
52
+ background: #fff;
53
+ }
54
+ .print-stage img {
55
+ display: block;
56
+ width: 100%;
57
+ height: 100%;
58
+ object-fit: contain;
59
+ }
60
+ </style>
61
+ </head>
62
+ <body>
63
+ <div class="print-stage">
64
+ <img src="${imageSrc}" alt="" />
65
+ </div>
66
+ </body>
67
+ </html>`;
68
+ }
69
+ export async function printElement(root, title = "Document") {
70
+ const cleanTitle = title.replace(/\.pdf$/i, "").trim() || "Document";
71
+ // Render the form exactly like the Download PDF buttons do. html2canvas
72
+ // only captures `root` (the document preview), so the modal can never
73
+ // appear in the printed output.
74
+ const { canvas, orientation } = await renderPreviewToCanvas(root);
75
+ const imageSrc = canvas.toDataURL("image/png");
76
+ const landscape = orientation === "landscape";
77
+ const iframe = document.createElement("iframe");
78
+ // Off-screen but not display:none — some browsers refuse to print
79
+ // display:none iframes. Sized to A4 proportions so layout is computed.
80
+ iframe.style.cssText = "position:fixed;top:0;left:-10000px;width:794px;height:1123px;border:0;";
81
+ iframe.srcdoc = buildPrintHtml({ imageSrc, title: cleanTitle, landscape });
82
+ iframe.setAttribute("aria-hidden", "true");
83
+ document.body.appendChild(iframe);
84
+ return new Promise(resolve => {
85
+ let settled = false;
86
+ let printTriggered = false;
87
+ let fallbackTimer;
88
+ const cleanup = () => {
89
+ if (settled)
90
+ return;
91
+ settled = true;
92
+ window.clearTimeout(safetyTimer);
93
+ if (fallbackTimer !== undefined)
94
+ window.clearTimeout(fallbackTimer);
95
+ iframe.remove();
96
+ resolve();
97
+ };
98
+ // Safety net — never leave the iframe behind if the dialog never closes.
99
+ const safetyTimer = window.setTimeout(cleanup, 60_000);
100
+ iframe.addEventListener("load", () => {
101
+ const frameWindow = iframe.contentWindow;
102
+ const frameDocument = iframe.contentDocument;
103
+ if (!frameWindow || !frameDocument) {
104
+ cleanup();
105
+ return;
106
+ }
107
+ const image = frameDocument.querySelector("img");
108
+ const firePrint = () => {
109
+ if (printTriggered)
110
+ return;
111
+ printTriggered = true;
112
+ frameWindow.focus();
113
+ frameWindow.print();
114
+ // Chrome fires "afterprint" on the printed window once the dialog
115
+ // closes. Listen there so cleanup happens right after.
116
+ frameWindow.addEventListener("afterprint", () => cleanup());
117
+ };
118
+ if (image && !image.complete) {
119
+ image.addEventListener("load", () => firePrint(), { once: true });
120
+ image.addEventListener("error", () => firePrint(), { once: true });
121
+ // Fallback: if the image stalls, still open the dialog.
122
+ fallbackTimer = window.setTimeout(() => firePrint(), 3000);
123
+ }
124
+ else {
125
+ firePrint();
126
+ }
127
+ });
128
+ iframe.addEventListener("error", () => cleanup());
129
+ });
130
+ }
131
+ /**
132
+ * Prints a fresh, naturally-sized React document. This is useful for previews
133
+ * displayed inside scaled modal panes, where capturing the live DOM can make
134
+ * Chromium mispaint row-spanning table headers in its native print pipeline.
135
+ */
136
+ export async function printReactElement(content, title = "Document") {
137
+ const container = document.createElement("div");
138
+ container.style.position = "fixed";
139
+ container.style.left = "-10000px";
140
+ container.style.top = "0";
141
+ container.style.width = "max-content";
142
+ container.style.background = "#fff";
143
+ container.style.zIndex = "-1";
144
+ document.body.appendChild(container);
145
+ const root = createRoot(container);
146
+ try {
147
+ root.render(content);
148
+ await new Promise(resolve => {
149
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
150
+ });
151
+ await printElement(container, title);
152
+ }
153
+ finally {
154
+ root.unmount();
155
+ container.remove();
156
+ }
157
+ }
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type FormCode, type FormDefinition, type FormErrors, type FormValues } from './definitions.js';
3
+ export type GovernmentFormProps = {
4
+ code: FormCode;
5
+ /** Override field definitions to match the agency. No configuration is sent to a server. */
6
+ definition?: FormDefinition;
7
+ value: FormValues;
8
+ onChange: (value: FormValues) => void;
9
+ onSubmit: (value: FormValues) => void | Promise<void>;
10
+ validate?: (value: FormValues) => FormErrors;
11
+ submitLabel?: string;
12
+ disabled?: boolean;
13
+ children?: ReactNode;
14
+ };
15
+ /** A controlled entry form for the repository's configurable report definitions. */
16
+ export declare function GovernmentForm({ code, definition, value, onChange, onSubmit, validate, submitLabel, disabled, children }: GovernmentFormProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useRef, useState } from 'react';
4
+ import { formDefinitions, validateFormValues } from './definitions.js';
5
+ /** A controlled entry form for the repository's configurable report definitions. */
6
+ export function GovernmentForm({ code, definition = formDefinitions[code], value, onChange, onSubmit, validate, submitLabel = 'Save document', disabled = false, children }) {
7
+ const prefix = useId();
8
+ const saving = useRef(false);
9
+ const [pending, setPending] = useState(false);
10
+ const [errors, setErrors] = useState({});
11
+ const [saveError, setSaveError] = useState('');
12
+ const summaryRef = useRef(null);
13
+ const locked = disabled || pending;
14
+ function input(field, current, key, change) {
15
+ const id = `${prefix}-${key}`;
16
+ const error = errors[key];
17
+ const readOnly = field.readonly || ('autoGenerate' in field && field.autoGenerate);
18
+ const props = { id, name: key, value: current, disabled: locked, required: field.required && !readOnly, 'aria-invalid': Boolean(error), 'aria-describedby': error ? `${id}-error` : undefined, className: 'qforms-input', onChange: (event) => change(event.target.value) };
19
+ return _jsxs("div", { className: "qforms-field", children: [_jsxs("label", { htmlFor: id, children: [field.label, props.required && _jsx("span", { "aria-hidden": "true", children: " *" })] }), field.type === 'textarea' ? _jsx("textarea", { ...props, readOnly: readOnly, placeholder: field.placeholder, rows: 3 }) : field.type === 'select' ? _jsxs("select", { ...props, disabled: locked || readOnly, children: [_jsxs("option", { value: "", children: ["Select ", field.label] }), field.options?.map(option => _jsx("option", { value: option, children: option }, option))] }) : _jsx("input", { ...props, readOnly: readOnly, placeholder: field.placeholder, type: field.type, step: field.numberType === 'int' ? 1 : 'any' }), error && _jsx("p", { id: `${id}-error`, className: "qforms-error", children: error })] }, key);
20
+ }
21
+ return _jsxs("form", { className: "qforms", noValidate: true, "aria-busy": pending, onSubmit: async (event) => {
22
+ event.preventDefault();
23
+ if (saving.current || disabled)
24
+ return;
25
+ const nextErrors = { ...validateFormValues(definition, value), ...validate?.(value) };
26
+ setErrors(nextErrors);
27
+ setSaveError('');
28
+ if (Object.keys(nextErrors).length) {
29
+ requestAnimationFrame(() => summaryRef.current?.focus());
30
+ return;
31
+ }
32
+ saving.current = true;
33
+ setPending(true);
34
+ try {
35
+ await onSubmit({ values: { ...value.values }, rows: value.rows.map(row => ({ ...row })) });
36
+ }
37
+ catch (error) {
38
+ setSaveError(error instanceof Error ? error.message : 'Unable to save. Please try again.');
39
+ }
40
+ finally {
41
+ saving.current = false;
42
+ setPending(false);
43
+ }
44
+ }, children: [_jsxs("header", { className: "qforms-header", children: [_jsx("p", { className: "qforms-code", children: definition.reportCode }), _jsx("h2", { children: definition.title }), _jsx("p", { children: definition.description })] }), Object.keys(errors).length > 0 && _jsxs("div", { ref: summaryRef, tabIndex: -1, role: "alert", className: "qforms-errors", children: [_jsx("strong", { children: "Review the form before saving." }), _jsx("ul", { children: Object.entries(errors).map(([key, error]) => _jsx("li", { children: _jsx("a", { href: `#${prefix}-${key}`, children: error }) }, key)) })] }), _jsx("div", { className: "qforms-grid", children: definition.fields.map(field => input(field, value.values[field.id] ?? '', `values.${field.id}`, next => onChange({ ...value, values: { ...value.values, [field.id]: next } }))) }), !!definition.tableFields?.length && _jsxs("section", { className: "qforms-lines", "aria-label": "Line items", children: [_jsxs("div", { className: "qforms-line-heading", children: [_jsx("h3", { children: "Line items" }), _jsx("button", { type: "button", disabled: locked, onClick: () => onChange({ ...value, rows: [...value.rows, Object.fromEntries(definition.tableFields.map(field => [field.id, '']))] }), children: "Add item" })] }), value.rows.map((row, index) => _jsxs("fieldset", { className: "qforms-row", children: [_jsxs("legend", { children: ["Item ", index + 1] }), _jsx("div", { className: "qforms-grid", children: definition.tableFields.map(field => input(field, row[field.id] ?? '', `rows.${index}.${field.id}`, next => onChange({ ...value, rows: value.rows.map((item, i) => i === index ? { ...item, [field.id]: next } : item) }))) }), _jsx("button", { type: "button", disabled: locked, "aria-label": `Remove item ${index + 1}`, onClick: () => { setErrors({}); onChange({ ...value, rows: value.rows.filter((_, i) => i !== index) }); }, children: "Remove item" })] }, index))] }), children, saveError && _jsx("p", { role: "alert", className: "qforms-error", children: saveError }), _jsx("footer", { children: _jsx("button", { type: "submit", disabled: locked, children: pending ? 'Saving…' : submitLabel }) })] });
45
+ }
@@ -0,0 +1,49 @@
1
+ export * from './gam/components/iar-preview.js';
2
+ export * from './gam/components/ics-preview.js';
3
+ export * from './gam/components/iirup-preview.js';
4
+ export * from './gam/components/itr-preview.js';
5
+ export * from './gam/components/par-preview.js';
6
+ export * from './gam/components/ppelc-preview.js';
7
+ export * from './gam/components/property-card-preview.js';
8
+ export * from './gam/components/ptr-preview.js';
9
+ export * from './gam/components/reg-spi-preview.js';
10
+ export * from './gam/components/ris-form.js';
11
+ export * from './gam/components/ris-preview.js';
12
+ export * from './gam/components/rlsddp-preview.js';
13
+ export * from './gam/components/rlsddsp-preview.js';
14
+ export * from './gam/components/rpci-preview.js';
15
+ export * from './gam/components/rpcppe-preview.js';
16
+ export * from './gam/components/rpcsp-preview.js';
17
+ export * from './gam/components/rspi-preview.js';
18
+ export * from './gam/components/spc-preview.js';
19
+ export * from './gam/components/splc-entry-form.js';
20
+ export * from './gam/components/splc-preview.js';
21
+ export * from './gam/components/stock-card-preview.js';
22
+ export * from './reports/iar/_components/create-form.js';
23
+ export * from './reports/iar/_components/document-preview.js';
24
+ export * from './reports/iirusp/_components/create-form.js';
25
+ export * from './reports/iirusp/_components/document-preview.js';
26
+ export { CreateForm as ItrCreateForm } from './reports/itr/_components/create-form.js';
27
+ export * from './reports/pr/_components/create-form.js';
28
+ export * from './reports/pr/_components/document-preview.js';
29
+ export { CreateForm as RegSpiCreateForm } from './reports/regspi/_components/create-form.js';
30
+ export * from './reports/ris/_components/create-form.js';
31
+ export * from './reports/ris/_components/document-preview.js';
32
+ export * from './reports/rlsddp/_components/create-form.js';
33
+ export * from './reports/rlsddp/_components/document-preview.js';
34
+ export * from './reports/stock-card/_components/create-form.js';
35
+ export * from './reports/stock-card/_components/document-preview.js';
36
+ export * from './reports/wmr/_components/create-form.js';
37
+ export * from './reports/wmr/_components/document-preview.js';
38
+ export * from './reports/rsmi/components/rsmi-create-form.js';
39
+ export * from './reports/rsmi/components/rsmi-document-body.js';
40
+ export * from './reports/rrsp/components/rrsp-preview.js';
41
+ export * from './reports/rsmp/components/rsmp-preview-modal.js';
42
+ export * from './definitions.js';
43
+ export * from './government-form.js';
44
+ export { ConfigurableFormLayout, type FormFieldConfig } from './internal/components/configurable-form-layout.js';
45
+ export { RsmpCreateForm } from './reports/rsmp/components/rsmp-create-modal.js';
46
+ export * from './inventory/components/inventory-item-form.js';
47
+ export * from './inventory/components/inventory-item-preview.js';
48
+ export * from './inventory/types.js';
49
+ export * from './gam/components/purchase-order-page-client.js';
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ export * from './gam/components/iar-preview.js';
3
+ export * from './gam/components/ics-preview.js';
4
+ export * from './gam/components/iirup-preview.js';
5
+ export * from './gam/components/itr-preview.js';
6
+ export * from './gam/components/par-preview.js';
7
+ export * from './gam/components/ppelc-preview.js';
8
+ export * from './gam/components/property-card-preview.js';
9
+ export * from './gam/components/ptr-preview.js';
10
+ export * from './gam/components/reg-spi-preview.js';
11
+ export * from './gam/components/ris-form.js';
12
+ export * from './gam/components/ris-preview.js';
13
+ export * from './gam/components/rlsddp-preview.js';
14
+ export * from './gam/components/rlsddsp-preview.js';
15
+ export * from './gam/components/rpci-preview.js';
16
+ export * from './gam/components/rpcppe-preview.js';
17
+ export * from './gam/components/rpcsp-preview.js';
18
+ export * from './gam/components/rspi-preview.js';
19
+ export * from './gam/components/spc-preview.js';
20
+ export * from './gam/components/splc-entry-form.js';
21
+ export * from './gam/components/splc-preview.js';
22
+ export * from './gam/components/stock-card-preview.js';
23
+ export * from './reports/iar/_components/create-form.js';
24
+ export * from './reports/iar/_components/document-preview.js';
25
+ export * from './reports/iirusp/_components/create-form.js';
26
+ export * from './reports/iirusp/_components/document-preview.js';
27
+ export { CreateForm as ItrCreateForm } from './reports/itr/_components/create-form.js';
28
+ export * from './reports/pr/_components/create-form.js';
29
+ export * from './reports/pr/_components/document-preview.js';
30
+ export { CreateForm as RegSpiCreateForm } from './reports/regspi/_components/create-form.js';
31
+ export * from './reports/ris/_components/create-form.js';
32
+ export * from './reports/ris/_components/document-preview.js';
33
+ export * from './reports/rlsddp/_components/create-form.js';
34
+ export * from './reports/rlsddp/_components/document-preview.js';
35
+ export * from './reports/stock-card/_components/create-form.js';
36
+ export * from './reports/stock-card/_components/document-preview.js';
37
+ export * from './reports/wmr/_components/create-form.js';
38
+ export * from './reports/wmr/_components/document-preview.js';
39
+ export * from './reports/rsmi/components/rsmi-create-form.js';
40
+ export * from './reports/rsmi/components/rsmi-document-body.js';
41
+ export * from './reports/rrsp/components/rrsp-preview.js';
42
+ export * from './reports/rsmp/components/rsmp-preview-modal.js';
43
+ export * from './definitions.js';
44
+ export * from './government-form.js';
45
+ export { ConfigurableFormLayout } from './internal/components/configurable-form-layout.js';
46
+ export { RsmpCreateForm } from './reports/rsmp/components/rsmp-create-modal.js';
47
+ export * from './inventory/components/inventory-item-form.js';
48
+ export * from './inventory/components/inventory-item-preview.js';
49
+ export * from './inventory/types.js';
50
+ export * from './gam/components/purchase-order-page-client.js';
@@ -0,0 +1,20 @@
1
+ import { type ReactNode } from "react";
2
+ export interface FormFieldConfig {
3
+ id: string;
4
+ /** Label shown in the card header and in configure mode */
5
+ label: string;
6
+ /** When true, the card spans both columns of the grid */
7
+ fullWidth?: boolean;
8
+ /** Render ONLY the input/select/textarea — no label needed, the card provides it */
9
+ render: () => ReactNode;
10
+ }
11
+ interface ConfigurableFormLayoutProps {
12
+ /** Unique key used to persist field order in localStorage */
13
+ formKey: string;
14
+ fields: FormFieldConfig[];
15
+ /** Pinned slot rendered above the draggable grid (e.g. auto-number card) */
16
+ header?: ReactNode;
17
+ className?: string;
18
+ }
19
+ export declare function ConfigurableFormLayout({ formKey, fields, header, className, }: ConfigurableFormLayoutProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors, } from "@dnd-kit/core";
4
+ import { SortableContext, arrayMove, rectSortingStrategy, sortableKeyboardCoordinates, useSortable, } from "@dnd-kit/sortable";
5
+ import { CSS } from "@dnd-kit/utilities";
6
+ import { cn } from "../lib/utils.js";
7
+ import { useFormFieldOrder } from "../hooks/use-form-field-order.js";
8
+ function GripHandle() {
9
+ return (_jsxs("svg", { width: "10", height: "16", viewBox: "0 0 10 16", fill: "currentColor", "aria-hidden": "true", className: "shrink-0 text-current", children: [_jsx("circle", { cx: "2", cy: "2.5", r: "1.5" }), _jsx("circle", { cx: "2", cy: "8", r: "1.5" }), _jsx("circle", { cx: "2", cy: "13.5", r: "1.5" }), _jsx("circle", { cx: "8", cy: "2.5", r: "1.5" }), _jsx("circle", { cx: "8", cy: "8", r: "1.5" }), _jsx("circle", { cx: "8", cy: "13.5", r: "1.5" })] }));
10
+ }
11
+ function SortableFieldCard({ field, isConfiguring }) {
12
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
13
+ id: field.id,
14
+ disabled: !isConfiguring,
15
+ });
16
+ return (_jsxs("div", { ref: setNodeRef, style: {
17
+ transform: CSS.Transform.toString(transform),
18
+ transition,
19
+ zIndex: isDragging ? 50 : undefined,
20
+ }, className: cn("rounded-lg border bg-card p-3 transition-shadow", field.fullWidth && "col-span-2", isConfiguring
21
+ ? [
22
+ "border-primary/40 bg-primary/5 ring-1 ring-primary/20",
23
+ isDragging && "scale-[1.02] shadow-xl opacity-75 ring-2 ring-primary/50",
24
+ ]
25
+ : "border-border"), children: [_jsxs("div", { className: "mb-1.5 flex items-center justify-between gap-2", children: [_jsx("span", { className: "text-foreground/85 select-none text-xs font-medium", children: field.label }), isConfiguring && (_jsx("button", { type: "button", "aria-label": `Drag to reorder ${field.label}`, className: "cursor-grab rounded p-0.5 text-muted-foreground/60 hover:bg-primary/10 hover:text-primary active:cursor-grabbing", ...listeners, ...attributes, children: _jsx(GripHandle, {}) }))] }), field.render()] }));
26
+ }
27
+ export function ConfigurableFormLayout({ formKey, fields, header, className, }) {
28
+ const defaultIds = fields.map(f => f.id);
29
+ const { order, setOrder, resetOrder, isConfiguring, setIsConfiguring } = useFormFieldOrder(formKey, defaultIds);
30
+ const orderedFields = order
31
+ .map(id => fields.find(f => f.id === id))
32
+ .filter((f) => f !== undefined);
33
+ const sensors = useSensors(useSensor(PointerSensor, {
34
+ activationConstraint: { distance: 8 },
35
+ }), useSensor(KeyboardSensor, {
36
+ coordinateGetter: sortableKeyboardCoordinates,
37
+ }));
38
+ function handleDragEnd(event) {
39
+ const { active, over } = event;
40
+ if (over && active.id !== over.id) {
41
+ const oldIndex = order.indexOf(active.id);
42
+ const newIndex = order.indexOf(over.id);
43
+ setOrder(arrayMove(order, oldIndex, newIndex));
44
+ }
45
+ }
46
+ return (_jsxs("div", { className: cn("space-y-3", className), children: [_jsxs("div", { className: "flex items-center justify-end gap-2.5", children: [isConfiguring && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Drag fields to reorder" }), _jsx("button", { type: "button", onClick: resetOrder, className: "text-xs text-muted-foreground underline underline-offset-2 hover:text-foreground", children: "Reset" })] })), _jsx("button", { type: "button", onClick: () => setIsConfiguring(prev => !prev), className: cn("flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs font-medium transition-colors", isConfiguring
47
+ ? "bg-primary text-primary-foreground hover:bg-primary/90"
48
+ : "border border-input text-muted-foreground hover:bg-muted"), children: isConfiguring ? (_jsxs(_Fragment, { children: [_jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "currentColor", "aria-hidden": "true", children: _jsx("path", { d: "M1 5.5L3.5 8L9 2", stroke: "currentColor", strokeWidth: "1.5", fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }), "Done"] })) : (_jsxs(_Fragment, { children: [_jsxs("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.4", "aria-hidden": "true", children: [_jsx("circle", { cx: "6", cy: "6", r: "1.5" }), _jsx("path", { d: "M6 1v1.5M6 9.5V11M1 6h1.5M9.5 6H11M2.4 2.4l1.06 1.06M8.54 8.54l1.06 1.06M2.4 9.6l1.06-1.06M8.54 3.46l1.06-1.06", strokeLinecap: "round" })] }), "Configure Fields"] })) })] }), header, _jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: order, strategy: rectSortingStrategy, children: _jsx("div", { className: "grid grid-cols-2 gap-3", children: orderedFields.map(field => (_jsx(SortableFieldCard, { field: field, isConfiguring: isConfiguring }, field.id))) }) }) })] }));
49
+ }
@@ -0,0 +1,7 @@
1
+ import { useRender } from "@base-ui/react/use-render";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const badgeVariants: (props?: ({
4
+ variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare function Badge({ className, variant, render, ...props }: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
7
+ export { Badge, badgeVariants };
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { mergeProps } from "@base-ui/react/merge-props";
3
+ import { useRender } from "@base-ui/react/use-render";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../../lib/utils.js";
6
+ const badgeVariants = cva("focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all transition-colors focus-visible:ring-[3px] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:pointer-events-none [&>svg]:size-3!", {
7
+ variants: {
8
+ variant: {
9
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
10
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
11
+ destructive: "bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20",
12
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
13
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
14
+ link: "text-primary underline-offset-4 hover:underline",
15
+ },
16
+ },
17
+ defaultVariants: {
18
+ variant: "default",
19
+ },
20
+ });
21
+ function Badge({ className, variant = "default", render, ...props }) {
22
+ return useRender({
23
+ defaultTagName: "span",
24
+ props: mergeProps({
25
+ className: cn(badgeVariants({ className, variant })),
26
+ }, props),
27
+ render,
28
+ state: {
29
+ slot: "badge",
30
+ variant,
31
+ },
32
+ });
33
+ }
34
+ export { Badge, badgeVariants };
@@ -0,0 +1,10 @@
1
+ import { Button as ButtonPrimitive } from "@base-ui/react/button";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const buttonVariants: (props?: ({
4
+ variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
5
+ size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ type ButtonVariants = VariantProps<typeof buttonVariants>;
8
+ type ButtonProps = React.ComponentProps<typeof ButtonPrimitive> & ButtonVariants;
9
+ declare function Button({ className, variant, size, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
10
+ export { Button, buttonVariants, type ButtonVariants, type ButtonProps };
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Button as ButtonPrimitive } from "@base-ui/react/button";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../../lib/utils.js";
6
+ const buttonVariants = cva("focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none hover:cursor-pointer focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 aria-invalid:ring-[3px] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
7
+ variants: {
8
+ variant: {
9
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
10
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground",
11
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
12
+ ghost: "hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground",
13
+ destructive: "bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30",
14
+ link: "text-primary underline-offset-4 hover:underline",
15
+ },
16
+ size: {
17
+ "default": "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
18
+ "xs": "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
19
+ "sm": "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
20
+ "lg": "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
21
+ "icon": "size-8",
22
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
23
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
24
+ "icon-lg": "size-9",
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ variant: "default",
29
+ size: "default",
30
+ },
31
+ });
32
+ function Button({ className, variant = "default", size = "default", ...props }) {
33
+ return (_jsx(ButtonPrimitive, { "data-slot": "button", className: cn(buttonVariants({ variant, size }), className), ...props }));
34
+ }
35
+ export { Button, buttonVariants };
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import { DayPicker, type DayButton } from "react-day-picker";
3
+ import { Button } from "./button.js";
4
+ declare function Calendar({ className, classNames, showOutsideDays, captionLayout, buttonVariant, formatters, components, ...props }: React.ComponentProps<typeof DayPicker> & {
5
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"];
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ declare function CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>): import("react/jsx-runtime").JSX.Element;
8
+ export { Calendar, CalendarDayButton };