diff --git a/.DS_Store b/.DS_Store index feb574ad4e0c9278d2a6b266af22af6ddb090646..0427c79da1455a31bed60a4a3914e9d49c6cb1c3 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..c4072c7d8fb017461a4cced3600d046d77b799f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +venv/ +.env +__pycache__/ +*.pyc +.DS_Store +BPOM Compliance AI UI Redesign/node_modules/ +laporan_compliance_bpom.pdf diff --git a/BPOM Compliance AI UI Redesign/ATTRIBUTIONS.md b/BPOM Compliance AI UI Redesign/ATTRIBUTIONS.md new file mode 100644 index 0000000000000000000000000000000000000000..5df5c40c9aae0365002db6ac826623f2febb7d26 --- /dev/null +++ b/BPOM Compliance AI UI Redesign/ATTRIBUTIONS.md @@ -0,0 +1,3 @@ +This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md). + +This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license). diff --git a/BPOM Compliance AI UI Redesign/README.md b/BPOM Compliance AI UI Redesign/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3cc719fe7b75cd4ae996420e5891017d9ecf10c9 --- /dev/null +++ b/BPOM Compliance AI UI Redesign/README.md @@ -0,0 +1,11 @@ + + # BPOM Compliance AI UI Redesign + + This is a code bundle for BPOM Compliance AI UI Redesign. The original project is available at https://www.figma.com/design/8f6fPFaJejzKI4ybjgfcN9/BPOM-Compliance-AI-UI-Redesign. + + ## Running the code + + Run `npm i` to install the dependencies. + + Run `npm run dev` to start the development server. + \ No newline at end of file diff --git a/BPOM Compliance AI UI Redesign/default_shadcn_theme.css b/BPOM Compliance AI UI Redesign/default_shadcn_theme.css new file mode 100644 index 0000000000000000000000000000000000000000..39e1b443c6925cc896d8cf47a9d50bc2d882ec82 --- /dev/null +++ b/BPOM Compliance AI UI Redesign/default_shadcn_theme.css @@ -0,0 +1,120 @@ +/* KEEP_IN_SYNC(fullscreen/resources/figmake/shadcn/globals.css) */ + +:root { + --font-size: 16px; + --background: #ffffff; + --foreground: oklch(0.145 0 0); + --card: #ffffff; + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: #030213; + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.95 0.0058 264.53); + --secondary-foreground: #030213; + --muted: #ececf0; + --muted-foreground: #717182; + --accent: #e9ebef; + --accent-foreground: #030213; + --destructive: #d4183d; + --destructive-foreground: #ffffff; + --border: rgba(0, 0, 0, 0.1); + --input: transparent; + --input-background: #f3f3f5; + --switch-background: #cbced4; + --font-weight-medium: 500; + --font-weight-normal: 400; + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: #030213; + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --font-weight-medium: 500; + --font-weight-normal: 400; + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-input-background: var(--input-background); + --color-switch-background: var(--switch-background); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} diff --git a/BPOM Compliance AI UI Redesign/guidelines/Guidelines.md b/BPOM Compliance AI UI Redesign/guidelines/Guidelines.md new file mode 100644 index 0000000000000000000000000000000000000000..110f1178839508ea2207abba3a8dd2a794ed36db --- /dev/null +++ b/BPOM Compliance AI UI Redesign/guidelines/Guidelines.md @@ -0,0 +1,61 @@ +**Add your own guidelines here** + diff --git a/BPOM Compliance AI UI Redesign/index.html b/BPOM Compliance AI UI Redesign/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1655d7d1e1e2958008fb3a14d135d67e2d5ede0a --- /dev/null +++ b/BPOM Compliance AI UI Redesign/index.html @@ -0,0 +1,22 @@ + + + +
+ + + +BPOM Compliance AI
+Sistem Pengecekan Kepatuhan Pangan Otomatis
+Menganalisis Dokumen
+{loading.message}
+ ++ {stage.message} +
++ {loading.stage + 1} / {loadingStages.length} +
++ Upload laporan uji laboratorium produk pangan atau tempel teks secara manual untuk dianalisis. +
+Upload Dokumen
+Drag & drop atau klik untuk browse
+{uploadedFile.name}
+{formatFileSize(uploadedFile.size)}
+Klik atau drag file ke sini
+Maksimal 25 MB per file
++ Pastikan dokumen berisi data uji laboratorium lengkap termasuk parameter, nilai, dan satuan ukuran. +
+Input Teks Manual
+Salin dan tempel data lab report
++ Minimal 50 karakter diperlukan untuk analisis yang akurat. +
+ )} ++ Upload dokumen atau tempel teks terlebih dahulu untuk melanjutkan. +
+ )} +Periksa hasil analisis kepatuhan dan narasi AI sebelum membuat laporan final.
+{summary.pass}
+Parameter PASS
+{summary.fail}
+Parameter FAIL
+{summary.missing}
+Data Tidak Lengkap
+Tingkat Kepatuhan Keseluruhan
+{summary.pass} / {summary.total} parameter
+Tabel Hasil Uji Kepatuhan
+ + {rows.length} parameter + +| Parameter | +Nilai Uji | +Batas BPOM | +Status | +Dasar Hukum | +
|---|---|---|---|---|
| {row.param} | ++ {row.found !== "-" ? row.found : "—"} + | +{row.threshold} | +
+ {row.status === "PASS" && (
+
+ |
+
+
+
+ {row.dasarHukum}
+
+ {row.dasarHukum && row.dasarHukum !== "-" && (
+
+
+
+ )}
+
+
+
+ |
+
Penjelasan AI — Temuan Pelanggaran
+ + {violationCards.length} temuan + +Perbandingan Nilai
+Nilai Temuan
+{v.nilaiTemuan}
+Batas Regulasi
++ {v.batasRegulasi.split("(")[0].trim()} +
+{v.batasRegulasi.match(/\(.*\)/)?.[0] || ""}
+Rekomendasi
+{v.rekomendasi}
+Narasi AI — Dapat Diedit
+Tinjau hasil analisis kepatuhan dan unduh laporan PDF.
++ {isCompliant ? "Memenuhi Syarat — Siap Diajukan" : "Tidak Memenuhi Syarat — Perbaikan Diperlukan"} +
++ {isCompliant + ? `Semua parameter memenuhi standar BPOM. Produk siap untuk proses registrasi.` + : `Produk memiliki ${summary.fail} parameter yang tidak memenuhi batas regulasi BPOM. Perbaikan formulasi diperlukan sebelum pengajuan registrasi.` + } +
+{compliancePct}%
+Kepatuhan
+{productName}
+{producer}{batchNo !== "-" ? ` — Batch ${batchNo}` : ""}
+Kategori: {category}
+Informasi Produk
+{item.label}
+{item.value || "-"}
+Ringkasan Eksekutif
+{s.label}
+{s.value}
+Detail Hasil Uji
+| Parameter | +Nilai Uji | +Batas BPOM | +Status | +
|---|---|---|---|
| {row.param} | +{row.found} | +{row.threshold} | +
Preview Laporan (Markdown)
+
+ {markdownPreview}
+
+