paramify 0.1.4__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.
@@ -0,0 +1 @@
1
+ :root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}:root,:before,:after,*{--vf-primary: #07bf9b;--vf-primary-darker: #06ac8b;--vf-danger: #ef4444;--vf-danger-lighter: #fee2e2;--vf-success: #10b981;--vf-success-lighter: #d1fae5;--vf-gray-50: #f9fafb;--vf-gray-100: #f3f4f6;--vf-gray-200: #e5e7eb;--vf-gray-300: #d1d5db;--vf-gray-400: #9ca3af;--vf-gray-500: #6b7280;--vf-gray-600: #4b5563;--vf-gray-700: #374151;--vf-gray-800: #1f2937;--vf-gray-900: #111827;--vf-dark-50: #efefef;--vf-dark-100: #dcdcdc;--vf-dark-200: #bdbdbd;--vf-dark-300: #a0a0a0;--vf-dark-400: #848484;--vf-dark-500: #737373;--vf-dark-600: #393939;--vf-dark-700: #323232;--vf-dark-800: #262626;--vf-dark-900: #191919;--vf-ring-color: #07bf9b66;--vf-ring-width: 2px;--vf-link-color: var(--vf-primary);--vf-link-decoration: inherit;--vf-font-size: 1rem;--vf-font-size-sm: .875rem;--vf-font-size-lg: 1rem;--vf-font-size-small: .875rem;--vf-font-size-small-sm: .8125rem;--vf-font-size-small-lg: .875rem;--vf-font-size-h1: 2.125rem;--vf-font-size-h1-sm: 2.125rem;--vf-font-size-h1-lg: 2.125rem;--vf-font-size-h2: 1.875rem;--vf-font-size-h2-sm: 1.875rem;--vf-font-size-h2-lg: 1.875rem;--vf-font-size-h3: 1.5rem;--vf-font-size-h3-sm: 1.5rem;--vf-font-size-h3-lg: 1.5rem;--vf-font-size-h4: 1.25rem;--vf-font-size-h4-sm: 1.25rem;--vf-font-size-h4-lg: 1.25rem;--vf-font-size-h1-mobile: 1.5rem;--vf-font-size-h1-mobile-sm: 1.5rem;--vf-font-size-h1-mobile-lg: 1.5rem;--vf-font-size-h2-mobile: 1.25rem;--vf-font-size-h2-mobile-sm: 1.25rem;--vf-font-size-h2-mobile-lg: 1.25rem;--vf-font-size-h3-mobile: 1.125rem;--vf-font-size-h3-mobile-sm: 1.125rem;--vf-font-size-h3-mobile-lg: 1.125rem;--vf-font-size-h4-mobile: 1rem;--vf-font-size-h4-mobile-sm: 1rem;--vf-font-size-h4-mobile-lg: 1rem;--vf-font-size-blockquote: 1rem;--vf-font-size-blockquote-sm: .875rem;--vf-font-size-blockquote-lg: 1rem;--vf-line-height: 1.5rem;--vf-line-height-sm: 1.25rem;--vf-line-height-lg: 1.5rem;--vf-line-height-small: 1.25rem;--vf-line-height-small-sm: 1.125rem;--vf-line-height-small-lg: 1.25rem;--vf-line-height-headings: 1.2;--vf-line-height-headings-sm: 1.2;--vf-line-height-headings-lg: 1.2;--vf-line-height-blockquote: 1.5rem;--vf-line-height-blockquote-sm: 1.25rem;--vf-line-height-blockquote-lg: 1.5rem;--vf-letter-spacing: 0;--vf-letter-spacing-sm: 0;--vf-letter-spacing-lg: 0;--vf-letter-spacing-small: 0;--vf-letter-spacing-small-sm: 0;--vf-letter-spacing-small-lg: 0;--vf-letter-spacing-headings: 0;--vf-letter-spacing-headings-sm: 0;--vf-letter-spacing-headings-lg: 0;--vf-letter-spacing-blockquote: 0;--vf-letter-spacing-blockquote-sm: 0;--vf-letter-spacing-blockquote-lg: 0;--vf-gutter: 1rem;--vf-gutter-sm: .5rem;--vf-gutter-lg: 1rem;--vf-min-height-input: 2.375rem;--vf-min-height-input-sm: 2.125rem;--vf-min-height-input-lg: 2.875rem;--vf-py-input: .375rem;--vf-py-input-sm: .375rem;--vf-py-input-lg: .625rem;--vf-px-input: .75rem;--vf-px-input-sm: .5rem;--vf-px-input-lg: .875rem;--vf-py-btn: .375rem;--vf-py-btn-sm: .375rem;--vf-py-btn-lg: .625rem;--vf-px-btn: .875rem;--vf-px-btn-sm: .75rem;--vf-px-btn-lg: 1.25rem;--vf-py-btn-small: .25rem;--vf-py-btn-small-sm: .25rem;--vf-py-btn-small-lg: .375rem;--vf-px-btn-small: .625rem;--vf-px-btn-small-sm: .625rem;--vf-px-btn-small-lg: .75rem;--vf-py-group-tabs: var(--vf-py-input);--vf-py-group-tabs-sm: var(--vf-py-input-sm);--vf-py-group-tabs-lg: var(--vf-py-input-lg);--vf-px-group-tabs: var(--vf-px-input);--vf-px-group-tabs-sm: var(--vf-px-input-sm);--vf-px-group-tabs-lg: var(--vf-px-input-lg);--vf-py-group-blocks: .75rem;--vf-py-group-blocks-sm: .625rem;--vf-py-group-blocks-lg: .875rem;--vf-px-group-blocks: 1rem;--vf-px-group-blocks-sm: 1rem;--vf-px-group-blocks-lg: 1rem;--vf-py-tag: 0;--vf-py-tag-sm: var(--vf-py-tag);--vf-py-tag-lg: var(--vf-py-tag);--vf-px-tag: .4375rem;--vf-px-tag-sm: var(--vf-px-tag);--vf-px-tag-lg: var(--vf-px-tag);--vf-py-slider-tooltip: .125rem;--vf-py-slider-tooltip-sm: .0625rem;--vf-py-slider-tooltip-lg: .1875rem;--vf-px-slider-tooltip: .375rem;--vf-px-slider-tooltip-sm: .3125rem;--vf-px-slider-tooltip-lg: .5rem;--vf-py-blockquote: .25rem;--vf-py-blockquote-sm: .25rem;--vf-py-blockquote-lg: .25rem;--vf-px-blockquote: .75rem;--vf-px-blockquote-sm: .75rem;--vf-px-blockquote-lg: .75rem;--vf-py-hr: .25rem;--vf-space-addon: 0;--vf-space-addon-sm: var(--vf-space-addon);--vf-space-addon-lg: var(--vf-space-addon);--vf-space-checkbox: .375rem;--vf-space-checkbox-sm: var(--vf-space-checkbox);--vf-space-checkbox-lg: var(--vf-space-checkbox);--vf-space-tags: .1875rem;--vf-space-tags-sm: var(--vf-space-tags);--vf-space-tags-lg: var(--vf-space-tags);--vf-space-static-tag-1: 1rem;--vf-space-static-tag-2: 2rem;--vf-space-static-tag-3: 3rem;--vf-floating-top: 0rem;--vf-floating-top-sm: 0rem;--vf-floating-top-lg: .6875rem;--vf-bg-input: #ffffff;--vf-bg-input-hover: var(--vf-bg-input);--vf-bg-input-focus: var(--vf-bg-input);--vf-bg-input-danger: var(--vf-bg-input);--vf-bg-input-success: var(--vf-bg-input);--vf-bg-checkbox: var(--vf-bg-input);--vf-bg-checkbox-hover: var(--vf-bg-checkbox);--vf-bg-checkbox-focus: var(--vf-bg-checkbox);--vf-bg-checkbox-danger: var(--vf-bg-checkbox);--vf-bg-checkbox-success: var(--vf-bg-checkbox);--vf-bg-disabled: var(--vf-gray-200);--vf-bg-selected: var(--vf-gray-100);--vf-bg-passive: var(--vf-gray-300);--vf-bg-icon: var(--vf-gray-500);--vf-bg-danger: var(--vf-danger-lighter);--vf-bg-success: var(--vf-success-lighter);--vf-bg-addon: transparent;--vf-bg-tag: var(--vf-primary);--vf-bg-slider-handle: var(--vf-primary);--vf-bg-toggle-handle: #ffffff;--vf-bg-date-head: var(--vf-gray-100);--vf-bg-btn: var(--vf-primary);--vf-bg-btn-danger: var(--vf-danger);--vf-bg-btn-secondary: var(--vf-gray-200);--vf-bg-table-header: var(--vf-gray-100);--vf-color-on-primary: #ffffff;--vf-color-input: var(--vf-gray-800);--vf-color-input-hover: var(--vf-color-input);--vf-color-input-focus: var(--vf-color-input);--vf-color-input-danger: var(--vf-color-input);--vf-color-input-success: var(--vf-color-input);--vf-color-placeholder: var(--vf-gray-300);--vf-color-disabled: var(--vf-gray-400);--vf-color-passive: var(--vf-gray-700);--vf-color-muted: var(--vf-gray-500);--vf-color-floating: var(--vf-color-muted);--vf-color-floating-focus: var(--vf-color-floating);--vf-color-floating-success: var(--vf-color-floating);--vf-color-floating-danger: var(--vf-color-floating);--vf-color-danger: var(--vf-danger);--vf-color-success: var(--vf-success);--vf-color-addon: var(--vf-color-input);--vf-color-tag: var(--vf-color-on-primary);--vf-color-date-head: var(--vf-gray-700);--vf-color-btn: var(--vf-color-on-primary);--vf-color-btn-danger: #ffffff;--vf-color-btn-secondary: var(--vf-gray-700);--vf-color-table-header: inherit;--vf-border-color-input: var(--vf-gray-300);--vf-border-color-input-focus: var(--vf-primary);--vf-border-color-input-hover: var(--vf-border-color-input);--vf-border-color-input-danger: var(--vf-border-color-input);--vf-border-color-input-success: var(--vf-border-color-input);--vf-border-color-checkbox: var(--vf-border-color-input);--vf-border-color-checkbox-focus: var(--vf-primary);--vf-border-color-checkbox-hover: var(--vf-border-color-checkbox);--vf-border-color-checkbox-danger: var(--vf-border-color-checkbox);--vf-border-color-checkbox-success: var(--vf-border-color-checkbox);--vf-border-color-checked: var(--vf-primary);--vf-border-color-btn: var(--vf-primary);--vf-border-color-tag: var(--vf-primary);--vf-border-color-slider-tooltip: var(--vf-primary);--vf-border-color-passive: var(--vf-gray-300);--vf-border-color-btn-danger: var(--vf-danger);--vf-border-color-btn-secondary: var(--vf-gray-200);--vf-border-color-blockquote: var(--vf-gray-300);--vf-border-color-hr: var(--vf-gray-300);--vf-border-color-signature-hr: var(--vf-gray-300);--vf-border-color-table: var(--vf-gray-300);--vf-border-width-input-t: 1px;--vf-border-width-input-r: 1px;--vf-border-width-input-b: 1px;--vf-border-width-input-l: 1px;--vf-border-width-radio-t: var(--vf-border-width-input-t);--vf-border-width-radio-r: var(--vf-border-width-input-r);--vf-border-width-radio-b: var(--vf-border-width-input-b);--vf-border-width-radio-l: var(--vf-border-width-input-l);--vf-border-width-checkbox-t: var(--vf-border-width-input-t);--vf-border-width-checkbox-r: var(--vf-border-width-input-r);--vf-border-width-checkbox-b: var(--vf-border-width-input-b);--vf-border-width-checkbox-l: var(--vf-border-width-input-l);--vf-border-width-dropdown: 1px;--vf-border-width-btn: 1px;--vf-border-width-toggle: .125rem;--vf-border-width-tag: 1px;--vf-border-width-blockquote: 3px;--vf-border-width-table: 1px;--vf-shadow-input: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-input-hover: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-input-focus: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-handles: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-handles-hover: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-handles-focus: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-btn: 0px 0px 0px 0px rgba(0,0,0,0);--vf-shadow-dropdown: 0px 0px 0px 0px rgba(0,0,0,0);--vf-radius-input: .25rem;--vf-radius-input-sm: var(--vf-radius-input);--vf-radius-input-lg: var(--vf-radius-input);--vf-radius-btn: var(--vf-radius-input);--vf-radius-btn-sm: var(--vf-radius-input-sm);--vf-radius-btn-lg: var(--vf-radius-input);--vf-radius-small: var(--vf-radius-input);--vf-radius-small-sm: var(--vf-radius-input-sm);--vf-radius-small-lg: var(--vf-radius-input);--vf-radius-large: var(--vf-radius-input);--vf-radius-large-sm: var(--vf-radius-input-sm);--vf-radius-large-lg: var(--vf-radius-input);--vf-radius-tag: var(--vf-radius-input);--vf-radius-tag-sm: var(--vf-radius-input-sm);--vf-radius-tag-lg: var(--vf-radius-input);--vf-radius-checkbox: var(--vf-radius-input);--vf-radius-checkbox-sm: var(--vf-radius-input-sm);--vf-radius-checkbox-lg: var(--vf-radius-input);--vf-radius-slider: var(--vf-radius-input);--vf-radius-slider-sm: var(--vf-radius-input-sm);--vf-radius-slider-lg: var(--vf-radius-input);--vf-radius-image: var(--vf-radius-input);--vf-radius-image-sm: var(--vf-radius-input-sm);--vf-radius-image-lg: var(--vf-radius-input);--vf-radius-gallery: var(--vf-radius-input);--vf-radius-gallery-sm: var(--vf-radius-input-sm);--vf-radius-gallery-lg: var(--vf-radius-input);--vf-checkbox-size: 1rem;--vf-checkbox-size-sm: .875rem;--vf-checkbox-size-lg: 1rem;--vf-gallery-size: 6rem;--vf-gallery-size-sm: 5rem;--vf-gallery-size-lg: 7rem;--vf-toggle-width: 3rem;--vf-toggle-width-sm: 2.75rem;--vf-toggle-width-lg: 3rem;--vf-toggle-height: 1.25rem;--vf-toggle-height-sm: 1rem;--vf-toggle-height-lg: 1.25rem;--vf-slider-height: .375rem;--vf-slider-height-sm: .3125rem;--vf-slider-height-lg: .5rem;--vf-slider-height-vertical: 20rem;--vf-slider-height-vertical-sm: var(--vf-slider-height-vertical);--vf-slider-height-vertical-lg: var(--vf-slider-height-vertical);--vf-slider-handle-size: 1rem;--vf-slider-handle-size-sm: .875rem;--vf-slider-handle-size-lg: 1.25rem;--vf-slider-tooltip-distance: .5rem;--vf-slider-tooltip-distance-sm: .375rem;--vf-slider-tooltip-distance-lg: .5rem;--vf-slider-tooltip-arrow-size: .3125rem;--vf-slider-tooltip-arrow-size-sm: var(--vf-slider-tooltip-arrow-size);--vf-slider-tooltip-arrow-size-lg: var(--vf-slider-tooltip-arrow-size)}.dark,.dark *,.dark :before,.dark :after{--vf-bg-input: var(--vf-dark-800);--vf-bg-input-hover: var(--vf-bg-input);--vf-bg-input-focus: var(--vf-bg-input);--vf-bg-input-danger: var(--vf-bg-input);--vf-bg-input-success: var(--vf-bg-input);--vf-bg-checkbox: var(--vf-dark-700);--vf-bg-checkbox-hover: var(--vf-bg-checkbox);--vf-bg-checkbox-focus: var(--vf-bg-checkbox);--vf-bg-checkbox-danger: var(--vf-bg-checkbox);--vf-bg-checkbox-success: var(--vf-bg-checkbox);--vf-bg-disabled: var(--vf-dark-700);--vf-bg-selected: var(--vf-dark-700);--vf-bg-passive: var(--vf-dark-700);--vf-bg-icon: var(--vf-dark-400);--vf-bg-danger: var(--vf-danger-lighter);--vf-bg-success: var(--vf-success-lighter);--vf-bg-addon: transparent;--vf-bg-tag: var(--vf-primary);--vf-bg-slider-handle: var(--vf-primary);--vf-bg-toggle-handle: #ffffff;--vf-bg-date-head: var(--vf-dark-700);--vf-bg-btn: var(--vf-primary);--vf-bg-btn-danger: var(--vf-danger);--vf-bg-btn-secondary: var(--vf-dark-700);--vf-bg-table-header: var(--vf-dark-500);--vf-color-on-primary: #ffffff;--vf-color-input: var(--vf-dark-100);--vf-color-input-hover: var(--vf-color-input);--vf-color-input-focus: var(--vf-color-input);--vf-color-input-danger: var(--vf-color-input);--vf-color-input-success: var(--vf-color-input);--vf-color-placeholder: var(--vf-dark-500);--vf-color-disabled: var(--vf-dark-500);--vf-color-passive: var(--vf-dark-900);--vf-color-muted: var(--vf-dark-500);--vf-color-floating: var(--vf-color-muted);--vf-color-floating-focus: var(--vf-color-floating);--vf-color-floating-success: var(--vf-color-floating);--vf-color-floating-danger: var(--vf-color-floating);--vf-color-danger: var(--vf-danger);--vf-color-success: var(--vf-success);--vf-color-addon: initial;--vf-color-tag: var(--vf-color-on-primary);--vf-color-date-head: var(--vf-dark-200);--vf-color-btn: var(--vf-color-on-primary);--vf-color-btn-danger: #ffffff;--vf-color-btn-secondary: var(--vf-dark-300);--vf-color-table-header: inherit;--vf-border-color-input: var(--vf-dark-800);--vf-border-color-input-focus: var(--vf-primary);--vf-border-color-input-hover: var(--vf-border-color-input);--vf-border-color-input-danger: var(--vf-border-color-input);--vf-border-color-input-success: var(--vf-border-color-input);--vf-border-color-checkbox: var(--vf-border-color-input);--vf-border-color-checkbox-focus: var(--vf-primary);--vf-border-color-checkbox-hover: var(--vf-border-color-checkbox);--vf-border-color-checkbox-danger: var(--vf-border-color-checkbox);--vf-border-color-checkbox-success: var(--vf-border-color-checkbox);--vf-border-color-checked: var(--vf-primary);--vf-border-color-btn: var(--vf-primary);--vf-border-color-tag: var(--vf-primary);--vf-border-color-slider-tooltip: var(--vf-primary);--vf-border-color-passive: var(--vf-dark-700);--vf-border-color-btn-danger: var(--vf-danger);--vf-border-color-btn-secondary: var(--vf-dark-700);--vf-border-color-blockquote: var(--vf-dark-700);--vf-border-color-hr: var(--vf-dark-700);--vf-border-color-signature-hr: var(--vf-dark-500);--vf-border-color-table: var(--vf-dark-400)}form *{box-sizing:border-box}form label{margin:0}form [type=text],form [type=email],form [type=url],form [type=password],form [type=number],form [type=date],form [type=datetime-local],form [type=month],form [type=search],form [type=tel],form [type=time],form [type=week],form [type=checkbox],form [type=radio],form [multiple],form textarea,form select{-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing)}form [type=text]:focus,form [type=email]:focus,form [type=url]:focus,form [type=password]:focus,form [type=number]:focus,form [type=date]:focus,form [type=datetime-local]:focus,form [type=month]:focus,form [type=search]:focus,form [type=tel]:focus,form [type=time]:focus,form [type=week]:focus,form [type=checkbox]:focus,form [type=radio]:focus,form [multiple]:focus,form textarea:focus,form select:focus{outline:none}form [type=text]::-webkit-search-decoration,form [type=text]::-webkit-search-cancel-button,form [type=text]::-webkit-search-results-button,form [type=text]::-webkit-search-results-decoration,form [type=email]::-webkit-search-decoration,form [type=email]::-webkit-search-cancel-button,form [type=email]::-webkit-search-results-button,form [type=email]::-webkit-search-results-decoration,form [type=url]::-webkit-search-decoration,form [type=url]::-webkit-search-cancel-button,form [type=url]::-webkit-search-results-button,form [type=url]::-webkit-search-results-decoration,form [type=password]::-webkit-search-decoration,form [type=password]::-webkit-search-cancel-button,form [type=password]::-webkit-search-results-button,form [type=password]::-webkit-search-results-decoration,form [type=number]::-webkit-search-decoration,form [type=number]::-webkit-search-cancel-button,form [type=number]::-webkit-search-results-button,form [type=number]::-webkit-search-results-decoration,form [type=date]::-webkit-search-decoration,form [type=date]::-webkit-search-cancel-button,form [type=date]::-webkit-search-results-button,form [type=date]::-webkit-search-results-decoration,form [type=datetime-local]::-webkit-search-decoration,form [type=datetime-local]::-webkit-search-cancel-button,form [type=datetime-local]::-webkit-search-results-button,form [type=datetime-local]::-webkit-search-results-decoration,form [type=month]::-webkit-search-decoration,form [type=month]::-webkit-search-cancel-button,form [type=month]::-webkit-search-results-button,form [type=month]::-webkit-search-results-decoration,form [type=search]::-webkit-search-decoration,form [type=search]::-webkit-search-cancel-button,form [type=search]::-webkit-search-results-button,form [type=search]::-webkit-search-results-decoration,form [type=tel]::-webkit-search-decoration,form [type=tel]::-webkit-search-cancel-button,form [type=tel]::-webkit-search-results-button,form [type=tel]::-webkit-search-results-decoration,form [type=time]::-webkit-search-decoration,form [type=time]::-webkit-search-cancel-button,form [type=time]::-webkit-search-results-button,form [type=time]::-webkit-search-results-decoration,form [type=week]::-webkit-search-decoration,form [type=week]::-webkit-search-cancel-button,form [type=week]::-webkit-search-results-button,form [type=week]::-webkit-search-results-decoration,form [type=checkbox]::-webkit-search-decoration,form [type=checkbox]::-webkit-search-cancel-button,form [type=checkbox]::-webkit-search-results-button,form [type=checkbox]::-webkit-search-results-decoration,form [type=radio]::-webkit-search-decoration,form [type=radio]::-webkit-search-cancel-button,form [type=radio]::-webkit-search-results-button,form [type=radio]::-webkit-search-results-decoration,form [multiple]::-webkit-search-decoration,form [multiple]::-webkit-search-cancel-button,form [multiple]::-webkit-search-results-button,form [multiple]::-webkit-search-results-decoration,form textarea::-webkit-search-decoration,form textarea::-webkit-search-cancel-button,form textarea::-webkit-search-results-button,form textarea::-webkit-search-results-decoration,form select::-webkit-search-decoration,form select::-webkit-search-cancel-button,form select::-webkit-search-results-button,form select::-webkit-search-results-decoration{-webkit-appearance:none}form ::placeholder{color:var(--vf-color-placeholder)}.vf-row{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));column-gap:min(8.3333333333%,var(--vf-gutter-sm));row-gap:var(--vf-gutter-lg)}.vf-row.vf-row-sm{column-gap:min(8.3333333333%,var(--vf-gutter-sm));row-gap:var(--vf-gutter-sm)}.vf-row.vf-row-lg{column-gap:min(8.3333333333%,var(--vf-gutter-lg));row-gap:var(--vf-gutter-lg)}.vf-row.vf-row-embed{display:block}.vf-rowset{display:grid;row-gap:var(--vf-gutter)}.vf-rowset.vf-rowset-sm{row-gap:var(--vf-gutter-sm)}.vf-rowset.vf-rowset-lg{row-gap:var(--vf-gutter-lg)}.vf-col{grid-column:span 12/span 12}.vf-col-1{grid-column:span 1/span 12}.vf-col-2{grid-column:span 2/span 12}.vf-col-3{grid-column:span 3/span 12}.vf-col-4{grid-column:span 4/span 12}.vf-col-5{grid-column:span 5/span 12}.vf-col-6{grid-column:span 6/span 12}.vf-col-7{grid-column:span 7/span 12}.vf-col-8{grid-column:span 8/span 12}.vf-col-9{grid-column:span 9/span 12}.vf-col-10{grid-column:span 10/span 12}.vf-col-11{grid-column:span 11/span 12}.vf-col-12{grid-column:span 12/span 12}@media (min-width: 640px){.vf-col-sm{grid-column:span 12/span 12}.vf-col-sm-1{grid-column:span 1/span 12}.vf-col-sm-2{grid-column:span 2/span 12}.vf-col-sm-3{grid-column:span 3/span 12}.vf-col-sm-4{grid-column:span 4/span 12}.vf-col-sm-5{grid-column:span 5/span 12}.vf-col-sm-6{grid-column:span 6/span 12}.vf-col-sm-7{grid-column:span 7/span 12}.vf-col-sm-8{grid-column:span 8/span 12}.vf-col-sm-9{grid-column:span 9/span 12}.vf-col-sm-10{grid-column:span 10/span 12}.vf-col-sm-11{grid-column:span 11/span 12}.vf-col-sm-12{grid-column:span 12/span 12}}@media (min-width: 768px){.vf-col-md{grid-column:span 12/span 12}.vf-col-md-1{grid-column:span 1/span 12}.vf-col-md-2{grid-column:span 2/span 12}.vf-col-md-3{grid-column:span 3/span 12}.vf-col-md-4{grid-column:span 4/span 12}.vf-col-md-5{grid-column:span 5/span 12}.vf-col-md-6{grid-column:span 6/span 12}.vf-col-md-7{grid-column:span 7/span 12}.vf-col-md-8{grid-column:span 8/span 12}.vf-col-md-9{grid-column:span 9/span 12}.vf-col-md-10{grid-column:span 10/span 12}.vf-col-md-11{grid-column:span 11/span 12}.vf-col-md-12{grid-column:span 12/span 12}}@media (min-width: 1024px){.vf-col-lg{grid-column:span 12/span 12}.vf-col-lg-1{grid-column:span 1/span 12}.vf-col-lg-2{grid-column:span 2/span 12}.vf-col-lg-3{grid-column:span 3/span 12}.vf-col-lg-4{grid-column:span 4/span 12}.vf-col-lg-5{grid-column:span 5/span 12}.vf-col-lg-6{grid-column:span 6/span 12}.vf-col-lg-7{grid-column:span 7/span 12}.vf-col-lg-8{grid-column:span 8/span 12}.vf-col-lg-9{grid-column:span 9/span 12}.vf-col-lg-10{grid-column:span 10/span 12}.vf-col-lg-11{grid-column:span 11/span 12}.vf-col-lg-12{grid-column:span 12/span 12}}@media (min-width: 1280px){.vf-col-xl{grid-column:span 12/span 12}.vf-col-xl-1{grid-column:span 1/span 12}.vf-col-xl-2{grid-column:span 2/span 12}.vf-col-xl-3{grid-column:span 3/span 12}.vf-col-xl-4{grid-column:span 4/span 12}.vf-col-xl-5{grid-column:span 5/span 12}.vf-col-xl-6{grid-column:span 6/span 12}.vf-col-xl-7{grid-column:span 7/span 12}.vf-col-xl-8{grid-column:span 8/span 12}.vf-col-xl-9{grid-column:span 9/span 12}.vf-col-xl-10{grid-column:span 10/span 12}.vf-col-xl-11{grid-column:span 11/span 12}.vf-col-xl-12{grid-column:span 12/span 12}}@media (min-width: 1536px){.vf-col-2xl{grid-column:span 12/span 12}.vf-col-2xl-1{grid-column:span 1/span 12}.vf-col-2xl-2{grid-column:span 2/span 12}.vf-col-2xl-3{grid-column:span 3/span 12}.vf-col-2xl-4{grid-column:span 4/span 12}.vf-col-2xl-5{grid-column:span 5/span 12}.vf-col-2xl-6{grid-column:span 6/span 12}.vf-col-2xl-7{grid-column:span 7/span 12}.vf-col-2xl-8{grid-column:span 8/span 12}.vf-col-2xl-9{grid-column:span 9/span 12}.vf-col-2xl-10{grid-column:span 10/span 12}.vf-col-2xl-11{grid-column:span 11/span 12}.vf-col-2xl-12{grid-column:span 12/span 12}}.vf-contains-link a{color:var(--vf-link-color);text-decoration:var(--vf-link-decoration)}.vf-static-tag{font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing)}.vf-static-tag.vf-static-tag-sm{font-size:var(--vf-font-size-sm);line-height:var(--vf-line-height-sm);letter-spacing:var(--vf-letter-spacing-sm)}.vf-static-tag.vf-static-tag-lg{font-size:var(--vf-font-size-lg);line-height:var(--vf-line-height-lg);letter-spacing:var(--vf-letter-spacing-lg)}.vf-static-tag-left{text-align:left}.vf-static-tag-center{text-align:center}.vf-static-tag-right{text-align:right}.vf-static-tag-blockquote blockquote{font-size:var(--vf-font-size-blockquote);line-height:var(--vf-line-height-blockquote);letter-spacing:var(--vf-letter-spacing-blockquote);padding:var(--vf-py-blockquote) 0px var(--vf-py-blockquote) var(--vf-px-blockquote);border-left:var(--vf-border-width-blockquote) var(--vf-border-color-blockquote) solid;margin:0}.vf-static-tag-blockquote.vf-static-tag-sm blockquote{font-size:var(--vf-font-size-blockquote-sm);line-height:var(--vf-line-height-blockquote-sm);letter-spacing:var(--vf-letter-spacing-blockquote-sm);padding:var(--vf-py-blockquote-sm) 0px var(--vf-py-blockquote-sm) var(--vf-px-blockquote-sm)}.vf-static-tag-blockquote.vf-static-tag-lg blockquote{font-size:var(--vf-font-size-blockquote-lg);line-height:var(--vf-line-height-blockquote-lg);letter-spacing:var(--vf-letter-spacing-blockquote-lg);padding:var(--vf-py-blockquote-lg) 0px var(--vf-py-blockquote-lg) var(--vf-px-blockquote-lg)}.vf-static-tag-a a{color:var(--vf-link-color);text-decoration:var(--vf-link-decoration)}.vf-static-tag-hr{padding:var(--vf-py-hr) 0}.vf-static-tag-hr hr{border-color:var(--vf-border-color-hr)}.vf-static-tag-img img{display:inline-block}.vf-static-tag-top-1{margin-top:var(--vf-space-static-tag-1)}.vf-static-tag-top-2{margin-top:var(--vf-space-static-tag-2)}.vf-static-tag-top-3{margin-top:var(--vf-space-static-tag-3)}.vf-static-tag-bottom-1{margin-bottom:var(--vf-space-static-tag-1)}.vf-static-tag-bottom-2{margin-bottom:var(--vf-space-static-tag-2)}.vf-static-tag-bottom-3{margin-bottom:var(--vf-space-static-tag-3)}.vf-static-tag-h1 h1{font-weight:700;line-height:var(--vf-line-height-headings);letter-spacing:var(--vf-letter-spacing-headings);margin:0}.vf-static-tag-h1.vf-static-tag-sm h1{line-height:var(--vf-line-height-headings-sm);letter-spacing:var(--vf-letter-spacing-headings-sm);margin:0}.vf-static-tag-h1.vf-static-tag-lg h1{line-height:var(--vf-line-height-headings-lg);letter-spacing:var(--vf-letter-spacing-headings-lg);margin:0}.vf-static-tag-h2 h2{font-weight:700;line-height:var(--vf-line-height-headings);letter-spacing:var(--vf-letter-spacing-headings);margin:0}.vf-static-tag-h2.vf-static-tag-sm h2{line-height:var(--vf-line-height-headings-sm);letter-spacing:var(--vf-letter-spacing-headings-sm);margin:0}.vf-static-tag-h2.vf-static-tag-lg h2{line-height:var(--vf-line-height-headings-lg);letter-spacing:var(--vf-letter-spacing-headings-lg);margin:0}.vf-static-tag-h3 h3{font-weight:700;line-height:var(--vf-line-height-headings);letter-spacing:var(--vf-letter-spacing-headings);margin:0}.vf-static-tag-h3.vf-static-tag-sm h3{line-height:var(--vf-line-height-headings-sm);letter-spacing:var(--vf-letter-spacing-headings-sm);margin:0}.vf-static-tag-h3.vf-static-tag-lg h3{line-height:var(--vf-line-height-headings-lg);letter-spacing:var(--vf-letter-spacing-headings-lg);margin:0}.vf-static-tag-h4 h4{font-weight:700;line-height:var(--vf-line-height-headings);letter-spacing:var(--vf-letter-spacing-headings);margin:0}.vf-static-tag-h4.vf-static-tag-sm h4{line-height:var(--vf-line-height-headings-sm);letter-spacing:var(--vf-letter-spacing-headings-sm);margin:0}.vf-static-tag-h4.vf-static-tag-lg h4{line-height:var(--vf-line-height-headings-lg);letter-spacing:var(--vf-letter-spacing-headings-lg);margin:0}.vf-static-tag-h1 h1{font-size:var(--vf-font-size-h1-mobile)}.vf-static-tag-h1.vf-static-tag-sm h1{font-size:var(--vf-font-size-h1-mobile-sm)}.vf-static-tag-h1.vf-static-tag-lg h1{font-size:var(--vf-font-size-h1-mobile-lg)}.vf-static-tag-h2 h2{font-size:var(--vf-font-size-h2-mobile)}.vf-static-tag-h2.vf-static-tag-sm h2{font-size:var(--vf-font-size-h2-mobile-sm)}.vf-static-tag-h2.vf-static-tag-lg h2{font-size:var(--vf-font-size-h2-mobile-lg)}.vf-static-tag-h3 h3{font-size:var(--vf-font-size-h3-mobile)}.vf-static-tag-h3.vf-static-tag-sm h3{font-size:var(--vf-font-size-h3-mobile-sm)}.vf-static-tag-h3.vf-static-tag-lg h3{font-size:var(--vf-font-size-h3-mobile-lg)}.vf-static-tag-h4 h4{font-size:var(--vf-font-size-h4-mobile)}.vf-static-tag-h4.vf-static-tag-sm h4{font-size:var(--vf-font-size-h4-mobile-sm)}.vf-static-tag-h4.vf-static-tag-lg h4{font-size:var(--vf-font-size-h4-mobile-lg)}@media (min-width: 768px){.vf-static-tag-h1 h1{font-size:var(--vf-font-size-h1)}.vf-static-tag-h1.vf-static-tag-sm h1{font-size:var(--vf-font-size-h1-sm)}.vf-static-tag-h1.vf-static-tag-lg h1{font-size:var(--vf-font-size-h1-lg)}.vf-static-tag-h2 h2{font-size:var(--vf-font-size-h2)}.vf-static-tag-h2.vf-static-tag-sm h2{font-size:var(--vf-font-size-h2-sm)}.vf-static-tag-h2.vf-static-tag-lg h2{font-size:var(--vf-font-size-h2-lg)}.vf-static-tag-h3 h3{font-size:var(--vf-font-size-h3)}.vf-static-tag-h3.vf-static-tag-sm h3{font-size:var(--vf-font-size-h3-sm)}.vf-static-tag-h3.vf-static-tag-lg h3{font-size:var(--vf-font-size-h3-lg)}.vf-static-tag-h4 h4{font-size:var(--vf-font-size-h4)}.vf-static-tag-h4.vf-static-tag-sm h4{font-size:var(--vf-font-size-h4-sm)}.vf-static-tag-h4.vf-static-tag-lg h4{font-size:var(--vf-font-size-h4-lg)}}.vf-input-group{width:100%;display:flex;align-items:stretch;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:inherit;cursor:text;outline:0px solid var(--vf-ring-color);outline-offset:0;transition-property:box-shadow,color,background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;min-height:var(--vf-min-height-input);background-color:var(--vf-bg-input);color:var(--vf-color-input);border-color:var(--vf-border-color-input);box-shadow:var(--vf-shadow-input);border-radius:var(--vf-radius-input);border-width:var(--vf-border-width-input-t) var(--vf-border-width-input-r) var(--vf-border-width-input-b) var(--vf-border-width-input-l);border-style:solid}.vf-input-group .vf-input-field{font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing);padding:var(--vf-py-input) var(--vf-px-input);background:transparent;border:0;outline:0px solid transparent;outline-offset:0;flex:1 1 0%;font-family:inherit;transition:color .2s ease-in-out;min-height:100%;border-radius:var(--vf-radius-input);color:var(--vf-color-input)}.vf-input-group .vf-input-field:-webkit-autofill,.vf-input-group .vf-input-field:-webkit-autofill:hover,.vf-input-group .vf-input-field:-webkit-autofill:focus,.vf-input-group .vf-input-field:-webkit-autofill:active{-webkit-box-shadow:0 0 0 99px var(--vf-bg-input) inset!important}.vf-input-group .vf-input-field:-webkit-autofill{-webkit-text-fill-color:var(--vf-color-input)!important}.vf-input-group textarea.vf-input-field{border-radius:var(--vf-radius-large)}.vf-input-group.vf-input-group-disabled{background-color:var(--vf-bg-disabled);color:var(--vf-color-disabled);pointer-events:none}.vf-input-group.vf-input-group-disabled .vf-input-field{color:var(--vf-color-disabled)}.vf-input-group.vf-input-group-success{background-color:var(--vf-bg-input-success);color:var(--vf-color-input-success);border-color:var(--vf-border-color-input-success)}.vf-input-group.vf-input-group-success .vf-input-field{color:var(--vf-color-input-success)}.vf-input-group.vf-input-group-success .vf-input-field:-webkit-autofill,.vf-input-group.vf-input-group-success .vf-input-field:-webkit-autofill:hover,.vf-input-group.vf-input-group-success .vf-input-field:-webkit-autofill:focus,.vf-input-group.vf-input-group-success .vf-input-field:-webkit-autofill:active{-webkit-box-shadow:0 0 0 99px var(--vf-bg-input-success) inset!important}.vf-input-group.vf-input-group-success .vf-input-field:-webkit-autofill{-webkit-text-fill-color:var(--vf-color-input-success)!important}.vf-input-group.vf-input-group-danger{background-color:var(--vf-bg-input-danger);color:var(--vf-color-input-danger);border-color:var(--vf-border-color-input-danger)}.vf-input-group.vf-input-group-danger .vf-input-field{color:var(--vf-color-input-danger)}.vf-input-group.vf-input-group-danger .vf-input-field:-webkit-autofill,.vf-input-group.vf-input-group-danger .vf-input-field:-webkit-autofill:hover,.vf-input-group.vf-input-group-danger .vf-input-field:-webkit-autofill:focus,.vf-input-group.vf-input-group-danger .vf-input-field:-webkit-autofill:active{-webkit-box-shadow:0 0 0 99px var(--vf-bg-input-danger) inset!important}.vf-input-group.vf-input-group-danger .vf-input-field:-webkit-autofill{-webkit-text-fill-color:var(--vf-color-input-danger)!important}.vf-input-group.vf-input-group-focused{box-shadow:var(--vf-shadow-input-focus);outline:var(--vf-ring-width) solid var(--vf-ring-color)}.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger){border-color:var(--vf-border-color-input-focus);background-color:var(--vf-bg-input-focus);color:var(--vf-color-input-focus)}.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field{color:var(--vf-color-input-focus)}.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field:-webkit-autofill,.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field:-webkit-autofill:hover,.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field:-webkit-autofill:focus,.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field:-webkit-autofill:active{-webkit-box-shadow:0 0 0 99px var(--vf-bg-input-focus) inset!important}.vf-input-group.vf-input-group-focused:not(.vf-input-group-success):not(.vf-input-group-danger) .vf-input-field:-webkit-autofill{-webkit-text-fill-color:var(--vf-color-input-focus)!important}.vf-input-group:hover{box-shadow:var(--vf-shadow-input-hover)}.vf-input-group:hover:not(.vf-input-group-success):not(.vf-input-group-danger):not(.vf-input-group-focused){background-color:var(--vf-bg-input-hover);color:var(--vf-color-input-hover);border-color:var(--vf-border-color-input-hover)}.vf-input-group:hover:not(.vf-input-group-success):not(.vf-input-group-danger):not(.vf-input-group-focused) .vf-input-field{color:var(--vf-color-input-hover)}.vf-input-group.vf-input-group-sm{border-radius:var(--vf-radius-input-sm);min-height:var(--vf-min-height-input-sm)}.vf-input-group.vf-input-group-sm .vf-input-field{font-size:var(--vf-font-size-sm);line-height:var(--vf-line-height-sm);letter-spacing:var(--vf-letter-spacing-sm);padding:var(--vf-py-input-sm) var(--vf-px-input-sm);border-radius:var(--vf-radius-input-sm)}.vf-input-group.vf-input-group-sm.vf-input-group-textarea{border-radius:var(--vf-radius-large-sm)}.vf-input-group.vf-input-group-lg{border-radius:var(--vf-radius-input-lg);min-height:var(--vf-min-height-input-lg)}.vf-input-group.vf-input-group-lg .vf-input-field{font-size:var(--vf-font-size-lg);line-height:var(--vf-line-height-lg);letter-spacing:var(--vf-letter-spacing-lg);padding:var(--vf-py-input-lg) var(--vf-px-input-lg);border-radius:var(--vf-radius-input-lg)}.vf-input-group.vf-input-group-lg.vf-input-group-textarea{border-radius:var(--vf-radius-large-lg)}.vf-input-group .vf-floating-label{left:calc(var(--vf-px-input) - var(--vf-border-width-input-l))}.vf-input-group .vf-floating-label.vf-floating-label-lg{left:calc(var(--vf-px-input-lg) - var(--vf-border-width-input-l))}.vf-input-group .vf-floating-label.vf-floating-label-sm{left:calc(var(--vf-px-input-sm) - var(--vf-border-width-input-l))}.vf-input{width:100%;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:inherit;outline:0px solid var(--vf-ring-color);outline-offset:0;transition-property:box-shadow,color,background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing);background-color:var(--vf-bg-input);color:var(--vf-color-input);border-color:var(--vf-border-color-input);box-shadow:var(--vf-shadow-input);padding:var(--vf-py-input) var(--vf-px-input);min-height:var(--vf-min-height-input);border-radius:var(--vf-radius-input);border-width:var(--vf-border-width-input-t) var(--vf-border-width-input-r) var(--vf-border-width-input-b) var(--vf-border-width-input-l);border-style:solid}.vf-input[disabled]{background-color:var(--vf-bg-disabled);color:var(--vf-color-disabled);pointer-events:none}.vf-input.vf-input-success{background-color:var(--vf-bg-input-success);color:var(--vf-color-input-success);border-color:var(--vf-border-color-input-success)}.vf-input.vf-input-danger{background-color:var(--vf-bg-input-danger);color:var(--vf-color-input-danger);border-color:var(--vf-border-color-input-danger)}.vf-input:hover{box-shadow:var(--vf-shadow-input-hover)}.vf-input:hover:not(.vf-input-success):not(.vf-input-danger){background-color:var(--vf-bg-input-hover);color:var(--vf-color-input-hover);border-color:var(--vf-border-color-input-hover)}.vf-input:focus{box-shadow:var(--vf-shadow-input-focus);outline:var(--vf-ring-width) solid var(--vf-ring-color)}.vf-input:focus:not(.vf-input-success):not(.vf-input-danger){border-color:var(--vf-border-color-input-focus);background-color:var(--vf-bg-input-focus);color:var(--vf-color-input-focus)}.vf-input.vf-input-sm{padding:var(--vf-py-input-sm) var(--vf-px-input-sm);border-radius:var(--vf-radius-input-sm);min-height:var(--vf-min-height-input-sm);font-size:var(--vf-font-size-sm);line-height:var(--vf-line-height-sm);letter-spacing:var(--vf-letter-spacing-sm)}.vf-input.vf-input-lg{padding:var(--vf-py-input-lg) var(--vf-px-input-lg);border-radius:var(--vf-radius-input-lg);min-height:var(--vf-min-height-input-lg);font-size:var(--vf-font-size-lg);line-height:var(--vf-line-height-lg);letter-spacing:var(--vf-letter-spacing-lg)}.vf-floating-wrapper~.vf-input,.vf-floating-wrapper~div .vf-input,.vf-input-group.vf-input-group .vf-floating-wrapper~.vf-input-field,.vf-input-group.vf-input-group .vf-floating-wrapper~div .vf-input-field{padding-top:calc(var(--vf-py-input) + var(--vf-floating-top) / 2);padding-bottom:calc(var(--vf-py-input) - var(--vf-floating-top) / 2)}.vf-floating-wrapper~.vf-input-sm,.vf-floating-wrapper~div .vf-input-sm,.vf-input-group.vf-input-group-sm .vf-floating-wrapper~.vf-input-field,.vf-input-group.vf-input-group-sm .vf-floating-wrapper~div .vf-input-field{padding-top:calc(var(--vf-py-input-sm) + var(--vf-floating-top-sm) / 2);padding-bottom:calc(var(--vf-py-input-sm) - var(--vf-floating-top-sm) / 2)}.vf-floating-wrapper~.vf-input-lg,.vf-floating-wrapper~div .vf-input-lg,.vf-input-group.vf-input-group-lg .vf-floating-wrapper~.vf-input-field,.vf-input-group.vf-input-group-lg .vf-floating-wrapper~div .vf-input-field{padding-top:calc(var(--vf-py-input-lg) + var(--vf-floating-top-lg) / 2);padding-bottom:calc(var(--vf-py-input-lg) - var(--vf-floating-top-lg) / 2)}.vf-checkbox-container,.vf-checkbox-wrapper{display:flex;align-items:flex-start;width:100%}.vf-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;transition-property:box-shadow,color,background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;cursor:pointer;margin:0;margin-right:var(--vf-space-checkbox);margin-top:calc((var(--vf-line-height) - var(--vf-checkbox-size)) / 2);flex-shrink:0;border-style:solid;outline:0px solid var(--vf-ring-color);outline-offset:0;border-color:var(--vf-border-color-checkbox);box-shadow:var(--vf-shadow-handles);background-color:var(--vf-bg-checkbox);width:var(--vf-checkbox-size);height:var(--vf-checkbox-size);border-radius:var(--vf-radius-checkbox);border-width:var(--vf-border-width-checkbox-t) var(--vf-border-width-checkbox-r) var(--vf-border-width-checkbox-b) var(--vf-border-width-checkbox-l)}.vf-checkbox[disabled]{opacity:.5;pointer-events:none}.vf-checkbox.vf-checkbox-danger:not(:checked){border-color:var(--vf-border-color-checkbox-danger);background-color:var(--vf-bg-checkbox-danger)}.vf-checkbox:hover:not([disabled]){box-shadow:var(--vf-shadow-handles-hover)}.vf-checkbox:hover:not([disabled]):not(.vf-checkbox-danger):not(:checked):not(:focus){background-color:var(--vf-bg-checkbox-hover);border-color:var(--vf-border-color-checkbox-hover)}.vf-checkbox:focus{box-shadow:var(--vf-shadow-handles-focus);outline:var(--vf-ring-width) solid var(--vf-ring-color)}.vf-checkbox:focus:not(.vf-checkbox-danger):not(:checked){border-color:var(--vf-border-color-checkbox-focus);background-color:var(--vf-bg-checkbox-focus)}.vf-checkbox:checked{background-color:var(--vf-primary);border-color:var(--vf-border-color-checked)}.vf-checkbox:checked:after{content:" ";-webkit-mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");-webkit-mask-position:center center;mask-position:center center;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background-color:var(--vf-color-on-primary);display:block;position:relative;width:calc(100% + var(--vf-border-width-checkbox-l) + var(--vf-border-width-checkbox-r));height:calc(100% + var(--vf-border-width-checkbox-t) + var(--vf-border-width-checkbox-b));left:calc(var(--vf-border-width-checkbox-l) * -1);top:calc(var(--vf-border-width-checkbox-t) * -1)}.vf-checkbox.vf-checkbox-sm{width:var(--vf-checkbox-size-sm);height:var(--vf-checkbox-size-sm);border-radius:var(--vf-radius-checkbox-sm);margin-right:var(--vf-space-checkbox-sm);margin-top:calc((var(--vf-line-height-sm) - var(--vf-checkbox-size-sm)) / 2)}.vf-checkbox.vf-checkbox-lg{width:var(--vf-checkbox-size-lg);height:var(--vf-checkbox-size-lg);border-radius:var(--vf-radius-checkbox-lg);margin-right:var(--vf-space-checkbox-lg);margin-top:calc((var(--vf-line-height-lg) - var(--vf-checkbox-size-lg)) / 2)}.vf-checkbox.vf-checkbox-standalone{margin-right:0;margin-top:0}.vf-checkbox-text{cursor:pointer}.vf-radio-container,.vf-radio-wrapper{display:flex;align-items:flex-start;width:100%}.vf-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;transition-property:box-shadow,color,background-color,border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;cursor:pointer;margin:0;margin-right:var(--vf-space-checkbox);margin-top:calc((var(--vf-line-height) - var(--vf-checkbox-size)) / 2);flex-shrink:0;border-style:solid;outline:0px solid var(--vf-ring-color);outline-offset:0;display:flex;align-items:center;justify-content:center;border-radius:999px;border-color:var(--vf-border-color-checkbox);box-shadow:var(--vf-shadow-handles);background-color:var(--vf-bg-checkbox);width:var(--vf-checkbox-size);height:var(--vf-checkbox-size);border-width:var(--vf-border-width-radio-t) var(--vf-border-width-radio-r) var(--vf-border-width-radio-b) var(--vf-border-width-radio-l)}.vf-radio[disabled]{opacity:.5;pointer-events:none}.vf-radio.vf-radio-danger:not(:checked){border-color:var(--vf-border-color-checkbox-danger);background-color:var(--vf-bg-checkbox-danger)}.vf-radio:hover:not([disabled]){box-shadow:var(--vf-shadow-handles-hover)}.vf-radio:hover:not([disabled]):not(.vf-radio-danger):not(:checked):not(:focus){background-color:var(--vf-bg-checkbox-hover);border-color:var(--vf-border-color-checkbox-hover)}.vf-radio:focus{box-shadow:var(--vf-shadow-handles-focus);outline:var(--vf-ring-width) solid var(--vf-ring-color)}.vf-radio:focus:not(.vf-radio-danger):not(:checked){border-color:var(--vf-border-color-checkbox-focus);background-color:var(--vf-bg-checkbox-focus)}.vf-radio:checked{background-color:var(--vf-primary);border-color:var(--vf-border-color-checked)}.vf-radio:checked:after{content:"";-webkit-mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3.5'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='currentColor' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3.5'/%3e%3c/svg%3e");-webkit-mask-position:center center;mask-position:center center;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background-color:var(--vf-color-on-primary);display:block;width:100%;height:100%}.vf-radio.vf-radio-sm{width:var(--vf-checkbox-size-sm);height:var(--vf-checkbox-size-sm);margin-right:var(--vf-space-checkbox-sm);margin-top:calc((var(--vf-line-height-sm) - var(--vf-checkbox-size-sm)) / 2)}.vf-radio.vf-radio-lg{width:var(--vf-checkbox-size-lg);height:var(--vf-checkbox-size-lg);margin-right:var(--vf-space-checkbox-lg);margin-top:calc((var(--vf-line-height-lg) - var(--vf-checkbox-size-lg)) / 2)}.vf-radio.vf-radio-standalone{margin-right:0;margin-top:0}.vf-radio-text{cursor:pointer}.vf-btn{transition:.15s;cursor:pointer;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:inherit;line-height:inherit;text-decoration:none;color:inherit;display:inline-flex;align-items:center;justify-content:center;outline:0px solid var(--vf-ring-color);outline-offset:0;font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing);padding:var(--vf-py-btn) var(--vf-px-btn);border-radius:var(--vf-radius-btn);box-shadow:var(--vf-shadow-btn);border-width:var(--vf-border-width-btn);border-style:solid}.vf-btn:focus{box-shadow:0 0 0 var(--vf-ring-width) var(--vf-ring-color)}.vf-btn:hover:not(:disabled):not(.vf-btn-loading){text-decoration:none;transform:scale(1.05)}.vf-btn.vf-btn-sm{padding:var(--vf-py-btn-sm) var(--vf-px-btn-sm);border-radius:var(--vf-radius-btn-sm);font-size:var(--vf-font-size-sm);line-height:var(--vf-line-height-sm);letter-spacing:var(--vf-letter-spacing-sm)}.vf-btn.vf-btn-lg{padding:var(--vf-py-btn-lg) var(--vf-px-btn-lg);border-radius:var(--vf-radius-btn-lg);font-size:var(--vf-font-size-lg);line-height:var(--vf-line-height-lg);letter-spacing:var(--vf-letter-spacing-lg)}.vf-btn.vf-btn-small{font-size:var(--vf-font-size-small);line-height:var(--vf-line-height-small);letter-spacing:var(--vf-letter-spacing-small);padding:var(--vf-py-btn-small) var(--vf-px-btn-small);border-radius:var(--vf-radius-small)}.vf-btn.vf-btn-small.vf-btn-small-sm{padding:var(--vf-py-btn-small-sm) var(--vf-px-btn-small-sm);border-radius:var(--vf-radius-small-sm)}.vf-btn.vf-btn-small.vf-btn-small-lg{padding:var(--vf-py-btn-small-lg) var(--vf-px-btn-small-lg);border-radius:var(--vf-radius-small-lg)}.vf-btn.vf-btn-full{width:100%}.vf-btn.vf-btn-center{display:flex;align-items:center;justify-content:center;margin-left:auto;margin-right:auto}.vf-btn[disabled],.vf-btn.vf-btn-disabled{opacity:.6;cursor:not-allowed}.vf-btn.vf-btn-primary{background-color:var(--vf-primary);color:var(--vf-color-on-primary);border-color:var(--vf-border-color-btn)}.vf-btn.vf-btn-secondary{background-color:var(--vf-bg-btn-secondary);color:var(--vf-color-btn-secondary);border-color:var(--vf-border-color-btn-secondary)}.vf-btn.vf-btn-danger{background-color:var(--vf-bg-btn-danger);color:var(--vf-color-btn-danger);border-color:var(--vf-border-color-btn-danger)}.vf-btn.vf-btn-loading{position:relative;color:transparent!important;opacity:.6;pointer-events:none;cursor:not-allowed}.vf-btn.vf-btn-loading:after{content:"";position:absolute;left:50%;top:50%;display:inline-block;width:1rem;height:1rem;margin-left:-.5rem;margin-top:-.5rem;-webkit-animation:button-spinner 1s linear infinite;animation:button-spinner 1s linear infinite;-webkit-mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 512 512' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M456.433 371.72l-27.79-16.045c-7.192-4.152-10.052-13.136-6.487-20.636 25.82-54.328 23.566-118.602-6.768-171.03-30.265-52.529-84.802-86.621-144.76-91.424C262.35 71.922 256 64.953 256 56.649V24.56c0-9.31 7.916-16.609 17.204-15.96 81.795 5.717 156.412 51.902 197.611 123.408 41.301 71.385 43.99 159.096 8.042 232.792-4.082 8.369-14.361 11.575-22.424 6.92z'%3e%3c/path%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg viewBox='0 0 512 512' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M456.433 371.72l-27.79-16.045c-7.192-4.152-10.052-13.136-6.487-20.636 25.82-54.328 23.566-118.602-6.768-171.03-30.265-52.529-84.802-86.621-144.76-91.424C262.35 71.922 256 64.953 256 56.649V24.56c0-9.31 7.916-16.609 17.204-15.96 81.795 5.717 156.412 51.902 197.611 123.408 41.301 71.385 43.99 159.096 8.042 232.792-4.082 8.369-14.361 11.575-22.424 6.92z'%3e%3c/path%3e%3c/svg%3e");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center center;mask-position:center center}.vf-btn.vf-btn-loading.vf-btn-loading-primary:after{background-color:var(--vf-color-on-primary)}.vf-btn.vf-btn-loading.vf-btn-loading-secondary:after{background-color:var(--vf-color-btn-secondary)}.vf-btn.vf-btn-loading.vf-btn-loading-danger:after{background-color:var(--vf-color-btn-danger)}body:not([dir=rtl]) .vf-btn.vf-btn-right{float:right}body:not([dir=rtl]) .vf-checkbox-wrapper-right,body:not([dir=rtl]) .vf-radio-wrapper-right{justify-content:flex-end}body:not([dir=rtl]) .vf-checkbox-right{margin-right:0;margin-left:var(--vf-space-checkbox)}body:not([dir=rtl]) .vf-checkbox-right.vf-checkbox-sm{margin-right:0;margin-left:var(--vf-space-checkbox-sm)}body:not([dir=rtl]) .vf-checkbox-right.vf-checkbox-lg{margin-right:0;margin-left:var(--vf-space-checkbox-lg)}body:not([dir=rtl]) .vf-checkbox-right:checked:after{left:0;right:calc(var(--vf-border-width-checkbox-l) * -1)}body:not([dir=rtl]) .vf-radio-right{margin-right:0;margin-left:var(--vf-space-checkbox)}body:not([dir=rtl]) .vf-radio-right.vf-radio-sm{margin-right:0;margin-left:var(--vf-space-checkbox-sm)}body:not([dir=rtl]) .vf-radio-right.vf-radio-lg{margin-right:0;margin-left:var(--vf-space-checkbox-lg)}body:not([dir=rtl]) .vf-checkbox-text-right,body:not([dir=rtl]) .vf-radio-text-right{order:-1}body[dir=rtl] .vf-btn.vf-btn-left{float:left}body[dir=rtl] .vf-checkbox-wrapper-left,body[dir=rtl] .vf-radio-wrapper-left{justify-content:flex-end}body[dir=rtl] .vf-checkbox{margin-right:0;margin-left:var(--vf-space-checkbox)}body[dir=rtl] .vf-checkbox.vf-checkbox-sm{margin-right:0;margin-left:var(--vf-space-checkbox-sm)}body[dir=rtl] .vf-checkbox.vf-checkbox-lg{margin-right:0;margin-left:var(--vf-space-checkbox-lg)}body[dir=rtl] .vf-checkbox:checked:after{left:0;right:calc(var(--vf-border-width-checkbox-l) * -1)}body[dir=rtl] .vf-checkbox.vf-checkbox-standalone{margin-left:0}body[dir=rtl] .vf-checkbox-left{margin-left:0;margin-right:var(--vf-space-checkbox)}body[dir=rtl] .vf-checkbox-left.vf-checkbox-sm{margin-left:0;margin-right:var(--vf-space-checkbox-sm)}body[dir=rtl] .vf-checkbox-left.vf-checkbox-lg{margin-left:0;margin-right:var(--vf-space-checkbox-lg)}body[dir=rtl] .vf-checkbox-left:checked:after{left:0;right:calc(var(--vf-border-width-checkbox-l) * -1)}body[dir=rtl] .vf-radio{margin-right:0;margin-left:var(--vf-space-checkbox)}body[dir=rtl] .vf-radio.vf-radio-sm{margin-right:0;margin-left:var(--vf-space-checkbox-sm)}body[dir=rtl] .vf-radio.vf-radio-lg{margin-right:0;margin-left:var(--vf-space-checkbox-lg)}body[dir=rtl] .vf-radio.vf-radio-standalone{margin-left:0}body[dir=rtl] .vf-radio-left{margin-left:0;margin-right:var(--vf-space-checkbox)}body[dir=rtl] .vf-radio-left.vf-radio-sm{margin-left:0;margin-right:var(--vf-space-checkbox-sm)}body[dir=rtl] .vf-radio-left.vf-radio-lg{margin-left:0;margin-right:var(--vf-space-checkbox-lg)}body[dir=rtl] .vf-checkbox-text-left,body[dir=rtl] .vf-radio-text-left{order:-1}@keyframes button-spinner{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.vf-assistive-text{position:absolute;margin:-1px;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.vf-label{margin-bottom:0;display:flex;align-items:flex-start;font-size:var(--vf-font-size);line-height:var(--vf-line-height);letter-spacing:var(--vf-letter-spacing)}.vf-label-sm{font-size:var(--vf-font-size-sm);line-height:var(--vf-line-height-sm);letter-spacing:var(--vf-letter-spacing-sm)}.vf-label-lg{font-size:var(--vf-font-size-lg);line-height:var(--vf-line-height-lg);letter-spacing:var(--vf-letter-spacing-lg)}.vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-text-type .vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter);padding-bottom:0}.vf-text-type .vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm);padding-bottom:0}.vf-text-type .vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg);padding-bottom:0}.vf-text-type .vf-xs\:vf-vertical-label,:not(.vf-text-type) .vf-xs\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-xs\:vf-vertical-label-sm,:not(.vf-text-type) .vf-xs\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-xs\:vf-vertical-label-lg,:not(.vf-text-type) .vf-xs\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-xs\:vf-horizontal-label,.vf-xs\:vf-horizontal-label-sm,.vf-xs\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-xs\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-xs\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-xs\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}@media (min-width: 640px){.vf-text-type .vf-sm\:vf-vertical-label,:not(.vf-text-type) .vf-sm\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-sm\:vf-vertical-label-sm,:not(.vf-text-type) .vf-sm\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-sm\:vf-vertical-label-lg,:not(.vf-text-type) .vf-sm\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-sm\:vf-horizontal-label,.vf-sm\:vf-horizontal-label-sm,.vf-sm\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-sm\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-sm\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-sm\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}}@media (min-width: 768px){.vf-text-type .vf-md\:vf-vertical-label,:not(.vf-text-type) .vf-md\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-md\:vf-vertical-label-sm,:not(.vf-text-type) .vf-md\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-md\:vf-vertical-label-lg,:not(.vf-text-type) .vf-md\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-md\:vf-horizontal-label,.vf-md\:vf-horizontal-label-sm,.vf-md\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-md\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-md\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-md\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}}@media (min-width: 1024px){.vf-text-type .vf-lg\:vf-vertical-label,:not(.vf-text-type) .vf-lg\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-lg\:vf-vertical-label-sm,:not(.vf-text-type) .vf-lg\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-lg\:vf-vertical-label-lg,:not(.vf-text-type) .vf-lg\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-lg\:vf-horizontal-label,.vf-lg\:vf-horizontal-label-sm,.vf-lg\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-lg\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-lg\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-lg\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}}@media (min-width: 1280px){.vf-text-type .vf-xl\:vf-vertical-label,:not(.vf-text-type) .vf-xl\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-xl\:vf-vertical-label-sm,:not(.vf-text-type) .vf-xl\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-xl\:vf-vertical-label-lg,:not(.vf-text-type) .vf-xl\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-xl\:vf-horizontal-label,.vf-xl\:vf-horizontal-label-sm,.vf-xl\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-xl\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-xl\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-xl\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}}@media (min-width: 1536px){.vf-text-type .vf-2xl\:vf-vertical-label,:not(.vf-text-type) .vf-2xl\:vf-vertical-label{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter) / 3)}.vf-text-type .vf-2xl\:vf-vertical-label-sm,:not(.vf-text-type) .vf-2xl\:vf-vertical-label-sm{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-sm) / 3)}.vf-text-type .vf-2xl\:vf-vertical-label-lg,:not(.vf-text-type) .vf-2xl\:vf-vertical-label-lg{padding-top:0;padding-right:0;padding-bottom:calc(var(--vf-gutter-lg) / 3)}.vf-2xl\:vf-horizontal-label,.vf-2xl\:vf-horizontal-label-sm,.vf-2xl\:vf-horizontal-label-lg{padding-bottom:0}.vf-text-type .vf-2xl\:vf-horizontal-label{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input));padding-right:var(--vf-gutter)}.vf-text-type .vf-2xl\:vf-horizontal-label-sm{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-sm));padding-right:var(--vf-gutter-sm)}.vf-text-type .vf-2xl\:vf-horizontal-label-lg{padding-top:calc(var(--vf-border-width-input-t) + var(--vf-py-input-lg));padding-right:var(--vf-gutter-lg)}}.vf-matrix-table.is-stretch,.vf-grid-table.is-stretch{align-items:stretch}.vf-matrix-table .vf-matrix-grid,.vf-grid-table .vf-matrix-grid{border-right:var(--vf-border-width-table) solid var(--vf-border-color-table);border-bottom:var(--vf-border-width-table) solid var(--vf-border-color-table);gap:0!important}.vf-matrix-table .vf-matrix-header-first,.vf-matrix-table .vf-matrix-header,.vf-matrix-table .vf-matrix-header-remove,.vf-matrix-table .vf-matrix-row-label,.vf-matrix-table .vf-matrix-cell,.vf-matrix-table .vf-matrix-row-remove,.vf-grid-table .vf-matrix-header-first,.vf-grid-table .vf-matrix-header,.vf-grid-table .vf-matrix-header-remove,.vf-grid-table .vf-matrix-row-label,.vf-grid-table .vf-matrix-cell,.vf-grid-table .vf-matrix-row-remove{border-left:var(--vf-border-width-table) solid var(--vf-border-color-table);border-top:var(--vf-border-width-table) solid var(--vf-border-color-table)}.vf-matrix-table .vf-matrix-header.is-sticky,.vf-grid-table .vf-matrix-header.is-sticky{border-bottom:var(--vf-border-width-table) solid var(--vf-border-color-table)}.vf-matrix-table .vf-matrix-row-label.is-sticky,.vf-grid-table .vf-matrix-row-label.is-sticky{border-right:var(--vf-border-width-table) solid var(--vf-border-color-table)}.vf-matrix-table .vf-matrix-header-first,.vf-matrix-table .vf-matrix-header,.vf-matrix-table .vf-matrix-header-remove,.vf-matrix-table .vf-matrix-row-label,.vf-grid-table .vf-matrix-header-first,.vf-grid-table .vf-matrix-header,.vf-grid-table .vf-matrix-header-remove,.vf-grid-table .vf-matrix-row-label{background:var(--vf-bg-table-header);color:var(--vf-color-table-header)}.vf-matrix-table .vf-matrix-row-remove,.vf-grid-table .vf-matrix-row-remove{background:var(--vf-bg-table-header)}.vf-matrix-table .vf-matrix-cell,.vf-grid-table .vf-matrix-cell{background:var(--vf-bg-input)}.vf-matrix-table .vf-matrix-header.is-sticky,.vf-grid-table .vf-matrix-header.is-sticky{margin-bottom:calc(var(--vf-border-width-table) * -1)}.vf-matrix-table .vf-matrix-header.is-not-sticky,.vf-grid-table .vf-matrix-header.is-not-sticky{border-bottom-width:0}.vf-matrix-table .vf-matrix-row-label.is-sticky,.vf-grid-table .vf-matrix-row-label.is-sticky{margin-right:calc(var(--vf-border-width-table) * -1)}.vf-matrix-table .vf-matrix-row-label.is-not-sticky,.vf-grid-table .vf-matrix-row-label.is-not-sticky{border-right-width:0}.vf-matrix-table .vf-matrix-cell-wrapper.has-padding,.vf-grid-table .vf-matrix-cell-wrapper.has-padding{padding-left:0;padding-right:0}.vf-matrix-table .vf-matrix-cell-wrapper.is-stretch,.vf-grid-table .vf-matrix-cell-wrapper.is-stretch{align-items:stretch}.vf-matrix-table .vf-matrix-cell-wrapper.has-error,.vf-grid-table .vf-matrix-cell-wrapper.has-error{position:relative}.vf-matrix-table .vf-matrix-cell-wrapper.has-error:after,.vf-grid-table .vf-matrix-cell-wrapper.has-error:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:inset 0 0 0 1px var(--vf-danger);pointer-events:none}.vf-matrix-table .vf-matrix-row-label,.vf-grid-table .vf-matrix-row-label{padding-left:.5rem}.vf-matrix-table .vf-grid,.vf-grid-table .vf-grid{border-right:var(--vf-border-width-table) solid var(--vf-border-color-table);border-bottom:var(--vf-border-width-table) solid var(--vf-border-color-table);gap:0}.vf-matrix-table .vf-grid-cell,.vf-grid-table .vf-grid-cell{border-left:var(--vf-border-width-table) solid var(--vf-border-color-table);border-top:var(--vf-border-width-table) solid var(--vf-border-color-table);background:var(--vf-bg-input)}.vf-matrix-table .vf-matrix-cell-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-before,.vf-matrix-table .vf-matrix-cell-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-after,.vf-grid-table .vf-matrix-cell-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-before,.vf-grid-table .vf-matrix-cell-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-after{display:none}.vf-matrix-table .vf-layout-inner-wrapper,.vf-matrix-table .vf-element-layout-outer-wrapper,.vf-grid-table .vf-layout-inner-wrapper,.vf-grid-table .vf-element-layout-outer-wrapper{height:100%}.vf-matrix-table .vf-input-group,.vf-grid-table .vf-input-group{border:0;border-radius:0;height:100%}.vf-matrix-table .vf-input-group.vf-input-group-focused,.vf-grid-table .vf-input-group.vf-input-group-focused{position:relative;z-index:1}.vf-matrix-table .vf-input-group.vf-input-group-sm,.vf-grid-table .vf-input-group.vf-input-group-sm,.vf-matrix-table .vf-input,.vf-grid-table .vf-input{height:100%}.vf-matrix-table .vf-native-select,.vf-grid-table .vf-native-select{height:100%;border:0;border-radius:0}.vf-matrix-table .vf-native-select:focus,.vf-grid-table .vf-native-select:focus{position:relative;z-index:1}.vf-matrix-table .vf-native-select-wrapper,.vf-grid-table .vf-native-select-wrapper{height:100%}.vf-matrix-table .vf-native-select-caret,.vf-grid-table .vf-native-select-caret{z-index:2}.vf-matrix-table .vf-multiselect,.vf-grid-table .vf-multiselect{height:100%;border:0;border-radius:0}.vf-matrix-table .vf-multiselect-active,.vf-grid-table .vf-multiselect-active{position:relative;z-index:1}.vf-matrix-table .vf-multiselect-wrapper,.vf-grid-table .vf-multiselect-wrapper{height:100%}.vf-matrix-table .vf-native-multiselect,.vf-grid-table .vf-native-multiselect{height:100%;border:0;border-radius:0}.vf-matrix-table .vf-native-multiselect:focus,.vf-grid-table .vf-native-multiselect:focus{position:relative;z-index:1}.vf-matrix-table .vf-native-multiselect-wrapper,.vf-grid-table .vf-native-multiselect-wrapper{height:100%}.vf-matrix-table .vf-editor,.vf-grid-table .vf-editor{height:100%;display:flex;flex-direction:column;border:0;border-radius:0}.vf-matrix-table .vf-editor.vf-editor-focused,.vf-grid-table .vf-editor.vf-editor-focused{position:relative;z-index:1}.vf-matrix-table trix-editor,.vf-grid-table trix-editor{height:100%}.vf-matrix-table .vf-checkboxgroup-view-default,.vf-matrix-table .vf-radiogroup-view-default,.vf-grid-table .vf-checkboxgroup-view-default,.vf-grid-table .vf-radiogroup-view-default{padding:.25rem .5rem}.vf-matrix-table .vf-checkboxgroup-tabs-wrapper,.vf-matrix-table .vf-radiogroup-tabs-wrapper,.vf-grid-table .vf-checkboxgroup-tabs-wrapper,.vf-grid-table .vf-radiogroup-tabs-wrapper{height:100%;border-radius:0}.vf-matrix-table .vf-checkbox-tabs,.vf-matrix-table .vf-radio-tabs,.vf-grid-table .vf-checkbox-tabs,.vf-grid-table .vf-radio-tabs{border-width:0;border-left-width:var(--vf-border-width-input-t)}.vf-matrix-table .vf-checkbox-tabs.vf-checkbox-tabs-first,.vf-matrix-table .vf-radio-tabs.vf-radio-tabs-first,.vf-grid-table .vf-checkbox-tabs.vf-checkbox-tabs-first,.vf-grid-table .vf-radio-tabs.vf-radio-tabs-first{border:0}.vf-matrix-table .vf-checkbox-tabs.vf-checkbox-tabs-first,.vf-matrix-table .vf-checkbox-tabs.vf-checkbox-tabs-last,.vf-matrix-table .vf-radio-tabs.vf-radio-tabs-first,.vf-matrix-table .vf-radio-tabs.vf-radio-tabs-last,.vf-grid-table .vf-checkbox-tabs.vf-checkbox-tabs-first,.vf-grid-table .vf-checkbox-tabs.vf-checkbox-tabs-last,.vf-grid-table .vf-radio-tabs.vf-radio-tabs-first,.vf-grid-table .vf-radio-tabs.vf-radio-tabs-last{border-radius:0}.vf-matrix-table .vf-checkbox-blocks,.vf-matrix-table .vf-radio-blocks,.vf-grid-table .vf-checkbox-blocks,.vf-grid-table .vf-radio-blocks{border-width:0;min-height:100%}.vf-matrix-table .vf-checkbox-blocks:not(.vf-checkbox-blocks-first),.vf-matrix-table .vf-radio-blocks:not(.vf-radio-blocks-first),.vf-grid-table .vf-checkbox-blocks:not(.vf-checkbox-blocks-first),.vf-grid-table .vf-radio-blocks:not(.vf-radio-blocks-first){border-top-width:var(--vf-border-width-input-t)}.vf-matrix-table .vf-checkboxgroup-blocks-wrapper,.vf-matrix-table .vf-radiogroup-blocks-wrapper,.vf-grid-table .vf-checkboxgroup-blocks-wrapper,.vf-grid-table .vf-radiogroup-blocks-wrapper{height:100%;border-radius:0}.vf-matrix-table .vf-checkbox-blocks-container,.vf-matrix-table .vf-radio-blocks-container,.vf-grid-table .vf-checkbox-blocks-container,.vf-grid-table .vf-radio-blocks-container{flex:1}.vf-matrix-table .vf-checkbox-blocks.vf-checkbox-blocks-first,.vf-matrix-table .vf-checkbox-blocks.vf-checkbox-blocks-last,.vf-matrix-table .vf-radio-blocks.vf-radio-blocks-first,.vf-matrix-table .vf-radio-blocks.vf-radio-blocks-last,.vf-grid-table .vf-checkbox-blocks.vf-checkbox-blocks-first,.vf-grid-table .vf-checkbox-blocks.vf-checkbox-blocks-last,.vf-grid-table .vf-radio-blocks.vf-radio-blocks-first,.vf-grid-table .vf-radio-blocks.vf-radio-blocks-last{border-radius:0}.vf-matrix-table .vf-slider-wrapper,.vf-grid-table .vf-slider-wrapper{height:100%;width:100%;display:flex;align-items:center;justify-content:center;margin-top:0}.vf-matrix-table .vf-slider-target,.vf-grid-table .vf-slider-target{width:100%;margin-left:1rem;margin-right:1rem}.vf-matrix-table .vf-grid .vf-btn,.vf-matrix-table .vf-matrix-grid .vf-btn,.vf-grid-table .vf-grid .vf-btn,.vf-grid-table .vf-matrix-grid .vf-btn{width:100%;border-radius:0}.vf-matrix-table .vf-grid .vf-btn:hover:not(:disabled):not(.vf-btn-loading),.vf-matrix-table .vf-matrix-grid .vf-btn:hover:not(:disabled):not(.vf-btn-loading),.vf-grid-table .vf-grid .vf-btn:hover:not(:disabled):not(.vf-btn-loading),.vf-grid-table .vf-matrix-grid .vf-btn:hover:not(:disabled):not(.vf-btn-loading){transform:none;filter:brightness(.95)}.vf-matrix-table .vf-grid .vf-btn:focus,.vf-matrix-table .vf-matrix-grid .vf-btn:focus,.vf-grid-table .vf-grid .vf-btn:focus,.vf-grid-table .vf-matrix-grid .vf-btn:focus{position:relative;z-index:1}.vf-matrix-table .vf-static,.vf-grid-table .vf-static{height:100%}.vf-matrix-table .vf-file-preview-wrapper,.vf-matrix-table .vf-file-preview-image-wrapper,.vf-matrix-table .vf-file-preview-gallery-wrapper,.vf-grid-table .vf-file-preview-wrapper,.vf-grid-table .vf-file-preview-image-wrapper,.vf-grid-table .vf-file-preview-gallery-wrapper{padding:.25rem}.vf-matrix-table .vf-multifile-list,.vf-grid-table .vf-multifile-list{margin-top:0}.vf-grid-table .vf-grid-field-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-before,.vf-grid-table .vf-grid-field-wrapper>.vf-element-layout>.vf-element-layout-outer-wrapper>.vf-layout-inner-container>.vf-layout-inner-wrapper-after{display:none}.vf-grid-table .vf-grid-field-wrapper .vf-label{display:none}.vf-grid-table .vf-static,.vf-grid-table .vf-static-tag,.vf-grid-table .vf-checkbox-wrapper,.vf-grid-table .vf-radio-wrapper,.vf-grid-table .vf-toggle-wrapper{padding:var(--vf-py-input) var(--vf-px-input)}.vf-grid-table .vf-static-sm,.vf-grid-table .vf-static-tag-sm,.vf-grid-table .vf-checkbox-wrapper-sm,.vf-grid-table .vf-radio-wrapper-sm,.vf-grid-table .vf-toggle-wrapper-sm{padding:var(--vf-py-input-sm) var(--vf-px-input-sm)}.vf-grid-table .vf-static-lg,.vf-grid-table .vf-static-tag-lg,.vf-grid-table .vf-checkbox-wrapper-lg,.vf-grid-table .vf-radio-wrapper-lg,.vf-grid-table .vf-toggle-wrapper-lg{padding:var(--vf-py-input-lg) var(--vf-px-input-lg)}.vf-grid-table .vf-signature{border:none;border-radius:0}@media (prefers-color-scheme: dark){:root{background-color:#121212}:root,:before,:after,*{--vf-bg-input: var(--vf-dark-800);--vf-bg-input-hover: var(--vf-bg-input);--vf-bg-input-focus: var(--vf-bg-input);--vf-bg-input-danger: var(--vf-bg-input);--vf-bg-input-success: var(--vf-bg-input);--vf-bg-checkbox: var(--vf-dark-700);--vf-bg-checkbox-hover: var(--vf-bg-checkbox);--vf-bg-checkbox-focus: var(--vf-bg-checkbox);--vf-bg-checkbox-danger: var(--vf-bg-checkbox);--vf-bg-checkbox-success: var(--vf-bg-checkbox);--vf-bg-disabled: var(--vf-dark-700);--vf-bg-selected: var(--vf-dark-700);--vf-bg-passive: var(--vf-dark-700);--vf-bg-icon: var(--vf-dark-400);--vf-bg-danger: var(--vf-danger-lighter);--vf-bg-success: var(--vf-success-lighter);--vf-bg-addon: transparent;--vf-bg-tag: var(--vf-primary);--vf-bg-slider-handle: var(--vf-primary);--vf-bg-toggle-handle: #ffffff;--vf-bg-date-head: var(--vf-dark-700);--vf-bg-btn: var(--vf-primary);--vf-bg-btn-danger: var(--vf-danger);--vf-bg-btn-secondary: var(--vf-dark-700);--vf-bg-table-header: var(--vf-dark-500);--vf-color-on-primary: #ffffff;--vf-color-input: var(--vf-dark-100);--vf-color-input-hover: var(--vf-color-input);--vf-color-input-focus: var(--vf-color-input);--vf-color-input-danger: var(--vf-color-input);--vf-color-input-success: var(--vf-color-input);--vf-color-placeholder: var(--vf-dark-500);--vf-color-disabled: var(--vf-dark-500);--vf-color-passive: var(--vf-dark-900);--vf-color-muted: var(--vf-dark-500);--vf-color-floating: var(--vf-color-muted);--vf-color-floating-focus: var(--vf-color-floating);--vf-color-floating-success: var(--vf-color-floating);--vf-color-floating-danger: var(--vf-color-floating);--vf-color-danger: var(--vf-danger);--vf-color-success: var(--vf-success);--vf-color-addon: initial;--vf-color-tag: var(--vf-color-on-primary);--vf-color-date-head: var(--vf-dark-200);--vf-color-btn: var(--vf-color-on-primary);--vf-color-btn-danger: #ffffff;--vf-color-btn-secondary: var(--vf-dark-300);--vf-color-table-header: inherit;--vf-border-color-input: var(--vf-dark-800);--vf-border-color-input-focus: var(--vf-primary);--vf-border-color-input-hover: var(--vf-border-color-input);--vf-border-color-input-danger: var(--vf-border-color-input);--vf-border-color-input-success: var(--vf-border-color-input);--vf-border-color-checkbox: var(--vf-border-color-input);--vf-border-color-checkbox-focus: var(--vf-primary);--vf-border-color-checkbox-hover: var(--vf-border-color-checkbox);--vf-border-color-checkbox-danger: var(--vf-border-color-checkbox);--vf-border-color-checkbox-success: var(--vf-border-color-checkbox);--vf-border-color-checked: var(--vf-primary);--vf-border-color-btn: var(--vf-primary);--vf-border-color-tag: var(--vf-primary);--vf-border-color-slider-tooltip: var(--vf-primary);--vf-border-color-passive: var(--vf-dark-700);--vf-border-color-btn-danger: var(--vf-danger);--vf-border-color-btn-secondary: var(--vf-dark-700);--vf-border-color-blockquote: var(--vf-dark-700);--vf-border-color-hr: var(--vf-dark-700);--vf-border-color-signature-hr: var(--vf-dark-500);--vf-border-color-table: var(--vf-dark-400)}}
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en" style="background-color: WhiteSmoke; ">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>Vite + Vue + TS</title>
9
+ <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBCToIMP1Rk6ZbGcfnJ2iwsnb09_lnxLmY&libraries=places"></script>
10
+ <script type="module" crossorigin src="/assets/index-C3Xrcbp_.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-DwXyNpx-.css">
12
+ </head>
13
+ <body>
14
+ <div id="app" style="background-color: white; border-radius: 10px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);"></div>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 LuxAI S.A.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,281 @@
1
+ Metadata-Version: 2.2
2
+ Name: paramify
3
+ Version: 0.1.4
4
+ Summary: A lightweight Python library for dynamic parameter management and runtime configuration.
5
+ Home-page: https://github.com/luxai-qtrobot/paramify
6
+ Author: Ali PAikan
7
+ Author-email: ali.paikan@gmail.com
8
+ License: MIT
9
+ Project-URL: Documentation, https://github.com/luxai-qtrobot/paramify#readme
10
+ Project-URL: Source, https://github.com/luxai-qtrobot/paramify
11
+ Project-URL: Tracker, https://github.com/luxai-qtrobot/paramify/issues
12
+ Keywords: parameter management configuration dynamic runtime UI
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.7
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Topic :: Software Development :: Libraries
22
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
23
+ Requires-Python: >=3.7
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: Flask>=2.0.0
27
+ Requires-Dist: pydantic>=1.10.0
28
+ Requires-Dist: ruamel.yaml>=0.17.0
29
+ Dynamic: author
30
+ Dynamic: author-email
31
+ Dynamic: classifier
32
+ Dynamic: description
33
+ Dynamic: description-content-type
34
+ Dynamic: home-page
35
+ Dynamic: keywords
36
+ Dynamic: license
37
+ Dynamic: project-url
38
+ Dynamic: requires-dist
39
+ Dynamic: requires-python
40
+ Dynamic: summary
41
+
42
+
43
+ # Paramify
44
+
45
+ ![Test Status](https://github.com/luxai-qtrobot/paramify/actions/workflows/python-tests.yml/badge.svg)
46
+
47
+ **Paramify** is a lightweight Python library designed to simplify dynamic parameter management. It allows developers to define, validate, and manage parameters dynamically using a JSON or YAML schema, with optional support for **command-line integration** and a **web-based parameter configuration**.
48
+
49
+ ---
50
+
51
+ ## Key Features
52
+
53
+ - **Dynamic Parameter Management**: Easily define and manage parameters using a simple JSON schema.
54
+ - **Command-Line Integration**: Automatically generate CLI arguments using `argparser` based on your configuration, allowing runtime overrides without separate definitions.
55
+ - **Web Interface**: Expose parameters through a user-friendly Flask-based UI for runtime configuration.
56
+ - **Validation**: Automatically validate parameters with the help of Pydantic.
57
+ - **Custom Callbacks**: Define optional callbacks to handle updates to specific parameters.
58
+ - **JSON/YAML Integration**: Load and manage parameters directly from JSON or YAML files for flexible configurations.
59
+ - **Scope-Based Control:** Specify a parameter's scope as `"runtime"`, `"cli"` and `"all"`
60
+ - **Extensible**: Developers can extend the base class to add custom behaviors.
61
+
62
+
63
+ Here is an example of the Paramify web interface:
64
+
65
+ ![Paramify Web UI](https://github.com/luxai-qtrobot/paramify/raw/main/assets/ui-screenshot.png)
66
+
67
+ ---
68
+
69
+ ## Installation
70
+
71
+ To install Paramify, use the following command:
72
+
73
+ ```bash
74
+ pip install paramify
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Quick Start
80
+
81
+ ### 1. Programmatic Parameter Management
82
+
83
+ Below is an example of using Paramify for managing parameters dynamically:
84
+
85
+ ```python
86
+ from logger import Logger
87
+ from paramify.paramify import Paramify
88
+
89
+ # Define optional callback functions
90
+ class MyApp(Paramify):
91
+ def on_param1_set(self, value):
92
+ Logger.info(f"param1 was updated to {value}")
93
+
94
+ def on_param2_set(self, value):
95
+ Logger.info(f"param2 was updated to {value}")
96
+
97
+
98
+ if __name__ == '__main__':
99
+ params = {
100
+ "parameters": [
101
+ {"name": "param1", "type": "bool", "label": "Enable Feature", "default": True},
102
+ {"name": "param2", "type": "int", "label": "Integer Value", "default": 4},
103
+ ]
104
+ }
105
+
106
+ app = MyApp(params)
107
+
108
+ # Access default or loaded values
109
+ Logger.info(app.parameters.param1)
110
+ Logger.info(app.parameters.param2)
111
+
112
+ # Update values and trigger callbacks
113
+ app.set_param1(False)
114
+ app.set_param2(23)
115
+
116
+ # View current parameters
117
+ Logger.info(app.get_parameters())
118
+ ```
119
+
120
+ This example demonstrates how to define parameters, set values programmatically, and trigger custom callbacks.
121
+
122
+ ---
123
+
124
+ ### 2. Web-Based Parameter Management
125
+
126
+ Below is an example of using **ParamifyWeb** to expose parameters through a web interface:
127
+
128
+ ```python
129
+ import json
130
+ from logger import Logger
131
+ from paramify.paramify_web import ParamifyWeb
132
+
133
+ # Define optional callback functions
134
+ class MyApp(ParamifyWeb):
135
+ def on_param1_set(self, value):
136
+ Logger.info(f"Boolean parameter was updated to {value}")
137
+
138
+ def on_param2_set(self, value):
139
+ Logger.info(f"Integer parameter was updated to {value}")
140
+
141
+ def on_param3_set(self, value):
142
+ Logger.info(f"Float parameter was updated to {value}")
143
+
144
+ def on_param4_set(self, value):
145
+ Logger.info(f"Selectable parameter was updated to {value}")
146
+
147
+ def on_param5_set(self, value):
148
+ Logger.info(f"List parameter was updated to {value}")
149
+
150
+ def on_param6_set(self, value):
151
+ Logger.info(f"Simple string was updated to {value}")
152
+
153
+ def on_param7_set(self, value):
154
+ Logger.info(f"Text area value was updated to {value}")
155
+
156
+
157
+ if __name__ == '__main__':
158
+ # Initialize the app with parameters from a YAML file
159
+ app = MyApp('config.yaml')
160
+
161
+ # Prevent the script from exiting immediately
162
+ input("Press Enter to continue...")
163
+ ```
164
+
165
+ This example demonstrates how to load parameters from a YAML file and expose them via a web interface. Callback functions are triggered when parameters are updated.
166
+
167
+ ---
168
+
169
+ ## YAML Configuration Example
170
+
171
+ Here is an example of a JSON configuration file:
172
+ ```yaml
173
+ name: "My Example App"
174
+ description: "This is an example app to demonstrate the usage of Paramify"
175
+ parameters:
176
+ - name: "param1"
177
+ type: "bool"
178
+ label: "Enable Feature"
179
+ description: "A boolean parameter to enable or disable a feature."
180
+ default: true
181
+ scope: "all" # cli, runtime, all
182
+
183
+ - name: "param2"
184
+ type: "int"
185
+ label: "Integer Value"
186
+ description: "An integer parameter for numeric configuration."
187
+ default: 4
188
+ ui:
189
+ element: "slider"
190
+ min: 1
191
+ max: 10
192
+
193
+ - name: "param3"
194
+ type: "str"
195
+ label: "Select Option"
196
+ description: "A parameter to select from predefined options."
197
+ default: "option 2"
198
+ ui:
199
+ element: "select"
200
+ items:
201
+ - "option 1"
202
+ - "option 2"
203
+ - "option 3"
204
+
205
+ ```
206
+
207
+ ## JSON Configuration Example
208
+
209
+ Here is an example of a JSON configuration file:
210
+
211
+ ```json
212
+ {
213
+ "name": "My Example App",
214
+ "description": "This is an example app to demonstrate the usage of Paramify",
215
+ "parameters": [
216
+ {
217
+ "name": "param1",
218
+ "type": "bool",
219
+ "label": "Enable Feature",
220
+ "description": "A boolean parameter to enable or disable a feature.",
221
+ "default": true
222
+ },
223
+ {
224
+ "name": "param2",
225
+ "type": "int",
226
+ "label": "Integer Value",
227
+ "description": "An integer parameter for numeric configuration.",
228
+ "default": 4,
229
+ "ui": {"element": "slider", "min": 1, "max": 10}
230
+ },
231
+ {
232
+ "name": "param3",
233
+ "type": "str",
234
+ "label": "Select Option",
235
+ "description": "A parameter to select from predefined options.",
236
+ "default": "option 2",
237
+ "ui": {"element": "select", "items": ["option 1", "option 2", "option 3"]}
238
+ }
239
+ ]
240
+ }
241
+ ```
242
+
243
+ ---
244
+
245
+ ## Command-Line Integration
246
+ Paramify automatically generates CLI arguments based on your parameter schema, eliminating the need for separate argument definitions. Parameters defined with scope: `"cli"` or scope: `"all"` (it is the default) are included in the command-line interface, allowing users to override default values directly from the terminal.
247
+
248
+ Here is an example of the generated CLI for a simple application using Paramify:
249
+
250
+ ```bash
251
+ usage: simple_params_web.py [-h] [--param1] [--param2 PARAM2] [--param3 PARAM3]
252
+
253
+ This is an example app to demonstrate the usage of Paramify
254
+
255
+ options:
256
+ -h, --help show this help message and exit
257
+ --param1 A boolean parameter to enable or disable a feature.
258
+ --param2 PARAM2 An integer parameter for numeric configuration.
259
+ --param3 PARAM3 A parameter to select from predefined options.
260
+ ```
261
+
262
+ ---
263
+
264
+ ## Features Overview
265
+
266
+ - **Ease of Use**: Simple, human-readable JSON schema for parameter definitions.
267
+ - **Web UI**: Manage and modify parameters in real-time through a web interface.
268
+ - **Custom Logic**: Implement application-specific callbacks for parameters.
269
+ - **JSON/YAML Support**: Load configurations from external JSON or YAML files for flexibility.
270
+
271
+ ---
272
+
273
+ ## Contributing
274
+
275
+ Contributions are welcome! Feel free to open issues or submit pull requests to improve this library.
276
+
277
+ ---
278
+
279
+ ## License
280
+
281
+ This project is licensed under the MIT License. See the `LICENSE` file for details.
@@ -0,0 +1,20 @@
1
+ paramify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ paramify/paramify.py,sha256=s1hfCNta1WUsEBnbEceOsN4W5Ig6bNKKzQgMVvnOJ68,11103
3
+ paramify/paramify_web.py,sha256=vqYLGN6xgcD0mL-4bfCXVxaJCU4wpFsCPS0obLkh3Nk,4478
4
+ paramify/static/index.html,sha256=yBwZsaBeO3cTElB3Ac0IHeME06ZDtSXXod8SXTr-PQI,757
5
+ paramify/static/assets/index-C3Xrcbp_.js,sha256=Tk5wIvVD8MPvJlSnKmOnIm_AU9nws7T0J3zRpJBQGms,1406542
6
+ paramify/static/assets/index-DwXyNpx-.css,sha256=n8APn3Oev4U3g1nTG2MFo4DRJ2ydyawWp74OcUwJSXY,73819
7
+ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ tests/test_paramify_callback.py,sha256=vcr-MMkN_u1CPLUWLaxwBcRn3ZWfrbmIuVG_crA6mz4,2314
9
+ tests/test_paramify_cli.py,sha256=FqJqL7IGmzCLlZVVkr9t8oJOijN2I7qhMQv644PccUQ,2060
10
+ tests/test_paramify_dynamic.py,sha256=fceq50sOg_hpETdVI0RNAMYfscm7pfoZIlAT_QBCQGM,2521
11
+ tests/test_paramify_init.py,sha256=w7tibjTx2-zUXpcQG6e_4StI7DOK7tj5CYwcYdNUsEk,3788
12
+ tests/test_paramify_misc.py,sha256=_QVvzNkyN--9xeqgMBGnVjWgl3UG8qUnh9RC2xpeYPk,2535
13
+ tests/test_paramify_performance.py,sha256=_XziuXQm7S-aa0HtnhKmk_963dzJXsRGsSBVEw5DOz0,3818
14
+ tests/test_paramify_persist.py,sha256=xSZl5RaOCFuT7SQcoBoUDos_CG_ocUPLAn3VNouKxwU,3030
15
+ tests/test_paramify_validation.py,sha256=4dzTesdjJTic8MRSzjlqEn0TA0aUnAdHV1ph2fJiNtA,2294
16
+ paramify-0.1.4.dist-info/LICENSE,sha256=4urLYSJtRE5F21FV3MJO6jT5U3Kf5Usk4M07A-0TT1E,1088
17
+ paramify-0.1.4.dist-info/METADATA,sha256=6oPLLS4wlF8EKBZftrJkZ1JVLkrhQkAs6FhkKbpDI5E,9238
18
+ paramify-0.1.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
19
+ paramify-0.1.4.dist-info/top_level.txt,sha256=J2PLIqrEXjMbORhYsx95JmAy-5jhHFIQGgRpqx9BAtA,15
20
+ paramify-0.1.4.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.8.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ paramify
2
+ tests
tests/__init__.py ADDED
File without changes
@@ -0,0 +1,60 @@
1
+ import unittest
2
+ from paramify.paramify import Paramify
3
+
4
+ class TestParamifyCallbacks(unittest.TestCase):
5
+
6
+ def setUp(self):
7
+ # Sample configuration with basic parameters
8
+ self.valid_dict_config = {
9
+ "parameters": [
10
+ {"name": "param1", "type": "bool", "default": True},
11
+ {"name": "param2", "type": "int", "default": 42}
12
+ ]
13
+ }
14
+
15
+ def test_callback_invocation(self):
16
+ """Test that the appropriate callback is invoked when a parameter is updated."""
17
+ class CallbackTestParamify(Paramify):
18
+ def __init__(self, *args, **kwargs):
19
+ super().__init__(*args, **kwargs)
20
+ self.callback_invoked = False
21
+
22
+ def on_param1_set(self, value):
23
+ self.callback_invoked = True
24
+
25
+ # Instantiate the custom Paramify class
26
+ paramify = CallbackTestParamify(self.valid_dict_config, enable_cli=False)
27
+
28
+ # Update param1 and verify the callback was invoked
29
+ paramify.set_param1(False)
30
+ self.assertTrue(paramify.callback_invoked)
31
+
32
+ def test_no_callback(self):
33
+ """Test that no error occurs when no callback is defined for a parameter."""
34
+ paramify = Paramify(self.valid_dict_config, enable_cli=False)
35
+
36
+ # Update param2, which has no callback, and verify no exceptions are raised
37
+ try:
38
+ paramify.set_param2(100)
39
+ except Exception as e:
40
+ self.fail(f"Unexpected exception raised: {e}")
41
+
42
+ def test_callback_with_correct_value(self):
43
+ """Test that the callback receives the correct updated value."""
44
+ class ValueCallbackTestParamify(Paramify):
45
+ def __init__(self, *args, **kwargs):
46
+ super().__init__(*args, **kwargs)
47
+ self.callback_value = None
48
+
49
+ def on_param2_set(self, value):
50
+ self.callback_value = value
51
+
52
+ # Instantiate the custom Paramify class
53
+ paramify = ValueCallbackTestParamify(self.valid_dict_config, enable_cli=False)
54
+
55
+ # Update param2 and verify the callback received the correct value
56
+ paramify.set_param2(100)
57
+ self.assertEqual(paramify.callback_value, 100)
58
+
59
+ if __name__ == "__main__":
60
+ unittest.main()
@@ -0,0 +1,47 @@
1
+ import unittest
2
+ from paramify.paramify import Paramify
3
+ import sys
4
+ from unittest.mock import patch
5
+ from io import StringIO
6
+
7
+ class TestParamifyCLI(unittest.TestCase):
8
+
9
+ def setUp(self):
10
+ # Prepare sample configurations for CLI testing
11
+ self.valid_dict_config = {
12
+ "parameters": [
13
+ {"name": "param1", "type": "bool", "default": True},
14
+ {"name": "param2", "type": "int", "default": 42}
15
+ ]
16
+ }
17
+
18
+ @patch.object(sys, 'argv', ['execution.py', '--param1', '--param2', '100'])
19
+ def test_override_parameters_via_cli(self):
20
+ """Test that CLI arguments correctly override parameter values."""
21
+ paramify = Paramify(self.valid_dict_config, enable_cli=True)
22
+ self.assertTrue(paramify.get_parameters()["param1"])
23
+ self.assertEqual(paramify.get_parameters()["param2"], 100)
24
+
25
+ @patch.object(sys, 'argv', ['execution.py', '--param2', 'not_an_int'])
26
+ def test_invalid_cli_overrides(self):
27
+ """Test that invalid CLI input is handled gracefully."""
28
+ # Redirect stderr to capture argparse's error output
29
+ stderr = StringIO()
30
+ with patch('sys.stderr', stderr), self.assertRaises(SystemExit) as context:
31
+ Paramify(self.valid_dict_config, enable_cli=True)
32
+
33
+ # Capture the error message and check its content
34
+ error_message = stderr.getvalue()
35
+ self.assertIn("argument --param2: invalid int value: 'not_an_int'", error_message)
36
+ self.assertIn("usage:", error_message) # Ensure the usage message is included
37
+
38
+
39
+ @patch.object(sys, 'argv', ['execution.py', '--param1', '--param2', '42'])
40
+ def test_partial_cli_override(self):
41
+ """Test that CLI arguments can partially override default values."""
42
+ paramify = Paramify(self.valid_dict_config, enable_cli=True)
43
+ self.assertTrue(paramify.get_parameters()["param1"])
44
+ self.assertEqual(paramify.get_parameters()["param2"], 42)
45
+
46
+ if __name__ == "__main__":
47
+ unittest.main()