@juit/vue-z 0.0.22 → 0.0.24
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.
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/quasar/icon-set/material-symbols-rounded.js","../lib/buttons/btn-dropdown.vue","../lib/buttons/btn-group.vue","../lib/buttons/btn.vue","../lib/assets/icons.ts","../lib/utils/form.ts","../lib/forms/form-helper.vue","../lib/controls/toggle.vue","../lib/controls/deleted.vue","../lib/controls/dropdown.vue","../lib/controls/reload.vue","../lib/assets/translations.ts","../lib/composition/validators.ts","../lib/inputs/text.vue","../lib/inputs/string.vue","../lib/controls/search.vue","../lib/controls/switch.vue","../lib/dialogs/dialog.vue","../lib/dialogs/confirm.vue","../lib/dialogs/progress.vue","../lib/forms/input-group.vue","../lib/forms/form.vue","../lib/utils/loader.ts","../lib/inputs/autocomplete.vue","../lib/inputs/address.vue","../lib/inputs/select.vue","../lib/inputs/country.vue","../lib/inputs/date-range.vue","../lib/inputs/date.vue","../lib/inputs/ean13.vue","../lib/inputs/label.vue","../lib/inputs/nullable-number.vue","../lib/inputs/number.vue","../lib/inputs/password.vue","../lib/inputs/picker.vue","../lib/tag.vue","../lib/inputs/tags.vue","../lib/assets/prefixes.ts","../lib/inputs/telephone.vue","../lib/objects/object-header.vue","../lib/objects/object-new.vue","../lib/composition/dialogs.ts","../lib/utils/listicle.ts","../lib/objects/listicle.vue","../lib/objects/object.vue","../lib/utils/tables.ts","../lib/table/layout/table-footer-columns.vue","../lib/table/layout/table-footer-fullscreen.vue","../lib/table/layout/table-footer-pagination.vue","../lib/table/layout/table-footer-rows.vue","../lib/table/layout/table-header.vue","../lib/table/table.vue","../lib/utils/query.ts","../lib/index.ts"],"sourcesContent":["export default {\n name: 'material-symbols-rounded',\n type: {\n positive: 'sym_r_check_circle',\n negative: 'sym_r_warning',\n info: 'sym_r_info',\n warning: 'sym_r_priority_high'\n },\n arrow: {\n up: 'sym_r_arrow_upward',\n right: 'sym_r_arrow_forward',\n down: 'sym_r_arrow_downward',\n left: 'sym_r_arrow_back',\n dropdown: 'sym_r_arrow_drop_down'\n },\n chevron: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right'\n },\n colorPicker: {\n spectrum: 'sym_r_gradient',\n tune: 'sym_r_tune',\n palette: 'sym_r_style'\n },\n pullToRefresh: {\n icon: 'sym_r_refresh'\n },\n carousel: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right',\n up: 'sym_r_keyboard_arrow_up',\n down: 'sym_r_keyboard_arrow_down',\n navigationIcon: 'sym_r_circle'\n },\n chip: {\n remove: 'sym_r_cancel',\n selected: 'sym_r_check'\n },\n datetime: {\n arrowLeft: 'sym_r_chevron_left',\n arrowRight: 'sym_r_chevron_right',\n now: 'sym_r_schedule',\n today: 'sym_r_today'\n },\n editor: {\n bold: 'sym_r_format_bold',\n italic: 'sym_r_format_italic',\n strikethrough: 'sym_r_strikethrough_s',\n underline: 'sym_r_format_underlined',\n unorderedList: 'sym_r_format_list_bulleted',\n orderedList: 'sym_r_format_list_numbered',\n subscript: 'sym_r_vertical_align_bottom',\n superscript: 'sym_r_vertical_align_top',\n hyperlink: 'sym_r_link',\n toggleFullscreen: 'sym_r_fullscreen',\n quote: 'sym_r_format_quote',\n left: 'sym_r_format_align_left',\n center: 'sym_r_format_align_center',\n right: 'sym_r_format_align_right',\n justify: 'sym_r_format_align_justify',\n print: 'sym_r_print',\n outdent: 'sym_r_format_indent_decrease',\n indent: 'sym_r_format_indent_increase',\n removeFormat: 'sym_r_format_clear',\n formatting: 'sym_r_text_format',\n fontSize: 'sym_r_format_size',\n align: 'sym_r_format_align_left',\n hr: 'sym_r_remove',\n undo: 'sym_r_undo',\n redo: 'sym_r_redo',\n heading: 'sym_r_format_size',\n code: 'sym_r_code',\n size: 'sym_r_format_size',\n font: 'sym_r_font_download',\n viewSource: 'sym_r_code'\n },\n expansionItem: {\n icon: 'sym_r_keyboard_arrow_down',\n denseIcon: 'sym_r_arrow_drop_down'\n },\n fab: {\n icon: 'sym_r_add',\n activeIcon: 'sym_r_close'\n },\n field: {\n clear: 'sym_r_cancel',\n error: 'sym_r_error'\n },\n pagination: {\n first: 'sym_r_first_page',\n prev: 'sym_r_keyboard_arrow_left',\n next: 'sym_r_keyboard_arrow_right',\n last: 'sym_r_last_page'\n },\n rating: {\n icon: 'sym_r_star'\n },\n stepper: {\n done: 'sym_r_check',\n active: 'sym_r_edit',\n error: 'sym_r_warning'\n },\n tabs: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right',\n up: 'sym_r_keyboard_arrow_up',\n down: 'sym_r_keyboard_arrow_down'\n },\n table: {\n arrowUp: 'sym_r_arrow_upward',\n warning: 'sym_r_warning',\n firstPage: 'sym_r_first_page',\n prevPage: 'sym_r_chevron_left',\n nextPage: 'sym_r_chevron_right',\n lastPage: 'sym_r_last_page'\n },\n tree: {\n icon: 'sym_r_play_arrow'\n },\n uploader: {\n done: 'sym_r_check',\n clear: 'sym_r_close',\n add: 'sym_r_add_box',\n upload: 'sym_r_cloud_upload',\n removeQueue: 'sym_r_clear_all',\n removeUploaded: 'sym_r_done_all'\n }\n}\n","<!--+ This is *exactly* the same as the standard Quasar QBtnGroup, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n +-->\n<template>\n <q-btn-dropdown\n ref=\"_ref\"\n v-bind=\"{\n ...$attrs,\n ..._props,\n label: undefined,\n unelevated: true,\n tooltip: undefined,\n }\"\n no-icon-animation\n :color=\"disable ? undefined : color\"\n :text-color=\"disable ? undefined : textColor\"\n :class=\"{ 'z-btn-disabled': disable, 'z-btn-flat': flat }\"\n >\n <template #label>\n <slot v-if=\"_slots.label\" name=\"label\" />\n <template v-else-if=\"label\">\n {{ label }}\n </template>\n <q-tooltip v-if=\"tooltip\" :delay=\"500\">\n {{ tooltip }}\n </q-tooltip>\n </template>\n\n <template v-if=\"_slots.loading\">\n <slot name=\"loading\" />\n </template>\n\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-btn-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtnDropdown, QTooltip } from 'quasar'\nimport { ref } from 'vue'\n\nimport type { QBtnDropdownProps, QBtnDropdownSlots } from 'quasar'\n\ndefineOptions({ name: 'ZBtnDropdown' })\n\nconst _ref = ref<QBtnDropdown>()\nconst _props = defineProps<QBtnDropdownProps & { tooltip?: string }>()\nconst _slots = defineSlots<Partial<QBtnDropdownSlots>>()\n\ndefineExpose({\n show: () => _ref.value?.show(),\n hide: () => _ref.value?.hide(),\n toggle: () => _ref.value?.toggle(),\n})\n</script>\n\n<style scoped lang=\"postcss\">\n.z-btn-disabled {\n background-color: var(--q-tint);\n color: var(--q-tint); /* Tint over tint (it's a shade) */\n\n &.z-btn-flat {\n background-color: transparent;\n color: var(--q-text);\n opacity: 0.25 !important;\n }\n}\n\n:deep(.q-btn-dropdown__arrow) {\n border-left: 1px solid var(--q-shade);\n}\n</style>\n","<!--+ This is *exactly* the same as the standard Quasar QBtnGroup, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n +-->\n<template>\n <q-btn-group v-bind=\"_props\" unelevated>\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-btn-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtnGroup } from 'quasar'\n\nimport type { QBtnGroupProps, QBtnGroupSlots } from 'quasar'\n\ndefineOptions({ name: 'ZBtnGroup' })\n\nconst _props = defineProps<QBtnGroupProps>()\nconst _slots = defineSlots<Partial<QBtnGroupSlots>>()\n</script>\n","<!--+ This is *exactly* the same as the standard Quasar QBtn, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n |\n | A couple of extra options are present:\n | - \"shrink\" to specify the screen size at which the button should shrink\n | and presented *without* a label (the label will become a tooltip)\n | - \"tooltip\" to specify a tooltip to show on the button\n +-->\n<template>\n <q-btn\n v-bind=\"{\n ...$attrs,\n ..._props,\n unelevated: true,\n shrink: undefined,\n tooltip: undefined\n }\"\n :label=\"shrink ? $q.screen.gt[shrink] ? label : undefined : label\"\n :color=\"disable ? undefined : color\"\n :text-color=\"disable ? undefined : textColor\"\n :class=\"{\n 'z-btn-disabled': disable,\n 'z-btn-flat': flat,\n 'z-btn-default': (! flat) && (! color) && (!textColor),\n }\"\n >\n <q-tooltip v-if=\"shrink && (! $q.screen.gt[shrink])\" :delay=\"500\">\n {{ label }}\n </q-tooltip>\n <q-tooltip v-else-if=\"tooltip\" :delay=\"500\">\n {{ tooltip }}\n </q-tooltip>\n\n <slot v-if=\"_slots.default\" name=\"default\" />\n <template v-if=\"_slots.loading\">\n <slot name=\"loading\" />\n </template>\n </q-btn>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtn, QTooltip } from 'quasar'\n\nimport type { QBtnProps, QBtnSlots, Screen } from 'quasar'\n\ntype Shrink = keyof Screen['gt']\n\ndefineOptions({ name: 'ZBtn' })\n\nconst _props = defineProps<QBtnProps & { shrink?: Shrink, tooltip?: string }>()\nconst _slots = defineSlots<Partial<QBtnSlots>>()\n</script>\n\n<style scoped lang=\"postcss\">\n.z-btn-default {\n background-color: #80808040;\n color: var(--q-text);\n}\n\n.z-btn-disabled {\n background-color: var(--q-tint);\n color: var(--q-tint); /* Tint over tint (it's a shade) */\n\n &.z-btn-flat {\n background-color: transparent;\n color: var(--q-text);\n opacity: 0.25 !important;\n }\n}\n</style>\n","const showDeletedIcon = `\n M680,520 Q776,520 851.5,570.5 Q927,621 960,700 Q927,779 851.5,829.5 Q776,880 680,880\n Q584,880 508.5,829.5 Q433,779 400,700 Q433,621 508.5,570.5 Q584,520 680,520 z\n M680,600 Q621,600 570.5,627 Q520,654 490,700 Q520,746 570.5,773 Q621,800 680,800\n Q739,800 789.5,773 Q840,746 870,700 Q840,654 789.5,627 Q739,600 680,600 z\n M680,760 Q655,760 637.5,742.5 Q620,725 620,700 Q620,675 637.5,657.5\n Q655,640 680,640 Q705,640 722.5,657.5 Q740,675 740,700 Q740,725 722.5,742.5\n Q705,760 680,760 z M560,120 L400,120 Q383,120 371.5,131.5 Q360,143 360,160\n L200,160 Q183,160 171.5,171.5 Q160,183 160,200 Q160,217 171.5,228.5 Q183,240 200,240\n L200,760 Q200,793 223.5,816.5 Q247,840 280,840 L405.233,840\n C382.052,816.107 361.747,789.469 346.128,760 L280,760 L280,240 L680,240 L680,444\n C706.826,444.226 733.701,446.275 760,451.789 L760,240 Q777,240 788.5,228.5\n Q800,217 800,200 Q800,183 788.5,171.5 Q777,160 760,160 L600,160 Q600,143 588.5,131.5\n Q577,120 560,120 z M440,320 L360,320 L360,614.511 C381.9,581.303 408.463,551.141 440,526.721 L440,320 z\n M600,320 L520,320 L520,477.547 C545.413,465.601 572.563,457.493 600,451.789 L600,320 z\n @@ fill:currentColor\n | 0, 0, 960, 960`.replaceAll(/\\s+/gm, ' ').trim()\n\n/** Our very basic icons library */\nexport const icons = Object.freeze({\n /* actions */\n add: 'sym_r_add',\n cancel: 'sym_r_close',\n confirm: 'sym_r_check',\n delete: 'sym_r_delete',\n download: 'sym_r_download',\n duplicate: 'sym_r_list_alt_add',\n edit: 'sym_r_edit',\n logout: 'sym_r_move_item',\n print: 'sym_r_print',\n reload: 'sym_r_refresh',\n restore: 'sym_r_undo',\n search: 'sym_r_search',\n\n /* common types */\n barcode: 'sym_r_barcode',\n date: 'sym_r_calendar_today',\n error: 'sym_r_report', // should be \"fill\"\n language: 'sym_r_globe',\n menu: 'sym_r_menu',\n qrcode: 'sym_r_qr_code_2',\n required: 'sym_r_asterisk',\n select: 'sym_r_keyboard_double_arrow_down',\n tag: 'sym_r_sell',\n warning: 'sym_r_report',\n\n\n /** table controls */\n table: {\n columns: 'sym_r_table_chart',\n rows: 'sym_r_table_rows',\n row: {\n density: {\n 1: 'sym_r_square',\n 2: 'sym_r_bottom_sheets',\n 3: 'sym_r_table_rows',\n 4: 'sym_r_table_rows_narrow',\n },\n },\n },\n\n /** sorting */\n sorting: {\n descending: 'sym_r_south',\n ascending: 'sym_r_north',\n unsorted: 'sym_r_swap_vert',\n },\n\n /** pagination */\n pagination: {\n first: 'sym_r_first_page',\n previous: 'sym_r_chevron_left',\n next: 'sym_r_chevron_right',\n last: 'sym_r_last_page',\n },\n\n /** visibility */\n visibility: {\n on: 'sym_r_visibility',\n off: 'sym_r_visibility_off',\n deleted: showDeletedIcon, // visibility for \"deleted\" items\n },\n\n /** full screen */\n fullscreen: {\n enter: 'sym_r_zoom_out_map',\n exit: 'sym_r_zoom_in_map',\n },\n} as const)\n","import { inject, onBeforeUnmount, provide, reactive, ref, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { PropType, Ref, ShallowRef } from 'vue'\n\n/* The props handled by the form and affecting its children behavior */\nexport type ZFormProps = {\n editable: boolean\n formEditable: boolean\n disabled: boolean\n lazyRules: boolean | 'ondemand'\n bottomSlots: boolean\n}\n\n/* Our defaults */\nconst defaults = {\n editable: true,\n formEditable: true,\n disabled: false,\n lazyRules: false,\n bottomSlots: false,\n} as const satisfies ZFormProps\n\n/* Symbols for injection */\nconst _editableSymbol = Symbol('ZForm:Editable')\nconst _disabledSymbol = Symbol('ZForm:Disabled')\nconst _lazyRulesSymbol = Symbol('ZForm:LazyRules')\nconst _bottomSlotsSymbol = Symbol('ZForm:BottomSlots')\nconst _readyStateSymbol = Symbol('ZForm:ReadyState')\n\n/** The properties shared by all inputs that can be included in a `ZForm` */\nexport const formProps = {\n /** Whether to reserve space for the bottom slots or not */\n bottomSlots: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Editable state, overriding the active state */\n editable: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Disabled state, overriding the editable and active states */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /**\n * When to apply validation rules.\n *\n * If set to boolean true then it checks validation status against the rules\n * only after field loses focus for first time; If set to \"ondemand\" then it\n * will trigger only when component's validate() method is manually called or\n * when the wrapper QForm submits itself\n */\n lazyRules: {\n type: [ Boolean, String ] as PropType<boolean | 'ondemand'>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** The properties shared by all inputs that can be included in a `ZForm` */\nexport const componentFormProps = {\n ...formProps,\n /**\n * When \"true\" this overrides the \"editable\" property (whose default can\n * be inherited from the owning form) forcedly preventing editability */\n readonly: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** For `ZForm`, provide the current form properties to children components */\nexport function provideFormProps(props: Partial<ZFormProps>): void {\n provide(_editableSymbol, () => props.editable != null ? props.editable : defaults.editable)\n provide(_disabledSymbol, () => props.disabled != null ? props.disabled : defaults.disabled)\n provide(_lazyRulesSymbol, () => props.lazyRules != null ? props.lazyRules : defaults.lazyRules)\n provide(_bottomSlotsSymbol, () => props.bottomSlots != null ? props.bottomSlots : defaults.bottomSlots)\n}\n\n/** Merge the specified props from a component with the ones from the owning `ZForm` */\nexport function mergeFormProps(props: Partial<ZFormProps & { readonly?: boolean | undefined }>): Readonly<ZFormProps> {\n const editable = inject<() => ZFormProps['editable']>(_editableSymbol, () => defaults.editable)\n const disabled = inject<() => ZFormProps['disabled']>(_disabledSymbol, () => defaults.disabled)\n const lazyRules = inject<() => ZFormProps['lazyRules']>(_lazyRulesSymbol, () => defaults.lazyRules)\n const bottomSlots = inject<() => ZFormProps['bottomSlots']>(_bottomSlotsSymbol, () => defaults.bottomSlots)\n\n const object = reactive<ZFormProps>({\n editable: false,\n formEditable: false,\n disabled: false,\n lazyRules: false,\n bottomSlots: false,\n })\n\n watch([ () => props.editable, () => props.readonly, editable ], ([ propValue, readonly, formValue ]) => {\n const formEditable = propValue == null ? (formValue || false) : propValue\n const editable = readonly === true ? false : formEditable\n if (formEditable != object.formEditable) object.formEditable = formEditable\n if (editable != object.editable) object.editable = editable\n }, { immediate: true })\n\n watch([ () => props.disabled, disabled ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.disabled) object.disabled = value\n }, { immediate: true })\n\n watch([ () => props.lazyRules, lazyRules ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.lazyRules) object.lazyRules = value\n }, { immediate: true })\n\n watch([ () => props.bottomSlots, bottomSlots ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.bottomSlots) object.bottomSlots = value\n }, { immediate: true })\n\n return object\n}\n\n/** For `ZForm`, provide a `ShallowRef` to an object holding the ready state */\nexport function provideFormReadyState(): Ref<boolean> {\n const state = shallowRef<Record<string, boolean>>({})\n provide(_readyStateSymbol, state)\n\n const ready = ref(false)\n\n watch(state, (state) => {\n for (const value of Object.values(state)) {\n if (value) continue\n if (ready.value) ready.value = false\n return\n }\n\n if (! ready.value) ready.value = true\n })\n\n return ready\n}\n\n/** Provide a callback to `ZForm` to evaluate the component's ready state */\nexport function formReadyState(callback: () => boolean): void {\n const callbacks = inject<ShallowRef<Record<string, boolean>> | null>(_readyStateSymbol, null)\n if (! callbacks) return // not in a form\n\n // crypto.randomUUID() is not available on Safari in insecure contexts (e.g. app development)\n const key = btoa([ ...crypto.getRandomValues(new Uint8Array(15)) ].map((c) => String.fromCharCode(c)).join(''))\n const watcher = watch(callback, (ready) => {\n if (callbacks.value[key] === ready) return\n callbacks.value[key] = ready\n triggerRef(callbacks)\n }, { immediate: true })\n\n onBeforeUnmount(() => {\n delete callbacks.value[key]\n watcher()\n })\n}\n","<template>\n <slot name=\"default\" v-bind=\"_formProps\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { componentFormProps, mergeFormProps } from '../utils/form'\n\nimport type { VNode } from 'vue'\nimport type { ZFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZFormHelper' })\n\nconst _props = defineProps(componentFormProps)\nconst _formProps = mergeFormProps(_props)\ndefineSlots<{\n default: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\ndefineExpose({\n isEditable: computed(() => _formProps.editable),\n isFormEditable: computed(() => _formProps.formEditable),\n isLazyRules: computed(() => _formProps.lazyRules),\n isBottomSlots: computed(() => _formProps.bottomSlots),\n isDisabled: computed(() => _formProps.disabled),\n})\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn\n dense\n class=\"z-control\"\n :class=\"{ 'z-control-active': _value }\"\n :disable=\"scope.disabled\"\n :icon=\"_model ? icon : _iconOff\"\n :tooltip=\"tooltip\"\n @click=\"_model = ! _model\"\n />\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZControlToggle' })\n\nconst _props = defineProps({\n /** The icon for this toggle */\n icon: {\n type: String,\n required: true,\n },\n iconOff: {\n type: String,\n required: false,\n default: undefined,\n },\n /** The tooltip, if any, for this toggle */\n tooltip: {\n type: String,\n required: false,\n default: '',\n },\n /** True is false, and false is true */\n negate: {\n type: Boolean,\n required: false,\n default: false,\n },\n ...componentFormProps,\n})\n\nconst _model = defineModel({\n type: Boolean,\n required: true,\n})\n\nconst _value = computed(() => _props.negate ? (! _model.value) : _model.value)\nconst _iconOff = computed(() => _props.iconOff || _props.icon)\n</script>\n","<template>\n <z-control-toggle\n v-model=\"deleted\"\n :icon=\"icons.visibility.deleted\"\n :tooltip=\"deleted ?\n $t({ en: 'Hide deleted', de: 'Gelöscht ausblenden'}) :\n $t({ en: 'Show deleted', de: 'Gelöscht anzeigen'})\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZControlToggle from './toggle.vue'\n\ndefineOptions({ name: 'ZControlDeleted' })\n\ndefineProps(componentFormProps)\n\nconst deleted = defineModel({\n type: Boolean,\n required: true,\n})\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn-dropdown\n dense\n class=\"z-control\"\n :icon=\"icon\"\n :disable=\"scope.disabled\"\n :class=\"{ 'z-control-active': active }\"\n :tooltip=\"tooltip\"\n >\n <q-list dense bordered>\n <slot name=\"default\" />\n </q-list>\n </z-btn-dropdown>\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { QList } from 'quasar'\n\nimport ZBtnDropdown from '../buttons/btn-dropdown.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { VNode } from 'vue'\n\ndefineOptions({ name: 'ZControlDropdown' })\n\ndefineProps({\n /** The icon for this toggle */\n icon: {\n type: String,\n required: true,\n },\n /** Whether this control should look \"active\" or not */\n active: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The tooltip, if any, for this toggle */\n tooltip: {\n type: String,\n required: false,\n default: '',\n },\n ...componentFormProps,\n})\n\ndefineSlots<{\n default: () => VNode[]\n}>()\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn\n dense\n class=\"z-control\"\n :disable=\"scope.disabled\"\n :icon=\"icons.reload\"\n :tooltip=\"$t({ en: 'Reload', de: 'Neu laden'})\"\n @click=\"_reload = _reload + 1\"\n />\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZControlReload' })\n\ndefineProps(componentFormProps)\n\nconst _reload = defineModel({\n type: Number,\n required: true,\n})\n</script>\n","import type { Translations } from '@juit/vue-i18n'\n\nexport const translations = {\n 'search': { en: 'Search', de: 'Suchen' },\n 'cancel': { en: 'Cancel', de: 'Abbrechen' },\n 'save': { en: 'Save', de: 'Speichern' },\n 'validate': { en: 'validate', de: 'Validieren' },\n 'delete': { en: 'Delete', de: 'Löschen' },\n 'restore': { en: 'Restore', de: 'Wiederherstellen' },\n 'edit': { en: 'Edit', de: 'Bearbeiten' },\n\n 'keep': { en: 'Keep', de: 'Behalten' },\n 'discard': { en: 'Discard', de: 'Verwerfen' },\n 'ignore': { en: 'Ignore', de: 'Ignorieren' },\n\n 'object.uuid': { en: 'UUID', de: 'UUID' },\n 'object.created': { en: 'Created on', de: 'Erstellt am' },\n 'object.modified': { en: 'Modified on', de: 'Geändert am' },\n 'object.deleted': { en: 'Deleted on', de: 'Gelöscht am' },\n} as const satisfies Translations\n","import { useTranslator } from '@juit/vue-i18n'\nimport { patterns } from 'quasar'\n\n/** A non-async validation rule */\nexport interface ZValidator<T> {\n (value: T): boolean | string\n}\n\n/** Form validators */\nexport interface ZValidators {\n /** Assert that the string is a valid email */\n email(): ZValidator<string>\n /** Assert that the string matches a given regex */\n regexp(regExp: RegExp): ZValidator<string>\n /** Assert that the string has the specified maximum length */\n maxLength(length: number): ZValidator<string>\n /** Assert that the string has the specified minimum length */\n minLength(length: number): ZValidator<string>\n /** Assert that the value is not _falsy_ (non zero number, non-empty string) */\n required(): ZValidator<string>\n /** Assert that the number does not exceed this maximum */\n maximum(max: number): ZValidator<number>\n /** Assert that the number is not under this minimum */\n minimum(min: number): ZValidator<number>\n}\n\n/** Composition call to return our (localized) validators */\nexport function useValidators(): ZValidators {\n const { t } = useTranslator()\n\n function email(): ZValidator<string> {\n return function email(value: string) {\n return patterns.testPattern.email(value) || t({\n en: 'Invalid Email address',\n de: 'Ungültige E-Mail-Adresse',\n })\n }\n }\n\n function regexp(regExp: RegExp): ZValidator<string> {\n return function regexp(value: string) {\n return !!value.match(regExp) || t({\n en: 'Invalid format',\n de: 'Ungültige Format',\n })\n }\n }\n\n function maxLength(length: number): ZValidator<string> {\n return function maxLength(value: string) {\n if (value.length <= length) return true\n\n return t({\n en: 'Maximum length { length } characters',\n de: 'Maximale Länge { length } Zeichen',\n }, { length })\n }\n }\n\n function minLength(length: number): ZValidator<string> {\n return function minLength(value: string) {\n if (!value) return true // the minLength only should be checked if there is a value\n if (value.length >= length) return true\n\n return t({\n en: 'Minimum length { length } characters',\n de: 'Mindestlänge { length } Zeichen',\n }, { length })\n }\n }\n\n function required(): ZValidator<string> {\n return function required(value: string) {\n return (!! value) || t({\n en: 'This field is required',\n de: 'Dieses Feld ist erforderlich',\n })\n }\n }\n\n function maximum(max: number): ZValidator<number> {\n return function maximum(value: number) {\n if (value <= max) return true\n return t({\n en: 'Maximum { max }',\n de: 'Höchstens { max }',\n }, { max })\n }\n }\n\n function minimum(min: number): ZValidator<number> {\n return function minimum(value: number) {\n if (value >= min) return true\n return t({\n en: 'Minimum { min }',\n de: 'Mindestens { min }',\n }, { min })\n }\n }\n\n return { email, regexp, maxLength, minLength, required, maximum, minimum }\n}\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n ref=\"_helper\"\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-input\n ref=\"_qinput\"\n\n dense\n outlined\n stack-label\n no-error-icon\n\n :class=\"`z-state-${_state}`\"\n :input-style=\"{\n cursor: (_editable && onClick) ? 'pointer' : undefined,\n zIndex: '1', /* always stay above our suffix */\n }\"\n\n :type=\"type\"\n :label=\"label\"\n :placeholder=\" _editable ? placeholder : undefined\"\n :hint=\"_editable ? hint : undefined\"\n :counter=\"(_editable && formProps.bottomSlots) ? (maxLength > 0) : false\"\n :maxlength=\"(_editable && (maxLength > 0)) ? maxLength : undefined\"\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :lazy-rules=\"formProps.lazyRules\"\n :debounce=\"debounce\"\n :readonly=\"_inactive || nonInteractive\"\n :disable=\"_disabled\"\n :rules=\"_rules\"\n :prefix=\"prefix\"\n style=\"width: 100%\"\n\n :model-value=\"_value\"\n @update:model-value=\"_update\"\n >\n <!-- Suffix, right behind the label, expanding with it -->\n <div v-if=\"_value && suffix\" class=\"q-field__native z-suffix\">\n <span class=\"z-suffix-hidden\">{{ _value }}</span>\n <span class=\"z-suffix-visible\">{{ suffix }}</span>\n </div>\n\n <template #append>\n <template v-if=\"_editable\">\n <!-- First icon, error -->\n <q-icon\n v-if=\"_qinput?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n\n <!-- Second icon, required or clearable -->\n <q-icon\n v-if=\"required && (! _value)\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n\n <q-icon\n v-else-if=\"_onClear\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click=\"_onClear\"\n />\n </template>\n\n <!-- Third icon: parent icon -->\n <template v-if=\"icon\">\n <!-- The \"onClickIcon\" event is handled by the parent -->\n <template v-if=\"onClickIcon && formProps.editable\">\n <q-icon\n v-if=\"icon\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click.stop=\"onClickIcon\"\n />\n </template>\n\n <!-- Links are enabled *only* when the containing form is not editable -->\n <template v-else-if=\"link && (! formProps.formEditable)\">\n <!-- String links are rendered as anchors -->\n <a\n v-if=\"(typeof link === 'string')\"\n :href=\"link\"\n class=\"z-icon-link\"\n @click.stop=\"() => {} /* q-input captures clicks and prevents default */\"\n >\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </a>\n\n <!-- Icon when not editing (note even in the form), optionally linked somewhere -->\n <router-link v-else :to=\"link\" class=\"z-icon-link\">\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </router-link>\n </template>\n\n <!-- Icon w/o links -->\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.append\" name=\"append\" v-bind=\"formProps\" />\n </template>\n </q-input>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QInput } from 'quasar'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps, formReadyState } from '../utils/form'\n\nimport type { ValidationRule } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZFormProps } from '../utils/form'\n\n/* APPEARANCE: =================================================================\n *\n * The text input has fundamentally three \"looks\":\n *\n * - inactive: the field is visibly read-only, and user interaction is disabled\n * - editable: the field is editable, and it looks like it\n * - disabled: the field is visibly disabled, for example when loading data\n *\n * The default state is \"inactive\" (presented kind of like a label). The other\n * two states are controlled by the \"editable\", and \"disabled\" boolean\n * properties (in order of priority).\n *\n * This priority means that whenever \"disabled\" is \"true\", then \"editable\" is\n * de-facto ignored, and only when both \"disabled\" and \"editable\" are \"false\",\n * then the control is considered \"inactive\".\n *\n * The extra property \"readonly\" doesn't _visually_ change appearance of this\n * field, but can be used by wrappers of this component to present a different\n * experience. For example, in our date picker, the date can be displayed in\n * the field, but can only be picked by clicking on it (and can't be edited\n * with the keyboard, henceforth, readonly).\n *\n * ICONS: ======================================================================\n *\n * The text input can have a few icons:\n *\n * The first icon deals with validation, and is displayed when the field is\n * editable _and_ in error.\n *\n * The second icon deals with the \"required\" state of the field, and its\n * \"clearability\" (determined by the \"onClear\" property).\n *\n * - When \"required\" is \"true\" and the value is empty, we'll display a single\n * asterisk indicating that a value is required.\n * - When \"onClear\" is set and the value is not empty, we'll display a \"close\"\n * clickable icon that will invoke the \"onClear\" callback (up to the parent\n * to determine how to clear the value).\n *\n * The third icon is the \"action\" icon, and will be displayed when the \"icon\"\n * property is set by the parent.\n */\n\nconst validators = useValidators()\n\n/** Ref to our `QInput` */\nconst _qinput = ref<QInput>()\n/** Ref to our `ZFormHelper` */\nconst _helper = ref<InstanceType<typeof ZFormHelper>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZText' })\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The type of input to present: normal `text` or `password` */\n type: {\n type: String as PropType<'text' | 'password'>,\n required: false,\n default: 'text',\n },\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>,\n required: false,\n default: 'text',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== EXTRA STATE FOR SUB-COMPONENTS =================================== */\n\n /** The input looks editable, but text editing is disabled (for sub-components) */\n nonInteractive: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The debounce time in milliseconds for the input field */\n debounce: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n /** The prefix to add to the input */\n prefix: {\n type: String as PropType<string>,\n required: false,\n default: undefined,\n },\n /** Keep the value \"raw\" (as in, do not normalize white spaces) */\n raw: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The maximum length, displayed with a counter (and error when too long). */\n maxLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ValidationRule<string>[]>,\n required: false,\n default: () => [],\n },\n\n /* ===== EMITS AS PROPS =================================================== */\n\n /** Used as `@click=\"...\"` in a template, when clicking on text field */\n onClick: {\n type: Function as PropType<((event: PointerEvent) => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@click-icon=\"...\"` in a template, when clicking on icon */\n onClickIcon: {\n type: Function as PropType<((event: PointerEvent) => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@clear=\"...\"` in a template, to clear the text (and related) */\n onClear: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Emits */\nconst _emit = defineEmits<{\n (emit: 'beforeinput', event: InputEvent): any\n (emit: 'blur', event: FocusEvent): any\n (emit: 'focus', event: FocusEvent): any\n (emit: 'input', event: InputEvent): any\n (emit: 'keydown', event: KeyboardEvent): any\n (emit: 'keyup', event: KeyboardEvent): any\n}>()\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* ===== INTERNAL STATE ===================================================== */\n\nconst _hasFocus = ref(false)\n\nconst _state = computed(() => {\n if (_helper.value?.isDisabled) return 'disabled'\n if (_helper.value?.isEditable) return 'editable'\n return 'inactive'\n})\n\nconst _disabled = computed(() => _state.value === 'disabled')\nconst _editable = computed(() => _state.value === 'editable')\nconst _inactive = computed(() => _state.value === 'inactive')\n\nfunction _update(value?: string | number | null): void {\n let string = typeof value === 'number' ? String(value) : (value || '')\n // trim and normalize spaces unless the \"raw\" prop is set\n if (! _props.raw) string = string.trim().replaceAll(/\\s+/g, ' ')\n if (string !== _value.value) _value.value = string\n}\n\n/** Handle the clearability from the parent */\nconst _onClear = computed(() => {\n if (! _props.onClear) return undefined\n if (! _value.value) return undefined\n\n // Return a function setting the focus to the input *and* calling the\n // parent's \"onClear\" callback to wipe the value\n return () => {\n _qinput.value?.focus()\n _props.onClear?.()\n }\n})\n\n/* ===== INTERNAL STATE ===================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qinput.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _qinput.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _qinput.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _qinput.value?.hasError || false),\n /** The native element of the input */\n nativeEl: computed(() => _qinput.value?.nativeEl as HTMLInputElement),\n /** A flag indicating whether this field is _editable_ or not */\n isEditable: _editable,\n /** A flag indicating whether this field is _disabled_ or not */\n isDisabled: _disabled,\n /** A flag indicating whether this field is _inactive_ or not */\n isInactive: _inactive,\n /** A flag indicating whether this field is _editable_ and _has focus_ or not */\n hasFocus: computed(() => _editable.value && _hasFocus.value),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/* The validation rules */\nconst _rules = computed(() => {\n const rules: ValidationRule[] = []\n\n /* Required (from prop) */\n if (_props.required) rules.push(validators.required())\n /* Max length (from prop) */\n if (_props.maxLength > 0) rules.push(validators.maxLength(_props.maxLength))\n /* All other rules (from prop) */\n rules.push(..._props.rules)\n /* Quasar won't reset the validation status if the rules array is empty */\n if (rules.length === 0) rules.push(() => true)\n\n return rules\n})\n\n/* When editable or validation rules change, reset validation */\nwatch([ _editable, _rules ], () => _qinput.value?.resetValidation())\n\n/* Ready state for parent ZForm */\nformReadyState(() => {\n if (_qinput.value?.hasError) return false\n if (_props.required) return !! _value.value\n return true\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Pass-through events */\nconst _onBeforeinput = (event: InputEvent) => void _emit('beforeinput', event)\nconst _onBlur = (event: FocusEvent) => void _emit('blur', event)\nconst _onFocus = (event: FocusEvent) => void _emit('focus', event)\nconst _onInput = (event: Event) => void _emit('input', event as InputEvent) // follow MDN spec\nconst _onKeydown = (event: KeyboardEvent) => void _emit('keydown', event)\nconst _onKeyup = (event: KeyboardEvent) => void (_emit('keyup', event))\n\n/** \"onClick\" is only passed through when enabled and we have a listener */\nfunction _onClick(event: MouseEvent): void {\n if (_editable.value) _props.onClick?.(event as PointerEvent) // follow MDN spec\n}\n\n/** Extra event handler tracking \"Escape\" and clearing the content */\nfunction _onKeydownClear(event: KeyboardEvent): void {\n if (! _props.onClear) return // no clear, no action\n const { key, altKey, ctrlKey, metaKey, shiftKey } = event\n if (altKey || ctrlKey || metaKey || shiftKey) return\n if (key !== 'Escape') return\n _props.onClear()\n event.preventDefault()\n}\n\n/** Extra event to handle focus state */\nconst _onFocusFocusable = () => void (_hasFocus.value = true)\nconst _onBlurFocusable = () => void (_hasFocus.value = false)\n\n/** Add all our required event listeners */\nfunction _addEventListeners(element?: HTMLInputElement | undefined): void {\n if (! element) return\n // Extra events for focus state: these _before_ the basic ones below, so that\n // \"hasFocus\" is set before any other event is handled by listeners\n element.addEventListener('focus', _onFocusFocusable)\n element.addEventListener('blur', _onBlurFocusable)\n // Setup basic event listeners\n element.addEventListener('beforeinput', _onBeforeinput)\n element.addEventListener('blur', _onBlur)\n element.addEventListener('click', _onClick)\n element.addEventListener('focus', _onFocus)\n element.addEventListener('input', _onInput)\n element.addEventListener('keydown', _onKeydown)\n element.addEventListener('keyup', _onKeyup)\n // Extra event for clearing input on \"Escape\": this goes _after_ the basic\n // ones so that anyone subscribed on \"keydown\" above can intercept the event\n // and stop propagation / prevent default / ...\n element.addEventListener('keydown', _onKeydownClear)\n}\n\n/** Remove all event listeners added above */\nfunction _removeEventListeners(element?: HTMLInputElement | undefined): void {\n if (! element) return\n // Extra events for focus state\n element.removeEventListener('focus', _onFocusFocusable)\n element.removeEventListener('blur', _onBlurFocusable)\n // Setup basic event listeners\n element.removeEventListener('beforeinput', _onBeforeinput)\n element.removeEventListener('blur', _onBlur)\n element.removeEventListener('click', _onClick)\n element.removeEventListener('focus', _onFocus)\n element.removeEventListener('input', _onInput)\n element.removeEventListener('keydown', _onKeydown)\n element.removeEventListener('keyup', _onKeyup)\n // Extra event for clearing input on \"Escape\"\n element.removeEventListener('keydown', _onKeydownClear)\n}\n\n/* On mounted, validate our main ref and add event listeners */\nonMounted(() => {\n if (! _qinput.value) throw new Error('No QInput ref')\n if (! _helper.value) throw new Error('No ZFormHelper ref')\n\n // We _watch_ but this should happen only once...\n watch(() => _qinput.value?.nativeEl, (newElement, oldElement) => {\n // Remove old event listeners and setup new ones (in case the element changes)\n _removeEventListeners(oldElement as HTMLInputElement)\n _addEventListeners(newElement as HTMLInputElement)\n // If we have a new element, set the input mode\n if (newElement) newElement.inputMode = _props.mode\n }, { immediate: true })\n})\n\n/* Before unmounting be nice and remove all our event listeners */\nonBeforeUnmount(() => _removeEventListeners(_qinput.value?.nativeEl as HTMLInputElement))\n</script>\n\n<style lang=\"postcss\" scoped>\n/* Suffix behind the input */\n.z-suffix {\n user-select: none;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: hidden;\n font-weight: 500;\n\n .z-suffix-hidden { color: transparent }\n .z-suffix-visible { opacity: 0.5 }\n}\n</style>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n\n type=\"text\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n :link=\"link\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :debounce=\"debounce\"\n :suffix=\"suffix\"\n :prefix=\"prefix\"\n\n :required=\"required\"\n :max-length=\"maxLength\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n @clear=\"_value = ''\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\n\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZString' })\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>,\n required: false,\n default: 'text',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The debounce time in milliseconds for the input field */\n debounce: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n /** The prefix to add to the input */\n prefix: {\n type: String as PropType<string>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The minimum length of this field (starting at 1, for 0 use \"required\") */\n minLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The maximum length, displayed with a counter (and error when too long). */\n maxLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/** Validation rules */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n if (_props.minLength > 0) rules.push(validators.minLength(_props.minLength))\n rules.push(..._props.rules)\n return rules\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-string\n ref=\"_zstring\"\n v-model=\"value\"\n :debounce=\"750\"\n :label=\"$t(translations.search)\"\n :icon=\"icons.search\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZString from '../inputs/string.vue'\nimport { componentFormProps } from '../utils/form'\n\nconst _zstring = ref<InstanceType<typeof ZString>>()\n\ndefineOptions({ name: 'ZControlSearch' })\n\ndefineProps(componentFormProps)\n\nconst value = defineModel({\n type: String,\n required: true,\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _zstring.value?.focus(),\n})\n\n/* On mounted, validate our main ref */\nonMounted(() => {\n if (! _zstring.value) throw new Error('No QInput ref')\n})\n\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn-group class=\"rounded-borders\">\n <z-btn\n v-for=\"option in options\"\n :key=\"option.value\"\n dense\n class=\"z-control\"\n style=\"margin-right: -1px;\"\n :class=\"{ 'z-control-active': value === option.value }\"\n :icon=\"option.icon\"\n :disable=\"scope.disabled\"\n :tooltip=\"option.tooltip\"\n\n @click=\"value = (value === option.value) ? undefined : option.value\"\n />\n </z-btn-group>\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { PropType } from 'vue'\n\ndefineOptions({ name: 'ZControlSwitch' })\n\ndefineProps({\n /** The options for this selection */\n options: {\n type: Array as PropType<{ icon: string, value: string, tooltip?: string }[]>,\n required: true,\n },\n ...componentFormProps,\n})\n\nconst value = defineModel({\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.q-btn-group {\n .z-control:not(:first-child) {\n border-left: none;\n }\n}\n\n</style>\n","<template>\n <q-dialog\n ref=\"dialogRef\"\n v-model=\"state\"\n :persistent=\"persistent\"\n :full-width=\"fullWidth || $q.screen.lt.sm\"\n :full-height=\"fullHeight\"\n @show=\"emit('show')\"\n @hide=\"emit('hide')\"\n >\n <q-card class=\"q-dialog-plugin\" :style=\"{ width: wide ? '100%' : null }\">\n <q-card-section horizontal class=\"q-pa-md bg-shade-primary\">\n <div class=\"col text-h6 text-bold text-uppercase\">\n {{ title }}\n </div>\n <div v-if=\"! persistent\" class=\"row justify-end\">\n <q-card-actions vertical class=\"justify-around q-pa-none\">\n <q-icon\n size=\"xs\"\n color=\"primary\"\n class=\"icon-close\"\n :name=\"icons.cancel\"\n @click=\"onDialogCancel\"\n />\n </q-card-actions>\n </div>\n </q-card-section>\n\n <q-separator />\n\n <slot name=\"default\" />\n </q-card>\n </q-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n QCard,\n QCardActions,\n QCardSection,\n QDialog,\n QIcon,\n QSeparator,\n useDialogPluginComponent,\n} from 'quasar'\n\nimport { icons } from '../assets/icons'\n\nimport type { VNode } from 'vue'\n\nconst { dialogRef, onDialogOK, onDialogCancel } = useDialogPluginComponent()\n\ndefineOptions({ name: 'ZDialog' })\n\ndefineProps({\n /** The title of this dialog */\n title: {\n type: String,\n required: true,\n },\n /**\n * Indicates that this dialog can not be dismissed automatically (e.g.\n * by clicking outside of it, or with the `ESC` key)\n */\n persistent: {\n type: Boolean,\n default: false,\n },\n /** Present a wider dialog */\n wide: {\n type: Boolean,\n default: false,\n },\n fullWidth: {\n type: Boolean,\n default: false,\n },\n fullHeight: {\n type: Boolean,\n default: false,\n },\n})\n\n/** Showing state */\nconst state = defineModel({\n type: Boolean,\n required: false,\n default: false,\n})\n\n/** Emits from the dialog */\nconst emit = defineEmits<{\n (event: 'ok', payload?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineSlots<{\n default: () => VNode[]\n}>()\n\ndefineExpose({\n show: () => dialogRef.value?.show(),\n shake: () => dialogRef.value?.shake(),\n confirm: onDialogOK,\n cancel: onDialogCancel,\n})\n</script>\n\n<style scoped lang=\"pcss\">\n/* Hover effect for the close icon */\n.icon-close {\n padding: 3px;\n cursor: pointer;\n margin-right: -3px;\n border-radius: 3px;\n\n &:hover {\n background-color: var(--q-shade-primary);\n }\n}\n</style>\n","<template>\n <z-dialog\n ref=\"dialog\"\n persistent\n :title=\"title\"\n @ok=\"emit('ok', $event)\"\n @show=\"emit('show')\"\n @hide=\"emit('hide')\"\n >\n <slot v-if=\"slots.default\" />\n <q-card-section v-else>\n {{ message }}\n </q-card-section>\n\n <q-card-actions>\n <z-btn\n class=\"col\"\n :label=\"cancel || t({ en: 'Cancel', de: 'Abbrechen' })\"\n :icon=\"cancelIcon\"\n :color=\"cancelColor\"\n @click=\"dialog?.cancel()\"\n />\n <z-btn\n class=\"col\"\n :label=\"confirm || t({ en: 'Confirm', de: 'Bestätigen' })\"\n :icon=\"confirmIcon\"\n :color=\"confirmColor\"\n @click=\"dialog?.confirm()\"\n />\n </q-card-actions>\n </z-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QCardActions, QCardSection } from 'quasar'\nimport { ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZDialog from './dialog.vue'\n\nimport type { VNode } from 'vue'\n\nconst { t } = useTranslator()\n\ndefineOptions({ name: 'ZConfirmDialog' })\n\ndefineProps({\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n required: false,\n default: '',\n },\n confirm: {\n type: String,\n required: false,\n default: undefined,\n },\n confirmIcon: {\n type: String,\n required: false,\n default: icons.confirm,\n },\n confirmColor: {\n type: String,\n required: false,\n default: 'positive',\n },\n cancel: {\n type: String,\n required: false,\n default: undefined,\n },\n cancelIcon: {\n type: String,\n required: false,\n default: icons.cancel,\n },\n cancelColor: {\n type: String,\n required: false,\n default: 'negative',\n },\n})\n\nconst slots = defineSlots<{\n default?: () => VNode[]\n}>()\n\nconst dialog = ref<InstanceType<typeof ZDialog>>()\n\n/** Emits from the dialog */\nconst emit = defineEmits<{\n (event: 'ok', payload?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineExpose({\n show: () => dialog.value?.show(),\n shake: () => dialog.value?.shake(),\n confirm: (value?: any) => dialog.value?.confirm(value),\n cancel: () => dialog.value?.cancel(),\n})\n</script>\n","<template>\n <z-dialog\n ref=\"_dialog\"\n persistent\n :title=\"title\"\n @show=\"_emit('show')\"\n @hide=\"_emit('hide')\"\n >\n <q-card-section class=\"row items-center justify-between\">\n <div>{{ message }}</div>\n <div>{{ _progress }}</div>\n </q-card-section>\n\n <q-card-section>\n <q-linear-progress instant-feedback :value=\"_quantity\" />\n </q-card-section>\n\n <q-card-actions v-if=\"onCancel\">\n <z-btn\n class=\"col\"\n color=\"negative\"\n :label=\"t({ en: 'Cancel', de: 'Abbrechen' })\"\n :icon=\"icons.cancel\"\n :disable=\"_canceled\"\n @click=\"_cancel()\"\n />\n </q-card-actions>\n </z-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QCardActions, QCardSection, QLinearProgress } from 'quasar'\nimport { computed, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZDialog from './dialog.vue'\n\nimport type { PropType } from 'vue'\n\nconst { t } = useTranslator()\n\ndefineOptions({ name: 'JProgressDialog' })\n\nconst _props = defineProps({\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n required: true,\n },\n progress: {\n type: Number,\n required: false,\n default: 0,\n },\n total: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n onCancel: {\n type: Function as PropType<(() => void) | undefined>,\n required: false,\n default: undefined,\n },\n})\n\n\nconst _canceled = ref(false)\nconst _dialog = ref<InstanceType<typeof ZDialog>>()\n\nfunction _cancel(): void {\n if (!_props.onCancel) return\n _canceled.value = true\n _props.onCancel()\n}\n\nconst _progress = computed(() => {\n if (_props.total) return `${_props.progress + 1} / ${_props.total}`\n return `${Math.round(_props.progress * 100)}%`\n})\n\nconst _quantity = computed(() => {\n if (_props.total) return _props.progress / (_props.total - 1)\n return _props.progress\n})\n\n/** Emits from the dialog */\nconst _emit = defineEmits<{\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineExpose({\n show: () => _dialog.value?.show(),\n hide: () => _dialog.value?.cancel(),\n})\n\n</script>\n","<template>\n <slot name=\"default\" v-bind=\"$attrs\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { nextTick, watch } from 'vue'\n\nimport { formProps, provideFormProps, provideFormReadyState } from '../utils/form'\n\nimport type { VNode } from 'vue'\n\n/* ===== NAME, PROPS, SLOTS, ... ============================================ */\n\ndefineOptions({ name: 'ZInputGroup' })\n\nconst _props = defineProps(formProps)\n\ndefineSlots<{\n default: () => VNode[],\n}>()\n\n/* ===== LOCAL STUFF ======================================================== */\n\nprovideFormProps(_props)\n\n/** The focused element, saved before disabling, and restored after */\nlet _focused: Element | null = null\n\n/* Watch the `disabled` prop and save the focused element, when this is\n * changed to _true_, and restore the old focused element on _false */\nwatch(() => _props.disabled, (disabled) => {\n if (disabled) return _focused = document.activeElement\n nextTick(() => { // wait for reactivity to update the DOM\n if (_focused instanceof HTMLElement) {\n _focused.focus()\n _focused = null\n }\n })\n})\n\ndefineExpose({\n /** A flag indicating that the \"required\" constraint (if any) was fulfilled */\n isReady: provideFormReadyState(),\n})\n</script>\n","<template>\n <z-input-group\n ref=\"_zinputs\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n :bottom-slots=\"bottomSlots\"\n >\n <q-form ref=\"_qform\" v-bind=\"{ ..._cleanProps, ...$attrs }\">\n <!-- hidden button to allow submitting on \"enter\" -->\n <button type=\"submit\" style=\"display: none;\" />\n <!-- default slot from the parent -->\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-form>\n </z-input-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport { QForm } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { formProps } from '../utils/form'\nimport ZInputGroup from './input-group.vue'\n\nimport type { QFormProps, QFormSlots } from 'quasar'\nimport type { PropType } from 'vue'\n\n/** Ref to our `QForm` */\nconst _qform = ref<QForm>()\n/** Ref to our `ZInputGroup` */\nconst _zinputs = ref<InstanceType<typeof ZInputGroup>>()\n\n/* ===== NAME, PROPS, SLOTS, EXPOSED ======================================== */\n\ndefineOptions({ name: 'ZForm' })\n\nconst _props = defineProps({\n // Pass-through for all QForm props (properly typed)\n ...QForm.props as { [ K in keyof QFormProps ]-?: PropType<QFormProps[K]> },\n // ZForm-specific props with defaults\n ...formProps,\n})\n\nconst _slots = defineSlots<Partial<QFormSlots>>()\n\n/* ===== LOCAL STUFF ======================================================== */\n\n/** Cleaned-up props (without \"bottomSlots\", \"editable\", ...) */\nconst _cleanProps = computed(() => ({\n ..._props,\n bottomSlots: undefined,\n editable: undefined,\n disabled: undefined,\n lazyRules: undefined,\n}))\n\ndefineExpose({\n focus: () => _qform.value?.focus(),\n validate: (shouldFocus?: boolean | undefined) => _qform.value ?\n _qform.value.validate(shouldFocus) :\n Promise.reject(new Error(('No QForm'))),\n resetValidation: () => _qform.value?.resetValidation(),\n submit: () => _qform.value?.submit(),\n reset: () => _qform.value?.reset(),\n getValidationComponents: () => _qform.value?.getValidationComponents(),\n isReady: computed(() => _zinputs.value?.isReady || false),\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZInputGroup ref is set */\nonMounted(() => {\n if (! _zinputs.value) throw new Error('No ZInputGroup ref')\n})\n</script>\n","import { computed, ref } from 'vue'\n\nimport type { ComputedRef } from 'vue'\n\n/** A loader, keeping track of concurrent loading callbacks */\nexport interface ZLoader {\n /** The loading state */\n loading: ComputedRef<boolean>\n /** Execute a callback triggering the loading state */\n load<T>(callback: () => T | Promise<T>): Promise<T>\n}\n\n/* ===== INTERNALS ========================================================== */\n\n/** Create a new loader with an optional parent (the root loader) */\nfunction loader(parent?: ZLoader | undefined): ZLoader {\n const _loading = ref(0)\n\n /** The loading state, computed by the _parent_ and this loader */\n const loading = computed(() => parent?.loading.value || (_loading.value > 0))\n\n /** Execute a callback triggering the loading state */\n async function load<T>(callback: () => T | Promise<T>): Promise<T> {\n _loading.value ++\n try {\n return await callback()\n } finally {\n _loading.value --\n }\n }\n\n /* Here is the loader */\n return { loading, load }\n}\n\n/** The global (root) loader */\nconst rootLoader = loader()\n\n/* ===== EXPORTED ========================================================== */\n\n/** Use the global loader */\nexport function useLoader(): ZLoader {\n return rootLoader\n}\n\n/**\n * Create a new loader, potentially decoupled from the root one.\n *\n * When `detached` is `false` (or not defined), the loader will be linked to\n * the root loader, meaning that when the root loader is loading, this loader\n * will also be loading (but not vice-versa, the loading state of this child\n * will _not_ affect the state of the root loader).\n *\n * When `detached` is `true`, the loader will be completely independent from\n * the root loader.\n */\nexport function createLoader(detached?: boolean): ZLoader {\n return loader(detached ? undefined : rootLoader)\n}\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n :model-value=\"_selected\"\n\n dense\n outlined\n stack-label\n use-input\n hide-selected\n fill-input\n\n no-error-icon\n hide-dropdown-icon\n\n :class=\"\n formProps.disabled ? 'z-state-disabled' :\n formProps.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon\n\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :disable=\"formProps.disabled\"\n :readonly=\"! formProps.editable\"\n :rules=\"_rules\"\n\n :options=\"_options\"\n :editable=\"true\"\n :input-debounce=\"debounce\"\n :behavior=\"'menu'\"\n :loading=\"loading\"\n\n @keydown=\"onKeydown\"\n @input-value=\"_onInputValue\"\n @popup-hide=\"_onPopupHide\"\n @popup-show=\"_onPopupShow\"\n @update:model-value=\"_onSelected\"\n >\n <template #loading>\n <q-spinner color=\"grey\" size=\"xs\" />\n </template>\n\n <template v-if=\"maxLength && formProps.editable\" #counter>\n {{ _input.length }} / {{ maxLength }}\n </template>\n\n <template #append>\n <!-- First icon, error -->\n <q-icon\n v-if=\"_qselect?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n <!-- Second icon: clearable/required -->\n <q-icon\n v-if=\"formProps.editable && _selected && clearable\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click.stop.prevent=\"_input = ''\"\n />\n <q-icon\n v-else-if=\"(! _selected) && required\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n <!-- Icon from parent -->\n <q-icon\n v-if=\"icon\"\n :name=\"icon\"\n class=\"z-icon\"\n />\n </template>\n\n <template #option=\"scope: Parameters<QSelectSlots['option']>[0]\">\n <slot v-if=\"_slots.option\" name=\"option\" v-bind=\"scope\" />\n <q-item v-else v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n {{ scope.label }}\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemSection, QSelect, QSpinner } from 'quasar'\nimport { computed, nextTick, onMounted, ref, shallowRef, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\nimport { createLoader } from '../utils/loader'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZOption } from '../types'\n\nconst validators = useValidators()\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZAutocomplete' })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== AUTOCOMPLETE ===================================================== */\n\n /** Debounce input for the specified amount of time (default: 250ms) */\n debounce: {\n type: Number,\n required: false,\n default: 250,\n },\n /**\n * Used as `@autocomplete=\"...\"` in templates, prepares a list of otions\n * that can be auto-completed.\n *\n * When this method returns `string[]`, then the `@selected` event will\n * *not* be emitted (pure autocomplete). In order to have the `@selected`\n * even fired *always* return an array of `Option` objects, with unique\n * `value` properties.\n */\n onAutocomplete: {\n type: Function as PropType<(text: string) => (ZOption | string)[] | Promise<(ZOption | string)[]>>,\n required: true,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n maxLength: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\nconst _slots = defineSlots<{\n option?: (scope: Parameters<QSelectSlots['option']>[0]) => VNode[],\n}>()\n\n/** The *text* value of the input */\nconst _input = defineModel({\n type: String as PropType<string >,\n required: false,\n default: '',\n})\n\nconst _emit = defineEmits<{\n (event: 'selected', value: ZOption): void,\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n})\n\n/* ===== INTERNAL STATE ===================================================== */\n\n/** List of currently filtered tags */\nconst _options = shallowRef<readonly ZOption[]>([])\n\n/** The validation rules to apply to this field */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n\n /* Required (from prop) */\n if (_props.required) rules.push(validators.required())\n /* Max length (from prop) */\n if (_props.maxLength > 0) rules.push(validators.maxLength(_props.maxLength))\n /* All other rules (from prop) */\n rules.push(..._props.rules)\n\n return [ (value?: ZOption | undefined) => {\n for (const rule of rules) {\n const result = rule(value?.label || '')\n if (typeof result === 'string') return result\n if (result === false) return false\n }\n return true\n } ]\n})\n\n/* ===== SELECTED VALUE ===================================================== */\n\n/** Currently selected option */\nconst _selected = shallowRef<ZOption | undefined>(_input.value ? { label: _input.value, value: _input.value } : undefined)\n\n\n/** Selected from the popup menu */\nfunction _onSelected(option: ZOption): void {\n // remember this option and set the input value of the label\n _selected.value = option\n _input.value = option.label\n\n // If by any chance we have an autocompleter running, cancel it\n _autocompleter.cancel()\n\n // hide the popup, clear the options\n _qselect.value?.hidePopup()\n _options.value = []\n\n // emit the selected event\n _emit('selected', option)\n}\n\n/* ===== INPUT VALUE ======================================================== */\n\n/* Update the text in our control based on what's out */\nwatch(_input, (value) => {\n _qselect.value?.updateInputValue(value, true)\n if (value) _selected.value = { label: value, value }\n else if (_selected.value) _selected.value = undefined\n}, { immediate: true })\n\n/** Update the model from the changes typed by the user */\nfunction _onInputValue(value: string): void {\n value = value.trim().replace(/\\s+/g, ' ') // always normalize!\n\n // when we have no change, just bail out\n if (value === _input.value) return\n _input.value = value\n\n // QSelect validates on *selection*, but we validate on *input* (text)!\n _qselect.value?.validate() // validate the input\n\n // if the value is already in the options, we don't need to autocomplete: this\n // is someone going up-and-down the list with the cursor keys... but if it's\n // not in the list, then someone is typing and we need to autocomplete again!\n const found = _options.value.find((option) => option.label === value)\n if (! found) _autocomplete(value)\n}\n\n\n/* ===== STATE ============================================================== */\n\n/** On popup hide, clear the options for the next autocomplete iteration */\nfunction _onPopupHide(): void {\n _options.value = []\n}\n\n/** On popup show, simply focus on the first option available */\nfunction _onPopupShow(): void {\n if (! _qselect.value?.options?.length) return // should never happen...\n _qselect.value?.setOptionIndex(-1)\n _qselect.value?.moveOptionSelection(1, true)\n}\n\n/* ===== FUNCTIONS ========================================================== */\n\n/**\n * Traps \"Escape\" to hide the popup (first) and clear the value (second) or\n * \"Tab\" to autocomplete.\n *\n * Quasar tracks \"Escape\" (and resets the input value) on \"keyup\"... This\n * happens only when the popup is shown (see below) so we intercept on key\n * down, and manually close the popup / wipe the input as needed.\n * https://github.com/quasarframework/quasar/blob/7182607ecac54c406c3cce595245d1bb1160024a/ui/src/components/select/QSelect.js#L639-L644\n */\nfunction onKeydown(event: KeyboardEvent): void {\n if (! _qselect.value) return // should never happen\n\n // no modifiers\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n\n // Handle \"Escape\" key (close popup / clear value)\n if (event.code === 'Escape') {\n // if we have options, clear them and hide the popup\n if (_options.value.length > 0) _qselect.value.hidePopup()\n else _input.value = ''\n\n // regardless...\n _qselect.value.hidePopup()\n event.preventDefault()\n event.stopPropagation()\n }\n}\n\n/* ===== AUTOCOMPLETE ======================================================= */\n\n/** Loader and loading state for autocompletion */\nconst { load, loading } = createLoader(true) // detached from global loading\n\n/**\n * A simple class asynchronously querying autocompletions and passing them to\n * our `QSelect` _unless_ its execution was canceled\n */\nclass Autocompleter {\n private _canceled = false\n\n constructor(public readonly text: string) {\n // Always start in the next tick, this gives us the chance to cancel!\n nextTick(() => load(async () => {\n // If canceled already, don't even fetch... This is important because the\n // initial autocompleter will be canceled immediately below, or when\n // \"_onSelect()\" and \"_onInputValue()\" are called, we don't know which\n // comes first, so we give them the ability to cancel each-other!\n if (this._canceled) return\n\n // Fetch the results and map them to options, then freeze the array\n const results = text ? await _props.onAutocomplete(text) : []\n const options = Object.freeze(results.map((option) => {\n if (typeof option === 'string') return { label: option, value: option }\n return option\n }))\n\n // If this was canceled (fetching might take time), then we ignore all\n // the rest and just ignore whatever results we got\n if (this._canceled) return\n\n // Immediately hide the popup if there are no options. If we don't call\n // this and just let the options be set to an empty array, then Quasar\n // will not emit the \"hide\" event and all sorts of bad will happen!\n if (options.length === 0) _qselect.value?.hidePopup()\n _options.value = options\n\n // On the next tick if and only if f there are options, show the popup\n nextTick(() => _qselect.value?.options?.length && _qselect.value?.showPopup())\n }))\n }\n\n /** Cancel this autocompleter */\n cancel(): this {\n this._canceled = true\n return this\n }\n}\n\n/**\n * The currently running asynchronous autocompleter.\n *\n * The initial value uses the input model value, but is immediately canceled\n * (so that we don't fetch at the beginning, but once the input changes we do)\n */\nlet _autocompleter: Autocompleter = new Autocompleter(_input.value).cancel()\n\n/* Asynchronous filtering shows and hides the popup in Quasar, so rather than\n * using `@filter=\"...\"` we take over the part of showing our autocompletion\n * options entirely */\nfunction _autocomplete(text: string): void {\n // \"Cancel\" the previous autocompleter if it's still running\n _autocompleter.cancel()\n\n // If the current text matches the last autocomplete run, we ignore\n if (text === _autocompleter.text) return\n\n // And create a new one!\n _autocompleter = new Autocompleter(text)\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n})\n</script>\n","<template>\n <z-autocomplete\n ref=\"_zautocomplete\"\n v-model=\"_value\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :debounce=\"debounce\"\n :clearable=\"clearable\"\n\n :max-length=\"maxLength\"\n :required=\"required\"\n :rules=\"rules\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n\n @autocomplete=\"_predictAddress\"\n @selected=\"_fillAddress\"\n >\n <template #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <div>\n <span\n v-for=\"(token, i) in (scope.opt.tokens as AddressToken[])\"\n :key=\"`${scope.opt.value}.${i}`\"\n :class=\"`autocomplete-${token.type}`\"\n >\n {{ token.value }}\n </span>\n </div>\n </q-item-section>\n </q-item>\n </template>\n </z-autocomplete>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QItem, QItemSection } from 'quasar'\nimport { onMounted, ref } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZAutocomplete from './autocomplete.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZAddressData, ZOption } from '../types'\n\nconst { locale } = useTranslator()\n\nconst _zautocomplete = ref<InstanceType<typeof ZAutocomplete>>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZAddress' })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Debounce input for the specified amount of time (default: 250ms) */\n debounce: {\n type: Number,\n required: false,\n default: 250,\n },\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== GOOGLE MAPS ====================================================== */\n\n /** Region to bias results in (e.g. DE) */\n region: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Clearable, when clicked value will become the empty string */\n maxLength: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The *text* value of the input */\nconst _value = defineModel({\n type: String as PropType<string >,\n required: false,\n default: '',\n})\n\nconst _emit = defineEmits<{\n (event: 'address', value: ZAddressData, foo?: boolean): void,\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _zautocomplete.value?.focus(),\n})\n\n/* ===== Google Maps Autocomplete =========================================== */\n\ntype AddressToken = { value: string, type: 'match' | 'miss' | 'secondary' }\ntype AddressPrediction = ZOption & { tokens: AddressToken[] }\n\nlet _googleService: google.maps.places.AutocompleteService | undefined = undefined\n\nasync function _predictAddress(value: string): Promise<{ value: string, label: string }[]> {\n if (! _googleService) {\n if (! globalThis.google?.maps?.places?.AutocompleteService) {\n throw new Error('Google Maps AutocompleteService not available')\n }\n _googleService = new google.maps.places.AutocompleteService()\n }\n\n if (! value) return [] // should never happen, but still\n\n // Prepare our request\n const request = {\n input: value,\n types: [ 'address' ],\n region: _props.region,\n language: locale.toString(),\n } satisfies google.maps.places.AutocompletionRequest\n\n // Get place predictions from Google\n const response = await _googleService.getPlacePredictions(request)\n\n // Process predictions and extract tokens\n const predictions: AddressPrediction[] = []\n for (const prediction of response.predictions) {\n const current: AddressPrediction = {\n value: prediction.place_id,\n label: prediction.description,\n tokens: [],\n }\n\n let pos = 0\n for (const subs of prediction.structured_formatting.main_text_matched_substrings) {\n const off = subs.offset\n const end = subs.offset + subs.length\n const miss = prediction.structured_formatting.main_text.slice(pos, off)\n const match = prediction.structured_formatting.main_text.slice(off, end)\n if (miss) current.tokens.push({ value: miss, type: 'miss' })\n if (match) current.tokens.push({ value: match, type: 'match' })\n pos = end\n }\n\n const miss = prediction.structured_formatting.main_text.slice(pos)\n const secondary = prediction.structured_formatting.secondary_text\n\n if (miss) current.tokens.push({ value: miss, type: 'miss' })\n if (secondary) current.tokens.push({ value: ` - ${secondary}`, type: 'secondary' })\n\n predictions.push(current)\n }\n\n // Return our predictions\n return predictions\n}\n\nasync function _fillAddress(option: ZOption): Promise<void> {\n if (! globalThis.google?.maps?.places?.Place) {\n throw new Error('Google Maps Place not available')\n }\n\n const place = new google.maps.places.Place({ id: option.value })\n await place.fetchFields({ fields: [ 'addressComponents' ] })\n\n const address: ZAddressData = {}\n for (const component of place.addressComponents || []) {\n for (const type of component.types) {\n switch (type) {\n case 'route': address.street_name = component.longText || ''; break\n case 'street_number': address.house_number = component.longText || ''; break\n case 'postal_code': address.postal_code = component.longText || ''; break\n case 'locality': address.city = component.longText || ''; break\n case 'country': address.country = component.shortText || undefined; break // short!\n }\n }\n }\n\n // emit our address\n _emit('address', address)\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _zautocomplete.value) throw new Error('No ZAutocomplete ref')\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.autocomplete-match {\n font-weight: 700;\n}\n\n.autocomplete-miss {\n font-weight: 400;\n}\n\n.autocomplete-secondary {\n font-size: 0.75em;\n}\n</style>\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n ref=\"_helper\"\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n v-model=\"_value\"\n\n dense\n outlined\n stack-label\n map-options\n emit-value\n hide-dropdown-icon\n no-error-icon\n\n :class=\"\n formProps.disabled ? 'z-state-disabled' :\n formProps.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :prefix=\"prefix\"\n :hint=\"hint\"\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :icon\n\n :disable=\"formProps.disabled\"\n :readonly=\"! formProps.editable\"\n :rules=\"_rules\"\n\n :options=\"_options\"\n :behavior=\"'menu'\"\n >\n <template #append>\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.prepend\" name=\"prepend\" v-bind=\"formProps\" />\n <!-- First icon, dropdown (only visible when editable) -->\n <q-icon\n v-if=\"formProps.editable\"\n :name=\"icons.select\"\n class=\"z-icon\"\n />\n <!-- Second icon, error -->\n <q-icon\n v-if=\"_qselect?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n <!-- Third icon, clearable/required -->\n <q-icon\n v-if=\"formProps.editable && _value && clearable\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click.stop.prevent=\"_value = ''\"\n />\n <q-icon\n v-else-if=\"(! _value) && required\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n <!-- Fourth icon, parent icon -->\n <q-icon\n v-if=\"icon\"\n :name=\"icon\"\n class=\"z-icon\"\n />\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.append\" name=\"append\" v-bind=\"formProps\" />\n </template>\n\n <!-- When specified, use the \"option\" slot from the caller -->\n <template v-if=\"_slots.option\" #option=\"scope\">\n <slot name=\"option\" v-bind=\"scope\" />\n </template>\n\n <!-- The default option template, dense -->\n <template v-else #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <q-item-label>\n {{ scope.label }}\n </q-item-label>\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QSelect } from 'quasar'\nimport { computed, onMounted, ref, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps, formReadyState } from '../utils/form'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/** Ref to our `ZFormHelper` */\nconst _helper = ref<InstanceType<typeof ZFormHelper>>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZSelect' })\n\nconst _props = defineProps({\n\n /* ===== OPTIONS ========================================================== */\n\n /** All our options, keyed by the option, with values being the labels */\n options: {\n type: Object as PropType<Record<string, string> | { value: string, label: string }[] | string[]>,\n required: true,\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The prefix to display before the input value */\n prefix: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The currently selected option */\nconst _value = defineModel({\n type: String,\n required: false,\n default: undefined,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n prepend?: (formProps: Readonly<ZFormProps>) => VNode[]\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n option?: QSelectSlots['option']\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _qselect.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _qselect.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _qselect.value?.hasError || false),\n})\n\n/* ===== STATE ============================================================== */\n\n/** Convert options from a record to an array and sort */\nconst _options = computed(() => {\n if (Array.isArray(_props.options)) {\n return _props.options.map((value) => typeof value === 'string' ? { label: value, value } : value)\n }\n\n return Object.entries(_props.options)\n .map(([ value, label ]) => ({ value, label }))\n .sort((a, b) => a.label.localeCompare(b.label))\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** The validation rules to apply to this field */\nconst _rules = computed(() => {\n // Remember, Quasar won't clear the error if there are no rules!!!\n return _props.required ? [ validators.required() ] : [ () => true ]\n})\n\n/* When editable or validation rules change, reset validation */\nwatch([ () => _helper.value?.isEditable, _rules ], () => _qselect.value?.resetValidation())\n\n/* Ready state for parent ZForm */\nformReadyState(() => {\n if (_qselect.value?.hasError) return false\n if (_props.required) return !! _value.value\n return true\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n if (! _helper.value) throw new Error('No ZFormHelper ref')\n})\n</script>\n","<template>\n <z-select\n v-model=\"_value\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n\n :required=\"required\"\n :clearable=\"clearable\"\n :suffix=\"suffix\"\n :options=\"_countries\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :prefix=\"_flag\"\n :icon=\"icon\"\n >\n <template #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <q-item-label>\n {{ scope.label }}\n </q-item-label>\n </q-item-section>\n <q-item-section avatar>\n <q-item-label>\n {{ scope.opt.flag }}\n </q-item-label>\n </q-item-section>\n </q-item>\n </template>\n </z-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ISO_COUNTRIES, useTranslator } from '@juit/vue-i18n'\nimport { QItem, QItemLabel, QItemSection } from 'quasar'\nimport { computed } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZSelect from './select.vue'\n\nimport type { PropType } from 'vue'\n\nconst translator = useTranslator()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZSelect' })\n\ndefineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to display after the input value */\n suffix: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\nconst _value = defineModel({\n type: String as PropType<string>,\n required: false,\n})\n\n\nconst _flag = computed(() => {\n return _value.value ? translator.utils.flag(_value.value as any) : ''\n})\n\nconst _countries = computed(() => {\n // Prepare the countries\n const countries: { value: string, label: string, flag: string }[] = []\n\n // Add all countries, with nice flags in the labels\n for (const code of ISO_COUNTRIES) {\n const label = translator.utils.country(code)\n const flag = translator.utils.flag(code)\n countries.push({ value: code, label: label, flag })\n }\n\n // Always sort by translated country NAME (\"Vereinigte Staaten\" is not \"U\")\n countries.sort((a, b) => a.label.localeCompare(b.label))\n\n // Done\n return countries\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n :model-value=\"_localized\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"_onClear\"\n @click=\"_onClick\"\n >\n <template #append>\n <!-- Popup proxy for date picking -->\n <q-popup-proxy\n ref=\"_qpopup\"\n no-parent-event\n :target=\"_target\"\n @before-hide=\"_hiding = true\"\n @hide=\"_hiding = false\"\n >\n <q-date\n minimal\n range\n mask=\"YYYY-MM-DD\"\n :model-value=\"_value || ''\"\n :first-day-of-week=\"1\"\n @update:model-value=\"_onUpdate\"\n />\n </q-popup-proxy>\n\n <!-- Icon for the picker -->\n <q-icon\n v-if=\"_ztext?.isEditable\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click=\"_onClick\"\n />\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QDate, QIcon, QPopupProxy } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { DateTimeFormatAlias } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\nimport type { ZDateRangeData } from '../types'\n\nconst { d } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _qpopup = ref<QPopupProxy>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDateRange', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.date,\n },\n format: {\n type: [ String, Object ] as PropType<DateTimeFormatAlias | Intl.DateTimeFormatOptions>,\n required: false,\n default: 'date',\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Indicates that the field can be cleared (sets the date to ''). */\n clearable: {\n type: [ Boolean, String ] as PropType<boolean | 'today'>,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: Object as PropType<ZDateRangeData | undefined>,\n required: false,\n})\n\n/** The localized value to display */\nconst _localized = computed(() => {\n if (! _value.value) return ''\n\n if (_value.value.from === _value.value.to) {\n return d(_value.value.from, _props.format, 'UTC')\n } else {\n const from = d(_value.value.from, _props.format, 'UTC')\n const to = d(_value.value.to, _props.format, 'UTC')\n return `${from} - ${to}`\n }\n})\n\n/* ===== POPUP MANAGEMENT =================================================== */\n\nconst _target = computed(() => _ztext.value?.$el.querySelector('.q-field__inner') || undefined)\nconst _hiding = ref(false)\n\nfunction _today(): string {\n const today = new Date()\n const year = String(today.getFullYear()).padStart(4, '0')\n const month = String(today.getMonth() + 1).padStart(2, '0')\n const day = String(today.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction _onClick(event: MouseEvent): void {\n if (! _hiding.value) _qpopup.value?.toggle()\n event.stopPropagation()\n event.preventDefault()\n}\n\nfunction _onUpdate(value: string | ZDateRangeData): void {\n if (! value) return // ignore when QDate clears the value\n if (value !== _value.value) {\n if (typeof(value) === 'string') {\n _value.value = {\n from: value,\n to: value,\n }\n } else {\n _value.value = {\n from: value.from,\n to: value.to,\n }\n }\n }\n _qpopup.value?.hide()\n}\n\nconst _onClear = computed((): (() => void) | undefined => {\n // Easy cases...\n if (_props.clearable === false) return undefined\n if (_props.clearable === true) return () => _value.value = undefined\n // When clearable is set to \"today\", we clear only if value is _not_ today\n if (_props.clearable === 'today') {\n const today = _today()\n if ((_value.value?.from === today) && (_value.value.to === today)) return undefined\n return () => _value.value = { from: today, to: today }\n } else return undefined\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n /* Set value if none was specified and clearable is set to \"today\" */\n if ((! _value.value) && (_props.clearable === 'today')) {\n _value.value = {\n from: _today(),\n to: _today(),\n }\n }\n\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _qpopup.value) throw new Error('No QPopupProxy ref')\n})\n\n/* ===== EXPOSE ============================================================= */\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Return _today_ in date format (`yyyy-mm-dd`) in the current timezone */\n today: () => _today(),\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n :model-value=\"_localized\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"_onClear\"\n @click=\"_onClick\"\n >\n <template #append>\n <!-- Popup proxy for date picking -->\n <q-popup-proxy\n ref=\"_qpopup\"\n no-parent-event\n :target=\"_target\"\n @before-hide=\"_hiding = true\"\n @hide=\"_hiding = false\"\n >\n <q-date\n minimal\n mask=\"YYYY-MM-DD\"\n :model-value=\"_value\"\n :first-day-of-week=\"1\"\n @update:model-value=\"_onUpdate\"\n />\n </q-popup-proxy>\n\n <!-- Icon for the picker -->\n <q-icon\n v-if=\"_ztext?.isEditable\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click=\"_onClick\"\n />\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QDate, QIcon, QPopupProxy } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { DateTimeFormatAlias } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\n\nconst { d } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _qpopup = ref<QPopupProxy>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDate', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.date,\n },\n format: {\n type: [ String, Object ] as PropType<DateTimeFormatAlias | Intl.DateTimeFormatOptions>,\n required: false,\n default: 'date',\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Indicates that the field can be cleared (sets the date to ''). */\n clearable: {\n type: [ Boolean, String ] as PropType<boolean | 'today'>,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/** The localized value to display */\nconst _localized = computed(() => d(_value.value, _props.format, 'UTC'))\n\n/* ===== POPUP MANAGEMENT =================================================== */\n\nconst _target = computed(() => _ztext.value?.$el.querySelector('.q-field__inner') || undefined)\nconst _hiding = ref(false)\n\nfunction _today(): string {\n const today = new Date()\n const year = String(today.getFullYear()).padStart(4, '0')\n const month = String(today.getMonth() + 1).padStart(2, '0')\n const day = String(today.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction _onClick(event: MouseEvent): void {\n if (! _hiding.value) _qpopup.value?.toggle()\n event.stopPropagation()\n event.preventDefault()\n}\n\nfunction _onUpdate(value: string): void {\n if (! value) return // ignore when QDate clears the value\n if (value !== _value.value) _value.value = value\n _qpopup.value?.hide()\n}\n\nconst _onClear = computed((): (() => void) | undefined => {\n // Easy cases...\n if (_props.clearable === false) return undefined\n if (_props.clearable === true) return () => _value.value = ''\n // When clearable is set to \"today\", we clear only if value is _not_ today\n if (_props.clearable === 'today') {\n if (_value.value === _today()) return undefined\n return () => _value.value = _today()\n } else return undefined\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n /* Set value if none was specified and clearable is set to \"today\" */\n if ((! _value.value) && (_props.clearable === 'today')) _value.value = _today()\n\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _qpopup.value) throw new Error('No QPopupProxy ref')\n})\n\n/* ===== EXPOSE ============================================================= */\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Return _today_ in date format (`yyyy-mm-dd`) in the current timezone */\n today: () => _today(),\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n type=\"text\"\n mode=\"numeric\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n :max-length=\"13\"\n :suffix=\"_ztext?.isEditable ? _suffix : undefined\"\n\n @clear=\"_value = ''\"\n @beforeinput=\"_onBeforeinput\"\n @keydown=\"_onKeydown\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\n\nconst { minLength } = useValidators()\nconst { t } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZEan13', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: icons.barcode,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** The suffix, padding the EAN13 to 13 characters */\nconst _suffix = computed(() => {\n if (! _value.value) return ''\n if (_value.value.length > 12) return ''\n if (_value.value.match(/[^0-9]/)) return ''\n\n // extend to 12 characters with zeroes, then add our checksum\n const suffix = '0'.repeat(12 - _value.value.length)\n return suffix + ean13Checksum(_value.value + suffix)\n})\n\n/** Validate as an EAN13 */\nconst _rules = computed<ZValidator<string>[]>(() => [\n // Minimum length\n minLength(13),\n // Only digits\n (value: string) => {\n if (value.match(/^[0-9]*$/)) return true\n return t({ en: 'Only numbers allowed', de: 'Nur Zahlen erlaubt' })\n },\n // EAN13 checksum validation\n (value: string) => { // checksum validation\n const slice = value.slice(0, 12)\n const checksum = ean13Checksum(slice)\n if (value === (slice + checksum)) return true\n return t({\n en: 'Last digit should be {checksum}',\n de: 'Letzte Ziffer sollte {checksum} sein',\n }, { checksum })\n },\n // Rules from props\n ..._props.rules,\n] satisfies ZValidator<string>[])\n\nfunction ean13Checksum(barcode: string): string {\n if (barcode.length < 12) return ''\n\n /* Calculate the weighted sum for the first 12 digits */\n let sum = 0\n for (let i = 0, w = 1; i < 12; i ++, w = i % 2 ? 3 : 1) {\n sum += (barcode.charCodeAt(i) - 0x30) * w\n }\n\n /* The checksum number is 10 - sum, we calculate it and convert it into a character */\n return String.fromCharCode(((10 - (sum % 10)) % 10) + 0x30)\n}\n\n/* ===== AUTOFILL =========================================================== */\n\nfunction _onBeforeinput(event: InputEvent): void {\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n // the \"insertText\" event is when we _type_ something, only numbers!\n if (event.data?.match(/^\\d+$/)) return\n // something else but text\n event.preventDefault()\n}\n\n/** Track \"Tab\" and autocomplete if we have a suffix */\nfunction _onKeydown(event: KeyboardEvent): void {\n if (! _suffix.value) return // no suffix? no autocomplete!\n const { key, altKey, ctrlKey, metaKey, shiftKey } = event\n if (altKey || ctrlKey || metaKey || shiftKey) return\n if (key !== 'Tab') return\n // Autocomplete to our suffix\n _value.value = _value.value + _suffix.value\n event.preventDefault()\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <div class=\"z-input\" :class=\"{ 'z-minimal-label': minimal }\">\n <z-form-helper\n v-slot=\"formProps\"\n :bottom-slots\n :disabled\n >\n <q-input\n :model-value=\"_value\"\n\n dense\n readonly\n stack-label\n no-error-icon\n\n input-style=\"cursor: default\"\n :class=\"((! minimal) && formProps.disabled) && 'z-state-disabled'\"\n :outlined=\"! minimal\"\n\n :placeholder=\" minimal ? placeholder : undefined\"\n :hint=\"hint\"\n :bottom-slots=\"minimal ? false : formProps.bottomSlots\"\n :hide-bottom-space=\"minimal ? true : ! formProps.bottomSlots\"\n\n :label=\"label\"\n >\n <template v-if=\"icon\" #append>\n <!-- Links are enabled *only* when the containing form is not editable -->\n <template v-if=\"link && (! formProps.formEditable)\">\n <!-- String links are rendered as anchors -->\n <a\n v-if=\"(typeof link === 'string')\"\n :href=\"link\"\n class=\"z-icon-link\"\n @click.stop=\"() => {} /* q-input captures clicks and prevents default */\"\n >\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </a>\n\n <!-- Object links are rendered as router links -->\n <router-link v-else :to=\"link\" class=\"z-icon-link\">\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </router-link>\n </template>\n\n <!-- Render the plain icon (not clickable) -->\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </q-input>\n </z-form-helper>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QIcon, QInput } from 'quasar'\nimport { computed } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport ZFormHelper from '../forms/form-helper.vue'\n\nimport type { PropType } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\n\nconst { n, t } = useTranslator()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZLabel' })\n\nconst _props = defineProps({\n\n /** The value to display in this label */\n value: {\n type: [ String, Number, Boolean, null ] as PropType<string | number | boolean | null | undefined>,\n required: false,\n default: undefined,\n },\n\n /** Whether the label is minimalistic or not */\n minimal: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== MERGE WITH FORM PROPS ============================================ */\n\n /** Disabled state, overriding the editable and active states */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n\n /** Whether to reserve space for the bottom slots or not */\n bottomSlots: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n})\n\nconst _value = computed(() => {\n if (_props.value === undefined) return ''\n if (_props.value === null) return ''\n\n if (typeof _props.value === 'boolean') {\n return _props.value ?\n t({ en: 'True', de: 'Wahr' }) :\n t({ en: 'False', de: 'Falsch' })\n }\n\n if (typeof _props.value === 'number') {\n return n(_props.value)\n }\n\n return _props.value\n})\n\n</script>\n\n<style lang=\"postcss\" scoped>\n.z-minimal-label {\n :deep(.q-field__control) {\n background-color: transparent !important;\n padding-left: 6px;\n padding-right: 6px;\n\n &::before {\n border-top: 1px solid transparent !important;\n border-left: 1px solid transparent !important;\n border-right: 1px solid transparent !important;\n }\n }\n}\n</style>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"{ ..._attrs, validateNull: undefined }\"\n v-model=\"_string\"\n type=\"text\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :suffix=\"suffix\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n :on-clear=\"() => _number = null\"\n\n @beforeinput=\"_onBeforeinput($event)\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { computed, onMounted, ref, useAttrs, watch } from 'vue'\n\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\nconst translator = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZNullableNumber', inheritAttrs: false })\n\nconst _attrs = useAttrs()\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'decimal' | 'numeric'>,\n required: false,\n default: 'decimal',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Required (that is, we need a non-null number, non-empty string) */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Minimum value (inclusive) */\n minimum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** Maximum value (inclusive) */\n maximum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<number>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _number = defineModel({\n type: [ Number, null ] as PropType<number | null>,\n required: false,\n default: null,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** If the field has validation errors or not */\n isEditable: computed(() => _ztext.value?.isEditable || false),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** Shallow ref to be replaced when the numeric rules change */\nconst _rules = computed<ZValidator<string>[]>(() => {\n const rules: ZValidator<number>[] = [\n // \"isNaN\" or \"Infinity\" are not valid numbers\n (value: number) => ! isNaN(value),\n (value: number) => Number.isFinite(value),\n ]\n\n // Minimum and maximum values\n if (_props.minimum !== undefined) rules.push(validators.minimum(_props.minimum))\n if (_props.maximum !== undefined) rules.push(validators.maximum(_props.maximum))\n\n // All other rules\n rules.push(..._props.rules)\n\n // A single text validation rule, ignoring its input and validating the number\n // value; since \"_rules\" is a shallow ref, this will trigger `ztext`, too!\n return [ (string: string) => {\n const number = _parseNumber(string)\n\n // We use the _attr_ \"validateNull\" set to \"true\" to force validation\n // of nulls as zero from \"j-number\" here! Not a prop, as we don't want\n // to expose externally, though!\n if (number === null && (! _attrs.validateNull)) return true\n\n for (const rule of rules) {\n const result = rule(number || 0)\n if (typeof result === 'string') return result\n if (result === false) return false\n }\n return true\n } ]\n})\n\n/* ===== NUMBER HANDLING ==================================================== */\n\n/** Thousands separator (`,` comma in english, `.` dot in german) */\nconst tsep = computed(() => (1234).toLocaleString(translator.locale)[1]!)\n/** Decimals separator (`.` dot in english, `,` comma in german) */\nconst dsep = computed(() => (1.23).toLocaleString(translator.locale)[1]!)\n/** The updated model value, as a string, from the parent component */\nconst _string = ref<string>(_formatNumber(_number.value))\n\n/** \"onBeforeInput\" prevents anything but numbers to be typed in our field */\nfunction _onBeforeinput(event: InputEvent): void {\n const element = event.target as HTMLInputElement\n\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n\n // the \"insertText\" event is when we _type_ something\n if (\n // have we typed only digits???\n (event.data?.match(/^\\d+$/)) ||\n // have we typed the only decimal separator???\n ((event.data === dsep.value) && (element.value.indexOf(dsep.value) < 0)) ||\n // have we typed a negation sign (at the beginning of the input)???\n ((event.data === '-') && (element.value[0] !== '-') && (element.selectionStart === 0))\n ) return // then let this event through!\n\n // if this event is a simple \".\" we consider it to be a decimal separator\n // as on iOS the default \"decimal\" keboard uses it as a delimiter\n if ((event.data === '.' ) && (element.value.indexOf(dsep.value) < 0)) {\n const string = element.value\n const pos = element.selectionStart == null ? string.length : element.selectionStart\n const end = element.selectionEnd == null ? pos : element.selectionEnd\n element.value = string.slice(0, pos) + dsep.value + string.slice(end)\n element.selectionStart = element.selectionEnd = pos + 1\n _string.value = element.value\n }\n\n // if we typed anything else, then prevent...\n return event.preventDefault()\n}\n\n/** Format a number, either for editing or viewing */\nfunction _formatNumber(number: number | null): string {\n // Nulls result in an empty string\n if (number === null) return ''\n\n // Use thousans separators when only when *NOT* editing\n return number.toLocaleString(translator.locale, {\n maximumFractionDigits: 20,\n useGrouping: ! _ztext.value?.hasFocus,\n })\n}\n\n/* Parse a number from an internationalized string */\nfunction _parseNumber(string: string): number | null {\n // Normalize our input into a JavaScript value (de: 1.234,5 becomes 1234.5)\n string = string\n .replaceAll(tsep.value, '')\n .replaceAll(dsep.value, '.')\n .replaceAll(/[^-.\\d]/g, '')\n\n // Parse the string as a float number (a single '-' is considered null) and\n // '-0' drops its sign and is considered a zero (IEE-754 has negative zero)\n return string === '' ? null : string === '-' ? null : (parseFloat(string) || 0)\n}\n\n/* When focus or language change, reformat the number */\nwatch([ () => _ztext.value?.hasFocus, () => translator.locale ], () => {\n _string.value = _formatNumber(_number.value)\n})\n\n/* Update the `modelValue` in the child text component */\nwatch(_number, (number) => {\n // When the number change, reformat *if* the numeric value changes\n if (number === _parseNumber(_string.value)) return\n _string.value = _formatNumber(number)\n})\n\n\n/* Update the `modelValue` in the parent component */\nwatch(_string, (string): void => {\n // Update our parent with the new number if we have to\n const number = _parseNumber(string)\n if (_number.value !== number) _number.value = number\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-nullable-number\n ref=\"_znumber\"\n v-bind=\"{ ...$attrs, required: false, validateNull: true }\"\n\n :model-value=\"_znumber?.isEditable ? (_number || null) : _number\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"`0${suffix}`\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :suffix=\"suffix\"\n\n :rules=\"rules\"\n :lazy-rules=\"lazyRules\"\n :minimum=\"minimum\"\n :maximum=\"maximum\"\n\n @update:model-value=\"_number = $event || 0\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-nullable-number>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZNullableNumber from './nullable-number.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\n/** Ref to our `ZNullableNumber` */\nconst _znumber = ref<InstanceType<typeof ZNullableNumber>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZNumber', inheritAttrs: false })\n\ndefineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'decimal' | 'numeric'>,\n required: false,\n default: 'decimal',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Minimum value (inclusive) */\n minimum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** Maximum value (inclusive) */\n maximum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<number>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _number = defineModel({\n type: Number as PropType<number>,\n required: false,\n default: 0,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _znumber.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _znumber.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _znumber.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _znumber.value?.hasError || false),\n})\n\n/* ===== SETUJP ============================================================= */\n\n/* Ensure the ZNullableNumber ref is set */\nonMounted(() => {\n if (! _znumber.value) throw new Error('No ZNullableNumber ref')\n /* As we use a placehoder with NULL for zero, once mounted and reactivity\n * settles down, we want to reset our validation */\n nextTick(() => _znumber.value?.resetValidation())\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n\n raw\n mode=\"text\"\n :type=\"_visible ? 'text' : 'password'\"\n\n :label=\"_label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"undefined\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n @clear=\"_value = ''\"\n >\n <template #append>\n <q-icon\n :name=\"icons.visibility[_visible ? 'off' : 'on']\"\n class=\"z-icon z-icon-clickable\"\n @click=\"_visible = ! _visible\"\n />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QIcon } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\n\nconst validators = useValidators()\nconst { t } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZString', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The minimum length of this field (starting at 1, for 0 use \"required\") */\n minLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/** Validation rules */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n if (_props.minLength > 0) rules.push(validators.minLength(_props.minLength))\n rules.push(..._props.rules)\n return rules\n})\n\n/** Label */\nconst _label = computed(() => _props.label || t({ en: 'Password', de: 'Passwort' }))\n\n/** Password visibility */\nconst _visible = ref(false)\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n\n :model-value=\"value\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n :link=\"link\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"onClear\"\n @click=\"_zdialog?.show()\"\n @click-icon=\"_zdialog?.show()\"\n >\n <template #append=\"formProps\">\n <!-- Dialog for picking -->\n <z-dialog\n ref=\"_zdialog\"\n v-model=\"_showing\"\n wide\n :title=\"label\"\n @ok=\"onOk\"\n @show=\"onShow\"\n @hide=\"onHide\"\n >\n <q-card-section>\n <slot name=\"default\" v-bind=\"formProps\" />\n </q-card-section>\n </z-dialog>\n\n <template v-if=\"_slots.append\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { QCardSection } from 'quasar'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport ZDialog from '../dialogs/dialog.vue'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZFormProps } from '../utils/form'\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _zdialog = ref<InstanceType<typeof ZDialog>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDate', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* The string value to display in the input field */\n value: {\n type: String,\n required: false,\n default: '',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: true,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n loading: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Used as `@clear=\"...\"` in a template, to clear the text (and related) */\n onClear: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n\n ...componentFormProps,\n})\n\n/** The showing state of the dialog */\nconst _showing = defineModel({\n type: Boolean,\n required: false,\n default: false,\n})\n\nconst _slots = defineSlots<{\n default?: (formProps: Readonly<ZFormProps>) => VNode[],\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\nconst emit = defineEmits<{\n (event: 'ok', value?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\nfunction onOk(value: any): void {\n emit('ok', value)\n}\n\nfunction onShow(): void {\n emit('show')\n}\n\nfunction onHide(): void {\n emit('hide')\n _ztext.value?.validate()\n}\n\nwatch(() => _props.value, () => {\n nextTick(() => _ztext.value?.validate())\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Show the picker dialog */\n show: () => _zdialog.value?.show(),\n /** Hide the picker dialog, confirming it with a value */\n confirm: (value?: any) => _zdialog.value?.confirm(value),\n /** Hide the picker dialog, cancelling it without a value */\n cancel: () => _zdialog.value?.cancel(),\n /** Hide the picker dialog */\n shake: () => _zdialog.value?.shake(),\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _zdialog.value) throw new Error('No QDialog ref')\n})\n</script>\n","<template>\n <q-chip\n dense\n class=\"q-mx-none q-px-sm text-weight-medium text-uppercase\"\n :style=\"removable ? 'padding-right: 5px;' : undefined\"\n :color=\"color\"\n :text-color=\"textColor\"\n :size=\"size\"\n :removable=\"removable\"\n @remove=\"removable && onRemove()\"\n >\n {{ tag }}\n </q-chip>\n</template>\n\n<script setup lang=\"ts\">\nimport { QChip } from 'quasar'\n\nimport type { PropType } from 'vue'\n\ndefineOptions({ name: 'ZTag' })\n\ndefineProps({\n tag: {\n type: String,\n required: true,\n },\n size: {\n type: String,\n required: false,\n default: 'sm',\n },\n color: {\n type: String,\n required: false,\n default: 'primary',\n },\n textColor: {\n type: String,\n required: false,\n default: 'white',\n },\n removable: {\n type: Boolean,\n required: false,\n default: false,\n },\n onRemove: {\n type: Function as PropType<() => void>,\n required: false,\n default: () => {},\n },\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.q-chip {\n cursor: default;\n user-select: none;\n}\n\n:deep(.q-chip__icon--remove) {\n margin-left: 4px;\n}\n</style>\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n v-slot=\"scope\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n v-model=\"_value\"\n\n dense\n outlined\n stack-label\n use-input\n use-chips\n multiple\n hide-dropdown-icon\n\n :class=\"\n scope.disabled ? 'z-state-disabled' :\n scope.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"scope.bottomSlots\"\n :disable=\"scope.disabled\"\n :readonly=\"! scope.editable\"\n\n :options=\"_options\"\n :editable=\"true\"\n :input-debounce=\"0\"\n :new-value-mode=\"noNewValues ? undefined : 'add-unique'\"\n :behavior=\"'menu'\"\n\n @add=\"_add\"\n @filter=\"_filter\"\n @keydown=\"_onKeydown\"\n >\n <template #append>\n <q-icon :name=\"icon\" class=\"z-icon\" />\n </template>\n\n <template #selected-item=\"data: Parameters<QSelectSlots['selected-item']>[0]\">\n <z-tag\n :tag=\"data.opt\"\n :removable=\"scope.editable && (! scope.disabled)\"\n class=\"q-mr-xs\"\n @remove=\"data.removeAtIndex(data.index)\"\n />\n </template>\n\n <template #option=\"option: Parameters<QSelectSlots['option']>[0]\">\n <q-item v-bind=\"option.itemProps\" dense>\n <q-item-section>\n {{ option.label }}\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemSection, QSelect } from 'quasar'\nimport { onMounted, ref, shallowRef, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport ZTag from '../tag.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType } from 'vue'\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZTags' })\n\nconst _props = defineProps({\n\n /* ===== TAGS ============================================================= */\n\n /** The array of all known tags */\n tags: {\n type: Array as PropType<string[]>,\n required: false,\n default: () => [],\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: false,\n default: 'Tags',\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.tag,\n },\n /** We don‘t accept new values, but only the existing ones (passed as tags) */\n noNewValues: {\n type: Boolean,\n required: false,\n default: false,\n },\n ...componentFormProps,\n})\n\nconst _value = defineModel({\n type: Array as PropType<string[]>,\n required: false,\n default: () => [],\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n})\n\n/* ===== STATE ============================================================== */\n\n/** List of currently filtered tags */\nconst _options = shallowRef<readonly string[]>([])\n\n/** All available tags, sorted alphabetically, lower cased */\nconst _tags = ref<string[]>([])\nwatch(() => _props.tags, (tags) => {\n _tags.value = tags.map((tag) => tag.toLowerCase()).sort()\n}, { immediate: true })\n\n/* ===== FUNCTIONS ========================================================== */\n\n/**\n * Traps \"Escape\" to hide the popup (first) and clear the value (second) or\n * \"Tab\" to autocomplete.\n *\n * Quasar tracks \"Escape\" (and resets the input value) on \"keyup\"... This\n * happens only when the popup is shown (see below) so we intercept on key\n * down, and manually close the popup / wipe the input as needed.\n * https://github.com/quasarframework/quasar/blob/7182607ecac54c406c3cce595245d1bb1160024a/ui/src/components/select/QSelect.js#L639-L644\n */\nfunction _onKeydown(event: KeyboardEvent): void {\n if (! _qselect.value) return // should never happen\n\n // no modifiers\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n\n // Handle \"Tab\" key (autocomplete)\n if (event.code === 'Tab') {\n if (! _options.value[0]) return // nothing to do\n const option = _options.value[0]\n\n if (_qselect.value.isOptionSelected(option)) return // already selected\n\n // select the first option on \"Tab\" and stop/prevent default on the event\n // as we want the user to potentially select multiple tags...\n _qselect.value.toggleOption(_options.value[0], false)\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n // Handle \"Escape\" key (close popup / clear value)\n if (event.code === 'Escape') {\n // if we have options, clear them and hide the popup\n if (_options.value.length > 0) {\n _options.value = []\n // if we have no options, clear the input\n } else {\n _qselect.value.updateInputValue('', true)\n }\n // regardless...\n _qselect.value.hidePopup()\n event.preventDefault()\n event.stopPropagation()\n }\n}\n\n/** Filters the tags according tu the current input */\nfunction _filter(\n text: string,\n update: (filter: () => void, after?: (ref: QSelect) => void) => void,\n _abort: () => void,\n): void {\n update(() => {\n // ran when the input changes: we filter all tags that match the input\n if (text.length < 1) return _options.value = Object.freeze([])\n\n const needle = text.toLowerCase() // _tags array is lower cased\n const options = _tags.value\n .filter((val) => val.indexOf(needle) >= 0) // anything matching text\n .filter((val) => _value.value.indexOf(val) < 0) // not already tagged\n _options.value = Object.freeze(options)\n }, (select) => {\n // ran when quasar updates the options: we focus on the first one\n if (text && select.options?.length) {\n select.setOptionIndex(-1) // i still don't understand precisely how it works\n select.moveOptionSelection(1, false) // but this focuses on the first option\n }\n })\n}\n\n/** When a new tag is added, we clear the input for the next tag */\nfunction _add(_: { index: number, value: string }): void {\n _qselect.value?.updateInputValue('')\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n})\n</script>\n","import { ISO_COUNTRIES } from '@juit/vue-i18n'\n\nimport type { ISOCountry } from '@juit/vue-i18n'\n\n// Data from https://en.wikipedia.org/wiki/List_of_telephone_country_codes\n\n/** All known ITU prefixes keyed by ISO country */\nexport const ituPrefixesByCountry = {\n AD: [ '376' ],\n AE: [ '971' ],\n AF: [ '93' ],\n AG: [ '1268' ],\n AI: [ '1264' ],\n AL: [ '355' ],\n AM: [ '374' ],\n AO: [ '244' ],\n AQ: [ '672' ],\n AR: [ '54' ],\n AS: [ '1684' ],\n AT: [ '43' ],\n AU: [ '61' ],\n AW: [ '297' ],\n AX: [ '358' ],\n AZ: [ '994' ],\n BA: [ '387' ],\n BB: [ '1246' ],\n BD: [ '880' ],\n BE: [ '32' ],\n BF: [ '226' ],\n BG: [ '359' ],\n BH: [ '973' ],\n BI: [ '257' ],\n BJ: [ '229' ],\n BL: [ '590' ],\n BM: [ '1441' ],\n BN: [ '673' ],\n BO: [ '591' ],\n BQ: [ '599' ],\n BR: [ '55' ],\n BS: [ '1242' ],\n BT: [ '975' ],\n BV: [ '47' ],\n BW: [ '267' ],\n BY: [ '375' ],\n BZ: [ '501' ],\n CA: [ '1' ],\n CC: [ '61' ],\n CD: [ '243' ],\n CF: [ '236' ],\n CG: [ '242' ],\n CH: [ '41' ],\n CI: [ '225' ],\n CK: [ '682' ],\n CL: [ '56' ],\n CM: [ '237' ],\n CN: [ '86' ],\n CO: [ '57' ],\n CR: [ '506' ],\n CU: [ '53' ],\n CV: [ '238' ],\n CW: [ '599' ],\n CX: [ '61' ],\n CY: [ '357' ],\n CZ: [ '420' ],\n DE: [ '49' ],\n DJ: [ '253' ],\n DK: [ '45' ],\n DM: [ '1767' ],\n DO: [ '1809', '1829', '1849' ],\n DZ: [ '213' ],\n EC: [ '593' ],\n EE: [ '372' ],\n EG: [ '20' ],\n EH: [ '212' ],\n ER: [ '291' ],\n ES: [ '34' ],\n ET: [ '251' ],\n FI: [ '358' ],\n FJ: [ '679' ],\n FK: [ '500' ],\n FM: [ '691' ],\n FO: [ '298' ],\n FR: [ '33' ],\n GA: [ '241' ],\n GB: [ '44' ],\n GD: [ '1473' ],\n GE: [ '995' ],\n GF: [ '594' ],\n GG: [ '44' ],\n GH: [ '233' ],\n GI: [ '350' ],\n GL: [ '299' ],\n GM: [ '220' ],\n GN: [ '224' ],\n GP: [ '590' ],\n GQ: [ '240' ],\n GR: [ '30' ],\n GS: [ '500' ],\n GT: [ '502' ],\n GU: [ '1671' ],\n GW: [ '245' ],\n GY: [ '592' ],\n HK: [ '852' ],\n HM: [ '672' ],\n HN: [ '504' ],\n HR: [ '385' ],\n HT: [ '509' ],\n HU: [ '36' ],\n ID: [ '62' ],\n IE: [ '353' ],\n IL: [ '972' ],\n IM: [ '44' ],\n IN: [ '91' ],\n IO: [ '246' ],\n IQ: [ '964' ],\n IR: [ '98' ],\n IS: [ '354' ],\n IT: [ '39' ],\n JE: [ '44' ],\n JM: [ '1658', '1876' ],\n JO: [ '962' ],\n JP: [ '81' ],\n KE: [ '254' ],\n KG: [ '996' ],\n KH: [ '855' ],\n KI: [ '686' ],\n KM: [ '269' ],\n KN: [ '1869' ],\n KP: [ '850' ],\n KR: [ '82' ],\n KW: [ '965' ],\n KY: [ '1345' ],\n KZ: [ '70', '76', '77' ],\n LA: [ '856' ],\n LB: [ '961' ],\n LC: [ '1758' ],\n LI: [ '423' ],\n LK: [ '94' ],\n LR: [ '231' ],\n LS: [ '266' ],\n LT: [ '370' ],\n LU: [ '352' ],\n LV: [ '371' ],\n LY: [ '218' ],\n MA: [ '212' ],\n MC: [ '377' ],\n MD: [ '373' ],\n ME: [ '382' ],\n MF: [ '590' ],\n MG: [ '261' ],\n MH: [ '692' ],\n MK: [ '389' ],\n ML: [ '223' ],\n MM: [ '95' ],\n MN: [ '976' ],\n MO: [ '853' ],\n MP: [ '1670' ],\n MQ: [ '596' ],\n MR: [ '222' ],\n MS: [ '1664' ],\n MT: [ '356' ],\n MU: [ '230' ],\n MV: [ '960' ],\n MW: [ '265' ],\n MX: [ '52' ],\n MY: [ '60' ],\n MZ: [ '258' ],\n NA: [ '264' ],\n NC: [ '687' ],\n NE: [ '227' ],\n NF: [ '672' ],\n NG: [ '234' ],\n NI: [ '505' ],\n NL: [ '31' ],\n NO: [ '47' ],\n NP: [ '977' ],\n NR: [ '674' ],\n NU: [ '683' ],\n NZ: [ '64' ],\n OM: [ '968' ],\n PA: [ '507' ],\n PE: [ '51' ],\n PF: [ '689' ],\n PG: [ '675' ],\n PH: [ '63' ],\n PK: [ '92' ],\n PL: [ '48' ],\n PM: [ '508' ],\n PN: [ '64' ],\n PR: [ '1787', '1939' ],\n PS: [ '970', '972' ],\n PT: [ '351' ],\n PW: [ '680' ],\n PY: [ '595' ],\n QA: [ '974' ],\n RE: [ '262' ],\n RO: [ '40' ],\n RS: [ '381' ],\n RU: [ '7', '71', '72', '73', '74', '75', '78', '79' ],\n RW: [ '250' ],\n SA: [ '966' ],\n SB: [ '677' ],\n SC: [ '248' ],\n SD: [ '249' ],\n SE: [ '46' ],\n SG: [ '65' ],\n SH: [ '247', '290' ],\n SI: [ '386' ],\n SJ: [ '47' ],\n SK: [ '421' ],\n SL: [ '232' ],\n SM: [ '378' ],\n SN: [ '221' ],\n SO: [ '252' ],\n SR: [ '597' ],\n SS: [ '211' ],\n ST: [ '239' ],\n SV: [ '503' ],\n SX: [ '1721' ],\n SY: [ '963' ],\n SZ: [ '268' ],\n TC: [ '1649' ],\n TD: [ '235' ],\n TF: [ '262' ],\n TG: [ '228' ],\n TH: [ '66' ],\n TJ: [ '992' ],\n TK: [ '690' ],\n TL: [ '670' ],\n TM: [ '993' ],\n TN: [ '216' ],\n TO: [ '676' ],\n TR: [ '90' ],\n TT: [ '1868' ],\n TV: [ '688' ],\n TW: [ '886' ],\n TZ: [ '255' ],\n UA: [ '380' ],\n UG: [ '256' ],\n UM: [ '1' ],\n US: [ '1' ],\n UY: [ '598' ],\n UZ: [ '998' ],\n VA: [ '39', '379' ],\n VC: [ '1784' ],\n VE: [ '58' ],\n VG: [ '1284' ],\n VI: [ '1340' ],\n VN: [ '84' ],\n VU: [ '678' ],\n WF: [ '681' ],\n WS: [ '685' ],\n XK: [ '383' ],\n YE: [ '967' ],\n YT: [ '262' ],\n ZA: [ '27' ],\n ZM: [ '260' ],\n ZW: [ '263' ],\n} as const satisfies Record<ISOCountry, `${number}`[]>\n\n/** Known ISO countries keyed by ITU prefixe. */\nexport const countriesByITUPrefix: Record<ITUPrefix, [ ISOCountry, ...ISOCountry[] ]> =\n Object.entries(ituPrefixesByCountry).reduce((map, [ key, prefixes ]) => {\n // Check that we have a proper ISO country\n const country = ISO_COUNTRIES.find((country) => country === key)\n if (! country) return map\n\n // Add the prefixes to the map\n prefixes.forEach((prefix) => {\n if (! map[prefix]) map[prefix] = [ country ]\n else map[prefix].push(country)\n })\n\n // Ok, all mapped and normalized\n return map\n }, {} as typeof countriesByITUPrefix)\n\n/** All known ITU international prefixes */\nexport type ITUPrefix = typeof ituPrefixesByCountry[ISOCountry][number]\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_input\"\n type=\"text\"\n mode=\"tel\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n :prefix=\"_flag\"\n\n @beforeinput=\"_onBeforeinput\"\n @clear=\"() => _value = ''\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ISO_COUNTRIES, useTranslator } from '@juit/vue-i18n'\nimport { computed, nextTick, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\n\nimport { countriesByITUPrefix, ituPrefixesByCountry } from '../assets/prefixes'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { ISOCountry } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\nimport type { ITUPrefix } from '../assets/prefixes'\nimport type { ZValidator } from '../composition/validators'\n\n/** Describes a vaild, checked ITU phone prefix */\ninterface PhonePrefix {\n /** The current country (if properly validated) as an ISO code */\n country: ISOCountry\n /** The countries associated with the current prefix */\n countries: [ ISOCountry, ...ISOCountry[]]\n /** The current country prefix (if properly validated) as an ITU code */\n prefix: ITUPrefix\n}\n\n/** Describe a phone number, parsed in parts */\ninterface PhoneParts {\n /** The current country (if properly validated) as an ISO code */\n country: ISOCountry | ''\n /** The countries associated with the current prefix */\n countries: ISOCountry[]\n /** The current country prefix (if properly validated) as an ITU code */\n prefix: ITUPrefix | ''\n /** The regional number (that is digits without the country prefix) */\n number: string\n /** The normalized number as `+{prefix}{number}` even if invalud */\n normalized: string\n /** A flag indicating if this is a valid number */\n valid: boolean,\n}\n\nconst { t, utils } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZTelephone', inheritAttrs: false })\n\nconst _props = defineProps({\n /** The country the telephone number belongs to */\n country: {\n type: String as PropType<string>,\n required: false,\n default: 'DE',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/* ===== MODEL ============================================================== */\n\n/** The value of the input, the full number *with* the prefix */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* ===== UTILITIES ========================================================== */\n\n/* Check that the prefix is valid, returning the country and the prefix */\nfunction _checkPrefix(string: string): PhonePrefix | undefined {\n if (! string) return undefined // no match...\n\n // Maximum length of an ITU prefix is 4 digits\n if (string.length > 4) string = string.slice(0, 4)\n\n // Check if the prefix is in our list of prefixes\n if (string in countriesByITUPrefix) {\n const prefix = string as ITUPrefix\n const countries = countriesByITUPrefix[prefix]\n // if the prefix has our default \"prop\" country, we return that, otherwise the first\n const country = countries.find((country) => country === _isoCountry.value)\n return { country: country || countries[0], countries, prefix }\n }\n\n // Recursively proceed with a shorter prefix\n return _checkPrefix(string.slice(0, -1))\n}\n\n/* Check that the number is valid, returning country, prefix and normalized number */\nfunction _checkNumber(value: string = ''): PhoneParts {\n // Normalize the number, keeping only digits\n value = value.replace(/[^\\d]/g, '')\n\n // Check if we have a valid prefix\n const phonePrefix = _checkPrefix(value)\n\n // Return the parts: a \"valid\" number has a regional part of at least\n // six digits (this is an arbirary value, but works for most countries)\n return phonePrefix ? {\n countries: phonePrefix.countries,\n country: phonePrefix.country,\n prefix: phonePrefix.prefix,\n number: value.slice(phonePrefix.prefix.length),\n normalized: `+${value}`,\n valid: value.length >= phonePrefix.prefix.length + 6,\n } : {\n countries: [],\n country: '',\n prefix: '',\n number: value,\n normalized: value ? `+${value}` : '',\n valid: false,\n }\n}\n\n/** Format the \"parts\" separating any valid prefix from the number */\nfunction _formatParts(parts: PhoneParts): string {\n return (parts.prefix && parts.number) ? `+${parts.prefix} ${parts.number}` :\n parts.prefix ? `+${parts.prefix}` :\n parts.number ? `+${parts.number}` :\n ''\n}\n\n/* ===== STATE ============================================================== */\n\n/** Computed property ensuring that the country is a valid ISO country */\nconst _isoCountry = computed<ISOCountry>(() => {\n const country = ISO_COUNTRIES.find((country) => country === _props.country)\n return country || 'DE' // our default country is Germany\n})\n\n/** The flag, computed by the current country (validated) */\nconst _flag = computed(() => {\n if (_parts.value.country) return utils.flag(_parts.value.country)\n return '\\u{1F3F4}\\u200D\\u2620\\uFE0F' // Arrr! That be a bust!\n})\n\n/** The parsed phone number parts, initially from the input value */\nconst _parts = shallowRef<PhoneParts>(_checkNumber(_value.value))\n/** The input value, as displayed in our text box */\nconst _input = ref<string>(_formatParts(_parts.value))\n\n/* ===== WATCHERS =========================================================== */\n\n/* When the country prop changes, we update the number if empty */\nwatch(_isoCountry, (country) => {\n // If this is a simple change of country on the same prefix, update the\n // country in-place and manually trigger the ref to update the flag\n if (_parts.value.countries.includes(country)) {\n _parts.value.country = country\n triggerRef(_parts)\n return\n }\n\n // If we already have a number, then we don't change the country\n if (_parts.value.number) return\n\n // Get the prefix, and update the parts\n const prefix = ituPrefixesByCountry[_isoCountry.value][0]\n _parts.value = _checkNumber(prefix)\n _input.value = _formatParts(_parts.value)\n}, { immediate: true })\n\n/* Watch when the model value changes */\nwatch(_value, (value) => {\n const parts = _checkNumber(value)\n if (parts.normalized === _parts.value.normalized) return // no changes\n _input.value = _formatParts(parts)\n _parts.value = parts\n})\n\n/* Watch when the input value changes */\nwatch(_input, (input) => {\n // If the input was fully cleared, we reset to the default country\n if (input.trim() === '') {\n return nextTick(() => {\n const prefix = ituPrefixesByCountry[_isoCountry.value][0]\n _parts.value = _checkNumber(prefix)\n _input.value = _formatParts(_parts.value)\n })\n }\n\n // If we have _some_ input, and that's is not a valid phone number \"+digits\"\n // we re-format it in the next tick (so that quasar has time to update the\n // input). We'll get called back again with the new \"clean\" value...\n if (input) {\n const clean = '+' + input\n .replace(/[^\\d\\s]/g, ' ') // wipe all non-space non-digit\n .replace(/\\s+/g, ' ') // normalize all spaces to ONE space\n .trim() // remove leading and trailing spaces\n\n // Call us back again with the cleaned input in the next tick...\n if (input !== clean) return nextTick(() => _input.value = clean)\n }\n\n const parts = _checkNumber(input)\n if (parts.normalized === _parts.value.normalized) return // no changes\n _value.value = parts.normalized\n _parts.value = parts\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** Validation rules */\nconst _rules: ZValidator<string>[] = [ () => {\n // As we're mangling the text, we need to validate against the current\n // state (henceforth, the current \"value\", not the input)\n const value = _value.value\n\n // Check if required....\n if (_props.required && (!value)) {\n return t({\n en: 'This field is required',\n de: 'Dieses Feld ist erforderlich',\n })\n\n // When not required, the empty value is a good value\n } else if (! value) {\n return true\n }\n\n // Check the parts and the validity of our number\n if (! _checkNumber(value).valid) {\n return t({\n en: 'Invalid phone number',\n de: 'Ungültige Telefonnummer',\n })\n }\n\n // Run all other configured validators\n for (const validator of (_props.rules || [])) {\n const result = validator(value)\n if (result !== true) return result\n }\n\n // All is good\n return true\n} ]\n\n/* ===== AUTOFILL =========================================================== */\n\nfunction _onBeforeinput(event: InputEvent): void {\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n // the \"insertText\" event is when we _type_ something, only numbers plus and space\n if (event.data?.match(/^[0-9+ ]$/)) return\n // something else but text\n event.preventDefault()\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\nonMounted(() => {\n /* Ensure the ZText ref is set */\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <div class=\"row reverse q-col-gutter-sm justify-between q-py-lg\">\n <!-- ===== MAIN CONTENT COLUMN ========================================= -->\n\n <div v-if=\"slots['default']\" class=\"col-grow text-right self-center\">\n <slot name=\"default\" />\n </div>\n\n <!-- ===== TITLE (label) and SUBTITLE (caption) ======================== -->\n\n <div class=\"col-grow self-center text-left\">\n <div class=\"text-h4 heading\">\n <span v-if=\"label\">{{ label }}</span>\n <slot v-else-if=\"slots.label\" name=\"label\" />\n <span v-else>{{ '\\u2026' }}</span>\n </div>\n <div v-if=\"caption || slots.caption\" class=\"heading\">\n <span v-if=\"caption\">{{ caption }}</span>\n <slot v-else-if=\"slots.caption\" name=\"caption\" />\n </div>\n <div v-if=\"slots.info\" class=\"q-mt-md\">\n <slot name=\"info\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, warn } from 'vue'\n\nimport type { VNode } from 'vue'\n\ndefineOptions({ name: 'ZObjectHeader' })\n\nconst props = defineProps({\n label: {\n type: String,\n required: false,\n default: '',\n },\n caption: {\n type: String,\n required: false,\n default: '',\n },\n})\n\nconst slots = defineSlots<{\n default(): VNode[],\n caption?: () => VNode[],\n label?: () => VNode[],\n info?: () => VNode[],\n}>()\n\nonMounted(() => {\n if (props.label || slots.label) return\n warn('The \"label\" prop or slot must be specified')\n})\n</script>\n\n<style scoped lang=\"postcss\">\n.heading {\n text-transform: uppercase;\n font-weight: 600;\n}\n</style>\n","<template>\n <div>\n <j-page-header :label=\"label\" :caption=\"caption\">\n <template v-if=\"_slots.label\" #label>\n <slot name=\"label\" />\n </template>\n <template v-if=\"_slots.caption\" #caption>\n <slot name=\"caption\" />\n </template>\n\n <z-btn-group>\n <!-- Cancel -->\n <z-btn\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.cancel\"\n :label=\"$t(translations.cancel)\"\n @click=\"_cancel\"\n />\n\n <!-- Save -->\n <z-btn\n shrink=\"xs\"\n color=\"positive\"\n :disable=\"disabled || (!_submittable)\"\n :icon=\"icons.confirm\"\n :label=\"$t(translations.save)\"\n @click=\"_submit\"\n />\n </z-btn-group>\n </j-page-header>\n\n <z-form\n ref=\"_form\"\n class=\"row q-col-gutter-md\"\n bottom-slots\n editable\n :disabled=\"disabled\"\n @submit.prevent.stop=\"_submit\"\n >\n <slot name=\"default\" />\n </z-form>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { is } from 'quasar'\nimport { computed, ref, toRaw } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport ZForm from '../forms/form.vue'\nimport JPageHeader from './object-header.vue'\n\nimport type { PropType, VNode } from 'vue'\n\n/* ===== NAME, PROPS, SLOTS & EMITS ========================================= */\n\ndefineOptions({ name: 'JObjectNew' })\n\nconst _props = defineProps({\n /** The object being created */\n value: {\n type: Object as PropType<Record<string, any> | undefined>,\n required: true,\n },\n /** Label for the page title (optional, see also the `label` slot) */\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Caption for the page title (optional, see also the `caption` slot) */\n caption: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Disable all controls */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n})\n\nconst _slots = defineSlots<{\n /** The components of the form for the object being viewed/edited */\n default: () => VNode[]\n /** Label for the page title (optional, see also the `label` prop) */\n label?: () => VNode[],\n /** Caption for the page title (optional, see also the `caption` prop) */\n caption?: () => VNode[],\n}>()\n\nconst _emit = defineEmits<{\n /** Tell the parent component to save the object */\n (emit: 'save'): void\n /** Tell the parent component to cancel */\n (emit: 'cancel'): void\n}>()\n\n/* ===== STATE ============================================================== */\n\n/** Backup of the `modelValue` to check for differences */\nconst _backup = structuredClone(toRaw(_props.value))\n/** Reference to our form for validation */\nconst _form = ref<InstanceType<typeof ZForm> | undefined>()\n\n/** Flag indicating whether the object has been modified or not */\nconst _modified = computed(() => ! is.deepEqual(_props.value, _backup))\n/** Flag indicating whether edits can be submitted back to the server */\nconst _submittable = computed(() => _modified.value && _form.value?.isReady)\n\n/* ===== ACTIONS ============================================================ */\n\n/** Cancel and discard changes */\nfunction _cancel(): void {\n _emit('cancel')\n}\n\n/** Validate, and if valid emit our \"save\" event */\nasync function _submit(): Promise<void> {\n if (! _submittable.value) return\n const valid = await _form.value?.validate()\n if (valid) _emit('save')\n}\n</script>\n","import { useTranslator } from '@juit/vue-i18n'\nimport { useQuasar } from 'quasar'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport JConfirmDialog from '../dialogs/confirm.vue'\nimport JProgressDialog from '../dialogs/progress.vue'\n\n/** Our dialogs */\nexport interface ZDialogs {\n /**\n * Very basic confirm/cancel dialog with a title and a message.\n *\n * @returns - `true` on confirm/ok, `false` on cancel\n */\n confirm(options: {\n title: string,\n message: string,\n confirm?: string,\n confirmIcon?: string,\n confirmColor?: string,\n cancel?: string,\n cancelIcon?: string,\n cancelColor?: string,\n }): Promise<boolean>\n\n /** Confirm whether to discard changes or not */\n confirmDiscard(): Promise<boolean>\n\n /** Confirm whether to delete a record or not */\n confirmDelete(): Promise<boolean>\n\n /** Confirm whether to restore a record or not */\n confirmRestore(): Promise<boolean>\n\n /**\n * Show a progress dialog with a title and a message.\n *\n * When `total` is set, the `progress` prop should be a number between zero\n * and `total - 1`, and progress is shown `progress / total`.\n *\n * When `total` is not set (or zero) the `progress` prop should be a number\n * between zero and 1 and the progress will be shown as a percentage.\n *\n * When the `onCancel` callback (optional) is specified, a cancel button is\n * added to the dialog, and pressing it will invoke the callback. It's up to\n * the caller to handle the cancellation.\n *\n * The returned object has two methods:\n *\n * - `update(progress: number)`: update the `progress` prop\n * - `done()`: close the dialog (must be called, the dialog won't close itself)\n */\n progress(options: {\n title: string,\n message: string,\n progress?: number,\n total?: number,\n onCancel?: () => void,\n }): { update: (progress: number) => void, done: () => void }\n}\n\nexport function useDialogs(): ZDialogs {\n const { t } = useTranslator()\n const { dialog } = useQuasar()\n\n function confirm(options: {\n title: string,\n message: string,\n confirm?: string,\n confirmIcon?: string,\n confirmColor?: string,\n cancel?: string,\n cancelIcon?: string,\n cancelColor?: string,\n }): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const instance = dialog({\n component: JConfirmDialog,\n componentProps: { ...options },\n })\n instance.onOk(() => resolve(true))\n instance.onCancel(() => resolve(false))\n })\n }\n\n function confirmDiscard(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Discard changes?',\n de: 'Änderungen verwerfen?',\n }),\n message: t({\n en: 'Are you sure you want to discard your changes?',\n de: 'Möchten Sie Ihre Änderungen wirklich verwerfen?',\n }),\n confirm: t(translations.discard),\n confirmIcon: icons.delete,\n confirmColor: 'negative',\n\n cancel: t(translations.keep),\n cancelIcon: icons.edit,\n cancelColor: 'primary',\n })\n }\n\n function confirmDelete(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Delete',\n de: 'Löschen',\n }),\n message: t({\n en: 'Are you sure you want to delete this record?',\n de: 'Möchten Sie diesen Datensatz wirklich löschen?',\n }),\n\n confirm: t(translations.delete),\n confirmIcon: icons.delete,\n confirmColor: 'negative',\n\n cancel: t(translations.keep),\n cancelIcon: icons.confirm,\n cancelColor: 'primary',\n })\n }\n\n function confirmRestore(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Restore',\n de: 'Wiederherstellen',\n }),\n message: t({\n en: 'Are you sure you want to restore this record?',\n de: 'Möchten Sie diesen Datensatz wirklich wiederherstellen?',\n }),\n\n confirm: t(translations.restore),\n confirmIcon: icons.restore,\n confirmColor: 'warning',\n\n cancel: t(translations.ignore),\n cancelIcon: icons.cancel,\n cancelColor: 'primary',\n })\n }\n\n function progress(options: {\n title: string,\n message: string,\n progress?: number,\n total?: number,\n onCancel?: () => void,\n }): { update: (progress: number) => void, done: () => void } {\n const instance = dialog({\n component: JProgressDialog,\n componentProps: {\n title: options.title,\n message: options.message,\n progress: options.progress || 0,\n total: options.total || 0,\n onCancel: options.onCancel,\n },\n })\n\n return {\n update: (progress: number) => instance.update({ progress }),\n done: () => instance.hide(),\n }\n }\n\n return { confirm, confirmDiscard, confirmDelete, confirmRestore, progress }\n}\n","import { shallowRef } from 'vue'\n\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZBaseObject } from '../types'\n\nconst listicle = shallowRef<{\n uuids: string[],\n list: RouteLocationRaw,\n link: (uuid: string) => RouteLocationRaw,\n}>()\n\nexport interface ZListicle {\n offset: number;\n length: number;\n list: RouteLocationRaw;\n prev?: RouteLocationRaw;\n next?: RouteLocationRaw;\n}\n\nexport function setListicle(\n objects: (ZBaseObject | string)[],\n location: RouteLocationRaw,\n link: (uuid: string) => RouteLocationRaw,\n): void {\n const list = typeof location === 'string' ? location : { ...location }\n const uuids = objects.map((v) => typeof v === 'string' ? v : v.uuid)\n listicle.value = { link, list, uuids }\n}\n\nexport function getListicle(uuid: string): ZListicle | undefined {\n if (! listicle.value) return undefined\n const { uuids, link, list } = listicle.value\n\n const offset = uuids.indexOf(uuid)\n if (offset === -1) return undefined\n\n const prev = uuids[offset - 1]\n const next = uuids[offset + 1]\n\n return {\n list,\n offset,\n length: uuids.length,\n prev: prev && link(prev),\n next: next && link(next),\n }\n}\n","<template>\n <div>\n <!-- list -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n icon=\"sym_r_list\"\n :to=\"listicle.list\"\n />\n\n <!-- page number -->\n <span class=\"q-px-sm text-no-wrap non-selectable\">\n {{ $n(listicle.offset + 1) }}\n {{ $t({ en: ' of {n}', de: ' von {n}' }, { n: $n(listicle.length) }) }}\n </span>\n\n <!-- previous page -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n :icon=\"icons.pagination.previous\"\n :disable=\"!listicle.prev\"\n :to=\"listicle.prev\"\n />\n\n <!-- next page -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n :icon=\"icons.pagination.next\"\n :disable=\"!listicle.next\"\n :to=\"listicle.next\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZListicle } from '../utils/listicle'\n\ndefineProps({\n listicle: {\n type: Object as PropType<ZListicle>,\n required: true,\n },\n})\n</script>\n","<template>\n <div>\n <z-object-header :label=\"label\" :caption=\"caption\">\n <template v-if=\"_slots.label\" #label>\n <slot name=\"label\" />\n </template>\n\n <template v-if=\"_slots.caption\" #caption>\n <slot name=\"caption\" />\n </template>\n\n <!-- button to hide or show the data -->\n <template #info>\n <q-icon\n name=\"sym_r_info\"\n class=\"cursor-pointer\"\n size=\"sm\"\n @click=\"_showData = !_showData\"\n />\n <q-icon\n name=\"sym_r_error_med\"\n class=\"cursor-pointer\"\n size=\"sm\"\n @click=\"_showJson = !_showJson\"\n />\n\n <!-- extra info buttons -->\n <slot name=\"more-info\" />\n </template>\n\n <!-- === BUTTONS WHEN EDITING ======================================== -->\n <div class=\"row q-gutter-sm justify-end\">\n <!-- === EXTRA CONTROLS BEFORE THE MAIN ONES ======================= -->\n\n <div v-if=\"_slots['controls-before']\" class=\"col-shrink text-no-wrap\">\n <slot name=\"controls-before\" />\n </div>\n\n <!-- === MAIN CONTROLS ============================================= -->\n <div class=\"col-shrink text-no-wrap\">\n <z-btn-group v-if=\"_editing\">\n <!-- Cancel -->\n <z-btn\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.cancel\"\n :label=\"$t(translations.cancel)\"\n @click=\"_cancel\"\n />\n\n <!-- Save -->\n <z-btn\n v-if=\"onSave\"\n shrink=\"xs\"\n color=\"positive\"\n :disable=\"disabled || (!_submittable)\"\n :icon=\"icons.confirm\"\n :label=\"$t(translations.save)\"\n @click=\"_submit\"\n />\n </z-btn-group>\n\n <!-- === BUTTONS WHEN DELETED ==================================== -->\n\n <!-- Restore -->\n <z-btn\n v-else-if=\"_value.deleted && onRestore\"\n shrink=\"xs\"\n color=\"warning\"\n :disable=\"disabled\"\n :icon=\"icons.restore\"\n :label=\"$t(translations.restore)\"\n @click=\"_restore\"\n />\n\n <!-- === BUTTONS WHEN VIEWING ==================================== -->\n\n <z-btn-group v-else>\n <!-- Delete -->\n <z-btn\n v-if=\"(! _value.deleted) && onDelete\"\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.delete\"\n :label=\"$t(translations.delete)\"\n @click=\"_delete\"\n />\n\n <!-- Extra Button (passed from parent component) -->\n <slot v-if=\"_slots.buttons\" name=\"buttons\" />\n\n <!-- Edit -->\n <z-btn\n v-if=\"onSave\"\n shrink=\"xs\"\n color=\"warning\"\n :disable=\"disabled\"\n :icon=\"icons.edit\"\n :label=\"$t(translations.edit)\"\n @click=\"_edit\"\n />\n </z-btn-group>\n </div>\n\n <!-- === EXTRA CONTROLS AFTER THE MAIN ONES ======================== -->\n <div v-if=\"_slots['controls-after']\" class=\"col-shrink text-no-wrap\">\n <slot name=\"controls-after\" />\n </div>\n </div>\n\n <!-- === EXTRA CONTROLS UNDER THE MAIN ONES ========================== -->\n <div v-if=\"_slots['controls-under']\" class=\"row q-gutter-sm q-mt-sm justify-end\">\n <div class=\"col-shrink\" style=\"flex-basis: 75%\">\n <slot name=\"controls-under\" />\n </div>\n </div>\n\n <!-- === LISTICLE UNDER ALL CONTROLS ================================= -->\n <z-listicle v-if=\"_listicle\" class=\"row justify-end q-mt-sm\" :listicle=\"_listicle\" />\n </z-object-header>\n\n <!-- ===== DIALOGS ===================================================== -->\n\n <!-- dialog to show the JSON content -->\n <z-dialog\n v-model=\"_showJson\"\n title=\"JSON\"\n full-width\n full-height\n >\n <q-card-section class=\"json-scroll\">\n <pre>{{ JSON.stringify(_value, null, 2) }}</pre>\n </q-card-section>\n </z-dialog>\n\n <!-- object information (hidden by default) -->\n <z-dialog\n v-model=\"_showData\"\n title=\"Info\"\n >\n <q-card-section>\n <z-label\n minimal\n icon=\"sym_r_tag\"\n :label=\"$t(translations['object.uuid'])\"\n :value=\"_value.uuid.toUpperCase()\"\n />\n <z-label\n minimal\n icon=\"sym_r_event_available\"\n :label=\"$t(translations['object.created'])\"\n :value=\"$d(_value.created, 'long')\"\n />\n <z-label\n minimal\n icon=\"sym_r_event_note\"\n :label=\"$t(translations['object.modified'])\"\n :value=\"$d(_value.modified, 'long')\"\n />\n <z-label\n v-if=\"_value.deleted\"\n minimal\n icon=\"sym_r_event_busy\"\n :label=\"$t(translations['object.deleted'])\"\n :value=\"$d(_value.deleted, 'long')\"\n />\n </q-card-section>\n </z-dialog>\n\n\n <!-- ===== FORM FIELDS ================================================= -->\n\n <z-form\n ref=\"_form\"\n class=\"row q-col-gutter-md\"\n bottom-slots\n :greedy=\"greedy\"\n :editable=\"_editing\"\n :disabled=\"disabled || loading\"\n @submit.prevent.stop=\"_submit\"\n >\n <slot name=\"default\" />\n </z-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { is, QCardSection, QIcon } from 'quasar'\nimport { computed, ref, toRaw, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport { useDialogs } from '../composition/dialogs'\nimport ZDialog from '../dialogs/dialog.vue'\nimport ZForm from '../forms/form.vue'\nimport ZLabel from '../inputs/label.vue'\nimport { getListicle } from '../utils/listicle'\nimport { createLoader } from '../utils/loader'\nimport ZListicle from './listicle.vue'\nimport ZObjectHeader from './object-header.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZBaseObject } from '../types'\n\nconst { confirmDelete, confirmDiscard, confirmRestore } = useDialogs()\n\n/* ===== NAME, PROPS, SLOTS & EMITS ========================================= */\n\ndefineOptions({ name: 'ZObject' })\n\nconst _props = defineProps({\n /** Label for the page title (optional, see also the `label` slot) */\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Caption for the page title (optional, see also the `caption` slot) */\n caption: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Disable all controls */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Enable \"greedy\" form validation */\n greedy: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== CUSTOMIZATIONS =================================================== */\n\n /**\n * Used as `@save=\"...\"` in templates, saves an object.\n *\n * When this is not set, the _editability_ state is not managed (that is, the\n * \"edit\" and \"save\" buttons will not be shown) and the parent component must\n * manage editability itself.\n */\n onSave: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@delete=\"...\"` in templates, deletes an object */\n onDelete: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@restore=\"...\"` in templates, restores an object */\n onRestore: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n})\n\n/** The value of the object that will be edited, to check for modifications */\nconst _value = defineModel({\n type: Object as PropType<ZBaseObject>,\n required: true,\n})\n\n/** The editing state */\nconst _editing = defineModel('edit', {\n type: Boolean,\n required: false,\n default: false,\n})\n\nconst _slots = defineSlots<{\n /** The components of the form for the object being viewed/edited */\n 'default': () => VNode[]\n /** Label for the page title (optional, see also the `label` prop) */\n 'label'?: () => VNode[],\n /** Caption for the page title (optional, see also the `caption` prop) */\n 'caption'?: () => VNode[],\n /** Extra buttons to add when not editing */\n 'buttons'?: () => VNode[],\n /** Additional content for the info section */\n 'more-info'?: () => VNode[],\n /** Extra controls to add before the main ones */\n 'controls-before'?: () => VNode[],\n /** Extra controls to add after the main ones */\n 'controls-after'?: () => VNode[],\n /** Extra controls to add under the main ones */\n 'controls-under'?: () => VNode[],\n}>()\n\n/* ===== STATE ============================================================ */\n\n/** The backup copy of our object to check for difference/restore */\nlet _backup: ZBaseObject | undefined = undefined\n/** Reference to our form for validation */\nconst _form = ref<InstanceType<typeof ZForm> | undefined>()\n\n/** Flag indicating whether the object has been modified or not */\nconst _modified = computed(() => _editing.value && (! is.deepEqual(_value.value, _backup)))\n/** Flag indicating that all *required* components have been filled */\nconst _ready = computed(() => _form.value?.isReady)\n/** Flag indicating whether edits can be submitted back to the server */\nconst _submittable = computed(() => _modified.value && _ready)\n\n/** Flag indicating whether we show or hide the fix input fields (uuid, created on...) */\nconst _showData = ref(false)\n/** Flag indicating whether we show or hide the JSON source dialog */\nconst _showJson = ref(false)\n\n/** The listicle, if associated with this object's UUID */\nconst _listicle = computed(() => getListicle(_value.value.uuid))\n\n/* Changes to editability trigger value backup (can be triggered from outside) */\nwatch(_editing, (editing) => {\n if (editing) _backup = structuredClone(toRaw(_value.value))\n else _backup = undefined\n}, { immediate: true })\n\n/* ===== ACTIONS ============================================================ */\n\n/** Loader fod delete/restore */\nconst { load, loading } = createLoader()\n\n/** Edit object */\nfunction _edit(): void {\n if (_editing.value !== true) _editing.value = true\n}\n\n/** Cancel and discard changes */\nasync function _cancel(): Promise<void> {\n if (_editing.value === false) return\n\n await load(async () => {\n if (! _modified.value) return _editing.value = false\n\n const result = await confirmDiscard()\n if (! result) return // no changes!\n // restore from backup and close editing\n _value.value = structuredClone(_backup!)\n _editing.value = false\n })\n}\n\n/** Validate, and if emit our \"save\" event */\nasync function _submit(): Promise<void> {\n if (! _props.onSave) return\n if (! _submittable.value) return\n const valid = await _form.value?.validate()\n if (valid) _props.onSave()\n}\n\n/** Delete this object */\nasync function _delete(): Promise<void> {\n if (_value.value.deleted) return\n\n await load(async () => {\n const result = await confirmDelete()\n if (result) _props.onDelete?.()\n })\n}\n\n/** Restore this object */\nasync function _restore(): Promise<void> {\n if (! _value.value.deleted) return\n\n await load(async () => {\n const result = await confirmRestore()\n if (result) _props.onRestore?.()\n })\n}\n\n/* ===== EXPOSED ============================================================ */\n\ndefineExpose({\n validate: async () => (await _form.value?.validate() || false),\n modified: _modified,\n submittable: _submittable,\n isReady: _ready,\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.json-scroll {\n position: absolute;\n left: 0px;\n right: 0px;\n top: 64px;\n bottom: 0px;\n overflow: scroll;\n}\n</style>\n","import { useTranslator } from '@juit/vue-i18n'\n\nimport { translations } from '../assets/translations'\n\nimport type { PropType } from 'vue'\nimport type { ZBaseObject } from '../types'\n\n/** Generic properties shared by all our tables. */\nexport const tableProps = {\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Enclosed table: renders controls within the table itself */\n enclosed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Can this table be expanded to full screen or not */\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The initial number of rows to be fetched (default: 25 when dense or 15) */\n length: {\n type: Number,\n required: false,\n default: ({ dense }: { dense?: boolean }) => dense ? 25 : 15,\n },\n /** Is the state of this table synchronized with the current route or not */\n useRoute: {\n type: Boolean,\n required: false,\n default: false,\n },\n} as const\n\n/**\n * Extra properties to add to tables to forward pointer events to the parent.\n *\n * The followings are **EMITS**, they need to be declared as props because\n * of the discussion at https://github.com/vuejs/rfcs/discussions/397.\n */\nexport const tableEventProps = {\n onRowClick: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n onRowDblclick: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n onRowContextmenu: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** Table State */\nexport interface ZTableState {\n offset: number,\n limit: number,\n sort?: string | undefined,\n desc: boolean,\n}\n\n/** Describe a possible length of rows in a table */\nexport interface ZTableRowsOption {\n /** The _value_ (number of rows) associated with this option */\n value: number,\n /** The _icon_ (as per Quasar names) of the icon associated with this */\n icon: string,\n}\n\n/** Options defining row lengths in a table */\nexport type ZTableRowsOptions = ZTableRowsOption[]\n\n/** A single column definition */\nexport interface ZTableColumn<T = any> {\n /** The label used in the header of the table */\n label: string | (() => string);\n /** The value to display in a cell for this column */\n value?: ((row: T) => any);\n /** Whether this column is hidden or not (`required` means _never_ hide) */\n hidden?: boolean | 'never';\n /** Horizontal alignment of cells in this column (default: `left`) */\n align?: 'left' | 'right' | 'center';\n /** A flag indicating whether this column is sortable and its default order */\n sortable?: boolean | 'asc' | 'desc';\n /** The real column where sorting will be performed (defaults to the key) */\n sort?: string;\n /** The style to apply on the data cells of this column */\n style?: string | ((row: T) => string);\n /** Classes to add to the data cells of this column */\n class?: string | ((row: T) => string);\n}\n\n/** Column definitions, keyed by table name */\nexport type ZTableColumns<T = any> = Record<string, ZTableColumn<T>>\n\n/**\n * Objects columns definitions (`uuid`, `created`, `modifed` and `deleted`)\n *\n * Because of internationalization, we need to use this function directly in\n * the `setup()` function of the component, and never in computed properties.\n */\nexport function useObjectColumns(): ZTableColumns<ZBaseObject> {\n const { t, d } = useTranslator()\n\n return {\n uuid: {\n label: () => t(translations['object.uuid']),\n hidden: true,\n },\n created: {\n label: () => t(translations['object.created']),\n value: (row) => d(row.created),\n sortable: true,\n hidden: true,\n },\n modified: {\n label: () => t(translations['object.modified']),\n value: (row) => d(row.modified),\n sortable: true,\n hidden: true,\n },\n deleted: {\n label: () => t(translations['object.deleted']),\n value: (row) => d(row.deleted),\n sortable: true,\n hidden: true,\n },\n }\n}\n","<template>\n <z-btn-dropdown\n flat\n dense\n no-icon-animation\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :dropdown-icon=\"icons.table.columns\"\n :tooltip=\"$t({ en: 'Columns', de: 'Spalten' })\"\n >\n <q-list dense bordered>\n <q-item\n v-for=\"(column, name) in columns\"\n :key=\"name\"\n :class=\"{ 'bg-shade-primary text-primary': visible.includes(name) }\"\n clickable\n @click=\"toggleVisible(name)\"\n >\n <q-item-section>\n <q-item-label>\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </q-item-label>\n </q-item-section>\n <q-item-section side>\n <q-icon\n size=\"xs\"\n :name=\"visible.includes(name) ? icons.visibility.on : icons.visibility.off\"\n />\n </q-item-section>\n </q-item>\n </q-list>\n </z-btn-dropdown>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QList } from 'quasar'\n\nimport { icons } from '../../assets/icons'\nimport ZBtnDropdown from '../../buttons/btn-dropdown.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZTableColumns } from '../../utils/tables'\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTableFooterColumns' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The columns to display in our control */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** Array of column **keys** that are currently visible */\nconst visible = defineModel({\n type: Array as PropType<string[]>,\n required: true,\n})\n\n// ===== LOCALS ================================================================\n\n/** Toggle visibility on the specified column */\nfunction toggleVisible(_name: string): void {\n if (visible.value.includes(_name)) {\n visible.value = visible.value.filter((c) => c !== _name)\n } else {\n visible.value = [ ...visible.value, _name ]\n }\n}\n</script>\n","<template>\n <z-btn\n flat\n dense\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :icon=\"fullscreen ? icons.fullscreen.exit : icons.fullscreen.enter\"\n :tooltip=\"$t({ en: 'Full screen', de: 'Ganzer Bildschirm' })\"\n @click=\"fullscreen = ! fullscreen\"\n />\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { icons } from '../../assets/icons'\nimport ZBtn from '../../buttons/btn.vue'\n\ndefineOptions({ name: 'ZTableFooterFullscreen' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** The full-screen state */\nconst fullscreen = defineModel({\n type: Boolean,\n required: true,\n})\n</script>\n","<template>\n <div class=\"row justify-center items-center\" style=\"flex-wrap: nowrap;\">\n <!-- first page -->\n <z-btn\n v-if=\"screen.gt.xs\"\n flat\n dense\n :icon=\"icons.pagination.first\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (_page < 1)\"\n @click=\"_page = 0\"\n />\n\n <!-- previous page -->\n <z-btn\n flat\n dense\n :icon=\"icons.pagination.previous\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (_page < 1)\"\n @click=\"_page -= 1\"\n />\n\n <!-- page number -->\n <div class=\"q-px-sm text-no-wrap\">\n {{ $n(_page + 1) }}\n <span v-if=\"last && screen.gt.xs\" aria-disabled>\n {{ $t({ en: 'of {n}', de: 'von {n}' }, { n: _last }) }}\n </span>\n </div>\n\n <!-- next page -->\n <z-btn\n flat\n dense\n :icon=\"icons.pagination.next\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (! next)\"\n @click=\"_page += 1\"\n />\n\n <!-- last page -->\n <z-btn\n v-if=\"screen.gt.xs\"\n flat\n dense\n :icon=\"icons.pagination.last\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || ((last || 0) <= _page)\"\n @click=\"_page = last\"\n />\n </div>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { useQuasar } from 'quasar'\nimport { computed } from 'vue'\n\nimport { icons } from '../../assets/icons'\nimport ZBtn from '../../buttons/btn.vue'\n\nconst { n, t } = useTranslator()\nconst { screen } = useQuasar()\n\ndefineOptions({ name: 'ZTableFooterPagination' })\n\nconst _props = defineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Whether there is a _next_ page after the current one */\n next: {\n type: Boolean,\n required: true,\n },\n /** The last page, if any */\n last: {\n type: Number,\n required: true,\n },\n})\n\n/** The page number */\nconst _page = defineModel({\n type: Number,\n required: true,\n})\n\n/** Last, as a (formatted) number or the string \"many\" */\nconst _last = computed(() => {\n if (_props.last >= 0) return n(_props.last + 1)\n if (! _props.next) return n(_page.value + 1)\n return t({ en: 'many', de: 'viele' })\n})\n\n\n</script>\n","<template>\n <z-btn-dropdown\n flat\n dense\n no-icon-animation\n :auto-close=\"true\"\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :dropdown-icon=\"icons.table.rows\"\n :tooltip=\"$t({ en: 'Rows', de: 'Reihen' })\"\n >\n <q-list dense bordered>\n <q-item\n v-for=\"(option, i) in options\"\n :key=\"i\"\n :class=\"{ 'bg-shade-primary text-primary': length === option.value }\"\n clickable\n @click=\"length = option.value\"\n >\n <q-item-section class=\"text-right\">\n <q-item-label>{{ option.value }}</q-item-label>\n </q-item-section>\n <q-item-section side>\n <q-icon\n size=\"xs\"\n class=\"q-ml-sm\"\n :name=\"option.icon\"\n />\n </q-item-section>\n </q-item>\n </q-list>\n </z-btn-dropdown>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QList } from 'quasar'\n\nimport { icons } from '../../assets/icons'\nimport ZBtnDropdown from '../../buttons/btn-dropdown.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZTableRowsOptions } from '../../utils/tables'\n\ndefineOptions({ name: 'ZFooterRows' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Definition of the various row options */\n options: {\n type: Array as PropType<ZTableRowsOptions>,\n required: true,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** The number of rows currently visible */\nconst length = defineModel({\n type: Number,\n required: true,\n})\n</script>\n","<template>\n <q-tr :props=\"slotData\" :class=\"slotData.__trClass\">\n <!-- present only when in selection mode, checkbox to select all -->\n <q-th\n v-if=\"selection\"\n class=\"shrink\"\n :class=\"{\n 'bg-shade-primary text-primary': ! loading,\n 'bg-shade disabled': loading,\n }\"\n >\n <q-checkbox\n v-model=\"slotData.selected\"\n :size=\"slotData.dense ? 'xs' : undefined\"\n toggle-order=\"tf\"\n dense\n />\n </q-th>\n\n <!-- table headers -->\n <q-th\n v-for=\"(column, name) in columns\"\n :key=\"name\"\n :props=\"slotData\"\n class=\"relative-position\"\n :style=\"borders && 'border-top-width: 1px'\"\n :class=\"{\n 'q-focusable q-hoverable': !! sortable[name],\n 'cursor-pointer': (!! sortable[name]) && (! loading),\n 'bg-shade-primary text-primary': ! loading,\n 'bg-shade disabled': loading,\n }\"\n @click=\"loading || toggleSort(name)\"\n >\n <div v-if=\"!! sortable[name]\" class=\"q-focus-helper\" tabindex=\"-1\" />\n\n <!-- ensure we're properly centered on the column -->\n <q-icon v-if=\"column.align === 'center'\" class=\"q-mr-sm\" />\n\n <!-- label for left/center-aligned content -->\n <span v-if=\"column.align !== 'right'\" class=\"text-uppercase text-weight-bold q-mr-sm\">\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </span>\n\n <!-- arrows to be shown when this column is being sorted -->\n <q-icon\n v-if=\"(column.sort || name) === state.sort\"\n :name=\"state.desc ? icons.sorting.descending : icons.sorting.ascending\"\n />\n\n <!-- icon to be shown for all non-sorting, but sortable columns -->\n <q-icon v-else-if=\"!! sortable[name]\" :name=\"icons.sorting.unsorted\" />\n\n <!-- label for right-aligned content -->\n <span v-if=\"column.align === 'right'\" class=\"text-uppercase text-weight-bold q-ml-sm\">\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </span>\n </q-th>\n </q-tr>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QCheckbox, QIcon, QTh, QTr } from 'quasar'\nimport { computed } from 'vue'\n\nimport { icons } from '../../assets/icons'\n\nimport type { QTableSlots } from 'quasar'\nimport type { PropType } from 'vue'\nimport type { ZTableColumns, ZTableState } from '../../utils/tables'\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTableHeader' })\n\nconst props = defineProps({\n /** Thin border at the top of the heade */\n borders: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Our columns definitions */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Whether the table rows are currently loading */\n loading: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Whether to add the selection checkbox header or not */\n selection: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** Current state of the table */\nconst state = defineModel({\n type: Object as PropType<ZTableState>,\n required: true,\n})\n\n/** The semi-opaque slot data for this header */\nconst slotData = defineModel('slotData', {\n type: Object as PropType<Parameters<QTableSlots['header']>[0]>,\n required: true,\n})\n\n\n// ===== LOCALS ================================================================\n\n/** All sortable columns, associated with their default order */\nconst sortable = computed<Record<string, { sort: string, order: 'asc' | 'desc' }>>(() => {\n return Object.entries(props.columns).reduce((columns, [ name, column ]) => {\n const sort = column.sort || name\n if (column.sortable === true) columns[name] = { sort, order: 'asc' }\n else if (column.sortable === 'asc') columns[name] = { sort, order: 'asc' }\n else if (column.sortable === 'desc') columns[name] = { sort, order: 'desc' }\n return columns\n }, {} as Record<string, { sort: string, order: 'asc' | 'desc' }>)\n})\n\n/** Toggle sort when clicking on a header */\nfunction toggleSort(name: string): void {\n const column = sortable.value[name]\n if (! column) return\n\n // what's the default (first) order for the column? default is ascending!\n // const defaultOrder = column.order // === 'desc' ? 'desc' : 'asc'\n\n // toggle and update the sort model back to the parent\n if (state.value.sort === column.sort) {\n if (column.order === 'desc') {\n if (state.value.desc) state.value.desc = false\n else { // reset\n state.value.sort = undefined\n state.value.desc = false\n }\n } else {\n if (! state.value.desc) state.value.desc = true\n else { // reset\n state.value.sort = undefined\n state.value.desc = false\n }\n }\n } else {\n state.value.desc = column.order === 'desc'\n state.value.sort = column.sort\n }\n}\n</script>\n","<template>\n <!-- default slot (controls) goes *outside* when not secondary (full screen or enclosed) -->\n <div\n v-if=\"slots.default && (! secondary)\"\n class=\"row justify-end q-gutter-sm q-mb-md z-table-controls\"\n >\n <z-input-group :disabled=\"loading\">\n <slot name=\"default\" />\n </z-input-group>\n </div>\n\n <!-- the actual table -->\n <q-table\n v-model:fullscreen=\"full\"\n v-model:selected=\"selected\"\n v-bind=\"$attrs\"\n :columns=\"tableColumns\"\n :dense=\"dense\"\n :loading=\"loading\"\n :pagination=\"{ rowsPerPage: -1 }\"\n :row-key=\"rowKey\"\n :rows=\"tableRows\"\n :visible-columns=\"visible\"\n :selection=\"selection ? 'multiple' : 'none'\"\n :hide-bottom=\"tableRows.length ? hideBottom : false\"\n no-route-fullscreen-exit\n bordered\n flat\n >\n <!-- title when secondary (full screen or enclosed) -->\n <template v-if=\"title && secondary\" #top-left>\n <div class=\"text-h6 text-uppercase text-bold\">\n {{ title }}\n </div>\n </template>\n\n <!-- controls when secondary (full screen or enclosed) -->\n <template v-if=\"slots.default && secondary\" #top-right>\n <div class=\"row justify-end q-gutter-sm z-table-controls\">\n <z-input-group :disabled=\"loading\">\n <slot name=\"default\" />\n </z-input-group>\n </div>\n </template>\n\n <!-- table header -->\n <template #header=\"data\">\n <table-header\n v-model=\"state\"\n :selection=\"!! selection\"\n :borders=\"slots.default && secondary\"\n :loading=\"loading\"\n :columns=\"columns\"\n :slot-data=\"data\"\n :dense=\"dense\"\n />\n </template>\n\n <!-- table body -->\n <template #body=\"scope\">\n <!-- table row: v-for loop is handled by qtable -->\n <q-tr\n :props=\"scope\"\n :style=\"rowStyle?.(scope.row)\"\n :class=\"`\n ${scope.__trClass}\n ${rowClass?.(scope.row) || ''}\n ${onRowClick ? 'cursor-pointer' : ''}\n `\"\n @click=\"onRowClick?.($event, scope.row, scope.rowIndex)\"\n @dblclick=\"onRowDblclick?.($event, scope.row, scope.rowIndex)\"\n @contextmenu=\"onRowContextmenu?.($event, scope.row, scope.rowIndex)\"\n >\n <!-- create link once per row, using v-for to contextualize variable -->\n <template v-for=\"link in [ rowLink?.(scope.row) ]\" :key=\"link\">\n <!-- selection checkbox, only if selecting -->\n <q-td v-if=\"scope.selected !== undefined\" class=\"text-center shrink\">\n <q-checkbox v-model=\"scope.selected\" dense :size=\"dense ? 'xs' : undefined\" />\n </q-td>\n\n <!-- table cell -->\n <q-td v-for=\"col in scope.cols\" :key=\"col.name\" :props=\"scope\">\n <!-- optionally wrap the contents of the cell in a router link -->\n <table-link :to=\"link\">\n <!-- if we have a *data* slot call it-->\n <div v-if=\"slots[`data-${col.name}`]\">\n <slot\n :name=\"`data-${col.name}`\"\n :index=\"scope.rowIndex\"\n :row=\"scope.row\"\n :value=\"col.value\"\n />\n </div>\n <!-- otherwise, just display the value -->\n <div v-else>\n {{ col.value }}\n </div>\n </table-link>\n </q-td>\n </template>\n </q-tr>\n </template>\n\n <!-- bottom row -->\n <template v-if=\"slots['bottom-row']\" #bottom-row>\n <slot name=\"bottom-row\" />\n </template>\n\n <!-- no-data slot -->\n <template #no-data>\n <template v-if=\"loading\">\n <q-spinner size=\"xs\" class=\"q-mr-sm\" color=\"grey\" />\n <span>{{ $t({ en: 'Loading', de: 'Laden' }) }}</span>\n </template>\n <template v-else>\n <q-icon\n :name=\"icons.warning\"\n class=\"fill-icon q-mr-sm\"\n color=\"warning\"\n size=\"xs\"\n />\n <span>{{ $t({ en: 'No data available', de: 'Kein Daten vorhanden' }) }}</span>\n </template>\n </template>\n\n <!-- table bottom (pagination, controls, ...) -->\n <template #bottom>\n <div class=\"row col-12 items-center\">\n <!-- record number (from, to, total number if known) -->\n <div :class=\"fixed ? 'col-6' : 'col-4'\">\n <div class=\"row justify-start items-center\">\n <div>\n {{ $n(state.offset + 1) }}\n …\n {{ $n(state.offset + Math.min(rows.length, length)) }}\n <span v-if=\"records && screen.gt.xs\" aria-disabled>\n {{ $t({ en: 'of {n}', de: 'von {n}' }, { n: $n(records) }) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- pagination -->\n <div :class=\"fixed ? 'col-6' : 'col-4'\">\n <div class=\"row items-center\" :class=\"fixed ? 'justify-end' : 'justify-center'\">\n <table-footer-pagination\n v-model=\"page\"\n :dense=\"dense\"\n :disable=\"loading\"\n :next=\"rows.length > length\"\n :last=\"last\"\n />\n </div>\n </div>\n <div v-if=\"! fixed\" class=\"col-4\">\n <div class=\"row justify-end items-center\">\n <table-footer-full-screen\n v-if=\"fullscreen\"\n v-model=\"full\"\n :dense=\"dense\"\n :disable=\"loading\"\n />\n <table-footer-columns\n v-if=\"optional\"\n v-model=\"visible\"\n :columns=\"optional\"\n :dense=\"dense\"\n :disable=\"loading\"\n />\n <table-footer-rows\n v-model=\"length\"\n :dense=\"dense\"\n :disable=\"loading\"\n :options=\"rowsOptions\"\n />\n </div>\n </div>\n </div>\n </template>\n </q-table>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { is, QCheckbox, QIcon, QSpinner, QTable, QTd, QTr, useQuasar } from 'quasar'\nimport { computed, defineComponent, h, ref, watch } from 'vue'\nimport { RouterLink } from 'vue-router'\n\n\nimport { icons } from '../assets/icons'\nimport ZInputGroup from '../forms/input-group.vue'\nimport { tableEventProps } from '../utils/tables'\nimport TableFooterColumns from './layout/table-footer-columns.vue'\nimport TableFooterFullScreen from './layout/table-footer-fullscreen.vue'\nimport TableFooterPagination from './layout/table-footer-pagination.vue'\nimport TableFooterRows from './layout/table-footer-rows.vue'\nimport TableHeader from './layout/table-header.vue'\n\nimport type { QTableProps } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZTableColumns, ZTableRowsOptions, ZTableState } from '../utils/tables'\n\nconst { screen } = useQuasar()\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTable' })\n\nconst props = defineProps({\n ...tableEventProps,\n /** Optional title for this table */\n title: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Enclosed table: renders controls within the table itself */\n enclosed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Fixed table: do not allow selection of rows/column */\n fixed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Can this table be expanded to full screen or not */\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Hide the bottom pagination when not needed */\n hideBottom: {\n type: Boolean,\n required: false,\n default: false,\n },\n /**\n * Flag indicating the table is loading\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n loading: {\n type: Boolean,\n required: true,\n },\n /**\n * The rows to display (starting at `offset` with the given `limit`)\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n rows: {\n type: Array as PropType<any[]>,\n required: true,\n },\n /**\n * The total number of rows (if known)\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n total: {\n type: Number,\n required: false,\n default: 0,\n },\n /** Definition for the columns of this table */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Class(es) to apply to each row */\n rowClass: {\n type: Function as PropType<(row: any) => string | undefined>,\n required: false,\n default: undefined,\n },\n /** Style(s) to apply to each row */\n rowStyle: {\n type: Function as PropType<(row: any) => string | undefined>,\n required: false,\n default: undefined,\n },\n /** Style(s) to apply to each row */\n rowLink: {\n type: Function as PropType<(row: any) => RouteLocationRaw | string | undefined>,\n required: false,\n default: undefined,\n },\n /** The unique identifier of a row (must be supplied) */\n rowKey: {\n type: String,\n required: true,\n },\n /** Options specifying the row lengths to display fot this table */\n rowsOptions: {\n type: Array as PropType<ZTableRowsOptions>,\n required: false,\n default: ({ dense }: { dense?: boolean }) => {\n return dense ? [\n { value: 10, icon: icons.table.row.density[1] },\n { value: 25, icon: icons.table.row.density[2] },\n { value: 50, icon: icons.table.row.density[3] },\n { value: 100, icon: icons.table.row.density[4] },\n ] : [\n { value: 5, icon: icons.table.row.density[1] },\n { value: 15, icon: icons.table.row.density[2] },\n { value: 50, icon: icons.table.row.density[3] },\n { value: 100, icon: icons.table.row.density[4] },\n ]\n },\n },\n})\n\n/** Current state of the table */\nconst state = defineModel({\n type: Object as PropType<ZTableState>,\n required: true,\n})\n\n// ===== DATA SLOTS & EMITS ====================================================\n\nconst slots = defineSlots<{\n [ key: `data-${string}` ]: (props: { index: number, row: any, value: any }) => VNode[]\n 'bottom-row'?: () => VNode[]\n 'default'?: () => VNode[]\n}>()\n\n// ===== PAGINATION ============================================================\n\n/** The current page number (zero-based) */\nconst page = ref<number>(0)\n/** The last page number (if known, or zero) */\nconst last = computed<number>(() => Math.floor((props.total - 1) / length.value))\n/** The number of rows to display (basically `limit - 1`) */\nconst length = ref<number>(0)\n/** The total number of records (either from our prop or computed) */\nconst records = computed(() => {\n if (props.total) return props.total\n if (props.rows.length <= length.value) return state.value.offset + props.rows.length\n return 0\n})\n/** Secondary: if enclosed or in full screen renders control within the table */\nconst secondary = computed(() => props.enclosed || full.value)\n\n// The order of these watchers is important, as `limit`, `length`, `offset`\n// and `page` are all interdependent on each other.\n\nwatch([ () => state.value.offset, () => state.value.limit ], ([ offset, limit ]) => {\n if (limit <= 0) length.value = props.dense ? 10 : 15\n else length.value = limit - 1\n // must be calculated after the length above...\n page.value = Math.floor(offset / length.value)\n}, { immediate: true })\n\nwatch(length, (length) => {\n state.value.limit = length + 1\n}, { immediate: true })\n\nwatch(page, (page) => {\n state.value.offset = page * length.value\n}, { immediate: true })\n\n// ===== SELECTION =============================================================\n\n/**\n * If this property is specified *and* is an array, this table will be\n * selectable, and the selection will include (in order) all selected rows\n */\nconst selection = defineModel('selection', {\n type: Array as PropType<any[] | undefined>,\n required: false,\n default: undefined,\n})\n\n/** The selection for q-table (unordered) */\nconst selected = ref<any[]>([])\n\nwatch(() => props.rows, () => selected.value = [])\n\n/* Watch \"selected\" (from q-table) and emit the selection in order */\nwatch(selected, (selected) => {\n if (! selection.value) return // no \"selection\" model\n\n // quick check on empty selection\n if (selected.length === 0) {\n if (selection.value.length === 0) return\n selection.value = []\n return\n }\n\n // get the keys selected in q-table\n const selectedKeys = selected\n .map((row) => row[props.rowKey])\n .filter((key) => !! key)\n\n // get the keys selected by the parent\n const selectionKeys = selection.value\n .map((row) => row[props.rowKey])\n .filter((key) => !! key)\n\n // prepare a new selection (keys and rows)\n const newSelection: any[] = []\n const newSelectionKeys: any[] = []\n for (const row of props.rows) {\n const key = row[props.rowKey]\n if (selectedKeys.includes(key)) {\n newSelectionKeys.push(key)\n newSelection.push(row)\n }\n }\n\n // if the selection has changed, emit it it\n if (is.deepEqual(selectionKeys, newSelectionKeys)) return\n selection.value = newSelection\n})\n\n/* Watch \"selection\" (from parent) and update \"selected\" (for q-table) */\nwatch(selection, (selection) => selected.value = selection || [], { immediate: true })\n\n// ===== COLUMNS VISIBILITY ====================================================\n\n/** All _optional_ columns (as, _they can be hidden_) */\nconst optional = computed<ZTableColumns | undefined>(() => {\n const entries = Object.entries(props.columns)\n .filter(([ _, { hidden } ]) => hidden !== 'never')\n\n if (! entries.length) return undefined\n\n return entries.reduce((optional, [ name, column ]) => {\n optional[name] = column\n return optional\n }, {} as ZTableColumns)\n})\n\n/** Current list of _visible_ columns */\nconst visible = ref<string[]>([])\n\n// Compute visible columns, adding and removing as necessary\nwatch(() => props.columns, (newColumns, oldColumns = {}) => {\n // Compute the list of _new_ visible column names\n const newVisible = Object.entries(newColumns)\n .filter(([ _, { hidden } ]) => hidden === 'never' || (! hidden))\n .map(([ name ]) => name)\n\n // Compute the list of _old_ visible column names\n const oldVisible = Object.entries(oldColumns)\n .filter(([ _, { hidden } ]) => hidden === 'never' || (! hidden))\n .map(([ name ]) => name)\n\n // Compute the columns to add and remove from our current list\n const add = newVisible.filter((name) => ! oldVisible.includes(name))\n const del = oldVisible.filter((name) => ! newVisible.includes(name))\n\n // Update the list of visible columns\n visible.value = [ ...visible.value, ...add ].filter((name) => ! del.includes(name))\n}, { immediate: true })\n\n// ===== LOCAL STATE ===========================================================\n\n/** Flag indicating we're in full-screen */\nconst full = ref(false)\n\n// ===== QUASAR TABLE PROPERTIES ===============================================\n\n/** The rows to display in the Quasar table */\nconst tableRows = computed(() => props.rows.slice(0, length.value))\n\n/** The column definitions for the Quasar table */\nconst tableColumns = computed<Exclude<QTableProps['columns'], undefined>>(() => {\n return Object.entries(props.columns).map(([ name, col ]) => ({\n name,\n label: name, // we override in our header/column picker\n field: col.value || name,\n align: col.align || 'left',\n sortable: false, // do not let Quasar sort the columns\n style: col.style,\n classes: col.class,\n } satisfies Exclude<QTableProps['columns'], undefined>[0]))\n})\n\n// ===== OPTIONAL LINK FOR TABLE ROW ===========================================\n\nconst TableLink = defineComponent({\n name: 'TableLink',\n props: {\n to: {\n type: [ String, Object ] as PropType<RouteLocationRaw>,\n required: false,\n default: undefined,\n },\n },\n\n setup: (props, ctx) => () => {\n if (! ctx.slots.default) return []\n if (! props.to) return ctx.slots.default()\n return h(RouterLink, { to: props.to, class: 'table-link' }, ctx.slots.default)\n },\n})\n</script>\n\n<style scoped lang=\"pcss\">\n/* Let padding be done by a.table-link */\ntd.q-td:has(a.table-link) {\n padding: 0;\n vertical-align: top;\n}\n\ntd.q-td.shrink {\n width: 1px;\n}\n\n/* Turn an \"<a href=...>\" into a glorified div */\na.table-link {\n display: block;\n color: inherit;\n text-decoration: none;\n /* fill the cell */\n width: 100%;\n height: 100%;\n\n /* center the content vertically */\n > div {\n position: relative;\n transform: translateY(-50%);\n top: 50%;\n /* overflow and text trimming of nested DIV */\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n/* Remove the top border from the \"no-data\" bottom slot */\n:deep(.q-table__bottom--nodata) {\n border-top: none;\n}\n\n/* Colorize loading in the primary color */\n:deep(.q-linear-progress) {\n color: var(--q-primary) !important;\n}\n\n/* Add padding for each cell (basically, cloned the quasar defaults) */\ntd.q-td a.table-link {\n padding: 7px 16px;\n}\n\n.q-table--dense td.q-td a.table-link {\n padding: 4px 8px;\n}\n\n.q-table--dense td.q-td:first-child a.table-link {\n padding-left: 16px;\n}\n\n.q-table--dense td.q-td:last-child a.table-link {\n padding-right: 16px;\n}\n\n/* Constrain padding for the table top */\n:deep(.q-table__top) {\n padding: 12px 16px;\n}\n\n.q-table--dense :deep(.q-table__top) {\n padding: 12px 16px;\n}\n\n/* Default width for search and other inputs */\n.z-table-controls :deep(.q-input) {\n width: 200px;\n}\n\n</style>\n","import { getCurrentScope, reactive, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport type { PropType, Reactive } from 'vue'\nimport type { LocationQuery } from 'vue-router'\n\n/* ===== EXPORTED TYPES ===================================================== */\n\n/** Types accepted by our reactive object */\nexport type ZQueryReactiveValue = string | number | boolean\n\n/** A record representing a basic/untyped reactive object */\nexport type ZQueryReactiveObject = Record<string, ZQueryReactiveValue | undefined>\n\n/** Default for T: either a primitive or a function producing one */\nexport type ZQueryReactiveDefault<T extends ZQueryReactiveValue> = T | undefined\n | ((state: Readonly<ZQueryReactiveObject>) => T | undefined)\n\n/** Simple definition for a reactive property */\nexport type ZQueryReactiveDef<T extends ZQueryReactiveValue = ZQueryReactiveValue> =\n | { type: PropType<T>, default?: ZQueryReactiveDefault<T>, useRoute?: boolean }\n | ( PropType<T> & { type?: never, default?: never, useRoute?: never } )\n\n/**\n * Definition for a reactive object that can be bound to the router query.\n *\n * Each key in the definition object represents a property in the reactive\n * object and the key in the query string.\n *\n * Types can be simple strings, numbers, or booleans (for more complex types\n * use `PropType`, but _no validation occurs_, so be careful).\n *\n * The `default` property is used when the query string is missing or empty,\n * and for booleans it's always `false` (to avoid the \"undefined\" state).\n */\nexport type ZQueryReactiveDefs = { [ K: string ]: ZQueryReactiveDef }\n\n/* ===== INTERNAL TYPES ===================================================== */\n\n/** Internal definition (basically the object version of ReactiveDef) */\ntype InternalDef = {\n type: PropType<ZQueryReactiveValue>,\n default: ZQueryReactiveDefault<ZQueryReactiveValue>,\n useRoute: boolean,\n}\n\n/** Infer a single definition */\ntype InferDef<T extends ZQueryReactiveDef> =\n T extends { type: PropType<infer R> } ? // / is this a \"typed\" definition???\n //\n R extends boolean ? boolean : // / if it's a boolean, return a boolean\n //\n T['default'] extends () => infer X ? // / if default is a function infer the return type\n undefined extends X ?\n R | undefined : // / if the return type can be undefined\n R : // / then the value can be undefined too\n undefined extends T['default'] ?\n R | undefined : // / the same for when the default is a value\n R : // / if default can be undefined, then...\n //\n T extends PropType<infer R> ? // / this is not a \"typed\" definition\n R extends boolean ? boolean : // / if it's a boolean, return a boolean\n R | undefined : // / otherwise, return the type or undefined\n //\n never // / not accepting anything else\n\n/** Infer all our definitions */\ntype InferDefs<T extends ZQueryReactiveDefs> = {\n [ K in keyof T ]:\n T[K]['type'] extends PropType<any> ? InferDef<T[K]> : // typed definition\n T[K] extends PropType<any> ? InferDef<T[K]> : // // simple constructor\n never // // nothing else!\n}\n\n/* ===== INTERNAL FUNCTIONS ================================================= */\n\n/** Get the default value from a ReactiveDef */\nfunction getDefaultValueFor<T extends ZQueryReactiveValue>(\n def: ZQueryReactiveDef<T>,\n state: ZQueryReactiveObject,\n): T | undefined {\n const value = typeof def.default === 'function' ?\n def.default({ ...state }) :\n def.default\n if (def.type === Boolean) return (value || false) as T\n return value as T\n}\n\n/* ===== EXPORTED FUNCTIONS ================================================= */\n\n/**\n * Create a reactive object following the given definition and _optionally_ bind\n * it to the router's query string.\n *\n * @param definition - The definition for the reactive object.\n * @param useRoutes - When true, bind the object to the router's query string.\n */\nexport function createBoundObject<T extends ZQueryReactiveDefs>(\n definition: T,\n useRoutes: boolean = false,\n): Reactive<InferDefs<T>> {\n // triple check that we're not doing something stupid\n if (! getCurrentScope()) throw new Error('No reacive scope found')\n\n // start with an empty object, we'll fill it with the default values\n const object = reactive({} as Record<string, any>)\n\n // clone our definitions (we'll clean them up)\n const defs: Record<string, InternalDef> = {}\n\n // clone and normalize our definitions while setting up the default values\n for (const [ key, def ] of Object.entries(definition)) {\n object[key] = getDefaultValueFor(def, object)\n\n // check, normalize and store the definition\n const type: PropType<ZQueryReactiveValue> = def.type || def\n const useRoute = def.useRoute === false ? false : useRoutes\n\n // if it's a good type (String, Number, Boolean), we're good to go\n if ((type === String) || (type === Number) || (type === Boolean)) {\n defs[key] = { type, useRoute, default: def.default }\n continue\n }\n\n // wrong type, throw an error\n throw new Error(`Invalid constructor definition \"${key}\": ${type}`)\n }\n\n // if we're not binding to the router query, we're done!\n if (! useRoutes) return object as Reactive<InferDefs<T>>\n\n // we're binding to the query, get our router!\n const router = useRouter()\n\n // --- ROUTE to OBJECT -------------------------------------------------------\n\n watch(() => router.currentRoute.value.query, (query) => {\n for (const [ key, def ] of Object.entries(defs)) {\n if (! def.useRoute) continue // skip anyhting not bound to the route\n\n // get our default value for the current defintion\n const defaultValue = getDefaultValueFor(defs[key]!, object)\n\n // normalize query value to a simple string / null / undefined\n const string = (Array.isArray(query[key]) ? query[key][0] : query[key])\n\n // empty strings, nulls, undefined will be mapped to defaults\n if (def.type === String) {\n const value = string || defaultValue\n if (object[key] !== value) object[key] = value\n continue\n }\n\n // numbers will be parsed *if* there is a value (a string longer than zero\n // and \"NaN\"s will be mapped to the default value (basically, ignored)\n if (def.type === Number) {\n let value = string ? Number(string) : defaultValue\n if ((typeof value !== 'number') || isNaN(value)) value = defaultValue\n if (object[key] !== value) object[key] = value\n continue\n }\n\n // booleans are represented (normally) with a single 't' or 'f', but\n // we also accept the shorter '?value&' in the query and the router\n // represents this value with \"null\" (not \"undefined\")\n if (def.type === Boolean) {\n const value = string === null ? true : // \"?value&\"\n string === 'true' ? true : // \"?value=t&\"\n string === 't' ? true : // \"?value=true&\"\n string === 'false' ? false : // \"?value=f&\"\n string === 'f' ? false : // \"?value=false&\"\n (defaultValue || false) // anything else is default\n if (object[key] !== value) object[key] = value\n continue\n }\n }\n }, { immediate: true })\n\n // watch for changes in our object and update the route query\n watch(object, (object) => {\n // get the *current* query (we'll retain extra parameters)\n const query: LocationQuery = { ...router.currentRoute.value.query }\n let modified = false\n\n // update the query with values from our object\n for (const [ key, def ] of Object.entries(defs)) {\n if (! def.useRoute) continue // skip anyhting not bound to the route\n\n // get the default value for the current definition\n const defaultValue = getDefaultValueFor(defs[key]!, object)\n\n // this is what we'll be pushing to (or pulling from) the query\n let value: string | null | undefined\n\n // strings or numbers are converted to strings, empty strings, nulls and\n // undefineds are omitted, and the default value is also omitted\n if ((def.type === String) || (def.type === Number)) {\n value = object[key] === defaultValue ? undefined : // default values are omitted\n object[key] === '' ? undefined : // empty strings (but not zeroes!!!) are omitted\n object[key] === undefined ? undefined : // undefineds are omitted\n object[key] === null ? undefined : // nulls are omitted\n String(object[key]) // everything else is converted to string\n } else if (def.type === Boolean) {\n value = object[key] === defaultValue ? undefined : // default values are omitted\n object[key] ? null : 'f' // true is \"null\" (short form), false is \"f\"\n }\n\n // if the value is *exactly* the same as the query, we can skip\n if (value === query[key]) continue\n\n // delete or replace/add the query value and mark for modifications\n if (value === undefined) delete query[key]\n else query[key] = value\n modified = true\n }\n\n // replace the query in the router if we modified anything\n if (modified) router.replace({ query })\n }, { immediate: true })\n\n // done!\n return object as Reactive<InferDefs<T>>\n}\n\n// ===== TABLE STATE ===========================================================\n\n/** Table state definition */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nconst tableStateDefs = () => ({\n\n // remember, \"q\" needs to go _before_ \"sort\" and \"desc\" by default, so that\n // its value from the query can be used to set/reset the sort and order\n\n /** The optional free-text search to send alongside our query */\n q: { type: String, default: '', isFilter: true },\n\n // sort and desc go *after* q, so that q can affect their value\n\n /** The column to sort results on */\n sort: { type: String, isFilter: true, default: undefined as ZQueryReactiveDefault<string> },\n /** The order for sorting (`true` for descending) */\n desc: { type: Boolean, isFilter: true, default: undefined as ZQueryReactiveDefault<boolean> },\n\n // the rest of the properties can be in any order\n\n /** A flag indicating if deleted records should be included in the response */\n deleted: { type: Boolean, default: false, isFilter: true },\n /** The offset of the first result to return */\n offset: { type: Number, default: 0 },\n /** The maximum number of results to return */\n limit: { type: Number, default: 1 },\n /** The current reload count */\n reload: { type: Number, default: 0, useRoute: false },\n\n} satisfies { [ k: string ]: ZQueryReactiveDef & { isFilter?: boolean } })\n\n/** Type from our `tableStateDefs` function above */\ntype TableStateDefs = ReturnType<typeof tableStateDefs>\n\n/**\n * Create a reactive `TableState` optionally bound to the router's query.\n *\n * Because of the way `q` (text search) interacts with sorting, the object\n * returned will _always_ expose a `q` property, and will reset the `sort`\n * and `desc` values to `undefined` and `false` (respectively) when `q` is\n * set, to their respective defaults when it's empty.\n *\n * To preserve a specific ordering via `sort` and `desc` even when `q` is\n * set, you can override the default values by providing an _extra_ definition\n * for `sort` and/or `desc` when creating the bound table state.\n *\n * The `reload` property is a reactive number that can be used to force a\n * reload of the table data (just increment it!).\n *\n * The options object can include the following:\n * * `length` - the number of results to show per page\n * * `sort` - the _initial_ sort column\n * * `desc` - the _initial_ descending sort order\n * * `extra` - additional properties to include in the object\n * * `useRoute` - whether to bind the object to the router query\n */\nexport function createBoundTableState<T extends {\n [ k: string ]: ZQueryReactiveDef & { isFilter?: boolean } // add \"isFilter\"\n} = {}>(options: {\n length: number,\n sort?: string,\n desc?: boolean,\n extra?: T,\n useRoute?: boolean,\n}): Reactive<InferDefs<T & TableStateDefs>> {\n const { length, sort, desc = false, extra = {}, useRoute = false } = options\n\n // definitions from basic above and include any extra properties\n const defs = { ...tableStateDefs(), ...extra }\n // adjust limit, if length is sensible...\n if (length > 0) defs.limit.default = length + 1\n\n // infer the default sort if not overridden in extra... this basically tells\n // us to sort by the default column if there's no search query, but in case\n // we *want* to sort by a column even in case of searches, then we can simply\n // override the search definition as part of \"extra\".\n if (defs.sort.default === undefined) {\n defs.sort.default = (state) => {\n if (state.q) return undefined // if we have a search, we don't sort\n return sort // otherwise we sort by the default column\n }\n }\n\n // infer the default order when the sort column matches the one passed to\n // `createBoundTableState`... we can always override the behavior by\n // adding a \"desc\" entry as an extra definition in the options.\n if (defs.desc.default === undefined) {\n defs.desc.default = (state) => {\n if (state.sort === sort) return desc // if the column matches, we keep the order\n return false // by default we sort in ascending order\n }\n }\n\n // create the reactive object and bind it to the router query\n const state = createBoundObject(defs, useRoute)\n\n // when \"q\" changes, we reset the sort column and order to their defaults\n // and it'll be up to the default function to check q and decide what to do...\n // also this is a non-immediate watch, as upon creations defaults will be\n // looked\n watch(() => state.q, () => {\n state.sort = getDefaultValueFor(defs.sort, state) as string\n state.desc = getDefaultValueFor(defs.desc, state) as boolean\n }) // not immediate... defaults will processed by create and potentially\n // overridden by th, { immediate: true })\n\n // we need to track filters here, so that we can reset offset on changes\n for (const [ key, def ] of Object.entries(defs)) {\n if ('isFilter' in def && def.isFilter) {\n watch(() => (state as any)[key], () => state.offset = 0)\n }\n }\n\n // done!\n return state as any\n}\n","import { Dialog, Quasar } from 'quasar'\nimport iconSet from 'quasar/icon-set/material-symbols-rounded'\n\n/* Buttons */\nimport ZBtnDropdown from './buttons/btn-dropdown.vue'\nimport ZBtnGroup from './buttons/btn-group.vue'\nimport ZBtn from './buttons/btn.vue'\n/* Controls */\nimport ZControlDeleted from './controls/deleted.vue'\nimport ZControlDropdown from './controls/dropdown.vue'\nimport ZControlReload from './controls/reload.vue'\nimport ZControlSearch from './controls/search.vue'\nimport ZControlSwitch from './controls/switch.vue'\nimport ZControlToggle from './controls/toggle.vue'\n/* Dialogs */\nimport ZConfirmDialog from './dialogs/confirm.vue'\nimport ZDialog from './dialogs/dialog.vue'\nimport ZProgressDialog from './dialogs/progress.vue'\n/* Forms */\nimport ZFormHelper from './forms/form-helper.vue'\nimport ZForm from './forms/form.vue'\nimport ZInputGroup from './forms/input-group.vue'\n/* Inputs */\nimport ZAddress from './inputs/address.vue'\nimport ZAutocomplete from './inputs/autocomplete.vue'\nimport ZCountry from './inputs/country.vue'\nimport ZDateRange from './inputs/date-range.vue'\nimport ZDate from './inputs/date.vue'\nimport ZEan13 from './inputs/ean13.vue'\nimport ZLabel from './inputs/label.vue'\nimport ZNullableNumber from './inputs/nullable-number.vue'\nimport ZNumber from './inputs/number.vue'\nimport ZPassword from './inputs/password.vue'\nimport ZPicker from './inputs/picker.vue'\nimport ZSelect from './inputs/select.vue'\nimport ZString from './inputs/string.vue'\nimport ZTags from './inputs/tags.vue'\nimport ZTelephone from './inputs/telephone.vue'\nimport ZText from './inputs/text.vue'\n/* Objects */\nimport ZHeader from './objects/object-header.vue'\nimport ZObjectNew from './objects/object-new.vue'\nimport ZObject from './objects/object.vue'\n/* Others */\nimport ZTable from './table/table.vue'\nimport ZTag from './tag.vue'\n/* Local styles */\nimport './controls/zstyle.pcss'\nimport './inputs/zstyle.pcss'\n\nimport type { QuasarPluginOptions } from 'quasar'\nimport type { App } from 'vue'\n\n/* ========================================================================== *\n * COMPONENT TYPES *\n * ========================================================================== */\n\n/* ===== BUTTONS ============================================================ */\n\nexport type ZBtn = InstanceType<typeof ZBtn>\nexport type ZBtnDropdown = InstanceType<typeof ZBtnDropdown>\nexport type ZBtnGroup = InstanceType<typeof ZBtnGroup>\n\n/* ===== CONTROLS =========================================================== */\n\nexport type ZControlDeleted = InstanceType<typeof ZControlDeleted>\nexport type ZControlDropdown = InstanceType<typeof ZControlDropdown>\nexport type ZControlReload = InstanceType<typeof ZControlReload>\nexport type ZControlSearch = InstanceType<typeof ZControlSearch>\nexport type ZControlSwitch = InstanceType<typeof ZControlSwitch>\nexport type ZControlToggle = InstanceType<typeof ZControlToggle>\n\n/* ===== DIALOGS ============================================================ */\n\nexport type ZConfirmDialog = InstanceType<typeof ZConfirmDialog>\nexport type ZDialog = InstanceType<typeof ZDialog>\nexport type ZProgressDialog = InstanceType<typeof ZProgressDialog>\n\n/* ===== FORMS ============================================================== */\n\nexport type ZForm = InstanceType<typeof ZForm>\nexport type ZFormHelper = InstanceType<typeof ZFormHelper>\nexport type ZInputGroup = InstanceType<typeof ZInputGroup>\n\n/* ===== INPUTS ============================================================= */\n\nexport type ZAddress = InstanceType<typeof ZAddress>\nexport type ZAutocomplete = InstanceType<typeof ZAutocomplete>\nexport type ZCountry = InstanceType<typeof ZCountry>\nexport type ZDate = InstanceType<typeof ZDate>\nexport type ZDateRange = InstanceType<typeof ZDateRange>\nexport type ZEan13 = InstanceType<typeof ZEan13>\nexport type ZLabel = InstanceType<typeof ZLabel>\nexport type ZNullableNumber = InstanceType<typeof ZNullableNumber>\nexport type ZNumber = InstanceType<typeof ZNumber>\nexport type ZPassword = InstanceType<typeof ZPassword>\nexport type ZPicker = InstanceType<typeof ZPicker>\nexport type ZSelect = InstanceType<typeof ZSelect>\nexport type ZString = InstanceType<typeof ZString>\nexport type ZTags = InstanceType<typeof ZTags>\nexport type ZText = InstanceType<typeof ZText>\nexport type ZTelephone = InstanceType<typeof ZTelephone>\n\n/* ===== OBJECTS ============================================================ */\n\nexport type ZHeader = InstanceType<typeof ZHeader>\nexport type ZObject = InstanceType<typeof ZObject>\nexport type ZObjectNew = InstanceType<typeof ZObjectNew>\n\n/* ===== OTHERS ============================================================= */\n\nexport type ZTable = InstanceType<typeof ZTable>\nexport type ZTag = InstanceType<typeof ZTag>\n\n/* ========================================================================== *\n * PLUGIN *\n * ========================================================================== */\n\n/* All our types */\nexport type * from './types'\n\n/* All our assets */\nexport { icons } from './assets/icons'\nexport { translations } from './assets/translations'\n\nexport function JuitWidgets(app: App, quasarConfig: QuasarPluginOptions = {}): void {\n // Opinionated defaults:\n if (! quasarConfig.config) quasarConfig.config = {}\n if (! quasarConfig.config.loading) quasarConfig.config.loading = {}\n // - loading delay: 500ms\n if (! quasarConfig.config.loading.delay) quasarConfig.config.loading.delay = 500\n // - no ripple (unless explicitly set)\n if (! quasarConfig.config.ripple) quasarConfig.config.ripple = false\n // - we need the \"Dialog\" plugin\n if (! quasarConfig.plugins) quasarConfig.plugins = {}\n if (! quasarConfig.plugins.Dialog) quasarConfig.plugins.Dialog = Dialog\n // - force our icon set\n if (! quasarConfig.iconSet) quasarConfig.iconSet = iconSet\n\n // Configure Quasar with our opinionated defaults\n app.use(Quasar, quasarConfig)\n\n // ===== COMPONENTS ==========================================================\n\n // buttons\n app.component('ZBtn', ZBtn)\n app.component('ZBtnDropdown', ZBtnDropdown)\n app.component('ZBtnGroup', ZBtnGroup)\n // controls\n app.component('ZControlDeleted', ZControlDeleted)\n app.component('ZControlDropdown', ZControlDropdown)\n app.component('ZControlReload', ZControlReload)\n app.component('ZControlSearch', ZControlSearch)\n app.component('ZControlSwitch', ZControlSwitch)\n app.component('ZControlToggle', ZControlToggle)\n // dialogs\n app.component('ZConfirmDialog', ZConfirmDialog)\n app.component('ZDialog', ZDialog)\n app.component('ZProgressDialog', ZProgressDialog)\n // forms\n app.component('ZForm', ZForm)\n app.component('ZFormHelper', ZFormHelper)\n app.component('ZInputGroup', ZInputGroup)\n // inputs\n app.component('ZAddress', ZAddress)\n app.component('ZAutocomplete', ZAutocomplete)\n app.component('ZCountry', ZCountry)\n app.component('ZDate', ZDate)\n app.component('ZDateRange', ZDateRange)\n app.component('ZEan13', ZEan13)\n app.component('ZLabel', ZLabel)\n app.component('ZNullableNumber', ZNullableNumber)\n app.component('ZNumber', ZNumber)\n app.component('ZPassword', ZPassword)\n app.component('ZPicker', ZPicker)\n app.component('ZSelect', ZSelect)\n app.component('ZString', ZString)\n app.component('ZTags', ZTags)\n app.component('ZText', ZText)\n app.component('ZTelephone', ZTelephone)\n // objects\n app.component('ZHeader', ZHeader)\n app.component('ZObject', ZObject)\n app.component('ZObjectNew', ZObjectNew)\n // others\n app.component('ZTable', ZTable)\n app.component('ZTag', ZTag)\n}\n\n/* ========================================================================== *\n * COMPOSABLES *\n * ========================================================================== */\n\nexport * from './composition/dialogs'\nexport * from './composition/validators'\n\n/* ========================================================================== *\n * EXTRAS *\n * ========================================================================== */\n\n/* Form stuff */\nexport * from './utils/form'\n/* Listicle stuff */\nexport * from './utils/listicle'\n/* Loader stuff */\nexport * from './utils/loader'\n/* Tables stuff */\nexport * from './utils/tables'\n/* Location query management */\nexport * from './utils/query'\n"],"names":["_useSlots","_openBlock","_createBlock","_unref","_mergeProps","$attrs","disable","color","textColor","flat","_renderSlot","label","_createElementBlock","_Fragment","tooltip","shrink","$q","editable","state","_useModel","ZFormHelper","readonly","bottomSlots","disabled","lazyRules","_withCtx","_createVNode","_normalizeClass","ZControlToggle","$t","email","regexp","maxLength","minLength","required","maximum","minimum","_hoisted_1","formProps","_hoisted_2","_createElementVNode","_hoisted_3","_toDisplayString","_hoisted_4","ZString","ZBtnGroup","_renderList","ZInputGroup","_a","_createTextVNode","miss","ZAutocomplete","ZSelect","ZNullableNumber","_normalizeStyle","country","_hoisted_7","_hoisted_9","JPageHeader","ZForm","JConfirmDialog","JProgressDialog","progress","$n","ZObjectHeader","_hoisted_5","_hoisted_6","ZListicle","$d","length","page","selected","selection","optional","props","TableHeader","onRowClick","onRowDblclick","onRowContextmenu","TableFooterPagination","TableFooterFullScreen","TableFooterColumns","TableFooterRows","object","ZControlDeleted","ZControlDropdown","ZControlReload","ZControlSearch","ZConfirmDialog","ZProgressDialog","ZCountry","ZDate","ZDateRange","ZEan13","ZNumber","ZPassword","ZPicker","ZTags","ZTelephone","ZObjectNew"],"mappings":";;;;;;;AAAA,MAAe,UAAA;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACV;AAAA,EACD,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACX;AAAA,EACD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EACR;AAAA,EACD,aAAa;AAAA,IACX,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS;AAAA,EACV;AAAA,EACD,eAAe;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACD,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,gBAAgB;AAAA,EACjB;AAAA,EACD,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,UAAU;AAAA,EACX;AAAA,EACD,UAAU;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,OAAO;AAAA,EACR;AAAA,EACD,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,EACb;AAAA,EACD,eAAe;AAAA,IACb,MAAM;AAAA,IACN,WAAW;AAAA,EACZ;AAAA,EACD,KAAK;AAAA,IACH,MAAM;AAAA,IACN,YAAY;AAAA,EACb;AAAA,EACD,OAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,EACR;AAAA,EACD,YAAY;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACP;AAAA,EACD,QAAQ;AAAA,IACN,MAAM;AAAA,EACP;AAAA,EACD,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,EACR;AAAA,EACD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACD,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACX;AAAA,EACD,MAAM;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACD,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,gBAAgB;AAAA,EACpB;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnFA,UAAM,OAAO,IAAkB;AAC/B,UAAM,SAAS;AACf,UAAM,SAASA,SAAA;AAEF,aAAA;AAAA,MACX,MAAM,MAAM;;AAAA,0BAAK,UAAL,mBAAY;AAAA;AAAA,MACxB,MAAM,MAAM;;AAAA,0BAAK,UAAL,mBAAY;AAAA;AAAA,MACxB,QAAQ,MAAA;;AAAM,0BAAK,UAAL,mBAAY;AAAA;AAAA,IAAO,CAClC;;AAhDC,aAAAC,UAAA,GAAAC,YA6BiBC,qBA7BjBC,WA6BiB;AAAA,iBA5BX;AAAA,QAAJ,KAAI;AAAA,MAAA;WACeC,KAAM;AAAA,WAAW;AAAA,eAAqB;AAAA;iBAAkD;AAAA,MAAA;QAO3G,qBAAA;AAAA,QACC,OAAOC,KAAAA,UAAU,SAAYC,KAAK;AAAA,QAClC,cAAYD,KAAAA,UAAU,SAAYE,KAAS;AAAA,QAC3C,OAAK,EAAA,kBAAsBF,KAAO,SAAA,cAAgBG,KAAI,KAAA;AAAA,MAAA;QAE5C,eACT,MAAyC;AAAA,UAA7B,OAAO,QAAnBC,WAAyC,KAAA,QAAA,SAAA,EAAA,KAAA,KAAA,QAAA,IAAA,IACpBC,KAAK,sBAA1BC,mBAEWC,UAAA,EAAA,KAAA,KAAA;AAAA,4CADNF,KAAK,KAAA,GAAA,CAAA;AAAA;UAEOG,KAAO,wBAAxBZ,YAEYC,MAAA,QAAA,GAAA;AAAA;YAFe,OAAO;AAAA,UAAA;6BAChC,MAAa;AAAA,8CAAVW,KAAO,OAAA,GAAA,CAAA;AAAA,YAAA;;;;yBAId,MAEW;AAAA,UAFK,OAAO,UACrBJ,WAAuB,KAAA,QAAA,WAAA,EAAA,KAAA,KAAA,QAAA,IAAA;UAGb,OAAO,UAAnBA,WAA6C,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,GAAA,QAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChBjD,UAAM,SAAS;AACf,UAAM,SAASV,SAAA;;AAbb,aAAAC,UAAA,GAAAC,YAEcC,kBAFdC,WAEc,QAFe,EAAA,YAAA,GAAU,CAAA,GAAA;AAAA,yBACrC,MAA6C;AAAA,UAAjC,OAAO,UAAnBM,WAA6C,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4CjD,UAAM,SAAS;AACf,UAAM,SAASV,SAAA;;AAzCb,aAAAC,UAAA,GAAAC,YA4BQC,aA5BRC,WA4BQ;AAAA,WA3BaC,KAAM;AAAA,WAAW;AAAA;gBAA8C;AAAA,iBAA0B;AAAA,MAAA;QAO3G,OAAOU,KAAAA,SAASC,KAAAA,GAAG,OAAO,GAAGD,WAAM,IAAIJ,KAAAA,QAAQ,SAAYA,KAAK;AAAA,QAChE,OAAOL,KAAAA,UAAU,SAAYC,KAAK;AAAA,QAClC,cAAYD,KAAAA,UAAU,SAAYE,KAAS;AAAA,QAC3C,OAAK;AAAA,4BAA4BF,KAAO;AAAA,wBAAsBG,KAAI;AAAA,4BAA4BA,KAAI,QAAA,CAAQF,KAAK,SAAA,CAAOC,KAAS;AAAA,QAAA;AAAA;yBAMhI,MAEY;AAAA,UAFKO,KAAAA,WAAaC,KAAE,GAAC,OAAO,GAAGD,KAAM,MAAA,kBAAjDb,YAEYC,MAAA,QAAA,GAAA;AAAA;YAF0C,OAAO;AAAA,UAAA;6BAC3D,MAAW;AAAA,8CAARQ,KAAK,KAAA,GAAA,CAAA;AAAA,YAAA;;gBAEYG,KAAO,qBAA7B,GAAAZ,YAEYC,MAAA,QAAA,GAAA;AAAA;YAFoB,OAAO;AAAA,UAAA;6BACrC,MAAa;AAAA,8CAAVW,KAAO,OAAA,GAAA,CAAA;AAAA,YAAA;;;UAGA,OAAO,UAAnBJ,WAA6C,KAAA,QAAA,WAAA,EAAA,KAAA,KAAA,QAAA,IAAA;UAC7B,OAAO,UACrBA,WAAuB,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,GAAA,QAAA,IAAA;;;;;;;;ACnC7B,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAgBJ,WAAW,SAAS,GAAG,EAAE,KAAK;AAGrC,MAAA,QAAQ,OAAO,OAAO;AAAA;AAAA,EAEjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA;AAAA,EAGR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA;AAAA,EAIT,OAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,MACH,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EAEJ;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,SAAS;AAAA;AAAA,EACX;AAAA;AAAA,EAGA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAEV,CAAU;AC1EV,MAAM,WAAW;AAAA,EACf,UAAU;AAAA,EAEV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAGA,MAAM,kBAAkB,OAAO,gBAAgB;AAC/C,MAAM,kBAAkB,OAAO,gBAAgB;AAC/C,MAAM,mBAAmB,OAAO,iBAAiB;AACjD,MAAM,qBAAqB,OAAO,mBAAmB;AACrD,MAAM,oBAAoB,OAAO,kBAAkB;AAG5C,MAAM,YAAY;AAAA;AAAA,EAEvB,aAAa;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW;AAAA,IACT,MAAM,CAAE,SAAS,MAAO;AAAA,IACxB,UAAU;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AAGO,MAAM,qBAAqB;AAAA,EAChC,GAAG;AAAA;AAAA;AAAA;AAAA,EAIH,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AAGO,SAAS,iBAAiB,OAAkC;AACzD,UAAA,iBAAiB,MAAM,MAAM,YAAY,OAAO,MAAM,WAAW,SAAS,QAAQ;AAClF,UAAA,iBAAiB,MAAM,MAAM,YAAY,OAAO,MAAM,WAAW,SAAS,QAAQ;AAClF,UAAA,kBAAkB,MAAM,MAAM,aAAa,OAAO,MAAM,YAAY,SAAS,SAAS;AACtF,UAAA,oBAAoB,MAAM,MAAM,eAAe,OAAO,MAAM,cAAc,SAAS,WAAW;AACxG;AAGO,SAAS,eAAe,OAAuF;AACpH,QAAM,WAAW,OAAqC,iBAAiB,MAAM,SAAS,QAAQ;AAC9F,QAAM,WAAW,OAAqC,iBAAiB,MAAM,SAAS,QAAQ;AAC9F,QAAM,YAAY,OAAsC,kBAAkB,MAAM,SAAS,SAAS;AAClG,QAAM,cAAc,OAAwC,oBAAoB,MAAM,SAAS,WAAW;AAE1G,QAAM,SAAS,SAAqB;AAAA,IAClC,UAAU;AAAA,IACV,cAAc;AAAA,IACd,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EAAA,CACd;AAED,QAAM,CAAE,MAAM,MAAM,UAAU,MAAM,MAAM,UAAU,QAAS,GAAG,CAAC,CAAE,WAAW,UAAU,SAAU,MAAM;AACtG,UAAM,eAAe,aAAa,OAAQ,aAAa,QAAS;AAC1DO,UAAAA,YAAW,aAAa,OAAO,QAAQ;AAC7C,QAAI,gBAAgB,OAAO,aAAc,QAAO,eAAe;AAC/D,QAAIA,aAAY,OAAO,SAAU,QAAO,WAAWA;AAAAA,EAAA,GAClD,EAAE,WAAW,MAAM;AAEhB,QAAA,CAAE,MAAM,MAAM,UAAU,QAAS,GAAG,CAAC,CAAE,WAAW,SAAU,MAAM;AACtE,UAAM,QAAQ,aAAa,OAAQ,aAAa,QAAS;AACzD,QAAI,SAAS,OAAO,SAAU,QAAO,WAAW;AAAA,EAAA,GAC/C,EAAE,WAAW,MAAM;AAEhB,QAAA,CAAE,MAAM,MAAM,WAAW,SAAU,GAAG,CAAC,CAAE,WAAW,SAAU,MAAM;AACxE,UAAM,QAAQ,aAAa,OAAQ,aAAa,QAAS;AACzD,QAAI,SAAS,OAAO,UAAW,QAAO,YAAY;AAAA,EAAA,GACjD,EAAE,WAAW,MAAM;AAEhB,QAAA,CAAE,MAAM,MAAM,aAAa,WAAY,GAAG,CAAC,CAAE,WAAW,SAAU,MAAM;AAC5E,UAAM,QAAQ,aAAa,OAAQ,aAAa,QAAS;AACzD,QAAI,SAAS,OAAO,YAAa,QAAO,cAAc;AAAA,EAAA,GACrD,EAAE,WAAW,MAAM;AAEf,SAAA;AACT;AAGO,SAAS,wBAAsC;AAC9C,QAAA,QAAQ,WAAoC,EAAE;AACpD,UAAQ,mBAAmB,KAAK;AAE1B,QAAA,QAAQ,IAAI,KAAK;AAEjB,QAAA,OAAO,CAACC,WAAU;AACtB,eAAW,SAAS,OAAO,OAAOA,MAAK,GAAG;AACxC,UAAI,MAAO;AACP,UAAA,MAAM,MAAO,OAAM,QAAQ;AAC/B;AAAA,IAAA;AAGF,QAAI,CAAE,MAAM,MAAO,OAAM,QAAQ;AAAA,EAAA,CAClC;AAEM,SAAA;AACT;AAGO,SAAS,eAAe,UAA+B;AACtD,QAAA,YAAY,OAAmD,mBAAmB,IAAI;AAC5F,MAAI,CAAE,UAAW;AAGX,QAAA,MAAM,KAAK,CAAE,GAAG,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAE,EAAE,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC9G,QAAM,UAAU,MAAM,UAAU,CAAC,UAAU;AACzC,QAAI,UAAU,MAAM,GAAG,MAAM,MAAO;AAC1B,cAAA,MAAM,GAAG,IAAI;AACvB,eAAW,SAAS;AAAA,EAAA,GACnB,EAAE,WAAW,MAAM;AAEtB,kBAAgB,MAAM;AACb,WAAA,UAAU,MAAM,GAAG;AAClB,YAAA;AAAA,EAAA,CACT;AACH;;;;;;ACpJA,UAAM,SAAS;AACT,UAAA,aAAa,eAAe,MAAM;AAK3B,aAAA;AAAA,MACX,YAAY,SAAS,MAAM,WAAW,QAAQ;AAAA,MAC9C,gBAAgB,SAAS,MAAM,WAAW,YAAY;AAAA,MACtD,aAAa,SAAS,MAAM,WAAW,SAAS;AAAA,MAChD,eAAe,SAAS,MAAM,WAAW,WAAW;AAAA,MACpD,YAAY,SAAS,MAAM,WAAW,QAAQ;AAAA,IAAA,CAC/C;;AAzBC,aAAAR,WAA2C,0DAAdP,MAAU,UAAA,CAAA,CAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6BzC,UAAM,SAAS;AA0BT,UAAA,SAASgB,SAGd,SAAA,YAAA;AAEK,UAAA,SAAS,SAAS,MAAM,OAAO,SAAU,CAAE,OAAO,QAAS,OAAO,KAAK;AAC7E,UAAM,WAAW,SAAS,MAAM,OAAO,WAAW,OAAO,IAAI;;0BA7D3DjB,YAiBgBkB,aAAA;AAAA,QAfb,UAAUC,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,MAAA;QAEtB,SAAAC,QAAA,CAPQ,UAAK;AAAA,UAObC,YAQE,MAAA;AAAA,YAPA,OAAA;AAAA,YACA,OAAKC,eAAA,CAAC,aAAW,EAAA,oBACa,OAAM,MAAA,CAAA,CAAA;AAAA,YACnC,SAAS,MAAM;AAAA,YACf,MAAM,OAAA,QAAS,QAAA,OAAO,SAAQ;AAAA,YAC9B,SAAS,QAAO;AAAA,YAChB,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,OAAM,QAAA,CAAK,OAAM;AAAA,UAAA;;;;;;;;;;;;;;;;;;;ACQzB,UAAA,UAAUR,SAGf,SAAA,YAAA;;0BA1BCjB,YAWE0B,aAAA;AAAA,oBAVS,QAAO;AAAA,qEAAP,QAAO,QAAA;AAAA,QACf,MAAMzB,MAAA,KAAA,EAAM,WAAW;AAAA,QACvB,SAAS,QAAO,QAAS0B,KAAE,GAAA,EAAA,IAAA,gBAAA,IAAA,uBAAA,IAA2DA,KAAE,GAAA,EAAA,IAAA,gBAAA,IAAA,qBAAA;AAAA,QAGxF,UAAUR,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BCVxBtB,YAoBgBkB,aAAA;AAAA,QAlBb,UAAUC,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,MAAA;QAEtB,SAAAC,QAAA,CAPQ,UAAK;AAAA,UAObC,YAWiB,cAAA;AAAA,YAVf,OAAA;AAAA,YACA,OAAKC,eAAA,CAAC,aAAW,EAAA,oBAGa,QAAM,OAAA,CAAA,CAAA;AAAA,YAFnC,MAAM,QAAI;AAAA,YACV,SAAS,MAAM;AAAA,YAEf,SAAS,QAAO;AAAA,UAAA;6BAEjB,MAES;AAAA,cAFTD,YAESvB,MAAA,KAAA,GAAA;AAAA,gBAFD,OAAA;AAAA,gBAAM,UAAA;AAAA,cAAA;iCACZ,MAAuB;AAAA,kBAAvBO,WAAuB,KAAA,QAAA,SAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;ACYzB,UAAA,UAAUS,SAGf,SAAA,YAAA;;0BAhCCjB,YAgBgBkB,aAAA;AAAA,QAdb,UAAUC,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,MAAA;QAEtB,SAAAC,QAAA,CAPQ,UAAK;AAAA,UAObC,YAOE,MAAA;AAAA,YANA,OAAA;AAAA,YACA,OAAM;AAAA,YACL,SAAS,MAAM;AAAA,YACf,MAAMvB,MAAK,KAAA,EAAC;AAAA,YACZ,SAAS0B,KAAE,GAAA,EAAA,IAAA,UAAA,IAAA,aAAA;AAAA,YACX,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,QAAO,QAAG,QAAO,QAAA;AAAA;;;;;;;ACbxB,MAAM,eAAe;AAAA,EAC1B,UAAU,EAAE,IAAI,UAAU,IAAI,SAAS;AAAA,EACvC,UAAU,EAAE,IAAI,UAAU,IAAI,YAAY;AAAA,EAC1C,QAAQ,EAAE,IAAI,QAAQ,IAAI,YAAY;AAAA,EACtC,YAAY,EAAE,IAAI,YAAY,IAAI,aAAa;AAAA,EAC/C,UAAU,EAAE,IAAI,UAAU,IAAI,UAAU;AAAA,EACxC,WAAW,EAAE,IAAI,WAAW,IAAI,mBAAmB;AAAA,EACnD,QAAQ,EAAE,IAAI,QAAQ,IAAI,aAAa;AAAA,EAEvC,QAAQ,EAAE,IAAI,QAAQ,IAAI,WAAW;AAAA,EACrC,WAAW,EAAE,IAAI,WAAW,IAAI,YAAY;AAAA,EAC5C,UAAU,EAAE,IAAI,UAAU,IAAI,aAAa;AAAA,EAE3C,eAAe,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,EACxC,kBAAkB,EAAE,IAAI,cAAc,IAAI,cAAc;AAAA,EACxD,mBAAmB,EAAE,IAAI,eAAe,IAAI,cAAc;AAAA,EAC1D,kBAAkB,EAAE,IAAI,cAAc,IAAI,cAAc;AAC1D;ACQO,SAAS,gBAA6B;AACrC,QAAA,EAAE,EAAE,IAAI,cAAc;AAE5B,WAAS,QAA4B;AAC5B,WAAA,SAASC,OAAM,OAAe;AACnC,aAAO,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE;AAAA,QAC5C,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,IACH;AAAA,EAAA;AAGF,WAAS,OAAO,QAAoC;AAC3C,WAAA,SAASC,QAAO,OAAe;AACpC,aAAO,CAAC,CAAC,MAAM,MAAM,MAAM,KAAK,EAAE;AAAA,QAChC,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,IACH;AAAA,EAAA;AAGF,WAAS,UAAU,QAAoC;AAC9C,WAAA,SAASC,WAAU,OAAe;AACnC,UAAA,MAAM,UAAU,OAAe,QAAA;AAEnC,aAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GACH,EAAE,OAAA,CAAQ;AAAA,IACf;AAAA,EAAA;AAGF,WAAS,UAAU,QAAoC;AAC9C,WAAA,SAASC,WAAU,OAAe;AACnC,UAAA,CAAC,MAAc,QAAA;AACf,UAAA,MAAM,UAAU,OAAe,QAAA;AAEnC,aAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GACH,EAAE,OAAA,CAAQ;AAAA,IACf;AAAA,EAAA;AAGF,WAAS,WAA+B;AAC/B,WAAA,SAASC,UAAS,OAAe;AAC9B,aAAA,CAAC,CAAE,SAAU,EAAE;AAAA,QACrB,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,IACH;AAAA,EAAA;AAGF,WAAS,QAAQ,KAAiC;AACzC,WAAA,SAASC,SAAQ,OAAe;AACjC,UAAA,SAAS,IAAY,QAAA;AACzB,aAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GACH,EAAE,IAAA,CAAK;AAAA,IACZ;AAAA,EAAA;AAGF,WAAS,QAAQ,KAAiC;AACzC,WAAA,SAASC,SAAQ,OAAe;AACjC,UAAA,SAAS,IAAY,QAAA;AACzB,aAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GACH,EAAE,IAAA,CAAK;AAAA,IACZ;AAAA,EAAA;AAGF,SAAO,EAAE,OAAO,QAAQ,WAAW,WAAW,UAAU,SAAS,QAAQ;AAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwEA,UAAM,aAAa,cAAc;AAGjC,UAAM,UAAU,IAAY;AAE5B,UAAM,UAAU,IAAsC;AAMtD,UAAM,SAAS;AAmIT,UAAA,SAASjB,SAId,SAAA,YAAA;AAGD,UAAM,QAAQ;AAUd,UAAM,SAASnB,SAAA;AAMT,UAAA,YAAY,IAAI,KAAK;AAErB,UAAA,SAAS,SAAS,MAAM;;AACxB,WAAA,aAAQ,UAAR,mBAAe,WAAmB,QAAA;AAClC,WAAA,aAAQ,UAAR,mBAAe,WAAmB,QAAA;AAC/B,aAAA;AAAA,IAAA,CACR;AAED,UAAM,YAAY,SAAS,MAAM,OAAO,UAAU,UAAU;AAC5D,UAAM,YAAY,SAAS,MAAM,OAAO,UAAU,UAAU;AAC5D,UAAM,YAAY,SAAS,MAAM,OAAO,UAAU,UAAU;AAE5D,aAAS,QAAQ,OAAsC;AACrD,UAAI,SAAS,OAAO,UAAU,WAAW,OAAO,KAAK,IAAK,SAAS;AAE/D,UAAA,CAAE,OAAO,IAAK,UAAS,OAAO,OAAO,WAAW,QAAQ,GAAG;AAC/D,UAAI,WAAW,OAAO,MAAO,QAAO,QAAQ;AAAA,IAAA;AAIxC,UAAA,WAAW,SAAS,MAAM;AAC1B,UAAA,CAAE,OAAO,QAAgB,QAAA;AACzB,UAAA,CAAE,OAAO,MAAc,QAAA;AAI3B,aAAO,MAAM;;AACX,sBAAQ,UAAR,mBAAe;AACf,qBAAO,YAAP;AAAA,MACF;AAAA,IAAA,CACD;AAKY,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,6BAAQ,UAAR,mBAAe;AAAA;AAAA;AAAA,MAE5B,iBAAiB,MAAM;;AAAA,6BAAQ,UAAR,mBAAe;AAAA;AAAA;AAAA,MAEtC,UAAU,MAAA;;AAAM,8BAAQ,UAAR,mBAAe,eAAc;AAAA;AAAA;AAAA,MAE7C,UAAU,SAAS,MAAM;;AAAA,8BAAQ,UAAR,mBAAe,aAAY;AAAA,OAAK;AAAA;AAAA,MAEzD,UAAU,SAAS,MAAA;;AAAM,6BAAQ,UAAR,mBAAe;AAAA,OAA4B;AAAA;AAAA,MAEpE,YAAY;AAAA;AAAA,MAEZ,YAAY;AAAA;AAAA,MAEZ,YAAY;AAAA;AAAA,MAEZ,UAAU,SAAS,MAAM,UAAU,SAAS,UAAU,KAAK;AAAA,IAAA,CAC5D;AAKK,UAAA,SAAS,SAAS,MAAM;AAC5B,YAAM,QAA0B,CAAC;AAGjC,UAAI,OAAO,SAAU,OAAM,KAAK,WAAW,UAAU;AAEjD,UAAA,OAAO,YAAY,EAAG,OAAM,KAAK,WAAW,UAAU,OAAO,SAAS,CAAC;AAErE,YAAA,KAAK,GAAG,OAAO,KAAK;AAE1B,UAAI,MAAM,WAAW,EAAS,OAAA,KAAK,MAAM,IAAI;AAEtC,aAAA;AAAA,IAAA,CACR;AAGK,UAAA,CAAE,WAAW,MAAO,GAAG,MAAA;;AAAM,2BAAQ,UAAR,mBAAe;AAAA,KAAiB;AAGnE,mBAAe,MAAM;;AACf,WAAA,aAAQ,UAAR,mBAAe,SAAiB,QAAA;AACpC,UAAI,OAAO,SAAiB,QAAA,CAAC,CAAE,OAAO;AAC/B,aAAA;AAAA,IAAA,CACR;AAKD,UAAM,iBAAiB,CAAC,UAAsB,KAAK,MAAM,eAAe,KAAK;AAC7E,UAAM,UAAU,CAAC,UAAsB,KAAK,MAAM,QAAQ,KAAK;AAC/D,UAAM,WAAW,CAAC,UAAsB,KAAK,MAAM,SAAS,KAAK;AACjE,UAAM,WAAW,CAAC,UAAiB,KAAK,MAAM,SAAS,KAAmB;AAC1E,UAAM,aAAa,CAAC,UAAyB,KAAK,MAAM,WAAW,KAAK;AACxE,UAAM,WAAW,CAAC,UAAyB,KAAM,MAAM,SAAS,KAAK;AAGrE,aAAS,SAAS,OAAyB;;AACzC,UAAI,UAAU,MAAc,cAAA,YAAA,gCAAU;AAAA,IAAqB;AAI7D,aAAS,gBAAgB,OAA4B;AAC/C,UAAA,CAAE,OAAO,QAAS;AACtB,YAAM,EAAE,KAAK,QAAQ,SAAS,SAAS,aAAa;AAChD,UAAA,UAAU,WAAW,WAAW,SAAU;AAC9C,UAAI,QAAQ,SAAU;AACtB,aAAO,QAAQ;AACf,YAAM,eAAe;AAAA,IAAA;AAIvB,UAAM,oBAAoB,MAAM,MAAM,UAAU,QAAQ;AACxD,UAAM,mBAAmB,MAAM,MAAM,UAAU,QAAQ;AAGvD,aAAS,mBAAmB,SAA8C;AACxE,UAAI,CAAE,QAAS;AAGP,cAAA,iBAAiB,SAAS,iBAAiB;AAC3C,cAAA,iBAAiB,QAAQ,gBAAgB;AAEzC,cAAA,iBAAiB,eAAe,cAAc;AAC9C,cAAA,iBAAiB,QAAQ,OAAO;AAChC,cAAA,iBAAiB,SAAS,QAAQ;AAClC,cAAA,iBAAiB,SAAS,QAAQ;AAClC,cAAA,iBAAiB,SAAS,QAAQ;AAClC,cAAA,iBAAiB,WAAW,UAAU;AACtC,cAAA,iBAAiB,SAAS,QAAQ;AAIlC,cAAA,iBAAiB,WAAW,eAAe;AAAA,IAAA;AAIrD,aAAS,sBAAsB,SAA8C;AAC3E,UAAI,CAAE,QAAS;AAEP,cAAA,oBAAoB,SAAS,iBAAiB;AAC9C,cAAA,oBAAoB,QAAQ,gBAAgB;AAE5C,cAAA,oBAAoB,eAAe,cAAc;AACjD,cAAA,oBAAoB,QAAQ,OAAO;AACnC,cAAA,oBAAoB,SAAS,QAAQ;AACrC,cAAA,oBAAoB,SAAS,QAAQ;AACrC,cAAA,oBAAoB,SAAS,QAAQ;AACrC,cAAA,oBAAoB,WAAW,UAAU;AACzC,cAAA,oBAAoB,SAAS,QAAQ;AAErC,cAAA,oBAAoB,WAAW,eAAe;AAAA,IAAA;AAIxD,cAAU,MAAM;AACd,UAAI,CAAE,QAAQ,MAAa,OAAA,IAAI,MAAM,eAAe;AACpD,UAAI,CAAE,QAAQ,MAAa,OAAA,IAAI,MAAM,oBAAoB;AAGzD,YAAM,MAAM;;AAAA,6BAAQ,UAAR,mBAAe;AAAA,SAAU,CAAC,YAAY,eAAe;AAE/D,8BAAsB,UAA8B;AACpD,2BAAmB,UAA8B;AAE7C,YAAA,WAAuB,YAAA,YAAY,OAAO;AAAA,MAAA,GAC7C,EAAE,WAAW,MAAM;AAAA,IAAA,CACvB;AAGD,oBAAgB,MAAA;;AAAM,oCAAsB,aAAQ,UAAR,mBAAe,QAA4B;AAAA,KAAC;;AAzftF,aAAAC,UAAA,GAAAW,mBAgHM,OAhHNyB,cAgHM;AAAA,QA/GJX,YA8GgBN,aAAA;AAAA,mBA7GV;AAAA,UAAJ,KAAI;AAAA,UAEH,gBAAcE,KAAW;AAAA,UACzB,UAAUC,KAAQ;AAAA,UAClB,UAAUN,KAAQ;AAAA,UAClB,cAAYO,KAAS;AAAA,UACrB,UAAUH,KAAQ;AAAA,QAAA;UAEnB,SAAAI,QAAA,CAPQa,eAAS;AAAA,YAOjBZ,YAoGUvB,MAAA,MAAA,GAAA;AAAA,uBAnGJ;AAAA,cAAJ,KAAI;AAAA,cAEJ,OAAA;AAAA,cACA,UAAA;AAAA,cACA,eAAA;AAAA,cACA,iBAAA;AAAA,cAEC,iCAAkB,OAAM,KAAA,EAAA;AAAA,cACxB,eAAW;AAAA,wBAAuB,UAAS,SAAI,QAAO,UAAA,YAAgB;AAAA;;;cAKtE,MAAM,QAAI;AAAA,cACV,OAAO,QAAK;AAAA,cACZ,aAAc,UAAA,QAAY,QAAA,cAAc;AAAA,cACxC,MAAM,UAAA,QAAY,QAAA,OAAO;AAAA,cACzB,SAAU,UAAS,SAAImC,WAAU,cAAgB,QAAS,YAAA,IAAA;AAAA,cAC1D,WAAY,UAAS,SAAK,oBAAkB,IAAA,QAAA,YAAY;AAAA,cACxD,gBAAcA,WAAU;AAAA,cACxB,qBAAiB,CAAIA,WAAU;AAAA,cAC/B,cAAYA,WAAU;AAAA,cACtB,UAAU,QAAQ;AAAA,cAClB,UAAU,UAAS,SAAI,QAAc;AAAA,cACrC,SAAS,UAAS;AAAA,cAClB,OAAO,OAAM;AAAA,cACb,QAAQ,QAAM;AAAA,cACf,OAAA,EAAmB,SAAA,OAAA;AAAA,cAElB,eAAa,OAAM;AAAA,cACnB,uBAAoB;AAAA,YAAA;cAQV,gBACT,MAqBW;;AAAA;AAAA,kBArBK,UAAS,sBAAzB1B,mBAqBWC,UAAA,EAAA,KAAA,KAAA;AAAA,sBAlBD,aAAA,UAAA,mBAAS,0BADjBX,YAIEC,MAAA,KAAA,GAAA;AAAA;sBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,sBACb,OAAM;AAAA,oBAAA;oBAKA,QAAA,aAAe,OAAM,sBAD7BD,YAIEC,MAAA,KAAA,GAAA;AAAA;sBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,sBACb,OAAM;AAAA,6CAIK,SAAQ,sBADrBD,YAKEC,MAAA,KAAA,GAAA;AAAA;sBAHC,MAAMA,MAAK,KAAA,EAAC;AAAA,sBACb,OAAM;AAAA,sBACL,SAAO,SAAQ;AAAA,oBAAA;;kBAKJ,QAAI,qBAApBS,mBA+BWC,UAAA,EAAA,KAAA,KAAA;AAAA,oBA7BO,QAAW,eAAIyB,WAAU,yBAAzC1B,mBAOWC,UAAA,EAAA,KAAA,KAAA;AAAA,sBALD,QAAI,qBADZX,YAKEC,MAAA,KAAA,GAAA;AAAA;wBAHA,OAAM;AAAA,wBACL,MAAM,QAAI;AAAA,wBACV,uBAAY,QAAW,aAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;8BAKP,QAAI,QAAA,CAAOmC,WAAU,6BAA1C1B,mBAeWC,UAAA,EAAA,KAAA,KAAA;AAAA,6BAZO,QAAI,SAAA,yBADpBD,mBAOI,KAAA;AAAA;wBALD,MAAM,QAAI;AAAA,wBACX,OAAM;AAAA,wBACL,uBAAY,MAA2D;AAAA,wBAAA,GAAA,CAAA,MAAA,CAAA;AAAA,sBAAA;wBAE1D,QAAI,qBAAlBV,YAAmEC,MAAA,KAAA,GAAA;AAAA;0BAA/C,OAAM;AAAA,0BAA2B,MAAM,QAAI;AAAA,wBAAA;wDAIjE,GAAAD,YAEcC,MAAA,UAAA,GAAA;AAAA;wBAFO,IAAI,QAAI;AAAA,wBAAE,OAAM;AAAA,sBAAA;yCACnC,MAAmE;AAAA,0BAArD,QAAI,qBAAlBD,YAAmEC,MAAA,KAAA,GAAA;AAAA;4BAA/C,OAAM;AAAA,4BAA2B,MAAM,QAAI;AAAA,0BAAA;;;;4CAKnED,YAA6CC,MAAA,KAAA,GAAA;AAAA;sBAA9B,OAAM;AAAA,sBAAU,MAAM,QAAI;AAAA;;kBAI/B,OAAO,SAAnBO,WAA8D,0DAAb,GAAA4B,UAAS,CAAA,GAAA,QAAA,IAAA;;;+BAhE5D,MAGM;AAAA,gBAHK,OAAA,SAAU,QAAM,UAA3BrC,aAAAW,mBAGM,OAHN2B,cAGM;AAAA,kBAFJC,mBAAiD,QAAjDC,cAAiDC,gBAAhB,OAAM,KAAA,GAAA,CAAA;AAAA,kBACvCF,mBAAkD,QAAlDG,cAAkDD,gBAAhB,QAAM,MAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACElD,UAAM,aAAa,cAAc;AAGjC,UAAM,SAAS,IAAgC;AAM/C,UAAM,SAAS;AA+FT,UAAA,SAASvB,SAId,SAAA,YAAA;AAGD,UAAM,SAASnB,SAAA;AAKT,UAAA,SAAS,SAAS,MAAM;AAC5B,YAAM,QAA8B,CAAC;AACjC,UAAA,OAAO,YAAY,EAAG,OAAM,KAAK,WAAW,UAAU,OAAO,SAAS,CAAC;AACrE,YAAA,KAAK,GAAG,OAAO,KAAK;AACnB,aAAA;AAAA,IAAA,CACR;AAKY,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAE3B,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAA;;AAAM,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA,IAAA,CACzD;AAGD,cAAU,MAAM;AACd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAAA,IAAA,CACnD;;AA5LC,aAAAC,UAAA,GAAAC,YAiCS,OAjCTE,WAiCS;AAAA,iBAhCH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,oBACL,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QAEf,MAAK;AAAA,QACJ,MAAM,QAAI;AAAA,QAEV,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,QAAQ,QAAM;AAAA,QACd,QAAQ,QAAM;AAAA,QAEd,UAAU,QAAQ;AAAA,QAClB,cAAY,QAAS;AAAA,QACrB,OAAO,OAAM;AAAA,QACb,cAAYG,KAAS;AAAA,QAErB,+CAAO,OAAM,QAAA;AAAA;QAEE,OAAO;gBAAS;AAAA,UAC9B,IAAAC,QAAA,CADsCa,eAAS;AAAA,YAC/C5B,WAAyC,yDAAb4B,UAAS,CAAA,CAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;;;ACR3C,UAAM,WAAW,IAAkC;AAM7C,UAAA,QAAQnB,SAGb,SAAA,YAAA;AAGY,aAAA;AAAA;AAAA,MAEX,OAAO,MAAA;;AAAM,8BAAS,UAAT,mBAAgB;AAAA;AAAA,IAAM,CACpC;AAGD,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,eAAe;AAAA,IAAA,CACtD;;0BA3CCjB,YAYE0C,aAAA;AAAA,iBAXI;AAAA,QAAJ,KAAI;AAAA,oBACK,MAAK;AAAA,qEAAL,MAAK,QAAA;AAAA,QACb,UAAU;AAAA,QACV,OAAOf,KAAAA,GAAG1B,MAAA,YAAA,EAAa,MAAM;AAAA,QAC7B,MAAMA,MAAK,KAAA,EAAC;AAAA,QAEZ,UAAUkB,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA;;;;;;;;;;;;;;;;;;;;;;;;ACkCpB,UAAA,QAAQL,SAIb,SAAA,YAAA;;0BAjDCjB,YAuBgBkB,aAAA;AAAA,QArBb,UAAUC,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,MAAA;QAEtB,SAAAC,QAAA,CAPQ,UAAK;AAAA,UAObC,YAccmB,aAAA,EAdD,OAAM,qBAAiB;AAAA,6BAEhC,MAAyB;AAAA,gCAD3BjC,mBAYEC,UAAA,MAAAiC,WAXiB,QAAO,SAAA,CAAjB,WAAM;oCADf5C,YAYE,MAAA;AAAA,kBAVC,KAAK,OAAO;AAAA,kBACb,OAAA;AAAA,kBACA,uBAAM,aAAW,EAAA,oBAEa,gBAAU,OAAO,MAAK,CAAA,CAAA;AAAA,kBADpD,OAAA,EAA2B,gBAAA,OAAA;AAAA,kBAE1B,MAAM,OAAO;AAAA,kBACb,SAAS,MAAM;AAAA,kBACf,SAAS,OAAO;AAAA,kBAEhB,SAAO,CAAA,WAAA,MAAA,QAAS,MAAA,UAAU,OAAO,QAAS,SAAY,OAAO;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6BtE,UAAM,EAAE,WAAW,YAAY,eAAA,IAAmB,yBAAyB;AAkCrE,UAAA,QAAQiB,SAIb,SAAA,YAAA;AAGD,UAAM,OAAO;AAUA,aAAA;AAAA,MACX,MAAM,MAAM;;AAAA,+BAAU,UAAV,mBAAiB;AAAA;AAAA,MAC7B,OAAO,MAAM;;AAAA,+BAAU,UAAV,mBAAiB;AAAA;AAAA,MAC9B,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,CACT;;0BAzGCjB,YA+BWC,MAAA,OAAA,GAAA;AAAA,iBA9BL;AAAA,QAAJ,KAAI;AAAA,oBACK,MAAK;AAAA,qEAAL,MAAK,QAAA;AAAA,QACb,YAAY,QAAU;AAAA,QACtB,cAAY,qBAAaa,KAAAA,GAAG,OAAO,GAAG;AAAA,QACtC,eAAa,QAAU;AAAA,QACvB,8CAAM,KAAI,MAAA;AAAA,QACV,8CAAM,KAAI,MAAA;AAAA,MAAA;yBAEX,MAqBS;AAAA,UArBTU,YAqBSvB,MAAA,KAAA,GAAA;AAAA,YArBD,OAAM;AAAA,YAAmB,+BAAgB,QAAI,OAAA,SAAA,KAAA,CAAA;AAAA,UAAA;6BACnD,MAeiB;AAAA,cAfjBuB,YAeiBvB,MAAA,YAAA,GAAA;AAAA,gBAfD,YAAA;AAAA,gBAAW,OAAM;AAAA,cAAA;iCAC/B,MAEM;AAAA,kBAFNqC,mBAEM,OAFNH,cAEMK,gBADD,QAAK,KAAA,GAAA,CAAA;AAAA,mBAEG,QAAU,cAAvBzC,UAAA,GAAAW,mBAUM,OAVN2B,cAUM;AAAA,oBATJb,YAQiBvB,MAAA,YAAA,GAAA;AAAA,sBARD,UAAA;AAAA,sBAAS,OAAM;AAAA,oBAAA;uCAC7B,MAME;AAAA,wBANFuB,YAMEvB,MAAA,KAAA,GAAA;AAAA,0BALA,MAAK;AAAA,0BACL,OAAM;AAAA,0BACN,OAAM;AAAA,0BACL,MAAMA,MAAK,KAAA,EAAC;AAAA,0BACZ,SAAOA,MAAc,cAAA;AAAA;;;;;;;;cAM9BuB,YAAevB,MAAA,UAAA,CAAA;AAAA,cAEfO,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACcvB,UAAA,EAAE,EAAE,IAAI,cAAc;AA8C5B,UAAM,QAAQV,SAAA;AAId,UAAM,SAAS,IAAkC;AAGjD,UAAM,OAAO;AAMA,aAAA;AAAA,MACX,MAAM,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC1B,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC3B,SAAS,CAAC,UAAgB;;AAAA,4BAAO,UAAP,mBAAc,QAAQ;AAAA;AAAA,MAChD,QAAQ,MAAA;;AAAM,4BAAO,UAAP,mBAAc;AAAA;AAAA,IAAO,CACpC;;0BA3GCE,YA6BW,SAAA;AAAA,iBA5BL;AAAA,QAAJ,KAAI;AAAA,QACJ,YAAA;AAAA,QACC,OAAO,QAAK;AAAA,QACZ,MAAE,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,MAAO,MAAM;AAAA,QACrB,8CAAM,KAAI,MAAA;AAAA,QACV,8CAAM,KAAI,MAAA;AAAA,MAAA;yBAEX,MAA6B;AAAA,UAAjB,MAAM,UAAlBQ,WAA6B,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA,kBAC7BR,YAEiBC,MAAA,YAAA,GAAA,EAAA,KAAA,KAAA;AAAA,6BADf,MAAa;AAAA,8CAAV,QAAO,OAAA,GAAA,CAAA;AAAA,YAAA;;;UAGZuB,YAeiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,6BAdf,MAME;AAAA,cANFuB,YAME,MAAA;AAAA,gBALA,OAAM;AAAA,gBACL,OAAO,QAAM,UAAIvB,MAAC,CAAA,EAAA,EAAA,IAAA,UAAA,IAAA,aAAA;AAAA,gBAClB,MAAM,QAAU;AAAA,gBAChB,OAAO,QAAW;AAAA,gBAClB,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE;;AAAA,sCAAM,UAAN,mBAAQ;AAAA;AAAA,cAAM;cAExBuB,YAME,MAAA;AAAA,gBALA,OAAM;AAAA,gBACL,OAAO,QAAO,WAAIvB,MAAC,CAAA,EAAA,EAAA,IAAA,WAAA,IAAA,cAAA;AAAA,gBACnB,MAAM,QAAW;AAAA,gBACjB,OAAO,QAAY;AAAA,gBACnB,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE;;AAAA,sCAAM,UAAN,mBAAQ;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACclB,UAAA,EAAE,EAAE,IAAI,cAAc;AAI5B,UAAM,SAAS;AA2BT,UAAA,YAAY,IAAI,KAAK;AAC3B,UAAM,UAAU,IAAkC;AAElD,aAAS,UAAgB;AACnB,UAAA,CAAC,OAAO,SAAU;AACtB,gBAAU,QAAQ;AAClB,aAAO,SAAS;AAAA,IAAA;AAGZ,UAAA,YAAY,SAAS,MAAM;AAC3B,UAAA,OAAO,MAAc,QAAA,GAAG,OAAO,WAAW,CAAC,MAAM,OAAO,KAAK;AACjE,aAAO,GAAG,KAAK,MAAM,OAAO,WAAW,GAAG,CAAC;AAAA,IAAA,CAC5C;AAEK,UAAA,YAAY,SAAS,MAAM;AAC/B,UAAI,OAAO,MAAO,QAAO,OAAO,YAAY,OAAO,QAAQ;AAC3D,aAAO,OAAO;AAAA,IAAA,CACf;AAGD,UAAM,QAAQ;AAKD,aAAA;AAAA,MACX,MAAM,MAAM;;AAAA,6BAAQ,UAAR,mBAAe;AAAA;AAAA,MAC3B,MAAM,MAAA;;AAAM,6BAAQ,UAAR,mBAAe;AAAA;AAAA,IAAO,CACnC;;0BAnGCD,YA0BW,SAAA;AAAA,iBAzBL;AAAA,QAAJ,KAAI;AAAA,QACJ,YAAA;AAAA,QACC,OAAO,QAAK;AAAA,QACZ,8CAAM,MAAK,MAAA;AAAA,QACX,8CAAM,MAAK,MAAA;AAAA,MAAA;yBAEZ,MAGiB;AAAA,UAHjBwB,YAGiBvB,MAAA,YAAA,GAAA,EAHD,OAAM,sCAAkC;AAAA,6BACtD,MAAwB;AAAA,cAAxBqC,mBAAwB,6BAAhB,QAAO,OAAA,GAAA,CAAA;AAAA,cACfA,mBAA0B,6BAAlB,UAAS,KAAA,GAAA,CAAA;AAAA,YAAA;;;UAGnBd,YAEiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,6BADf,MAAyD;AAAA,cAAzDuB,YAAyDvB,MAAA,eAAA,GAAA;AAAA,gBAAtC,oBAAA;AAAA,gBAAkB,OAAO,UAAS;AAAA,cAAA;;;;UAGjC,QAAQ,yBAA9BD,YASiBC,MAAA,YAAA,GAAA,EAAA,KAAA,KAAA;AAAA,6BARf,MAOE;AAAA,cAPFuB,YAOE,MAAA;AAAA,gBANA,OAAM;AAAA,gBACN,OAAM;AAAA,gBACL,OAAOvB,MAAC,CAAA,EAAA,EAAA,IAAA,UAAA,IAAA,aAAA;AAAA,gBACR,MAAMA,MAAK,KAAA,EAAC;AAAA,gBACZ,SAAS,UAAS;AAAA,gBAClB,+CAAO,QAAO;AAAA;;;;;;;;;;;;;;;ACTvB,UAAM,SAAS;AAQf,qBAAiB,MAAM;AAGvB,QAAI,WAA2B;AAI/B,UAAM,MAAM,OAAO,UAAU,CAAC,aAAa;AACrC,UAAA,SAAiB,QAAA,WAAW,SAAS;AACzC,eAAS,MAAM;AACb,YAAI,oBAAoB,aAAa;AACnC,mBAAS,MAAM;AACJ,qBAAA;AAAA,QAAA;AAAA,MACb,CACD;AAAA,IAAA,CACF;AAEY,aAAA;AAAA;AAAA,MAEX,SAAS,sBAAsB;AAAA,IAAA,CAChC;;AA1CC,aAAAO,WAAuC,0DAAVL,KAAM,MAAA,CAAA,CAAA;AAAA;;;;;;;;;;;;;AC2BrC,UAAM,SAAS,IAAW;AAE1B,UAAM,WAAW,IAAsC;AAMvD,UAAM,SAAS;AAOf,UAAM,SAASL,SAAA;AAKT,UAAA,cAAc,SAAS,OAAO;AAAA,MAClC,GAAG;AAAA,MACH,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IAAA,EACX;AAEW,aAAA;AAAA,MACX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC3B,UAAU,CAAC,gBAAsC,OAAO,QACpD,OAAO,MAAM,SAAS,WAAW,IACjC,QAAQ,OAAO,IAAI,MAAO,UAAW,CAAC;AAAA,MAC1C,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MACrC,QAAQ,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC5B,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC3B,yBAAyB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA,MAC7C,SAAS,SAAS,MAAA;;AAAM,+BAAS,UAAT,mBAAgB,YAAW;AAAA,OAAK;AAAA,IAAA,CACzD;AAKD,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,oBAAoB;AAAA,IAAA,CAC3D;;0BAxECE,YAagB6C,aAAA;AAAA,iBAZV;AAAA,QAAJ,KAAI;AAAA,QACH,UAAU9B,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,QACrB,gBAAcF,KAAW;AAAA,MAAA;yBAE1B,MAKS;AAAA,UALTI,YAKSvB,cALTC,WAKS;AAAA,qBALG;AAAA,YAAJ,KAAI;AAAA,UAAA,GAAsB,EAAA,GAAA,YAAA,UAAgBC,KAAM,OAAA,CAAA,GAAA;AAAA,6BAEtD,MAA+C;AAAA,wCAA/CmC,mBAA+C,UAAA;AAAA,gBAAvC,MAAK;AAAA,gBAAS,OAAA,EAAsB,WAAA,OAAA;AAAA,cAAA;cAEhC,OAAO,UAAnB9B,WAA6C,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;;;;ACGnD,SAAS,OAAO,QAAuC;AAC/C,QAAA,WAAW,IAAI,CAAC;AAGhB,QAAA,UAAU,SAAS,OAAM,iCAAQ,QAAQ,UAAU,SAAS,QAAQ,CAAE;AAG5E,iBAAe,KAAQ,UAA4C;AACxD,aAAA;AACL,QAAA;AACF,aAAO,MAAM,SAAS;AAAA,IAAA,UACtB;AACS,eAAA;AAAA,IAAA;AAAA,EACX;AAIK,SAAA,EAAE,SAAS,KAAK;AACzB;AAGA,MAAM,aAAa,OAAO;AAKnB,SAAS,YAAqB;AAC5B,SAAA;AACT;AAaO,SAAS,aAAa,UAA6B;AACjD,SAAA,OAAO,WAAW,SAAY,UAAU;AACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwDA,UAAM,aAAa,cAAc;AAGjC,UAAM,WAAW,IAAa;AAM9B,UAAM,SAAS;AA0Ef,UAAM,SAASV,SAAA;AAKT,UAAA,SAASmB,SAId,SAAA,YAAA;AAED,UAAM,QAAQ;AAKD,aAAA;AAAA;AAAA,MAEX,OAAO,MAAA;;AAAM,8BAAS,UAAT,mBAAgB;AAAA;AAAA,IAAM,CACpC;AAKK,UAAA,WAAW,WAA+B,EAAE;AAG5C,UAAA,SAAS,SAAS,MAAM;AAC5B,YAAM,QAA8B,CAAC;AAGrC,UAAI,OAAO,SAAU,OAAM,KAAK,WAAW,UAAU;AAEjD,UAAA,OAAO,YAAY,EAAG,OAAM,KAAK,WAAW,UAAU,OAAO,SAAS,CAAC;AAErE,YAAA,KAAK,GAAG,OAAO,KAAK;AAEnB,aAAA,CAAE,CAAC,UAAgC;AACxC,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,MAAK,+BAAO,UAAS,EAAE;AAClC,cAAA,OAAO,WAAW,SAAiB,QAAA;AACnC,cAAA,WAAW,MAAc,QAAA;AAAA,QAAA;AAExB,eAAA;AAAA,MAAA,CACP;AAAA,IAAA,CACH;AAKD,UAAM,YAAY,WAAgC,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,IAAI,MAAS;AAIzH,aAAS,YAAY,QAAuB;;AAE1C,gBAAU,QAAQ;AAClB,aAAO,QAAQ,OAAO;AAGtB,qBAAe,OAAO;AAGtB,qBAAS,UAAT,mBAAgB;AAChB,eAAS,QAAQ,CAAC;AAGlB,YAAM,YAAY,MAAM;AAAA,IAAA;AAMpB,UAAA,QAAQ,CAAC,UAAU;;AACd,qBAAA,UAAA,mBAAO,iBAAiB,OAAO;AACxC,UAAI,MAAiB,WAAA,QAAQ,EAAE,OAAO,OAAO,MAAM;AAAA,eAC1C,UAAU,MAAO,WAAU,QAAQ;AAAA,IAAA,GAC3C,EAAE,WAAW,MAAM;AAGtB,aAAS,cAAc,OAAqB;;AAC1C,cAAQ,MAAM,KAAA,EAAO,QAAQ,QAAQ,GAAG;AAGpC,UAAA,UAAU,OAAO,MAAO;AAC5B,aAAO,QAAQ;AAGf,qBAAS,UAAT,mBAAgB;AAKV,YAAA,QAAQ,SAAS,MAAM,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK;AAChE,UAAA,CAAE,MAAO,eAAc,KAAK;AAAA,IAAA;AAOlC,aAAS,eAAqB;AAC5B,eAAS,QAAQ,CAAC;AAAA,IAAA;AAIpB,aAAS,eAAqB;;AAC5B,UAAI,GAAE,oBAAS,UAAT,mBAAgB,YAAhB,mBAAyB,QAAQ;AAC9B,qBAAA,UAAA,mBAAO,eAAe;AACtB,qBAAA,UAAA,mBAAO,oBAAoB,GAAG;AAAA,IAAI;AAc7C,aAAS,UAAU,OAA4B;AACzC,UAAA,CAAE,SAAS,MAAO;AAGtB,UAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,OAAQ;AAGlE,UAAA,MAAM,SAAS,UAAU;AAE3B,YAAI,SAAS,MAAM,SAAS,EAAG,UAAS,MAAM,UAAU;AAAA,oBAC5C,QAAQ;AAGpB,iBAAS,MAAM,UAAU;AACzB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MAAA;AAAA,IACxB;AAMF,UAAM,EAAE,MAAM,YAAY,aAAa,IAAI;AAAA,IAM3C,MAAM,cAAc;AAAA,MAGlB,YAA4B,MAAc;AAFlC,yCAAY;AAEQ,aAAA,OAAA;AAEjB,iBAAA,MAAM,KAAK,YAAY;;AAK9B,cAAI,KAAK,UAAW;AAGpB,gBAAM,UAAU,OAAO,MAAM,OAAO,eAAe,IAAI,IAAI,CAAC;AAC5D,gBAAM,UAAU,OAAO,OAAO,QAAQ,IAAI,CAAC,WAAW;AAChD,gBAAA,OAAO,WAAW,SAAU,QAAO,EAAE,OAAO,QAAQ,OAAO,OAAO;AAC/D,mBAAA;AAAA,UAAA,CACR,CAAC;AAIF,cAAI,KAAK,UAAW;AAKpB,cAAI,QAAQ,WAAW,EAAG,gBAAS,UAAT,mBAAgB;AAC1C,mBAAS,QAAQ;AAGR,mBAAA,MAAA;;AAAM,2BAAA6B,MAAA,SAAS,UAAT,gBAAAA,IAAgB,YAAhB,mBAAyB,aAAU,cAAS,UAAT,mBAAgB;AAAA,WAAW;AAAA,QAAA,CAC9E,CAAC;AAAA,MAAA;AAAA;AAAA,MAIJ,SAAe;AACb,aAAK,YAAY;AACV,eAAA;AAAA,MAAA;AAAA,IACT;AASF,QAAI,iBAAgC,IAAI,cAAc,OAAO,KAAK,EAAE,OAAO;AAK3E,aAAS,cAAc,MAAoB;AAEzC,qBAAe,OAAO;AAGlB,UAAA,SAAS,eAAe,KAAM;AAGjB,uBAAA,IAAI,cAAc,IAAI;AAAA,IAAA;AAMzC,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,gBAAgB;AAAA,IAAA,CACvD;;AA/ZC,aAAA/C,UAAA,GAAAW,mBA+FM,OA/FNyB,cA+FM;AAAA,QA9FJX,YA6FgBN,aAAA;AAAA,UA3Fb,gBAAcE,KAAW;AAAA,UACzB,UAAUC,KAAQ;AAAA,UAClB,UAAUN,KAAQ;AAAA,UAClB,cAAYO,KAAS;AAAA,UACrB,UAAUH,KAAQ;AAAA,QAAA;UAEnB,SAAAI,QAAA,CAPQa,eAAS;AAAA,YAOjBZ,YAoFWvB,MAAA,OAAA,GAAA;AAAA,uBAnFL;AAAA,cAAJ,KAAI;AAAA,cACH,eAAa,UAAS;AAAA,cAEvB,OAAA;AAAA,cACA,UAAA;AAAA,cACA,eAAA;AAAA,cACA,aAAA;AAAA,cACA,iBAAA;AAAA,cACA,cAAA;AAAA,cAEA,iBAAA;AAAA,cACA,sBAAA;AAAA,cAEC,OAAKwB;AAAAA,gBAAaW,WAAU,WAAQ,qBAAkCA,WAAU,WAAQ;;cAKxF,OAAO,QAAK;AAAA,cACZ,MAAM,QAAI;AAAA,cACV,MAAA,QAAI;AAAA,cAEJ,gBAAcA,WAAU;AAAA,cACxB,qBAAiB,CAAIA,WAAU;AAAA,cAC/B,SAASA,WAAU;AAAA,cACnB,UAAQ,CAAIA,WAAU;AAAA,cACtB,OAAO,OAAM;AAAA,cAEb,SAAS,SAAQ;AAAA,cACjB,UAAU;AAAA,cACV,kBAAgB,QAAQ;AAAA,cACxB,UAAU;AAAA,cACV,SAASnC,MAAO,OAAA;AAAA,cAEhB;AAAA,cACA,cAAa;AAAA,cACb,aAAY;AAAA,cACZ,aAAY;AAAA,cACZ,uBAAoB;AAAA;cAEV,iBACT,MAAoC;AAAA,gBAApCuB,YAAoCvB,MAAA,QAAA,GAAA;AAAA,kBAAzB,OAAM;AAAA,kBAAO,MAAK;AAAA;;cAOpB,gBAET,MAIE;;AAAA;AAAA,oBAHM,cAAA,UAAA,mBAAU,0BADlBD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,kBAAA;kBAIAmC,WAAU,YAAY,UAAA,SAAa,QAAS,0BADpDpC,YAKEC,MAAA,KAAA,GAAA;AAAA;oBAHC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,oBACL,6DAAoB,OAAM,QAAA,IAAA,CAAA,QAAA,SAAA,CAAA;AAAA,kBAAA,yBAGb,CAAA,UAAA,SAAc,QAAQ,yBADtCD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,kBAAA;kBAIA,QAAI,qBADZD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAM,QAAI;AAAA,oBACX,OAAM;AAAA,kBAAA;;;cAIC,QAAMsB,QACf,CAA0D,UADG;AAAA,gBACjD,OAAO,SAAnBf,WAA0D,6DAAT,KAAK,CAAA,CAAA,kBACtDR,YAISC,MAAA,KAAA,GAJTC,WAIS,EAJc,KAAA,EAAA,GAAA,MAAM,WAAS,EAAE,OAAA,GAAK,CAAA,GAAA;AAAA,mCAC3C,MAEiB;AAAA,oBAFjBsB,YAEiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,uCADf,MAAiB;AAAA,wBAAd8C,gBAAAP,gBAAA,MAAM,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;cAnCJ,QAAS,aAAIJ,WAAU;sBAAW;AAAA,4BAChD,MAAmB;AAAA,kBAAhBW,gBAAAP,gBAAA,OAAA,MAAO,MAAM,IAAG,wBAAM,QAAS,SAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDtC,UAAA,EAAE,OAAO,IAAI,cAAc;AAEjC,UAAM,iBAAiB,IAAwC;AAM/D,UAAM,SAAS;AAuET,UAAA,SAASvB,SAId,SAAA,YAAA;AAED,UAAM,QAAQ;AAKD,aAAA;AAAA;AAAA,MAEX,OAAO,MAAA;;AAAM,oCAAe,UAAf,mBAAsB;AAAA;AAAA,IAAM,CAC1C;AAOD,QAAI,iBAAqE;AAEzE,mBAAe,gBAAgB,OAA4D;;AACzF,UAAI,CAAE,gBAAgB;AACpB,YAAI,GAAE,4BAAW,WAAX,mBAAmB,SAAnB,mBAAyB,WAAzB,mBAAiC,sBAAqB;AACpD,gBAAA,IAAI,MAAM,+CAA+C;AAAA,QAAA;AAEjE,yBAAiB,IAAI,OAAO,KAAK,OAAO,oBAAoB;AAAA,MAAA;AAG1D,UAAA,CAAE,MAAO,QAAO,CAAC;AAGrB,YAAM,UAAU;AAAA,QACd,OAAO;AAAA,QACP,OAAO,CAAE,SAAU;AAAA,QACnB,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO,SAAS;AAAA,MAC5B;AAGA,YAAM,WAAW,MAAM,eAAe,oBAAoB,OAAO;AAGjE,YAAM,cAAmC,CAAC;AAC/B,iBAAA,cAAc,SAAS,aAAa;AAC7C,cAAM,UAA6B;AAAA,UACjC,OAAO,WAAW;AAAA,UAClB,OAAO,WAAW;AAAA,UAClB,QAAQ,CAAA;AAAA,QACV;AAEA,YAAI,MAAM;AACC,mBAAA,QAAQ,WAAW,sBAAsB,8BAA8B;AAChF,gBAAM,MAAM,KAAK;AACX,gBAAA,MAAM,KAAK,SAAS,KAAK;AAC/B,gBAAM+B,QAAO,WAAW,sBAAsB,UAAU,MAAM,KAAK,GAAG;AACtE,gBAAM,QAAQ,WAAW,sBAAsB,UAAU,MAAM,KAAK,GAAG;AACnEA,cAAAA,eAAc,OAAO,KAAK,EAAE,OAAOA,OAAM,MAAM,QAAQ;AACvD,cAAA,eAAe,OAAO,KAAK,EAAE,OAAO,OAAO,MAAM,SAAS;AACxD,gBAAA;AAAA,QAAA;AAGR,cAAM,OAAO,WAAW,sBAAsB,UAAU,MAAM,GAAG;AAC3D,cAAA,YAAY,WAAW,sBAAsB;AAE/C,YAAA,cAAc,OAAO,KAAK,EAAE,OAAO,MAAM,MAAM,QAAQ;AACvD,YAAA,UAAmB,SAAA,OAAO,KAAK,EAAE,OAAO,MAAM,SAAS,IAAI,MAAM,YAAA,CAAa;AAElF,oBAAY,KAAK,OAAO;AAAA,MAAA;AAInB,aAAA;AAAA,IAAA;AAGT,mBAAe,aAAa,QAAgC;;AAC1D,UAAI,GAAE,4BAAW,WAAX,mBAAmB,SAAnB,mBAAyB,WAAzB,mBAAiC,QAAO;AACtC,cAAA,IAAI,MAAM,iCAAiC;AAAA,MAAA;AAG7C,YAAA,QAAQ,IAAI,OAAO,KAAK,OAAO,MAAM,EAAE,IAAI,OAAO,OAAO;AAC/D,YAAM,MAAM,YAAY,EAAE,QAAQ,CAAE,mBAAoB,GAAG;AAE3D,YAAM,UAAwB,CAAC;AAC/B,iBAAW,aAAa,MAAM,qBAAqB,CAAA,GAAI;AAC1C,mBAAA,QAAQ,UAAU,OAAO;AAClC,kBAAQ,MAAM;AAAA,YACZ,KAAK;AAAiB,sBAAA,cAAc,UAAU,YAAY;AAAI;AAAA,YAC9D,KAAK;AAAyB,sBAAA,eAAe,UAAU,YAAY;AAAI;AAAA,YACvE,KAAK;AAAuB,sBAAA,cAAc,UAAU,YAAY;AAAI;AAAA,YACpE,KAAK;AAAoB,sBAAA,OAAO,UAAU,YAAY;AAAI;AAAA,YAC1D,KAAK;AAAmB,sBAAA,UAAU,UAAU,aAAa;AAAW;AAAA,UAAA;AAAA,QACtE;AAAA,MACF;AAIF,YAAM,WAAW,OAAO;AAAA,IAAA;AAM1B,cAAU,MAAM;AACd,UAAI,CAAE,eAAe,MAAa,OAAA,IAAI,MAAM,sBAAsB;AAAA,IAAA,CACnE;;0BAhPChD,YAuCiBiD,aAAA;AAAA,iBAtCX;AAAA,QAAJ,KAAI;AAAA,oBACK,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QAEd,OAAO,QAAK;AAAA,QACZ,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAS;AAAA,QAEpB,cAAY,QAAS;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAK;AAAA,QAEZ,UAAU9B,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,QAErB,gBAAc;AAAA,QACd,YAAU;AAAA,MAAA;QAEA,QAAMC,QACf,CAYS,UAba;AAAA,UACtBC,YAYSvB,MAAA,KAAA,GAZTC,WAAgB,MAAM,WAAS,EAAE,OAAA,GAAK,CAAA,GAAA;AAAA,6BACpC,MAUiB;AAAA,cAVjBsB,YAUiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,iCATf,MAQM;AAAA,kBARNqC,mBAQM,OAAA,MAAA;AAAA,sCAPJ5B,mBAMOC,UAAA,MAAAiC,WALiB,MAAM,IAAI,QAAM,CAA9B,OAAO,MAAC;0CADlBlC,mBAMO,QAAA;AAAA,wBAJJ,QAAQ,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,wBAC5B,OAAKe,eAAA,gBAAkB,MAAM,IAAI,EAAA;AAAA,sBAE/B,GAAAe,gBAAA,MAAM,KAAK,GAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC8E5B,UAAM,aAAa,cAAc;AAGjC,UAAM,WAAW,IAAa;AAG9B,UAAM,UAAU,IAAsC;AAMtD,UAAM,SAAS;AA6DT,UAAA,SAASvB,SAId,SAAA,YAAA;AAGD,UAAM,SAASnB,SAAA;AAOF,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAE7B,iBAAiB,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAEvC,UAAU,MAAA;;AAAM,+BAAS,UAAT,mBAAgB,eAAc;AAAA;AAAA;AAAA,MAE9C,UAAU,SAAS,MAAA;;AAAM,+BAAS,UAAT,mBAAgB,aAAY;AAAA,OAAK;AAAA,IAAA,CAC3D;AAKK,UAAA,WAAW,SAAS,MAAM;AAC9B,UAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,eAAO,OAAO,QAAQ,IAAI,CAAC,UAAU,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,MAAA,IAAU,KAAK;AAAA,MAAA;AAG3F,aAAA,OAAO,QAAQ,OAAO,OAAO,EAC/B,IAAI,CAAC,CAAE,OAAO,KAAM,OAAO,EAAE,OAAO,MAAM,EAAE,EAC5C,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IAAA,CACnD;AAKK,UAAA,SAAS,SAAS,MAAM;AAErB,aAAA,OAAO,WAAW,CAAE,WAAW,UAAW,IAAI,CAAE,MAAM,IAAK;AAAA,IAAA,CACnE;AAGK,UAAA,CAAE,MAAA;;AAAM,2BAAQ,UAAR,mBAAe;AAAA,OAAY,MAAO,GAAG;;AAAM,4BAAS,UAAT,mBAAgB;AAAA,KAAiB;AAG1F,mBAAe,MAAM;;AACf,WAAA,cAAS,UAAT,mBAAgB,SAAiB,QAAA;AACrC,UAAI,OAAO,SAAiB,QAAA,CAAC,CAAE,OAAO;AAC/B,aAAA;AAAA,IAAA,CACR;AAKD,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,gBAAgB;AACtD,UAAI,CAAE,QAAQ,MAAa,OAAA,IAAI,MAAM,oBAAoB;AAAA,IAAA,CAC1D;;AAtPC,aAAAC,UAAA,GAAAW,mBA+FM,OA/FNyB,cA+FM;AAAA,QA9FJX,YA6FgBN,aAAA;AAAA,mBA5FV;AAAA,UAAJ,KAAI;AAAA,UAEH,gBAAcE,KAAW;AAAA,UACzB,UAAUC,KAAQ;AAAA,UAClB,UAAUN,KAAQ;AAAA,UAClB,cAAYO,KAAS;AAAA,UACrB,UAAUH,KAAQ;AAAA,QAAA;UAEnB,SAAAI,QAAA,CAPQa,eAAS;AAAA,YAOjBZ,YAmFWvB,MAAA,OAAA,GAAA;AAAA,uBAlFL;AAAA,cAAJ,KAAI;AAAA,0BACK,OAAM;AAAA,2EAAN,OAAM,QAAA;AAAA,cAEf,OAAA;AAAA,cACA,UAAA;AAAA,cACA,eAAA;AAAA,cACA,eAAA;AAAA,cACA,cAAA;AAAA,cACA,sBAAA;AAAA,cACA,iBAAA;AAAA,cAEC,OAAKwB;AAAAA,gBAAaW,WAAU,WAAQ,qBAAkCA,WAAU,WAAQ;;cAKxF,OAAO,QAAK;AAAA,cACZ,QAAQ,QAAM;AAAA,cACd,MAAM,QAAI;AAAA,cACV,gBAAcA,WAAU;AAAA,cACxB,qBAAiB,CAAIA,WAAU;AAAA,cAC/B,MAAA,QAAI;AAAA,cAEJ,SAASA,WAAU;AAAA,cACnB,UAAQ,CAAIA,WAAU;AAAA,cACtB,OAAO,OAAM;AAAA,cAEb,SAAS,SAAQ;AAAA,cACjB,UAAU;AAAA;cAEA,gBAET,MAAgE;;AAAA;AAAA,kBAApD,OAAO,UAAnB5B,WAAgE,8DAAb4B,UAAS,CAAA,CAAA;kBAGpDA,WAAU,yBADlBpC,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,kBAAA;oBAIA,cAAA,UAAA,mBAAU,0BADlBD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,kBAAA;kBAIAmC,WAAU,YAAY,OAAA,SAAU,QAAS,0BADjDpC,YAKEC,MAAA,KAAA,GAAA;AAAA;oBAHC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,oBACL,6DAAoB,OAAM,QAAA,IAAA,CAAA,QAAA,SAAA,CAAA;AAAA,kBAAA,yBAGb,CAAA,OAAA,SAAW,QAAQ,yBADnCD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAMA,MAAK,KAAA,EAAC;AAAA,oBACb,OAAM;AAAA,kBAAA;kBAIA,QAAI,qBADZD,YAIEC,MAAA,KAAA,GAAA;AAAA;oBAFC,MAAM,QAAI;AAAA,oBACX,OAAM;AAAA,kBAAA;kBAGI,OAAO,SAAnBO,WAA8D,6DAAb4B,UAAS,CAAA,CAAA;;;;;cAI5C,OAAO;sBAAS;AAAA,gBAC9B,IAAAb,QAAA,CADsC,UAAK;AAAA,kBAC3Cf,WAAqC,yDAAT,KAAK,CAAA,CAAA;AAAA,gBAAA;;;sBAIjB;AAAA,gBAChB,IAAAe,QAAA,CADwB,UAAK;AAAA,kBAC7BC,YAMSvB,MAAA,KAAA,GANTC,WAAgB,MAAM,WAAS,EAAE,OAAA,GAAK,CAAA,GAAA;AAAA,qCACpC,MAIiB;AAAA,sBAJjBsB,YAIiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,yCAHf,MAEe;AAAA,0BAFfuB,YAEevB,MAAA,UAAA,GAAA,MAAA;AAAA,6CADb,MAAiB;AAAA,8BAAd8C,gBAAAP,gBAAA,MAAM,KAAK,GAAA,CAAA;AAAA,4BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1C9B,UAAM,aAAa,cAAc;AA0D3B,UAAA,SAASvB,SAGd,SAAA,YAAA;AAGK,UAAA,QAAQ,SAAS,MAAM;AAC3B,aAAO,OAAO,QAAQ,WAAW,MAAM,KAAK,OAAO,KAAY,IAAI;AAAA,IAAA,CACpE;AAEK,UAAA,aAAa,SAAS,MAAM;AAEhC,YAAM,YAA8D,CAAC;AAGrE,iBAAW,QAAQ,eAAe;AAChC,cAAM,QAAQ,WAAW,MAAM,QAAQ,IAAI;AAC3C,cAAM,OAAO,WAAW,MAAM,KAAK,IAAI;AACvC,kBAAU,KAAK,EAAE,OAAO,MAAM,OAAc,MAAM;AAAA,MAAA;AAI1C,gBAAA,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAGhD,aAAA;AAAA,IAAA,CACR;;0BAlICjB,YAiCWkD,aAAA;AAAA,oBAhCA,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QAEd,UAAU/B,KAAQ;AAAA,QAClB,gBAAcC,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,cAAYC,KAAS;AAAA,QAErB,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAS;AAAA,QACpB,QAAQ,QAAM;AAAA,QACd,SAAS,WAAU;AAAA,QACnB,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,QAAQ,MAAK;AAAA,QACb,MAAM,QAAI;AAAA,MAAA;QAEA,QAAMC,QACf,CAWS,UAZa;AAAA,UACtBC,YAWSvB,MAAA,KAAA,GAXTC,WAAgB,MAAM,WAAS,EAAE,OAAA,GAAK,CAAA,GAAA;AAAA,6BACpC,MAIiB;AAAA,cAJjBsB,YAIiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,iCAHf,MAEe;AAAA,kBAFfuB,YAEevB,MAAA,UAAA,GAAA,MAAA;AAAA,qCADb,MAAiB;AAAA,sBAAd8C,gBAAAP,gBAAA,MAAM,KAAK,GAAA,CAAA;AAAA,oBAAA;;;;;;cAGlBhB,YAIiBvB,MAAA,YAAA,GAAA,EAJD,QAAA,MAAM;AAAA,iCACpB,MAEe;AAAA,kBAFfuB,YAEevB,MAAA,UAAA,GAAA,MAAA;AAAA,qCADb,MAAoB;AAAA,sDAAjB,MAAM,IAAI,IAAI,GAAA,CAAA;AAAA,oBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkCvB,UAAA,EAAE,EAAE,IAAI,cAAc;AAG5B,UAAM,SAAS,IAAgC;AAE/C,UAAM,UAAU,IAAiB;AAMjC,UAAM,SAAS;AAoDT,UAAA,SAASgB,SAGd,SAAA,YAAA;AAGK,UAAA,aAAa,SAAS,MAAM;AAC5B,UAAA,CAAE,OAAO,MAAc,QAAA;AAE3B,UAAI,OAAO,MAAM,SAAS,OAAO,MAAM,IAAI;AACzC,eAAO,EAAE,OAAO,MAAM,MAAM,OAAO,QAAQ,KAAK;AAAA,MAAA,OAC3C;AACL,cAAM,OAAO,EAAE,OAAO,MAAM,MAAM,OAAO,QAAQ,KAAK;AACtD,cAAM,KAAK,EAAE,OAAO,MAAM,IAAI,OAAO,QAAQ,KAAK;AAC3C,eAAA,GAAG,IAAI,MAAM,EAAE;AAAA,MAAA;AAAA,IACxB,CACD;AAIK,UAAA,UAAU,SAAS,MAAA;;AAAM,2BAAO,UAAP,mBAAc,IAAI,cAAc,uBAAsB;AAAA,KAAS;AACxF,UAAA,UAAU,IAAI,KAAK;AAEzB,aAAS,SAAiB;AAClB,YAAA,4BAAY,KAAK;AACjB,YAAA,OAAO,OAAO,MAAM,YAAa,CAAA,EAAE,SAAS,GAAG,GAAG;AAClD,YAAA,QAAQ,OAAO,MAAM,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,YAAA,MAAM,OAAO,MAAM,QAAS,CAAA,EAAE,SAAS,GAAG,GAAG;AACnD,aAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAAA,IAAA;AAGhC,aAAS,SAAS,OAAyB;;AACzC,UAAI,CAAE,QAAQ,MAAO,eAAQ,UAAR,mBAAe;AACpC,YAAM,gBAAgB;AACtB,YAAM,eAAe;AAAA,IAAA;AAGvB,aAAS,UAAU,OAAsC;;AACvD,UAAI,CAAE,MAAO;AACT,UAAA,UAAU,OAAO,OAAO;AACtB,YAAA,OAAO,UAAW,UAAU;AAC9B,iBAAO,QAAQ;AAAA,YACb,MAAM;AAAA,YACN,IAAI;AAAA,UACN;AAAA,QAAA,OACK;AACL,iBAAO,QAAQ;AAAA,YACb,MAAM,MAAM;AAAA,YACZ,IAAI,MAAM;AAAA,UACZ;AAAA,QAAA;AAAA,MACF;AAEF,oBAAQ,UAAR,mBAAe;AAAA,IAAK;AAGhB,UAAA,WAAW,SAAS,MAAgC;;AAEpD,UAAA,OAAO,cAAc,MAAc,QAAA;AACvC,UAAI,OAAO,cAAc,KAAa,QAAA,MAAM,OAAO,QAAQ;AAEvD,UAAA,OAAO,cAAc,SAAS;AAChC,cAAM,QAAQ,OAAO;AAChB,cAAA,YAAO,UAAP,mBAAc,UAAS,SAAW,OAAO,MAAM,OAAO,MAAe,QAAA;AAC1E,eAAO,MAAM,OAAO,QAAQ,EAAE,MAAM,OAAO,IAAI,MAAM;AAAA,YACzC,QAAA;AAAA,IAAA,CACf;AAKD,cAAU,MAAM;AAEd,UAAK,CAAE,OAAO,SAAW,OAAO,cAAc,SAAU;AACtD,eAAO,QAAQ;AAAA,UACb,MAAM,OAAO;AAAA,UACb,IAAI,OAAO;AAAA,QACb;AAAA,MAAA;AAGF,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAClD,UAAI,CAAE,QAAQ,MAAa,OAAA,IAAI,MAAM,oBAAoB;AAAA,IAAA,CAC1D;AAKY,aAAA;AAAA;AAAA,MAEX,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAM;;AAAA,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA;AAAA,MAExD,OAAO,MAAM,OAAO;AAAA,IAAA,CACrB;;AA5NC,aAAAlB,UAAA,GAAAC,YA8CS,OA9CTE,WA8CS;AAAA,iBA7CH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,QACd,mBAAA;AAAA,QACC,eAAa,WAAU;AAAA,QACvB,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,YAAU,SAAQ;AAAA,QAClB,SAAO;AAAA,MAAA;QAEG,gBAET,MAegB;;AAAA;AAAA,YAfhBK,YAegBvB,MAAA,WAAA,GAAA;AAAA,uBAdV;AAAA,cAAJ,KAAI;AAAA,cACJ,mBAAA;AAAA,cACC,QAAQ,QAAO;AAAA,cACf,oDAAa,QAAO,QAAA;AAAA,cACpB,8CAAM,QAAO,QAAA;AAAA,YAAA;+BAEd,MAOE;AAAA,gBAPFuB,YAOEvB,MAAA,KAAA,GAAA;AAAA,kBANA,SAAA;AAAA,kBACA,OAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,eAAa,OAAM,SAAA;AAAA,kBACnB,qBAAmB;AAAA,kBACnB,uBAAoB;AAAA,gBAAA;;;;cAMjB,YAAA,UAAA,mBAAQ,4BADhBD,YAKEC,MAAA,KAAA,GAAA;AAAA;cAHA,OAAM;AAAA,cACL,MAAM,QAAI;AAAA,cACV,SAAO;AAAA,YAAA,uCAEVD,YAA6CC,MAAA,KAAA,GAAA;AAAA;cAA9B,OAAM;AAAA,cAAU,MAAM,QAAI;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgBzC,UAAA,EAAE,EAAE,IAAI,cAAc;AAG5B,UAAM,SAAS,IAAgC;AAE/C,UAAM,UAAU,IAAiB;AAMjC,UAAM,SAAS;AAoDT,UAAA,SAASgB,SAId,SAAA,YAAA;AAGK,UAAA,aAAa,SAAS,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC;AAIjE,UAAA,UAAU,SAAS,MAAA;;AAAM,2BAAO,UAAP,mBAAc,IAAI,cAAc,uBAAsB;AAAA,KAAS;AACxF,UAAA,UAAU,IAAI,KAAK;AAEzB,aAAS,SAAiB;AAClB,YAAA,4BAAY,KAAK;AACjB,YAAA,OAAO,OAAO,MAAM,YAAa,CAAA,EAAE,SAAS,GAAG,GAAG;AAClD,YAAA,QAAQ,OAAO,MAAM,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,YAAA,MAAM,OAAO,MAAM,QAAS,CAAA,EAAE,SAAS,GAAG,GAAG;AACnD,aAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAAA,IAAA;AAGhC,aAAS,SAAS,OAAyB;;AACzC,UAAI,CAAE,QAAQ,MAAO,eAAQ,UAAR,mBAAe;AACpC,YAAM,gBAAgB;AACtB,YAAM,eAAe;AAAA,IAAA;AAGvB,aAAS,UAAU,OAAqB;;AACtC,UAAI,CAAE,MAAO;AACb,UAAI,UAAU,OAAO,MAAO,QAAO,QAAQ;AAC3C,oBAAQ,UAAR,mBAAe;AAAA,IAAK;AAGhB,UAAA,WAAW,SAAS,MAAgC;AAEpD,UAAA,OAAO,cAAc,MAAc,QAAA;AACvC,UAAI,OAAO,cAAc,KAAa,QAAA,MAAM,OAAO,QAAQ;AAEvD,UAAA,OAAO,cAAc,SAAS;AAChC,YAAI,OAAO,UAAU,OAAO,EAAU,QAAA;AAC/B,eAAA,MAAM,OAAO,QAAQ,OAAO;AAAA,YACvB,QAAA;AAAA,IAAA,CACf;AAKD,cAAU,MAAM;AAET,UAAA,CAAE,OAAO,SAAW,OAAO,cAAc,QAAU,QAAO,QAAQ,OAAO;AAE9E,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAClD,UAAI,CAAE,QAAQ,MAAa,OAAA,IAAI,MAAM,oBAAoB;AAAA,IAAA,CAC1D;AAKY,aAAA;AAAA;AAAA,MAEX,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAM;;AAAA,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA;AAAA,MAExD,OAAO,MAAM,OAAO;AAAA,IAAA,CACrB;;AA/LC,aAAAlB,UAAA,GAAAC,YA6CS,OA7CTE,WA6CS;AAAA,iBA5CH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,QACd,mBAAA;AAAA,QACC,eAAa,WAAU;AAAA,QACvB,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,YAAU,SAAQ;AAAA,QAClB,SAAO;AAAA,MAAA;QAEG,gBAET,MAcgB;;AAAA;AAAA,YAdhBK,YAcgBvB,MAAA,WAAA,GAAA;AAAA,uBAbV;AAAA,cAAJ,KAAI;AAAA,cACJ,mBAAA;AAAA,cACC,QAAQ,QAAO;AAAA,cACf,oDAAa,QAAO,QAAA;AAAA,cACpB,8CAAM,QAAO,QAAA;AAAA,YAAA;+BAEd,MAME;AAAA,gBANFuB,YAMEvB,MAAA,KAAA,GAAA;AAAA,kBALA,SAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,eAAa,OAAM;AAAA,kBACnB,qBAAmB;AAAA,kBACnB,uBAAoB;AAAA,gBAAA;;;;cAMjB,YAAA,UAAA,mBAAQ,4BADhBD,YAKEC,MAAA,KAAA,GAAA;AAAA;cAHA,OAAM;AAAA,cACL,MAAM,QAAI;AAAA,cACV,SAAO;AAAA,YAAA,uCAEVD,YAA6CC,MAAA,KAAA,GAAA;AAAA;cAA9B,OAAM;AAAA,cAAU,MAAM,QAAI;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDzC,UAAA,EAAE,UAAU,IAAI,cAAc;AAC9B,UAAA,EAAE,EAAE,IAAI,cAAc;AAG5B,UAAM,SAAS,IAAgC;AAM/C,UAAM,SAAS;AA+CT,UAAA,SAASgB,SAId,SAAA,YAAA;AAGY,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAE3B,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAA;;AAAM,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA,IAAA,CACzD;AAKK,UAAA,UAAU,SAAS,MAAM;AACzB,UAAA,CAAE,OAAO,MAAc,QAAA;AAC3B,UAAI,OAAO,MAAM,SAAS,GAAW,QAAA;AACrC,UAAI,OAAO,MAAM,MAAM,QAAQ,EAAU,QAAA;AAGzC,YAAM,SAAS,IAAI,OAAO,KAAK,OAAO,MAAM,MAAM;AAClD,aAAO,SAAS,cAAc,OAAO,QAAQ,MAAM;AAAA,IAAA,CACpD;AAGK,UAAA,SAAS,SAA+B,MAAM;AAAA;AAAA,MAElD,UAAU,EAAE;AAAA;AAAA,MAEZ,CAAC,UAAkB;AACjB,YAAI,MAAM,MAAM,UAAU,EAAU,QAAA;AACpC,eAAO,EAAE,EAAE,IAAI,wBAAwB,IAAI,sBAAsB;AAAA,MACnE;AAAA;AAAA,MAEA,CAAC,UAAkB;AACjB,cAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,cAAA,WAAW,cAAc,KAAK;AAChC,YAAA,UAAW,QAAQ,SAAkB,QAAA;AACzC,eAAO,EAAE;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA,GACH,EAAE,SAAA,CAAU;AAAA,MACjB;AAAA;AAAA,MAEA,GAAG,OAAO;AAAA,IAAA,CACoB;AAEhC,aAAS,cAAc,SAAyB;AAC1C,UAAA,QAAQ,SAAS,GAAW,QAAA;AAGhC,UAAI,MAAM;AACD,eAAA,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,KAAM,IAAI,IAAI,IAAI,IAAI,GAAG;AACtD,gBAAQ,QAAQ,WAAW,CAAC,IAAI,MAAQ;AAAA,MAAA;AAI1C,aAAO,OAAO,cAAe,KAAM,MAAM,MAAO,KAAM,EAAI;AAAA,IAAA;AAK5D,aAAS,eAAe,OAAyB;;AAE3C,UAAA,MAAM,cAAc,aAAc;AAEtC,WAAI,WAAM,SAAN,mBAAY,MAAM,SAAU;AAEhC,YAAM,eAAe;AAAA,IAAA;AAIvB,aAAS,WAAW,OAA4B;AAC1C,UAAA,CAAE,QAAQ,MAAO;AACrB,YAAM,EAAE,KAAK,QAAQ,SAAS,SAAS,aAAa;AAChD,UAAA,UAAU,WAAW,WAAW,SAAU;AAC9C,UAAI,QAAQ,MAAO;AAEZ,aAAA,QAAQ,OAAO,QAAQ,QAAQ;AACtC,YAAM,eAAe;AAAA,IAAA;AAMvB,cAAU,MAAM;AACd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAAA,IAAA,CACnD;;;AAjMC,aAAAlB,UAAA,GAAAC,YA2BE,OA3BFE,WA2BE;AAAA,iBA1BI;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,oBACL,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QACf,MAAK;AAAA,QACL,MAAK;AAAA,QAEJ,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,OAAO,OAAM;AAAA,QACb,cAAYG,KAAS;AAAA,QAErB,cAAY;AAAA,QACZ,UAAQ,YAAM,UAAN,mBAAQ,cAAa,QAAA,QAAU;AAAA,QAEvC,+CAAO,OAAM,QAAA;AAAA,QACb,eAAa;AAAA,QACb,WAAS;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqCd,UAAM,EAAE,GAAG,EAAE,IAAI,cAAc;AAM/B,UAAM,SAAS;AAiET,UAAA,SAAS,SAAS,MAAM;AACxB,UAAA,OAAO,UAAU,OAAkB,QAAA;AACnC,UAAA,OAAO,UAAU,KAAa,QAAA;AAE9B,UAAA,OAAO,OAAO,UAAU,WAAW;AACrC,eAAO,OAAO,QACV,EAAE,EAAE,IAAI,QAAQ,IAAI,OAAA,CAAQ,IAC5B,EAAE,EAAE,IAAI,SAAS,IAAI,UAAU;AAAA,MAAA;AAGjC,UAAA,OAAO,OAAO,UAAU,UAAU;AAC7B,eAAA,EAAE,OAAO,KAAK;AAAA,MAAA;AAGvB,aAAO,OAAO;AAAA,IAAA,CACf;;0BArJCZ,mBAiDM,OAAA;AAAA,QAjDD,OAAKe,eAAA,CAAC,WAAS,EAAA,mBAA8B,QAAO,SAAA,CAAA;AAAA,MAAA;QACvDD,YA+CgBN,aAAA;AAAA,UA7Cb,gBAAA,QAAY;AAAA,UACZ,UAAA,QAAQ;AAAA,QAAA;UAET,SAAAK,QAAA,CAJQa,eAAS;AAAA,YAIjBZ,YAyCUvB,MAAA,MAAA,GAAA;AAAA,cAxCP,eAAa,OAAM;AAAA,cAEpB,OAAA;AAAA,cACA,UAAA;AAAA,cACA,eAAA;AAAA,cACA,iBAAA;AAAA,cAEA,eAAY;AAAA,cACX,OAAWwB,eAAA,CAAA,QAAA,WAAYW,WAAU,YAAQ,kBAAA;AAAA,cACzC,WAAY,QAAO;AAAA,cAEnB,aAAc,QAAA,UAAU,QAAA,cAAc;AAAA,cACtC,MAAM,QAAI;AAAA,cACV,gBAAc,QAAA,UAAkB,QAAAA,WAAU;AAAA,cAC1C,qBAAmB,QAAA,UAAmB,OAAA,CAAAA,WAAU;AAAA,cAEhD,OAAO,QAAK;AAAA;cAEG,QAAI;sBAAG;AAAA,4BAErB,MAeW;AAAA,kBAfK,QAAI,QAAA,CAAOA,WAAU,6BAArC1B,mBAeWC,UAAA,EAAA,KAAA,EAAA,GAAA;AAAA,2BAZO,QAAI,SAAA,yBADpBD,mBAOI,KAAA;AAAA;sBALD,MAAM,QAAI;AAAA,sBACX,OAAM;AAAA,sBACL,uBAAY,MAA2D;AAAA,sBAAA,GAAA,CAAA,MAAA,CAAA;AAAA,oBAAA;sBAE1D,QAAI,qBAAlBV,YAAmEC,MAAA,KAAA,GAAA;AAAA;wBAA/C,OAAM;AAAA,wBAA2B,MAAM,QAAI;AAAA,sBAAA;sDAIjE,GAAAD,YAEcC,MAAA,UAAA,GAAA;AAAA;sBAFO,IAAI,QAAI;AAAA,sBAAE,OAAM;AAAA,oBAAA;uCACnC,MAAmE;AAAA,wBAArD,QAAI,qBAAlBD,YAAmEC,MAAA,KAAA,GAAA;AAAA;0BAA/C,OAAM;AAAA,0BAA2B,MAAM,QAAI;AAAA,wBAAA;;;;0CAKnED,YAA6CC,MAAA,KAAA,GAAA;AAAA;oBAA9B,OAAM;AAAA,oBAAU,MAAM,QAAI;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAnD,UAAM,aAAa,cAAc;AACjC,UAAM,aAAa,cAAc;AAGjC,UAAM,SAAS,IAAgC;AAM/C,UAAM,SAAS,SAAS;AAExB,UAAM,SAAS;AA6ET,UAAA,UAAUgB,SAIf,SAAA,YAAA;AAGD,UAAM,SAASnB,SAAA;AAKF,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAE3B,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAM;;AAAA,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA;AAAA,MAExD,YAAY,SAAS,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA,OAAK;AAAA,IAAA,CAC7D;AAKK,UAAA,SAAS,SAA+B,MAAM;AAClD,YAAM,QAA8B;AAAA;AAAA,QAElC,CAAC,UAAkB,CAAE,MAAM,KAAK;AAAA,QAChC,CAAC,UAAkB,OAAO,SAAS,KAAK;AAAA,MAC1C;AAGI,UAAA,OAAO,YAAY,OAAW,OAAM,KAAK,WAAW,QAAQ,OAAO,OAAO,CAAC;AAC3E,UAAA,OAAO,YAAY,OAAW,OAAM,KAAK,WAAW,QAAQ,OAAO,OAAO,CAAC;AAGzE,YAAA,KAAK,GAAG,OAAO,KAAK;AAInB,aAAA,CAAE,CAAC,WAAmB;AACrB,cAAA,SAAS,aAAa,MAAM;AAKlC,YAAI,WAAW,QAAS,CAAE,OAAO,aAAsB,QAAA;AAEvD,mBAAW,QAAQ,OAAO;AAClB,gBAAA,SAAS,KAAK,UAAU,CAAC;AAC3B,cAAA,OAAO,WAAW,SAAiB,QAAA;AACnC,cAAA,WAAW,MAAc,QAAA;AAAA,QAAA;AAExB,eAAA;AAAA,MAAA,CACP;AAAA,IAAA,CACH;AAKK,UAAA,OAAO,SAAS,MAAO,MAAM,eAAe,WAAW,MAAM,EAAE,CAAC,CAAE;AAElE,UAAA,OAAO,SAAS,MAAO,KAAM,eAAe,WAAW,MAAM,EAAE,CAAC,CAAE;AAExE,UAAM,UAAU,IAAY,cAAc,QAAQ,KAAK,CAAC;AAGxD,aAAS,eAAe,OAAyB;;AAC/C,YAAM,UAAU,MAAM;AAGlB,UAAA,MAAM,cAAc,aAAc;AAGtC;AAAA;AAAA,UAEG,WAAM,SAAN,mBAAY,MAAM;AAAA,QAEjB,MAAM,SAAS,KAAK,SAAW,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI;AAAA,QAEnE,MAAM,SAAS,OAAS,QAAQ,MAAM,CAAC,MAAM,OAAS,QAAQ,mBAAmB;AAAA,OACnF;AAIG,UAAA,MAAM,SAAS,OAAU,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,GAAI;AACpE,cAAM,SAAS,QAAQ;AACvB,cAAM,MAAM,QAAQ,kBAAkB,OAAO,OAAO,SAAS,QAAQ;AACrE,cAAM,MAAM,QAAQ,gBAAgB,OAAO,MAAM,QAAQ;AACjD,gBAAA,QAAQ,OAAO,MAAM,GAAG,GAAG,IAAI,KAAK,QAAQ,OAAO,MAAM,GAAG;AAC5D,gBAAA,iBAAiB,QAAQ,eAAe,MAAM;AACtD,gBAAQ,QAAQ,QAAQ;AAAA,MAAA;AAI1B,aAAO,MAAM,eAAe;AAAA,IAAA;AAI9B,aAAS,cAAc,QAA+B;;AAEhD,UAAA,WAAW,KAAa,QAAA;AAGrB,aAAA,OAAO,eAAe,WAAW,QAAQ;AAAA,QAC9C,uBAAuB;AAAA,QACvB,aAAa,GAAE,YAAO,UAAP,mBAAc;AAAA,MAAA,CAC9B;AAAA,IAAA;AAIH,aAAS,aAAa,QAA+B;AAEnD,eAAS,OACJ,WAAW,KAAK,OAAO,EAAE,EACzB,WAAW,KAAK,OAAO,GAAG,EAC1B,WAAW,YAAY,EAAE;AAIvB,aAAA,WAAW,KAAK,OAAO,WAAW,MAAM,OAAQ,WAAW,MAAM,KAAK;AAAA,IAAA;AAIzE,UAAA,CAAE,MAAM;;AAAA,0BAAO,UAAP,mBAAc;AAAA,OAAU,MAAM,WAAW,MAAO,GAAG,MAAM;AAC7D,cAAA,QAAQ,cAAc,QAAQ,KAAK;AAAA,IAAA,CAC5C;AAGK,UAAA,SAAS,CAAC,WAAW;AAEzB,UAAI,WAAW,aAAa,QAAQ,KAAK,EAAG;AACpC,cAAA,QAAQ,cAAc,MAAM;AAAA,IAAA,CACrC;AAIK,UAAA,SAAS,CAAC,WAAiB;AAEzB,YAAA,SAAS,aAAa,MAAM;AAClC,UAAI,QAAQ,UAAU,OAAQ,SAAQ,QAAQ;AAAA,IAAA,CAC/C;AAGD,cAAU,MAAM;AACd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAAA,IAAA,CACnD;;AA5RC,aAAAC,UAAA,GAAAC,YA8BS,OA9BTE,WA8BS;AAAA,iBA7BH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACS,EAAA,GAAAD,MAAA,MAAA,iBAAsB,UAAS;AAAA,oBACnC,QAAO;AAAA,qEAAP,QAAO,QAAA;AAAA,QAChB,MAAK;AAAA,QACJ,MAAM,QAAI;AAAA,QAEV,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAcmB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,QAAQ,QAAM;AAAA,QAEd,UAAU,QAAQ;AAAA,QAClB,OAAO,OAAM;AAAA,QACb,cAAYG,KAAS;AAAA,QAErB,kBAAgB,QAAO,QAAA;AAAA,QAEvB,eAAW,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,eAAe,MAAM;AAAA;QAEnB,OAAO;gBAAS;AAAA,UAC9B,IAAAC,QAAA,CADsCa,eAAS;AAAA,YAC/C5B,WAAyC,yDAAb4B,UAAS,CAAA,CAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACe3C,UAAM,WAAW,IAA0C;AAuErD,UAAA,UAAUnB,SAIf,SAAA,YAAA;AAGD,UAAM,SAASnB,SAAA;AAKF,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAE7B,iBAAiB,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAEvC,UAAU,MAAA;;AAAM,+BAAS,UAAT,mBAAgB,eAAc;AAAA;AAAA;AAAA,MAE9C,UAAU,SAAS,MAAA;;AAAM,+BAAS,UAAT,mBAAgB,aAAY;AAAA,OAAK;AAAA,IAAA,CAC3D;AAKD,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,wBAAwB;AAG9D,eAAS,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA,OAAiB;AAAA,IAAA,CACjD;;;AAjJC,aAAAC,UAAA,GAAAC,YA6BoBmD,aA7BpBjD,WA6BoB;AAAA,iBA5Bd;AAAA,QAAJ,KAAI;AAAA,MAAA,QACSC,KAAM,QAAA,UAAA,OAAA,cAAA,QAAA;AAAA,QAElB,iBAAa,cAAQ,UAAR,mBAAU,cAAc,QAAA,gBAAmB,QAAO;AAAA,QAC/D,MAAM,QAAI;AAAA,QAEV,OAAO,QAAK;AAAA,QACZ,iBAAiB,QAAM,MAAA;AAAA,QACvB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,QAAQ,QAAM;AAAA,QAEd,OAAO,QAAK;AAAA,QACZ,cAAYG,KAAS;AAAA,QACrB,SAAS,QAAO;AAAA,QAChB,SAAS,QAAO;AAAA,QAEhB,uBAAkB,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,QAAO,QAAG,UAAM;AAAA;QAErB,OAAO;gBAAS;AAAA,UAC9B,IAAAC,QAAA,CADsCa,eAAS;AAAA,YAC/C5B,WAAyC,yDAAb4B,UAAS,CAAA,CAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqB3C,UAAM,aAAa,cAAc;AAC3B,UAAA,EAAE,EAAE,IAAI,cAAc;AAG5B,UAAM,SAAS,IAAgC;AAM/C,UAAM,SAAS;AAgDT,UAAA,SAASnB,SAId,SAAA,YAAA;AAGK,UAAA,SAAS,SAAS,MAAM;AAC5B,YAAM,QAA8B,CAAC;AACjC,UAAA,OAAO,YAAY,EAAG,OAAM,KAAK,WAAW,UAAU,OAAO,SAAS,CAAC;AACrE,YAAA,KAAK,GAAG,OAAO,KAAK;AACnB,aAAA;AAAA,IAAA,CACR;AAGD,UAAM,SAAS,SAAS,MAAM,OAAO,SAAS,EAAE,EAAE,IAAI,YAAY,IAAI,WAAY,CAAA,CAAC;AAG7E,UAAA,WAAW,IAAI,KAAK;AAKb,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAE3B,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAA;;AAAM,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA,IAAA,CACzD;AAGD,cAAU,MAAM;AACd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAAA,IAAA,CACnD;;AA/IC,aAAAlB,UAAA,GAAAC,YAgCS,OAhCTE,WAgCS;AAAA,iBA/BH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,oBACL,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QAEf,KAAA;AAAA,QACA,MAAK;AAAA,QACJ,MAAM,SAAQ,QAAA,SAAA;AAAA,QAEd,OAAO,OAAM;AAAA,QACb,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM;AAAA,QAEN,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,OAAO,OAAM;AAAA,QACb,cAAYG,KAAS;AAAA,QAErB,+CAAO,OAAM,QAAA;AAAA,MAAA;QAEH,gBACT,MAIE;AAAA,UAJFE,YAIEvB,MAAA,KAAA,GAAA;AAAA,YAHC,MAAMA,MAAA,KAAA,EAAM,WAAW,SAAQ,QAAA,QAAA,IAAA;AAAA,YAChC,OAAM;AAAA,YACL,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,SAAQ,QAAA,CAAK,SAAQ;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6BrC,UAAM,SAAS,IAAgC;AAE/C,UAAM,WAAW,IAAkC;AAMnD,UAAM,SAAS;AAiET,UAAA,WAAWgB,SAIhB,SAAA,YAAA;AAED,UAAM,SAASnB,SAAA;AAKf,UAAM,OAAO;AAMb,aAAS,KAAK,OAAkB;AAC9B,WAAK,MAAM,KAAK;AAAA,IAAA;AAGlB,aAAS,SAAe;AACtB,WAAK,MAAM;AAAA,IAAA;AAGb,aAAS,SAAe;;AACtB,WAAK,MAAM;AACX,mBAAO,UAAP,mBAAc;AAAA,IAAS;AAGnB,UAAA,MAAM,OAAO,OAAO,MAAM;AAC9B,eAAS,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA,OAAU;AAAA,IAAA,CACxC;AAGY,aAAA;AAAA;AAAA,MAEX,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAM;;AAAA,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA;AAAA,MAExD,MAAM,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAE5B,SAAS,CAAC,UAAgB;;AAAA,8BAAS,UAAT,mBAAgB,QAAQ;AAAA;AAAA;AAAA,MAElD,QAAQ,MAAM;;AAAA,8BAAS,UAAT,mBAAgB;AAAA;AAAA;AAAA,MAE9B,OAAO,MAAA;;AAAM,8BAAS,UAAT,mBAAgB;AAAA;AAAA,IAAM,CACpC;AAKD,cAAU,MAAM;AACd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAClD,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,gBAAgB;AAAA,IAAA,CACvD;;AA7LC,aAAAC,UAAA,GAAAC,YA0CS,OA1CTE,WA0CS;AAAA,iBAzCH;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,QACd,mBAAA;AAAA,QAEC,eAAa,QAAK;AAAA,QAClB,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,UAAU,QAAQ;AAAA,QAClB,YAAU,QAAO;AAAA,QACjB,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE;;AAAA,gCAAQ,UAAR,mBAAU;AAAA;AAAA,QACjB,aAAU,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE;;AAAA,gCAAQ,UAAR,mBAAU;AAAA;AAAA,MAAI;QAEhB,QAAMI,QAEf,CAYWa,eAde;AAAA,UAE1BZ,YAYW,SAAA;AAAA,qBAXL;AAAA,YAAJ,KAAI;AAAA,wBACK,SAAQ;AAAA,yEAAR,SAAQ,QAAA;AAAA,YACjB,MAAA;AAAA,YACC,OAAO,QAAK;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,UAAA;6BAED,MAEiB;AAAA,cAFjBA,YAEiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,iCADf,MAA0C;AAAA,kBAA1CO,WAA0C,0DAAb4B,UAAS,CAAA,CAAA;AAAA,gBAAA;;;;;;UAI1B,OAAO,SACrB5B,WAAyC,6DAAb4B,UAAS,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BCvC3CpC,YAWSC,MAAA,KAAA,GAAA;AAAA,QAVP,OAAA;AAAA,QACA,OAAM;AAAA,QACL,OAAKmD,eAAE,QAAS,YAAA,wBAA2B,MAAS;AAAA,QACpD,OAAO,QAAK;AAAA,QACZ,cAAY,QAAS;AAAA,QACrB,MAAM,QAAI;AAAA,QACV,WAAW,QAAS;AAAA,QACpB,UAAM,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,QAAS,aAAI,QAAQ,SAAA;AAAA,MAAA;yBAE9B,MAAS;AAAA,0CAAN,QAAG,GAAA,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwEV,UAAM,WAAW,IAAa;AAM9B,UAAM,SAAS;AA8CT,UAAA,SAASnC,SAId,SAAA,YAAA;AAGY,aAAA;AAAA;AAAA,MAEX,OAAO,MAAA;;AAAM,8BAAS,UAAT,mBAAgB;AAAA;AAAA,IAAM,CACpC;AAKK,UAAA,WAAW,WAA8B,EAAE;AAG3C,UAAA,QAAQ,IAAc,EAAE;AAC9B,UAAM,MAAM,OAAO,MAAM,CAAC,SAAS;AAC3B,YAAA,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,aAAa,EAAE,KAAK;AAAA,IAAA,GACvD,EAAE,WAAW,MAAM;AAatB,aAAS,WAAW,OAA4B;AAC1C,UAAA,CAAE,SAAS,MAAO;AAGtB,UAAI,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM,OAAQ;AAGlE,UAAA,MAAM,SAAS,OAAO;AACxB,YAAI,CAAE,SAAS,MAAM,CAAC,EAAG;AACnB,cAAA,SAAS,SAAS,MAAM,CAAC;AAE/B,YAAI,SAAS,MAAM,iBAAiB,MAAM,EAAG;AAI7C,iBAAS,MAAM,aAAa,SAAS,MAAM,CAAC,GAAG,KAAK;AACpD,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB;AAAA,MAAA;AAIE,UAAA,MAAM,SAAS,UAAU;AAEvB,YAAA,SAAS,MAAM,SAAS,GAAG;AAC7B,mBAAS,QAAQ,CAAC;AAAA,QAAA,OAEb;AACI,mBAAA,MAAM,iBAAiB,IAAI,IAAI;AAAA,QAAA;AAG1C,iBAAS,MAAM,UAAU;AACzB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MAAA;AAAA,IACxB;AAIO,aAAA,QACL,MACA,QACA,QACI;AACN,aAAO,MAAM;AAEP,YAAA,KAAK,SAAS,EAAG,QAAO,SAAS,QAAQ,OAAO,OAAO,EAAE;AAEvD,cAAA,SAAS,KAAK,YAAY;AAC1B,cAAA,UAAU,MAAM,MACjB,OAAO,CAAC,QAAQ,IAAI,QAAQ,MAAM,KAAK,CAAC,EACxC,OAAO,CAAC,QAAQ,OAAO,MAAM,QAAQ,GAAG,IAAI,CAAC;AACzC,iBAAA,QAAQ,OAAO,OAAO,OAAO;AAAA,MACxC,GAAG,CAAC,WAAW;;AAET,YAAA,UAAQ,YAAO,YAAP,mBAAgB,SAAQ;AAClC,iBAAO,eAAe,EAAE;AACjB,iBAAA,oBAAoB,GAAG,KAAK;AAAA,QAAA;AAAA,MACrC,CACD;AAAA,IAAA;AAIH,aAAS,KAAK,GAA2C;;AAC9C,qBAAA,UAAA,mBAAO,iBAAiB;AAAA,IAAE;AAMrC,cAAU,MAAM;AACd,UAAI,CAAE,SAAS,MAAa,OAAA,IAAI,MAAM,gBAAgB;AAAA,IAAA,CACvD;;AA/OC,aAAAlB,UAAA,GAAAW,mBAkEM,OAlENyB,cAkEM;AAAA,QAjEJX,YAgEgBN,aAAA;AAAA,UA9Db,gBAAcE,KAAW;AAAA,UACzB,UAAUC,KAAQ;AAAA,UAClB,UAAUN,KAAQ;AAAA,UAClB,cAAYO,KAAS;AAAA,UACrB,UAAUH,KAAQ;AAAA,QAAA;UAEnB,SAAAI,QAAA,CAPQ,UAAK;AAAA,YAObC,YAuDWvB,MAAA,OAAA,GAAA;AAAA,uBAtDL;AAAA,cAAJ,KAAI;AAAA,0BACK,OAAM;AAAA,2EAAN,OAAM,QAAA;AAAA,cAEf,OAAA;AAAA,cACA,UAAA;AAAA,cACA,eAAA;AAAA,cACA,aAAA;AAAA,cACA,aAAA;AAAA,cACA,UAAA;AAAA,cACA,sBAAA;AAAA,cAEC,OAAKwB;AAAAA,gBAAa,MAAM,WAAQ,qBAAkC,MAAM,WAAQ;;cAKhF,OAAO,QAAK;AAAA,cACZ,MAAM,QAAI;AAAA,cACV,MAAM,QAAI;AAAA,cAEV,gBAAc,MAAM;AAAA,cACpB,SAAS,MAAM;AAAA,cACf,UAAQ,CAAI,MAAM;AAAA,cAElB,SAAS,SAAQ;AAAA,cACjB,UAAU;AAAA,cACV,kBAAgB;AAAA,cAChB,kBAAgB,QAAW,cAAG,SAAS;AAAA,cACvC,UAAU;AAAA,cAEV,OAAK;AAAA,cACL,UAAQ;AAAA,cACR,WAAS;AAAA,YAAA;cAEC,gBACT,MAAsC;AAAA,gBAAtCD,YAAsCvB,MAAA,KAAA,GAAA;AAAA,kBAA7B,MAAM,QAAI;AAAA,kBAAE,OAAM;AAAA,gBAAA;;cAGlB,iBAAasB,QACtB,CAKE,SANwE;AAAA,gBAC1EC,YAKE,MAAA;AAAA,kBAJC,KAAK,KAAK;AAAA,kBACV,WAAW,MAAM,YAAe,CAAA,MAAM;AAAA,kBACvC,OAAM;AAAA,kBACL,sBAAQ,KAAK,cAAc,KAAK,KAAK;AAAA;;cAI/B,QAAMD,QACf,CAIS,WALqD;AAAA,gBAC9DC,YAISvB,MAAA,KAAA,GAJTC,WAAgB,OAAO,WAAS,EAAE,OAAA,GAAK,CAAA,GAAA;AAAA,mCACrC,MAEiB;AAAA,oBAFjBsB,YAEiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,uCADf,MAAkB;AAAA,wBAAf8C,gBAAAP,gBAAA,OAAO,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;;;;ACtDtB,MAAM,uBAAuB;AAAA,EAClC,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,GAAI;AAAA,EACV,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,QAAQ,QAAQ,MAAO;AAAA,EAC7B,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,QAAQ,MAAO;AAAA,EACrB,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,MAAM,MAAM,IAAK;AAAA,EACvB,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,QAAQ,MAAO;AAAA,EACrB,IAAI,CAAE,OAAO,KAAM;AAAA,EACnB,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAK;AAAA,EACpD,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,OAAO,KAAM;AAAA,EACnB,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,GAAI;AAAA,EACV,IAAI,CAAE,GAAI;AAAA,EACV,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,MAAM,KAAM;AAAA,EAClB,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,MAAO;AAAA,EACb,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,IAAK;AAAA,EACX,IAAI,CAAE,KAAM;AAAA,EACZ,IAAI,CAAE,KAAM;AACd;AAGa,MAAA,uBACX,OAAO,QAAQ,oBAAoB,EAAE,OAAO,CAAC,KAAK,CAAE,KAAK,QAAS,MAAM;AAEtE,QAAM,UAAU,cAAc,KAAK,CAACa,aAAYA,aAAY,GAAG;AAC3D,MAAA,CAAE,QAAgB,QAAA;AAGb,WAAA,QAAQ,CAAC,WAAW;AACvB,QAAA,CAAE,IAAI,MAAM,OAAO,MAAM,IAAI,CAAE,OAAQ;AAAA,QAClC,KAAA,MAAM,EAAE,KAAK,OAAO;AAAA,EAAA,CAC9B;AAGM,SAAA;AACT,GAAG,EAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjNtC,UAAM,EAAE,GAAG,MAAM,IAAI,cAAc;AAGnC,UAAM,SAAS,IAAgC;AAM/C,UAAM,SAAS;AAuDT,UAAA,SAASpC,SAId,SAAA,YAAA;AAKD,aAAS,aAAa,QAAyC;AACzD,UAAA,CAAE,OAAe,QAAA;AAGrB,UAAI,OAAO,SAAS,YAAY,OAAO,MAAM,GAAG,CAAC;AAGjD,UAAI,UAAU,sBAAsB;AAClC,cAAM,SAAS;AACT,cAAA,YAAY,qBAAqB,MAAM;AAE7C,cAAM,UAAU,UAAU,KAAK,CAACoC,aAAYA,aAAY,YAAY,KAAK;AACzE,eAAO,EAAE,SAAS,WAAW,UAAU,CAAC,GAAG,WAAW,OAAO;AAAA,MAAA;AAI/D,aAAO,aAAa,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA,IAAA;AAIhC,aAAA,aAAa,QAAgB,IAAgB;AAE5C,cAAA,MAAM,QAAQ,UAAU,EAAE;AAG5B,YAAA,cAAc,aAAa,KAAK;AAItC,aAAO,cAAc;AAAA,QACnB,WAAW,YAAY;AAAA,QACvB,SAAS,YAAY;AAAA,QACrB,QAAQ,YAAY;AAAA,QACpB,QAAQ,MAAM,MAAM,YAAY,OAAO,MAAM;AAAA,QAC7C,YAAY,IAAI,KAAK;AAAA,QACrB,OAAO,MAAM,UAAU,YAAY,OAAO,SAAS;AAAA,MAAA,IACjD;AAAA,QACF,WAAW,CAAC;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,QAAQ,IAAI,KAAK,KAAK;AAAA,QAClC,OAAO;AAAA,MACT;AAAA,IAAA;AAIF,aAAS,aAAa,OAA2B;AACvC,aAAA,MAAM,UAAU,MAAM,SAAU,IAAI,MAAM,MAAM,IAAI,MAAM,MAAM,KACjE,MAAM,SAAS,IAAI,MAAM,MAAM,KAC/B,MAAM,SAAS,IAAI,MAAM,MAAM,KAChC;AAAA,IAAA;AAMF,UAAA,cAAc,SAAqB,MAAM;AAC7C,YAAM,UAAU,cAAc,KAAK,CAACA,aAAYA,aAAY,OAAO,OAAO;AAC1E,aAAO,WAAW;AAAA,IAAA,CACnB;AAGK,UAAA,QAAQ,SAAS,MAAM;AACvB,UAAA,OAAO,MAAM,QAAS,QAAO,MAAM,KAAK,OAAO,MAAM,OAAO;AACzD,aAAA;AAAA,IAAA,CACR;AAGD,UAAM,SAAS,WAAuB,aAAa,OAAO,KAAK,CAAC;AAEhE,UAAM,SAAS,IAAY,aAAa,OAAO,KAAK,CAAC;AAK/C,UAAA,aAAa,CAAC,YAAY;AAG9B,UAAI,OAAO,MAAM,UAAU,SAAS,OAAO,GAAG;AAC5C,eAAO,MAAM,UAAU;AACvB,mBAAW,MAAM;AACjB;AAAA,MAAA;AAIE,UAAA,OAAO,MAAM,OAAQ;AAGzB,YAAM,SAAS,qBAAqB,YAAY,KAAK,EAAE,CAAC;AACjD,aAAA,QAAQ,aAAa,MAAM;AAC3B,aAAA,QAAQ,aAAa,OAAO,KAAK;AAAA,IAAA,GACvC,EAAE,WAAW,MAAM;AAGhB,UAAA,QAAQ,CAAC,UAAU;AACjB,YAAA,QAAQ,aAAa,KAAK;AAChC,UAAI,MAAM,eAAe,OAAO,MAAM,WAAY;AAC3C,aAAA,QAAQ,aAAa,KAAK;AACjC,aAAO,QAAQ;AAAA,IAAA,CAChB;AAGK,UAAA,QAAQ,CAAC,UAAU;AAEnB,UAAA,MAAM,KAAK,MAAM,IAAI;AACvB,eAAO,SAAS,MAAM;AACpB,gBAAM,SAAS,qBAAqB,YAAY,KAAK,EAAE,CAAC;AACjD,iBAAA,QAAQ,aAAa,MAAM;AAC3B,iBAAA,QAAQ,aAAa,OAAO,KAAK;AAAA,QAAA,CACzC;AAAA,MAAA;AAMH,UAAI,OAAO;AACH,cAAA,QAAQ,MAAM,MACf,QAAQ,YAAY,GAAG,EACvB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAGV,YAAI,UAAU,MAAO,QAAO,SAAS,MAAM,OAAO,QAAQ,KAAK;AAAA,MAAA;AAG3D,YAAA,QAAQ,aAAa,KAAK;AAChC,UAAI,MAAM,eAAe,OAAO,MAAM,WAAY;AAClD,aAAO,QAAQ,MAAM;AACrB,aAAO,QAAQ;AAAA,IAAA,CAChB;AAKK,UAAA,SAA+B,CAAE,MAAM;AAG3C,YAAM,QAAQ,OAAO;AAGjB,UAAA,OAAO,YAAa,CAAC,OAAQ;AAC/B,eAAO,EAAE;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA,CACL;AAAA,MAAA,WAGQ,CAAE,OAAO;AACX,eAAA;AAAA,MAAA;AAIT,UAAI,CAAE,aAAa,KAAK,EAAE,OAAO;AAC/B,eAAO,EAAE;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA,CACL;AAAA,MAAA;AAIH,iBAAW,aAAc,OAAO,SAAS,CAAA,GAAK;AACtC,cAAA,SAAS,UAAU,KAAK;AAC1B,YAAA,WAAW,KAAa,QAAA;AAAA,MAAA;AAIvB,aAAA;AAAA,IAAA,CACP;AAIF,aAAS,eAAe,OAAyB;;AAE3C,UAAA,MAAM,cAAc,aAAc;AAEtC,WAAI,WAAM,SAAN,mBAAY,MAAM,aAAc;AAEpC,YAAM,eAAe;AAAA,IAAA;AAMV,aAAA;AAAA;AAAA,MAEX,OAAO,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAE3B,iBAAiB,MAAM;;AAAA,4BAAO,UAAP,mBAAc;AAAA;AAAA;AAAA,MAErC,UAAU,MAAA;;AAAM,6BAAO,UAAP,mBAAc,eAAc;AAAA;AAAA;AAAA,MAE5C,UAAU,SAAS,MAAA;;AAAM,6BAAO,UAAP,mBAAc,aAAY;AAAA,OAAK;AAAA,IAAA,CACzD;AAED,cAAU,MAAM;AAEd,UAAI,CAAE,OAAO,MAAa,OAAA,IAAI,MAAM,cAAc;AAAA,IAAA,CACnD;;AAhVC,aAAAtD,UAAA,GAAAC,YAuBE,OAvBFE,WAuBE;AAAA,iBAtBI;AAAA,QAAJ,KAAI;AAAA,MAAA,GACIC,KAAM,QAAA;AAAA,oBACL,OAAM;AAAA,qEAAN,OAAM,QAAA;AAAA,QACf,MAAK;AAAA,QACL,MAAK;AAAA,QAEJ,OAAO,QAAK;AAAA,QACZ,aAAa,QAAW;AAAA,QACxB,MAAM,QAAI;AAAA,QACV,MAAM,QAAI;AAAA,QAEV,gBAAciB,KAAW;AAAA,QACzB,UAAUL,KAAQ;AAAA,QAClB,UAAUM,KAAQ;AAAA,QAClB,UAAUF,KAAQ;AAAA,QAElB,OAAO;AAAA,QACP,cAAYG,KAAS;AAAA,QACrB,QAAQ,MAAK;AAAA,QAEb,eAAa;AAAA,QACb,yCAAa,OAAM,QAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACWxB,UAAM,QAAQ;AAad,UAAM,QAAQxB,SAAA;AAOd,cAAU,MAAM;AACV,UAAA,MAAM,SAAS,MAAM,MAAO;AAChC,WAAK,4CAA4C;AAAA,IAAA,CAClD;;AAxDC,aAAAC,UAAA,GAAAW,mBAuBM,OAvBNyB,cAuBM;AAAA,QApBO,MAAK,SAAA,KAAhBpC,UAAA,GAAAW,mBAEM,OAFN2B,cAEM;AAAA,UADJ7B,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,QAAA;QAKzB8B,mBAaM,OAbNC,cAaM;AAAA,UAZJD,mBAIM,OAJNG,cAIM;AAAA,YAHQ,QAAK,SAAjB1C,UAAA,GAAAW,mBAAqC,sCAAf,QAAK,KAAA,GAAA,CAAA,KACV,MAAM,QAAvBF,WAA6C,KAAA,QAAA,SAAA,EAAA,KAAA,KAAA,QAAA,IAAA,KAC7CT,aAAAW,mBAAkC,sCAAlB,GAAQ,CAAA;AAAA,UAAA;UAEf,QAAO,WAAI,MAAM,WAA5BX,aAAAW,mBAGM,OAHN4C,cAGM;AAAA,YAFQ,QAAO,WAAnBvD,UAAA,GAAAW,mBAAyC,sCAAjB,QAAO,OAAA,GAAA,CAAA,KACd,MAAM,UAAvBF,WAAiD,KAAA,QAAA,WAAA,EAAA,KAAA,EAAA,GAAA,QAAA,IAAA;;UAExC,MAAM,QAAjBT,UAAA,GAAAW,mBAEM,OAFN6C,cAEM;AAAA,YADJ/C,WAAoB,KAAA,QAAA,QAAA,CAAA,GAAA,QAAA,IAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0C5B,UAAM,SAAS;AA0Bf,UAAM,SAASV,SAAA;AASf,UAAM,QAAQ;AAUd,UAAM,UAAU,gBAAgB,MAAM,OAAO,KAAK,CAAC;AAEnD,UAAM,QAAQ,IAA4C;AAGpD,UAAA,YAAY,SAAS,MAAM,CAAE,GAAG,UAAU,OAAO,OAAO,OAAO,CAAC;AAEtE,UAAM,eAAe,SAAS,MAAM;;AAAA,uBAAU,WAAS,WAAM,UAAN,mBAAa;AAAA,KAAO;AAK3E,aAAS,UAAgB;AACvB,YAAM,QAAQ;AAAA,IAAA;AAIhB,mBAAe,UAAyB;;AAClC,UAAA,CAAE,aAAa,MAAO;AAC1B,YAAM,QAAQ,QAAM,WAAM,UAAN,mBAAa;AAC7B,UAAA,aAAa,MAAM;AAAA,IAAA;;0BA/HvBY,mBA0CM,OAAA,MAAA;AAAA,QAzCJc,YA6BgBgC,SAAA;AAAA,UA7BA,OAAO,QAAK;AAAA,UAAG,SAAS,QAAO;AAAA;2BAQ7C,MAoBc;AAAA,YApBdhC,YAoBcmB,aAAA,MAAA;AAAA,+BAlBZ,MAOE;AAAA,gBAPFnB,YAOE,MAAA;AAAA,kBANA,QAAO;AAAA,kBACP,OAAM;AAAA,kBACL,SAAS,QAAQ;AAAA,kBACjB,MAAMvB,MAAK,KAAA,EAAC;AAAA,kBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,MAAM;AAAA,kBAC7B,SAAO;AAAA,gBAAA;gBAIVuB,YAOE,MAAA;AAAA,kBANA,QAAO;AAAA,kBACP,OAAM;AAAA,kBACL,SAAS,QAAQ,YAAA,CAAM,aAAY;AAAA,kBACnC,MAAMvB,MAAK,KAAA,EAAC;AAAA,kBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,IAAI;AAAA,kBAC3B,SAAO;AAAA;;;;;;;UAzBI,OAAO;kBAAQ;AAAA,wBAC7B,MAAqB;AAAA,cAArBO,WAAqB,KAAA,QAAA,OAAA;AAAA,YAAA;;;UAEP,OAAO;kBAAU;AAAA,wBAC/B,MAAuB;AAAA,cAAvBA,WAAuB,KAAA,QAAA,SAAA;AAAA,YAAA;;;;QA0B3BgB,YASSiC,aAAA;AAAA,mBARH;AAAA,UAAJ,KAAI;AAAA,UACJ,OAAM;AAAA,UACN,gBAAA;AAAA,UACA,UAAA;AAAA,UACC,UAAU,QAAQ;AAAA,UAClB,wBAAqB,SAAO,CAAA,WAAA,MAAA,CAAA;AAAA,QAAA;2BAE7B,MAAuB;AAAA,YAAvBjD,WAAuB,KAAA,QAAA,SAAA;AAAA,UAAA;;;;;;;ACqBtB,SAAS,aAAuB;AAC/B,QAAA,EAAE,EAAE,IAAI,cAAc;AACtB,QAAA,EAAE,OAAO,IAAI,UAAU;AAE7B,WAAS,QAAQ,SASI;AACZ,WAAA,IAAI,QAAiB,CAAC,YAAY;AACvC,YAAM,WAAW,OAAO;AAAA,QACtB,WAAWkD;AAAAA,QACX,gBAAgB,EAAE,GAAG,QAAQ;AAAA,MAAA,CAC9B;AACD,eAAS,KAAK,MAAM,QAAQ,IAAI,CAAC;AACjC,eAAS,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,IAAA,CACvC;AAAA,EAAA;AAGH,WAAS,iBAAmC;AAC1C,WAAO,QAAQ;AAAA,MACb,OAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MACD,SAAS,EAAE;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MACD,SAAS,EAAE,aAAa,OAAO;AAAA,MAC/B,aAAa,MAAM;AAAA,MACnB,cAAc;AAAA,MAEd,QAAQ,EAAE,aAAa,IAAI;AAAA,MAC3B,YAAY,MAAM;AAAA,MAClB,aAAa;AAAA,IAAA,CACd;AAAA,EAAA;AAGH,WAAS,gBAAkC;AACzC,WAAO,QAAQ;AAAA,MACb,OAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MACD,SAAS,EAAE;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MAED,SAAS,EAAE,aAAa,MAAM;AAAA,MAC9B,aAAa,MAAM;AAAA,MACnB,cAAc;AAAA,MAEd,QAAQ,EAAE,aAAa,IAAI;AAAA,MAC3B,YAAY,MAAM;AAAA,MAClB,aAAa;AAAA,IAAA,CACd;AAAA,EAAA;AAGH,WAAS,iBAAmC;AAC1C,WAAO,QAAQ;AAAA,MACb,OAAO,EAAE;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MACD,SAAS,EAAE;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,CACL;AAAA,MAED,SAAS,EAAE,aAAa,OAAO;AAAA,MAC/B,aAAa,MAAM;AAAA,MACnB,cAAc;AAAA,MAEd,QAAQ,EAAE,aAAa,MAAM;AAAA,MAC7B,YAAY,MAAM;AAAA,MAClB,aAAa;AAAA,IAAA,CACd;AAAA,EAAA;AAGH,WAAS,SAAS,SAM2C;AAC3D,UAAM,WAAW,OAAO;AAAA,MACtB,WAAWC;AAAAA,MACX,gBAAgB;AAAA,QACd,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ,YAAY;AAAA,QAC9B,OAAO,QAAQ,SAAS;AAAA,QACxB,UAAU,QAAQ;AAAA,MAAA;AAAA,IACpB,CACD;AAEM,WAAA;AAAA,MACL,QAAQ,CAACC,cAAqB,SAAS,OAAO,EAAE,UAAAA,WAAU;AAAA,MAC1D,MAAM,MAAM,SAAS,KAAK;AAAA,IAC5B;AAAA,EAAA;AAGF,SAAO,EAAE,SAAS,gBAAgB,eAAe,gBAAgB,SAAS;AAC5E;ACxKA,MAAM,WAAW,WAId;AAUa,SAAA,YACZ,SACA,UACA,MACI;AACN,QAAM,OAAO,OAAO,aAAa,WAAW,WAAW,EAAE,GAAG,SAAS;AAC/D,QAAA,QAAQ,QAAQ,IAAI,CAAC,MAAM,OAAO,MAAM,WAAW,IAAI,EAAE,IAAI;AACnE,WAAS,QAAQ,EAAE,MAAM,MAAM,MAAM;AACvC;AAEO,SAAS,YAAY,MAAqC;AAC3D,MAAA,CAAE,SAAS,MAAc,QAAA;AAC7B,QAAM,EAAE,OAAO,MAAM,SAAS,SAAS;AAEjC,QAAA,SAAS,MAAM,QAAQ,IAAI;AAC7B,MAAA,WAAW,GAAW,QAAA;AAEpB,QAAA,OAAO,MAAM,SAAS,CAAC;AACvB,QAAA,OAAO,MAAM,SAAS,CAAC;AAEtB,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,MAAM,QAAQ,KAAK,IAAI;AAAA,IACvB,MAAM,QAAQ,KAAK,IAAI;AAAA,EACzB;AACF;;;;;;;;;;;;0BC7CElD,mBAsCM,OAAA,MAAA;AAAA,QApCJc,YAOE,MAAA;AAAA,UANA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAM;AAAA,UACN,MAAK;AAAA,UACJ,IAAI,QAAQ,SAAC;AAAA;QAIhBc,mBAGO,QAHPH,cAGOK,gBAFFqB,KAAE,GAAC,iBAAS,SAAc,CAAA,CAAA,IAAA,sBAC1BlC,KAAE,GAAA,EAAA,IAAA,WAAA,IAAA,WAAA,GAAA,EAAA,GAAyCkC,QAAG,QAAA,SAAS,MAAM,EAAA,CAAA,CAAA,GAAA,CAAA;AAAA,QAIlErC,YAQE,MAAA;AAAA,UAPA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAM;AAAA,UACL,MAAMvB,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,SAAO,CAAG,QAAQ,SAAC;AAAA,UACnB,IAAI,QAAQ,SAAC;AAAA,QAAA;QAIhBuB,YAQE,MAAA;AAAA,UAPA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAK;AAAA,UACL,OAAM;AAAA,UACL,MAAMvB,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,SAAO,CAAG,QAAQ,SAAC;AAAA,UACnB,IAAI,QAAQ,SAAC;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC2KpB,UAAM,EAAE,eAAe,gBAAgB,eAAA,IAAmB,WAAW;AAMrE,UAAM,SAAS;AAuDT,UAAA,SAASgB,SAGd,SAAA,YAAA;AAGK,UAAA,WAAWA,SAAW,SAAC,MAI5B;AAED,UAAM,SAASnB,SAAA;AAsBf,QAAI,UAAmC;AAEvC,UAAM,QAAQ,IAA4C;AAGpD,UAAA,YAAY,SAAS,MAAM,SAAS,SAAU,CAAE,GAAG,UAAU,OAAO,OAAO,OAAO,CAAE;AAE1F,UAAM,SAAS,SAAS,MAAM;;AAAA,yBAAM,UAAN,mBAAa;AAAA,KAAO;AAElD,UAAM,eAAe,SAAS,MAAM,UAAU,SAAS,MAAM;AAGvD,UAAA,YAAY,IAAI,KAAK;AAErB,UAAA,YAAY,IAAI,KAAK;AAG3B,UAAM,YAAY,SAAS,MAAM,YAAY,OAAO,MAAM,IAAI,CAAC;AAGzD,UAAA,UAAU,CAAC,YAAY;AAC3B,UAAI,QAAmB,WAAA,gBAAgB,MAAM,OAAO,KAAK,CAAC;AAAA,UAC3C,WAAA;AAAA,IAAA,GACd,EAAE,WAAW,MAAM;AAKtB,UAAM,EAAE,MAAM,QAAQ,IAAI,aAAa;AAGvC,aAAS,QAAc;AACrB,UAAI,SAAS,UAAU,KAAM,UAAS,QAAQ;AAAA,IAAA;AAIhD,mBAAe,UAAyB;AAClC,UAAA,SAAS,UAAU,MAAO;AAE9B,YAAM,KAAK,YAAY;AACrB,YAAI,CAAE,UAAU,MAAO,QAAO,SAAS,QAAQ;AAEzC,cAAA,SAAS,MAAM,eAAe;AACpC,YAAI,CAAE,OAAQ;AAEP,eAAA,QAAQ,gBAAgB,OAAQ;AACvC,iBAAS,QAAQ;AAAA,MAAA,CAClB;AAAA,IAAA;AAIH,mBAAe,UAAyB;;AAClC,UAAA,CAAE,OAAO,OAAQ;AACjB,UAAA,CAAE,aAAa,MAAO;AAC1B,YAAM,QAAQ,QAAM,WAAM,UAAN,mBAAa;AAC7B,UAAA,cAAc,OAAO;AAAA,IAAA;AAI3B,mBAAe,UAAyB;AAClC,UAAA,OAAO,MAAM,QAAS;AAE1B,YAAM,KAAK,YAAY;;AACf,cAAA,SAAS,MAAM,cAAc;AAC/B,YAAA,qBAAe;MAAW,CAC/B;AAAA,IAAA;AAIH,mBAAe,WAA0B;AACnC,UAAA,CAAE,OAAO,MAAM,QAAS;AAE5B,YAAM,KAAK,YAAY;;AACf,cAAA,SAAS,MAAM,eAAe;AAChC,YAAA,qBAAe;MAAY,CAChC;AAAA,IAAA;AAKU,aAAA;AAAA,MACX,UAAU,YAAA;;AAAa,uBAAM,WAAM,UAAN,mBAAa,eAAc;AAAA;AAAA,MACxD,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS;AAAA,IAAA,CACV;;0BAnYCY,mBAwLM,OAAA,MAAA;AAAA,QAvLJc,YAuHkBsC,SAAA;AAAA,UAvHA,OAAO,QAAK;AAAA,UAAG,SAAS,QAAO;AAAA;UAUpC,cACT,MAKE;AAAA,YALFtC,YAKEvB,MAAA,KAAA,GAAA;AAAA,cAJA,MAAK;AAAA,cACL,OAAM;AAAA,cACN,MAAK;AAAA,cACJ,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,UAAS,QAAA,CAAI,UAAS;AAAA,YAAA;YAEhCuB,YAKEvB,MAAA,KAAA,GAAA;AAAA,cAJA,MAAK;AAAA,cACL,OAAM;AAAA,cACN,MAAK;AAAA,cACJ,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,UAAS,QAAA,CAAI,UAAS;AAAA,YAAA;YAIhCO,WAAyB,KAAA,QAAA,aAAA,CAAA,GAAA,QAAA,IAAA;AAAA,UAAA;2BAI3B,MA+EM;AAAA,YA/EN8B,mBA+EM,OA/ENH,cA+EM;AAAA,cA5EO,OAAM,iBAAA,KAAjBpC,UAAA,GAAAW,mBAEM,OAFN2B,cAEM;AAAA,gBADJ7B,WAA+B,KAAA,QAAA,mBAAA,CAAA,GAAA,QAAA,IAAA;AAAA,cAAA;cAIjC8B,mBAiEM,OAjENC,cAiEM;AAAA,gBAhEe,SAAQ,sBAA3BvC,YAqBc2C,aAAA,EAAA,KAAA,KAAA;AAAA,mCAnBZ,MAOE;AAAA,oBAPFnB,YAOE,MAAA;AAAA,sBANA,QAAO;AAAA,sBACP,OAAM;AAAA,sBACL,SAAS,QAAQ;AAAA,sBACjB,MAAMvB,MAAK,KAAA,EAAC;AAAA,sBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,MAAM;AAAA,sBAC7B,SAAO;AAAA,oBAAA;oBAKF,QAAM,uBADdD,YAQE,MAAA;AAAA;sBANA,QAAO;AAAA,sBACP,OAAM;AAAA,sBACL,SAAS,QAAQ,YAAA,CAAM,aAAY;AAAA,sBACnC,MAAMC,MAAK,KAAA,EAAC;AAAA,sBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,IAAI;AAAA,sBAC3B,SAAO;AAAA,oBAAA;;;sBAQC,OAAM,MAAC,WAAW,QAAS,0BADxCD,YAQE,MAAA;AAAA;kBANA,QAAO;AAAA,kBACP,OAAM;AAAA,kBACL,SAAS,QAAQ;AAAA,kBACjB,MAAMC,MAAK,KAAA,EAAC;AAAA,kBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,OAAO;AAAA,kBAC9B,SAAO;AAAA,2EAKVD,YAyBc2C,aAAA,EAAA,KAAA,KAAA;AAAA,mCAvBZ,MAQE;AAAA,qBAPS,OAAM,MAAC,WAAY,QAAQ,yBADtC3C,YAQE,MAAA;AAAA;sBANA,QAAO;AAAA,sBACP,OAAM;AAAA,sBACL,SAAS,QAAQ;AAAA,sBACjB,MAAMC,MAAK,KAAA,EAAC;AAAA,sBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,MAAM;AAAA,sBAC7B,SAAO;AAAA,oBAAA;oBAIE,OAAO,UAAnBO,WAA6C,KAAA,QAAA,WAAA,EAAA,KAAA,KAAA,QAAA,IAAA;oBAIrC,QAAM,uBADdR,YAQE,MAAA;AAAA;sBANA,QAAO;AAAA,sBACP,OAAM;AAAA,sBACL,SAAS,QAAQ;AAAA,sBACjB,MAAMC,MAAK,KAAA,EAAC;AAAA,sBACZ,OAAO0B,KAAAA,GAAG1B,MAAA,YAAA,EAAa,IAAI;AAAA,sBAC3B,SAAO;AAAA,oBAAA;;;;;cAMH,OAAM,gBAAA,KAAjBF,UAAA,GAAAW,mBAEM,OAFN+B,cAEM;AAAA,gBADJjC,WAA8B,KAAA,QAAA,kBAAA,CAAA,GAAA,QAAA,IAAA;AAAA,cAAA;;YAKvB,OAAM,gBAAA,KAAjBT,UAAA,GAAAW,mBAIM,OAJNqD,cAIM;AAAA,cAHJzB,mBAEM,OAFN0B,cAEM;AAAA,gBADJxD,WAA8B,KAAA,QAAA,kBAAA,CAAA,GAAA,QAAA,IAAA;AAAA;;YAKhB,UAAS,sBAA3BR,YAAqFiE,aAAA;AAAA;cAAxD,OAAM;AAAA,cAA2B,UAAU,UAAS;AAAA,YAAA;;;;UArHjE,OAAO;kBAAQ;AAAA,wBAC7B,MAAqB;AAAA,cAArBzD,WAAqB,KAAA,QAAA,SAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;UAGP,OAAO;kBAAU;AAAA,wBAC/B,MAAuB;AAAA,cAAvBA,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;;QAsH3BgB,YASW,SAAA;AAAA,sBARA,UAAS;AAAA,uEAAT,UAAS,QAAA;AAAA,UAClB,OAAM;AAAA,UACN,cAAA;AAAA,UACA,eAAA;AAAA,QAAA;2BAEA,MAEiB;AAAA,YAFjBA,YAEiBvB,MAAA,YAAA,GAAA,EAFD,OAAM,iBAAa;AAAA,+BACjC,MAAgD;AAAA,gBAAhDqC,mBAAgD,OAAxC,MAAAE,gBAAA,KAAK,UAAU,OAAM,OAAA,MAAA,CAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;QAKjChB,YA+BW,SAAA;AAAA,sBA9BA,UAAS;AAAA,uEAAT,UAAS,QAAA;AAAA,UAClB,OAAM;AAAA,QAAA;2BAEN,MA0BiB;AAAA,YA1BjBA,YA0BiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,+BAzBf,MAKE;AAAA,gBALFuB,YAKE,QAAA;AAAA,kBAJA,SAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,OAAOG,KAAE,GAAC1B,MAAY,YAAA,EAAA,aAAA,CAAA;AAAA,kBACtB,OAAO,OAAA,MAAO,KAAK,YAAW;AAAA;gBAEjCuB,YAKE,QAAA;AAAA,kBAJA,SAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,OAAOG,KAAE,GAAC1B,MAAY,YAAA,EAAA,gBAAA,CAAA;AAAA,kBACtB,OAAOiE,KAAAA,GAAG,OAAA,MAAO,SAAO,MAAA;AAAA;gBAE3B1C,YAKE,QAAA;AAAA,kBAJA,SAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,OAAOG,KAAE,GAAC1B,MAAY,YAAA,EAAA,iBAAA,CAAA;AAAA,kBACtB,OAAOiE,KAAAA,GAAG,OAAA,MAAO,UAAQ,MAAA;AAAA;gBAGpB,OAAA,MAAO,wBADflE,YAME,QAAA;AAAA;kBAJA,SAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,OAAO2B,KAAE,GAAC1B,MAAY,YAAA,EAAA,gBAAA,CAAA;AAAA,kBACtB,OAAOiE,KAAAA,GAAG,OAAA,MAAO,SAAO,MAAA;AAAA,gBAAA;;;;;;;QAQ/B1C,YAUSiC,aAAA;AAAA,mBATH;AAAA,UAAJ,KAAI;AAAA,UACJ,OAAM;AAAA,UACN,gBAAA;AAAA,UACC,QAAQ,QAAM;AAAA,UACd,UAAU,SAAQ;AAAA,UAClB,UAAU,QAAQ,YAAIxD,MAAO,OAAA;AAAA,UAC7B,wBAAqB,SAAO,CAAA,WAAA,MAAA,CAAA;AAAA,QAAA;2BAE7B,MAAuB;AAAA,YAAvBO,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,UAAA;;;;;;;;AC/KtB,MAAM,aAAa;AAAA;AAAA,EAExB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,CAAC,EAAE,YAAiC,QAAQ,KAAK;AAAA,EAC5D;AAAA;AAAA,EAEA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AAQO,MAAM,kBAAkB;AAAA,EAC7B,YAAY;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AAkDO,SAAS,mBAA+C;AAC7D,QAAM,EAAE,GAAG,EAAE,IAAI,cAAc;AAExB,SAAA;AAAA,IACL,MAAM;AAAA,MACJ,OAAO,MAAM,EAAE,aAAa,aAAa,CAAC;AAAA,MAC1C,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,OAAO,MAAM,EAAE,aAAa,gBAAgB,CAAC;AAAA,MAC7C,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO;AAAA,MAC7B,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,MACR,OAAO,MAAM,EAAE,aAAa,iBAAiB,CAAC;AAAA,MAC9C,OAAO,CAAC,QAAQ,EAAE,IAAI,QAAQ;AAAA,MAC9B,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,OAAO,MAAM,EAAE,aAAa,gBAAgB,CAAC;AAAA,MAC7C,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO;AAAA,MAC7B,UAAU;AAAA,MACV,QAAQ;AAAA,IAAA;AAAA,EAEZ;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpEM,UAAA,UAAUS,SAGf,SAAA,YAAA;AAKD,aAAS,cAAc,OAAqB;AAC1C,UAAI,QAAQ,MAAM,SAAS,KAAK,GAAG;AACjC,gBAAQ,QAAQ,QAAQ,MAAM,OAAO,CAAC,MAAM,MAAM,KAAK;AAAA,MAAA,OAClD;AACL,gBAAQ,QAAQ,CAAE,GAAG,QAAQ,OAAO,KAAM;AAAA,MAAA;AAAA,IAC5C;;0BApFAjB,YA8BiB,cAAA;AAAA,QA7Bf,MAAA;AAAA,QACA,OAAA;AAAA,QACA,qBAAA;AAAA,QACC,SAAS,QAAO;AAAA,QAChB,MAAM,QAAK,QAAA,OAAA;AAAA,QACX,iBAAeC,MAAA,KAAA,EAAM,MAAM;AAAA,QAC3B,SAAS0B,KAAE,GAAA,EAAA,IAAA,WAAA,IAAA,UAAA,CAAA;AAAA,MAAA;yBAEZ,MAoBS;AAAA,UApBTH,YAoBSvB,MAAA,KAAA,GAAA;AAAA,YApBD,OAAA;AAAA,YAAM,UAAA;AAAA,UAAA;6BAEV,MAAiC;AAAA,eADnCF,UAAA,IAAA,GAAAW,mBAkBSC,UAjBkB,MAAAiC,WAAA,QAAA,SAAjB,CAAA,QAAQ,SAAI;oCADtB5C,YAkBSC,MAAA,KAAA,GAAA;AAAA,kBAhBN,KAAK;AAAA,kBACL,OAA0CwB,eAAA,EAAA,iCAAA,QAAA,MAAQ,SAAS,IAAI,GAAA;AAAA,kBAChE,WAAA;AAAA,kBACC,SAAK,CAAA,WAAE,cAAc,IAAI;AAAA,gBAAA;mCAE1B,MAIiB;AAAA,oBAJjBD,YAIiBvB,MAAA,YAAA,GAAA,MAAA;AAAA,uCAHf,MAEe;AAAA,wBAFfuB,YAEevB,MAAA,UAAA,GAAA,MAAA;AAAA,2CADb,MAAwE;AAAA,mEAA9D,OAAO,UAAuB,aAAA,OAAO,MAAU,IAAA,OAAO,KAAK,GAAA,CAAA;AAAA,0BAAA;;;;;;oBAGzEuB,YAKiBvB,MAAA,YAAA,GAAA,EALD,MAAA,MAAI;AAAA,uCAClB,MAGE;AAAA,wBAHFuB,YAGEvB,MAAA,KAAA,GAAA;AAAA,0BAFA,MAAK;AAAA,0BACJ,MAAM,QAAO,MAAC,SAAS,IAAI,IAAIA,MAAA,KAAA,EAAM,WAAW,KAAKA,aAAM,WAAW;AAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACY7E,UAAA,aAAagB,SAGlB,SAAA,YAAA;;0BAxCCjB,YAQE,MAAA;AAAA,QAPA,MAAA;AAAA,QACA,OAAA;AAAA,QACC,SAAS,QAAO;AAAA,QAChB,MAAM,QAAK,QAAA,OAAA;AAAA,QACX,MAAM,WAAA,QAAaC,MAAA,KAAA,EAAM,WAAW,OAAOA,MAAA,KAAA,EAAM,WAAW;AAAA,QAC5D,SAAS0B,KAAE,GAAA,EAAA,IAAA,eAAA,IAAA,qBAAA;AAAA,QACX,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,WAAU,QAAA,CAAK,WAAU;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0DrC,UAAM,EAAE,GAAG,EAAE,IAAI,cAAc;AACzB,UAAA,EAAE,OAAO,IAAI,UAAU;AAI7B,UAAM,SAAS;AA0BT,UAAA,QAAQV,SAGb,SAAA,YAAA;AAGK,UAAA,QAAQ,SAAS,MAAM;AAC3B,UAAI,OAAO,QAAQ,UAAU,EAAE,OAAO,OAAO,CAAC;AAC9C,UAAI,CAAE,OAAO,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC3C,aAAO,EAAE,EAAE,IAAI,QAAQ,IAAI,SAAS;AAAA,IAAA,CACrC;;AA1GC,aAAAlB,UAAA,GAAAW,mBAkDM,OAlDNyB,cAkDM;AAAA,QA/CIlC,MAAM,MAAA,EAAC,GAAG,mBADlBD,YAQE,MAAA;AAAA;UANA,MAAA;AAAA,UACA,OAAA;AAAA,UACC,MAAMC,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,MAAM,QAAK,QAAA,OAAA;AAAA,UACX,SAAS,QAAO,WAAK,MAAK,QAAA;AAAA,UAC1B,+CAAO,MAAK,QAAA;AAAA,QAAA;QAIfuB,YAOE,MAAA;AAAA,UANA,MAAA;AAAA,UACA,OAAA;AAAA,UACC,MAAMvB,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,MAAM,QAAK,QAAA,OAAA;AAAA,UACX,SAAS,QAAO,WAAK,MAAK,QAAA;AAAA,UAC1B,+CAAO,MAAK,SAAA;AAAA,QAAA;QAIfqC,mBAKM,OALND,cAKM;AAAA,0CAJDwB,KAAE,GAAC,MAAK,QAAA,CAAA,CAAA,IAAQ,KACnB,CAAA;AAAA,UAAY,QAAA,QAAQ5D,MAAA,MAAA,EAAO,GAAG,MAA9BF,UAAA,GAAAW,mBAEO,QAFP6B,cACKZ,gBAAAA,KAAAA,yCAAyC,MAAK,MAAA,CAAA,CAAA,GAAA,CAAA;;QAKrDH,YAOE,MAAA;AAAA,UANA,MAAA;AAAA,UACA,OAAA;AAAA,UACC,MAAMvB,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,MAAM,QAAK,QAAA,OAAA;AAAA,UACX,SAAS,QAAO,WAAA,CAAO,QAAI;AAAA,UAC3B,+CAAO,MAAK,SAAA;AAAA,QAAA;QAKPA,MAAM,MAAA,EAAC,GAAG,mBADlBD,YAQE,MAAA;AAAA;UANA,MAAA;AAAA,UACA,OAAA;AAAA,UACC,MAAMC,MAAA,KAAA,EAAM,WAAW;AAAA,UACvB,MAAM,QAAK,QAAA,OAAA;AAAA,UACX,SAAS,QAAA,YAAa,QAAA,cAAc,MAAK;AAAA,UACzC,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,MAAK,QAAG,QAAI;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqBpB,UAAA,SAASgB,SAGd,SAAA,YAAA;;0BAxECjB,YA8BiB,cAAA;AAAA,QA7Bf,MAAA;AAAA,QACA,OAAA;AAAA,QACA,qBAAA;AAAA,QACC,cAAY;AAAA,QACZ,SAAS,QAAO;AAAA,QAChB,MAAM,QAAK,QAAA,OAAA;AAAA,QACX,iBAAeC,MAAA,KAAA,EAAM,MAAM;AAAA,QAC3B,SAAS0B,KAAE,GAAA,EAAA,IAAA,QAAA,IAAA,SAAA,CAAA;AAAA,MAAA;yBAEZ,MAmBS;AAAA,UAnBTH,YAmBSvB,MAAA,KAAA,GAAA;AAAA,YAnBD,OAAA;AAAA,YAAM,UAAA;AAAA,UAAA;6BAEV,MAA8B;AAAA,eADhCF,UAAA,IAAA,GAAAW,mBAiBSC,UAhBe,MAAAiC,WAAA,QAAA,SAAd,CAAA,QAAQ,MAAC;oCADnB5C,YAiBSC,MAAA,KAAA,GAAA;AAAA,kBAfN,KAAK;AAAA,kBACL,OAA0CwB,eAAA,EAAA,iCAAA,OAAA,UAAW,OAAO,OAAK;AAAA,kBAClE,WAAA;AAAA,kBACC,SAAO,CAAA,WAAA,OAAA,QAAS,OAAO;AAAA,gBAAA;mCAExB,MAEiB;AAAA,oBAFjBD,YAEiBvB,MAAA,YAAA,GAAA,EAFD,OAAM,gBAAY;AAAA,uCAChC,MAA+C;AAAA,wBAA/CuB,YAA+CvB,MAAA,UAAA,GAAA,MAAA;AAAA,2CAAjC,MAAkB;AAAA,4BAAf8C,gBAAAP,gBAAA,OAAO,KAAK,GAAA,CAAA;AAAA,0BAAA;;;;;;oBAE/BhB,YAMiBvB,MAAA,YAAA,GAAA,EAND,MAAA,MAAI;AAAA,uCAClB,MAIE;AAAA,wBAJFuB,YAIEvB,MAAA,KAAA,GAAA;AAAA,0BAHA,MAAK;AAAA,0BACL,OAAM;AAAA,0BACL,MAAM,OAAO;AAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACqD1B,UAAM,QAAQ;AA2BR,UAAA,QAAQgB,SAGb,SAAA,YAAA;AAGK,UAAA,WAAWA,SAAY,SAAA,UAG5B;AAMK,UAAA,WAAW,SAAkE,MAAM;AAChF,aAAA,OAAO,QAAQ,MAAM,OAAO,EAAE,OAAO,CAAC,SAAS,CAAE,MAAM,MAAO,MAAM;AACnE,cAAA,OAAO,OAAO,QAAQ;AACxB,YAAA,OAAO,aAAa,KAAM,SAAQ,IAAI,IAAI,EAAE,MAAM,OAAO,MAAM;AAAA,iBAC1D,OAAO,aAAa,MAAO,SAAQ,IAAI,IAAI,EAAE,MAAM,OAAO,MAAM;AAAA,iBAChE,OAAO,aAAa,OAAQ,SAAQ,IAAI,IAAI,EAAE,MAAM,OAAO,OAAO;AACpE,eAAA;AAAA,MACT,GAAG,EAA6D;AAAA,IAAA,CACjE;AAGD,aAAS,WAAW,MAAoB;AAChC,YAAA,SAAS,SAAS,MAAM,IAAI;AAClC,UAAI,CAAE,OAAQ;AAMd,UAAI,MAAM,MAAM,SAAS,OAAO,MAAM;AAChC,YAAA,OAAO,UAAU,QAAQ;AAC3B,cAAI,MAAM,MAAM,KAAM,OAAM,MAAM,OAAO;AAAA,eACpC;AACH,kBAAM,MAAM,OAAO;AACnB,kBAAM,MAAM,OAAO;AAAA,UAAA;AAAA,QACrB,OACK;AACL,cAAI,CAAE,MAAM,MAAM,KAAM,OAAM,MAAM,OAAO;AAAA,eACtC;AACH,kBAAM,MAAM,OAAO;AACnB,kBAAM,MAAM,OAAO;AAAA,UAAA;AAAA,QACrB;AAAA,MACF,OACK;AACC,cAAA,MAAM,OAAO,OAAO,UAAU;AAC9B,cAAA,MAAM,OAAO,OAAO;AAAA,MAAA;AAAA,IAC5B;;0BA5JAjB,YAyDOC,MAAA,GAAA,GAAA;AAAA,QAzDA,OAAO,SAAQ;AAAA,QAAG,OAAKwB,eAAE,SAAQ,MAAC,SAAS;AAAA,MAAA;yBAEhD,MAcO;AAAA,UAbC,QAAS,0BADjBzB,YAcOC,MAAA,GAAA,GAAA;AAAA;YAZL,uBAAM,UAAQ;AAAA,gDACuC,QAAO;AAAA,mCAA+B,QAAO;AAAA,YAAA;;6BAKlG,MAKE;AAAA,cALFuB,YAKEvB,MAAA,SAAA,GAAA;AAAA,gBAJS,YAAA,SAAA,MAAS;AAAA,gBAAT,uBAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAA,SAAA,MAAS,WAAQ;AAAA,gBACzB,MAAM,SAAA,MAAS,eAAe;AAAA,gBAC/B,gBAAa;AAAA,gBACb,OAAA;AAAA;;;;WAKJF,UAAA,IAAA,GAAAW,mBAqCOC,UApCoB,MAAAiC,WAAA,QAAA,SAAjB,CAAA,QAAQ,SAAI;gCADtB5C,YAqCOC,MAAA,GAAA,GAAA;AAAA,cAnCJ,KAAK;AAAA,cACL,OAAO,SAAQ;AAAA,cAChB,uBAAM,qBAAmB;AAAA,gBAEuB,2BAAA,CAAA,CAAA,SAAA,MAAS,IAAI;AAAA,oCAAiC,SAAQ,MAAC,IAAI,KAAA,CAAS,QAAO;AAAA,kDAA8C,QAAO;AAAA,qCAA+B,QAAO;AAAA,cAAA;cADrN,sBAAO,QAAO,WAAA,uBAAA;AAAA,cAOd,SAAO,CAAA,WAAA,QAAA,WAAW,WAAW,IAAI;AAAA,YAAA;+BAElC,MAAqE;AAAA,gBAAvD,CAAA,CAAA,SAAA,MAAS,IAAI,KAA3BF,UAAA,GAAAW,mBAAqE,OAArEyB,YAAqE;gBAGvD,OAAO,UAAK,yBAA1BnC,YAA2DC,MAAA,KAAA,GAAA;AAAA;kBAAlB,OAAM;AAAA,gBAAA;gBAGnC,OAAO,UAAK,WAAxBF,aAAAW,mBAEO,QAFP2B,cACYG,gBAAA,OAAA,OAAO,UAAuB,aAAA,OAAO,MAAU,IAAA,OAAO,KAAK,GAAA,CAAA;iBAK9D,OAAO,QAAQ,UAAU,MAAA,MAAM,qBADxCxC,YAGEC,MAAA,KAAA,GAAA;AAAA;kBADC,MAAM,MAAA,MAAM,OAAOA,MAAK,KAAA,EAAC,QAAQ,aAAaA,MAAA,KAAA,EAAM,QAAQ;AAAA,gBAAA,yBAIzC,CAAA,CAAA,SAAA,MAAS,IAAI,kBAAnCD,YAAuEC,MAAA,KAAA,GAAA;AAAA;kBAAhC,MAAMA,MAAA,KAAA,EAAM,QAAQ;AAAA,gBAAA;gBAG/C,OAAO,UAAK,WAAxBF,aAAAW,mBAEO,QAFP6B,cACYC,gBAAA,OAAA,OAAO,UAAuB,aAAA,OAAO,MAAU,IAAA,OAAO,KAAK,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACuJvE,UAAA,EAAE,OAAO,IAAI,UAAU;AAM7B,UAAM,QAAQ;AAsHR,UAAA,QAAQvB,SAGb,SAAA,YAAA;AAID,UAAM,QAAQnB,SAAA;AASR,UAAA,OAAO,IAAY,CAAC;AAEpB,UAAA,OAAO,SAAiB,MAAM,KAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,KAAK,CAAC;AAE1E,UAAA,SAAS,IAAY,CAAC;AAEtB,UAAA,UAAU,SAAS,MAAM;AACzB,UAAA,MAAM,MAAO,QAAO,MAAM;AAC1B,UAAA,MAAM,KAAK,UAAU,OAAO,cAAc,MAAM,MAAM,SAAS,MAAM,KAAK;AACvE,aAAA;AAAA,IAAA,CACR;AAED,UAAM,YAAY,SAAS,MAAM,MAAM,YAAY,KAAK,KAAK;AAK7D,UAAM,CAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,KAAM,GAAG,CAAC,CAAE,QAAQ,KAAM,MAAM;AAClF,UAAI,SAAS,EAAG,QAAO,QAAQ,MAAM,QAAQ,KAAK;AAAA,UAC7C,QAAO,QAAQ,QAAQ;AAE5B,WAAK,QAAQ,KAAK,MAAM,SAAS,OAAO,KAAK;AAAA,IAAA,GAC5C,EAAE,WAAW,MAAM;AAEhB,UAAA,QAAQ,CAACqE,YAAW;AAClB,YAAA,MAAM,QAAQA,UAAS;AAAA,IAAA,GAC5B,EAAE,WAAW,MAAM;AAEhB,UAAA,MAAM,CAACC,UAAS;AACd,YAAA,MAAM,SAASA,QAAO,OAAO;AAAA,IAAA,GAClC,EAAE,WAAW,MAAM;AAQhB,UAAA,YAAYnD,SAAY,SAAA,WAI7B;AAGK,UAAA,WAAW,IAAW,EAAE;AAE9B,UAAM,MAAM,MAAM,MAAM,MAAM,SAAS,QAAQ,EAAE;AAG3C,UAAA,UAAU,CAACoD,cAAa;AACxB,UAAA,CAAE,UAAU,MAAO;AAGnBA,UAAAA,UAAS,WAAW,GAAG;AACrB,YAAA,UAAU,MAAM,WAAW,EAAG;AAClC,kBAAU,QAAQ,CAAC;AACnB;AAAA,MAAA;AAIF,YAAM,eAAeA,UAChB,IAAI,CAAC,QAAQ,IAAI,MAAM,MAAM,CAAC,EAC9B,OAAO,CAAC,QAAQ,CAAC,CAAE,GAAG;AAG3B,YAAM,gBAAgB,UAAU,MAC3B,IAAI,CAAC,QAAQ,IAAI,MAAM,MAAM,CAAC,EAC9B,OAAO,CAAC,QAAQ,CAAC,CAAE,GAAG;AAG3B,YAAM,eAAsB,CAAC;AAC7B,YAAM,mBAA0B,CAAC;AACtB,iBAAA,OAAO,MAAM,MAAM;AACtB,cAAA,MAAM,IAAI,MAAM,MAAM;AACxB,YAAA,aAAa,SAAS,GAAG,GAAG;AAC9B,2BAAiB,KAAK,GAAG;AACzB,uBAAa,KAAK,GAAG;AAAA,QAAA;AAAA,MACvB;AAIF,UAAI,GAAG,UAAU,eAAe,gBAAgB,EAAG;AACnD,gBAAU,QAAQ;AAAA,IAAA,CACnB;AAGK,UAAA,WAAW,CAACC,eAAc,SAAS,QAAQA,cAAa,IAAI,EAAE,WAAW,MAAM;AAK/E,UAAA,WAAW,SAAoC,MAAM;AACzD,YAAM,UAAU,OAAO,QAAQ,MAAM,OAAO,EACvC,OAAO,CAAC,CAAE,GAAG,EAAE,OAAS,CAAA,MAAM,WAAW,OAAO;AAEjD,UAAA,CAAE,QAAQ,OAAe,QAAA;AAE7B,aAAO,QAAQ,OAAO,CAACC,WAAU,CAAE,MAAM,MAAO,MAAM;AACpDA,kBAAS,IAAI,IAAI;AACVA,eAAAA;AAAAA,MACT,GAAG,EAAmB;AAAA,IAAA,CACvB;AAGK,UAAA,UAAU,IAAc,EAAE;AAGhC,UAAM,MAAM,MAAM,SAAS,CAAC,YAAY,aAAa,OAAO;AAEpD,YAAA,aAAa,OAAO,QAAQ,UAAU,EACvC,OAAO,CAAC,CAAE,GAAG,EAAE,OAAS,CAAA,MAAM,WAAW,WAAY,CAAE,MAAO,EAC9D,IAAI,CAAC,CAAE,IAAK,MAAM,IAAI;AAGrB,YAAA,aAAa,OAAO,QAAQ,UAAU,EACvC,OAAO,CAAC,CAAE,GAAG,EAAE,OAAS,CAAA,MAAM,WAAW,WAAY,CAAE,MAAO,EAC9D,IAAI,CAAC,CAAE,IAAK,MAAM,IAAI;AAGrB,YAAA,MAAM,WAAW,OAAO,CAAC,SAAS,CAAE,WAAW,SAAS,IAAI,CAAC;AAC7D,YAAA,MAAM,WAAW,OAAO,CAAC,SAAS,CAAE,WAAW,SAAS,IAAI,CAAC;AAGnE,cAAQ,QAAQ,CAAE,GAAG,QAAQ,OAAO,GAAG,GAAI,EAAE,OAAO,CAAC,SAAS,CAAE,IAAI,SAAS,IAAI,CAAC;AAAA,IAAA,GACjF,EAAE,WAAW,MAAM;AAKhB,UAAA,OAAO,IAAI,KAAK;AAKhB,UAAA,YAAY,SAAS,MAAM,MAAM,KAAK,MAAM,GAAG,OAAO,KAAK,CAAC;AAG5D,UAAA,eAAe,SAAqD,MAAM;AACvE,aAAA,OAAO,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC,CAAE,MAAM,GAAI,OAAO;AAAA,QAC3D;AAAA,QACA,OAAO;AAAA;AAAA,QACP,OAAO,IAAI,SAAS;AAAA,QACpB,OAAO,IAAI,SAAS;AAAA,QACpB,UAAU;AAAA;AAAA,QACV,OAAO,IAAI;AAAA,QACX,SAAS,IAAI;AAAA,MAAA,EAC2C;AAAA,IAAA,CAC3D;AAID,UAAM,YAAY,gBAAgB;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,QACL,IAAI;AAAA,UACF,MAAM,CAAE,QAAQ,MAAO;AAAA,UACvB,UAAU;AAAA,UACV,SAAS;AAAA,QAAA;AAAA,MAEb;AAAA,MAEA,OAAO,CAACC,QAAO,QAAQ,MAAM;AAC3B,YAAI,CAAE,IAAI,MAAM,gBAAgB,CAAC;AACjC,YAAI,CAAEA,OAAM,GAAW,QAAA,IAAI,MAAM,QAAQ;AAClC,eAAA,EAAE,YAAY,EAAE,IAAIA,OAAM,IAAI,OAAO,aAAa,GAAG,IAAI,MAAM,OAAO;AAAA,MAAA;AAAA,IAC/E,CACD;;;QA9fS,MAAM,WAAO,CAAO,UAAS,SADrCzE,aAAAW,mBAOM,OAPN,YAOM;AAAA,UAHJc,YAEgBqB,aAAA,EAFA,UAAU,QAAO,WAAA;AAAA,6BAC/B,MAAuB;AAAA,cAAvBrC,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;;QAK3BgB,YAuKUvB,eAvKVC,WAuKU;AAAA,UAtKA,YAAY,KAAI;AAAA,uEAAJ,KAAI,QAAA;AAAA,UAChB,UAAU,SAAQ;AAAA,qEAAR,SAAQ,QAAA;AAAA,QAAA,GAClBC,KAAM,QAAA;AAAA,UACb,SAAS,aAAY;AAAA,UACrB,OAAO,QAAK;AAAA,UACZ,SAAS,QAAO;AAAA,UAChB,YAAY,EAAmB,aAAA,GAAA;AAAA,UAC/B,WAAS,QAAM;AAAA,UACf,MAAM,UAAS;AAAA,UACf,mBAAiB,QAAO;AAAA,UACxB,WAAW,UAAS,QAAA,aAAA;AAAA,UACpB,eAAa,UAAA,MAAU,SAAS,QAAU,aAAA;AAAA,UAC3C,4BAAA;AAAA,UACA,UAAA;AAAA,UACA,MAAA;AAAA;UAmBW,QAAMoB,QACf,CAQE,SATmB;AAAA,YACrBC,YAQEiD,aAAA;AAAA,0BAPS,MAAK;AAAA,2EAAL,MAAK,QAAA;AAAA,cACb,aAAc,UAAS;AAAA,cACvB,SAAS,MAAM,WAAW,UAAS;AAAA,cACnC,SAAS,QAAO;AAAA,cAChB,SAAS,QAAO;AAAA,cAChB,aAAW;AAAA,cACX,OAAO,QAAK;AAAA,YAAA;;UAKN,MAAIlD,QAEb,CAuCO,UAzCa;;AAAA;AAAA,cAEpBC,YAuCOvB,MAAA,GAAA,GAAA;AAAA,gBAtCJ,OAAO;AAAA,gBACP,OAAOmD,gBAAA,aAAA,aAAA,iCAAW,MAAM,IAAG;AAAA,gBAC3B,OAAK3B,eAAA;AAAA,YAAgB,MAAM,SAAS;AAAA,cAAc,aAAQ,aAAR,iCAAW,MAAM,SAAG,EAAA;AAAA,YAAqBiD,KAAU,aAAA,mBAAA,EAAA;AAAA;gBAKrG,SAAK,CAAA,WAAEA;;AAAAA,0BAAAA,MAAAA,KAAU,eAAVA,gBAAAA,IAAAA,WAAa,QAAQ,MAAM,KAAK,MAAM;AAAA;AAAA,gBAC7C,YAAQ,CAAA,WAAEC;;AAAAA,0BAAAA,MAAAA,KAAa,kBAAbA,gBAAAA,IAAAA,WAAgB,QAAQ,MAAM,KAAK,MAAM;AAAA;AAAA,gBACnD,eAAW,CAAA,WAAEC;;AAAAA,0BAAAA,MAAAA,KAAgB,qBAAhBA,gBAAAA,IAAAA,WAAmB,QAAQ,MAAM,KAAK,MAAM;AAAA;AAAA,cAAQ;iCAGxD,MAAwC;;AAAA;AAAA,qBAAlD7E,UAAA,IAAA,GAAAW,mBAyBWC,6BAzBgBmC,MAAA,QAAO,YAAP,gBAAAA,IAAA,cAAU,MAAM,QAA1B,SAAI;8EAAoC,QAAI;AAAA,wBAE/C,MAAM,aAAa,uBAA/B9C,YAEOC,MAAA,GAAA,GAAA;AAAA;0BAFmC,OAAM;AAAA,wBAAA;2CAC9C,MAA8E;AAAA,4BAA9EuB,YAA8EvB,MAAA,SAAA,GAAA;AAAA,8BAAzD,YAAA,MAAM;AAAA,8BAAN,uBAAA,CAAA,WAAA,MAAM,WAAQ;AAAA,8BAAE,OAAA;AAAA,8BAAO,MAAM,QAAK,QAAA,OAAU;AAAA;;;;yBAInEF,UAAA,IAAA,GAAAW,mBAiBOC,UAjBa,MAAAiC,WAAA,MAAM,OAAb,QAAG;8CAAhB5C,YAiBOC,MAAA,GAAA,GAAA;AAAA,4BAjB0B,KAAK,IAAI;AAAA,4BAAO,OAAO;AAAA,0BAAA;6CAEtD,MAca;AAAA,8BAdbuB,YAcavB,MAAA,SAAA,GAAA,EAdA,IAAI,QAAI;AAAA,iDAEnB,MAOM;AAAA,kCAPK,MAAK,QAAS,IAAI,IAAI,EAAA,kBAAjCS,mBAOM,OAAA,YAAA;AAAA,oCANJF,WAKE,KAAA,QAAA,QAJe,IAAI,IAAI,IAAA;AAAA,sCACtB,OAAO,MAAM;AAAA,sCACb,KAAK,MAAM;AAAA,sCACX,OAAO,IAAI;AAAA;sDAIhBE,mBAEM,OAAA,YAAA8B,gBADD,IAAI,KAAK,GAAA,CAAA;AAAA,gCAAA;;;;;;;;;;;;;;;UAcb,mBACT,MAGW;AAAA,YAHK,QAAO,wBAAvB9B,mBAGWC,UAAA,EAAA,KAAA,KAAA;AAAA,cAFTa,YAAoDvB,MAAA,QAAA,GAAA;AAAA,gBAAzC,MAAK;AAAA,gBAAK,OAAM;AAAA,gBAAU,OAAM;AAAA,cAAA;cAC3CqC,mBAAqD,8BAA5CX,KAAE,GAAA,EAAA,IAAA,WAAA,IAAA,QAAA,CAAA,CAAA,GAAA,CAAA;AAAA,YAAA,wBAEbjB,mBAQWC,UAAA,EAAA,KAAA,KAAA;AAAA,cAPTa,YAKEvB,MAAA,KAAA,GAAA;AAAA,gBAJC,MAAMA,MAAK,KAAA,EAAC;AAAA,gBACb,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,MAAK;AAAA;cAEPqC,mBAA8E,8BAArEX,KAAE,GAAA,EAAA,IAAA,qBAAA,IAAA,uBAAA,CAAA,CAAA,GAAA,CAAA;AAAA;;UAKJ,gBACT,MAkDM;AAAA,YAlDNW,mBAkDM,OAlDN,YAkDM;AAAA,cAhDJA,mBAWM,OAAA;AAAA,gBAXA,sBAAO,QAAK,QAAA,UAAA,OAAA;AAAA,cAAA;gBAChBA,mBASM,OATN,YASM;AAAA,kBARJA,mBAOM,OAAA,MAAA;AAAA,oDANDuB,KAAE,GAAC,YAAM,eAAc,QAE1BrB,gBAAGqB,KAAE,GAAC,MAAK,MAAC,SAAS,KAAK,IAAI,QAAA,KAAK,QAAQ,OAAM,KAAA,CAAA,CAAA,IAAK,KACtD,CAAA;AAAA,oBAAY,QAAA,SAAW5D,MAAA,MAAA,EAAO,GAAG,MAAjCF,UAAA,GAAAW,mBAEO,QAFP,YAEO8B,gBADFb,QAAyCkC,EAAAA,IAAAA,UAAAA,IAAAA,UAAAA,GAAAA,EAAAA,GAAAA,KAAAA,GAAG,QAAO,KAAA,EAAA,CAAA,CAAA,GAAA,CAAA;;;;cAO9DvB,mBAUM,OAAA;AAAA,gBAVA,sBAAO,QAAK,QAAA,UAAA,OAAA;AAAA,cAAA;gBAChBA,mBAQM,OAAA;AAAA,kBARD,OAAKb,eAAA,CAAC,oBAA2B,QAAK,QAAA,gBAAA,gBAAA,CAAA;AAAA,gBAAA;kBACzCD,YAMEqD,aAAA;AAAA,gCALS,KAAI;AAAA,iFAAJ,KAAI,QAAA;AAAA,oBACZ,OAAO,QAAK;AAAA,oBACZ,SAAS,QAAO;AAAA,oBAChB,MAAM,QAAA,KAAK,SAAS,OAAM;AAAA,oBAC1B,MAAM,KAAI;AAAA,kBAAA;;;eAIJ,QAAK,SAAlB9E,UAAA,GAAAW,mBAsBM,OAtBN,YAsBM;AAAA,gBArBJ4B,mBAoBM,OApBN,aAoBM;AAAA,kBAlBI,QAAU,2BADlBtC,YAKE8E,aAAA;AAAA;gCAHS,KAAI;AAAA,iFAAJ,KAAI,QAAA;AAAA,oBACZ,OAAO,QAAK;AAAA,oBACZ,SAAS,QAAO;AAAA,kBAAA;kBAGX,SAAQ,sBADhB9E,YAME+E,aAAA;AAAA;gCAJS,QAAO;AAAA,iFAAP,QAAO,QAAA;AAAA,oBACf,SAAS,SAAQ;AAAA,oBACjB,OAAO,QAAK;AAAA,oBACZ,SAAS,QAAO;AAAA;kBAEnBvD,YAKEwD,aAAA;AAAA,gCAJS,OAAM;AAAA,iFAAN,OAAM,QAAA;AAAA,oBACd,OAAO,QAAK;AAAA,oBACZ,SAAS,QAAO;AAAA,oBAChB,SAAS,QAAW;AAAA,kBAAA;;;;;;;UA/If,QAAA,SAAS,UAAS;kBAAG;AAAA,wBACnC,MAEM;AAAA,cAFN1C,mBAEM,OAFN,YAEME,gBADD,QAAK,KAAA,GAAA,CAAA;AAAA,YAAA;;;UAKI,MAAM,WAAW,UAAS;kBAAG;AAAA,wBAC3C,MAIM;AAAA,cAJNF,mBAIM,OAJN,YAIM;AAAA,gBAHJd,YAEgBqB,aAAA,EAFA,UAAU,QAAO,WAAA;AAAA,mCAC/B,MAAuB;AAAA,oBAAvBrC,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,kBAAA;;;;;;;UAgEb,MAAK,YAAA;kBAAiB;AAAA,wBACpC,MAA0B;AAAA,cAA1BA,WAA0B,KAAA,QAAA,cAAA,CAAA,GAAA,QAAA,IAAA;AAAA,YAAA;;;;;;;;;AC5BhC,SAAS,mBACL,KACA,OACa;AACf,QAAM,QAAQ,OAAO,IAAI,YAAY,aACjC,IAAI,QAAQ,EAAE,GAAG,OAAO,IACxB,IAAI;AACR,MAAI,IAAI,SAAS,QAAS,QAAQ,SAAS;AACpC,SAAA;AACT;AAWgB,SAAA,kBACZ,YACA,YAAqB,OACC;AAExB,MAAI,CAAE,gBAAgB,EAAS,OAAA,IAAI,MAAM,wBAAwB;AAG3D,QAAA,SAAS,SAAS,EAAyB;AAGjD,QAAM,OAAoC,CAAC;AAG3C,aAAW,CAAE,KAAK,GAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,WAAO,GAAG,IAAI,mBAAmB,KAAK,MAAM;AAGtC,UAAA,OAAsC,IAAI,QAAQ;AACxD,UAAM,WAAW,IAAI,aAAa,QAAQ,QAAQ;AAGlD,QAAK,SAAS,UAAY,SAAS,UAAY,SAAS,SAAU;AAChE,WAAK,GAAG,IAAI,EAAE,MAAM,UAAU,SAAS,IAAI,QAAQ;AACnD;AAAA,IAAA;AAIF,UAAM,IAAI,MAAM,mCAAmC,GAAG,MAAM,IAAI,EAAE;AAAA,EAAA;AAIhE,MAAA,CAAE,UAAkB,QAAA;AAGxB,QAAM,SAAS,UAAU;AAIzB,QAAM,MAAM,OAAO,aAAa,MAAM,OAAO,CAAC,UAAU;AACtD,eAAW,CAAE,KAAK,GAAI,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC3C,UAAA,CAAE,IAAI,SAAU;AAGpB,YAAM,eAAe,mBAAmB,KAAK,GAAG,GAAI,MAAM;AAG1D,YAAM,SAAU,MAAM,QAAQ,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM,GAAG;AAGjE,UAAA,IAAI,SAAS,QAAQ;AACvB,cAAM,QAAQ,UAAU;AACxB,YAAI,OAAO,GAAG,MAAM,MAAO,QAAO,GAAG,IAAI;AACzC;AAAA,MAAA;AAKE,UAAA,IAAI,SAAS,QAAQ;AACvB,YAAI,QAAQ,SAAS,OAAO,MAAM,IAAI;AACtC,YAAK,OAAO,UAAU,YAAa,MAAM,KAAK,EAAW,SAAA;AACzD,YAAI,OAAO,GAAG,MAAM,MAAO,QAAO,GAAG,IAAI;AACzC;AAAA,MAAA;AAME,UAAA,IAAI,SAAS,SAAS;AAClB,cAAA,QAAQ,WAAW,OAAO;AAAA;AAAA,UAClB,WAAW,SAAS;AAAA;AAAA,YACpB,WAAW,MAAM;AAAA;AAAA,cACjB,WAAW,UAAU;AAAA;AAAA,gBACrB,WAAW,MAAM;AAAA;AAAA,kBAChB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAC/B,YAAI,OAAO,GAAG,MAAM,MAAO,QAAO,GAAG,IAAI;AACzC;AAAA,MAAA;AAAA,IACF;AAAA,EACF,GACC,EAAE,WAAW,MAAM;AAGhB,QAAA,QAAQ,CAACyE,YAAW;AAExB,UAAM,QAAuB,EAAE,GAAG,OAAO,aAAa,MAAM,MAAM;AAClE,QAAI,WAAW;AAGf,eAAW,CAAE,KAAK,GAAI,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC3C,UAAA,CAAE,IAAI,SAAU;AAGpB,YAAM,eAAe,mBAAmB,KAAK,GAAG,GAAIA,OAAM;AAGtD,UAAA;AAIJ,UAAK,IAAI,SAAS,UAAY,IAAI,SAAS,QAAS;AAC1CA,gBAAAA,QAAO,GAAG,MAAM,eAAe;AAAA;AAAA,UAC/BA,QAAO,GAAG,MAAM,KAAK;AAAA;AAAA,YACrBA,QAAO,GAAG,MAAM,SAAY;AAAA;AAAA,cAC5BA,QAAO,GAAG,MAAM,OAAO;AAAA;AAAA,gBACvB,OAAOA,QAAO,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,WACjB,IAAI,SAAS,SAAS;AACvBA,gBAAAA,QAAO,GAAG,MAAM,eAAe;AAAA;AAAA,UAC/BA,QAAO,GAAG,IAAI,OAAO;AAAA;AAAA,MAAA;AAI3B,UAAA,UAAU,MAAM,GAAG,EAAG;AAG1B,UAAI,UAAU,OAAkB,QAAA,MAAM,GAAG;AAAA,UACpC,OAAM,GAAG,IAAI;AACP,iBAAA;AAAA,IAAA;AAIb,QAAI,SAAU,QAAO,QAAQ,EAAE,OAAO;AAAA,EAAA,GACrC,EAAE,WAAW,MAAM;AAGf,SAAA;AACT;AAMA,MAAM,iBAAiB,OAAO;AAAA;AAAA;AAAA;AAAA,EAM5B,GAAG,EAAE,MAAM,QAAQ,SAAS,IAAI,UAAU,KAAK;AAAA;AAAA;AAAA,EAK/C,MAAM,EAAE,MAAM,QAAQ,UAAU,MAAM,SAAS,OAA2C;AAAA;AAAA,EAE1F,MAAM,EAAE,MAAM,SAAS,UAAU,MAAM,SAAS,OAA4C;AAAA;AAAA;AAAA,EAK5F,SAAS,EAAE,MAAM,SAAS,SAAS,OAAO,UAAU,KAAK;AAAA;AAAA,EAEzD,QAAQ,EAAE,MAAM,QAAQ,SAAS,EAAE;AAAA;AAAA,EAEnC,OAAO,EAAE,MAAM,QAAQ,SAAS,EAAE;AAAA;AAAA,EAElC,QAAQ,EAAE,MAAM,QAAQ,SAAS,GAAG,UAAU,MAAM;AAEtD;AA2BO,SAAS,sBAER,SAMoC;AACpC,QAAA,EAAE,QAAQ,MAAM,OAAO,OAAO,QAAQ,IAAI,WAAW,MAAA,IAAU;AAGrE,QAAM,OAAO,EAAE,GAAG,eAAe,GAAG,GAAG,MAAM;AAE7C,MAAI,SAAS,EAAQ,MAAA,MAAM,UAAU,SAAS;AAM1C,MAAA,KAAK,KAAK,YAAY,QAAW;AAC9B,SAAA,KAAK,UAAU,CAACjE,WAAU;AACzBA,UAAAA,OAAM,EAAU,QAAA;AACb,aAAA;AAAA,IACT;AAAA,EAAA;AAME,MAAA,KAAK,KAAK,YAAY,QAAW;AAC9B,SAAA,KAAK,UAAU,CAACA,WAAU;AACzBA,UAAAA,OAAM,SAAS,KAAa,QAAA;AACzB,aAAA;AAAA,IACT;AAAA,EAAA;AAII,QAAA,QAAQ,kBAAkB,MAAM,QAAQ;AAMxC,QAAA,MAAM,MAAM,GAAG,MAAM;AACzB,UAAM,OAAO,mBAAmB,KAAK,MAAM,KAAK;AAChD,UAAM,OAAO,mBAAmB,KAAK,MAAM,KAAK;AAAA,EAAA,CACjD;AAID,aAAW,CAAE,KAAK,GAAI,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC3C,QAAA,cAAc,OAAO,IAAI,UAAU;AACrC,YAAM,MAAO,MAAc,GAAG,GAAG,MAAM,MAAM,SAAS,CAAC;AAAA,IAAA;AAAA,EACzD;AAIK,SAAA;AACT;ACvNO,SAAS,YAAY,KAAU,eAAoC,IAAU;AAElF,MAAI,CAAE,aAAa,OAAQ,cAAa,SAAS,CAAC;AAClD,MAAI,CAAE,aAAa,OAAO,QAAsB,cAAA,OAAO,UAAU,CAAC;AAE9D,MAAA,CAAE,aAAa,OAAO,QAAQ,MAAoB,cAAA,OAAO,QAAQ,QAAQ;AAE7E,MAAI,CAAE,aAAa,OAAO,OAAQ,cAAa,OAAO,SAAS;AAE/D,MAAI,CAAE,aAAa,QAAS,cAAa,UAAU,CAAC;AACpD,MAAI,CAAE,aAAa,QAAQ,OAAQ,cAAa,QAAQ,SAAS;AAEjE,MAAI,CAAE,aAAa,QAAS,cAAa,UAAU;AAG/C,MAAA,IAAI,QAAQ,YAAY;AAKxB,MAAA,UAAU,QAAQ,IAAI;AACtB,MAAA,UAAU,gBAAgB,YAAY;AACtC,MAAA,UAAU,aAAa2B,WAAS;AAEhC,MAAA,UAAU,mBAAmBuC,WAAe;AAC5C,MAAA,UAAU,oBAAoBC,WAAgB;AAC9C,MAAA,UAAU,kBAAkBC,WAAc;AAC1C,MAAA,UAAU,kBAAkBC,WAAc;AAC1C,MAAA,UAAU,kBAAkB,cAAc;AAC1C,MAAA,UAAU,kBAAkB3D,WAAc;AAE1C,MAAA,UAAU,kBAAkB4D,WAAc;AAC1C,MAAA,UAAU,WAAW,OAAO;AAC5B,MAAA,UAAU,mBAAmBC,WAAe;AAE5C,MAAA,UAAU,SAAS9B,WAAK;AACxB,MAAA,UAAU,eAAevC,WAAW;AACpC,MAAA,UAAU,eAAe2B,WAAW;AAEpC,MAAA,UAAU,YAAY,QAAQ;AAC9B,MAAA,UAAU,iBAAiBI,WAAa;AACxC,MAAA,UAAU,YAAYuC,WAAQ;AAC9B,MAAA,UAAU,SAASC,WAAK;AACxB,MAAA,UAAU,cAAcC,WAAU;AAClC,MAAA,UAAU,UAAUC,WAAM;AAC1B,MAAA,UAAU,UAAU,MAAM;AAC1B,MAAA,UAAU,mBAAmBxC,WAAe;AAC5C,MAAA,UAAU,WAAWyC,WAAO;AAC5B,MAAA,UAAU,aAAaC,WAAS;AAChC,MAAA,UAAU,WAAWC,WAAO;AAC5B,MAAA,UAAU,WAAW5C,WAAO;AAC5B,MAAA,UAAU,WAAWR,WAAO;AAC5B,MAAA,UAAU,SAASqD,WAAK;AACxB,MAAA,UAAU,SAAS,KAAK;AACxB,MAAA,UAAU,cAAcC,WAAU;AAElC,MAAA,UAAU,WAAW,OAAO;AAC5B,MAAA,UAAU,WAAW,OAAO;AAC5B,MAAA,UAAU,cAAcC,WAAU;AAElC,MAAA,UAAU,UAAU,MAAM;AAC1B,MAAA,UAAU,QAAQ,IAAI;AAC5B;","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/quasar/icon-set/material-symbols-rounded.js","../lib/buttons/btn-dropdown.vue","../lib/buttons/btn-group.vue","../lib/buttons/btn.vue","../lib/assets/icons.ts","../lib/utils/form.ts","../lib/forms/form-helper.vue","../lib/controls/toggle.vue","../lib/controls/deleted.vue","../lib/controls/dropdown.vue","../lib/controls/reload.vue","../lib/assets/translations.ts","../lib/composition/validators.ts","../lib/inputs/text.vue","../lib/inputs/string.vue","../lib/controls/search.vue","../lib/controls/switch.vue","../lib/dialogs/dialog.vue","../lib/dialogs/confirm.vue","../lib/dialogs/progress.vue","../lib/forms/input-group.vue","../lib/forms/form.vue","../lib/utils/loader.ts","../lib/inputs/autocomplete.vue","../lib/inputs/address.vue","../lib/inputs/select.vue","../lib/inputs/country.vue","../lib/inputs/date-range.vue","../lib/inputs/date.vue","../lib/inputs/ean13.vue","../lib/inputs/label.vue","../lib/inputs/nullable-number.vue","../lib/inputs/number.vue","../lib/inputs/password.vue","../lib/inputs/picker.vue","../lib/tag.vue","../lib/inputs/tags.vue","../lib/assets/prefixes.ts","../lib/inputs/telephone.vue","../lib/objects/object-header.vue","../lib/objects/object-new.vue","../lib/composition/dialogs.ts","../lib/utils/listicle.ts","../lib/objects/listicle.vue","../lib/objects/object.vue","../lib/utils/tables.ts","../lib/table/layout/table-footer-columns.vue","../lib/table/layout/table-footer-fullscreen.vue","../lib/table/layout/table-footer-pagination.vue","../lib/table/layout/table-footer-rows.vue","../lib/table/layout/table-header.vue","../lib/table/table.vue","../lib/utils/query.ts","../lib/index.ts"],"sourcesContent":["export default {\n name: 'material-symbols-rounded',\n type: {\n positive: 'sym_r_check_circle',\n negative: 'sym_r_warning',\n info: 'sym_r_info',\n warning: 'sym_r_priority_high'\n },\n arrow: {\n up: 'sym_r_arrow_upward',\n right: 'sym_r_arrow_forward',\n down: 'sym_r_arrow_downward',\n left: 'sym_r_arrow_back',\n dropdown: 'sym_r_arrow_drop_down'\n },\n chevron: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right'\n },\n colorPicker: {\n spectrum: 'sym_r_gradient',\n tune: 'sym_r_tune',\n palette: 'sym_r_style'\n },\n pullToRefresh: {\n icon: 'sym_r_refresh'\n },\n carousel: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right',\n up: 'sym_r_keyboard_arrow_up',\n down: 'sym_r_keyboard_arrow_down',\n navigationIcon: 'sym_r_circle'\n },\n chip: {\n remove: 'sym_r_cancel',\n selected: 'sym_r_check'\n },\n datetime: {\n arrowLeft: 'sym_r_chevron_left',\n arrowRight: 'sym_r_chevron_right',\n now: 'sym_r_schedule',\n today: 'sym_r_today'\n },\n editor: {\n bold: 'sym_r_format_bold',\n italic: 'sym_r_format_italic',\n strikethrough: 'sym_r_strikethrough_s',\n underline: 'sym_r_format_underlined',\n unorderedList: 'sym_r_format_list_bulleted',\n orderedList: 'sym_r_format_list_numbered',\n subscript: 'sym_r_vertical_align_bottom',\n superscript: 'sym_r_vertical_align_top',\n hyperlink: 'sym_r_link',\n toggleFullscreen: 'sym_r_fullscreen',\n quote: 'sym_r_format_quote',\n left: 'sym_r_format_align_left',\n center: 'sym_r_format_align_center',\n right: 'sym_r_format_align_right',\n justify: 'sym_r_format_align_justify',\n print: 'sym_r_print',\n outdent: 'sym_r_format_indent_decrease',\n indent: 'sym_r_format_indent_increase',\n removeFormat: 'sym_r_format_clear',\n formatting: 'sym_r_text_format',\n fontSize: 'sym_r_format_size',\n align: 'sym_r_format_align_left',\n hr: 'sym_r_remove',\n undo: 'sym_r_undo',\n redo: 'sym_r_redo',\n heading: 'sym_r_format_size',\n code: 'sym_r_code',\n size: 'sym_r_format_size',\n font: 'sym_r_font_download',\n viewSource: 'sym_r_code'\n },\n expansionItem: {\n icon: 'sym_r_keyboard_arrow_down',\n denseIcon: 'sym_r_arrow_drop_down'\n },\n fab: {\n icon: 'sym_r_add',\n activeIcon: 'sym_r_close'\n },\n field: {\n clear: 'sym_r_cancel',\n error: 'sym_r_error'\n },\n pagination: {\n first: 'sym_r_first_page',\n prev: 'sym_r_keyboard_arrow_left',\n next: 'sym_r_keyboard_arrow_right',\n last: 'sym_r_last_page'\n },\n rating: {\n icon: 'sym_r_star'\n },\n stepper: {\n done: 'sym_r_check',\n active: 'sym_r_edit',\n error: 'sym_r_warning'\n },\n tabs: {\n left: 'sym_r_chevron_left',\n right: 'sym_r_chevron_right',\n up: 'sym_r_keyboard_arrow_up',\n down: 'sym_r_keyboard_arrow_down'\n },\n table: {\n arrowUp: 'sym_r_arrow_upward',\n warning: 'sym_r_warning',\n firstPage: 'sym_r_first_page',\n prevPage: 'sym_r_chevron_left',\n nextPage: 'sym_r_chevron_right',\n lastPage: 'sym_r_last_page'\n },\n tree: {\n icon: 'sym_r_play_arrow'\n },\n uploader: {\n done: 'sym_r_check',\n clear: 'sym_r_close',\n add: 'sym_r_add_box',\n upload: 'sym_r_cloud_upload',\n removeQueue: 'sym_r_clear_all',\n removeUploaded: 'sym_r_done_all'\n }\n}\n","<!--+ This is *exactly* the same as the standard Quasar QBtnGroup, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n +-->\n<template>\n <q-btn-dropdown\n ref=\"_ref\"\n v-bind=\"{\n ...$attrs,\n ..._props,\n label: undefined,\n unelevated: true,\n tooltip: undefined,\n }\"\n no-icon-animation\n :color=\"disable ? undefined : color\"\n :text-color=\"disable ? undefined : textColor\"\n :class=\"{ 'z-btn-disabled': disable, 'z-btn-flat': flat }\"\n >\n <template #label>\n <slot v-if=\"_slots.label\" name=\"label\" />\n <template v-else-if=\"label\">\n {{ label }}\n </template>\n <q-tooltip v-if=\"tooltip\" :delay=\"500\">\n {{ tooltip }}\n </q-tooltip>\n </template>\n\n <template v-if=\"_slots.loading\">\n <slot name=\"loading\" />\n </template>\n\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-btn-dropdown>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtnDropdown, QTooltip } from 'quasar'\nimport { ref } from 'vue'\n\nimport type { QBtnDropdownProps, QBtnDropdownSlots } from 'quasar'\n\ndefineOptions({ name: 'ZBtnDropdown' })\n\nconst _ref = ref<QBtnDropdown>()\nconst _props = defineProps<QBtnDropdownProps & { tooltip?: string }>()\nconst _slots = defineSlots<Partial<QBtnDropdownSlots>>()\n\ndefineExpose({\n show: () => _ref.value?.show(),\n hide: () => _ref.value?.hide(),\n toggle: () => _ref.value?.toggle(),\n})\n</script>\n\n<style scoped lang=\"postcss\">\n.z-btn-disabled {\n background-color: var(--q-tint);\n color: var(--q-tint); /* Tint over tint (it's a shade) */\n\n &.z-btn-flat {\n background-color: transparent;\n color: var(--q-text);\n opacity: 0.25 !important;\n }\n}\n\n:deep(.q-btn-dropdown__arrow) {\n border-left: 1px solid var(--q-shade);\n}\n</style>\n","<!--+ This is *exactly* the same as the standard Quasar QBtnGroup, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n +-->\n<template>\n <q-btn-group v-bind=\"_props\" unelevated>\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-btn-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtnGroup } from 'quasar'\n\nimport type { QBtnGroupProps, QBtnGroupSlots } from 'quasar'\n\ndefineOptions({ name: 'ZBtnGroup' })\n\nconst _props = defineProps<QBtnGroupProps>()\nconst _slots = defineSlots<Partial<QBtnGroupSlots>>()\n</script>\n","<!--+ This is *exactly* the same as the standard Quasar QBtn, but we apply\n | our default \"unelevated\" design (rather than constantly repeating...)\n |\n | A couple of extra options are present:\n | - \"shrink\" to specify the screen size at which the button should shrink\n | and presented *without* a label (the label will become a tooltip)\n | - \"tooltip\" to specify a tooltip to show on the button\n +-->\n<template>\n <q-btn\n v-bind=\"{\n ...$attrs,\n ..._props,\n unelevated: true,\n shrink: undefined,\n tooltip: undefined\n }\"\n :label=\"shrink ? $q.screen.gt[shrink] ? label : undefined : label\"\n :color=\"disable ? undefined : color\"\n :text-color=\"disable ? undefined : textColor\"\n :class=\"{\n 'z-btn-disabled': disable,\n 'z-btn-flat': flat,\n 'z-btn-default': (! flat) && (! color) && (!textColor),\n }\"\n >\n <q-tooltip v-if=\"shrink && (! $q.screen.gt[shrink])\" :delay=\"500\">\n {{ label }}\n </q-tooltip>\n <q-tooltip v-else-if=\"tooltip\" :delay=\"500\">\n {{ tooltip }}\n </q-tooltip>\n\n <slot v-if=\"_slots.default\" name=\"default\" />\n <template v-if=\"_slots.loading\">\n <slot name=\"loading\" />\n </template>\n </q-btn>\n</template>\n\n<script setup lang=\"ts\">\nimport { QBtn, QTooltip } from 'quasar'\n\nimport type { QBtnProps, QBtnSlots, Screen } from 'quasar'\n\ntype Shrink = keyof Screen['gt']\n\ndefineOptions({ name: 'ZBtn' })\n\nconst _props = defineProps<QBtnProps & { shrink?: Shrink, tooltip?: string }>()\nconst _slots = defineSlots<Partial<QBtnSlots>>()\n</script>\n\n<style scoped lang=\"postcss\">\n.z-btn-default {\n background-color: #80808040;\n color: var(--q-text);\n}\n\n.z-btn-disabled {\n background-color: var(--q-tint);\n color: var(--q-tint); /* Tint over tint (it's a shade) */\n\n &.z-btn-flat {\n background-color: transparent;\n color: var(--q-text);\n opacity: 0.25 !important;\n }\n}\n</style>\n","const showDeletedIcon = `\n M680,520 Q776,520 851.5,570.5 Q927,621 960,700 Q927,779 851.5,829.5 Q776,880 680,880\n Q584,880 508.5,829.5 Q433,779 400,700 Q433,621 508.5,570.5 Q584,520 680,520 z\n M680,600 Q621,600 570.5,627 Q520,654 490,700 Q520,746 570.5,773 Q621,800 680,800\n Q739,800 789.5,773 Q840,746 870,700 Q840,654 789.5,627 Q739,600 680,600 z\n M680,760 Q655,760 637.5,742.5 Q620,725 620,700 Q620,675 637.5,657.5\n Q655,640 680,640 Q705,640 722.5,657.5 Q740,675 740,700 Q740,725 722.5,742.5\n Q705,760 680,760 z M560,120 L400,120 Q383,120 371.5,131.5 Q360,143 360,160\n L200,160 Q183,160 171.5,171.5 Q160,183 160,200 Q160,217 171.5,228.5 Q183,240 200,240\n L200,760 Q200,793 223.5,816.5 Q247,840 280,840 L405.233,840\n C382.052,816.107 361.747,789.469 346.128,760 L280,760 L280,240 L680,240 L680,444\n C706.826,444.226 733.701,446.275 760,451.789 L760,240 Q777,240 788.5,228.5\n Q800,217 800,200 Q800,183 788.5,171.5 Q777,160 760,160 L600,160 Q600,143 588.5,131.5\n Q577,120 560,120 z M440,320 L360,320 L360,614.511 C381.9,581.303 408.463,551.141 440,526.721 L440,320 z\n M600,320 L520,320 L520,477.547 C545.413,465.601 572.563,457.493 600,451.789 L600,320 z\n @@ fill:currentColor\n | 0, 0, 960, 960`.replaceAll(/\\s+/gm, ' ').trim()\n\n/** Our very basic icons library */\nexport const icons = Object.freeze({\n /* actions */\n add: 'sym_r_add',\n cancel: 'sym_r_close',\n confirm: 'sym_r_check',\n delete: 'sym_r_delete',\n download: 'sym_r_download',\n duplicate: 'sym_r_list_alt_add',\n edit: 'sym_r_edit',\n logout: 'sym_r_move_item',\n print: 'sym_r_print',\n reload: 'sym_r_refresh',\n restore: 'sym_r_undo',\n search: 'sym_r_search',\n\n /* common types */\n barcode: 'sym_r_barcode',\n date: 'sym_r_calendar_today',\n error: 'sym_r_report', // should be \"fill\"\n language: 'sym_r_globe',\n menu: 'sym_r_menu',\n qrcode: 'sym_r_qr_code_2',\n required: 'sym_r_asterisk',\n select: 'sym_r_keyboard_double_arrow_down',\n tag: 'sym_r_sell',\n warning: 'sym_r_report',\n\n\n /** table controls */\n table: {\n columns: 'sym_r_table_chart',\n rows: 'sym_r_table_rows',\n row: {\n density: {\n 1: 'sym_r_square',\n 2: 'sym_r_bottom_sheets',\n 3: 'sym_r_table_rows',\n 4: 'sym_r_table_rows_narrow',\n },\n },\n },\n\n /** sorting */\n sorting: {\n descending: 'sym_r_south',\n ascending: 'sym_r_north',\n unsorted: 'sym_r_swap_vert',\n },\n\n /** pagination */\n pagination: {\n first: 'sym_r_first_page',\n previous: 'sym_r_chevron_left',\n next: 'sym_r_chevron_right',\n last: 'sym_r_last_page',\n },\n\n /** visibility */\n visibility: {\n on: 'sym_r_visibility',\n off: 'sym_r_visibility_off',\n deleted: showDeletedIcon, // visibility for \"deleted\" items\n },\n\n /** full screen */\n fullscreen: {\n enter: 'sym_r_zoom_out_map',\n exit: 'sym_r_zoom_in_map',\n },\n} as const)\n","import { inject, onBeforeUnmount, provide, reactive, ref, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { PropType, Ref, ShallowRef } from 'vue'\n\n/* The props handled by the form and affecting its children behavior */\nexport type ZFormProps = {\n editable: boolean\n formEditable: boolean\n disabled: boolean\n lazyRules: boolean | 'ondemand'\n bottomSlots: boolean\n}\n\n/* Our defaults */\nconst defaults = {\n editable: true,\n formEditable: true,\n disabled: false,\n lazyRules: false,\n bottomSlots: false,\n} as const satisfies ZFormProps\n\n/* Symbols for injection */\nconst _editableSymbol = Symbol('ZForm:Editable')\nconst _disabledSymbol = Symbol('ZForm:Disabled')\nconst _lazyRulesSymbol = Symbol('ZForm:LazyRules')\nconst _bottomSlotsSymbol = Symbol('ZForm:BottomSlots')\nconst _readyStateSymbol = Symbol('ZForm:ReadyState')\n\n/** The properties shared by all inputs that can be included in a `ZForm` */\nexport const formProps = {\n /** Whether to reserve space for the bottom slots or not */\n bottomSlots: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Editable state, overriding the active state */\n editable: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Disabled state, overriding the editable and active states */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /**\n * When to apply validation rules.\n *\n * If set to boolean true then it checks validation status against the rules\n * only after field loses focus for first time; If set to \"ondemand\" then it\n * will trigger only when component's validate() method is manually called or\n * when the wrapper QForm submits itself\n */\n lazyRules: {\n type: [ Boolean, String ] as PropType<boolean | 'ondemand'>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** The properties shared by all inputs that can be included in a `ZForm` */\nexport const componentFormProps = {\n ...formProps,\n /**\n * When \"true\" this overrides the \"editable\" property (whose default can\n * be inherited from the owning form) forcedly preventing editability */\n readonly: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** For `ZForm`, provide the current form properties to children components */\nexport function provideFormProps(props: Partial<ZFormProps>): void {\n provide(_editableSymbol, () => props.editable != null ? props.editable : defaults.editable)\n provide(_disabledSymbol, () => props.disabled != null ? props.disabled : defaults.disabled)\n provide(_lazyRulesSymbol, () => props.lazyRules != null ? props.lazyRules : defaults.lazyRules)\n provide(_bottomSlotsSymbol, () => props.bottomSlots != null ? props.bottomSlots : defaults.bottomSlots)\n}\n\n/** Merge the specified props from a component with the ones from the owning `ZForm` */\nexport function mergeFormProps(props: Partial<ZFormProps & { readonly?: boolean | undefined }>): Readonly<ZFormProps> {\n const editable = inject<() => ZFormProps['editable']>(_editableSymbol, () => defaults.editable)\n const disabled = inject<() => ZFormProps['disabled']>(_disabledSymbol, () => defaults.disabled)\n const lazyRules = inject<() => ZFormProps['lazyRules']>(_lazyRulesSymbol, () => defaults.lazyRules)\n const bottomSlots = inject<() => ZFormProps['bottomSlots']>(_bottomSlotsSymbol, () => defaults.bottomSlots)\n\n const object = reactive<ZFormProps>({\n editable: false,\n formEditable: false,\n disabled: false,\n lazyRules: false,\n bottomSlots: false,\n })\n\n watch([ () => props.editable, () => props.readonly, editable ], ([ propValue, readonly, formValue ]) => {\n const formEditable = propValue == null ? (formValue || false) : propValue\n const editable = readonly === true ? false : formEditable\n if (formEditable != object.formEditable) object.formEditable = formEditable\n if (editable != object.editable) object.editable = editable\n }, { immediate: true })\n\n watch([ () => props.disabled, disabled ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.disabled) object.disabled = value\n }, { immediate: true })\n\n watch([ () => props.lazyRules, lazyRules ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.lazyRules) object.lazyRules = value\n }, { immediate: true })\n\n watch([ () => props.bottomSlots, bottomSlots ], ([ propValue, formValue ]) => {\n const value = propValue == null ? (formValue || false) : propValue\n if (value != object.bottomSlots) object.bottomSlots = value\n }, { immediate: true })\n\n return object\n}\n\n/** For `ZForm`, provide a `ShallowRef` to an object holding the ready state */\nexport function provideFormReadyState(): Ref<boolean> {\n const state = shallowRef<Record<string, boolean>>({})\n provide(_readyStateSymbol, state)\n\n const ready = ref(false)\n\n watch(state, (state) => {\n for (const value of Object.values(state)) {\n if (value) continue\n if (ready.value) ready.value = false\n return\n }\n\n if (! ready.value) ready.value = true\n })\n\n return ready\n}\n\n/** Provide a callback to `ZForm` to evaluate the component's ready state */\nexport function formReadyState(callback: () => boolean): void {\n const callbacks = inject<ShallowRef<Record<string, boolean>> | null>(_readyStateSymbol, null)\n if (! callbacks) return // not in a form\n\n // crypto.randomUUID() is not available on Safari in insecure contexts (e.g. app development)\n const key = btoa([ ...crypto.getRandomValues(new Uint8Array(15)) ].map((c) => String.fromCharCode(c)).join(''))\n const watcher = watch(callback, (ready) => {\n if (callbacks.value[key] === ready) return\n callbacks.value[key] = ready\n triggerRef(callbacks)\n }, { immediate: true })\n\n onBeforeUnmount(() => {\n delete callbacks.value[key]\n watcher()\n })\n}\n","<template>\n <slot name=\"default\" v-bind=\"_formProps\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { componentFormProps, mergeFormProps } from '../utils/form'\n\nimport type { VNode } from 'vue'\nimport type { ZFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZFormHelper' })\n\nconst _props = defineProps(componentFormProps)\nconst _formProps = mergeFormProps(_props)\ndefineSlots<{\n default: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\ndefineExpose({\n isEditable: computed(() => _formProps.editable),\n isFormEditable: computed(() => _formProps.formEditable),\n isLazyRules: computed(() => _formProps.lazyRules),\n isBottomSlots: computed(() => _formProps.bottomSlots),\n isDisabled: computed(() => _formProps.disabled),\n})\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn\n dense\n class=\"z-control\"\n :class=\"{ 'z-control-active': _value }\"\n :disable=\"scope.disabled\"\n :icon=\"_model ? icon : _iconOff\"\n :tooltip=\"tooltip\"\n @click=\"_model = ! _model\"\n />\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZControlToggle' })\n\nconst _props = defineProps({\n /** The icon for this toggle */\n icon: {\n type: String,\n required: true,\n },\n iconOff: {\n type: String,\n required: false,\n default: undefined,\n },\n /** The tooltip, if any, for this toggle */\n tooltip: {\n type: String,\n required: false,\n default: '',\n },\n /** True is false, and false is true */\n negate: {\n type: Boolean,\n required: false,\n default: false,\n },\n ...componentFormProps,\n})\n\nconst _model = defineModel({\n type: Boolean,\n required: true,\n})\n\nconst _value = computed(() => _props.negate ? (! _model.value) : _model.value)\nconst _iconOff = computed(() => _props.iconOff || _props.icon)\n</script>\n","<template>\n <z-control-toggle\n v-model=\"deleted\"\n :icon=\"icons.visibility.deleted\"\n :tooltip=\"deleted ?\n $t({ en: 'Hide deleted', de: 'Gelöscht ausblenden'}) :\n $t({ en: 'Show deleted', de: 'Gelöscht anzeigen'})\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZControlToggle from './toggle.vue'\n\ndefineOptions({ name: 'ZControlDeleted' })\n\ndefineProps(componentFormProps)\n\nconst deleted = defineModel({\n type: Boolean,\n required: true,\n})\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn-dropdown\n dense\n class=\"z-control\"\n :icon=\"icon\"\n :disable=\"scope.disabled\"\n :class=\"{ 'z-control-active': active }\"\n :tooltip=\"tooltip\"\n >\n <q-list dense bordered>\n <slot name=\"default\" />\n </q-list>\n </z-btn-dropdown>\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { QList } from 'quasar'\n\nimport ZBtnDropdown from '../buttons/btn-dropdown.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { VNode } from 'vue'\n\ndefineOptions({ name: 'ZControlDropdown' })\n\ndefineProps({\n /** The icon for this toggle */\n icon: {\n type: String,\n required: true,\n },\n /** Whether this control should look \"active\" or not */\n active: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The tooltip, if any, for this toggle */\n tooltip: {\n type: String,\n required: false,\n default: '',\n },\n ...componentFormProps,\n})\n\ndefineSlots<{\n default: () => VNode[]\n}>()\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn\n dense\n class=\"z-control\"\n :disable=\"scope.disabled\"\n :icon=\"icons.reload\"\n :tooltip=\"$t({ en: 'Reload', de: 'Neu laden'})\"\n @click=\"_reload = _reload + 1\"\n />\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\ndefineOptions({ name: 'ZControlReload' })\n\ndefineProps(componentFormProps)\n\nconst _reload = defineModel({\n type: Number,\n required: true,\n})\n</script>\n","import type { Translations } from '@juit/vue-i18n'\n\nexport const translations = {\n 'search': { en: 'Search', de: 'Suchen' },\n 'cancel': { en: 'Cancel', de: 'Abbrechen' },\n 'save': { en: 'Save', de: 'Speichern' },\n 'validate': { en: 'validate', de: 'Validieren' },\n 'delete': { en: 'Delete', de: 'Löschen' },\n 'restore': { en: 'Restore', de: 'Wiederherstellen' },\n 'edit': { en: 'Edit', de: 'Bearbeiten' },\n\n 'keep': { en: 'Keep', de: 'Behalten' },\n 'discard': { en: 'Discard', de: 'Verwerfen' },\n 'ignore': { en: 'Ignore', de: 'Ignorieren' },\n\n 'object.uuid': { en: 'UUID', de: 'UUID' },\n 'object.created': { en: 'Created on', de: 'Erstellt am' },\n 'object.modified': { en: 'Modified on', de: 'Geändert am' },\n 'object.deleted': { en: 'Deleted on', de: 'Gelöscht am' },\n} as const satisfies Translations\n","import { useTranslator } from '@juit/vue-i18n'\nimport { patterns } from 'quasar'\n\n/** A non-async validation rule */\nexport interface ZValidator<T> {\n (value: T): boolean | string\n}\n\n/** Form validators */\nexport interface ZValidators {\n /** Assert that the string is a valid email */\n email(): ZValidator<string>\n /** Assert that the string matches a given regex */\n regexp(regExp: RegExp): ZValidator<string>\n /** Assert that the string has the specified maximum length */\n maxLength(length: number): ZValidator<string>\n /** Assert that the string has the specified minimum length */\n minLength(length: number): ZValidator<string>\n /** Assert that the value is not _falsy_ (non zero number, non-empty string) */\n required(): ZValidator<string>\n /** Assert that the number does not exceed this maximum */\n maximum(max: number): ZValidator<number>\n /** Assert that the number is not under this minimum */\n minimum(min: number): ZValidator<number>\n}\n\n/** Composition call to return our (localized) validators */\nexport function useValidators(): ZValidators {\n const { t } = useTranslator()\n\n function email(): ZValidator<string> {\n return function email(value: string) {\n return patterns.testPattern.email(value) || t({\n en: 'Invalid Email address',\n de: 'Ungültige E-Mail-Adresse',\n })\n }\n }\n\n function regexp(regExp: RegExp): ZValidator<string> {\n return function regexp(value: string) {\n return !!value.match(regExp) || t({\n en: 'Invalid format',\n de: 'Ungültige Format',\n })\n }\n }\n\n function maxLength(length: number): ZValidator<string> {\n return function maxLength(value: string) {\n if (value.length <= length) return true\n\n return t({\n en: 'Maximum length { length } characters',\n de: 'Maximale Länge { length } Zeichen',\n }, { length })\n }\n }\n\n function minLength(length: number): ZValidator<string> {\n return function minLength(value: string) {\n if (!value) return true // the minLength only should be checked if there is a value\n if (value.length >= length) return true\n\n return t({\n en: 'Minimum length { length } characters',\n de: 'Mindestlänge { length } Zeichen',\n }, { length })\n }\n }\n\n function required(): ZValidator<string> {\n return function required(value: string) {\n return (!! value) || t({\n en: 'This field is required',\n de: 'Dieses Feld ist erforderlich',\n })\n }\n }\n\n function maximum(max: number): ZValidator<number> {\n return function maximum(value: number) {\n if (value <= max) return true\n return t({\n en: 'Maximum { max }',\n de: 'Höchstens { max }',\n }, { max })\n }\n }\n\n function minimum(min: number): ZValidator<number> {\n return function minimum(value: number) {\n if (value >= min) return true\n return t({\n en: 'Minimum { min }',\n de: 'Mindestens { min }',\n }, { min })\n }\n }\n\n return { email, regexp, maxLength, minLength, required, maximum, minimum }\n}\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n ref=\"_helper\"\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-input\n ref=\"_qinput\"\n\n dense\n outlined\n stack-label\n no-error-icon\n\n :class=\"`z-state-${_state}`\"\n :input-style=\"{\n cursor: (_editable && onClick) ? 'pointer' : undefined,\n zIndex: '1', /* always stay above our suffix */\n }\"\n\n :type=\"type\"\n :label=\"label\"\n :placeholder=\" _editable ? placeholder : undefined\"\n :hint=\"_editable ? hint : undefined\"\n :counter=\"(_editable && formProps.bottomSlots) ? (maxLength > 0) : false\"\n :maxlength=\"(_editable && (maxLength > 0)) ? maxLength : undefined\"\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :lazy-rules=\"formProps.lazyRules\"\n :debounce=\"debounce\"\n :readonly=\"_inactive || nonInteractive\"\n :disable=\"_disabled\"\n :rules=\"_rules\"\n :prefix=\"prefix\"\n style=\"width: 100%\"\n\n :model-value=\"_value\"\n @update:model-value=\"_update\"\n >\n <!-- Suffix, right behind the label, expanding with it -->\n <div v-if=\"_value && suffix\" class=\"q-field__native z-suffix\">\n <span class=\"z-suffix-hidden\">{{ _value }}</span>\n <span class=\"z-suffix-visible\">{{ suffix }}</span>\n </div>\n\n <template #append>\n <template v-if=\"_editable\">\n <!-- First icon, error -->\n <q-icon\n v-if=\"_qinput?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n\n <!-- Second icon, required or clearable -->\n <q-icon\n v-if=\"required && (! _value)\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n\n <q-icon\n v-else-if=\"_onClear\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click=\"_onClear\"\n />\n </template>\n\n <!-- Third icon: parent icon -->\n <template v-if=\"icon\">\n <!-- The \"onClickIcon\" event is handled by the parent -->\n <template v-if=\"onClickIcon && formProps.editable\">\n <q-icon\n v-if=\"icon\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click.stop=\"onClickIcon\"\n />\n </template>\n\n <!-- Links are enabled *only* when the containing form is not editable -->\n <template v-else-if=\"link && (! formProps.formEditable)\">\n <!-- String links are rendered as anchors -->\n <a\n v-if=\"(typeof link === 'string')\"\n :href=\"link\"\n class=\"z-icon-link\"\n @click.stop=\"() => {} /* q-input captures clicks and prevents default */\"\n >\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </a>\n\n <!-- Icon when not editing (note even in the form), optionally linked somewhere -->\n <router-link v-else :to=\"link\" class=\"z-icon-link\">\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </router-link>\n </template>\n\n <!-- Icon w/o links -->\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.append\" name=\"append\" v-bind=\"formProps\" />\n </template>\n </q-input>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QInput } from 'quasar'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps, formReadyState } from '../utils/form'\n\nimport type { ValidationRule } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZFormProps } from '../utils/form'\n\n/* APPEARANCE: =================================================================\n *\n * The text input has fundamentally three \"looks\":\n *\n * - inactive: the field is visibly read-only, and user interaction is disabled\n * - editable: the field is editable, and it looks like it\n * - disabled: the field is visibly disabled, for example when loading data\n *\n * The default state is \"inactive\" (presented kind of like a label). The other\n * two states are controlled by the \"editable\", and \"disabled\" boolean\n * properties (in order of priority).\n *\n * This priority means that whenever \"disabled\" is \"true\", then \"editable\" is\n * de-facto ignored, and only when both \"disabled\" and \"editable\" are \"false\",\n * then the control is considered \"inactive\".\n *\n * The extra property \"readonly\" doesn't _visually_ change appearance of this\n * field, but can be used by wrappers of this component to present a different\n * experience. For example, in our date picker, the date can be displayed in\n * the field, but can only be picked by clicking on it (and can't be edited\n * with the keyboard, henceforth, readonly).\n *\n * ICONS: ======================================================================\n *\n * The text input can have a few icons:\n *\n * The first icon deals with validation, and is displayed when the field is\n * editable _and_ in error.\n *\n * The second icon deals with the \"required\" state of the field, and its\n * \"clearability\" (determined by the \"onClear\" property).\n *\n * - When \"required\" is \"true\" and the value is empty, we'll display a single\n * asterisk indicating that a value is required.\n * - When \"onClear\" is set and the value is not empty, we'll display a \"close\"\n * clickable icon that will invoke the \"onClear\" callback (up to the parent\n * to determine how to clear the value).\n *\n * The third icon is the \"action\" icon, and will be displayed when the \"icon\"\n * property is set by the parent.\n */\n\nconst validators = useValidators()\n\n/** Ref to our `QInput` */\nconst _qinput = ref<QInput>()\n/** Ref to our `ZFormHelper` */\nconst _helper = ref<InstanceType<typeof ZFormHelper>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZText' })\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The type of input to present: normal `text` or `password` */\n type: {\n type: String as PropType<'text' | 'password'>,\n required: false,\n default: 'text',\n },\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>,\n required: false,\n default: 'text',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== EXTRA STATE FOR SUB-COMPONENTS =================================== */\n\n /** The input looks editable, but text editing is disabled (for sub-components) */\n nonInteractive: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The debounce time in milliseconds for the input field */\n debounce: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n /** The prefix to add to the input */\n prefix: {\n type: String as PropType<string>,\n required: false,\n default: undefined,\n },\n /** Keep the value \"raw\" (as in, do not normalize white spaces) */\n raw: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The maximum length, displayed with a counter (and error when too long). */\n maxLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ValidationRule<string>[]>,\n required: false,\n default: () => [],\n },\n\n /* ===== EMITS AS PROPS =================================================== */\n\n /** Used as `@click=\"...\"` in a template, when clicking on text field */\n onClick: {\n type: Function as PropType<((event: PointerEvent) => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@click-icon=\"...\"` in a template, when clicking on icon */\n onClickIcon: {\n type: Function as PropType<((event: PointerEvent) => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@clear=\"...\"` in a template, to clear the text (and related) */\n onClear: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Emits */\nconst _emit = defineEmits<{\n (emit: 'beforeinput', event: InputEvent): any\n (emit: 'blur', event: FocusEvent): any\n (emit: 'focus', event: FocusEvent): any\n (emit: 'input', event: InputEvent): any\n (emit: 'keydown', event: KeyboardEvent): any\n (emit: 'keyup', event: KeyboardEvent): any\n}>()\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* ===== INTERNAL STATE ===================================================== */\n\nconst _hasFocus = ref(false)\n\nconst _state = computed(() => {\n if (_helper.value?.isDisabled) return 'disabled'\n if (_helper.value?.isEditable) return 'editable'\n return 'inactive'\n})\n\nconst _disabled = computed(() => _state.value === 'disabled')\nconst _editable = computed(() => _state.value === 'editable')\nconst _inactive = computed(() => _state.value === 'inactive')\n\nfunction _update(value?: string | number | null): void {\n let string = typeof value === 'number' ? String(value) : (value || '')\n // trim and normalize spaces unless the \"raw\" prop is set\n if (! _props.raw) string = string.trim().replaceAll(/\\s+/g, ' ')\n if (string !== _value.value) _value.value = string\n}\n\n/** Handle the clearability from the parent */\nconst _onClear = computed(() => {\n if (! _props.onClear) return undefined\n if (! _value.value) return undefined\n\n // Return a function setting the focus to the input *and* calling the\n // parent's \"onClear\" callback to wipe the value\n return () => {\n _qinput.value?.focus()\n _props.onClear?.()\n }\n})\n\n/* ===== INTERNAL STATE ===================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qinput.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _qinput.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _qinput.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _qinput.value?.hasError || false),\n /** The native element of the input */\n nativeEl: computed(() => _qinput.value?.nativeEl as HTMLInputElement),\n /** A flag indicating whether this field is _editable_ or not */\n isEditable: _editable,\n /** A flag indicating whether this field is _disabled_ or not */\n isDisabled: _disabled,\n /** A flag indicating whether this field is _inactive_ or not */\n isInactive: _inactive,\n /** A flag indicating whether this field is _editable_ and _has focus_ or not */\n hasFocus: computed(() => _editable.value && _hasFocus.value),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/* The validation rules */\nconst _rules = computed(() => {\n const rules: ValidationRule[] = []\n\n /* Required (from prop) */\n if (_props.required) rules.push(validators.required())\n /* Max length (from prop) */\n if (_props.maxLength > 0) rules.push(validators.maxLength(_props.maxLength))\n /* All other rules (from prop) */\n rules.push(..._props.rules)\n /* Quasar won't reset the validation status if the rules array is empty */\n if (rules.length === 0) rules.push(() => true)\n\n return rules\n})\n\n/* When editable or validation rules change, reset validation */\nwatch([ _editable, _rules ], () => _qinput.value?.resetValidation())\n\n/* Ready state for parent ZForm */\nformReadyState(() => {\n if (_qinput.value?.hasError) return false\n if (_props.required) return !! _value.value\n return true\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Pass-through events */\nconst _onBeforeinput = (event: InputEvent) => void _emit('beforeinput', event)\nconst _onBlur = (event: FocusEvent) => void _emit('blur', event)\nconst _onFocus = (event: FocusEvent) => void _emit('focus', event)\nconst _onInput = (event: Event) => void _emit('input', event as InputEvent) // follow MDN spec\nconst _onKeydown = (event: KeyboardEvent) => void _emit('keydown', event)\nconst _onKeyup = (event: KeyboardEvent) => void (_emit('keyup', event))\n\n/** \"onClick\" is only passed through when enabled and we have a listener */\nfunction _onClick(event: MouseEvent): void {\n if (_editable.value) _props.onClick?.(event as PointerEvent) // follow MDN spec\n}\n\n/** Extra event handler tracking \"Escape\" and clearing the content */\nfunction _onKeydownClear(event: KeyboardEvent): void {\n if (! _props.onClear) return // no clear, no action\n const { key, altKey, ctrlKey, metaKey, shiftKey } = event\n if (altKey || ctrlKey || metaKey || shiftKey) return\n if (key !== 'Escape') return\n _props.onClear()\n event.preventDefault()\n}\n\n/** Extra event to handle focus state */\nconst _onFocusFocusable = () => void (_hasFocus.value = true)\nconst _onBlurFocusable = () => void (_hasFocus.value = false)\n\n/** Add all our required event listeners */\nfunction _addEventListeners(element?: HTMLInputElement | undefined): void {\n if (! element) return\n // Extra events for focus state: these _before_ the basic ones below, so that\n // \"hasFocus\" is set before any other event is handled by listeners\n element.addEventListener('focus', _onFocusFocusable)\n element.addEventListener('blur', _onBlurFocusable)\n // Setup basic event listeners\n element.addEventListener('beforeinput', _onBeforeinput)\n element.addEventListener('blur', _onBlur)\n element.addEventListener('click', _onClick)\n element.addEventListener('focus', _onFocus)\n element.addEventListener('input', _onInput)\n element.addEventListener('keydown', _onKeydown)\n element.addEventListener('keyup', _onKeyup)\n // Extra event for clearing input on \"Escape\": this goes _after_ the basic\n // ones so that anyone subscribed on \"keydown\" above can intercept the event\n // and stop propagation / prevent default / ...\n element.addEventListener('keydown', _onKeydownClear)\n}\n\n/** Remove all event listeners added above */\nfunction _removeEventListeners(element?: HTMLInputElement | undefined): void {\n if (! element) return\n // Extra events for focus state\n element.removeEventListener('focus', _onFocusFocusable)\n element.removeEventListener('blur', _onBlurFocusable)\n // Setup basic event listeners\n element.removeEventListener('beforeinput', _onBeforeinput)\n element.removeEventListener('blur', _onBlur)\n element.removeEventListener('click', _onClick)\n element.removeEventListener('focus', _onFocus)\n element.removeEventListener('input', _onInput)\n element.removeEventListener('keydown', _onKeydown)\n element.removeEventListener('keyup', _onKeyup)\n // Extra event for clearing input on \"Escape\"\n element.removeEventListener('keydown', _onKeydownClear)\n}\n\n/* On mounted, validate our main ref and add event listeners */\nonMounted(() => {\n if (! _qinput.value) throw new Error('No QInput ref')\n if (! _helper.value) throw new Error('No ZFormHelper ref')\n\n // We _watch_ but this should happen only once...\n watch(() => _qinput.value?.nativeEl, (newElement, oldElement) => {\n // Remove old event listeners and setup new ones (in case the element changes)\n _removeEventListeners(oldElement as HTMLInputElement)\n _addEventListeners(newElement as HTMLInputElement)\n // If we have a new element, set the input mode\n if (newElement) newElement.inputMode = _props.mode\n }, { immediate: true })\n})\n\n/* Before unmounting be nice and remove all our event listeners */\nonBeforeUnmount(() => _removeEventListeners(_qinput.value?.nativeEl as HTMLInputElement))\n</script>\n\n<style lang=\"postcss\" scoped>\n/* Suffix behind the input */\n.z-suffix {\n user-select: none;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: hidden;\n font-weight: 500;\n\n .z-suffix-hidden { color: transparent }\n .z-suffix-visible { opacity: 0.5 }\n}\n</style>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n\n type=\"text\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n :link=\"link\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :debounce=\"debounce\"\n :suffix=\"suffix\"\n :prefix=\"prefix\"\n\n :required=\"required\"\n :max-length=\"maxLength\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n @clear=\"_value = ''\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\n\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZString' })\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>,\n required: false,\n default: 'text',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The debounce time in milliseconds for the input field */\n debounce: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n /** The prefix to add to the input */\n prefix: {\n type: String as PropType<string>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The minimum length of this field (starting at 1, for 0 use \"required\") */\n minLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The maximum length, displayed with a counter (and error when too long). */\n maxLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/** Validation rules */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n if (_props.minLength > 0) rules.push(validators.minLength(_props.minLength))\n rules.push(..._props.rules)\n return rules\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-string\n ref=\"_zstring\"\n v-model=\"value\"\n :debounce=\"750\"\n :label=\"$t(translations.search)\"\n :icon=\"icons.search\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZString from '../inputs/string.vue'\nimport { componentFormProps } from '../utils/form'\n\nconst _zstring = ref<InstanceType<typeof ZString>>()\n\ndefineOptions({ name: 'ZControlSearch' })\n\ndefineProps(componentFormProps)\n\nconst value = defineModel({\n type: String,\n required: true,\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _zstring.value?.focus(),\n})\n\n/* On mounted, validate our main ref */\nonMounted(() => {\n if (! _zstring.value) throw new Error('No QInput ref')\n})\n\n</script>\n","<template>\n <z-form-helper\n v-slot=\"scope\"\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n >\n <z-btn-group class=\"rounded-borders\">\n <z-btn\n v-for=\"option in options\"\n :key=\"option.value\"\n dense\n class=\"z-control\"\n style=\"margin-right: -1px;\"\n :class=\"{ 'z-control-active': value === option.value }\"\n :icon=\"option.icon\"\n :disable=\"scope.disabled\"\n :tooltip=\"option.tooltip\"\n\n @click=\"value = (value === option.value) ? undefined : option.value\"\n />\n </z-btn-group>\n </z-form-helper>\n</template>\n\n<script setup lang=\"ts\">\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { PropType } from 'vue'\n\ndefineOptions({ name: 'ZControlSwitch' })\n\ndefineProps({\n /** The options for this selection */\n options: {\n type: Array as PropType<{ icon: string, value: string, tooltip?: string }[]>,\n required: true,\n },\n ...componentFormProps,\n})\n\nconst value = defineModel({\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.q-btn-group {\n .z-control:not(:first-child) {\n border-left: none;\n }\n}\n\n</style>\n","<template>\n <q-dialog\n ref=\"dialogRef\"\n v-model=\"state\"\n :persistent=\"persistent\"\n :full-width=\"fullWidth || $q.screen.lt.sm\"\n :full-height=\"fullHeight\"\n @show=\"emit('show')\"\n @hide=\"emit('hide')\"\n >\n <q-card class=\"q-dialog-plugin\" :style=\"{ width: wide ? '100%' : null }\">\n <q-card-section horizontal class=\"q-pa-md bg-shade-primary\">\n <div class=\"col text-h6 text-bold text-uppercase\">\n {{ title }}\n </div>\n <div v-if=\"! persistent\" class=\"row justify-end\">\n <q-card-actions vertical class=\"justify-around q-pa-none\">\n <q-icon\n size=\"xs\"\n color=\"primary\"\n class=\"icon-close\"\n :name=\"icons.cancel\"\n @click=\"onDialogCancel\"\n />\n </q-card-actions>\n </div>\n </q-card-section>\n\n <q-separator />\n\n <slot name=\"default\" />\n </q-card>\n </q-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n QCard,\n QCardActions,\n QCardSection,\n QDialog,\n QIcon,\n QSeparator,\n useDialogPluginComponent,\n} from 'quasar'\n\nimport { icons } from '../assets/icons'\n\nimport type { VNode } from 'vue'\n\nconst { dialogRef, onDialogOK, onDialogCancel } = useDialogPluginComponent()\n\ndefineOptions({ name: 'ZDialog' })\n\ndefineProps({\n /** The title of this dialog */\n title: {\n type: String,\n required: true,\n },\n /**\n * Indicates that this dialog can not be dismissed automatically (e.g.\n * by clicking outside of it, or with the `ESC` key)\n */\n persistent: {\n type: Boolean,\n default: false,\n },\n /** Present a wider dialog */\n wide: {\n type: Boolean,\n default: false,\n },\n fullWidth: {\n type: Boolean,\n default: false,\n },\n fullHeight: {\n type: Boolean,\n default: false,\n },\n})\n\n/** Showing state */\nconst state = defineModel({\n type: Boolean,\n required: false,\n default: false,\n})\n\n/** Emits from the dialog */\nconst emit = defineEmits<{\n (event: 'ok', payload?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineSlots<{\n default: () => VNode[]\n}>()\n\ndefineExpose({\n show: () => dialogRef.value?.show(),\n shake: () => dialogRef.value?.shake(),\n confirm: onDialogOK,\n cancel: onDialogCancel,\n})\n</script>\n\n<style scoped lang=\"pcss\">\n/* Hover effect for the close icon */\n.icon-close {\n padding: 3px;\n cursor: pointer;\n margin-right: -3px;\n border-radius: 3px;\n\n &:hover {\n background-color: var(--q-shade-primary);\n }\n}\n</style>\n","<template>\n <z-dialog\n ref=\"dialog\"\n persistent\n :title=\"title\"\n @ok=\"emit('ok', $event)\"\n @show=\"emit('show')\"\n @hide=\"emit('hide')\"\n >\n <slot v-if=\"slots.default\" />\n <q-card-section v-else>\n {{ message }}\n </q-card-section>\n\n <q-card-actions>\n <z-btn\n class=\"col\"\n :label=\"cancel || t({ en: 'Cancel', de: 'Abbrechen' })\"\n :icon=\"cancelIcon\"\n :color=\"cancelColor\"\n @click=\"dialog?.cancel()\"\n />\n <z-btn\n class=\"col\"\n :label=\"confirm || t({ en: 'Confirm', de: 'Bestätigen' })\"\n :icon=\"confirmIcon\"\n :color=\"confirmColor\"\n @click=\"dialog?.confirm()\"\n />\n </q-card-actions>\n </z-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QCardActions, QCardSection } from 'quasar'\nimport { ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZDialog from './dialog.vue'\n\nimport type { VNode } from 'vue'\n\nconst { t } = useTranslator()\n\ndefineOptions({ name: 'ZConfirmDialog' })\n\ndefineProps({\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n required: false,\n default: '',\n },\n confirm: {\n type: String,\n required: false,\n default: undefined,\n },\n confirmIcon: {\n type: String,\n required: false,\n default: icons.confirm,\n },\n confirmColor: {\n type: String,\n required: false,\n default: 'positive',\n },\n cancel: {\n type: String,\n required: false,\n default: undefined,\n },\n cancelIcon: {\n type: String,\n required: false,\n default: icons.cancel,\n },\n cancelColor: {\n type: String,\n required: false,\n default: 'negative',\n },\n})\n\nconst slots = defineSlots<{\n default?: () => VNode[]\n}>()\n\nconst dialog = ref<InstanceType<typeof ZDialog>>()\n\n/** Emits from the dialog */\nconst emit = defineEmits<{\n (event: 'ok', payload?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineExpose({\n show: () => dialog.value?.show(),\n shake: () => dialog.value?.shake(),\n confirm: (value?: any) => dialog.value?.confirm(value),\n cancel: () => dialog.value?.cancel(),\n})\n</script>\n","<template>\n <z-dialog\n ref=\"_dialog\"\n persistent\n :title=\"title\"\n @show=\"_emit('show')\"\n @hide=\"_emit('hide')\"\n >\n <q-card-section class=\"row items-center justify-between\">\n <div>{{ message }}</div>\n <div>{{ _progress }}</div>\n </q-card-section>\n\n <q-card-section>\n <q-linear-progress instant-feedback :value=\"_quantity\" />\n </q-card-section>\n\n <q-card-actions v-if=\"onCancel\">\n <z-btn\n class=\"col\"\n color=\"negative\"\n :label=\"t({ en: 'Cancel', de: 'Abbrechen' })\"\n :icon=\"icons.cancel\"\n :disable=\"_canceled\"\n @click=\"_cancel()\"\n />\n </q-card-actions>\n </z-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QCardActions, QCardSection, QLinearProgress } from 'quasar'\nimport { computed, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\nimport ZDialog from './dialog.vue'\n\nimport type { PropType } from 'vue'\n\nconst { t } = useTranslator()\n\ndefineOptions({ name: 'JProgressDialog' })\n\nconst _props = defineProps({\n title: {\n type: String,\n required: true,\n },\n message: {\n type: String,\n required: true,\n },\n progress: {\n type: Number,\n required: false,\n default: 0,\n },\n total: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n onCancel: {\n type: Function as PropType<(() => void) | undefined>,\n required: false,\n default: undefined,\n },\n})\n\n\nconst _canceled = ref(false)\nconst _dialog = ref<InstanceType<typeof ZDialog>>()\n\nfunction _cancel(): void {\n if (!_props.onCancel) return\n _canceled.value = true\n _props.onCancel()\n}\n\nconst _progress = computed(() => {\n if (_props.total) return `${_props.progress + 1} / ${_props.total}`\n return `${Math.round(_props.progress * 100)}%`\n})\n\nconst _quantity = computed(() => {\n if (_props.total) return _props.progress / (_props.total - 1)\n return _props.progress\n})\n\n/** Emits from the dialog */\nconst _emit = defineEmits<{\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\ndefineExpose({\n show: () => _dialog.value?.show(),\n hide: () => _dialog.value?.cancel(),\n})\n\n</script>\n","<template>\n <slot name=\"default\" v-bind=\"$attrs\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { nextTick, watch } from 'vue'\n\nimport { formProps, provideFormProps, provideFormReadyState } from '../utils/form'\n\nimport type { VNode } from 'vue'\n\n/* ===== NAME, PROPS, SLOTS, ... ============================================ */\n\ndefineOptions({ name: 'ZInputGroup' })\n\nconst _props = defineProps(formProps)\n\ndefineSlots<{\n default: () => VNode[],\n}>()\n\n/* ===== LOCAL STUFF ======================================================== */\n\nprovideFormProps(_props)\n\n/** The focused element, saved before disabling, and restored after */\nlet _focused: Element | null = null\n\n/* Watch the `disabled` prop and save the focused element, when this is\n * changed to _true_, and restore the old focused element on _false */\nwatch(() => _props.disabled, (disabled) => {\n if (disabled) return _focused = document.activeElement\n nextTick(() => { // wait for reactivity to update the DOM\n if (_focused instanceof HTMLElement) {\n _focused.focus()\n _focused = null\n }\n })\n})\n\ndefineExpose({\n /** A flag indicating that the \"required\" constraint (if any) was fulfilled */\n isReady: provideFormReadyState(),\n})\n</script>\n","<template>\n <z-input-group\n ref=\"_zinputs\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n :bottom-slots=\"bottomSlots\"\n >\n <q-form ref=\"_qform\" v-bind=\"{ ..._cleanProps, ...$attrs }\">\n <!-- hidden button to allow submitting on \"enter\" -->\n <button type=\"submit\" style=\"display: none;\" />\n <!-- default slot from the parent -->\n <slot v-if=\"_slots.default\" name=\"default\" />\n </q-form>\n </z-input-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport { QForm } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { formProps } from '../utils/form'\nimport ZInputGroup from './input-group.vue'\n\nimport type { QFormProps, QFormSlots } from 'quasar'\nimport type { PropType } from 'vue'\n\n/** Ref to our `QForm` */\nconst _qform = ref<QForm>()\n/** Ref to our `ZInputGroup` */\nconst _zinputs = ref<InstanceType<typeof ZInputGroup>>()\n\n/* ===== NAME, PROPS, SLOTS, EXPOSED ======================================== */\n\ndefineOptions({ name: 'ZForm' })\n\nconst _props = defineProps({\n // Pass-through for all QForm props (properly typed)\n ...QForm.props as { [ K in keyof QFormProps ]-?: PropType<QFormProps[K]> },\n // ZForm-specific props with defaults\n ...formProps,\n})\n\nconst _slots = defineSlots<Partial<QFormSlots>>()\n\n/* ===== LOCAL STUFF ======================================================== */\n\n/** Cleaned-up props (without \"bottomSlots\", \"editable\", ...) */\nconst _cleanProps = computed(() => ({\n ..._props,\n bottomSlots: undefined,\n editable: undefined,\n disabled: undefined,\n lazyRules: undefined,\n}))\n\ndefineExpose({\n focus: () => _qform.value?.focus(),\n validate: (shouldFocus?: boolean | undefined) => _qform.value ?\n _qform.value.validate(shouldFocus) :\n Promise.reject(new Error(('No QForm'))),\n resetValidation: () => _qform.value?.resetValidation(),\n submit: () => _qform.value?.submit(),\n reset: () => _qform.value?.reset(),\n getValidationComponents: () => _qform.value?.getValidationComponents(),\n isReady: computed(() => _zinputs.value?.isReady || false),\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZInputGroup ref is set */\nonMounted(() => {\n if (! _zinputs.value) throw new Error('No ZInputGroup ref')\n})\n</script>\n","import { computed, ref } from 'vue'\n\nimport type { ComputedRef } from 'vue'\n\n/** A loader, keeping track of concurrent loading callbacks */\nexport interface ZLoader {\n /** The loading state */\n loading: ComputedRef<boolean>\n /** Execute a callback triggering the loading state */\n load<T>(callback: () => T | Promise<T>): Promise<T>\n}\n\n/* ===== INTERNALS ========================================================== */\n\n/** Create a new loader with an optional parent (the root loader) */\nfunction loader(parent?: ZLoader | undefined): ZLoader {\n const _loading = ref(0)\n\n /** The loading state, computed by the _parent_ and this loader */\n const loading = computed(() => parent?.loading.value || (_loading.value > 0))\n\n /** Execute a callback triggering the loading state */\n async function load<T>(callback: () => T | Promise<T>): Promise<T> {\n _loading.value ++\n try {\n return await callback()\n } finally {\n _loading.value --\n }\n }\n\n /* Here is the loader */\n return { loading, load }\n}\n\n/** The global (root) loader */\nconst rootLoader = loader()\n\n/* ===== EXPORTED ========================================================== */\n\n/** Use the global loader */\nexport function useLoader(): ZLoader {\n return rootLoader\n}\n\n/**\n * Create a new loader, potentially decoupled from the root one.\n *\n * When `detached` is `false` (or not defined), the loader will be linked to\n * the root loader, meaning that when the root loader is loading, this loader\n * will also be loading (but not vice-versa, the loading state of this child\n * will _not_ affect the state of the root loader).\n *\n * When `detached` is `true`, the loader will be completely independent from\n * the root loader.\n */\nexport function createLoader(detached?: boolean): ZLoader {\n return loader(detached ? undefined : rootLoader)\n}\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n :model-value=\"_selected\"\n\n dense\n outlined\n stack-label\n use-input\n hide-selected\n fill-input\n\n no-error-icon\n hide-dropdown-icon\n\n :class=\"\n formProps.disabled ? 'z-state-disabled' :\n formProps.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon\n\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :disable=\"formProps.disabled\"\n :readonly=\"! formProps.editable\"\n :rules=\"_rules\"\n\n :options=\"_options\"\n :editable=\"true\"\n :input-debounce=\"debounce\"\n :behavior=\"'menu'\"\n :loading=\"loading\"\n\n @keydown=\"onKeydown\"\n @input-value=\"_onInputValue\"\n @popup-hide=\"_onPopupHide\"\n @popup-show=\"_onPopupShow\"\n @update:model-value=\"_onSelected\"\n >\n <template #loading>\n <q-spinner color=\"grey\" size=\"xs\" />\n </template>\n\n <template v-if=\"maxLength && formProps.editable\" #counter>\n {{ _input.length }} / {{ maxLength }}\n </template>\n\n <template #append>\n <!-- First icon, error -->\n <q-icon\n v-if=\"_qselect?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n <!-- Second icon: clearable/required -->\n <q-icon\n v-if=\"formProps.editable && _selected && clearable\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click.stop.prevent=\"_input = ''\"\n />\n <q-icon\n v-else-if=\"(! _selected) && required\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n <!-- Icon from parent -->\n <q-icon\n v-if=\"icon\"\n :name=\"icon\"\n class=\"z-icon\"\n />\n </template>\n\n <template #option=\"scope: Parameters<QSelectSlots['option']>[0]\">\n <slot v-if=\"_slots.option\" name=\"option\" v-bind=\"scope\" />\n <q-item v-else v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n {{ scope.label }}\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemSection, QSelect, QSpinner } from 'quasar'\nimport { computed, nextTick, onMounted, ref, shallowRef, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps } from '../utils/form'\nimport { createLoader } from '../utils/loader'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZOption } from '../types'\n\nconst validators = useValidators()\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZAutocomplete' })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== AUTOCOMPLETE ===================================================== */\n\n /** Debounce input for the specified amount of time (default: 250ms) */\n debounce: {\n type: Number,\n required: false,\n default: 250,\n },\n /**\n * Used as `@autocomplete=\"...\"` in templates, prepares a list of otions\n * that can be auto-completed.\n *\n * When this method returns `string[]`, then the `@selected` event will\n * *not* be emitted (pure autocomplete). In order to have the `@selected`\n * even fired *always* return an array of `Option` objects, with unique\n * `value` properties.\n */\n onAutocomplete: {\n type: Function as PropType<(text: string) => (ZOption | string)[] | Promise<(ZOption | string)[]>>,\n required: true,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n maxLength: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\nconst _slots = defineSlots<{\n option?: (scope: Parameters<QSelectSlots['option']>[0]) => VNode[],\n}>()\n\n/** The *text* value of the input */\nconst _input = defineModel({\n type: String as PropType<string >,\n required: false,\n default: '',\n})\n\nconst _emit = defineEmits<{\n (event: 'selected', value: ZOption): void,\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n})\n\n/* ===== INTERNAL STATE ===================================================== */\n\n/** List of currently filtered tags */\nconst _options = shallowRef<readonly ZOption[]>([])\n\n/** The validation rules to apply to this field */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n\n /* Required (from prop) */\n if (_props.required) rules.push(validators.required())\n /* Max length (from prop) */\n if (_props.maxLength > 0) rules.push(validators.maxLength(_props.maxLength))\n /* All other rules (from prop) */\n rules.push(..._props.rules)\n\n return [ (value?: ZOption | undefined) => {\n for (const rule of rules) {\n const result = rule(value?.label || '')\n if (typeof result === 'string') return result\n if (result === false) return false\n }\n return true\n } ]\n})\n\n/* ===== SELECTED VALUE ===================================================== */\n\n/** Currently selected option */\nconst _selected = shallowRef<ZOption | undefined>(_input.value ? { label: _input.value, value: _input.value } : undefined)\n\n\n/** Selected from the popup menu */\nfunction _onSelected(option: ZOption): void {\n // remember this option and set the input value of the label\n _selected.value = option\n _input.value = option.label\n\n // If by any chance we have an autocompleter running, cancel it\n _autocompleter.cancel()\n\n // hide the popup, clear the options\n _qselect.value?.hidePopup()\n _options.value = []\n\n // emit the selected event\n _emit('selected', option)\n}\n\n/* ===== INPUT VALUE ======================================================== */\n\n/* Update the text in our control based on what's out */\nwatch(_input, (value) => {\n _qselect.value?.updateInputValue(value, true)\n if (value) _selected.value = { label: value, value }\n else if (_selected.value) _selected.value = undefined\n}, { immediate: true })\n\n/** Update the model from the changes typed by the user */\nfunction _onInputValue(value: string): void {\n value = value.trim().replace(/\\s+/g, ' ') // always normalize!\n\n // when we have no change, just bail out\n if (value === _input.value) return\n _input.value = value\n\n // QSelect validates on *selection*, but we validate on *input* (text)!\n _qselect.value?.validate() // validate the input\n\n // if the value is already in the options, we don't need to autocomplete: this\n // is someone going up-and-down the list with the cursor keys... but if it's\n // not in the list, then someone is typing and we need to autocomplete again!\n const found = _options.value.find((option) => option.label === value)\n if (! found) _autocomplete(value)\n}\n\n\n/* ===== STATE ============================================================== */\n\n/** On popup hide, clear the options for the next autocomplete iteration */\nfunction _onPopupHide(): void {\n _options.value = []\n}\n\n/** On popup show, simply focus on the first option available */\nfunction _onPopupShow(): void {\n if (! _qselect.value?.options?.length) return // should never happen...\n _qselect.value?.setOptionIndex(-1)\n _qselect.value?.moveOptionSelection(1, true)\n}\n\n/* ===== FUNCTIONS ========================================================== */\n\n/**\n * Traps \"Escape\" to hide the popup (first) and clear the value (second) or\n * \"Tab\" to autocomplete.\n *\n * Quasar tracks \"Escape\" (and resets the input value) on \"keyup\"... This\n * happens only when the popup is shown (see below) so we intercept on key\n * down, and manually close the popup / wipe the input as needed.\n * https://github.com/quasarframework/quasar/blob/7182607ecac54c406c3cce595245d1bb1160024a/ui/src/components/select/QSelect.js#L639-L644\n */\nfunction onKeydown(event: KeyboardEvent): void {\n if (! _qselect.value) return // should never happen\n\n // no modifiers\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n\n // Handle \"Escape\" key (close popup / clear value)\n if (event.code === 'Escape') {\n // if we have options, clear them and hide the popup\n if (_options.value.length > 0) _qselect.value.hidePopup()\n else _input.value = ''\n\n // regardless...\n _qselect.value.hidePopup()\n event.preventDefault()\n event.stopPropagation()\n }\n}\n\n/* ===== AUTOCOMPLETE ======================================================= */\n\n/** Loader and loading state for autocompletion */\nconst { load, loading } = createLoader(true) // detached from global loading\n\n/**\n * A simple class asynchronously querying autocompletions and passing them to\n * our `QSelect` _unless_ its execution was canceled\n */\nclass Autocompleter {\n private _canceled = false\n\n constructor(public readonly text: string) {\n // Always start in the next tick, this gives us the chance to cancel!\n nextTick(() => load(async () => {\n // If canceled already, don't even fetch... This is important because the\n // initial autocompleter will be canceled immediately below, or when\n // \"_onSelect()\" and \"_onInputValue()\" are called, we don't know which\n // comes first, so we give them the ability to cancel each-other!\n if (this._canceled) return\n\n // Fetch the results and map them to options, then freeze the array\n const results = text ? await _props.onAutocomplete(text) : []\n const options = Object.freeze(results.map((option) => {\n if (typeof option === 'string') return { label: option, value: option }\n return option\n }))\n\n // If this was canceled (fetching might take time), then we ignore all\n // the rest and just ignore whatever results we got\n if (this._canceled) return\n\n // Immediately hide the popup if there are no options. If we don't call\n // this and just let the options be set to an empty array, then Quasar\n // will not emit the \"hide\" event and all sorts of bad will happen!\n if (options.length === 0) _qselect.value?.hidePopup()\n _options.value = options\n\n // On the next tick if and only if f there are options, show the popup\n nextTick(() => _qselect.value?.options?.length && _qselect.value?.showPopup())\n }))\n }\n\n /** Cancel this autocompleter */\n cancel(): this {\n this._canceled = true\n return this\n }\n}\n\n/**\n * The currently running asynchronous autocompleter.\n *\n * The initial value uses the input model value, but is immediately canceled\n * (so that we don't fetch at the beginning, but once the input changes we do)\n */\nlet _autocompleter: Autocompleter = new Autocompleter(_input.value).cancel()\n\n/* Asynchronous filtering shows and hides the popup in Quasar, so rather than\n * using `@filter=\"...\"` we take over the part of showing our autocompletion\n * options entirely */\nfunction _autocomplete(text: string): void {\n // \"Cancel\" the previous autocompleter if it's still running\n _autocompleter.cancel()\n\n // If the current text matches the last autocomplete run, we ignore\n if (text === _autocompleter.text) return\n\n // And create a new one!\n _autocompleter = new Autocompleter(text)\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n})\n</script>\n","<template>\n <z-autocomplete\n ref=\"_zautocomplete\"\n v-model=\"_value\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :debounce=\"debounce\"\n :clearable=\"clearable\"\n\n :max-length=\"maxLength\"\n :required=\"required\"\n :rules=\"rules\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n\n @autocomplete=\"_predictAddress\"\n @selected=\"_fillAddress\"\n >\n <template #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <div>\n <span\n v-for=\"(token, i) in (scope.opt.tokens as AddressToken[])\"\n :key=\"`${scope.opt.value}.${i}`\"\n :class=\"`autocomplete-${token.type}`\"\n >\n {{ token.value }}\n </span>\n </div>\n </q-item-section>\n </q-item>\n </template>\n </z-autocomplete>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QItem, QItemSection } from 'quasar'\nimport { onMounted, ref } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZAutocomplete from './autocomplete.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZAddressData, ZOption } from '../types'\n\nconst { locale } = useTranslator()\n\nconst _zautocomplete = ref<InstanceType<typeof ZAutocomplete>>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZAddress' })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Debounce input for the specified amount of time (default: 250ms) */\n debounce: {\n type: Number,\n required: false,\n default: 250,\n },\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== GOOGLE MAPS ====================================================== */\n\n /** Region to bias results in (e.g. DE) */\n region: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Clearable, when clicked value will become the empty string */\n maxLength: {\n type: Number as PropType<number>,\n required: false,\n default: 0,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The *text* value of the input */\nconst _value = defineModel({\n type: String as PropType<string >,\n required: false,\n default: '',\n})\n\nconst _emit = defineEmits<{\n (event: 'address', value: ZAddressData, foo?: boolean): void,\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _zautocomplete.value?.focus(),\n})\n\n/* ===== Google Maps Autocomplete =========================================== */\n\ntype AddressToken = { value: string, type: 'match' | 'miss' | 'secondary' }\ntype AddressPrediction = ZOption & { tokens: AddressToken[] }\n\nlet _googleService: google.maps.places.AutocompleteService | undefined = undefined\n\nasync function _predictAddress(value: string): Promise<{ value: string, label: string }[]> {\n if (! _googleService) {\n if (! globalThis.google?.maps?.places?.AutocompleteService) {\n throw new Error('Google Maps AutocompleteService not available')\n }\n _googleService = new google.maps.places.AutocompleteService()\n }\n\n if (! value) return [] // should never happen, but still\n\n // Prepare our request\n const request = {\n input: value,\n types: [ 'address' ],\n region: _props.region,\n language: locale.toString(),\n } satisfies google.maps.places.AutocompletionRequest\n\n // Get place predictions from Google\n const response = await _googleService.getPlacePredictions(request)\n\n // Process predictions and extract tokens\n const predictions: AddressPrediction[] = []\n for (const prediction of response.predictions) {\n const current: AddressPrediction = {\n value: prediction.place_id,\n label: prediction.description,\n tokens: [],\n }\n\n let pos = 0\n for (const subs of prediction.structured_formatting.main_text_matched_substrings) {\n const off = subs.offset\n const end = subs.offset + subs.length\n const miss = prediction.structured_formatting.main_text.slice(pos, off)\n const match = prediction.structured_formatting.main_text.slice(off, end)\n if (miss) current.tokens.push({ value: miss, type: 'miss' })\n if (match) current.tokens.push({ value: match, type: 'match' })\n pos = end\n }\n\n const miss = prediction.structured_formatting.main_text.slice(pos)\n const secondary = prediction.structured_formatting.secondary_text\n\n if (miss) current.tokens.push({ value: miss, type: 'miss' })\n if (secondary) current.tokens.push({ value: ` - ${secondary}`, type: 'secondary' })\n\n predictions.push(current)\n }\n\n // Return our predictions\n return predictions\n}\n\nasync function _fillAddress(option: ZOption): Promise<void> {\n if (! globalThis.google?.maps?.places?.Place) {\n throw new Error('Google Maps Place not available')\n }\n\n const place = new google.maps.places.Place({ id: option.value })\n await place.fetchFields({ fields: [ 'addressComponents' ] })\n\n const address: ZAddressData = {}\n for (const component of place.addressComponents || []) {\n for (const type of component.types) {\n switch (type) {\n case 'route': address.street_name = component.longText || ''; break\n case 'street_number': address.house_number = component.longText || ''; break\n case 'postal_code': address.postal_code = component.longText || ''; break\n case 'locality': address.city = component.longText || ''; break\n case 'country': address.country = component.shortText || undefined; break // short!\n }\n }\n }\n\n // emit our address\n _emit('address', address)\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _zautocomplete.value) throw new Error('No ZAutocomplete ref')\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.autocomplete-match {\n font-weight: 700;\n}\n\n.autocomplete-miss {\n font-weight: 400;\n}\n\n.autocomplete-secondary {\n font-size: 0.75em;\n}\n</style>\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n ref=\"_helper\"\n v-slot=\"formProps\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n v-model=\"_value\"\n\n dense\n outlined\n stack-label\n map-options\n emit-value\n hide-dropdown-icon\n no-error-icon\n\n :class=\"\n formProps.disabled ? 'z-state-disabled' :\n formProps.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :prefix=\"prefix\"\n :hint=\"hint\"\n :bottom-slots=\"formProps.bottomSlots\"\n :hide-bottom-space=\"! formProps.bottomSlots\"\n :icon\n\n :disable=\"formProps.disabled\"\n :readonly=\"! formProps.editable\"\n :rules=\"_rules\"\n\n :options=\"_options\"\n :behavior=\"'menu'\"\n >\n <template #append>\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.prepend\" name=\"prepend\" v-bind=\"formProps\" />\n <!-- First icon, dropdown (only visible when editable) -->\n <q-icon\n v-if=\"formProps.editable\"\n :name=\"icons.select\"\n class=\"z-icon\"\n />\n <!-- Second icon, error -->\n <q-icon\n v-if=\"_qselect?.hasError\"\n :name=\"icons.error\"\n class=\"z-icon z-icon-error\"\n />\n <!-- Third icon, clearable/required -->\n <q-icon\n v-if=\"formProps.editable && _value && clearable\"\n :name=\"icons.cancel\"\n class=\"z-icon z-icon-clickable\"\n @click.stop.prevent=\"_value = ''\"\n />\n <q-icon\n v-else-if=\"(! _value) && required\"\n :name=\"icons.required\"\n class=\"z-icon\"\n />\n <!-- Fourth icon, parent icon -->\n <q-icon\n v-if=\"icon\"\n :name=\"icon\"\n class=\"z-icon\"\n />\n <!-- More stuff from the parent -->\n <slot v-if=\"_slots.append\" name=\"append\" v-bind=\"formProps\" />\n </template>\n\n <!-- When specified, use the \"option\" slot from the caller -->\n <template v-if=\"_slots.option\" #option=\"scope\">\n <slot name=\"option\" v-bind=\"scope\" />\n </template>\n\n <!-- The default option template, dense -->\n <template v-else #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <q-item-label>\n {{ scope.label }}\n </q-item-label>\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QSelect } from 'quasar'\nimport { computed, onMounted, ref, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport { componentFormProps, formReadyState } from '../utils/form'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/** Ref to our `ZFormHelper` */\nconst _helper = ref<InstanceType<typeof ZFormHelper>>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZSelect' })\n\nconst _props = defineProps({\n\n /* ===== OPTIONS ========================================================== */\n\n /** All our options, keyed by the option, with values being the labels */\n options: {\n type: Object as PropType<Record<string, string> | { value: string, label: string }[] | string[]>,\n required: true,\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The prefix to display before the input value */\n prefix: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The currently selected option */\nconst _value = defineModel({\n type: String,\n required: false,\n default: undefined,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n prepend?: (formProps: Readonly<ZFormProps>) => VNode[]\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n option?: QSelectSlots['option']\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _qselect.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _qselect.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _qselect.value?.hasError || false),\n})\n\n/* ===== STATE ============================================================== */\n\n/** Convert options from a record to an array and sort */\nconst _options = computed(() => {\n if (Array.isArray(_props.options)) {\n return _props.options.map((value) => typeof value === 'string' ? { label: value, value } : value)\n }\n\n return Object.entries(_props.options)\n .map(([ value, label ]) => ({ value, label }))\n .sort((a, b) => a.label.localeCompare(b.label))\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** The validation rules to apply to this field */\nconst _rules = computed(() => {\n // Remember, Quasar won't clear the error if there are no rules!!!\n return _props.required ? [ validators.required() ] : [ () => true ]\n})\n\n/* When editable or validation rules change, reset validation */\nwatch([ () => _helper.value?.isEditable, _rules ], () => _qselect.value?.resetValidation())\n\n/* Ready state for parent ZForm */\nformReadyState(() => {\n if (_qselect.value?.hasError) return false\n if (_props.required) return !! _value.value\n return true\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n if (! _helper.value) throw new Error('No ZFormHelper ref')\n})\n</script>\n","<template>\n <z-select\n v-model=\"_value\"\n\n :readonly=\"readonly\"\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :lazy-rules=\"lazyRules\"\n\n :required=\"required\"\n :clearable=\"clearable\"\n :suffix=\"suffix\"\n :options=\"_countries\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :prefix=\"_flag\"\n :icon=\"icon\"\n >\n <template #option=\"scope\">\n <q-item v-bind=\"scope.itemProps\" dense>\n <q-item-section>\n <q-item-label>\n {{ scope.label }}\n </q-item-label>\n </q-item-section>\n <q-item-section avatar>\n <q-item-label>\n {{ scope.opt.flag }}\n </q-item-label>\n </q-item-section>\n </q-item>\n </template>\n </z-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { ISO_COUNTRIES, useTranslator } from '@juit/vue-i18n'\nimport { QItem, QItemLabel, QItemSection } from 'quasar'\nimport { computed } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZSelect from './select.vue'\n\nimport type { PropType } from 'vue'\n\nconst translator = useTranslator()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZSelect' })\n\ndefineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The suffix to display after the input value */\n suffix: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== OTHER OPTIONS ==================================================== */\n\n /** Clearable, when clicked value will become the empty string */\n clearable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Required */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\nconst _value = defineModel({\n type: String as PropType<string>,\n required: false,\n})\n\n\nconst _flag = computed(() => {\n return _value.value ? translator.utils.flag(_value.value as any) : ''\n})\n\nconst _countries = computed(() => {\n // Prepare the countries\n const countries: { value: string, label: string, flag: string }[] = []\n\n // Add all countries, with nice flags in the labels\n for (const code of ISO_COUNTRIES) {\n const label = translator.utils.country(code)\n const flag = translator.utils.flag(code)\n countries.push({ value: code, label: label, flag })\n }\n\n // Always sort by translated country NAME (\"Vereinigte Staaten\" is not \"U\")\n countries.sort((a, b) => a.label.localeCompare(b.label))\n\n // Done\n return countries\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n :model-value=\"_localized\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"_onClear\"\n @click=\"_onClick\"\n >\n <template #append>\n <!-- Popup proxy for date picking -->\n <q-popup-proxy\n ref=\"_qpopup\"\n no-parent-event\n :target=\"_target\"\n @before-hide=\"_hiding = true\"\n @hide=\"_hiding = false\"\n >\n <q-date\n minimal\n range\n mask=\"YYYY-MM-DD\"\n :model-value=\"_value || ''\"\n :first-day-of-week=\"1\"\n @update:model-value=\"_onUpdate\"\n />\n </q-popup-proxy>\n\n <!-- Icon for the picker -->\n <q-icon\n v-if=\"_ztext?.isEditable\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click=\"_onClick\"\n />\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QDate, QIcon, QPopupProxy } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { DateTimeFormatAlias } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\nimport type { ZDateRangeData } from '../types'\n\nconst { d } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _qpopup = ref<QPopupProxy>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDateRange', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.date,\n },\n format: {\n type: [ String, Object ] as PropType<DateTimeFormatAlias | Intl.DateTimeFormatOptions>,\n required: false,\n default: 'date',\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Indicates that the field can be cleared (sets the date to ''). */\n clearable: {\n type: [ Boolean, String ] as PropType<boolean | 'today'>,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: Object as PropType<ZDateRangeData | undefined>,\n required: false,\n})\n\n/** The localized value to display */\nconst _localized = computed(() => {\n if (! _value.value) return ''\n\n if (_value.value.from === _value.value.to) {\n return d(_value.value.from, _props.format, 'UTC')\n } else {\n const from = d(_value.value.from, _props.format, 'UTC')\n const to = d(_value.value.to, _props.format, 'UTC')\n return `${from} - ${to}`\n }\n})\n\n/* ===== POPUP MANAGEMENT =================================================== */\n\nconst _target = computed(() => _ztext.value?.$el.querySelector('.q-field__inner') || undefined)\nconst _hiding = ref(false)\n\nfunction _today(): string {\n const today = new Date()\n const year = String(today.getFullYear()).padStart(4, '0')\n const month = String(today.getMonth() + 1).padStart(2, '0')\n const day = String(today.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction _onClick(event: MouseEvent): void {\n if (! _hiding.value) _qpopup.value?.toggle()\n event.stopPropagation()\n event.preventDefault()\n}\n\nfunction _onUpdate(value: string | ZDateRangeData): void {\n if (! value) return // ignore when QDate clears the value\n if (value !== _value.value) {\n if (typeof(value) === 'string') {\n _value.value = {\n from: value,\n to: value,\n }\n } else {\n _value.value = {\n from: value.from,\n to: value.to,\n }\n }\n }\n _qpopup.value?.hide()\n}\n\nconst _onClear = computed((): (() => void) | undefined => {\n // Easy cases...\n if (_props.clearable === false) return undefined\n if (_props.clearable === true) return () => _value.value = undefined\n // When clearable is set to \"today\", we clear only if value is _not_ today\n if (_props.clearable === 'today') {\n const today = _today()\n if ((_value.value?.from === today) && (_value.value.to === today)) return undefined\n return () => _value.value = { from: today, to: today }\n } else return undefined\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n /* Set value if none was specified and clearable is set to \"today\" */\n if ((! _value.value) && (_props.clearable === 'today')) {\n _value.value = {\n from: _today(),\n to: _today(),\n }\n }\n\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _qpopup.value) throw new Error('No QPopupProxy ref')\n})\n\n/* ===== EXPOSE ============================================================= */\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Return _today_ in date format (`yyyy-mm-dd`) in the current timezone */\n today: () => _today(),\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n :model-value=\"_localized\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"_onClear\"\n @click=\"_onClick\"\n >\n <template #append>\n <!-- Popup proxy for date picking -->\n <q-popup-proxy\n ref=\"_qpopup\"\n no-parent-event\n :target=\"_target\"\n @before-hide=\"_hiding = true\"\n @hide=\"_hiding = false\"\n >\n <q-date\n minimal\n mask=\"YYYY-MM-DD\"\n :model-value=\"_value\"\n :first-day-of-week=\"1\"\n @update:model-value=\"_onUpdate\"\n />\n </q-popup-proxy>\n\n <!-- Icon for the picker -->\n <q-icon\n v-if=\"_ztext?.isEditable\"\n class=\"z-icon z-icon-clickable\"\n :name=\"icon\"\n @click=\"_onClick\"\n />\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QDate, QIcon, QPopupProxy } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { DateTimeFormatAlias } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\n\nconst { d } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _qpopup = ref<QPopupProxy>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDate', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.date,\n },\n format: {\n type: [ String, Object ] as PropType<DateTimeFormatAlias | Intl.DateTimeFormatOptions>,\n required: false,\n default: 'date',\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Indicates that the field can be cleared (sets the date to ''). */\n clearable: {\n type: [ Boolean, String ] as PropType<boolean | 'today'>,\n required: false,\n default: false,\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/** The localized value to display */\nconst _localized = computed(() => d(_value.value, _props.format, 'UTC'))\n\n/* ===== POPUP MANAGEMENT =================================================== */\n\nconst _target = computed(() => _ztext.value?.$el.querySelector('.q-field__inner') || undefined)\nconst _hiding = ref(false)\n\nfunction _today(): string {\n const today = new Date()\n const year = String(today.getFullYear()).padStart(4, '0')\n const month = String(today.getMonth() + 1).padStart(2, '0')\n const day = String(today.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nfunction _onClick(event: MouseEvent): void {\n if (! _hiding.value) _qpopup.value?.toggle()\n event.stopPropagation()\n event.preventDefault()\n}\n\nfunction _onUpdate(value: string): void {\n if (! value) return // ignore when QDate clears the value\n if (value !== _value.value) _value.value = value\n _qpopup.value?.hide()\n}\n\nconst _onClear = computed((): (() => void) | undefined => {\n // Easy cases...\n if (_props.clearable === false) return undefined\n if (_props.clearable === true) return () => _value.value = ''\n // When clearable is set to \"today\", we clear only if value is _not_ today\n if (_props.clearable === 'today') {\n if (_value.value === _today()) return undefined\n return () => _value.value = _today()\n } else return undefined\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n /* Set value if none was specified and clearable is set to \"today\" */\n if ((! _value.value) && (_props.clearable === 'today')) _value.value = _today()\n\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _qpopup.value) throw new Error('No QPopupProxy ref')\n})\n\n/* ===== EXPOSE ============================================================= */\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Return _today_ in date format (`yyyy-mm-dd`) in the current timezone */\n today: () => _today(),\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n type=\"text\"\n mode=\"numeric\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n :max-length=\"13\"\n :suffix=\"_ztext?.isEditable ? _suffix : undefined\"\n\n @clear=\"_value = ''\"\n @beforeinput=\"_onBeforeinput\"\n @keydown=\"_onKeydown\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\n\nconst { minLength } = useValidators()\nconst { t } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZEan13', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: icons.barcode,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** The suffix, padding the EAN13 to 13 characters */\nconst _suffix = computed(() => {\n if (! _value.value) return ''\n if (_value.value.length > 12) return ''\n if (_value.value.match(/[^0-9]/)) return ''\n\n // extend to 12 characters with zeroes, then add our checksum\n const suffix = '0'.repeat(12 - _value.value.length)\n return suffix + ean13Checksum(_value.value + suffix)\n})\n\n/** Validate as an EAN13 */\nconst _rules = computed<ZValidator<string>[]>(() => [\n // Minimum length\n minLength(13),\n // Only digits\n (value: string) => {\n if (value.match(/^[0-9]*$/)) return true\n return t({ en: 'Only numbers allowed', de: 'Nur Zahlen erlaubt' })\n },\n // EAN13 checksum validation\n (value: string) => { // checksum validation\n const slice = value.slice(0, 12)\n const checksum = ean13Checksum(slice)\n if (value === (slice + checksum)) return true\n return t({\n en: 'Last digit should be {checksum}',\n de: 'Letzte Ziffer sollte {checksum} sein',\n }, { checksum })\n },\n // Rules from props\n ..._props.rules,\n] satisfies ZValidator<string>[])\n\nfunction ean13Checksum(barcode: string): string {\n if (barcode.length < 12) return ''\n\n /* Calculate the weighted sum for the first 12 digits */\n let sum = 0\n for (let i = 0, w = 1; i < 12; i ++, w = i % 2 ? 3 : 1) {\n sum += (barcode.charCodeAt(i) - 0x30) * w\n }\n\n /* The checksum number is 10 - sum, we calculate it and convert it into a character */\n return String.fromCharCode(((10 - (sum % 10)) % 10) + 0x30)\n}\n\n/* ===== AUTOFILL =========================================================== */\n\nfunction _onBeforeinput(event: InputEvent): void {\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n // the \"insertText\" event is when we _type_ something, only numbers!\n if (event.data?.match(/^\\d+$/)) return\n // something else but text\n event.preventDefault()\n}\n\n/** Track \"Tab\" and autocomplete if we have a suffix */\nfunction _onKeydown(event: KeyboardEvent): void {\n if (! _suffix.value) return // no suffix? no autocomplete!\n const { key, altKey, ctrlKey, metaKey, shiftKey } = event\n if (altKey || ctrlKey || metaKey || shiftKey) return\n if (key !== 'Tab') return\n // Autocomplete to our suffix\n _value.value = _value.value + _suffix.value\n event.preventDefault()\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <div class=\"z-input\" :class=\"{ 'z-minimal-label': minimal }\">\n <z-form-helper\n v-slot=\"formProps\"\n :bottom-slots\n :disabled\n >\n <q-input\n :model-value=\"_value\"\n\n dense\n readonly\n stack-label\n no-error-icon\n\n input-style=\"cursor: default\"\n :class=\"((! minimal) && formProps.disabled) && 'z-state-disabled'\"\n :outlined=\"! minimal\"\n\n :placeholder=\" minimal ? placeholder : undefined\"\n :hint=\"hint\"\n :bottom-slots=\"minimal ? false : formProps.bottomSlots\"\n :hide-bottom-space=\"minimal ? true : ! formProps.bottomSlots\"\n\n :label=\"label\"\n >\n <template v-if=\"icon\" #append>\n <!-- Links are enabled *only* when the containing form is not editable -->\n <template v-if=\"link && (! formProps.formEditable)\">\n <!-- String links are rendered as anchors -->\n <a\n v-if=\"(typeof link === 'string')\"\n :href=\"link\"\n class=\"z-icon-link\"\n @click.stop=\"() => {} /* q-input captures clicks and prevents default */\"\n >\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </a>\n\n <!-- Object links are rendered as router links -->\n <router-link v-else :to=\"link\" class=\"z-icon-link\">\n <q-icon v-if=\"icon\" class=\"z-icon z-icon-clickable\" :name=\"icon\" />\n </router-link>\n </template>\n\n <!-- Render the plain icon (not clickable) -->\n <q-icon v-else class=\"z-icon\" :name=\"icon\" />\n </template>\n </q-input>\n </z-form-helper>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QIcon, QInput } from 'quasar'\nimport { computed } from 'vue'\nimport { RouterLink } from 'vue-router'\n\nimport ZFormHelper from '../forms/form-helper.vue'\n\nimport type { PropType } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\n\nconst { n, t } = useTranslator()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZLabel' })\n\nconst _props = defineProps({\n\n /** The value to display in this label */\n value: {\n type: [ String, Number, Boolean, null ] as PropType<string | number | boolean | null | undefined>,\n required: false,\n default: undefined,\n },\n\n /** Whether the label is minimalistic or not */\n minimal: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== MERGE WITH FORM PROPS ============================================ */\n\n /** Disabled state, overriding the editable and active states */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n\n /** Whether to reserve space for the bottom slots or not */\n bottomSlots: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n})\n\nconst _value = computed(() => {\n if (_props.value === undefined) return ''\n if (_props.value === null) return ''\n\n if (typeof _props.value === 'boolean') {\n return _props.value ?\n t({ en: 'True', de: 'Wahr' }) :\n t({ en: 'False', de: 'Falsch' })\n }\n\n if (typeof _props.value === 'number') {\n return n(_props.value)\n }\n\n return _props.value\n})\n\n</script>\n\n<style lang=\"postcss\" scoped>\n.z-minimal-label {\n :deep(.q-field__control) {\n background-color: transparent !important;\n padding-left: 6px;\n padding-right: 6px;\n\n &::before {\n border-top: 1px solid transparent !important;\n border-left: 1px solid transparent !important;\n border-right: 1px solid transparent !important;\n }\n }\n}\n</style>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"{ ..._attrs, validateNull: undefined }\"\n v-model=\"_string\"\n type=\"text\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :suffix=\"suffix\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n :on-clear=\"() => _number = null\"\n\n @beforeinput=\"_onBeforeinput($event)\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { computed, onMounted, ref, useAttrs, watch } from 'vue'\n\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\nconst validators = useValidators()\nconst translator = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZNullableNumber', inheritAttrs: false })\n\nconst _attrs = useAttrs()\n\nconst _props = defineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'decimal' | 'numeric'>,\n required: false,\n default: 'decimal',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Required (that is, we need a non-null number, non-empty string) */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Minimum value (inclusive) */\n minimum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** Maximum value (inclusive) */\n maximum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<number>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _number = defineModel({\n type: [ Number, null ] as PropType<number | null>,\n required: false,\n default: null,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** If the field has validation errors or not */\n isEditable: computed(() => _ztext.value?.isEditable || false),\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** Shallow ref to be replaced when the numeric rules change */\nconst _rules = computed<ZValidator<string>[]>(() => {\n const rules: ZValidator<number>[] = [\n // \"isNaN\" or \"Infinity\" are not valid numbers\n (value: number) => ! isNaN(value),\n (value: number) => Number.isFinite(value),\n ]\n\n // Minimum and maximum values\n if (_props.minimum !== undefined) rules.push(validators.minimum(_props.minimum))\n if (_props.maximum !== undefined) rules.push(validators.maximum(_props.maximum))\n\n // All other rules\n rules.push(..._props.rules)\n\n // A single text validation rule, ignoring its input and validating the number\n // value; since \"_rules\" is a shallow ref, this will trigger `ztext`, too!\n return [ (string: string) => {\n const number = _parseNumber(string)\n\n // We use the _attr_ \"validateNull\" set to \"true\" to force validation\n // of nulls as zero from \"j-number\" here! Not a prop, as we don't want\n // to expose externally, though!\n if (number === null && (! _attrs.validateNull)) return true\n\n for (const rule of rules) {\n const result = rule(number || 0)\n if (typeof result === 'string') return result\n if (result === false) return false\n }\n return true\n } ]\n})\n\n/* ===== NUMBER HANDLING ==================================================== */\n\n/** Thousands separator (`,` comma in english, `.` dot in german) */\nconst tsep = computed(() => (1234).toLocaleString(translator.locale)[1]!)\n/** Decimals separator (`.` dot in english, `,` comma in german) */\nconst dsep = computed(() => (1.23).toLocaleString(translator.locale)[1]!)\n/** The updated model value, as a string, from the parent component */\nconst _string = ref<string>(_formatNumber(_number.value))\n\n/** \"onBeforeInput\" prevents anything but numbers to be typed in our field */\nfunction _onBeforeinput(event: InputEvent): void {\n const element = event.target as HTMLInputElement\n\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n\n // the \"insertText\" event is when we _type_ something\n if (\n // have we typed only digits???\n (event.data?.match(/^\\d+$/)) ||\n // have we typed the only decimal separator???\n ((event.data === dsep.value) && (element.value.indexOf(dsep.value) < 0)) ||\n // have we typed a negation sign (at the beginning of the input)???\n ((event.data === '-') && (element.value[0] !== '-') && (element.selectionStart === 0))\n ) return // then let this event through!\n\n // if this event is a simple \".\" we consider it to be a decimal separator\n // as on iOS the default \"decimal\" keboard uses it as a delimiter\n if ((event.data === '.' ) && (element.value.indexOf(dsep.value) < 0)) {\n const string = element.value\n const pos = element.selectionStart == null ? string.length : element.selectionStart\n const end = element.selectionEnd == null ? pos : element.selectionEnd\n element.value = string.slice(0, pos) + dsep.value + string.slice(end)\n element.selectionStart = element.selectionEnd = pos + 1\n _string.value = element.value\n }\n\n // if we typed anything else, then prevent...\n return event.preventDefault()\n}\n\n/** Format a number, either for editing or viewing */\nfunction _formatNumber(number: number | null): string {\n // Nulls result in an empty string\n if (number === null) return ''\n\n // Use thousans separators when only when *NOT* editing\n return number.toLocaleString(translator.locale, {\n maximumFractionDigits: 20,\n useGrouping: ! _ztext.value?.hasFocus,\n })\n}\n\n/* Parse a number from an internationalized string */\nfunction _parseNumber(string: string): number | null {\n // Normalize our input into a JavaScript value (de: 1.234,5 becomes 1234.5)\n string = string\n .replaceAll(tsep.value, '')\n .replaceAll(dsep.value, '.')\n .replaceAll(/[^-.\\d]/g, '')\n\n // Parse the string as a float number (a single '-' is considered null) and\n // '-0' drops its sign and is considered a zero (IEE-754 has negative zero)\n return string === '' ? null : string === '-' ? null : (parseFloat(string) || 0)\n}\n\n/* When focus or language change, reformat the number */\nwatch([ () => _ztext.value?.hasFocus, () => translator.locale ], () => {\n _string.value = _formatNumber(_number.value)\n})\n\n/* Update the `modelValue` in the child text component */\nwatch(_number, (number) => {\n // When the number change, reformat *if* the numeric value changes\n if (number === _parseNumber(_string.value)) return\n _string.value = _formatNumber(number)\n})\n\n\n/* Update the `modelValue` in the parent component */\nwatch(_string, (string): void => {\n // Update our parent with the new number if we have to\n const number = _parseNumber(string)\n if (_number.value !== number) _number.value = number\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-nullable-number\n ref=\"_znumber\"\n v-bind=\"{ ...$attrs, required: false, validateNull: true }\"\n\n :model-value=\"_znumber?.isEditable ? (_number || null) : _number\"\n :mode=\"mode\"\n\n :label=\"label\"\n :placeholder=\"`0${suffix}`\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :suffix=\"suffix\"\n\n :rules=\"rules\"\n :lazy-rules=\"lazyRules\"\n :minimum=\"minimum\"\n :maximum=\"maximum\"\n\n @update:model-value=\"_number = $event || 0\"\n >\n <template v-if=\"_slots.append\" #append=\"formProps\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </z-nullable-number>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref } from 'vue'\n\nimport { componentFormProps } from '../utils/form'\nimport ZNullableNumber from './nullable-number.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZValidator } from '../composition/validators'\nimport type { ZFormProps } from '../utils/form'\n\n/** Ref to our `ZNullableNumber` */\nconst _znumber = ref<InstanceType<typeof ZNullableNumber>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZNumber', inheritAttrs: false })\n\ndefineProps({\n\n /* ===== INPUT TYPE ======================================================= */\n\n /** The virtual keyboard to use on mobile devices*/\n mode: {\n type: String as PropType<'decimal' | 'numeric'>,\n required: false,\n default: 'decimal',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n /** The suffix to add to the input */\n suffix: {\n type: String as PropType<string>,\n required: false,\n default: '',\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Minimum value (inclusive) */\n minimum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** Maximum value (inclusive) */\n maximum: {\n type: Number as PropType<number | undefined>,\n required: false,\n default: undefined,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<number>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _number = defineModel({\n type: Number as PropType<number>,\n required: false,\n default: 0,\n})\n\n/* Slots */\nconst _slots = defineSlots<{\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _znumber.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _znumber.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _znumber.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _znumber.value?.hasError || false),\n})\n\n/* ===== SETUJP ============================================================= */\n\n/* Ensure the ZNullableNumber ref is set */\nonMounted(() => {\n if (! _znumber.value) throw new Error('No ZNullableNumber ref')\n /* As we use a placehoder with NULL for zero, once mounted and reactivity\n * settles down, we want to reset our validation */\n nextTick(() => _znumber.value?.resetValidation())\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_value\"\n\n raw\n mode=\"text\"\n :type=\"_visible ? 'text' : 'password'\"\n\n :label=\"_label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"undefined\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n\n @clear=\"_value = ''\"\n >\n <template #append>\n <q-icon\n :name=\"icons.visibility[_visible ? 'off' : 'on']\"\n class=\"z-icon z-icon-clickable\"\n @click=\"_visible = ! _visible\"\n />\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { QIcon } from 'quasar'\nimport { computed, onMounted, ref } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { useValidators } from '../composition/validators'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZValidator } from '../composition/validators'\n\nconst validators = useValidators()\nconst { t } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZString', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The minimum length of this field (starting at 1, for 0 use \"required\") */\n minLength: {\n type: Number,\n required: false,\n default: 0,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/** The value of the input */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/** Validation rules */\nconst _rules = computed(() => {\n const rules: ZValidator<string>[] = []\n if (_props.minLength > 0) rules.push(validators.minLength(_props.minLength))\n rules.push(..._props.rules)\n return rules\n})\n\n/** Label */\nconst _label = computed(() => _props.label || t({ en: 'Password', de: 'Passwort' }))\n\n/** Password visibility */\nconst _visible = ref(false)\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n non-interactive\n\n :model-value=\"value\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n :link=\"link\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :required=\"required\"\n :on-clear=\"onClear\"\n @click=\"_zdialog?.show()\"\n @click-icon=\"_zdialog?.show()\"\n >\n <template #append=\"formProps\">\n <!-- Dialog for picking -->\n <z-dialog\n ref=\"_zdialog\"\n v-model=\"_showing\"\n wide\n :title=\"label\"\n @ok=\"onOk\"\n @show=\"onShow\"\n @hide=\"onHide\"\n >\n <q-card-section>\n <slot name=\"default\" v-bind=\"formProps\" />\n </q-card-section>\n </z-dialog>\n\n <template v-if=\"_slots.append\">\n <slot name=\"append\" v-bind=\"formProps\" />\n </template>\n </template>\n </z-text>\n</template>\n\n<script setup lang=\"ts\">\nimport { QCardSection } from 'quasar'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport ZDialog from '../dialogs/dialog.vue'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZFormProps } from '../utils/form'\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n/** Ref to our `QPopupProxy` */\nconst _zdialog = ref<InstanceType<typeof ZDialog>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZDate', inheritAttrs: false })\n\nconst _props = defineProps({\n\n /* The string value to display in the input field */\n value: {\n type: String,\n required: false,\n default: '',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: true,\n },\n /** An optional link that will make the icon navigable */\n link: {\n type: [ Object, String ] as PropType<RouteLocationRaw | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== UTILITY PROPS ==================================================== */\n\n loading: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Used as `@clear=\"...\"` in a template, to clear the text (and related) */\n onClear: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n\n ...componentFormProps,\n})\n\n/** The showing state of the dialog */\nconst _showing = defineModel({\n type: Boolean,\n required: false,\n default: false,\n})\n\nconst _slots = defineSlots<{\n default?: (formProps: Readonly<ZFormProps>) => VNode[],\n append?: (formProps: Readonly<ZFormProps>) => VNode[]\n}>()\n\nconst emit = defineEmits<{\n (event: 'ok', value?: any): void\n (event: 'show'): void\n (event: 'hide'): void\n}>()\n\nfunction onOk(value: any): void {\n emit('ok', value)\n}\n\nfunction onShow(): void {\n emit('show')\n}\n\nfunction onHide(): void {\n emit('hide')\n _ztext.value?.validate()\n}\n\nwatch(() => _props.value, () => {\n nextTick(() => _ztext.value?.validate())\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n /** Show the picker dialog */\n show: () => _zdialog.value?.show(),\n /** Hide the picker dialog, confirming it with a value */\n confirm: (value?: any) => _zdialog.value?.confirm(value),\n /** Hide the picker dialog, cancelling it without a value */\n cancel: () => _zdialog.value?.cancel(),\n /** Hide the picker dialog */\n shake: () => _zdialog.value?.shake(),\n})\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the ZText ref is set */\nonMounted(() => {\n if (! _ztext.value) throw new Error('No ZText ref')\n if (! _zdialog.value) throw new Error('No QDialog ref')\n})\n</script>\n","<template>\n <q-chip\n dense\n class=\"q-mx-none q-px-sm text-weight-medium text-uppercase\"\n :style=\"removable ? 'padding-right: 5px;' : undefined\"\n :color=\"color\"\n :text-color=\"textColor\"\n :size=\"size\"\n :removable=\"removable\"\n @remove=\"removable && onRemove()\"\n >\n {{ tag }}\n </q-chip>\n</template>\n\n<script setup lang=\"ts\">\nimport { QChip } from 'quasar'\n\nimport type { PropType } from 'vue'\n\ndefineOptions({ name: 'ZTag' })\n\ndefineProps({\n tag: {\n type: String,\n required: true,\n },\n size: {\n type: String,\n required: false,\n default: 'sm',\n },\n color: {\n type: String,\n required: false,\n default: 'primary',\n },\n textColor: {\n type: String,\n required: false,\n default: 'white',\n },\n removable: {\n type: Boolean,\n required: false,\n default: false,\n },\n onRemove: {\n type: Function as PropType<() => void>,\n required: false,\n default: () => {},\n },\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.q-chip {\n cursor: default;\n user-select: none;\n}\n\n:deep(.q-chip__icon--remove) {\n margin-left: 4px;\n}\n</style>\n","<template>\n <div class=\"z-input\">\n <z-form-helper\n v-slot=\"scope\"\n :bottom-slots=\"bottomSlots\"\n :disabled=\"disabled\"\n :editable=\"editable\"\n :lazy-rules=\"lazyRules\"\n :readonly=\"readonly\"\n >\n <q-select\n ref=\"_qselect\"\n v-model=\"_value\"\n\n dense\n outlined\n stack-label\n use-input\n use-chips\n multiple\n hide-dropdown-icon\n\n :class=\"\n scope.disabled ? 'z-state-disabled' :\n scope.editable ? 'z-state-editable' :\n 'z-state-inactive'\"\n\n :label=\"label\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"scope.bottomSlots\"\n :disable=\"scope.disabled\"\n :readonly=\"! scope.editable\"\n\n :options=\"_options\"\n :editable=\"true\"\n :input-debounce=\"0\"\n :new-value-mode=\"noNewValues ? undefined : 'add-unique'\"\n :behavior=\"'menu'\"\n\n @add=\"_add\"\n @filter=\"_filter\"\n @keydown=\"_onKeydown\"\n >\n <template #append>\n <q-icon :name=\"icon\" class=\"z-icon\" />\n </template>\n\n <template #selected-item=\"data: Parameters<QSelectSlots['selected-item']>[0]\">\n <z-tag\n :tag=\"data.opt\"\n :removable=\"scope.editable && (! scope.disabled)\"\n class=\"q-mr-xs\"\n @remove=\"data.removeAtIndex(data.index)\"\n />\n </template>\n\n <template #option=\"option: Parameters<QSelectSlots['option']>[0]\">\n <q-item v-bind=\"option.itemProps\" dense>\n <q-item-section>\n {{ option.label }}\n </q-item-section>\n </q-item>\n </template>\n </q-select>\n </z-form-helper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemSection, QSelect } from 'quasar'\nimport { onMounted, ref, shallowRef, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport ZFormHelper from '../forms/form-helper.vue'\nimport ZTag from '../tag.vue'\nimport { componentFormProps } from '../utils/form'\n\nimport type { QSelectSlots } from 'quasar'\nimport type { PropType } from 'vue'\n\n/** Ref to our `QSelect` */\nconst _qselect = ref<QSelect>()\n\n/* ===== NAME, PROPS, MODEL, ... ============================================ */\n\ndefineOptions({ name: 'ZTags' })\n\nconst _props = defineProps({\n\n /* ===== TAGS ============================================================= */\n\n /** The array of all known tags */\n tags: {\n type: Array as PropType<string[]>,\n required: false,\n default: () => [],\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: false,\n default: 'Tags',\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string>,\n required: false,\n default: icons.tag,\n },\n /** We don‘t accept new values, but only the existing ones (passed as tags) */\n noNewValues: {\n type: Boolean,\n required: false,\n default: false,\n },\n ...componentFormProps,\n})\n\nconst _value = defineModel({\n type: Array as PropType<string[]>,\n required: false,\n default: () => [],\n})\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _qselect.value?.focus(),\n})\n\n/* ===== STATE ============================================================== */\n\n/** List of currently filtered tags */\nconst _options = shallowRef<readonly string[]>([])\n\n/** All available tags, sorted alphabetically, lower cased */\nconst _tags = ref<string[]>([])\nwatch(() => _props.tags, (tags) => {\n _tags.value = tags.map((tag) => tag.toLowerCase()).sort()\n}, { immediate: true })\n\n/* ===== FUNCTIONS ========================================================== */\n\n/**\n * Traps \"Escape\" to hide the popup (first) and clear the value (second) or\n * \"Tab\" to autocomplete.\n *\n * Quasar tracks \"Escape\" (and resets the input value) on \"keyup\"... This\n * happens only when the popup is shown (see below) so we intercept on key\n * down, and manually close the popup / wipe the input as needed.\n * https://github.com/quasarframework/quasar/blob/7182607ecac54c406c3cce595245d1bb1160024a/ui/src/components/select/QSelect.js#L639-L644\n */\nfunction _onKeydown(event: KeyboardEvent): void {\n if (! _qselect.value) return // should never happen\n\n // no modifiers\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return\n\n // Handle \"Tab\" key (autocomplete)\n if (event.code === 'Tab') {\n if (! _options.value[0]) return // nothing to do\n const option = _options.value[0]\n\n if (_qselect.value.isOptionSelected(option)) return // already selected\n\n // select the first option on \"Tab\" and stop/prevent default on the event\n // as we want the user to potentially select multiple tags...\n _qselect.value.toggleOption(_options.value[0], false)\n event.preventDefault()\n event.stopPropagation()\n return\n }\n\n // Handle \"Escape\" key (close popup / clear value)\n if (event.code === 'Escape') {\n // if we have options, clear them and hide the popup\n if (_options.value.length > 0) {\n _options.value = []\n // if we have no options, clear the input\n } else {\n _qselect.value.updateInputValue('', true)\n }\n // regardless...\n _qselect.value.hidePopup()\n event.preventDefault()\n event.stopPropagation()\n }\n}\n\n/** Filters the tags according tu the current input */\nfunction _filter(\n text: string,\n update: (filter: () => void, after?: (ref: QSelect) => void) => void,\n _abort: () => void,\n): void {\n update(() => {\n // ran when the input changes: we filter all tags that match the input\n if (text.length < 1) return _options.value = Object.freeze([])\n\n const needle = text.toLowerCase() // _tags array is lower cased\n const options = _tags.value\n .filter((val) => val.indexOf(needle) >= 0) // anything matching text\n .filter((val) => _value.value.indexOf(val) < 0) // not already tagged\n _options.value = Object.freeze(options)\n }, (select) => {\n // ran when quasar updates the options: we focus on the first one\n if (text && select.options?.length) {\n select.setOptionIndex(-1) // i still don't understand precisely how it works\n select.moveOptionSelection(1, false) // but this focuses on the first option\n }\n })\n}\n\n/** When a new tag is added, we clear the input for the next tag */\nfunction _add(_: { index: number, value: string }): void {\n _qselect.value?.updateInputValue('')\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Ensure the QSelect ref is set */\nonMounted(() => {\n if (! _qselect.value) throw new Error('No QSelect ref')\n})\n</script>\n","import { ISO_COUNTRIES } from '@juit/vue-i18n'\n\nimport type { ISOCountry } from '@juit/vue-i18n'\n\n// Data from https://en.wikipedia.org/wiki/List_of_telephone_country_codes\n\n/** All known ITU prefixes keyed by ISO country */\nexport const ituPrefixesByCountry = {\n AD: [ '376' ],\n AE: [ '971' ],\n AF: [ '93' ],\n AG: [ '1268' ],\n AI: [ '1264' ],\n AL: [ '355' ],\n AM: [ '374' ],\n AO: [ '244' ],\n AQ: [ '672' ],\n AR: [ '54' ],\n AS: [ '1684' ],\n AT: [ '43' ],\n AU: [ '61' ],\n AW: [ '297' ],\n AX: [ '358' ],\n AZ: [ '994' ],\n BA: [ '387' ],\n BB: [ '1246' ],\n BD: [ '880' ],\n BE: [ '32' ],\n BF: [ '226' ],\n BG: [ '359' ],\n BH: [ '973' ],\n BI: [ '257' ],\n BJ: [ '229' ],\n BL: [ '590' ],\n BM: [ '1441' ],\n BN: [ '673' ],\n BO: [ '591' ],\n BQ: [ '599' ],\n BR: [ '55' ],\n BS: [ '1242' ],\n BT: [ '975' ],\n BV: [ '47' ],\n BW: [ '267' ],\n BY: [ '375' ],\n BZ: [ '501' ],\n CA: [ '1' ],\n CC: [ '61' ],\n CD: [ '243' ],\n CF: [ '236' ],\n CG: [ '242' ],\n CH: [ '41' ],\n CI: [ '225' ],\n CK: [ '682' ],\n CL: [ '56' ],\n CM: [ '237' ],\n CN: [ '86' ],\n CO: [ '57' ],\n CR: [ '506' ],\n CU: [ '53' ],\n CV: [ '238' ],\n CW: [ '599' ],\n CX: [ '61' ],\n CY: [ '357' ],\n CZ: [ '420' ],\n DE: [ '49' ],\n DJ: [ '253' ],\n DK: [ '45' ],\n DM: [ '1767' ],\n DO: [ '1809', '1829', '1849' ],\n DZ: [ '213' ],\n EC: [ '593' ],\n EE: [ '372' ],\n EG: [ '20' ],\n EH: [ '212' ],\n ER: [ '291' ],\n ES: [ '34' ],\n ET: [ '251' ],\n FI: [ '358' ],\n FJ: [ '679' ],\n FK: [ '500' ],\n FM: [ '691' ],\n FO: [ '298' ],\n FR: [ '33' ],\n GA: [ '241' ],\n GB: [ '44' ],\n GD: [ '1473' ],\n GE: [ '995' ],\n GF: [ '594' ],\n GG: [ '44' ],\n GH: [ '233' ],\n GI: [ '350' ],\n GL: [ '299' ],\n GM: [ '220' ],\n GN: [ '224' ],\n GP: [ '590' ],\n GQ: [ '240' ],\n GR: [ '30' ],\n GS: [ '500' ],\n GT: [ '502' ],\n GU: [ '1671' ],\n GW: [ '245' ],\n GY: [ '592' ],\n HK: [ '852' ],\n HM: [ '672' ],\n HN: [ '504' ],\n HR: [ '385' ],\n HT: [ '509' ],\n HU: [ '36' ],\n ID: [ '62' ],\n IE: [ '353' ],\n IL: [ '972' ],\n IM: [ '44' ],\n IN: [ '91' ],\n IO: [ '246' ],\n IQ: [ '964' ],\n IR: [ '98' ],\n IS: [ '354' ],\n IT: [ '39' ],\n JE: [ '44' ],\n JM: [ '1658', '1876' ],\n JO: [ '962' ],\n JP: [ '81' ],\n KE: [ '254' ],\n KG: [ '996' ],\n KH: [ '855' ],\n KI: [ '686' ],\n KM: [ '269' ],\n KN: [ '1869' ],\n KP: [ '850' ],\n KR: [ '82' ],\n KW: [ '965' ],\n KY: [ '1345' ],\n KZ: [ '70', '76', '77' ],\n LA: [ '856' ],\n LB: [ '961' ],\n LC: [ '1758' ],\n LI: [ '423' ],\n LK: [ '94' ],\n LR: [ '231' ],\n LS: [ '266' ],\n LT: [ '370' ],\n LU: [ '352' ],\n LV: [ '371' ],\n LY: [ '218' ],\n MA: [ '212' ],\n MC: [ '377' ],\n MD: [ '373' ],\n ME: [ '382' ],\n MF: [ '590' ],\n MG: [ '261' ],\n MH: [ '692' ],\n MK: [ '389' ],\n ML: [ '223' ],\n MM: [ '95' ],\n MN: [ '976' ],\n MO: [ '853' ],\n MP: [ '1670' ],\n MQ: [ '596' ],\n MR: [ '222' ],\n MS: [ '1664' ],\n MT: [ '356' ],\n MU: [ '230' ],\n MV: [ '960' ],\n MW: [ '265' ],\n MX: [ '52' ],\n MY: [ '60' ],\n MZ: [ '258' ],\n NA: [ '264' ],\n NC: [ '687' ],\n NE: [ '227' ],\n NF: [ '672' ],\n NG: [ '234' ],\n NI: [ '505' ],\n NL: [ '31' ],\n NO: [ '47' ],\n NP: [ '977' ],\n NR: [ '674' ],\n NU: [ '683' ],\n NZ: [ '64' ],\n OM: [ '968' ],\n PA: [ '507' ],\n PE: [ '51' ],\n PF: [ '689' ],\n PG: [ '675' ],\n PH: [ '63' ],\n PK: [ '92' ],\n PL: [ '48' ],\n PM: [ '508' ],\n PN: [ '64' ],\n PR: [ '1787', '1939' ],\n PS: [ '970', '972' ],\n PT: [ '351' ],\n PW: [ '680' ],\n PY: [ '595' ],\n QA: [ '974' ],\n RE: [ '262' ],\n RO: [ '40' ],\n RS: [ '381' ],\n RU: [ '7', '71', '72', '73', '74', '75', '78', '79' ],\n RW: [ '250' ],\n SA: [ '966' ],\n SB: [ '677' ],\n SC: [ '248' ],\n SD: [ '249' ],\n SE: [ '46' ],\n SG: [ '65' ],\n SH: [ '247', '290' ],\n SI: [ '386' ],\n SJ: [ '47' ],\n SK: [ '421' ],\n SL: [ '232' ],\n SM: [ '378' ],\n SN: [ '221' ],\n SO: [ '252' ],\n SR: [ '597' ],\n SS: [ '211' ],\n ST: [ '239' ],\n SV: [ '503' ],\n SX: [ '1721' ],\n SY: [ '963' ],\n SZ: [ '268' ],\n TC: [ '1649' ],\n TD: [ '235' ],\n TF: [ '262' ],\n TG: [ '228' ],\n TH: [ '66' ],\n TJ: [ '992' ],\n TK: [ '690' ],\n TL: [ '670' ],\n TM: [ '993' ],\n TN: [ '216' ],\n TO: [ '676' ],\n TR: [ '90' ],\n TT: [ '1868' ],\n TV: [ '688' ],\n TW: [ '886' ],\n TZ: [ '255' ],\n UA: [ '380' ],\n UG: [ '256' ],\n UM: [ '1' ],\n US: [ '1' ],\n UY: [ '598' ],\n UZ: [ '998' ],\n VA: [ '39', '379' ],\n VC: [ '1784' ],\n VE: [ '58' ],\n VG: [ '1284' ],\n VI: [ '1340' ],\n VN: [ '84' ],\n VU: [ '678' ],\n WF: [ '681' ],\n WS: [ '685' ],\n XK: [ '383' ],\n YE: [ '967' ],\n YT: [ '262' ],\n ZA: [ '27' ],\n ZM: [ '260' ],\n ZW: [ '263' ],\n} as const satisfies Record<ISOCountry, `${number}`[]>\n\n/** Known ISO countries keyed by ITU prefixe. */\nexport const countriesByITUPrefix: Record<ITUPrefix, [ ISOCountry, ...ISOCountry[] ]> =\n Object.entries(ituPrefixesByCountry).reduce((map, [ key, prefixes ]) => {\n // Check that we have a proper ISO country\n const country = ISO_COUNTRIES.find((country) => country === key)\n if (! country) return map\n\n // Add the prefixes to the map\n prefixes.forEach((prefix) => {\n if (! map[prefix]) map[prefix] = [ country ]\n else map[prefix].push(country)\n })\n\n // Ok, all mapped and normalized\n return map\n }, {} as typeof countriesByITUPrefix)\n\n/** All known ITU international prefixes */\nexport type ITUPrefix = typeof ituPrefixesByCountry[ISOCountry][number]\n","<template>\n <z-text\n ref=\"_ztext\"\n v-bind=\"$attrs\"\n v-model=\"_input\"\n type=\"text\"\n mode=\"tel\"\n\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :icon=\"icon\"\n\n :bottom-slots=\"bottomSlots\"\n :editable=\"editable\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n\n :rules=\"_rules\"\n :lazy-rules=\"lazyRules\"\n :prefix=\"_flag\"\n\n @beforeinput=\"_onBeforeinput\"\n @clear=\"() => _value = ''\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ISO_COUNTRIES, useTranslator } from '@juit/vue-i18n'\nimport { computed, nextTick, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\n\nimport { countriesByITUPrefix, ituPrefixesByCountry } from '../assets/prefixes'\nimport { componentFormProps } from '../utils/form'\nimport ZText from './text.vue'\n\nimport type { ISOCountry } from '@juit/vue-i18n'\nimport type { PropType } from 'vue'\nimport type { ITUPrefix } from '../assets/prefixes'\nimport type { ZValidator } from '../composition/validators'\n\n/** Describes a vaild, checked ITU phone prefix */\ninterface PhonePrefix {\n /** The current country (if properly validated) as an ISO code */\n country: ISOCountry\n /** The countries associated with the current prefix */\n countries: [ ISOCountry, ...ISOCountry[]]\n /** The current country prefix (if properly validated) as an ITU code */\n prefix: ITUPrefix\n}\n\n/** Describe a phone number, parsed in parts */\ninterface PhoneParts {\n /** The current country (if properly validated) as an ISO code */\n country: ISOCountry | ''\n /** The countries associated with the current prefix */\n countries: ISOCountry[]\n /** The current country prefix (if properly validated) as an ITU code */\n prefix: ITUPrefix | ''\n /** The regional number (that is digits without the country prefix) */\n number: string\n /** The normalized number as `+{prefix}{number}` even if invalud */\n normalized: string\n /** A flag indicating if this is a valid number */\n valid: boolean,\n}\n\nconst { t, utils } = useTranslator()\n\n/** Ref to our `ZText` */\nconst _ztext = ref<InstanceType<typeof ZText>>()\n\n/* ===== NAME, PROPS, MODEL, EMITS, ... ===================================== */\n\ndefineOptions({ name: 'ZTelephone', inheritAttrs: false })\n\nconst _props = defineProps({\n /** The country the telephone number belongs to */\n country: {\n type: String as PropType<string>,\n required: false,\n default: 'DE',\n },\n\n /* ===== FRILLS =========================================================== */\n\n /** The label for this input text */\n label: {\n type: String,\n required: true,\n },\n /** The placeholder text when no input was entered */\n placeholder: {\n type: String,\n required: false,\n default: '',\n },\n /** The hint to display below the input field */\n hint: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n /** The icon to display within the control */\n icon: {\n type: String as PropType<string | undefined>,\n required: false,\n default: undefined,\n },\n\n /* ===== VALIDATION ======================================================= */\n\n /** Indicates that the field is required (and errors when empty). */\n required: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The validation rules to apply to this field */\n rules: {\n type: Array as PropType<ZValidator<string>[]>,\n required: false,\n default: () => [],\n },\n\n ...componentFormProps,\n})\n\n/* ===== MODEL ============================================================== */\n\n/** The value of the input, the full number *with* the prefix */\nconst _value = defineModel({\n type: String,\n required: false,\n default: '',\n})\n\n/* ===== UTILITIES ========================================================== */\n\n/* Check that the prefix is valid, returning the country and the prefix */\nfunction _checkPrefix(string: string): PhonePrefix | undefined {\n if (! string) return undefined // no match...\n\n // Maximum length of an ITU prefix is 4 digits\n if (string.length > 4) string = string.slice(0, 4)\n\n // Check if the prefix is in our list of prefixes\n if (string in countriesByITUPrefix) {\n const prefix = string as ITUPrefix\n const countries = countriesByITUPrefix[prefix]\n // if the prefix has our default \"prop\" country, we return that, otherwise the first\n const country = countries.find((country) => country === _isoCountry.value)\n return { country: country || countries[0], countries, prefix }\n }\n\n // Recursively proceed with a shorter prefix\n return _checkPrefix(string.slice(0, -1))\n}\n\n/* Check that the number is valid, returning country, prefix and normalized number */\nfunction _checkNumber(value: string = ''): PhoneParts {\n // Normalize the number, keeping only digits\n value = value.replace(/[^\\d]/g, '')\n\n // Check if we have a valid prefix\n const phonePrefix = _checkPrefix(value)\n\n // Return the parts: a \"valid\" number has a regional part of at least\n // six digits (this is an arbirary value, but works for most countries)\n return phonePrefix ? {\n countries: phonePrefix.countries,\n country: phonePrefix.country,\n prefix: phonePrefix.prefix,\n number: value.slice(phonePrefix.prefix.length),\n normalized: `+${value}`,\n valid: value.length >= phonePrefix.prefix.length + 6,\n } : {\n countries: [],\n country: '',\n prefix: '',\n number: value,\n normalized: value ? `+${value}` : '',\n valid: false,\n }\n}\n\n/** Format the \"parts\" separating any valid prefix from the number */\nfunction _formatParts(parts: PhoneParts): string {\n return (parts.prefix && parts.number) ? `+${parts.prefix} ${parts.number}` :\n parts.prefix ? `+${parts.prefix}` :\n parts.number ? `+${parts.number}` :\n ''\n}\n\n/* ===== STATE ============================================================== */\n\n/** Computed property ensuring that the country is a valid ISO country */\nconst _isoCountry = computed<ISOCountry>(() => {\n const country = ISO_COUNTRIES.find((country) => country === _props.country)\n return country || 'DE' // our default country is Germany\n})\n\n/** The flag, computed by the current country (validated) */\nconst _flag = computed(() => {\n if (_parts.value.country) return utils.flag(_parts.value.country)\n return '\\u{1F3F4}\\u200D\\u2620\\uFE0F' // Arrr! That be a bust!\n})\n\n/** The parsed phone number parts, initially from the input value */\nconst _parts = shallowRef<PhoneParts>(_checkNumber(_value.value))\n/** The input value, as displayed in our text box */\nconst _input = ref<string>(_formatParts(_parts.value))\n\n/* ===== WATCHERS =========================================================== */\n\n/* When the country prop changes, we update the number if empty */\nwatch(_isoCountry, (country) => {\n // If this is a simple change of country on the same prefix, update the\n // country in-place and manually trigger the ref to update the flag\n if (_parts.value.countries.includes(country)) {\n _parts.value.country = country\n triggerRef(_parts)\n return\n }\n\n // If we already have a number, then we don't change the country\n if (_parts.value.number) return\n\n // Get the prefix, and update the parts\n const prefix = ituPrefixesByCountry[_isoCountry.value][0]\n _parts.value = _checkNumber(prefix)\n _input.value = _formatParts(_parts.value)\n}, { immediate: true })\n\n/* Watch when the model value changes */\nwatch(_value, (value) => {\n const parts = _checkNumber(value)\n if (parts.normalized === _parts.value.normalized) return // no changes\n _input.value = _formatParts(parts)\n _parts.value = parts\n})\n\n/* Watch when the input value changes */\nwatch(_input, (input) => {\n // If the input was fully cleared, we reset to the default country\n if (input.trim() === '') {\n return nextTick(() => {\n const prefix = ituPrefixesByCountry[_isoCountry.value][0]\n _parts.value = _checkNumber(prefix)\n _input.value = _formatParts(_parts.value)\n })\n }\n\n // If we have _some_ input, and that's is not a valid phone number \"+digits\"\n // we re-format it in the next tick (so that quasar has time to update the\n // input). We'll get called back again with the new \"clean\" value...\n if (input) {\n const clean = '+' + input\n .replace(/[^\\d\\s]/g, ' ') // wipe all non-space non-digit\n .replace(/\\s+/g, ' ') // normalize all spaces to ONE space\n .trim() // remove leading and trailing spaces\n\n // Call us back again with the cleaned input in the next tick...\n if (input !== clean) return nextTick(() => _input.value = clean)\n }\n\n const parts = _checkNumber(input)\n if (parts.normalized === _parts.value.normalized) return // no changes\n _value.value = parts.normalized\n _parts.value = parts\n})\n\n/* ===== VALIDATION ========================================================= */\n\n/** Validation rules */\nconst _rules: ZValidator<string>[] = [ () => {\n // As we're mangling the text, we need to validate against the current\n // state (henceforth, the current \"value\", not the input)\n const value = _value.value\n\n // Check if required....\n if (_props.required && (!value)) {\n return t({\n en: 'This field is required',\n de: 'Dieses Feld ist erforderlich',\n })\n\n // When not required, the empty value is a good value\n } else if (! value) {\n return true\n }\n\n // Check the parts and the validity of our number\n if (! _checkNumber(value).valid) {\n return t({\n en: 'Invalid phone number',\n de: 'Ungültige Telefonnummer',\n })\n }\n\n // Run all other configured validators\n for (const validator of (_props.rules || [])) {\n const result = validator(value)\n if (result !== true) return result\n }\n\n // All is good\n return true\n} ]\n\n/* ===== AUTOFILL =========================================================== */\n\nfunction _onBeforeinput(event: InputEvent): void {\n // paste, autofill, .... leave it up to the validation\n if (event.inputType !== 'insertText') return\n // the \"insertText\" event is when we _type_ something, only numbers plus and space\n if (event.data?.match(/^[0-9+ ]$/)) return\n // something else but text\n event.preventDefault()\n}\n\n/* ===== SETUP ============================================================== */\n\n/* Exposed stuff */\ndefineExpose({\n /** Focus on this control */\n focus: () => _ztext.value?.focus(),\n /** Reset validation for this field */\n resetValidation: () => _ztext.value?.resetValidation(),\n /** Force validation of this field */\n validate: () => _ztext.value?.validate() || false,\n /** If the field has validation errors or not */\n hasError: computed(() => _ztext.value?.hasError || false),\n})\n\nonMounted(() => {\n /* Ensure the ZText ref is set */\n if (! _ztext.value) throw new Error('No ZText ref')\n})\n</script>\n","<template>\n <div class=\"row reverse q-col-gutter-sm justify-between q-py-lg\">\n <!-- ===== MAIN CONTENT COLUMN ========================================= -->\n\n <div v-if=\"slots['default']\" class=\"col-grow text-right self-center\">\n <slot name=\"default\" />\n </div>\n\n <!-- ===== TITLE (label) and SUBTITLE (caption) ======================== -->\n\n <div class=\"col-grow self-center text-left\">\n <div class=\"text-h4 heading\">\n <span v-if=\"label\">{{ label }}</span>\n <slot v-else-if=\"slots.label\" name=\"label\" />\n <span v-else>{{ '\\u2026' }}</span>\n </div>\n <div v-if=\"caption || slots.caption\" class=\"heading\">\n <span v-if=\"caption\">{{ caption }}</span>\n <slot v-else-if=\"slots.caption\" name=\"caption\" />\n </div>\n <div v-if=\"slots.info\" class=\"q-mt-md\">\n <slot name=\"info\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, warn } from 'vue'\n\nimport type { VNode } from 'vue'\n\ndefineOptions({ name: 'ZObjectHeader' })\n\nconst props = defineProps({\n label: {\n type: String,\n required: false,\n default: '',\n },\n caption: {\n type: String,\n required: false,\n default: '',\n },\n})\n\nconst slots = defineSlots<{\n default(): VNode[],\n caption?: () => VNode[],\n label?: () => VNode[],\n info?: () => VNode[],\n}>()\n\nonMounted(() => {\n if (props.label || slots.label) return\n warn('The \"label\" prop or slot must be specified')\n})\n</script>\n\n<style scoped lang=\"postcss\">\n.heading {\n text-transform: uppercase;\n font-weight: 600;\n}\n</style>\n","<template>\n <div>\n <j-page-header :label=\"label\" :caption=\"caption\">\n <template v-if=\"_slots.label\" #label>\n <slot name=\"label\" />\n </template>\n <template v-if=\"_slots.caption\" #caption>\n <slot name=\"caption\" />\n </template>\n\n <z-btn-group>\n <!-- Cancel -->\n <z-btn\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.cancel\"\n :label=\"$t(translations.cancel)\"\n @click=\"_cancel\"\n />\n\n <!-- Save -->\n <z-btn\n shrink=\"xs\"\n color=\"positive\"\n :disable=\"disabled || (!_submittable)\"\n :icon=\"icons.confirm\"\n :label=\"$t(translations.save)\"\n @click=\"_submit\"\n />\n </z-btn-group>\n </j-page-header>\n\n <z-form\n ref=\"_form\"\n class=\"row q-col-gutter-md\"\n bottom-slots\n editable\n :disabled=\"disabled\"\n @submit.prevent.stop=\"_submit\"\n >\n <slot name=\"default\" />\n </z-form>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { is } from 'quasar'\nimport { computed, ref, toRaw } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport ZForm from '../forms/form.vue'\nimport JPageHeader from './object-header.vue'\n\nimport type { PropType, VNode } from 'vue'\n\n/* ===== NAME, PROPS, SLOTS & EMITS ========================================= */\n\ndefineOptions({ name: 'JObjectNew' })\n\nconst _props = defineProps({\n /** The object being created */\n value: {\n type: Object as PropType<Record<string, any> | undefined>,\n required: true,\n },\n /** Label for the page title (optional, see also the `label` slot) */\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Caption for the page title (optional, see also the `caption` slot) */\n caption: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Disable all controls */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n})\n\nconst _slots = defineSlots<{\n /** The components of the form for the object being viewed/edited */\n default: () => VNode[]\n /** Label for the page title (optional, see also the `label` prop) */\n label?: () => VNode[],\n /** Caption for the page title (optional, see also the `caption` prop) */\n caption?: () => VNode[],\n}>()\n\nconst _emit = defineEmits<{\n /** Tell the parent component to save the object */\n (emit: 'save'): void\n /** Tell the parent component to cancel */\n (emit: 'cancel'): void\n}>()\n\n/* ===== STATE ============================================================== */\n\n/** Backup of the `modelValue` to check for differences */\nconst _backup = structuredClone(toRaw(_props.value))\n/** Reference to our form for validation */\nconst _form = ref<InstanceType<typeof ZForm> | undefined>()\n\n/** Flag indicating whether the object has been modified or not */\nconst _modified = computed(() => ! is.deepEqual(_props.value, _backup))\n/** Flag indicating whether edits can be submitted back to the server */\nconst _submittable = computed(() => _modified.value && _form.value?.isReady)\n\n/* ===== ACTIONS ============================================================ */\n\n/** Cancel and discard changes */\nfunction _cancel(): void {\n _emit('cancel')\n}\n\n/** Validate, and if valid emit our \"save\" event */\nasync function _submit(): Promise<void> {\n if (! _submittable.value) return\n const valid = await _form.value?.validate()\n if (valid) _emit('save')\n}\n</script>\n","import { useTranslator } from '@juit/vue-i18n'\nimport { useQuasar } from 'quasar'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport JConfirmDialog from '../dialogs/confirm.vue'\nimport JProgressDialog from '../dialogs/progress.vue'\n\n/** Our dialogs */\nexport interface ZDialogs {\n /**\n * Very basic confirm/cancel dialog with a title and a message.\n *\n * @returns - `true` on confirm/ok, `false` on cancel\n */\n confirm(options: {\n title: string,\n message: string,\n confirm?: string,\n confirmIcon?: string,\n confirmColor?: string,\n cancel?: string,\n cancelIcon?: string,\n cancelColor?: string,\n }): Promise<boolean>\n\n /** Confirm whether to discard changes or not */\n confirmDiscard(): Promise<boolean>\n\n /** Confirm whether to delete a record or not */\n confirmDelete(): Promise<boolean>\n\n /** Confirm whether to restore a record or not */\n confirmRestore(): Promise<boolean>\n\n /**\n * Show a progress dialog with a title and a message.\n *\n * When `total` is set, the `progress` prop should be a number between zero\n * and `total - 1`, and progress is shown `progress / total`.\n *\n * When `total` is not set (or zero) the `progress` prop should be a number\n * between zero and 1 and the progress will be shown as a percentage.\n *\n * When the `onCancel` callback (optional) is specified, a cancel button is\n * added to the dialog, and pressing it will invoke the callback. It's up to\n * the caller to handle the cancellation.\n *\n * The returned object has two methods:\n *\n * - `update(progress: number)`: update the `progress` prop\n * - `done()`: close the dialog (must be called, the dialog won't close itself)\n */\n progress(options: {\n title: string,\n message: string,\n progress?: number,\n total?: number,\n onCancel?: () => void,\n }): { update: (progress: number) => void, done: () => void }\n}\n\nexport function useDialogs(): ZDialogs {\n const { t } = useTranslator()\n const { dialog } = useQuasar()\n\n function confirm(options: {\n title: string,\n message: string,\n confirm?: string,\n confirmIcon?: string,\n confirmColor?: string,\n cancel?: string,\n cancelIcon?: string,\n cancelColor?: string,\n }): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const instance = dialog({\n component: JConfirmDialog,\n componentProps: { ...options },\n })\n instance.onOk(() => resolve(true))\n instance.onCancel(() => resolve(false))\n })\n }\n\n function confirmDiscard(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Discard changes?',\n de: 'Änderungen verwerfen?',\n }),\n message: t({\n en: 'Are you sure you want to discard your changes?',\n de: 'Möchten Sie Ihre Änderungen wirklich verwerfen?',\n }),\n confirm: t(translations.discard),\n confirmIcon: icons.delete,\n confirmColor: 'negative',\n\n cancel: t(translations.keep),\n cancelIcon: icons.edit,\n cancelColor: 'primary',\n })\n }\n\n function confirmDelete(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Delete',\n de: 'Löschen',\n }),\n message: t({\n en: 'Are you sure you want to delete this record?',\n de: 'Möchten Sie diesen Datensatz wirklich löschen?',\n }),\n\n confirm: t(translations.delete),\n confirmIcon: icons.delete,\n confirmColor: 'negative',\n\n cancel: t(translations.keep),\n cancelIcon: icons.confirm,\n cancelColor: 'primary',\n })\n }\n\n function confirmRestore(): Promise<boolean> {\n return confirm({\n title: t({\n en: 'Restore',\n de: 'Wiederherstellen',\n }),\n message: t({\n en: 'Are you sure you want to restore this record?',\n de: 'Möchten Sie diesen Datensatz wirklich wiederherstellen?',\n }),\n\n confirm: t(translations.restore),\n confirmIcon: icons.restore,\n confirmColor: 'warning',\n\n cancel: t(translations.ignore),\n cancelIcon: icons.cancel,\n cancelColor: 'primary',\n })\n }\n\n function progress(options: {\n title: string,\n message: string,\n progress?: number,\n total?: number,\n onCancel?: () => void,\n }): { update: (progress: number) => void, done: () => void } {\n const instance = dialog({\n component: JProgressDialog,\n componentProps: {\n title: options.title,\n message: options.message,\n progress: options.progress || 0,\n total: options.total || 0,\n onCancel: options.onCancel,\n },\n })\n\n return {\n update: (progress: number) => instance.update({ progress }),\n done: () => instance.hide(),\n }\n }\n\n return { confirm, confirmDiscard, confirmDelete, confirmRestore, progress }\n}\n","import { shallowRef } from 'vue'\n\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZBaseObject } from '../types'\n\nconst listicle = shallowRef<{\n uuids: string[],\n list: RouteLocationRaw,\n link: (uuid: string) => RouteLocationRaw,\n}>()\n\nexport interface ZListicle {\n offset: number;\n length: number;\n list: RouteLocationRaw;\n prev?: RouteLocationRaw;\n next?: RouteLocationRaw;\n}\n\nexport function setListicle(\n objects: (ZBaseObject | string)[],\n location: RouteLocationRaw,\n link: (uuid: string) => RouteLocationRaw,\n): void {\n const list = typeof location === 'string' ? location : { ...location }\n const uuids = objects.map((v) => typeof v === 'string' ? v : v.uuid)\n listicle.value = { link, list, uuids }\n}\n\nexport function getListicle(uuid: string): ZListicle | undefined {\n if (! listicle.value) return undefined\n const { uuids, link, list } = listicle.value\n\n const offset = uuids.indexOf(uuid)\n if (offset === -1) return undefined\n\n const prev = uuids[offset - 1]\n const next = uuids[offset + 1]\n\n return {\n list,\n offset,\n length: uuids.length,\n prev: prev && link(prev),\n next: next && link(next),\n }\n}\n","<template>\n <div>\n <!-- list -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n icon=\"sym_r_list\"\n :to=\"listicle.list\"\n />\n\n <!-- page number -->\n <span class=\"q-px-sm text-no-wrap non-selectable\">\n {{ $n(listicle.offset + 1) }}\n {{ $t({ en: ' of {n}', de: ' von {n}' }, { n: $n(listicle.length) }) }}\n </span>\n\n <!-- previous page -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n :icon=\"icons.pagination.previous\"\n :disable=\"!listicle.prev\"\n :to=\"listicle.prev\"\n />\n\n <!-- next page -->\n <z-btn\n dense\n flat\n size=\"sm\"\n class=\"z-listicle-control\"\n :icon=\"icons.pagination.next\"\n :disable=\"!listicle.next\"\n :to=\"listicle.next\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { icons } from '../assets/icons'\nimport ZBtn from '../buttons/btn.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZListicle } from '../utils/listicle'\n\ndefineProps({\n listicle: {\n type: Object as PropType<ZListicle>,\n required: true,\n },\n})\n</script>\n","<template>\n <div>\n <z-object-header :label=\"label\" :caption=\"caption\">\n <template v-if=\"_slots.label\" #label>\n <slot name=\"label\" />\n </template>\n\n <template v-if=\"_slots.caption\" #caption>\n <slot name=\"caption\" />\n </template>\n\n <!-- button to hide or show the data -->\n <template #info>\n <q-icon\n name=\"sym_r_info\"\n class=\"cursor-pointer\"\n size=\"sm\"\n @click=\"_showData = !_showData\"\n />\n <q-icon\n name=\"sym_r_error_med\"\n class=\"cursor-pointer\"\n size=\"sm\"\n @click=\"_showJson = !_showJson\"\n />\n\n <!-- extra info buttons -->\n <slot name=\"more-info\" />\n </template>\n\n <!-- === BUTTONS WHEN EDITING ======================================== -->\n <div class=\"row q-gutter-sm justify-end\">\n <!-- === EXTRA CONTROLS BEFORE THE MAIN ONES ======================= -->\n\n <div v-if=\"_slots['controls-before']\" class=\"col-shrink text-no-wrap\">\n <slot name=\"controls-before\" />\n </div>\n\n <!-- === MAIN CONTROLS ============================================= -->\n <div class=\"col-shrink text-no-wrap\">\n <z-btn-group v-if=\"_editing\">\n <!-- Cancel -->\n <z-btn\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.cancel\"\n :label=\"$t(translations.cancel)\"\n @click=\"_cancel\"\n />\n\n <!-- Save -->\n <z-btn\n v-if=\"onSave\"\n shrink=\"xs\"\n color=\"positive\"\n :disable=\"disabled || (!_submittable)\"\n :icon=\"icons.confirm\"\n :label=\"$t(translations.save)\"\n @click=\"_submit\"\n />\n </z-btn-group>\n\n <!-- === BUTTONS WHEN DELETED ==================================== -->\n\n <!-- Restore -->\n <z-btn\n v-else-if=\"_value.deleted && onRestore\"\n shrink=\"xs\"\n color=\"warning\"\n :disable=\"disabled\"\n :icon=\"icons.restore\"\n :label=\"$t(translations.restore)\"\n @click=\"_restore\"\n />\n\n <!-- === BUTTONS WHEN VIEWING ==================================== -->\n\n <z-btn-group v-else>\n <!-- Delete -->\n <z-btn\n v-if=\"(! _value.deleted) && onDelete\"\n shrink=\"xs\"\n color=\"negative\"\n :disable=\"disabled\"\n :icon=\"icons.delete\"\n :label=\"$t(translations.delete)\"\n @click=\"_delete\"\n />\n\n <!-- Extra Button (passed from parent component) -->\n <slot v-if=\"_slots.buttons\" name=\"buttons\" />\n\n <!-- Edit -->\n <z-btn\n v-if=\"onSave\"\n shrink=\"xs\"\n color=\"warning\"\n :disable=\"disabled\"\n :icon=\"icons.edit\"\n :label=\"$t(translations.edit)\"\n @click=\"_edit\"\n />\n </z-btn-group>\n </div>\n\n <!-- === EXTRA CONTROLS AFTER THE MAIN ONES ======================== -->\n <div v-if=\"_slots['controls-after']\" class=\"col-shrink text-no-wrap\">\n <slot name=\"controls-after\" />\n </div>\n </div>\n\n <!-- === EXTRA CONTROLS UNDER THE MAIN ONES ========================== -->\n <div v-if=\"_slots['controls-under']\" class=\"row q-gutter-sm q-mt-sm justify-end\">\n <div class=\"col-shrink\" style=\"flex-basis: 75%\">\n <slot name=\"controls-under\" />\n </div>\n </div>\n\n <!-- === LISTICLE UNDER ALL CONTROLS ================================= -->\n <z-listicle v-if=\"_listicle\" class=\"row justify-end q-mt-sm\" :listicle=\"_listicle\" />\n </z-object-header>\n\n <!-- ===== DIALOGS ===================================================== -->\n\n <!-- dialog to show the JSON content -->\n <z-dialog\n v-model=\"_showJson\"\n title=\"JSON\"\n full-width\n full-height\n >\n <q-card-section class=\"json-scroll\">\n <pre>{{ JSON.stringify(_value, null, 2) }}</pre>\n </q-card-section>\n </z-dialog>\n\n <!-- object information (hidden by default) -->\n <z-dialog\n v-model=\"_showData\"\n title=\"Info\"\n >\n <q-card-section>\n <z-label\n minimal\n icon=\"sym_r_tag\"\n :label=\"$t(translations['object.uuid'])\"\n :value=\"_value.uuid.toUpperCase()\"\n />\n <z-label\n minimal\n icon=\"sym_r_event_available\"\n :label=\"$t(translations['object.created'])\"\n :value=\"$d(_value.created, 'long')\"\n />\n <z-label\n minimal\n icon=\"sym_r_event_note\"\n :label=\"$t(translations['object.modified'])\"\n :value=\"$d(_value.modified, 'long')\"\n />\n <z-label\n v-if=\"_value.deleted\"\n minimal\n icon=\"sym_r_event_busy\"\n :label=\"$t(translations['object.deleted'])\"\n :value=\"$d(_value.deleted, 'long')\"\n />\n </q-card-section>\n </z-dialog>\n\n\n <!-- ===== FORM FIELDS ================================================= -->\n\n <z-form\n ref=\"_form\"\n class=\"row q-col-gutter-md\"\n bottom-slots\n :greedy=\"greedy\"\n :editable=\"_editing\"\n :disabled=\"disabled || loading\"\n @submit.prevent.stop=\"_submit\"\n >\n <slot name=\"default\" />\n </z-form>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { is, QCardSection, QIcon } from 'quasar'\nimport { computed, ref, toRaw, watch } from 'vue'\n\nimport { icons } from '../assets/icons'\nimport { translations } from '../assets/translations'\nimport ZBtnGroup from '../buttons/btn-group.vue'\nimport ZBtn from '../buttons/btn.vue'\nimport { useDialogs } from '../composition/dialogs'\nimport ZDialog from '../dialogs/dialog.vue'\nimport ZForm from '../forms/form.vue'\nimport ZLabel from '../inputs/label.vue'\nimport { getListicle } from '../utils/listicle'\nimport { createLoader } from '../utils/loader'\nimport ZListicle from './listicle.vue'\nimport ZObjectHeader from './object-header.vue'\n\nimport type { PropType, VNode } from 'vue'\nimport type { ZBaseObject } from '../types'\n\nconst { confirmDelete, confirmDiscard, confirmRestore } = useDialogs()\n\n/* ===== NAME, PROPS, SLOTS & EMITS ========================================= */\n\ndefineOptions({ name: 'ZObject' })\n\nconst _props = defineProps({\n /** Label for the page title (optional, see also the `label` slot) */\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Caption for the page title (optional, see also the `caption` slot) */\n caption: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Disable all controls */\n disabled: {\n type: Boolean as PropType<boolean | undefined>,\n required: false,\n default: undefined,\n },\n /** Enable \"greedy\" form validation */\n greedy: {\n type: Boolean,\n required: false,\n default: false,\n },\n\n /* ===== CUSTOMIZATIONS =================================================== */\n\n /**\n * Used as `@save=\"...\"` in templates, saves an object.\n *\n * When this is not set, the _editability_ state is not managed (that is, the\n * \"edit\" and \"save\" buttons will not be shown) and the parent component must\n * manage editability itself.\n */\n onSave: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@delete=\"...\"` in templates, deletes an object */\n onDelete: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n /** Used as `@restore=\"...\"` in templates, restores an object */\n onRestore: {\n type: Function as PropType<(() => any) | undefined>,\n required: false,\n default: undefined,\n },\n})\n\n/** The value of the object that will be edited, to check for modifications */\nconst _value = defineModel({\n type: Object as PropType<ZBaseObject>,\n required: true,\n})\n\n/** The editing state */\nconst _editing = defineModel('edit', {\n type: Boolean,\n required: false,\n default: false,\n})\n\nconst _slots = defineSlots<{\n /** The components of the form for the object being viewed/edited */\n 'default': () => VNode[]\n /** Label for the page title (optional, see also the `label` prop) */\n 'label'?: () => VNode[],\n /** Caption for the page title (optional, see also the `caption` prop) */\n 'caption'?: () => VNode[],\n /** Extra buttons to add when not editing */\n 'buttons'?: () => VNode[],\n /** Additional content for the info section */\n 'more-info'?: () => VNode[],\n /** Extra controls to add before the main ones */\n 'controls-before'?: () => VNode[],\n /** Extra controls to add after the main ones */\n 'controls-after'?: () => VNode[],\n /** Extra controls to add under the main ones */\n 'controls-under'?: () => VNode[],\n}>()\n\n/* ===== STATE ============================================================ */\n\n/** The backup copy of our object to check for difference/restore */\nlet _backup: ZBaseObject | undefined = undefined\n/** Reference to our form for validation */\nconst _form = ref<InstanceType<typeof ZForm> | undefined>()\n\n/** Flag indicating whether the object has been modified or not */\nconst _modified = computed(() => _editing.value && (! is.deepEqual(_value.value, _backup)))\n/** Flag indicating that all *required* components have been filled */\nconst _ready = computed(() => _form.value?.isReady)\n/** Flag indicating whether edits can be submitted back to the server */\nconst _submittable = computed(() => _modified.value && _ready)\n\n/** Flag indicating whether we show or hide the fix input fields (uuid, created on...) */\nconst _showData = ref(false)\n/** Flag indicating whether we show or hide the JSON source dialog */\nconst _showJson = ref(false)\n\n/** The listicle, if associated with this object's UUID */\nconst _listicle = computed(() => getListicle(_value.value.uuid))\n\n/* Changes to editability trigger value backup (can be triggered from outside) */\nwatch(_editing, (editing) => {\n if (editing) _backup = structuredClone(toRaw(_value.value))\n else _backup = undefined\n}, { immediate: true })\n\n/* ===== ACTIONS ============================================================ */\n\n/** Loader fod delete/restore */\nconst { load, loading } = createLoader()\n\n/** Edit object */\nfunction _edit(): void {\n if (_editing.value !== true) _editing.value = true\n}\n\n/** Cancel and discard changes */\nasync function _cancel(): Promise<void> {\n if (_editing.value === false) return\n\n await load(async () => {\n if (! _modified.value) return _editing.value = false\n\n const result = await confirmDiscard()\n if (! result) return // no changes!\n // restore from backup and close editing\n _value.value = structuredClone(_backup!)\n _editing.value = false\n })\n}\n\n/** Validate, and if emit our \"save\" event */\nasync function _submit(): Promise<void> {\n if (! _props.onSave) return\n if (! _submittable.value) return\n const valid = await _form.value?.validate()\n if (valid) _props.onSave()\n}\n\n/** Delete this object */\nasync function _delete(): Promise<void> {\n if (_value.value.deleted) return\n\n await load(async () => {\n const result = await confirmDelete()\n if (result) _props.onDelete?.()\n })\n}\n\n/** Restore this object */\nasync function _restore(): Promise<void> {\n if (! _value.value.deleted) return\n\n await load(async () => {\n const result = await confirmRestore()\n if (result) _props.onRestore?.()\n })\n}\n\n/* ===== EXPOSED ============================================================ */\n\ndefineExpose({\n validate: async () => (await _form.value?.validate() || false),\n modified: _modified,\n submittable: _submittable,\n isReady: _ready,\n})\n</script>\n\n<style lang=\"postcss\" scoped>\n.json-scroll {\n position: absolute;\n left: 0px;\n right: 0px;\n top: 64px;\n bottom: 0px;\n overflow: scroll;\n}\n</style>\n","import { useTranslator } from '@juit/vue-i18n'\n\nimport { translations } from '../assets/translations'\n\nimport type { PropType } from 'vue'\nimport type { ZBaseObject } from '../types'\n\n/** Generic properties shared by all our tables. */\nexport const tableProps = {\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Enclosed table: renders controls within the table itself */\n enclosed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Can this table be expanded to full screen or not */\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The initial number of rows to be fetched (default: 25 when dense or 15) */\n length: {\n type: Number,\n required: false,\n default: ({ dense }: { dense?: boolean }) => dense ? 25 : 15,\n },\n /** Is the state of this table synchronized with the current route or not */\n useRoute: {\n type: Boolean,\n required: false,\n default: false,\n },\n} as const\n\n/**\n * Extra properties to add to tables to forward pointer events to the parent.\n *\n * The followings are **EMITS**, they need to be declared as props because\n * of the discussion at https://github.com/vuejs/rfcs/discussions/397.\n */\nexport const tableEventProps = {\n onRowClick: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n onRowDblclick: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n onRowContextmenu: {\n type: Function as PropType<((event: PointerEvent, row: any, index: number) => void) | undefined>,\n required: false,\n default: undefined,\n },\n} as const\n\n/** Table State */\nexport interface ZTableState {\n offset: number,\n limit: number,\n sort?: string | undefined,\n desc: boolean,\n}\n\n/** Describe a possible length of rows in a table */\nexport interface ZTableRowsOption {\n /** The _value_ (number of rows) associated with this option */\n value: number,\n /** The _icon_ (as per Quasar names) of the icon associated with this */\n icon: string,\n}\n\n/** Options defining row lengths in a table */\nexport type ZTableRowsOptions = ZTableRowsOption[]\n\n/** A single column definition */\nexport interface ZTableColumn<T = any> {\n /** The label used in the header of the table */\n label: string | (() => string);\n /** The value to display in a cell for this column */\n value?: ((row: T) => any);\n /** Whether this column is hidden or not (`required` means _never_ hide) */\n hidden?: boolean | 'never';\n /** Horizontal alignment of cells in this column (default: `left`) */\n align?: 'left' | 'right' | 'center';\n /** A flag indicating whether this column is sortable and its default order */\n sortable?: boolean | 'asc' | 'desc';\n /** The real column where sorting will be performed (defaults to the key) */\n sort?: string;\n /** The style to apply on the data cells of this column */\n style?: string | ((row: T) => string);\n /** Classes to add to the data cells of this column */\n class?: string | ((row: T) => string);\n}\n\n/** Column definitions, keyed by table name */\nexport type ZTableColumns<T = any> = Record<string, ZTableColumn<T>>\n\n/**\n * Objects columns definitions (`uuid`, `created`, `modifed` and `deleted`)\n *\n * Because of internationalization, we need to use this function directly in\n * the `setup()` function of the component, and never in computed properties.\n */\nexport function useObjectColumns(): ZTableColumns<ZBaseObject> {\n const { t, d } = useTranslator()\n\n return {\n uuid: {\n label: () => t(translations['object.uuid']),\n hidden: true,\n },\n created: {\n label: () => t(translations['object.created']),\n value: (row) => d(row.created),\n sortable: true,\n hidden: true,\n },\n modified: {\n label: () => t(translations['object.modified']),\n value: (row) => d(row.modified),\n sortable: true,\n hidden: true,\n },\n deleted: {\n label: () => t(translations['object.deleted']),\n value: (row) => d(row.deleted),\n sortable: true,\n hidden: true,\n },\n }\n}\n","<template>\n <z-btn-dropdown\n flat\n dense\n no-icon-animation\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :dropdown-icon=\"icons.table.columns\"\n :tooltip=\"$t({ en: 'Columns', de: 'Spalten' })\"\n >\n <q-list dense bordered>\n <q-item\n v-for=\"(column, name) in columns\"\n :key=\"name\"\n :class=\"{ 'bg-shade-primary text-primary': visible.includes(name) }\"\n clickable\n @click=\"toggleVisible(name)\"\n >\n <q-item-section>\n <q-item-label>\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </q-item-label>\n </q-item-section>\n <q-item-section side>\n <q-icon\n size=\"xs\"\n :name=\"visible.includes(name) ? icons.visibility.on : icons.visibility.off\"\n />\n </q-item-section>\n </q-item>\n </q-list>\n </z-btn-dropdown>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QList } from 'quasar'\n\nimport { icons } from '../../assets/icons'\nimport ZBtnDropdown from '../../buttons/btn-dropdown.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZTableColumns } from '../../utils/tables'\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTableFooterColumns' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** The columns to display in our control */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** Array of column **keys** that are currently visible */\nconst visible = defineModel({\n type: Array as PropType<string[]>,\n required: true,\n})\n\n// ===== LOCALS ================================================================\n\n/** Toggle visibility on the specified column */\nfunction toggleVisible(_name: string): void {\n if (visible.value.includes(_name)) {\n visible.value = visible.value.filter((c) => c !== _name)\n } else {\n visible.value = [ ...visible.value, _name ]\n }\n}\n</script>\n","<template>\n <z-btn\n flat\n dense\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :icon=\"fullscreen ? icons.fullscreen.exit : icons.fullscreen.enter\"\n :tooltip=\"$t({ en: 'Full screen', de: 'Ganzer Bildschirm' })\"\n @click=\"fullscreen = ! fullscreen\"\n />\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { icons } from '../../assets/icons'\nimport ZBtn from '../../buttons/btn.vue'\n\ndefineOptions({ name: 'ZTableFooterFullscreen' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** The full-screen state */\nconst fullscreen = defineModel({\n type: Boolean,\n required: true,\n})\n</script>\n","<template>\n <div class=\"row justify-center items-center\" style=\"flex-wrap: nowrap;\">\n <!-- first page -->\n <z-btn\n v-if=\"screen.gt.xs\"\n flat\n dense\n :icon=\"icons.pagination.first\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (_page < 1)\"\n @click=\"_page = 0\"\n />\n\n <!-- previous page -->\n <z-btn\n flat\n dense\n :icon=\"icons.pagination.previous\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (_page < 1)\"\n @click=\"_page -= 1\"\n />\n\n <!-- page number -->\n <div class=\"q-px-sm text-no-wrap\">\n {{ $n(_page + 1) }}\n <span v-if=\"last && screen.gt.xs\" aria-disabled>\n {{ $t({ en: 'of {n}', de: 'von {n}' }, { n: _last }) }}\n </span>\n </div>\n\n <!-- next page -->\n <z-btn\n flat\n dense\n :icon=\"icons.pagination.next\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || (! next)\"\n @click=\"_page += 1\"\n />\n\n <!-- last page -->\n <z-btn\n v-if=\"screen.gt.xs\"\n flat\n dense\n :icon=\"icons.pagination.last\"\n :size=\"dense ? 'sm' : 'md'\"\n :disable=\"disable || ((last || 0) <= _page)\"\n @click=\"_page = last\"\n />\n </div>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { useTranslator } from '@juit/vue-i18n'\nimport { useQuasar } from 'quasar'\nimport { computed } from 'vue'\n\nimport { icons } from '../../assets/icons'\nimport ZBtn from '../../buttons/btn.vue'\n\nconst { n, t } = useTranslator()\nconst { screen } = useQuasar()\n\ndefineOptions({ name: 'ZTableFooterPagination' })\n\nconst _props = defineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Whether there is a _next_ page after the current one */\n next: {\n type: Boolean,\n required: true,\n },\n /** The last page, if any */\n last: {\n type: Number,\n required: true,\n },\n})\n\n/** The page number */\nconst _page = defineModel({\n type: Number,\n required: true,\n})\n\n/** Last, as a (formatted) number or the string \"many\" */\nconst _last = computed(() => {\n if (_props.last >= 0) return n(_props.last + 1)\n if (! _props.next) return n(_page.value + 1)\n return t({ en: 'many', de: 'viele' })\n})\n\n\n</script>\n","<template>\n <z-btn-dropdown\n flat\n dense\n no-icon-animation\n :auto-close=\"true\"\n :disable=\"disable\"\n :size=\"dense ? 'sm' : 'md'\"\n :dropdown-icon=\"icons.table.rows\"\n :tooltip=\"$t({ en: 'Rows', de: 'Reihen' })\"\n >\n <q-list dense bordered>\n <q-item\n v-for=\"(option, i) in options\"\n :key=\"i\"\n :class=\"{ 'bg-shade-primary text-primary': length === option.value }\"\n clickable\n @click=\"length = option.value\"\n >\n <q-item-section class=\"text-right\">\n <q-item-label>{{ option.value }}</q-item-label>\n </q-item-section>\n <q-item-section side>\n <q-icon\n size=\"xs\"\n class=\"q-ml-sm\"\n :name=\"option.icon\"\n />\n </q-item-section>\n </q-item>\n </q-list>\n </z-btn-dropdown>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QIcon, QItem, QItemLabel, QItemSection, QList } from 'quasar'\n\nimport { icons } from '../../assets/icons'\nimport ZBtnDropdown from '../../buttons/btn-dropdown.vue'\n\nimport type { PropType } from 'vue'\nimport type { ZTableRowsOptions } from '../../utils/tables'\n\ndefineOptions({ name: 'ZFooterRows' })\n\ndefineProps({\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Definition of the various row options */\n options: {\n type: Array as PropType<ZTableRowsOptions>,\n required: true,\n },\n /** Disable the control (for example, when loading) */\n disable: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** The number of rows currently visible */\nconst length = defineModel({\n type: Number,\n required: true,\n})\n</script>\n","<template>\n <q-tr :props=\"slotData\" :class=\"slotData.__trClass\">\n <!-- present only when in selection mode, checkbox to select all -->\n <q-th\n v-if=\"selection\"\n class=\"shrink\"\n :class=\"{\n 'bg-shade-primary text-primary': ! loading,\n 'bg-shade disabled': loading,\n }\"\n >\n <q-checkbox\n v-model=\"slotData.selected\"\n :size=\"slotData.dense ? 'xs' : undefined\"\n toggle-order=\"tf\"\n dense\n />\n </q-th>\n\n <!-- table headers -->\n <q-th\n v-for=\"(column, name) in columns\"\n :key=\"name\"\n :props=\"slotData\"\n class=\"relative-position\"\n :style=\"borders && 'border-top-width: 1px'\"\n :class=\"{\n 'q-focusable q-hoverable': !! sortable[name],\n 'cursor-pointer': (!! sortable[name]) && (! loading),\n 'bg-shade-primary text-primary': ! loading,\n 'bg-shade disabled': loading,\n }\"\n @click=\"loading || toggleSort(name)\"\n >\n <div v-if=\"!! sortable[name]\" class=\"q-focus-helper\" tabindex=\"-1\" />\n\n <!-- ensure we're properly centered on the column -->\n <q-icon v-if=\"column.align === 'center'\" class=\"q-mr-sm\" />\n\n <!-- label for left/center-aligned content -->\n <span v-if=\"column.align !== 'right'\" class=\"text-uppercase text-weight-bold q-mr-sm\">\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </span>\n\n <!-- arrows to be shown when this column is being sorted -->\n <q-icon\n v-if=\"(column.sort || name) === state.sort\"\n :name=\"state.desc ? icons.sorting.descending : icons.sorting.ascending\"\n />\n\n <!-- icon to be shown for all non-sorting, but sortable columns -->\n <q-icon v-else-if=\"!! sortable[name]\" :name=\"icons.sorting.unsorted\" />\n\n <!-- label for right-aligned content -->\n <span v-if=\"column.align === 'right'\" class=\"text-uppercase text-weight-bold q-ml-sm\">\n {{ typeof column.label === 'function' ? column.label() : column.label }}\n </span>\n </q-th>\n </q-tr>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { QCheckbox, QIcon, QTh, QTr } from 'quasar'\nimport { computed } from 'vue'\n\nimport { icons } from '../../assets/icons'\n\nimport type { QTableSlots } from 'quasar'\nimport type { PropType } from 'vue'\nimport type { ZTableColumns, ZTableState } from '../../utils/tables'\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTableHeader' })\n\nconst props = defineProps({\n /** Thin border at the top of the heade */\n borders: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Our columns definitions */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Whether the table rows are currently loading */\n loading: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Whether to add the selection checkbox header or not */\n selection: {\n type: Boolean,\n required: false,\n default: false,\n },\n})\n\n/** Current state of the table */\nconst state = defineModel({\n type: Object as PropType<ZTableState>,\n required: true,\n})\n\n/** The semi-opaque slot data for this header */\nconst slotData = defineModel('slotData', {\n type: Object as PropType<Parameters<QTableSlots['header']>[0]>,\n required: true,\n})\n\n\n// ===== LOCALS ================================================================\n\n/** All sortable columns, associated with their default order */\nconst sortable = computed<Record<string, { sort: string, order: 'asc' | 'desc' }>>(() => {\n return Object.entries(props.columns).reduce((columns, [ name, column ]) => {\n const sort = column.sort || name\n if (column.sortable === true) columns[name] = { sort, order: 'asc' }\n else if (column.sortable === 'asc') columns[name] = { sort, order: 'asc' }\n else if (column.sortable === 'desc') columns[name] = { sort, order: 'desc' }\n return columns\n }, {} as Record<string, { sort: string, order: 'asc' | 'desc' }>)\n})\n\n/** Toggle sort when clicking on a header */\nfunction toggleSort(name: string): void {\n const column = sortable.value[name]\n if (! column) return\n\n // what's the default (first) order for the column? default is ascending!\n // const defaultOrder = column.order // === 'desc' ? 'desc' : 'asc'\n\n // toggle and update the sort model back to the parent\n if (state.value.sort === column.sort) {\n if (column.order === 'desc') {\n if (state.value.desc) state.value.desc = false\n else { // reset\n state.value.sort = undefined\n state.value.desc = false\n }\n } else {\n if (! state.value.desc) state.value.desc = true\n else { // reset\n state.value.sort = undefined\n state.value.desc = false\n }\n }\n } else {\n state.value.desc = column.order === 'desc'\n state.value.sort = column.sort\n }\n}\n</script>\n","<template>\n <!-- default slot (controls) goes *outside* when not secondary (full screen or enclosed) -->\n <div\n v-if=\"slots.default && (! secondary)\"\n class=\"row justify-end q-gutter-sm q-mb-md z-table-controls\"\n >\n <z-input-group :disabled=\"loading\">\n <slot name=\"default\" />\n </z-input-group>\n </div>\n\n <!-- the actual table -->\n <q-table\n v-model:fullscreen=\"full\"\n v-model:selected=\"selected\"\n v-bind=\"$attrs\"\n :columns=\"tableColumns\"\n :dense=\"dense\"\n :loading=\"loading\"\n :pagination=\"{ rowsPerPage: -1 }\"\n :row-key=\"rowKey\"\n :rows=\"tableRows\"\n :visible-columns=\"visible\"\n :selection=\"selection ? 'multiple' : 'none'\"\n :hide-bottom=\"tableRows.length ? hideBottom : false\"\n no-route-fullscreen-exit\n bordered\n flat\n >\n <!-- title when secondary (full screen or enclosed) -->\n <template v-if=\"title && secondary\" #top-left>\n <div class=\"text-h6 text-uppercase text-bold\">\n {{ title }}\n </div>\n </template>\n\n <!-- controls when secondary (full screen or enclosed) -->\n <template v-if=\"slots.default && secondary\" #top-right>\n <div class=\"row justify-end q-gutter-sm z-table-controls\">\n <z-input-group :disabled=\"loading\">\n <slot name=\"default\" />\n </z-input-group>\n </div>\n </template>\n\n <!-- table header -->\n <template #header=\"data\">\n <table-header\n v-model=\"state\"\n :selection=\"!! selection\"\n :borders=\"slots.default && secondary\"\n :loading=\"loading\"\n :columns=\"columns\"\n :slot-data=\"data\"\n :dense=\"dense\"\n />\n </template>\n\n <!-- table body -->\n <template #body=\"scope\">\n <!-- table row: v-for loop is handled by qtable -->\n <q-tr\n :props=\"scope\"\n :style=\"rowStyle?.(scope.row)\"\n :class=\"`\n ${scope.__trClass}\n ${rowClass?.(scope.row) || ''}\n ${onRowClick ? 'cursor-pointer' : ''}\n `\"\n @click=\"onRowClick?.($event, scope.row, scope.rowIndex)\"\n @dblclick=\"onRowDblclick?.($event, scope.row, scope.rowIndex)\"\n @contextmenu=\"onRowContextmenu?.($event, scope.row, scope.rowIndex)\"\n >\n <!-- create link once per row, using v-for to contextualize variable -->\n <template v-for=\"link in [ rowLink?.(scope.row) ]\" :key=\"link\">\n <!-- selection checkbox, only if selecting -->\n <q-td v-if=\"scope.selected !== undefined\" class=\"text-center shrink\">\n <q-checkbox v-model=\"scope.selected\" dense :size=\"dense ? 'xs' : undefined\" />\n </q-td>\n\n <!-- table cell -->\n <q-td v-for=\"col in scope.cols\" :key=\"col.name\" :props=\"scope\">\n <!-- optionally wrap the contents of the cell in a router link -->\n <table-link :to=\"link\">\n <!-- if we have a *data* slot call it-->\n <div v-if=\"slots[`data-${col.name}`]\">\n <slot\n :name=\"`data-${col.name}`\"\n :index=\"scope.rowIndex\"\n :row=\"scope.row\"\n :value=\"col.value\"\n />\n </div>\n <!-- otherwise, just display the value -->\n <div v-else>\n {{ col.value }}\n </div>\n </table-link>\n </q-td>\n </template>\n </q-tr>\n </template>\n\n <!-- bottom row -->\n <template v-if=\"slots['bottom-row']\" #bottom-row>\n <slot name=\"bottom-row\" />\n </template>\n\n <!-- no-data slot -->\n <template #no-data>\n <template v-if=\"loading\">\n <q-spinner size=\"xs\" class=\"q-mr-sm\" color=\"grey\" />\n <span>{{ $t({ en: 'Loading', de: 'Laden' }) }}</span>\n </template>\n <template v-else>\n <q-icon\n :name=\"icons.warning\"\n class=\"fill-icon q-mr-sm\"\n color=\"warning\"\n size=\"xs\"\n />\n <span>{{ $t({ en: 'No data available', de: 'Kein Daten vorhanden' }) }}</span>\n </template>\n </template>\n\n <!-- table bottom (pagination, controls, ...) -->\n <template #bottom>\n <div class=\"row col-12 items-center\">\n <!-- record number (from, to, total number if known) -->\n <div :class=\"fixed ? 'col-6' : 'col-4'\">\n <div class=\"row justify-start items-center\">\n <div>\n {{ $n(state.offset + 1) }}\n …\n {{ $n(state.offset + Math.min(rows.length, length)) }}\n <span v-if=\"records && screen.gt.xs\" aria-disabled>\n {{ $t({ en: 'of {n}', de: 'von {n}' }, { n: $n(records) }) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- pagination -->\n <div :class=\"fixed ? 'col-6' : 'col-4'\">\n <div class=\"row items-center\" :class=\"fixed ? 'justify-end' : 'justify-center'\">\n <table-footer-pagination\n v-model=\"page\"\n :dense=\"dense\"\n :disable=\"loading\"\n :next=\"rows.length > length\"\n :last=\"last\"\n />\n </div>\n </div>\n <div v-if=\"! fixed\" class=\"col-4\">\n <div class=\"row justify-end items-center\">\n <table-footer-full-screen\n v-if=\"fullscreen\"\n v-model=\"full\"\n :dense=\"dense\"\n :disable=\"loading\"\n />\n <table-footer-columns\n v-if=\"optional\"\n v-model=\"visible\"\n :columns=\"optional\"\n :dense=\"dense\"\n :disable=\"loading\"\n />\n <table-footer-rows\n v-model=\"length\"\n :dense=\"dense\"\n :disable=\"loading\"\n :options=\"rowsOptions\"\n />\n </div>\n </div>\n </div>\n </template>\n </q-table>\n</template>\n\n<!-- ===========================================================================\n| SETUP |\n============================================================================ -->\n\n<script setup lang=\"ts\">\nimport { is, QCheckbox, QIcon, QSpinner, QTable, QTd, QTr, useQuasar } from 'quasar'\nimport { computed, defineComponent, h, ref, watch } from 'vue'\nimport { RouterLink } from 'vue-router'\n\n\nimport { icons } from '../assets/icons'\nimport ZInputGroup from '../forms/input-group.vue'\nimport { tableEventProps } from '../utils/tables'\nimport TableFooterColumns from './layout/table-footer-columns.vue'\nimport TableFooterFullScreen from './layout/table-footer-fullscreen.vue'\nimport TableFooterPagination from './layout/table-footer-pagination.vue'\nimport TableFooterRows from './layout/table-footer-rows.vue'\nimport TableHeader from './layout/table-header.vue'\n\nimport type { QTableProps } from 'quasar'\nimport type { PropType, VNode } from 'vue'\nimport type { RouteLocationRaw } from 'vue-router'\nimport type { ZTableColumns, ZTableRowsOptions, ZTableState } from '../utils/tables'\n\nconst { screen } = useQuasar()\n\n// ===== PROPS AND MODEL =======================================================\n\ndefineOptions({ name: 'ZTable' })\n\nconst props = defineProps({\n ...tableEventProps,\n /** Optional title for this table */\n title: {\n type: String,\n required: false,\n default: undefined,\n },\n /** Make this compact (or not!) */\n dense: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Enclosed table: renders controls within the table itself */\n enclosed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Fixed table: do not allow selection of rows/column */\n fixed: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Can this table be expanded to full screen or not */\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n /** Hide the bottom pagination when not needed */\n hideBottom: {\n type: Boolean,\n required: false,\n default: false,\n },\n /**\n * Flag indicating the table is loading\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n loading: {\n type: Boolean,\n required: true,\n },\n /**\n * The rows to display (starting at `offset` with the given `limit`)\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n rows: {\n type: Array as PropType<any[]>,\n required: true,\n },\n /**\n * The total number of rows (if known)\n *\n * This can not be combined in the `state`, as any changes to the state\n * object trigger a reload of the data, and we end with an infinite loop.\n */\n total: {\n type: Number,\n required: false,\n default: 0,\n },\n /** Definition for the columns of this table */\n columns: {\n type: Object as PropType<ZTableColumns>,\n required: true,\n },\n /** Class(es) to apply to each row */\n rowClass: {\n type: Function as PropType<(row: any) => string | undefined>,\n required: false,\n default: undefined,\n },\n /** Style(s) to apply to each row */\n rowStyle: {\n type: Function as PropType<(row: any) => string | undefined>,\n required: false,\n default: undefined,\n },\n /** Style(s) to apply to each row */\n rowLink: {\n type: Function as PropType<(row: any) => RouteLocationRaw | string | undefined>,\n required: false,\n default: undefined,\n },\n /** The unique identifier of a row (must be supplied) */\n rowKey: {\n type: String,\n required: true,\n },\n /** Options specifying the row lengths to display fot this table */\n rowsOptions: {\n type: Array as PropType<ZTableRowsOptions>,\n required: false,\n default: ({ dense }: { dense?: boolean }) => {\n return dense ? [\n { value: 10, icon: icons.table.row.density[1] },\n { value: 25, icon: icons.table.row.density[2] },\n { value: 50, icon: icons.table.row.density[3] },\n { value: 100, icon: icons.table.row.density[4] },\n ] : [\n { value: 5, icon: icons.table.row.density[1] },\n { value: 15, icon: icons.table.row.density[2] },\n { value: 50, icon: icons.table.row.density[3] },\n { value: 100, icon: icons.table.row.density[4] },\n ]\n },\n },\n})\n\n/** Current state of the table */\nconst state = defineModel({\n type: Object as PropType<ZTableState>,\n required: true,\n})\n\n// ===== DATA SLOTS & EMITS ====================================================\n\nconst slots = defineSlots<{\n [ key: `data-${string}` ]: (props: { index: number, row: any, value: any }) => VNode[]\n 'bottom-row'?: () => VNode[]\n 'default'?: () => VNode[]\n}>()\n\n// ===== PAGINATION ============================================================\n\n/** The current page number (zero-based) */\nconst page = ref<number>(0)\n/** The last page number (if known, or zero) */\nconst last = computed<number>(() => Math.floor((props.total - 1) / length.value))\n/** The number of rows to display (basically `limit - 1`) */\nconst length = ref<number>(0)\n/** The total number of records (either from our prop or computed) */\nconst records = computed(() => {\n if (props.total) return props.total\n if (props.rows.length <= length.value) return state.value.offset + props.rows.length\n return 0\n})\n/** Secondary: if enclosed or in full screen renders control within the table */\nconst secondary = computed(() => props.enclosed || full.value)\n\n// The order of these watchers is important, as `limit`, `length`, `offset`\n// and `page` are all interdependent on each other.\n\nwatch([ () => state.value.offset, () => state.value.limit ], ([ offset, limit ]) => {\n if (limit <= 0) length.value = props.dense ? 10 : 15\n else length.value = limit - 1\n // must be calculated after the length above...\n page.value = Math.floor(offset / length.value)\n}, { immediate: true })\n\nwatch(length, (length) => {\n state.value.limit = length + 1\n}, { immediate: true })\n\nwatch(page, (page) => {\n state.value.offset = page * length.value\n}, { immediate: true })\n\n// ===== SELECTION =============================================================\n\n/**\n * If this property is specified *and* is an array, this table will be\n * selectable, and the selection will include (in order) all selected rows\n */\nconst selection = defineModel('selection', {\n type: Array as PropType<any[] | undefined>,\n required: false,\n default: undefined,\n})\n\n/** The selection for q-table (unordered) */\nconst selected = ref<any[]>([])\n\nwatch(() => props.rows, () => selected.value = [])\n\n/* Watch \"selected\" (from q-table) and emit the selection in order */\nwatch(selected, (selected) => {\n if (! selection.value) return // no \"selection\" model\n\n // quick check on empty selection\n if (selected.length === 0) {\n if (selection.value.length === 0) return\n selection.value = []\n return\n }\n\n // get the keys selected in q-table\n const selectedKeys = selected\n .map((row) => row[props.rowKey])\n .filter((key) => !! key)\n\n // get the keys selected by the parent\n const selectionKeys = selection.value\n .map((row) => row[props.rowKey])\n .filter((key) => !! key)\n\n // prepare a new selection (keys and rows)\n const newSelection: any[] = []\n const newSelectionKeys: any[] = []\n for (const row of props.rows) {\n const key = row[props.rowKey]\n if (selectedKeys.includes(key)) {\n newSelectionKeys.push(key)\n newSelection.push(row)\n }\n }\n\n // if the selection has changed, emit it it\n if (is.deepEqual(selectionKeys, newSelectionKeys)) return\n selection.value = newSelection\n})\n\n/* Watch \"selection\" (from parent) and update \"selected\" (for q-table) */\nwatch(selection, (selection) => selected.value = selection || [], { immediate: true })\n\n// ===== COLUMNS VISIBILITY ====================================================\n\n/** All _optional_ columns (as, _they can be hidden_) */\nconst optional = computed<ZTableColumns | undefined>(() => {\n const entries = Object.entries(props.columns)\n .filter(([ _, { hidden } ]) => hidden !== 'never')\n\n if (! entries.length) return undefined\n\n return entries.reduce((optional, [ name, column ]) => {\n optional[name] = column\n return optional\n }, {} as ZTableColumns)\n})\n\n/** Current list of _visible_ columns */\nconst visible = ref<string[]>([])\n\n// Compute visible columns, adding and removing as necessary\nwatch(() => props.columns, (newColumns, oldColumns = {}) => {\n // Compute the list of _new_ visible column names\n const newVisible = Object.entries(newColumns)\n .filter(([ _, { hidden } ]) => hidden === 'never' || (! hidden))\n .map(([ name ]) => name)\n\n // Compute the list of _old_ visible column names\n const oldVisible = Object.entries(oldColumns)\n .filter(([ _, { hidden } ]) => hidden === 'never' || (! hidden))\n .map(([ name ]) => name)\n\n // Compute the columns to add and remove from our current list\n const add = newVisible.filter((name) => ! oldVisible.includes(name))\n const del = oldVisible.filter((name) => ! newVisible.includes(name))\n\n // Update the list of visible columns\n visible.value = [ ...visible.value, ...add ].filter((name) => ! del.includes(name))\n}, { immediate: true })\n\n// ===== LOCAL STATE ===========================================================\n\n/** Flag indicating we're in full-screen */\nconst full = ref(false)\n\n// ===== QUASAR TABLE PROPERTIES ===============================================\n\n/** The rows to display in the Quasar table */\nconst tableRows = computed(() => props.rows.slice(0, length.value))\n\n/** The column definitions for the Quasar table */\nconst tableColumns = computed<Exclude<QTableProps['columns'], undefined>>(() => {\n return Object.entries(props.columns).map(([ name, col ]) => ({\n name,\n label: name, // we override in our header/column picker\n field: col.value || name,\n align: col.align || 'left',\n sortable: false, // do not let Quasar sort the columns\n style: col.style,\n classes: col.class,\n } satisfies Exclude<QTableProps['columns'], undefined>[0]))\n})\n\n// ===== OPTIONAL LINK FOR TABLE ROW ===========================================\n\nconst TableLink = defineComponent({\n name: 'TableLink',\n props: {\n to: {\n type: [ String, Object ] as PropType<RouteLocationRaw>,\n required: false,\n default: undefined,\n },\n },\n\n setup: (props, ctx) => () => {\n if (! ctx.slots.default) return []\n if (! props.to) return ctx.slots.default()\n return h(RouterLink, { to: props.to, class: 'table-link' }, ctx.slots.default)\n },\n})\n</script>\n\n<style scoped lang=\"pcss\">\n/* Let padding be done by a.table-link */\ntd.q-td:has(a.table-link) {\n padding: 0;\n vertical-align: top;\n}\n\ntd.q-td.shrink {\n width: 1px;\n}\n\n/* Turn an \"<a href=...>\" into a glorified div */\na.table-link {\n display: block;\n color: inherit;\n text-decoration: none;\n /* fill the cell */\n width: 100%;\n height: 100%;\n\n /* center the content vertically */\n > div {\n position: relative;\n transform: translateY(-50%);\n top: 50%;\n /* overflow and text trimming of nested DIV */\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n/* Remove the top border from the \"no-data\" bottom slot */\n:deep(.q-table__bottom--nodata) {\n border-top: none;\n}\n\n/* Colorize loading in the primary color */\n:deep(.q-linear-progress) {\n color: var(--q-primary) !important;\n}\n\n/* Add padding for each cell (basically, cloned the quasar defaults) */\ntd.q-td a.table-link {\n padding: 7px 16px;\n}\n\n.q-table--dense td.q-td a.table-link {\n padding: 4px 8px;\n}\n\n.q-table--dense td.q-td:first-child a.table-link {\n padding-left: 16px;\n}\n\n.q-table--dense td.q-td:last-child a.table-link {\n padding-right: 16px;\n}\n\n/* Constrain padding for the table top */\n:deep(.q-table__top) {\n padding: 12px 16px;\n}\n\n.q-table--dense :deep(.q-table__top) {\n padding: 12px 16px;\n}\n\n/* Default width for search and other inputs */\n.z-table-controls :deep(.q-input) {\n width: 200px;\n}\n\n</style>\n","import { getCurrentScope, reactive, watch } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport type { PropType, Reactive } from 'vue'\nimport type { LocationQuery } from 'vue-router'\n\n/* ===== EXPORTED TYPES ===================================================== */\n\n/** Types accepted by our reactive object */\nexport type ZQueryReactiveValue = string | number | boolean\n\n/** A record representing a basic/untyped reactive object */\nexport type ZQueryReactiveObject = Record<string, ZQueryReactiveValue | undefined>\n\n/** Default for T: either a primitive or a function producing one */\nexport type ZQueryReactiveDefault<T extends ZQueryReactiveValue> = T | undefined\n | ((state: Readonly<ZQueryReactiveObject>) => T | undefined)\n\n/** Simple definition for a reactive property */\nexport type ZQueryReactiveDef<T extends ZQueryReactiveValue = ZQueryReactiveValue> =\n | { type: PropType<T>, default?: ZQueryReactiveDefault<T>, useRoute?: boolean }\n | ( PropType<T> & { type?: never, default?: never, useRoute?: never } )\n\n/**\n * Definition for a reactive object that can be bound to the router query.\n *\n * Each key in the definition object represents a property in the reactive\n * object and the key in the query string.\n *\n * Types can be simple strings, numbers, or booleans (for more complex types\n * use `PropType`, but _no validation occurs_, so be careful).\n *\n * The `default` property is used when the query string is missing or empty,\n * and for booleans it's always `false` (to avoid the \"undefined\" state).\n */\nexport type ZQueryReactiveDefs = { [ K: string ]: ZQueryReactiveDef }\n\n/* ===== INTERNAL TYPES ===================================================== */\n\n/** Internal definition (basically the object version of ReactiveDef) */\ntype InternalDef = {\n type: PropType<ZQueryReactiveValue>,\n default: ZQueryReactiveDefault<ZQueryReactiveValue>,\n useRoute: boolean,\n}\n\n/** Infer a single definition */\ntype InferDef<T extends ZQueryReactiveDef> =\n T extends { type: PropType<infer R> } ? // / is this a \"typed\" definition???\n //\n R extends boolean ? boolean : // / if it's a boolean, return a boolean\n //\n T['default'] extends () => infer X ? // / if default is a function infer the return type\n undefined extends X ?\n R | undefined : // / if the return type can be undefined\n R : // / then the value can be undefined too\n undefined extends T['default'] ?\n R | undefined : // / the same for when the default is a value\n R : // / if default can be undefined, then...\n //\n T extends PropType<infer R> ? // / this is not a \"typed\" definition\n R extends boolean ? boolean : // / if it's a boolean, return a boolean\n R | undefined : // / otherwise, return the type or undefined\n //\n never // / not accepting anything else\n\n/** Infer all our definitions */\ntype InferDefs<T extends ZQueryReactiveDefs> = {\n [ K in keyof T ]:\n T[K]['type'] extends PropType<any> ? InferDef<T[K]> : // typed definition\n T[K] extends PropType<any> ? InferDef<T[K]> : // // simple constructor\n never // // nothing else!\n}\n\n/* ===== INTERNAL FUNCTIONS ================================================= */\n\n/** Get the default value from a ReactiveDef */\nfunction getDefaultValueFor<T extends ZQueryReactiveValue>(\n def: ZQueryReactiveDef<T>,\n state: ZQueryReactiveObject,\n): T | undefined {\n const value = typeof def.default === 'function' ?\n def.default({ ...state }) :\n def.default\n if (def.type === Boolean) return (value || false) as T\n return value as T\n}\n\n/* ===== EXPORTED FUNCTIONS ================================================= */\n\n/**\n * Create a reactive object following the given definition and _optionally_ bind\n * it to the router's query string.\n *\n * @param definition - The definition for the reactive object.\n * @param useRoutes - When true, bind the object to the router's query string.\n */\nexport function createBoundObject<T extends ZQueryReactiveDefs>(\n definition: T,\n useRoutes: boolean = false,\n): Reactive<InferDefs<T>> {\n // triple check that we're not doing something stupid\n if (! getCurrentScope()) throw new Error('No reacive scope found')\n\n // start with an empty object, we'll fill it with the default values\n const object = reactive({} as Record<string, any>)\n\n // clone our definitions (we'll clean them up)\n const defs: Record<string, InternalDef> = {}\n\n // clone and normalize our definitions while setting up the default values\n for (const [ key, def ] of Object.entries(definition)) {\n object[key] = getDefaultValueFor(def, object)\n\n // check, normalize and store the definition\n const type: PropType<ZQueryReactiveValue> = def.type || def\n const useRoute = def.useRoute === false ? false : useRoutes\n\n // if it's a good type (String, Number, Boolean), we're good to go\n if ((type === String) || (type === Number) || (type === Boolean)) {\n defs[key] = { type, useRoute, default: def.default }\n continue\n }\n\n // wrong type, throw an error\n throw new Error(`Invalid constructor definition \"${key}\": ${type}`)\n }\n\n // if we're not binding to the router query, we're done!\n if (! useRoutes) return object as Reactive<InferDefs<T>>\n\n // we're binding to the query, get our router!\n const router = useRouter()\n\n // --- ROUTE to OBJECT -------------------------------------------------------\n\n watch(() => router.currentRoute.value.query, (query) => {\n for (const [ key, def ] of Object.entries(defs)) {\n if (! def.useRoute) continue // skip anyhting not bound to the route\n\n // get our default value for the current defintion\n const defaultValue = getDefaultValueFor(defs[key]!, object)\n\n // normalize query value to a simple string / null / undefined\n const string = (Array.isArray(query[key]) ? query[key][0] : query[key])\n\n // empty strings, nulls, undefined will be mapped to defaults\n if (def.type === String) {\n const value = string || defaultValue\n if (object[key] !== value) object[key] = value\n continue\n }\n\n // numbers will be parsed *if* there is a value (a string longer than zero\n // and \"NaN\"s will be mapped to the default value (basically, ignored)\n if (def.type === Number) {\n let value = string ? Number(string) : defaultValue\n if ((typeof value !== 'number') || isNaN(value)) value = defaultValue\n if (object[key] !== value) object[key] = value\n continue\n }\n\n // booleans are represented (normally) with a single 't' or 'f', but\n // we also accept the shorter '?value&' in the query and the router\n // represents this value with \"null\" (not \"undefined\")\n if (def.type === Boolean) {\n const value = string === null ? true : // \"?value&\"\n string === 'true' ? true : // \"?value=t&\"\n string === 't' ? true : // \"?value=true&\"\n string === 'false' ? false : // \"?value=f&\"\n string === 'f' ? false : // \"?value=false&\"\n (defaultValue || false) // anything else is default\n if (object[key] !== value) object[key] = value\n continue\n }\n }\n }, { immediate: true })\n\n // watch for changes in our object and update the route query\n watch(object, (object) => {\n // get the *current* query (we'll retain extra parameters)\n const query: LocationQuery = { ...router.currentRoute.value.query }\n let modified = false\n\n // update the query with values from our object\n for (const [ key, def ] of Object.entries(defs)) {\n if (! def.useRoute) continue // skip anyhting not bound to the route\n\n // get the default value for the current definition\n const defaultValue = getDefaultValueFor(defs[key]!, object)\n\n // this is what we'll be pushing to (or pulling from) the query\n let value: string | null | undefined\n\n // strings or numbers are converted to strings, empty strings, nulls and\n // undefineds are omitted, and the default value is also omitted\n if ((def.type === String) || (def.type === Number)) {\n value = object[key] === defaultValue ? undefined : // default values are omitted\n object[key] === '' ? undefined : // empty strings (but not zeroes!!!) are omitted\n object[key] === undefined ? undefined : // undefineds are omitted\n object[key] === null ? undefined : // nulls are omitted\n String(object[key]) // everything else is converted to string\n } else if (def.type === Boolean) {\n value = object[key] === defaultValue ? undefined : // default values are omitted\n object[key] ? null : 'f' // true is \"null\" (short form), false is \"f\"\n }\n\n // if the value is *exactly* the same as the query, we can skip\n if (value === query[key]) continue\n\n // delete or replace/add the query value and mark for modifications\n if (value === undefined) delete query[key]\n else query[key] = value\n modified = true\n }\n\n // replace the query in the router if we modified anything\n if (modified) router.replace({ query })\n }, { immediate: true })\n\n // done!\n return object as Reactive<InferDefs<T>>\n}\n\n// ===== TABLE STATE ===========================================================\n\n/** Table state definition */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nconst tableStateDefs = () => ({\n\n // remember, \"q\" needs to go _before_ \"sort\" and \"desc\" by default, so that\n // its value from the query can be used to set/reset the sort and order\n\n /** The optional free-text search to send alongside our query */\n q: { type: String, default: '', isFilter: true },\n\n // sort and desc go *after* q, so that q can affect their value\n\n /** The column to sort results on */\n sort: { type: String, isFilter: true, default: undefined as ZQueryReactiveDefault<string> },\n /** The order for sorting (`true` for descending) */\n desc: { type: Boolean, isFilter: true, default: undefined as ZQueryReactiveDefault<boolean> },\n\n // the rest of the properties can be in any order\n\n /** A flag indicating if deleted records should be included in the response */\n deleted: { type: Boolean, default: false, isFilter: true },\n /** The offset of the first result to return */\n offset: { type: Number, default: 0 },\n /** The maximum number of results to return */\n limit: { type: Number, default: 1 },\n /** The current reload count */\n reload: { type: Number, default: 0, useRoute: false },\n\n} satisfies { [ k: string ]: ZQueryReactiveDef & { isFilter?: boolean } })\n\n/** Type from our `tableStateDefs` function above */\ntype TableStateDefs = ReturnType<typeof tableStateDefs>\n\n/**\n * Create a reactive `TableState` optionally bound to the router's query.\n *\n * Because of the way `q` (text search) interacts with sorting, the object\n * returned will _always_ expose a `q` property, and will reset the `sort`\n * and `desc` values to `undefined` and `false` (respectively) when `q` is\n * set, to their respective defaults when it's empty.\n *\n * To preserve a specific ordering via `sort` and `desc` even when `q` is\n * set, you can override the default values by providing an _extra_ definition\n * for `sort` and/or `desc` when creating the bound table state.\n *\n * The `reload` property is a reactive number that can be used to force a\n * reload of the table data (just increment it!).\n *\n * The options object can include the following:\n * * `length` - the number of results to show per page\n * * `sort` - the _initial_ sort column\n * * `desc` - the _initial_ descending sort order\n * * `extra` - additional properties to include in the object\n * * `useRoute` - whether to bind the object to the router query\n */\nexport function createBoundTableState<T extends {\n [ k: string ]: ZQueryReactiveDef & { isFilter?: boolean } // add \"isFilter\"\n} = {}>(options: {\n length: number,\n sort?: string,\n desc?: boolean,\n extra?: T,\n useRoute?: boolean,\n}): Reactive<InferDefs<T & TableStateDefs>> {\n const { length, sort, desc = false, extra = {}, useRoute = false } = options\n\n // definitions from basic above and include any extra properties\n const defs = { ...tableStateDefs(), ...extra }\n // adjust limit, if length is sensible...\n if (length > 0) defs.limit.default = length + 1\n\n // infer the default sort if not overridden in extra... this basically tells\n // us to sort by the default column if there's no search query, but in case\n // we *want* to sort by a column even in case of searches, then we can simply\n // override the search definition as part of \"extra\".\n if (defs.sort.default === undefined) {\n defs.sort.default = (state) => {\n if (state.q) return undefined // if we have a search, we don't sort\n return sort // otherwise we sort by the default column\n }\n }\n\n // infer the default order when the sort column matches the one passed to\n // `createBoundTableState`... we can always override the behavior by\n // adding a \"desc\" entry as an extra definition in the options.\n if (defs.desc.default === undefined) {\n defs.desc.default = (state) => {\n if (state.sort === sort) return desc // if the column matches, we keep the order\n return false // by default we sort in ascending order\n }\n }\n\n // create the reactive object and bind it to the router query\n const state = createBoundObject(defs, useRoute)\n\n // when \"q\" changes, we reset the sort column and order to their defaults\n // and it'll be up to the default function to check q and decide what to do...\n // also this is a non-immediate watch, as upon creations defaults will be\n // looked\n watch(() => state.q, () => {\n state.sort = getDefaultValueFor(defs.sort, state) as string\n state.desc = getDefaultValueFor(defs.desc, state) as boolean\n }) // not immediate... defaults will processed by create and potentially\n // overridden by th, { immediate: true })\n\n // we need to track filters here, so that we can reset offset on changes\n for (const [ key, def ] of Object.entries(defs)) {\n if ('isFilter' in def && def.isFilter) {\n watch(() => (state as any)[key], () => state.offset = 0)\n }\n }\n\n // done!\n return state as any\n}\n","import { Dialog, Quasar } from 'quasar'\nimport iconSet from 'quasar/icon-set/material-symbols-rounded'\n\n/* Buttons */\nimport ZBtnDropdown from './buttons/btn-dropdown.vue'\nimport ZBtnGroup from './buttons/btn-group.vue'\nimport ZBtn from './buttons/btn.vue'\n/* Controls */\nimport ZControlDeleted from './controls/deleted.vue'\nimport ZControlDropdown from './controls/dropdown.vue'\nimport ZControlReload from './controls/reload.vue'\nimport ZControlSearch from './controls/search.vue'\nimport ZControlSwitch from './controls/switch.vue'\nimport ZControlToggle from './controls/toggle.vue'\n/* Dialogs */\nimport ZConfirmDialog from './dialogs/confirm.vue'\nimport ZDialog from './dialogs/dialog.vue'\nimport ZProgressDialog from './dialogs/progress.vue'\n/* Forms */\nimport ZFormHelper from './forms/form-helper.vue'\nimport ZForm from './forms/form.vue'\nimport ZInputGroup from './forms/input-group.vue'\n/* Inputs */\nimport ZAddress from './inputs/address.vue'\nimport ZAutocomplete from './inputs/autocomplete.vue'\nimport ZCountry from './inputs/country.vue'\nimport ZDateRange from './inputs/date-range.vue'\nimport ZDate from './inputs/date.vue'\nimport ZEan13 from './inputs/ean13.vue'\nimport ZLabel from './inputs/label.vue'\nimport ZNullableNumber from './inputs/nullable-number.vue'\nimport ZNumber from './inputs/number.vue'\nimport ZPassword from './inputs/password.vue'\nimport ZPicker from './inputs/picker.vue'\nimport ZSelect from './inputs/select.vue'\nimport ZString from './inputs/string.vue'\nimport ZTags from './inputs/tags.vue'\nimport ZTelephone from './inputs/telephone.vue'\nimport ZText from './inputs/text.vue'\n/* Objects */\nimport ZHeader from './objects/object-header.vue'\nimport ZObjectNew from './objects/object-new.vue'\nimport ZObject from './objects/object.vue'\n/* Others */\nimport ZTable from './table/table.vue'\nimport ZTag from './tag.vue'\n/* Local styles */\nimport './controls/zstyle.pcss'\nimport './inputs/zstyle.pcss'\n\nimport type { QuasarPluginOptions } from 'quasar'\nimport type { App } from 'vue'\n\n/* ========================================================================== *\n * COMPONENT TYPES *\n * ========================================================================== */\n\n/* ===== BUTTONS ============================================================ */\n\nexport type ZBtn = InstanceType<typeof ZBtn>\nexport type ZBtnDropdown = InstanceType<typeof ZBtnDropdown>\nexport type ZBtnGroup = InstanceType<typeof ZBtnGroup>\n\n/* ===== CONTROLS =========================================================== */\n\nexport type ZControlDeleted = InstanceType<typeof ZControlDeleted>\nexport type ZControlDropdown = InstanceType<typeof ZControlDropdown>\nexport type ZControlReload = InstanceType<typeof ZControlReload>\nexport type ZControlSearch = InstanceType<typeof ZControlSearch>\nexport type ZControlSwitch = InstanceType<typeof ZControlSwitch>\nexport type ZControlToggle = InstanceType<typeof ZControlToggle>\n\n/* ===== DIALOGS ============================================================ */\n\nexport type ZConfirmDialog = InstanceType<typeof ZConfirmDialog>\nexport type ZDialog = InstanceType<typeof ZDialog>\nexport type ZProgressDialog = InstanceType<typeof ZProgressDialog>\n\n/* ===== FORMS ============================================================== */\n\nexport type ZForm = InstanceType<typeof ZForm>\nexport type ZFormHelper = InstanceType<typeof ZFormHelper>\nexport type ZInputGroup = InstanceType<typeof ZInputGroup>\n\n/* ===== INPUTS ============================================================= */\n\nexport type ZAddress = InstanceType<typeof ZAddress>\nexport type ZAutocomplete = InstanceType<typeof ZAutocomplete>\nexport type ZCountry = InstanceType<typeof ZCountry>\nexport type ZDate = InstanceType<typeof ZDate>\nexport type ZDateRange = InstanceType<typeof ZDateRange>\nexport type ZEan13 = InstanceType<typeof ZEan13>\nexport type ZLabel = InstanceType<typeof ZLabel>\nexport type ZNullableNumber = InstanceType<typeof ZNullableNumber>\nexport type ZNumber = InstanceType<typeof ZNumber>\nexport type ZPassword = InstanceType<typeof ZPassword>\nexport type ZPicker = InstanceType<typeof ZPicker>\nexport type ZSelect = InstanceType<typeof ZSelect>\nexport type ZString = InstanceType<typeof ZString>\nexport type ZTags = InstanceType<typeof ZTags>\nexport type ZText = InstanceType<typeof ZText>\nexport type ZTelephone = InstanceType<typeof ZTelephone>\n\n/* ===== OBJECTS ============================================================ */\n\nexport type ZHeader = InstanceType<typeof ZHeader>\nexport type ZObject = InstanceType<typeof ZObject>\nexport type ZObjectNew = InstanceType<typeof ZObjectNew>\n\n/* ===== OTHERS ============================================================= */\n\nexport type ZTable = InstanceType<typeof ZTable>\nexport type ZTag = InstanceType<typeof ZTag>\n\n/* ========================================================================== *\n * PLUGIN *\n * ========================================================================== */\n\n/* All our types */\nexport type * from './types'\n\n/* All our assets */\nexport { icons } from './assets/icons'\nexport { translations } from './assets/translations'\n\nexport function JuitWidgets(app: App, quasarConfig: QuasarPluginOptions = {}): void {\n // Opinionated defaults:\n if (! quasarConfig.config) quasarConfig.config = {}\n if (! quasarConfig.config.loading) quasarConfig.config.loading = {}\n // - loading delay: 500ms\n if (! quasarConfig.config.loading.delay) quasarConfig.config.loading.delay = 500\n // - no ripple (unless explicitly set)\n if (! quasarConfig.config.ripple) quasarConfig.config.ripple = false\n // - we need the \"Dialog\" plugin\n if (! quasarConfig.plugins) quasarConfig.plugins = {}\n if (! quasarConfig.plugins.Dialog) quasarConfig.plugins.Dialog = Dialog\n // - force our icon set\n if (! quasarConfig.iconSet) quasarConfig.iconSet = iconSet\n\n // Configure Quasar with our opinionated defaults\n app.use(Quasar, quasarConfig)\n\n // ===== COMPONENTS ==========================================================\n\n // buttons\n app.component('ZBtn', ZBtn)\n app.component('ZBtnDropdown', ZBtnDropdown)\n app.component('ZBtnGroup', ZBtnGroup)\n // controls\n app.component('ZControlDeleted', ZControlDeleted)\n app.component('ZControlDropdown', ZControlDropdown)\n app.component('ZControlReload', ZControlReload)\n app.component('ZControlSearch', ZControlSearch)\n app.component('ZControlSwitch', ZControlSwitch)\n app.component('ZControlToggle', ZControlToggle)\n // dialogs\n app.component('ZConfirmDialog', ZConfirmDialog)\n app.component('ZDialog', ZDialog)\n app.component('ZProgressDialog', ZProgressDialog)\n // forms\n app.component('ZForm', ZForm)\n app.component('ZFormHelper', ZFormHelper)\n app.component('ZInputGroup', ZInputGroup)\n // inputs\n app.component('ZAddress', ZAddress)\n app.component('ZAutocomplete', ZAutocomplete)\n app.component('ZCountry', ZCountry)\n app.component('ZDate', ZDate)\n app.component('ZDateRange', ZDateRange)\n app.component('ZEan13', ZEan13)\n app.component('ZLabel', ZLabel)\n app.component('ZNullableNumber', ZNullableNumber)\n app.component('ZNumber', ZNumber)\n app.component('ZPassword', ZPassword)\n app.component('ZPicker', ZPicker)\n app.component('ZSelect', ZSelect)\n app.component('ZString', ZString)\n app.component('ZTags', ZTags)\n app.component('ZText', ZText)\n app.component('ZTelephone', ZTelephone)\n // objects\n app.component('ZHeader', ZHeader)\n app.component('ZObject', ZObject)\n app.component('ZObjectNew', ZObjectNew)\n // others\n app.component('ZTable', ZTable)\n app.component('ZTag', ZTag)\n}\n\n/* ========================================================================== *\n * COMPOSABLES *\n * ========================================================================== */\n\nexport * from './composition/dialogs'\nexport * from './composition/validators'\n\n/* ========================================================================== *\n * EXTRAS *\n * ========================================================================== */\n\n/* Form stuff */\nexport * from './utils/form'\n/* Listicle stuff */\nexport * from './utils/listicle'\n/* Loader stuff */\nexport * from './utils/loader'\n/* Tables stuff */\nexport * from './utils/tables'\n/* Location query management */\nexport * from './utils/query'\n"],"names":["_useSlots","_openBlock","_createBlock","_unref","_mergeProps","$attrs","disable","color","textColor","flat","_renderSlot","label","_createElementBlock","_Fragment","tooltip","shrink","$q","editable","state","_useModel","ZFormHelper","readonly","bottomSlots","disabled","lazyRules","_withCtx","_createVNode","_normalizeClass","ZControlToggle","$t","email","regexp","maxLength","minLength","required","maximum","minimum","_hoisted_1","formProps","_hoisted_2","_createElementVNode","_hoisted_3","_toDisplayString","_hoisted_4","ZString","ZBtnGroup","_renderList","ZInputGroup","_a","_createTextVNode","miss","ZAutocomplete","ZSelect","ZNullableNumber","_normalizeStyle","country","_hoisted_7","_hoisted_9","JPageHeader","ZForm","JConfirmDialog","JProgressDialog","progress","$n","ZObjectHeader","_hoisted_5","_hoisted_6","ZListicle","$d","length","page","selected","selection","optional","props","TableHeader","onRowClick","onRowDblclick","onRowContextmenu","TableFooterPagination","TableFooterFullScreen","TableFooterColumns","TableFooterRows","object","ZControlDeleted","ZControlDropdown","ZControlReload","ZControlSearch","ZConfirmDialog","ZProgressDialog","ZCountry","ZDate","ZDateRange","ZEan13","ZNumber","ZPassword","ZPicker","ZTags","ZTelephone","ZObjectNew"],"mappings":"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","x_google_ignoreList":[0]}
|