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.
- paramify/__init__.py +0 -0
- paramify/paramify.py +258 -0
- paramify/paramify_web.py +106 -0
- paramify/static/assets/index-C3Xrcbp_.js +6794 -0
- paramify/static/assets/index-DwXyNpx-.css +1 -0
- paramify/static/index.html +17 -0
- paramify-0.1.4.dist-info/LICENSE +21 -0
- paramify-0.1.4.dist-info/METADATA +281 -0
- paramify-0.1.4.dist-info/RECORD +20 -0
- paramify-0.1.4.dist-info/WHEEL +5 -0
- paramify-0.1.4.dist-info/top_level.txt +2 -0
- tests/__init__.py +0 -0
- tests/test_paramify_callback.py +60 -0
- tests/test_paramify_cli.py +47 -0
- tests/test_paramify_dynamic.py +64 -0
- tests/test_paramify_init.py +88 -0
- tests/test_paramify_misc.py +61 -0
- tests/test_paramify_performance.py +95 -0
- tests/test_paramify_persist.py +80 -0
- tests/test_paramify_validation.py +61 -0
|
@@ -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
|
+

|
|
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
|
+

|
|
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,,
|
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()
|