truthound-dashboard 1.2.1__py3-none-any.whl → 1.3.1__py3-none-any.whl
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.
- truthound_dashboard/api/deps.py +28 -0
- truthound_dashboard/api/drift.py +1 -0
- truthound_dashboard/api/mask.py +164 -0
- truthound_dashboard/api/profile.py +11 -3
- truthound_dashboard/api/router.py +22 -0
- truthound_dashboard/api/scan.py +168 -0
- truthound_dashboard/api/schemas.py +13 -4
- truthound_dashboard/api/validations.py +33 -1
- truthound_dashboard/api/validators.py +85 -0
- truthound_dashboard/core/__init__.py +8 -0
- truthound_dashboard/core/phase5/activity.py +1 -1
- truthound_dashboard/core/services.py +457 -7
- truthound_dashboard/core/truthound_adapter.py +441 -26
- truthound_dashboard/db/__init__.py +6 -0
- truthound_dashboard/db/models.py +250 -1
- truthound_dashboard/schemas/__init__.py +52 -1
- truthound_dashboard/schemas/collaboration.py +1 -1
- truthound_dashboard/schemas/drift.py +118 -3
- truthound_dashboard/schemas/mask.py +209 -0
- truthound_dashboard/schemas/profile.py +45 -2
- truthound_dashboard/schemas/scan.py +312 -0
- truthound_dashboard/schemas/schema.py +30 -2
- truthound_dashboard/schemas/validation.py +60 -3
- truthound_dashboard/schemas/validators/__init__.py +59 -0
- truthound_dashboard/schemas/validators/aggregate_validators.py +238 -0
- truthound_dashboard/schemas/validators/anomaly_validators.py +723 -0
- truthound_dashboard/schemas/validators/base.py +263 -0
- truthound_dashboard/schemas/validators/completeness_validators.py +269 -0
- truthound_dashboard/schemas/validators/cross_table_validators.py +375 -0
- truthound_dashboard/schemas/validators/datetime_validators.py +253 -0
- truthound_dashboard/schemas/validators/distribution_validators.py +422 -0
- truthound_dashboard/schemas/validators/drift_validators.py +615 -0
- truthound_dashboard/schemas/validators/geospatial_validators.py +486 -0
- truthound_dashboard/schemas/validators/multi_column_validators.py +706 -0
- truthound_dashboard/schemas/validators/privacy_validators.py +531 -0
- truthound_dashboard/schemas/validators/query_validators.py +510 -0
- truthound_dashboard/schemas/validators/registry.py +318 -0
- truthound_dashboard/schemas/validators/schema_validators.py +408 -0
- truthound_dashboard/schemas/validators/string_validators.py +396 -0
- truthound_dashboard/schemas/validators/table_validators.py +412 -0
- truthound_dashboard/schemas/validators/uniqueness_validators.py +355 -0
- truthound_dashboard/schemas/validators.py +59 -0
- truthound_dashboard/static/assets/index-BZG20KuF.js +586 -0
- truthound_dashboard/static/assets/index-D_HyZ3pb.css +1 -0
- truthound_dashboard/static/assets/unmerged_dictionaries-CtpqQBm0.js +1 -0
- truthound_dashboard/static/index.html +2 -2
- {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.1.dist-info}/METADATA +50 -11
- {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.1.dist-info}/RECORD +51 -27
- truthound_dashboard/static/assets/index-BqXVFyqj.js +0 -574
- truthound_dashboard/static/assets/index-o8qHVDte.css +0 -1
- truthound_dashboard/static/assets/unmerged_dictionaries-n_T3wZTf.js +0 -1
- {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.1.dist-info}/WHEEL +0 -0
- {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.1.dist-info}/entry_points.txt +0 -0
- {truthound_dashboard-1.2.1.dist-info → truthound_dashboard-1.3.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 24 95% 64%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 24 95% 64%;--radius: .5rem}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 24 95% 64%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 210 40% 98%;--border: 217.2 32.6% 17.5%;--input: 217.2 32.6% 17.5%;--ring: 24 95% 64%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-feature-settings:"rlig" 1,"calt" 1}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}@media (min-width: 1400px){.container{max-width:1400px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-ml-3{margin-left:-.75rem}.-mr-4{margin-right:-1rem}.-mt-4{margin-top:-1rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-px{height:1px}.h-screen{height:100vh}.max-h-96{max-height:24rem}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-screen{max-height:100vh}.min-h-\[100px\]{min-height:100px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-0{--tw-scale-x: 0;--tw-scale-y: 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-destructive{border-color:hsl(var(--destructive))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-500\/20{border-color:#22c55e33}.border-input{border-color:hsl(var(--input))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-primary{--tw-border-opacity: 1;border-color:rgb(253 158 75 / var(--tw-border-opacity, 1))}.border-primary\/20{border-color:#fd9e4b33}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-500\/20{border-color:#eab30833}.border-t-transparent{border-top-color:transparent}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-black\/50{background-color:#00000080}.bg-black\/80{background-color:#000c}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/20{background-color:#22c55e33}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-500\/10{background-color:#f973161a}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(253 158 75 / var(--tw-bg-opacity, 1))}.bg-primary\/10{background-color:#fd9e4b1a}.bg-primary\/20{background-color:#fd9e4b33}.bg-primary\/5{background-color:#fd9e4b0d}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/20{background-color:#ef444433}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/10{background-color:#eab3081a}.bg-yellow-500\/20{background-color:#eab30833}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-500\/10{--tw-gradient-from: rgb(34 197 94 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary{--tw-gradient-from: #fd9e4b var(--tw-gradient-from-position);--tw-gradient-to: rgb(253 158 75 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary\/10{--tw-gradient-from: rgb(253 158 75 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(253 158 75 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-500{--tw-gradient-from: #ef4444 var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-500\/10{--tw-gradient-from: rgb(239 68 68 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-500{--tw-gradient-from: #eab308 var(--tw-gradient-from-position);--tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-500\/10{--tw-gradient-from: rgb(234 179 8 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-green-500\/5{--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(34 197 94 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-primary\/5{--tw-gradient-to: rgb(253 158 75 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(253 158 75 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-red-500\/5{--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(239 68 68 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-yellow-500\/5{--tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(234 179 8 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground) / .5)}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{--tw-text-opacity: 1;color:rgb(253 158 75 / var(--tw-text-opacity, 1))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.blur-2xl{--tw-blur: blur(40px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in{--tw-enter-opacity: 0}.zoom-in-50{--tw-enter-scale: .5}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-500{animation-duration:.5s}.running{animation-play-state:running}.paused{animation-play-state:paused}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background-color:hsl(var(--muted))}::-webkit-scrollbar-thumb{border-radius:9999px;background-color:hsl(var(--muted-foreground) / .3)}::-webkit-scrollbar-thumb:hover{background-color:hsl(var(--muted-foreground) / .5)}pre{overflow-x:auto;border-radius:var(--radius);background-color:hsl(var(--muted));padding:1rem}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875rem;line-height:1.25rem}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200\/50:hover{background-color:#e5e7eb80}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-muted\/80:hover{background-color:hsl(var(--muted) / .8)}.hover\:bg-primary\/80:hover{background-color:#fd9e4bcc}.hover\:bg-primary\/90:hover{background-color:#fd9e4be6}.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:rgb(253 158 75 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(253 158 75 / var(--tw-ring-opacity, 1))}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.group.destructive .group-\[\.destructive\]\:border-muted\/40{border-color:hsl(var(--muted) / .4)}.group.destructive .group-\[\.destructive\]\:text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{--tw-text-opacity: 1;color:rgb(254 242 242 / var(--tw-text-opacity, 1))}.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity, 1))}.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color: #dc2626}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:translate-x-5[data-state=checked]{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked],.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{--tw-bg-opacity: 1;background-color:rgb(253 158 75 / var(--tw-bg-opacity, 1))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed],.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100%}@supports (backdrop-filter: var(--tw)){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:hsl(var(--background) / .6)}}.dark\:-rotate-90:is(.dark *){--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:rotate-0:is(.dark *){--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-0:is(.dark *){--tw-scale-x: 0;--tw-scale-y: 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:scale-100:is(.dark *){--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dark\:border-green-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(20 83 45 / var(--tw-border-opacity, 1))}.dark\:border-orange-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(124 45 18 / var(--tw-border-opacity, 1))}.dark\:border-red-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(127 29 29 / var(--tw-border-opacity, 1))}.dark\:border-yellow-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(113 63 18 / var(--tw-border-opacity, 1))}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-green-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(20 83 45 / var(--tw-bg-opacity, 1))}.dark\:bg-green-900\/30:is(.dark *){background-color:#14532d4d}.dark\:bg-orange-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(124 45 18 / var(--tw-bg-opacity, 1))}.dark\:bg-red-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity, 1))}.dark\:bg-red-900\/30:is(.dark *){background-color:#7f1d1d4d}.dark\:bg-yellow-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(113 63 18 / var(--tw-bg-opacity, 1))}.dark\:bg-yellow-900\/30:is(.dark *){background-color:#713f124d}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-200:is(.dark *){--tw-text-opacity: 1;color:rgb(187 247 208 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-orange-200:is(.dark *){--tw-text-opacity: 1;color:rgb(254 215 170 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-red-200:is(.dark *){--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-yellow-200:is(.dark *){--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity, 1))}.dark\:text-yellow-400:is(.dark *){--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-gray-700\/50:hover:is(.dark *){background-color:#37415180}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}@media (min-width: 640px){.sm\:bottom-0{bottom:0}.sm\:right-0{right:0}.sm\:top-auto{top:auto}.sm\:mt-0{margin-top:0}.sm\:max-w-\[500px\]{max-width:500px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-col{flex-direction:column}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100%}}@media (min-width: 768px){.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:pl-48{padding-left:12rem}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const n=[{key:"catalog",content:{title:{nodeType:"translation",translation:{en:"Data Catalog",ko:"데이터 카탈로그"}},subtitle:{nodeType:"translation",translation:{en:"Browse and manage data assets",ko:"데이터 자산 탐색 및 관리"}},assets:{nodeType:"translation",translation:{en:"Assets",ko:"자산"}},addAsset:{nodeType:"translation",translation:{en:"Add Asset",ko:"자산 추가"}},editAsset:{nodeType:"translation",translation:{en:"Edit Asset",ko:"자산 수정"}},deleteAsset:{nodeType:"translation",translation:{en:"Delete Asset",ko:"자산 삭제"}},addColumn:{nodeType:"translation",translation:{en:"Add Column",ko:"컬럼 추가"}},addTag:{nodeType:"translation",translation:{en:"Add Tag",ko:"태그 추가"}},assetName:{nodeType:"translation",translation:{en:"Asset Name",ko:"자산명"}},assetType:{nodeType:"translation",translation:{en:"Asset Type",ko:"자산 유형"}},dataSource:{nodeType:"translation",translation:{en:"Data Source",ko:"데이터 소스"}},columns:{nodeType:"translation",translation:{en:"Columns",ko:"컬럼"}},qualityScore:{nodeType:"translation",translation:{en:"Quality Score",ko:"품질 점수"}},tags:{nodeType:"translation",translation:{en:"Tags",ko:"태그"}},description:{nodeType:"translation",translation:{en:"Description",ko:"설명"}},owner:{nodeType:"translation",translation:{en:"Owner",ko:"담당자"}},selectSource:{nodeType:"translation",translation:{en:"Select data source",ko:"데이터 소스 선택"}},noSource:{nodeType:"translation",translation:{en:"No data source",ko:"데이터 소스 없음"}},assetTypes:{table:{nodeType:"translation",translation:{en:"Table",ko:"테이블"}},file:{nodeType:"translation",translation:{en:"File",ko:"파일"}},api:{nodeType:"translation",translation:{en:"API",ko:"API"}}},columnName:{nodeType:"translation",translation:{en:"Column Name",ko:"컬럼명"}},dataType:{nodeType:"translation",translation:{en:"Data Type",ko:"데이터 타입"}},nullable:{nodeType:"translation",translation:{en:"Nullable",ko:"Null 허용"}},primaryKey:{nodeType:"translation",translation:{en:"Primary Key",ko:"기본키"}},mappedTerm:{nodeType:"translation",translation:{en:"Mapped Term",ko:"매핑된 용어"}},columnMapping:{nodeType:"translation",translation:{en:"Column Mapping",ko:"컬럼 매핑"}},mapToTerm:{nodeType:"translation",translation:{en:"Map to Term",ko:"용어에 매핑"}},unmapTerm:{nodeType:"translation",translation:{en:"Remove Mapping",ko:"매핑 해제"}},searchTermToMap:{nodeType:"translation",translation:{en:"Search terms to map...",ko:"매핑할 용어 검색..."}},noTermSelected:{nodeType:"translation",translation:{en:"No term mapped",ko:"매핑된 용어 없음"}},tagName:{nodeType:"translation",translation:{en:"Tag Name",ko:"태그명"}},tagValue:{nodeType:"translation",translation:{en:"Tag Value",ko:"태그 값"}},noTags:{nodeType:"translation",translation:{en:"No tags",ko:"태그 없음"}},sensitivity:{title:{nodeType:"translation",translation:{en:"Sensitivity",ko:"민감도"}},public:{nodeType:"translation",translation:{en:"Public",ko:"공개"}},internal:{nodeType:"translation",translation:{en:"Internal",ko:"내부용"}},confidential:{nodeType:"translation",translation:{en:"Confidential",ko:"기밀"}},restricted:{nodeType:"translation",translation:{en:"Restricted",ko:"제한"}}},searchAssets:{nodeType:"translation",translation:{en:"Search assets...",ko:"자산 검색..."}},filterByType:{nodeType:"translation",translation:{en:"Filter by type",ko:"유형 필터"}},filterBySource:{nodeType:"translation",translation:{en:"Filter by source",ko:"소스 필터"}},allTypes:{nodeType:"translation",translation:{en:"All types",ko:"모든 유형"}},allSources:{nodeType:"translation",translation:{en:"All sources",ko:"모든 소스"}},noAssets:{nodeType:"translation",translation:{en:"No assets found",ko:"자산이 없습니다"}},noAssetsYet:{nodeType:"translation",translation:{en:"No assets yet",ko:"등록된 자산이 없습니다"}},noAssetsDesc:{nodeType:"translation",translation:{en:"Add your first data asset to start building your catalog",ko:"첫 번째 데이터 자산을 추가하여 카탈로그를 구축하세요"}},addFirstAsset:{nodeType:"translation",translation:{en:"Add Your First Asset",ko:"첫 번째 자산 추가"}},noColumns:{nodeType:"translation",translation:{en:"No columns defined",ko:"정의된 컬럼이 없습니다"}},confirmDelete:{nodeType:"translation",translation:{en:"Are you sure you want to delete this asset? All columns and tags will also be deleted.",ko:"이 자산을 삭제하시겠습니까? 모든 컬럼과 태그도 함께 삭제됩니다."}},loadError:{nodeType:"translation",translation:{en:"Failed to load assets",ko:"자산을 불러오지 못했습니다"}},createSuccess:{nodeType:"translation",translation:{en:"Asset created successfully",ko:"자산이 생성되었습니다"}},createError:{nodeType:"translation",translation:{en:"Failed to create asset",ko:"자산 생성에 실패했습니다"}},updateSuccess:{nodeType:"translation",translation:{en:"Asset updated successfully",ko:"자산이 수정되었습니다"}},updateError:{nodeType:"translation",translation:{en:"Failed to update asset",ko:"자산 수정에 실패했습니다"}},deleteSuccess:{nodeType:"translation",translation:{en:"Asset deleted successfully",ko:"자산이 삭제되었습니다"}},deleteError:{nodeType:"translation",translation:{en:"Failed to delete asset",ko:"자산 삭제에 실패했습니다"}},mappingSuccess:{nodeType:"translation",translation:{en:"Column mapped successfully",ko:"컬럼이 매핑되었습니다"}},mappingError:{nodeType:"translation",translation:{en:"Failed to map column",ko:"컬럼 매핑에 실패했습니다"}},unmappingSuccess:{nodeType:"translation",translation:{en:"Mapping removed",ko:"매핑이 해제되었습니다"}},tabs:{overview:{nodeType:"translation",translation:{en:"Overview",ko:"개요"}},columns:{nodeType:"translation",translation:{en:"Columns",ko:"컬럼"}},tags:{nodeType:"translation",translation:{en:"Tags",ko:"태그"}},comments:{nodeType:"translation",translation:{en:"Comments",ko:"댓글"}}}},localId:"catalog::local::src/content/catalog.content.ts",location:"local",filePath:"src/content/catalog.content.ts"}],t=[{key:"collaboration",content:{comments:{nodeType:"translation",translation:{en:"Comments",ko:"댓글"}},addComment:{nodeType:"translation",translation:{en:"Add Comment",ko:"댓글 추가"}},editComment:{nodeType:"translation",translation:{en:"Edit",ko:"수정"}},deleteComment:{nodeType:"translation",translation:{en:"Delete",ko:"삭제"}},noComments:{nodeType:"translation",translation:{en:"No comments yet",ko:"댓글이 없습니다"}},writeComment:{nodeType:"translation",translation:{en:"Write a comment...",ko:"댓글을 작성하세요..."}},reply:{nodeType:"translation",translation:{en:"Reply",ko:"답글"}},replyTo:{nodeType:"translation",translation:{en:"Reply to comment",ko:"답글 작성"}},cancelReply:{nodeType:"translation",translation:{en:"Cancel",ko:"취소"}},postComment:{nodeType:"translation",translation:{en:"Post",ko:"등록"}},commentPosted:{nodeType:"translation",translation:{en:"Comment posted",ko:"댓글이 등록되었습니다"}},commentUpdated:{nodeType:"translation",translation:{en:"Comment updated",ko:"댓글이 수정되었습니다"}},commentDeleted:{nodeType:"translation",translation:{en:"Comment deleted",ko:"댓글이 삭제되었습니다"}},commentError:{nodeType:"translation",translation:{en:"Failed to post comment",ko:"댓글 등록에 실패했습니다"}},confirmDeleteComment:{nodeType:"translation",translation:{en:"Are you sure you want to delete this comment?",ko:"이 댓글을 삭제하시겠습니까?"}},activity:{nodeType:"translation",translation:{en:"Activity",ko:"활동"}},recentActivity:{nodeType:"translation",translation:{en:"Recent Activity",ko:"최근 활동"}},allActivity:{nodeType:"translation",translation:{en:"All Activity",ko:"모든 활동"}},noActivity:{nodeType:"translation",translation:{en:"No activity recorded",ko:"기록된 활동이 없습니다"}},loadMore:{nodeType:"translation",translation:{en:"Load more",ko:"더 보기"}},actions:{created:{nodeType:"translation",translation:{en:"created",ko:"생성됨"}},updated:{nodeType:"translation",translation:{en:"updated",ko:"수정됨"}},deleted:{nodeType:"translation",translation:{en:"deleted",ko:"삭제됨"}},commented:{nodeType:"translation",translation:{en:"commented on",ko:"댓글 작성"}}},resourceTypes:{term:{nodeType:"translation",translation:{en:"term",ko:"용어"}},asset:{nodeType:"translation",translation:{en:"asset",ko:"자산"}},column:{nodeType:"translation",translation:{en:"column",ko:"컬럼"}}},timeAgo:{justNow:{nodeType:"translation",translation:{en:"Just now",ko:"방금 전"}},minutesAgo:{nodeType:"translation",translation:{en:"{count} minutes ago",ko:"{count}분 전"}},hoursAgo:{nodeType:"translation",translation:{en:"{count} hours ago",ko:"{count}시간 전"}},daysAgo:{nodeType:"translation",translation:{en:"{count} days ago",ko:"{count}일 전"}},weeksAgo:{nodeType:"translation",translation:{en:"{count} weeks ago",ko:"{count}주 전"}},monthsAgo:{nodeType:"translation",translation:{en:"{count} months ago",ko:"{count}개월 전"}}},filterByResource:{nodeType:"translation",translation:{en:"Filter by resource",ko:"리소스 필터"}},allResources:{nodeType:"translation",translation:{en:"All resources",ko:"모든 리소스"}}},localId:"collaboration::local::src/content/collaboration.content.ts",location:"local",filePath:"src/content/collaboration.content.ts"}],e=[{key:"common",content:{save:{nodeType:"translation",translation:{en:"Save",ko:"저장"}},cancel:{nodeType:"translation",translation:{en:"Cancel",ko:"취소"}},delete:{nodeType:"translation",translation:{en:"Delete",ko:"삭제"}},edit:{nodeType:"translation",translation:{en:"Edit",ko:"편집"}},add:{nodeType:"translation",translation:{en:"Add",ko:"추가"}},create:{nodeType:"translation",translation:{en:"Create",ko:"생성"}},update:{nodeType:"translation",translation:{en:"Update",ko:"수정"}},close:{nodeType:"translation",translation:{en:"Close",ko:"닫기"}},confirm:{nodeType:"translation",translation:{en:"Confirm",ko:"확인"}},loading:{nodeType:"translation",translation:{en:"Loading...",ko:"로딩 중..."}},error:{nodeType:"translation",translation:{en:"Error",ko:"오류"}},success:{nodeType:"translation",translation:{en:"Success",ko:"성공"}},warning:{nodeType:"translation",translation:{en:"Warning",ko:"경고"}},info:{nodeType:"translation",translation:{en:"Info",ko:"정보"}},search:{nodeType:"translation",translation:{en:"Search",ko:"검색"}},filter:{nodeType:"translation",translation:{en:"Filter",ko:"필터"}},refresh:{nodeType:"translation",translation:{en:"Refresh",ko:"새로고침"}},back:{nodeType:"translation",translation:{en:"Back",ko:"뒤로"}},next:{nodeType:"translation",translation:{en:"Next",ko:"다음"}},previous:{nodeType:"translation",translation:{en:"Previous",ko:"이전"}},yes:{nodeType:"translation",translation:{en:"Yes",ko:"예"}},no:{nodeType:"translation",translation:{en:"No",ko:"아니오"}},all:{nodeType:"translation",translation:{en:"All",ko:"전체"}},none:{nodeType:"translation",translation:{en:"None",ko:"없음"}},actions:{nodeType:"translation",translation:{en:"Actions",ko:"작업"}},status:{nodeType:"translation",translation:{en:"Status",ko:"상태"}},name:{nodeType:"translation",translation:{en:"Name",ko:"이름"}},type:{nodeType:"translation",translation:{en:"Type",ko:"유형"}},description:{nodeType:"translation",translation:{en:"Description",ko:"설명"}},createdAt:{nodeType:"translation",translation:{en:"Created At",ko:"생성일"}},updatedAt:{nodeType:"translation",translation:{en:"Updated At",ko:"수정일"}},active:{nodeType:"translation",translation:{en:"Active",ko:"활성"}},inactive:{nodeType:"translation",translation:{en:"Inactive",ko:"비활성"}},enabled:{nodeType:"translation",translation:{en:"Enabled",ko:"활성화됨"}},disabled:{nodeType:"translation",translation:{en:"Disabled",ko:"비활성화됨"}},noData:{nodeType:"translation",translation:{en:"No data available",ko:"데이터가 없습니다"}},noResults:{nodeType:"translation",translation:{en:"No results found",ko:"검색 결과가 없습니다"}},retry:{nodeType:"translation",translation:{en:"Retry",ko:"다시 시도"}},source:{nodeType:"translation",translation:{en:"Source",ko:"소스"}},schedule:{nodeType:"translation",translation:{en:"Schedule",ko:"스케줄"}},never:{nodeType:"translation",translation:{en:"Never",ko:"없음"}},saving:{nodeType:"translation",translation:{en:"Saving...",ko:"저장 중..."}}},localId:"common::local::src/content/common.content.ts",location:"local",filePath:"src/content/common.content.ts"}],a=[{key:"dashboard",content:{title:{nodeType:"translation",translation:{en:"Data Health Overview",ko:"데이터 품질 현황"}},subtitle:{nodeType:"translation",translation:{en:"Data quality overview and monitoring",ko:"데이터 품질 개요 및 모니터링"}},totalSources:{nodeType:"translation",translation:{en:"Total Sources",ko:"전체 소스"}},configuredSources:{nodeType:"translation",translation:{en:"Configured data sources",ko:"설정된 데이터 소스"}},passed:{nodeType:"translation",translation:{en:"Passed",ko:"통과"}},validationPassed:{nodeType:"translation",translation:{en:"Validation passed",ko:"검증 통과"}},failed:{nodeType:"translation",translation:{en:"Failed",ko:"실패"}},validationFailed:{nodeType:"translation",translation:{en:"Validation failed",ko:"검증 실패"}},pending:{nodeType:"translation",translation:{en:"Pending",ko:"대기 중"}},notValidated:{nodeType:"translation",translation:{en:"Not yet validated",ko:"검증 전"}},recentSources:{nodeType:"translation",translation:{en:"Recent Sources",ko:"최근 소스"}},recentSourcesDesc:{nodeType:"translation",translation:{en:"Your configured data sources",ko:"설정된 데이터 소스 목록"}},viewAll:{nodeType:"translation",translation:{en:"View All",ko:"전체 보기"}},noSources:{nodeType:"translation",translation:{en:"No data sources configured yet",ko:"설정된 데이터 소스가 없습니다"}},addFirstSource:{nodeType:"translation",translation:{en:"Add Your First Source",ko:"첫 번째 소스 추가하기"}},lastValidated:{nodeType:"translation",translation:{en:"Last validated",ko:"마지막 검증"}},loadError:{nodeType:"translation",translation:{en:"Failed to load dashboard data",ko:"대시보드 데이터를 불러오지 못했습니다"}},sources:{nodeType:"translation",translation:{en:"Data Sources",ko:"데이터 소스"}},passRate:{nodeType:"translation",translation:{en:"Pass Rate",ko:"통과율"}},failedToday:{nodeType:"translation",translation:{en:"Failed Today",ko:"오늘 실패"}},scheduled:{nodeType:"translation",translation:{en:"Scheduled",ko:"스케줄됨"}},recentFailures:{nodeType:"translation",translation:{en:"Recent Failures",ko:"최근 실패"}},upcomingSchedules:{nodeType:"translation",translation:{en:"Upcoming Schedules",ko:"예정된 스케줄"}},noFailures:{nodeType:"translation",translation:{en:"No recent failures",ko:"최근 실패가 없습니다"}},noSchedules:{nodeType:"translation",translation:{en:"No upcoming schedules",ko:"예정된 스케줄이 없습니다"}}},localId:"dashboard::local::src/content/dashboard.content.ts",location:"local",filePath:"src/content/dashboard.content.ts"}],o=[{key:"drift",content:{title:{nodeType:"translation",translation:{en:"Drift Detection",ko:"드리프트 감지"}},subtitle:{nodeType:"translation",translation:{en:"Compare datasets to detect data drift",ko:"데이터셋을 비교하여 데이터 드리프트 감지"}},compare:{nodeType:"translation",translation:{en:"Compare",ko:"비교"}},comparing:{nodeType:"translation",translation:{en:"Comparing...",ko:"비교 중..."}},newComparison:{nodeType:"translation",translation:{en:"New Comparison",ko:"새 비교"}},compareDatasets:{nodeType:"translation",translation:{en:"Compare Datasets",ko:"데이터셋 비교"}},compareDescription:{nodeType:"translation",translation:{en:"Select baseline and current datasets to compare for drift",ko:"드리프트 비교를 위한 기준 및 현재 데이터셋을 선택하세요"}},baseline:{nodeType:"translation",translation:{en:"Baseline",ko:"기준"}},current:{nodeType:"translation",translation:{en:"Current",ko:"현재"}},selectSource:{nodeType:"translation",translation:{en:"Select source",ko:"소스 선택"}},baselineSource:{nodeType:"translation",translation:{en:"Baseline Source",ko:"기준 소스"}},currentSource:{nodeType:"translation",translation:{en:"Current Source",ko:"현재 소스"}},selectBaseline:{nodeType:"translation",translation:{en:"Select baseline...",ko:"기준 선택..."}},selectCurrent:{nodeType:"translation",translation:{en:"Select current...",ko:"현재 선택..."}},detectionMethod:{nodeType:"translation",translation:{en:"Detection Method",ko:"감지 방법"}},selectBothSources:{nodeType:"translation",translation:{en:"Please select both baseline and current sources",ko:"기준 소스와 현재 소스를 모두 선택하세요"}},mustBeDifferent:{nodeType:"translation",translation:{en:"Baseline and current sources must be different",ko:"기준 소스와 현재 소스가 서로 달라야 합니다"}},comparisonComplete:{nodeType:"translation",translation:{en:"Comparison complete",ko:"비교 완료"}},comparisonFailed:{nodeType:"translation",translation:{en:"Comparison failed",ko:"비교 실패"}},noDriftDetected:{nodeType:"translation",translation:{en:"No significant drift detected",ko:"유의미한 드리프트가 감지되지 않았습니다"}},noComparisonsYet:{nodeType:"translation",translation:{en:"No comparisons yet",ko:"비교 기록 없음"}},noComparisonsDesc:{nodeType:"translation",translation:{en:"Compare two datasets to detect data drift",ko:"두 데이터셋을 비교하여 데이터 드리프트를 감지하세요"}},highDrift:{nodeType:"translation",translation:{en:"High Drift",ko:"높은 드리프트"}},driftDetected:{nodeType:"translation",translation:{en:"Drift Detected",ko:"드리프트 감지됨"}},noDrift:{nodeType:"translation",translation:{en:"No Drift",ko:"드리프트 없음"}},columnsCompared:{nodeType:"translation",translation:{en:"Columns Compared",ko:"비교된 컬럼"}},driftedColumns:{nodeType:"translation",translation:{en:"Drifted Columns",ko:"드리프트 컬럼"}},driftPercentage:{nodeType:"translation",translation:{en:"Drift Percentage",ko:"드리프트 비율"}},columnDetails:{nodeType:"translation",translation:{en:"Column Details",ko:"컬럼 상세"}},methods:{auto:{nodeType:"translation",translation:{en:"Auto (recommended)",ko:"자동 (권장)"}},ks:{nodeType:"translation",translation:{en:"Kolmogorov-Smirnov",ko:"콜모고로프-스미르노프"}},psi:{nodeType:"translation",translation:{en:"Population Stability Index",ko:"모집단 안정성 지수"}},chi2:{nodeType:"translation",translation:{en:"Chi-Square",ko:"카이제곱"}},js:{nodeType:"translation",translation:{en:"Jensen-Shannon",ko:"젠슨-샤논"}}},noChanges:{nodeType:"translation",translation:{en:"No changes detected",ko:"변경 사항이 없습니다"}},columnAdded:{nodeType:"translation",translation:{en:"Column Added",ko:"컬럼 추가됨"}},columnRemoved:{nodeType:"translation",translation:{en:"Column Removed",ko:"컬럼 제거됨"}},typeChanged:{nodeType:"translation",translation:{en:"Type Changed",ko:"타입 변경됨"}},statsChanged:{nodeType:"translation",translation:{en:"Statistics Changed",ko:"통계 변경됨"}}},localId:"drift::local::src/content/drift.content.ts",location:"local",filePath:"src/content/drift.content.ts"}],s=[{key:"errors",content:{generic:{nodeType:"translation",translation:{en:"An error occurred. Please try again.",ko:"오류가 발생했습니다. 다시 시도해 주세요."}},notFound:{nodeType:"translation",translation:{en:"The requested resource was not found.",ko:"요청한 리소스를 찾을 수 없습니다."}},unauthorized:{nodeType:"translation",translation:{en:"You are not authorized to perform this action.",ko:"이 작업을 수행할 권한이 없습니다."}},validation:{nodeType:"translation",translation:{en:"Please check your input and try again.",ko:"입력을 확인하고 다시 시도해 주세요."}},network:{nodeType:"translation",translation:{en:"Network error. Please check your connection.",ko:"네트워크 오류입니다. 연결을 확인해 주세요."}},serverError:{nodeType:"translation",translation:{en:"Server error. Please try again later.",ko:"서버 오류입니다. 나중에 다시 시도해 주세요."}},loadFailed:{nodeType:"translation",translation:{en:"Failed to load data",ko:"데이터를 불러오지 못했습니다"}}},localId:"errors::local::src/content/errors.content.ts",location:"local",filePath:"src/content/errors.content.ts"}],l=[{key:"glossary",content:{title:{nodeType:"translation",translation:{en:"Business Glossary",ko:"비즈니스 용어집"}},subtitle:{nodeType:"translation",translation:{en:"Manage business terms and definitions",ko:"비즈니스 용어와 정의 관리"}},terms:{nodeType:"translation",translation:{en:"Terms",ko:"용어"}},categories:{nodeType:"translation",translation:{en:"Categories",ko:"카테고리"}},addTerm:{nodeType:"translation",translation:{en:"Add Term",ko:"용어 추가"}},editTerm:{nodeType:"translation",translation:{en:"Edit Term",ko:"용어 수정"}},deleteTerm:{nodeType:"translation",translation:{en:"Delete Term",ko:"용어 삭제"}},addCategory:{nodeType:"translation",translation:{en:"Add Category",ko:"카테고리 추가"}},termName:{nodeType:"translation",translation:{en:"Term Name",ko:"용어명"}},definition:{nodeType:"translation",translation:{en:"Definition",ko:"정의"}},category:{nodeType:"translation",translation:{en:"Category",ko:"카테고리"}},owner:{nodeType:"translation",translation:{en:"Owner",ko:"담당자"}},selectCategory:{nodeType:"translation",translation:{en:"Select category",ko:"카테고리 선택"}},noCategory:{nodeType:"translation",translation:{en:"No category",ko:"카테고리 없음"}},relationships:{nodeType:"translation",translation:{en:"Relationships",ko:"관계"}},synonyms:{nodeType:"translation",translation:{en:"Synonyms",ko:"동의어"}},relatedTerms:{nodeType:"translation",translation:{en:"Related Terms",ko:"관련 용어"}},addRelationship:{nodeType:"translation",translation:{en:"Add Relationship",ko:"관계 추가"}},selectTerm:{nodeType:"translation",translation:{en:"Select term",ko:"용어 선택"}},history:{nodeType:"translation",translation:{en:"History",ko:"변경 이력"}},noHistory:{nodeType:"translation",translation:{en:"No changes recorded",ko:"기록된 변경 이력 없음"}},changedBy:{nodeType:"translation",translation:{en:"Changed by",ko:"변경자"}},changedFrom:{nodeType:"translation",translation:{en:"From",ko:"이전"}},changedTo:{nodeType:"translation",translation:{en:"To",ko:"이후"}},status:{label:{nodeType:"translation",translation:{en:"Status",ko:"상태"}},draft:{nodeType:"translation",translation:{en:"Draft",ko:"임시저장"}},approved:{nodeType:"translation",translation:{en:"Approved",ko:"승인됨"}},deprecated:{nodeType:"translation",translation:{en:"Deprecated",ko:"폐기됨"}}},relationshipTypes:{synonym:{nodeType:"translation",translation:{en:"Synonym",ko:"동의어"}},related:{nodeType:"translation",translation:{en:"Related",ko:"관련"}},parent:{nodeType:"translation",translation:{en:"Parent",ko:"상위"}},child:{nodeType:"translation",translation:{en:"Child",ko:"하위"}}},searchTerms:{nodeType:"translation",translation:{en:"Search terms...",ko:"용어 검색..."}},filterByCategory:{nodeType:"translation",translation:{en:"Filter by category",ko:"카테고리 필터"}},filterByStatus:{nodeType:"translation",translation:{en:"Filter by status",ko:"상태 필터"}},allCategories:{nodeType:"translation",translation:{en:"All categories",ko:"모든 카테고리"}},allStatuses:{nodeType:"translation",translation:{en:"All statuses",ko:"모든 상태"}},noTerms:{nodeType:"translation",translation:{en:"No terms found",ko:"용어가 없습니다"}},noTermsYet:{nodeType:"translation",translation:{en:"No terms yet",ko:"등록된 용어가 없습니다"}},noTermsDesc:{nodeType:"translation",translation:{en:"Add your first business term to start building your glossary",ko:"첫 번째 비즈니스 용어를 추가하여 용어집을 구축하세요"}},addFirstTerm:{nodeType:"translation",translation:{en:"Add Your First Term",ko:"첫 번째 용어 추가"}},confirmDelete:{nodeType:"translation",translation:{en:"Are you sure you want to delete this term? This action cannot be undone.",ko:"이 용어를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다."}},loadError:{nodeType:"translation",translation:{en:"Failed to load terms",ko:"용어를 불러오지 못했습니다"}},createSuccess:{nodeType:"translation",translation:{en:"Term created successfully",ko:"용어가 생성되었습니다"}},createError:{nodeType:"translation",translation:{en:"Failed to create term",ko:"용어 생성에 실패했습니다"}},updateSuccess:{nodeType:"translation",translation:{en:"Term updated successfully",ko:"용어가 수정되었습니다"}},updateError:{nodeType:"translation",translation:{en:"Failed to update term",ko:"용어 수정에 실패했습니다"}},deleteSuccess:{nodeType:"translation",translation:{en:"Term deleted successfully",ko:"용어가 삭제되었습니다"}},deleteError:{nodeType:"translation",translation:{en:"Failed to delete term",ko:"용어 삭제에 실패했습니다"}},tabs:{overview:{nodeType:"translation",translation:{en:"Overview",ko:"개요"}},relationships:{nodeType:"translation",translation:{en:"Relationships",ko:"관계"}},history:{nodeType:"translation",translation:{en:"History",ko:"이력"}},comments:{nodeType:"translation",translation:{en:"Comments",ko:"댓글"}}}},localId:"glossary::local::src/content/glossary.content.ts",location:"local",filePath:"src/content/glossary.content.ts"}],i=[{key:"nav",content:{dashboard:{nodeType:"translation",translation:{en:"Dashboard",ko:"대시보드"}},sources:{nodeType:"translation",translation:{en:"Data Sources",ko:"데이터 소스"}},catalog:{nodeType:"translation",translation:{en:"Catalog",ko:"카탈로그"}},glossary:{nodeType:"translation",translation:{en:"Glossary",ko:"용어집"}},rules:{nodeType:"translation",translation:{en:"Rules",ko:"규칙"}},validations:{nodeType:"translation",translation:{en:"Validations",ko:"검증"}},history:{nodeType:"translation",translation:{en:"History",ko:"히스토리"}},schedules:{nodeType:"translation",translation:{en:"Schedules",ko:"스케줄"}},activity:{nodeType:"translation",translation:{en:"Activity",ko:"활동"}},notifications:{nodeType:"translation",translation:{en:"Notifications",ko:"알림"}},profile:{nodeType:"translation",translation:{en:"Profile",ko:"프로필"}},drift:{nodeType:"translation",translation:{en:"Drift",ko:"드리프트"}},settings:{nodeType:"translation",translation:{en:"Settings",ko:"설정"}}},localId:"nav::local::src/content/nav.content.ts",location:"local",filePath:"src/content/nav.content.ts"}],r=[{key:"notifications",content:{title:{nodeType:"translation",translation:{en:"Notifications",ko:"알림"}},subtitle:{nodeType:"translation",translation:{en:"Configure notification channels and rules",ko:"알림 채널 및 규칙 설정"}},channels:{nodeType:"translation",translation:{en:"Channels",ko:"채널"}},rules:{nodeType:"translation",translation:{en:"Rules",ko:"규칙"}},logs:{nodeType:"translation",translation:{en:"Logs",ko:"로그"}},addChannel:{nodeType:"translation",translation:{en:"Add Channel",ko:"채널 추가"}},addRule:{nodeType:"translation",translation:{en:"Add Rule",ko:"규칙 추가"}},editChannel:{nodeType:"translation",translation:{en:"Edit Channel",ko:"채널 편집"}},editRule:{nodeType:"translation",translation:{en:"Edit Rule",ko:"규칙 편집"}},testChannel:{nodeType:"translation",translation:{en:"Test",ko:"테스트"}},noChannels:{nodeType:"translation",translation:{en:"No notification channels configured",ko:"설정된 알림 채널이 없습니다"}},noRules:{nodeType:"translation",translation:{en:"No notification rules configured",ko:"설정된 알림 규칙이 없습니다"}},noLogs:{nodeType:"translation",translation:{en:"No notification logs",ko:"알림 로그가 없습니다"}},channelTypes:{slack:{nodeType:"translation",translation:{en:"Slack",ko:"Slack"}},email:{nodeType:"translation",translation:{en:"Email",ko:"이메일"}},webhook:{nodeType:"translation",translation:{en:"Webhook",ko:"웹훅"}}},conditions:{validation_failed:{nodeType:"translation",translation:{en:"Validation Failed",ko:"검증 실패"}},critical_issues:{nodeType:"translation",translation:{en:"Critical Issues Detected",ko:"심각한 이슈 발견"}},high_issues:{nodeType:"translation",translation:{en:"High Severity Issues",ko:"높은 심각도 이슈"}},schedule_failed:{nodeType:"translation",translation:{en:"Schedule Failed",ko:"스케줄 실패"}},drift_detected:{nodeType:"translation",translation:{en:"Drift Detected",ko:"드리프트 감지"}}},testSuccess:{nodeType:"translation",translation:{en:"Test notification sent successfully",ko:"테스트 알림이 성공적으로 전송되었습니다"}},testFailed:{nodeType:"translation",translation:{en:"Failed to send test notification",ko:"테스트 알림 전송에 실패했습니다"}},sent:{nodeType:"translation",translation:{en:"Sent",ko:"전송됨"}},failed:{nodeType:"translation",translation:{en:"Failed",ko:"실패"}},deleteChannel:{nodeType:"translation",translation:{en:"Delete Channel",ko:"채널 삭제"}},deleteChannelConfirm:{nodeType:"translation",translation:{en:"Are you sure you want to delete this channel? This action cannot be undone.",ko:"이 채널을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."}},channelDeleted:{nodeType:"translation",translation:{en:"Channel deleted successfully",ko:"채널이 삭제되었습니다"}},deleteChannelFailed:{nodeType:"translation",translation:{en:"Failed to delete channel",ko:"채널 삭제에 실패했습니다"}},deleteRule:{nodeType:"translation",translation:{en:"Delete Rule",ko:"규칙 삭제"}},deleteRuleConfirm:{nodeType:"translation",translation:{en:"Are you sure you want to delete this rule? This action cannot be undone.",ko:"이 규칙을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."}},ruleDeleted:{nodeType:"translation",translation:{en:"Rule deleted successfully",ko:"규칙이 삭제되었습니다"}},deleteRuleFailed:{nodeType:"translation",translation:{en:"Failed to delete rule",ko:"규칙 삭제에 실패했습니다"}}},localId:"notifications::local::src/content/notifications.content.ts",location:"local",filePath:"src/content/notifications.content.ts"}],d=[{key:"schedules",content:{title:{nodeType:"translation",translation:{en:"Schedules",ko:"스케줄"}},subtitle:{nodeType:"translation",translation:{en:"Manage scheduled validation runs",ko:"예약된 검증 실행 관리"}},addSchedule:{nodeType:"translation",translation:{en:"Add Schedule",ko:"스케줄 추가"}},newSchedule:{nodeType:"translation",translation:{en:"New Schedule",ko:"새 스케줄"}},editSchedule:{nodeType:"translation",translation:{en:"Edit Schedule",ko:"스케줄 편집"}},createSchedule:{nodeType:"translation",translation:{en:"Create Schedule",ko:"스케줄 생성"}},createScheduleDesc:{nodeType:"translation",translation:{en:"Set up automated validation runs for a data source",ko:"데이터 소스의 자동 검증 실행 설정"}},noSchedules:{nodeType:"translation",translation:{en:"No schedules configured",ko:"설정된 스케줄이 없습니다"}},noSchedulesYet:{nodeType:"translation",translation:{en:"No schedules yet",ko:"스케줄이 없습니다"}},noSchedulesDesc:{nodeType:"translation",translation:{en:"Create a schedule to automate validation runs",ko:"검증 자동화를 위해 스케줄을 생성하세요"}},cronExpression:{nodeType:"translation",translation:{en:"Cron Expression",ko:"Cron 표현식"}},cronFormat:{nodeType:"translation",translation:{en:"Format: minute hour day month weekday",ko:"형식: 분 시 일 월 요일"}},customCron:{nodeType:"translation",translation:{en:"Custom cron expression",ko:"사용자 정의 Cron 표현식"}},selectSource:{nodeType:"translation",translation:{en:"Select source...",ko:"소스 선택..."}},lastRun:{nodeType:"translation",translation:{en:"Last Run",ko:"마지막 실행"}},nextRun:{nodeType:"translation",translation:{en:"Next Run",ko:"다음 실행"}},notifyOnFailure:{nodeType:"translation",translation:{en:"Notify on Failure",ko:"실패 시 알림"}},pause:{nodeType:"translation",translation:{en:"Pause",ko:"일시정지"}},resume:{nodeType:"translation",translation:{en:"Resume",ko:"재개"}},runNow:{nodeType:"translation",translation:{en:"Run Now",ko:"지금 실행"}},paused:{nodeType:"translation",translation:{en:"Paused",ko:"일시정지됨"}},active:{nodeType:"translation",translation:{en:"Active",ko:"활성"}},scheduleCreated:{nodeType:"translation",translation:{en:"Schedule created",ko:"스케줄 생성됨"}},createFailed:{nodeType:"translation",translation:{en:"Failed to create schedule",ko:"스케줄 생성 실패"}},deleted:{nodeType:"translation",translation:{en:"Schedule deleted",ko:"스케줄 삭제됨"}},deleteFailed:{nodeType:"translation",translation:{en:"Failed to delete",ko:"삭제 실패"}},schedulePaused:{nodeType:"translation",translation:{en:"Schedule paused",ko:"스케줄 일시정지됨"}},pauseFailed:{nodeType:"translation",translation:{en:"Failed to pause",ko:"일시정지 실패"}},scheduleResumed:{nodeType:"translation",translation:{en:"Schedule resumed",ko:"스케줄 재개됨"}},resumeFailed:{nodeType:"translation",translation:{en:"Failed to resume",ko:"재개 실패"}},validationTriggered:{nodeType:"translation",translation:{en:"Validation triggered",ko:"검증 실행됨"}},runFailed:{nodeType:"translation",translation:{en:"Failed to run",ko:"실행 실패"}},fillRequired:{nodeType:"translation",translation:{en:"Please fill in all required fields",ko:"필수 항목을 모두 입력해주세요"}},creating:{nodeType:"translation",translation:{en:"Creating...",ko:"생성 중..."}},cronPresets:{everyHour:{nodeType:"translation",translation:{en:"Every hour",ko:"매시간"}},every6Hours:{nodeType:"translation",translation:{en:"Every 6 hours",ko:"6시간마다"}},dailyMidnight:{nodeType:"translation",translation:{en:"Daily at midnight",ko:"매일 자정"}},daily8am:{nodeType:"translation",translation:{en:"Daily at 8 AM",ko:"매일 오전 8시"}},everyMonday:{nodeType:"translation",translation:{en:"Every Monday",ko:"매주 월요일"}},everyMonth:{nodeType:"translation",translation:{en:"Every month",ko:"매월"}}}},localId:"schedules::local::src/content/schedules.content.ts",location:"local",filePath:"src/content/schedules.content.ts"}],y=[{key:"settings",content:{title:{nodeType:"translation",translation:{en:"Settings",ko:"설정"}},general:{nodeType:"translation",translation:{en:"General",ko:"일반"}},appearance:{nodeType:"translation",translation:{en:"Appearance",ko:"외관"}},theme:{nodeType:"translation",translation:{en:"Theme",ko:"테마"}},language:{nodeType:"translation",translation:{en:"Language",ko:"언어"}},light:{nodeType:"translation",translation:{en:"Light",ko:"라이트"}},dark:{nodeType:"translation",translation:{en:"Dark",ko:"다크"}},system:{nodeType:"translation",translation:{en:"System",ko:"시스템"}}},localId:"settings::local::src/content/settings.content.ts",location:"local",filePath:"src/content/settings.content.ts"}],c=[{key:"sources",content:{title:{nodeType:"translation",translation:{en:"Data Sources",ko:"데이터 소스"}},subtitle:{nodeType:"translation",translation:{en:"Manage your data sources and validations",ko:"데이터 소스 및 검증 관리"}},addSource:{nodeType:"translation",translation:{en:"Add Source",ko:"소스 추가"}},addFirstSource:{nodeType:"translation",translation:{en:"Add Your First Source",ko:"첫 번째 소스 추가하기"}},editSource:{nodeType:"translation",translation:{en:"Edit Source",ko:"소스 편집"}},deleteSource:{nodeType:"translation",translation:{en:"Delete Source",ko:"소스 삭제"}},noSources:{nodeType:"translation",translation:{en:"No data sources configured",ko:"설정된 데이터 소스가 없습니다"}},noSourcesYet:{nodeType:"translation",translation:{en:"No sources yet",ko:"소스가 없습니다"}},noSourcesDesc:{nodeType:"translation",translation:{en:"Add your first data source to start monitoring data quality",ko:"데이터 품질 모니터링을 시작하려면 첫 번째 소스를 추가하세요"}},sourceName:{nodeType:"translation",translation:{en:"Source Name",ko:"소스 이름"}},sourceType:{nodeType:"translation",translation:{en:"Source Type",ko:"소스 유형"}},sourcePath:{nodeType:"translation",translation:{en:"Path / Connection",ko:"경로 / 연결"}},lastValidated:{nodeType:"translation",translation:{en:"Last validated",ko:"마지막 검증"}},never:{nodeType:"translation",translation:{en:"Never",ko:"없음"}},validate:{nodeType:"translation",translation:{en:"Validate",ko:"검증"}},loadError:{nodeType:"translation",translation:{en:"Failed to load sources",ko:"소스를 불러오지 못했습니다"}},deleteSuccess:{nodeType:"translation",translation:{en:"Source deleted successfully",ko:"소스가 삭제되었습니다"}},deleteFailed:{nodeType:"translation",translation:{en:"Failed to delete source",ko:"소스 삭제에 실패했습니다"}},validationStarted:{nodeType:"translation",translation:{en:"Validation Started",ko:"검증 시작"}},runningValidation:{nodeType:"translation",translation:{en:"Running validation...",ko:"검증 실행 중..."}},validationPassed:{nodeType:"translation",translation:{en:"Validation Passed",ko:"검증 통과"}},validationFailed:{nodeType:"translation",translation:{en:"Validation Failed",ko:"검증 실패"}},validationError:{nodeType:"translation",translation:{en:"Failed to run validation",ko:"검증 실행에 실패했습니다"}},confirmDelete:{nodeType:"translation",translation:{en:"Are you sure you want to delete this source? This will also delete all related schemas, rules, and validations.",ko:"이 소스를 삭제하시겠습니까? 관련된 모든 스키마, 규칙, 검증 결과도 함께 삭제됩니다."}},types:{file:{nodeType:"translation",translation:{en:"File",ko:"파일"}},csv:{nodeType:"translation",translation:{en:"CSV File",ko:"CSV 파일"}},parquet:{nodeType:"translation",translation:{en:"Parquet File",ko:"Parquet 파일"}},json:{nodeType:"translation",translation:{en:"JSON File",ko:"JSON 파일"}},database:{nodeType:"translation",translation:{en:"Database",ko:"데이터베이스"}},postgresql:{nodeType:"translation",translation:{en:"PostgreSQL",ko:"PostgreSQL"}},mysql:{nodeType:"translation",translation:{en:"MySQL",ko:"MySQL"}},snowflake:{nodeType:"translation",translation:{en:"Snowflake",ko:"Snowflake"}},bigquery:{nodeType:"translation",translation:{en:"BigQuery",ko:"BigQuery"}}}},localId:"sources::local::src/content/sources.content.ts",location:"local",filePath:"src/content/sources.content.ts"}],p=[{key:"validation",content:{title:{nodeType:"translation",translation:{en:"Validations",ko:"검증"}},run:{nodeType:"translation",translation:{en:"Run Validation",ko:"검증 실행"}},running:{nodeType:"translation",translation:{en:"Running...",ko:"실행 중..."}},passed:{nodeType:"translation",translation:{en:"Passed",ko:"통과"}},failed:{nodeType:"translation",translation:{en:"Failed",ko:"실패"}},error:{nodeType:"translation",translation:{en:"Error",ko:"오류"}},pending:{nodeType:"translation",translation:{en:"Pending",ko:"대기 중"}},success:{nodeType:"translation",translation:{en:"Passed",ko:"통과"}},warning:{nodeType:"translation",translation:{en:"Warning",ko:"경고"}},passRate:{nodeType:"translation",translation:{en:"Pass Rate",ko:"통과율"}},totalRules:{nodeType:"translation",translation:{en:"Total Rules",ko:"전체 규칙"}},duration:{nodeType:"translation",translation:{en:"Duration",ko:"소요 시간"}},totalIssues:{nodeType:"translation",translation:{en:"Total Issues",ko:"전체 이슈"}},criticalIssues:{nodeType:"translation",translation:{en:"Critical Issues",ko:"심각한 이슈"}},highIssues:{nodeType:"translation",translation:{en:"High Issues",ko:"높은 이슈"}},mediumIssues:{nodeType:"translation",translation:{en:"Medium Issues",ko:"중간 이슈"}},lowIssues:{nodeType:"translation",translation:{en:"Low Issues",ko:"낮은 이슈"}},noIssues:{nodeType:"translation",translation:{en:"No issues found",ko:"발견된 이슈가 없습니다"}},viewDetails:{nodeType:"translation",translation:{en:"View Details",ko:"상세 보기"}},severity:{critical:{nodeType:"translation",translation:{en:"Critical",ko:"심각"}},high:{nodeType:"translation",translation:{en:"High",ko:"높음"}},medium:{nodeType:"translation",translation:{en:"Medium",ko:"중간"}},low:{nodeType:"translation",translation:{en:"Low",ko:"낮음"}}}},localId:"validation::local::src/content/validation.content.ts",location:"local",filePath:"src/content/validation.content.ts"}],T=[{key:"validators",content:{title:{nodeType:"translation",translation:{en:"Validators",ko:"검증기"}},selectValidators:{nodeType:"translation",translation:{en:"Select Validators",ko:"검증기 선택"}},configureValidators:{nodeType:"translation",translation:{en:"Configure Validators",ko:"검증기 설정"}},categories:{schema:{nodeType:"translation",translation:{en:"Schema",ko:"스키마"}},completeness:{nodeType:"translation",translation:{en:"Completeness",ko:"완전성"}},uniqueness:{nodeType:"translation",translation:{en:"Uniqueness",ko:"유일성"}},distribution:{nodeType:"translation",translation:{en:"Distribution",ko:"분포"}},string:{nodeType:"translation",translation:{en:"String",ko:"문자열"}},datetime:{nodeType:"translation",translation:{en:"Datetime",ko:"날짜/시간"}},aggregate:{nodeType:"translation",translation:{en:"Aggregate",ko:"집계"}},crossTable:{nodeType:"translation",translation:{en:"Cross-Table",ko:"테이블 간"}},query:{nodeType:"translation",translation:{en:"Query",ko:"쿼리"}},multiColumn:{nodeType:"translation",translation:{en:"Multi-Column",ko:"다중 열"}},table:{nodeType:"translation",translation:{en:"Table",ko:"테이블"}},geospatial:{nodeType:"translation",translation:{en:"Geospatial",ko:"지리공간"}},drift:{nodeType:"translation",translation:{en:"Drift",ko:"드리프트"}},anomaly:{nodeType:"translation",translation:{en:"Anomaly",ko:"이상 탐지"}},privacy:{nodeType:"translation",translation:{en:"Privacy",ko:"프라이버시"}},timeSeries:{nodeType:"translation",translation:{en:"Time Series",ko:"시계열"}},referential:{nodeType:"translation",translation:{en:"Referential",ko:"참조"}},streaming:{nodeType:"translation",translation:{en:"Streaming",ko:"스트리밍"}},business:{nodeType:"translation",translation:{en:"Business",ko:"비즈니스"}}},categoryDescriptions:{schema:{nodeType:"translation",translation:{en:"Validate structure, columns, and data types",ko:"구조, 열, 데이터 타입 검증"}},completeness:{nodeType:"translation",translation:{en:"Check for null values and missing data",ko:"Null 값 및 누락 데이터 확인"}},uniqueness:{nodeType:"translation",translation:{en:"Detect duplicates and validate keys",ko:"중복 탐지 및 키 검증"}},distribution:{nodeType:"translation",translation:{en:"Validate value ranges and distributions",ko:"값 범위 및 분포 검증"}},string:{nodeType:"translation",translation:{en:"Pattern matching and format validation",ko:"패턴 매칭 및 형식 검증"}},datetime:{nodeType:"translation",translation:{en:"Date/time format and range validation",ko:"날짜/시간 형식 및 범위 검증"}},aggregate:{nodeType:"translation",translation:{en:"Statistical aggregate checks (mean, sum, etc.)",ko:"통계적 집계 검사 (평균, 합계 등)"}},crossTable:{nodeType:"translation",translation:{en:"Multi-table relationships and foreign keys",ko:"다중 테이블 관계 및 외래 키"}},multiColumn:{nodeType:"translation",translation:{en:"Column relationships and calculations",ko:"열 간 관계 및 계산"}},query:{nodeType:"translation",translation:{en:"Expression-based custom validation",ko:"표현식 기반 사용자 정의 검증"}},table:{nodeType:"translation",translation:{en:"Table metadata and structure validation",ko:"테이블 메타데이터 및 구조 검증"}},geospatial:{nodeType:"translation",translation:{en:"Geographic coordinate validation",ko:"지리적 좌표 검증"}},drift:{nodeType:"translation",translation:{en:"Distribution change detection between datasets",ko:"데이터셋 간 분포 변화 감지"}},anomaly:{nodeType:"translation",translation:{en:"ML-based outlier and anomaly detection",ko:"ML 기반 이상치 및 이상 탐지"}},privacy:{nodeType:"translation",translation:{en:"PII detection and compliance (GDPR, CCPA)",ko:"PII 탐지 및 규정 준수 (GDPR, CCPA)"}},timeSeries:{nodeType:"translation",translation:{en:"Time series data validation",ko:"시계열 데이터 검증"}},referential:{nodeType:"translation",translation:{en:"Referential integrity validation",ko:"참조 무결성 검증"}},streaming:{nodeType:"translation",translation:{en:"Streaming data validation",ko:"스트리밍 데이터 검증"}},business:{nodeType:"translation",translation:{en:"Business rule validation",ko:"비즈니스 규칙 검증"}}},presets:{custom:{nodeType:"translation",translation:{en:"Custom",ko:"사용자 정의"}},allValidators:{nodeType:"translation",translation:{en:"All Validators",ko:"모든 검증기"}},quickCheck:{nodeType:"translation",translation:{en:"Quick Check",ko:"빠른 검사"}},schemaOnly:{nodeType:"translation",translation:{en:"Schema Only",ko:"스키마만"}},dataQuality:{nodeType:"translation",translation:{en:"Data Quality",ko:"데이터 품질"}}},presetDescriptions:{allValidators:{nodeType:"translation",translation:{en:"Run all available validators",ko:"모든 사용 가능한 검증기 실행"}},quickCheck:{nodeType:"translation",translation:{en:"Fast validation for common issues",ko:"일반적인 문제에 대한 빠른 검증"}},schemaOnly:{nodeType:"translation",translation:{en:"Structure and type validation",ko:"구조 및 타입 검증"}},dataQuality:{nodeType:"translation",translation:{en:"Completeness and uniqueness checks",ko:"완전성 및 유일성 검사"}}},enableAll:{nodeType:"translation",translation:{en:"Enable All",ko:"모두 활성화"}},disableAll:{nodeType:"translation",translation:{en:"Disable All",ko:"모두 비활성화"}},configured:{nodeType:"translation",translation:{en:"Configured",ko:"설정됨"}},enabled:{nodeType:"translation",translation:{en:"enabled",ko:"활성화"}},validators:{nodeType:"translation",translation:{en:"validators",ko:"검증기"}},noValidatorsMatch:{nodeType:"translation",translation:{en:"No validators match your search criteria.",ko:"검색 조건에 맞는 검증기가 없습니다."}},parameters:{column:{nodeType:"translation",translation:{en:"Column",ko:"열"}},columns:{nodeType:"translation",translation:{en:"Columns",ko:"열 목록"}},addColumn:{nodeType:"translation",translation:{en:"Add column...",ko:"열 추가..."}},addValue:{nodeType:"translation",translation:{en:"Add value...",ko:"값 추가..."}},selectColumn:{nodeType:"translation",translation:{en:"Select column...",ko:"열 선택..."}},requiredField:{nodeType:"translation",translation:{en:"This field is required",ko:"필수 입력 항목입니다"}}},severity:{low:{nodeType:"translation",translation:{en:"Low",ko:"낮음"}},medium:{nodeType:"translation",translation:{en:"Medium",ko:"중간"}},high:{nodeType:"translation",translation:{en:"High",ko:"높음"}},critical:{nodeType:"translation",translation:{en:"Critical",ko:"심각"}}},parameterTypes:{string:{nodeType:"translation",translation:{en:"Text",ko:"텍스트"}},integer:{nodeType:"translation",translation:{en:"Integer",ko:"정수"}},float:{nodeType:"translation",translation:{en:"Number",ko:"숫자"}},boolean:{nodeType:"translation",translation:{en:"Yes/No",ko:"예/아니오"}},select:{nodeType:"translation",translation:{en:"Select",ko:"선택"}},multiSelect:{nodeType:"translation",translation:{en:"Multi-select",ko:"다중 선택"}},regex:{nodeType:"translation",translation:{en:"Regex Pattern",ko:"정규식 패턴"}},expression:{nodeType:"translation",translation:{en:"Expression",ko:"표현식"}},schema:{nodeType:"translation",translation:{en:"Schema (JSON)",ko:"스키마 (JSON)"}}},tooltips:{mostly:{nodeType:"translation",translation:{en:"Acceptable ratio (0.0-1.0). E.g., 0.95 means 5% exceptions allowed.",ko:"허용 비율 (0.0-1.0). 예: 0.95는 5% 예외 허용을 의미합니다."}},strict:{nodeType:"translation",translation:{en:"If enabled, validation fails strictly on any violation.",ko:"활성화하면 모든 위반에 대해 엄격하게 검증에 실패합니다."}}},errors:{loadFailed:{nodeType:"translation",translation:{en:"Failed to load validators",ko:"검증기 로드 실패"}},invalidRegex:{nodeType:"translation",translation:{en:"Invalid regular expression",ko:"잘못된 정규식"}},invalidJson:{nodeType:"translation",translation:{en:"Invalid JSON format",ko:"잘못된 JSON 형식"}},minValue:{nodeType:"translation",translation:{en:"Value must be at least",ko:"값은 최소"}},maxValue:{nodeType:"translation",translation:{en:"Value must be at most",ko:"값은 최대"}}}},localId:"validators::local::src/content/validators.content.ts",location:"local",filePath:"src/content/validators.content.ts"}],k={catalog:n,collaboration:t,common:e,dashboard:a,drift:o,errors:s,glossary:l,nav:i,notifications:r,schedules:d,settings:y,sources:c,validation:p,validators:T},u=()=>k;export{k as default,u as getUnmergedDictionaries};
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<meta name="description" content="Truthound Dashboard - Open-source data quality monitoring" />
|
|
8
8
|
<title>Truthound Dashboard</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-BZG20KuF.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-D_HyZ3pb.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: truthound-dashboard
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: Open-source data quality dashboard - GX Cloud alternative
|
|
5
5
|
Author-email: Truthound Team <team@truthound.dev>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -43,10 +43,15 @@ Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
|
43
43
|
Provides-Extra: translate
|
|
44
44
|
Description-Content-Type: text/markdown
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
|
|
47
|
+
<img width="2551" height="911" alt="스크린샷 2026-01-08 오전 11 54 18" src="https://github.com/user-attachments/assets/5e6b6d39-ee69-48f3-b0df-577f73bcb03d" />
|
|
47
48
|
|
|
48
49
|
# truthound-dashboard
|
|
49
50
|
|
|
51
|
+
> **⚠️ Under Active Development**
|
|
52
|
+
>
|
|
53
|
+
> The [truthound](https://github.com/seadonggyun4/truthound) core library has recently undergone significant API improvements and feature enhancements. This dashboard project is currently being updated to fully support these changes. Some features may not yet reflect the latest truthound capabilities. We appreciate your patience as we work to bring full compatibility.
|
|
54
|
+
|
|
50
55
|
[](https://pypi.org/project/truthound-dashboard/)
|
|
51
56
|
[](https://www.python.org/downloads/)
|
|
52
57
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
@@ -55,9 +60,10 @@ Description-Content-Type: text/markdown
|
|
|
55
60
|
|
|
56
61
|
A web-based data quality monitoring dashboard for [truthound](https://github.com/seadonggyun4/truthound).
|
|
57
62
|
|
|
58
|
-
[Documentation](https://truthound.netlify.app) | [
|
|
63
|
+
[Documentation](https://truthound.netlify.app) | [PyPI](https://pypi.org/project/truthound-dashboard/)
|
|
59
64
|
|
|
60
65
|
## Overview
|
|
66
|
+
<img width="300" height="300" alt="Truthound_icon" src="https://github.com/user-attachments/assets/90d9e806-8895-45ec-97dc-f8300da4d997" />
|
|
61
67
|
|
|
62
68
|
truthound-dashboard provides a graphical interface for managing data sources, executing validations, tracking historical results, scheduling automated checks, and configuring notifications. It serves as an alternative to commercial data quality platforms.
|
|
63
69
|
|
|
@@ -68,13 +74,16 @@ truthound-dashboard provides a graphical interface for managing data sources, ex
|
|
|
68
74
|
| Data Source Management | Available | Available |
|
|
69
75
|
| Schema Learning | Available | Available |
|
|
70
76
|
| Validation Execution | Available | Available |
|
|
77
|
+
| Validator Registry | Available | Available (150+ validators) |
|
|
71
78
|
| Validation History | Available | Available |
|
|
72
79
|
| Scheduled Validations | Available | Available |
|
|
73
80
|
| Slack Notifications | Available | Available |
|
|
74
81
|
| Email Notifications | Available | Available |
|
|
75
82
|
| Webhook Notifications | Available | Available |
|
|
76
|
-
| Drift Detection | Available | Available |
|
|
83
|
+
| Drift Detection | Available | Available (8 methods) |
|
|
77
84
|
| Data Profiling | Available | Available |
|
|
85
|
+
| PII Scan | Available | Available (GDPR/CCPA/LGPD) |
|
|
86
|
+
| Data Masking | Available | Available (redact/hash/fake) |
|
|
78
87
|
| Business Glossary | Available | Available |
|
|
79
88
|
| Data Catalog | Available | Available |
|
|
80
89
|
| Dark Mode | Available | Available |
|
|
@@ -125,8 +134,11 @@ The dashboard interface is accessible at `http://localhost:8765`.
|
|
|
125
134
|
|
|
126
135
|
### Validation
|
|
127
136
|
- On-demand validation execution using `th.check`
|
|
137
|
+
- 150+ validators across 15 categories (schema, completeness, uniqueness, distribution, string, datetime, aggregate, cross-table, multi-column, query, table, geospatial, drift, anomaly, privacy)
|
|
138
|
+
- Per-validator parameter configuration with UI
|
|
128
139
|
- Persistent storage of validation results
|
|
129
140
|
- Issue classification by severity (Critical, High, Medium, Low)
|
|
141
|
+
- Advanced options: column filtering, min_severity, parallel execution, SQL pushdown
|
|
130
142
|
|
|
131
143
|
### Validation History
|
|
132
144
|
- Historical record of validation results
|
|
@@ -143,11 +155,26 @@ The dashboard interface is accessible at `http://localhost:8765`.
|
|
|
143
155
|
|
|
144
156
|
### Drift Detection
|
|
145
157
|
- Dataset comparison using `th.compare`
|
|
146
|
-
-
|
|
158
|
+
- 8 detection methods: auto, ks, psi, chi2, js, kl, wasserstein, cvm, anderson
|
|
159
|
+
- Multiple testing correction: bonferroni, holm, bh
|
|
160
|
+
- Column-level drift analysis with statistical metrics
|
|
147
161
|
|
|
148
162
|
### Data Profiling
|
|
149
163
|
- Statistical profiling using `th.profile`
|
|
150
164
|
- Column-level statistics
|
|
165
|
+
- Sample size configuration for large datasets
|
|
166
|
+
|
|
167
|
+
### PII Scan
|
|
168
|
+
- Personal data detection using `th.scan`
|
|
169
|
+
- Supported PII types: email, phone, SSN, credit card, IP address, and more
|
|
170
|
+
- Regulation compliance: GDPR, CCPA, LGPD
|
|
171
|
+
- Configurable confidence threshold
|
|
172
|
+
|
|
173
|
+
### Data Masking
|
|
174
|
+
- Sensitive data protection using `th.mask`
|
|
175
|
+
- Three masking strategies: redact (asterisks), hash (SHA256), fake (realistic data)
|
|
176
|
+
- Auto-detection of PII columns
|
|
177
|
+
- Multiple output formats: CSV, Parquet, JSON
|
|
151
178
|
|
|
152
179
|
### Business Glossary
|
|
153
180
|
- Business term definitions with categories
|
|
@@ -309,6 +336,24 @@ npm run dev
|
|
|
309
336
|
npm run dev:mock
|
|
310
337
|
```
|
|
311
338
|
|
|
339
|
+
## Preview with Mock Data
|
|
340
|
+
|
|
341
|
+
To explore the dashboard interface without configuring a backend or data sources, the repository includes a mock mode that simulates API responses using [Mock Service Worker (MSW)](https://mswjs.io/).
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# Clone the repository
|
|
345
|
+
git clone https://github.com/seadonggyun4/truthound-dashboard
|
|
346
|
+
cd truthound-dashboard/frontend
|
|
347
|
+
|
|
348
|
+
# Install dependencies
|
|
349
|
+
npm install
|
|
350
|
+
|
|
351
|
+
# Start the development server with mock data
|
|
352
|
+
npm run dev:mock
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
The mock server provides realistic sample data for all dashboard features, enabling evaluation of the user interface and workflow without external dependencies.
|
|
356
|
+
|
|
312
357
|
## Testing
|
|
313
358
|
|
|
314
359
|
```bash
|
|
@@ -319,12 +364,6 @@ pytest
|
|
|
319
364
|
pytest --cov=truthound_dashboard
|
|
320
365
|
```
|
|
321
366
|
|
|
322
|
-
## Live Demo
|
|
323
|
-
|
|
324
|
-
A live demonstration is available at [https://truthound-dashboard.netlify.app](https://truthound-dashboard.netlify.app).
|
|
325
|
-
|
|
326
|
-
The demo instance operates using Mock Service Worker (MSW) with simulated data and does not require a backend connection.
|
|
327
|
-
|
|
328
367
|
## Documentation
|
|
329
368
|
|
|
330
369
|
Full documentation is available at [https://truthound.netlify.app](https://truthound.netlify.app).
|
|
@@ -6,22 +6,25 @@ truthound_dashboard/main.py,sha256=tfwmNCRZ2RBub68KwAvO6a6d9LJB-S5YwZtjR6X0ywk,8
|
|
|
6
6
|
truthound_dashboard/api/__init__.py,sha256=rnbuYRDgh0GcqkR-d9Trkc8L0O34K4tMH6flyeQ9U98,361
|
|
7
7
|
truthound_dashboard/api/catalog.py,sha256=qQlsM4ubzjvI6rXwSY5214C-W93Ai-Xu1YjGVs1OoxE,10928
|
|
8
8
|
truthound_dashboard/api/collaboration.py,sha256=DxfpdUl_e8NfvDzv6-uwR32NN3Us7lLkzcif8RhvKyg,4720
|
|
9
|
-
truthound_dashboard/api/deps.py,sha256=
|
|
10
|
-
truthound_dashboard/api/drift.py,sha256=
|
|
9
|
+
truthound_dashboard/api/deps.py,sha256=rtkpqo06m9nzoX7_pFE0Igzu90U-D0a0zJyTvQppMPM,4362
|
|
10
|
+
truthound_dashboard/api/drift.py,sha256=BYr_Iw2beKY0DNakoWTiLSEeXOnBUhmvBVvAsuewPWA,5725
|
|
11
11
|
truthound_dashboard/api/error_handlers.py,sha256=agovu0-CgMevgSvHh2aQnPjFpu1Wul_e67Vh9FAX_vM,8682
|
|
12
12
|
truthound_dashboard/api/glossary.py,sha256=Zdks7iHC9OLovgMJ28TELaET74OTQmUjP2TEwRLC8K4,10705
|
|
13
13
|
truthound_dashboard/api/health.py,sha256=84UPWmnS-9Fqs39SyRD2gu4QPE3ZJkaqkp5qCHkizsw,1927
|
|
14
14
|
truthound_dashboard/api/history.py,sha256=b6fy1pZfuwBqk3Yfeqnu8kaQcdNgWFMT7-0_29jLGOI,1792
|
|
15
|
+
truthound_dashboard/api/mask.py,sha256=vIxTRI0LGYu49krwUS0iT4Y3maFJ6jo1QUerOdRr7LQ,4269
|
|
15
16
|
truthound_dashboard/api/middleware.py,sha256=4oqRCT6UhY-7HwoCy96b3vhaO7XBSrCW912IxAoDm-Q,19598
|
|
16
17
|
truthound_dashboard/api/notifications.py,sha256=U1_VvgzAI3x5aKRg3zces1UwpbN9g-Tt6WFaOJziNfc,16800
|
|
17
|
-
truthound_dashboard/api/profile.py,sha256=
|
|
18
|
-
truthound_dashboard/api/router.py,sha256=
|
|
18
|
+
truthound_dashboard/api/profile.py,sha256=uvGe-aNYjcEjVEJMDNgKhOMY195Fno9bywSL7ixddAE,1710
|
|
19
|
+
truthound_dashboard/api/router.py,sha256=RBR46RNUCxJyOGs9Gt4Mdh4BqmoEpYaR0PfcSezpwpA,2416
|
|
19
20
|
truthound_dashboard/api/rules.py,sha256=6xcE5g7w9e_mt4M_XS7egIa16zcynYmXctmyayAKICs,7453
|
|
21
|
+
truthound_dashboard/api/scan.py,sha256=ew2NYqq_lpl0mMA6CE9ajqViUSgjLiR1oGtRQsyvFTw,4827
|
|
20
22
|
truthound_dashboard/api/schedules.py,sha256=NMLU0szgZ2lGvVGuSJuEACZvc2qoeN65H-d2ANprj6E,8716
|
|
21
|
-
truthound_dashboard/api/schemas.py,sha256=
|
|
23
|
+
truthound_dashboard/api/schemas.py,sha256=vo9_X9nW2mn1NQKVu5-UZWV6T9STz5y4XIiJzSeyl1Y,4389
|
|
22
24
|
truthound_dashboard/api/sources.py,sha256=uerDNqqQ4OVua_JbsDVS0fMMis-Q09mwQf6FiiOqRPU,5967
|
|
23
|
-
truthound_dashboard/api/validations.py,sha256=
|
|
24
|
-
truthound_dashboard/
|
|
25
|
+
truthound_dashboard/api/validations.py,sha256=VSSYmM2rc_aVdG5FCLTqVwgsaOwAU_EfsuQ9eGR8KqY,4922
|
|
26
|
+
truthound_dashboard/api/validators.py,sha256=42serlSC1nY_AXR4RQ-k4CbUjFnLUW9trbCn_gToYcw,2172
|
|
27
|
+
truthound_dashboard/core/__init__.py,sha256=KEFOzx_j0P0l_ueS80dswRVmraODwYpWjpHFxj1ofvE,6975
|
|
25
28
|
truthound_dashboard/core/base.py,sha256=Jp2NFNCacIt2DStGOSvyUYnx1wV-FqDkX9gLroCbo5I,5293
|
|
26
29
|
truthound_dashboard/core/cache.py,sha256=AP_7S5mK44vpQaTn5j2caQ5zumVdiQ7mICA4lIeK9y8,13937
|
|
27
30
|
truthound_dashboard/core/connections.py,sha256=tytG1eyvRDXtfxIHvzInMAKtvZXYjXWgCvtrACH_RAk,9997
|
|
@@ -31,8 +34,8 @@ truthound_dashboard/core/logging.py,sha256=Vom2C8ras6-3n7DYurKMyOqqv1L4ELq7iMTBO
|
|
|
31
34
|
truthound_dashboard/core/maintenance.py,sha256=UHuWJCPXcX39AGEJbQZ5bPYtGEl7vvB9hJ6lrX5hF48,17085
|
|
32
35
|
truthound_dashboard/core/sampling.py,sha256=K1GMFiHSDCvj1_xXVNG5Zl9rs0RfYry9Ew6u1FOHkJo,18445
|
|
33
36
|
truthound_dashboard/core/scheduler.py,sha256=B2v9NrqiiKlj36drrCNer4NCdWgpyPT5oPc22rvHsj8,10145
|
|
34
|
-
truthound_dashboard/core/services.py,sha256=
|
|
35
|
-
truthound_dashboard/core/truthound_adapter.py,sha256=
|
|
37
|
+
truthound_dashboard/core/services.py,sha256=GjK0pGOQUlYxHhceIg0OijL4hAo7T1mvyJSgRkFk-W4,57534
|
|
38
|
+
truthound_dashboard/core/truthound_adapter.py,sha256=2eMuxxs1_VDLTCeajEiL6gCEXNXp3IxqZ7dJesa5aAM,36229
|
|
36
39
|
truthound_dashboard/core/notifications/__init__.py,sha256=zWE_fEKM-9KRxHtc68YCy9cKJLBQl1KxDrsfm6vazHM,1579
|
|
37
40
|
truthound_dashboard/core/notifications/base.py,sha256=9XoNRoECeFGq5bkJkorZefQ-pmwmgJxpZcWZg_PlaDc,12128
|
|
38
41
|
truthound_dashboard/core/notifications/channels.py,sha256=Z2TNrW81u2QJWvhd4Z6n2mvbLJQMVvENtQLePetbRDg,18779
|
|
@@ -40,34 +43,55 @@ truthound_dashboard/core/notifications/dispatcher.py,sha256=GXwqcss8_jnJL68BDaLy
|
|
|
40
43
|
truthound_dashboard/core/notifications/events.py,sha256=mIkbW4m_8ofj1oYxm7o5FAxxJzP7_SIAz8WB1SeRdm4,4913
|
|
41
44
|
truthound_dashboard/core/notifications/service.py,sha256=sPgfT-kow_gHoN9FaTuWXLXjo_LLwzJogelNPv5GiHM,21169
|
|
42
45
|
truthound_dashboard/core/phase5/__init__.py,sha256=-TNyj28lQC1YjoUtBBJj3ztksN65820Y-BWZRGIEOWA,447
|
|
43
|
-
truthound_dashboard/core/phase5/activity.py,sha256=
|
|
46
|
+
truthound_dashboard/core/phase5/activity.py,sha256=cHheGj0-1zzWk_L0XdbJvTE8J24JVa3OnjP5Ulqieck,4281
|
|
44
47
|
truthound_dashboard/core/phase5/catalog.py,sha256=hLVaIHxe9BxNp2Tdf7Ru-IIH-xDqUOOitN17zQmLuis,24241
|
|
45
48
|
truthound_dashboard/core/phase5/collaboration.py,sha256=5c2UXVZDGGTkAZ3N3onagNof-hza31tE1ak8t5uM4o0,8331
|
|
46
49
|
truthound_dashboard/core/phase5/glossary.py,sha256=6v3hYXpCQTZ5xaFwBM0IrXMiOeW4giNldHIjdY88ROA,24751
|
|
47
|
-
truthound_dashboard/db/__init__.py,sha256=
|
|
50
|
+
truthound_dashboard/db/__init__.py,sha256=hebnlWqyC3l6G56uZefolO4cEssqDW1SwBCj7iw4NHQ,2271
|
|
48
51
|
truthound_dashboard/db/base.py,sha256=nj6DbYxAl5JoY0hC5rtM7pshOKpe-OH-AFsQqPGQzsM,2832
|
|
49
52
|
truthound_dashboard/db/database.py,sha256=yQ9FsQSi29HvvW0t6BrkyX5YcHijRJEjGTTGfcCCw10,5078
|
|
50
|
-
truthound_dashboard/db/models.py,sha256
|
|
53
|
+
truthound_dashboard/db/models.py,sha256=-AdktFZMC6O7TUrYP5mOla5y1HeAHIbmzLlskRJvTe8,55786
|
|
51
54
|
truthound_dashboard/db/repository.py,sha256=48AJd65rwTSt1XqTN4vUeJ8nk416buE254JqipDCEEE,6890
|
|
52
|
-
truthound_dashboard/schemas/__init__.py,sha256=
|
|
55
|
+
truthound_dashboard/schemas/__init__.py,sha256=Fcl4dmcH4R-FiU2q8tbyd5OVmON1QECUgB4tvgRYu7A,6634
|
|
53
56
|
truthound_dashboard/schemas/base.py,sha256=lJUWh47Lz4E4sBGQDSS8jIfuSsTDbfxuOxvAMsvxfOg,2977
|
|
54
57
|
truthound_dashboard/schemas/catalog.py,sha256=Gc0ky7kuWyo7naJqyyJe-S9JDF5Ge_c9oeVpUEarQqw,10556
|
|
55
|
-
truthound_dashboard/schemas/collaboration.py,sha256=
|
|
56
|
-
truthound_dashboard/schemas/drift.py,sha256=
|
|
58
|
+
truthound_dashboard/schemas/collaboration.py,sha256=xUsfK7PuNyCjD8vx4CqfktuYqkYY8oyJMe-JPJgo4uc,4873
|
|
59
|
+
truthound_dashboard/schemas/drift.py,sha256=lvrTkYzxB9YxOYHNm40KThEM0cEjKw9UZk0i8REAqG0,8353
|
|
57
60
|
truthound_dashboard/schemas/glossary.py,sha256=pY35k4zIf_4FYsdElD5fZJdJsPPQCn0Kk-EdwF8OCmI,10240
|
|
58
61
|
truthound_dashboard/schemas/history.py,sha256=OVzBmbw7uz0C4IWt43P8QxNl9_OO_-WZRdA7L44_9yo,2771
|
|
59
|
-
truthound_dashboard/schemas/
|
|
62
|
+
truthound_dashboard/schemas/mask.py,sha256=qOWMUEv2KNqACG4LcVN5n6Xq_hPqXmdM34JachB_SC0,6412
|
|
63
|
+
truthound_dashboard/schemas/profile.py,sha256=71WTl6Y1W-AQGSWeCwi_Tvr4dID-IZtNJxn8cnWc9Rc,4473
|
|
60
64
|
truthound_dashboard/schemas/rule.py,sha256=eIx9CdQ-gC6i-BpVsX714y-l0-TWY6VOVr0nSTkn_bk,5207
|
|
65
|
+
truthound_dashboard/schemas/scan.py,sha256=v4kvUaoHSvrnPAOE-6KY_IABo5Kuk99jljujT36ggoM,9032
|
|
61
66
|
truthound_dashboard/schemas/schedule.py,sha256=JkXPPqkhkIldBp_JwMD73Vlvq2h4Gq1BighnUVQdjuc,2796
|
|
62
|
-
truthound_dashboard/schemas/schema.py,sha256=
|
|
67
|
+
truthound_dashboard/schemas/schema.py,sha256=u6CI3wvK-h075zrjYVO-SsZ2Cdodjd1HdDSIPJ6abno,4980
|
|
63
68
|
truthound_dashboard/schemas/source.py,sha256=9Q_8Ysu1sKt5QvW3ncy8SMvkJ_QzuNX-VHjP-tK3qcQ,3765
|
|
64
|
-
truthound_dashboard/schemas/validation.py,sha256=
|
|
69
|
+
truthound_dashboard/schemas/validation.py,sha256=L7KO1o37BqxMsLStTQlM7xMcvwp-o2mlXxHouwWrRaM,8808
|
|
70
|
+
truthound_dashboard/schemas/validators.py,sha256=viqMl-6f8Bnp1488__PHeQUrK5yEFwUO6Z1EXtMoJ1k,1502
|
|
71
|
+
truthound_dashboard/schemas/validators/__init__.py,sha256=pVU2Qr2BheZZRo08r_OG26f45Ko31ikgXdWo0k_wTtA,1386
|
|
72
|
+
truthound_dashboard/schemas/validators/aggregate_validators.py,sha256=mJDiHHL8QlUOjtfVCgizTYVAXeoz3apyxndiWV7ArNM,8247
|
|
73
|
+
truthound_dashboard/schemas/validators/anomaly_validators.py,sha256=xYKi3BiH9FTAqHk7ETvPkbT21aAkqkrlC6kdD0S9Cvs,25557
|
|
74
|
+
truthound_dashboard/schemas/validators/base.py,sha256=67qX1XTAgyV9otGM4VP8YL1jN4phTgXXHE83Fk_C_j4,9229
|
|
75
|
+
truthound_dashboard/schemas/validators/completeness_validators.py,sha256=SfvYvErk88syGGMJqy3iSGVvSwqWhgIQZEU4VRzN3oQ,9650
|
|
76
|
+
truthound_dashboard/schemas/validators/cross_table_validators.py,sha256=TrBc6kPhvCjcqEMwFYz1MYBYYV5ULeCHoS8ogp3WIbI,14720
|
|
77
|
+
truthound_dashboard/schemas/validators/datetime_validators.py,sha256=KqUgXgxlUJOFC5Xz2QzuDzyZXn7jsZ-S2Fm978b8-n0,8278
|
|
78
|
+
truthound_dashboard/schemas/validators/distribution_validators.py,sha256=0foHX8aqFmtP9IoecSZa9uKF_so1Zaef3kC5rynhx0k,14442
|
|
79
|
+
truthound_dashboard/schemas/validators/drift_validators.py,sha256=IUp75AK-D7yq3KIL-zMCYNzCKXrBxqBe4KOLkZaR46Y,21602
|
|
80
|
+
truthound_dashboard/schemas/validators/geospatial_validators.py,sha256=EVyG0DjBi2ImJXY5C1va5YUieLhLsRmpAgn0Hp3brFU,16706
|
|
81
|
+
truthound_dashboard/schemas/validators/multi_column_validators.py,sha256=-fVAtahptvIqG686o1YR_lg7OSZHfCv5CGlwwgyPwJk,25586
|
|
82
|
+
truthound_dashboard/schemas/validators/privacy_validators.py,sha256=KGAeQum91ayP3WIPBCVhajspUctqWS8HyfotDsL26x8,20121
|
|
83
|
+
truthound_dashboard/schemas/validators/query_validators.py,sha256=bVoD7JneRSKyJENs4NDMQI8TgVmj_uomuvt4l2MlEK8,18018
|
|
84
|
+
truthound_dashboard/schemas/validators/registry.py,sha256=_3praUHNT1V_mZcufqro48dfEg9oR8MrEjy2Z0X6jKw,9304
|
|
85
|
+
truthound_dashboard/schemas/validators/schema_validators.py,sha256=o7f-6pvjX95D29gDkHpQh4PvvGd2p0wsvknqY_16gkc,15290
|
|
86
|
+
truthound_dashboard/schemas/validators/string_validators.py,sha256=28Jm-6ioe4N2QQzC7Nqu4VJje8ZCUWb-m4bX-3Ysvjk,13064
|
|
87
|
+
truthound_dashboard/schemas/validators/table_validators.py,sha256=hIt5LcGZ05QZMKPNI5J5SEWfUJfejeO7e1Q7DP3nX8k,13967
|
|
88
|
+
truthound_dashboard/schemas/validators/uniqueness_validators.py,sha256=Y23ts3FAAuhluXqz8bdFW8VMN5HZIOM7Nz9Hub0ehRw,12110
|
|
65
89
|
truthound_dashboard/static/favicon.ico,sha256=T9BJXnpyq6t6lpFHd6ivEimWF2uGFzwxDeTDyz2UVmQ,15406
|
|
66
|
-
truthound_dashboard/static/index.html,sha256=
|
|
67
|
-
truthound_dashboard/static/assets/index-
|
|
68
|
-
truthound_dashboard/static/assets/index-
|
|
90
|
+
truthound_dashboard/static/index.html,sha256=UlbLyj9-rWZ2aP1KA-sUbI_--JcCSvdRTjKTnogHwgg,568
|
|
91
|
+
truthound_dashboard/static/assets/index-BZG20KuF.js,sha256=Nzn98AeC7n6uXTBLUOm_L8UzsLuIjrkGzFLsMDe5JOg,968771
|
|
92
|
+
truthound_dashboard/static/assets/index-D_HyZ3pb.css,sha256=wPXeARxEbLW6Ef81fgGroX2tCYJrStARQ0u94k_ETME,45341
|
|
69
93
|
truthound_dashboard/static/assets/logo--IpBiMPK.png,sha256=c7ne4oaZ1BpQR5yP2TVYoAE1s1vS7lRPxgWP1pzUMYE,213715
|
|
70
|
-
truthound_dashboard/static/assets/unmerged_dictionaries-
|
|
94
|
+
truthound_dashboard/static/assets/unmerged_dictionaries-CtpqQBm0.js,sha256=bYAFLMw-Qa1FPz35dlcIAG9HCSOl7Os0EHtvRTbsL3g,49980
|
|
71
95
|
truthound_dashboard/translate/__init__.py,sha256=Mv_xtMk4SaBGUsMgJqhwARnkJkZdq4OhJi5HdpdsBnw,1458
|
|
72
96
|
truthound_dashboard/translate/config_updater.py,sha256=AtJ7ero4cHKwUYQRDbGaPAlLmcyBv0IeBewdiTo0X8c,12038
|
|
73
97
|
truthound_dashboard/translate/exceptions.py,sha256=kPxCN2n_wYl3m6jVg_DRO8pagr55YpPU2e3Dt0YVQhc,3244
|
|
@@ -79,8 +103,8 @@ truthound_dashboard/translate/providers/mistral.py,sha256=j0oh_mGksdMuIfbuZKq0yo
|
|
|
79
103
|
truthound_dashboard/translate/providers/ollama.py,sha256=XlAHE14VvdSPKFbrJIbB3KUHzrgQm0Zj08snL71otUQ,7286
|
|
80
104
|
truthound_dashboard/translate/providers/openai.py,sha256=AeaOfRjNgCIgBdcX1gcYqqf41fXeEIyN3AiLAOy3SZc,6760
|
|
81
105
|
truthound_dashboard/translate/providers/registry.py,sha256=iwfcWYJ2uKfwWjsalhV4jSoyZC7bSeujK6sTMuylMMY,6474
|
|
82
|
-
truthound_dashboard-1.
|
|
83
|
-
truthound_dashboard-1.
|
|
84
|
-
truthound_dashboard-1.
|
|
85
|
-
truthound_dashboard-1.
|
|
86
|
-
truthound_dashboard-1.
|
|
106
|
+
truthound_dashboard-1.3.1.dist-info/METADATA,sha256=oGhUZAR1r_tIWQM-2jLA4_CJK0hZoszHL2AsWrgmRVs,13188
|
|
107
|
+
truthound_dashboard-1.3.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
108
|
+
truthound_dashboard-1.3.1.dist-info/entry_points.txt,sha256=Xq8qadJ-Sqk4_0Ss_rhCqCv7uxPZZdwO3WUnbK0r6Hw,135
|
|
109
|
+
truthound_dashboard-1.3.1.dist-info/licenses/LICENSE,sha256=qrBWTDMS8ZvwVJl3Yo2n8_AxOos3s8S9pcOzLW5Nivg,10763
|
|
110
|
+
truthound_dashboard-1.3.1.dist-info/RECORD,,
|