{"version":3,"file":"kotti-ui.cjs","sources":["../source/kotti-accordion/types.ts","../source/kotti-actionbar/types.ts","../source/zod-utilities/enums.ts","../source/kotti-avatar/types.ts","../source/zod-utilities/refinements.ts","../source/kotti-avatar-group/types.ts","../source/kotti-banner/types.ts","../source/kotti-breadcrumb/types.ts","../source/kotti-button/types.ts","../source/kotti-card/types.ts","../source/kotti-comment/utilities.ts","../source/kotti-comment/types.ts","../source/kotti-drawer/types.ts","../source/kotti-field/constants.ts","../source/kotti-field/types.ts","../source/kotti-field-currency/types.ts","../source/kotti-field-date/constants.ts","../source/kotti-field-date/types.ts","../source/kotti-field-file-upload/types.ts","../source/kotti-field-inline-edit/types.ts","../source/kotti-field-number/types.ts","../source/kotti-field-password/types.ts","../source/kotti-field-radio-group/types.ts","../source/kotti-field-select/types.ts","../source/kotti-field-text-area/types.ts","../source/kotti-field-text/types.ts","../source/kotti-field-toggle/types.ts","../source/kotti-file-upload/types.ts","../source/kotti-filters/types.ts","../source/kotti-heading/types.ts","../source/kotti-line/types.ts","../source/kotti-modal/types.ts","../source/kotti-navbar/types.ts","../source/kotti-pagination/types.ts","../source/kotti-popover/types.ts","../source/kotti-row/types.ts","../source/kotti-table-legacy/types.ts","../source/kotti-table/standard-table/types.ts","../source/kotti-table/table/types.ts","../source/kotti-tag/types.ts","../source/kotti-toaster/types.ts","../source/kotti-user-menu/types.ts","../source/kotti-value-label/types.ts","../source/types/decimal-separator.ts","../source/types/kotti.ts","../source/utilities.ts","../source/make-props.ts","../source/kotti-accordion/hooks.ts","../source/kotti-accordion/KtAccordion.vue","../source/kotti-accordion/index.ts","../source/kotti-actionbar/components/ActionbarMenu.vue","../source/kotti-actionbar/KtActionbar.vue","../source/kotti-actionbar/index.ts","../source/constants.ts","../source/kotti-avatar/KtAvatar.vue","../source/kotti-avatar/index.ts","../source/kotti-avatar-group/KtAvatarGroup.vue","../source/kotti-avatar-group/index.ts","../source/kotti-button/KtButton.vue","../source/kotti-button/components/ActionsItem.vue","../source/kotti-button/hooks/use-actions-tippy.ts","../source/kotti-button/KtSplitButton.vue","../source/kotti-button/index.ts","../source/kotti-banner/KtBanner.vue","../source/kotti-banner/index.ts","../source/kotti-breadcrumb/KtBreadcrumb.vue","../source/kotti-breadcrumb/index.ts","../source/kotti-button-group/KtButtonGroup.vue","../source/kotti-button-group/index.ts","../source/kotti-card/KtCard.vue","../source/kotti-card/index.ts","../source/kotti-row/constants.ts","../source/kotti-col/index.ts","../source/kotti-i18n/constants.ts","../source/kotti-i18n/locales/de-DE.ts","../source/kotti-i18n/locales/en-US.ts","../source/kotti-i18n/locales/es-ES.ts","../source/kotti-i18n/locales/fr-FR.ts","../source/kotti-i18n/locales/ja-JP.ts","../source/kotti-i18n/utilities.ts","../source/kotti-i18n/hooks.ts","../source/kotti-comment/components/CommentActions.vue","../source/kotti-comment/components/CommentHeader.vue","../source/kotti-comment/hooks.ts","../source/kotti-comment/components/CommentTextArea.vue","../source/kotti-comment/components/CommentInlineEdit.vue","../source/kotti-comment/components/CommentEntry.vue","../source/kotti-comment/KtCommentInput.vue","../source/kotti-comment/KtComment.vue","../source/kotti-comment/index.ts","../source/kotti-drawer/KtDrawer.vue","../source/kotti-drawer/index.ts","../source/kotti-field/components/FieldHelpText.vue","../source/kotti-form/constants.ts","../source/kotti-field/errors.ts","../source/kotti-field/hooks.ts","../source/kotti-field/KtField.vue","../source/kotti-field/index.ts","../source/kotti-field/meta.ts","../source/kotti-field-currency/constants.ts","../source/kotti-field-currency/utilities.ts","../source/kotti-field-currency/input-formatter.ts","../source/kotti-field-currency/KtFieldCurrency.vue","../source/kotti-field-currency/index.ts","../source/kotti-popover/constants.ts","../source/kotti-field-date/hooks.ts","../source/kotti-field-date/utilities.ts","../source/kotti-field-date/KtFieldDate.vue","../source/kotti-field-date/KtFieldDateRange.vue","../source/kotti-field-date/KtFieldDateTime.vue","../source/kotti-field-date/KtFieldDateTimeRange.vue","../source/kotti-field-date/index.ts","../source/kotti-field-file-upload/constants.ts","../source/kotti-field-file-upload/formatters.ts","../source/kotti-field-file-upload/utils/common.ts","../source/kotti-field-file-upload/validators.ts","../source/kotti-field-file-upload/components/DropArea.vue","../source/kotti-field-file-upload/components/ActionButton.vue","../source/kotti-field-file-upload/components/ItemLayout.vue","../source/kotti-field-file-upload/components/FileItem.vue","../source/kotti-field-file-upload/components/PreUploadedFileItem.vue","../source/kotti-modal/KtModal.vue","../source/kotti-modal/index.ts","../source/kotti-field-file-upload/components/TakePhoto/utils/common.ts","../source/kotti-field-file-upload/components/TakePhoto/utils/web-rtc.ts","../source/kotti-field-file-upload/components/TakePhoto/Capture.vue","../source/kotti-field-file-upload/components/TakePhoto/Error.vue","../source/kotti-field-file-upload/components/TakePhoto/Review.vue","../source/kotti-field-file-upload/components/TakePhoto/TakePhoto.vue","../source/kotti-field-file-upload/utils/non-remote.ts","../source/kotti-field-file-upload/KtFieldFileUpload.vue","../source/kotti-field-file-upload/components/ProgressBar.vue","../source/kotti-field-file-upload/components/FileItemRemote.vue","../source/kotti-field-file-upload/utils/remote.ts","../source/kotti-field-file-upload/KtFieldFileUploadRemote.vue","../source/kotti-field-file-upload/index.ts","../source/kotti-field-inline-edit/constants.ts","../source/kotti-field-inline-edit/components/ConfirmButton.vue","../source/kotti-field-inline-edit/components/EditIcon.vue","../source/kotti-field-inline-edit/utils.ts","../source/kotti-field-inline-edit/hooks.ts","../source/kotti-field-inline-edit/KtFieldInlineEdit.vue","../source/kotti-field-inline-edit/index.ts","../source/kotti-field-number/constants.ts","../source/kotti-field-number/utilities.ts","../source/kotti-field-number/KtFieldNumber.vue","../source/kotti-field-number/index.ts","../source/kotti-field-password/constants.ts","../source/kotti-field-password/KtFieldPassword.vue","../source/kotti-field-password/index.ts","../source/kotti-field-radio-group/constants.ts","../source/kotti-field-radio-group/KtFieldRadioGroup.vue","../source/kotti-field-radio-group/index.ts","../source/kotti-field-select/constants.ts","../source/kotti-tag/KtTag.vue","../source/kotti-tag/index.ts","../source/kotti-field-select/utils/tippy-utils.ts","../source/kotti-field-select/hooks/use-select-tippy.ts","../source/kotti-field-select/components/ActionIcon.vue","../source/kotti-field-select/components/OptionsItem.vue","../source/kotti-field-select/components/Options.vue","../source/kotti-field-select/components/GenericSelectField.vue","../source/kotti-field-select/KtFieldMultiSelect.vue","../source/kotti-field-select/KtFieldMultiSelectRemote.vue","../source/kotti-field-select/KtFieldSingleSelect.vue","../source/kotti-field-select/KtFieldSingleSelectRemote.vue","../source/kotti-field-select/index.ts","../source/kotti-field-text/constants.ts","../source/kotti-field-text/KtFieldText.vue","../source/kotti-field-text/index.ts","../source/kotti-field-text-area/constants.ts","../source/kotti-field-text-area/KtFieldTextArea.vue","../source/kotti-field-text-area/index.ts","../source/kotti-field-toggle/constants.ts","../source/shared-components/toggle-inner/ToggleBox.vue","../source/shared-components/toggle-inner/ToggleSwitch.vue","../source/shared-components/toggle-inner/ToggleInner.vue","../source/kotti-field-toggle/KtFieldToggle.vue","../source/kotti-field-toggle/KtFieldToggleGroup.vue","../source/kotti-field-toggle/index.ts","../source/kotti-file-upload/components/UploadedFileItem.vue","../source/kotti-file-upload/utilities.ts","../source/kotti-file-upload/KtFileUpload.vue","../source/kotti-file-upload/index.ts","../source/kotti-filters/components/ButtonLink.vue","../source/kotti-filters/components/FilterActions.vue","../source/kotti-filters/utils.ts","../source/kotti-form/errors.ts","../source/kotti-form/utilities.ts","../source/kotti-form/KtForm.vue","../source/kotti-form/index.ts","../source/kotti-filters/components/FilterRow.vue","../source/kotti-filters/components/FilterList.vue","../source/kotti-filters/components/FilterSearch.vue","../source/kotti-filters/validators.ts","../source/kotti-filters/KtFilters.vue","../source/kotti-filters/index.ts","../source/kotti-form-controller-list/components/FormControllerListItem.vue","../source/kotti-form-controller-list/KtFormControllerList.vue","../source/kotti-form-controller-list/index.ts","../source/kotti-form-controller-object/KtFormControllerObject.vue","../source/kotti-form-controller-object/index.ts","../source/kotti-form-submit/errors.ts","../source/kotti-form-submit/KtFormSubmit.vue","../source/kotti-form-submit/index.ts","../source/kotti-heading/KtHeading.vue","../source/kotti-heading/index.ts","../source/kotti-i18n/KtI18nContext.ts","../source/kotti-i18n/index.ts","../source/kotti-line/KtLine.vue","../source/kotti-line/index.ts","../source/kotti-navbar/components/NavbarTooltip.vue","../source/kotti-navbar/components/NavbarLogo.vue","../source/kotti-navbar/components/NavbarMenu.vue","../source/kotti-navbar/components/NavbarNotification.vue","../source/kotti-navbar/components/NavbarQuickLink.vue","../source/kotti-navbar/constants.ts","../source/kotti-navbar/KtNavbar.vue","../source/kotti-navbar/index.ts","../source/kotti-pagination/components/PaginationExpanded.vue","../source/kotti-pagination/components/PaginationFlexible.vue","../source/kotti-pagination/components/PaginationFractionated.vue","../source/kotti-pagination/KtPagination.vue","../source/kotti-pagination/index.ts","../source/kotti-popover/components/IconTextItem.vue","../source/kotti-popover/KtPopover.vue","../source/kotti-popover/index.ts","../source/kotti-row/index.ts","../source/kotti-table/standard-table/components/Columns.vue","../source/kotti-table/standard-table/utilities/filters.ts","../source/kotti-table/standard-table/components/filters/Boolean.vue","../source/kotti-table/standard-table/utilities/date.ts","../source/kotti-table/standard-table/components/filters/DateRange.vue","../source/kotti-table/standard-table/components/filters/MultiSelect.vue","../source/kotti-table/standard-table/components/filters/NumberRange.vue","../source/kotti-table/standard-table/components/filters/SingleSelect.vue","../source/kotti-table/standard-table/components/FilterList.vue","../source/kotti-table/standard-table/components/Filters.vue","../source/kotti-table/standard-table/utilities/translation.ts","../source/kotti-table/standard-table/components/GlobalSelection.vue","../source/kotti-table/standard-table/components/PageSize.vue","../source/kotti-table/standard-table/components/Pagination.vue","../source/kotti-table/standard-table/components/Search.vue","../source/kotti-table/standard-table/context.ts","../source/kotti-table/table/context.ts","../source/kotti-table/KtStandardTable.vue","../source/kotti-table/table/tanstack-table/index.ts","../source/kotti-table/table/use-computed-ref.ts","../source/kotti-table/table/hooks.ts","../source/kotti-table/table/row.ts","../source/kotti-table/KtTable.vue","../source/kotti-table/standard-table/simple-hash.ts","../source/kotti-table/standard-table/storage.ts","../source/kotti-table/standard-table/hooks.ts","../source/kotti-table/table/column-helper.ts","../source/kotti-table/table/local.ts","../source/kotti-table/index.ts","../source/kotti-table-legacy/constants.ts","../source/kotti-table-legacy/components/TableBodyEmptyRow.ts","../source/kotti-table-legacy/components/TableBodyExpandRow.ts","../source/kotti-table-legacy/components/TableBodyLoadingRow.ts","../source/kotti-table-legacy/components/TableRowCell.ts","../source/kotti-table-legacy/components/TableRow.ts","../source/kotti-table-legacy/components/TableBody.ts","../source/kotti-table-legacy/components/TableHeaderCell.ts","../source/kotti-table-legacy/components/TableHeader.vue","../source/kotti-table-legacy/KtTableLegacyColumn.ts","../source/kotti-table-legacy/logic/filter.ts","../source/kotti-table-legacy/logic/hide.ts","../source/kotti-table-legacy/logic/order.ts","../source/kotti-table-legacy/logic/sort.ts","../source/kotti-table-legacy/logic/column.ts","../source/kotti-table-legacy/logic/disable.ts","../source/kotti-table-legacy/logic/expand.ts","../source/kotti-table-legacy/logic/select.ts","../source/kotti-table-legacy/logic/row.ts","../source/kotti-table-legacy/logic/store.ts","../source/kotti-table-legacy/KtTableLegacy.vue","../source/kotti-table-legacy/mixins.ts","../source/kotti-table-legacy/KtTableLegacyConsumer.ts","../source/kotti-table-legacy/KtTableLegacyProvider.ts","../source/kotti-table-legacy/index.ts","../source/kotti-toaster/context.ts","../source/kotti-toaster/KtToast.vue","../source/kotti-toaster/KtToastProvider.vue","../source/kotti-toaster/KtToaster.vue","../source/kotti-toaster/create-deferred.ts","../source/kotti-toaster/create-toaster.ts","../source/kotti-toaster/index.ts","../source/kotti-user-menu/KtUserMenu.vue","../source/kotti-user-menu/index.ts","../source/kotti-value-label/KtValueLabel.vue","../source/kotti-value-label/index.ts","../source/index.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nexport namespace KottiAccordion {\n\texport const propsSchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\ticon: yocoIconSchema.nullable().default(null),\n\t\tisClosed: z.boolean().default(false),\n\t\ttitle: z.string(),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nexport namespace KottiActionbar {\n\texport const menuItemSchema = z.object({\n\t\tactive: z.boolean().default(false),\n\t\tdisabled: z.boolean().default(false),\n\t\ticon: yocoIconSchema,\n\t\tlabel: z.string(),\n\t\tto: z.unknown().nullable(),\n\t})\n\texport type MenuItem = z.output<typeof menuItemSchema>\n\n\texport const propsSchema = z.object({\n\t\theaderTitle: z.string().nullable().default(null),\n\t\tmenu: z.array(menuItemSchema).default(() => []),\n\t\tmenuStyle: z\n\t\t\t.object({\n\t\t\t\ticonPosition: z.enum(['left', 'right']),\n\t\t\t})\n\t\t\t.default({\n\t\t\t\ticonPosition: 'left',\n\t\t\t}),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\ntype EnumLike = {\n\t[k: string]: string\n}\n\ntype OneOrMore<T> = [T, ...T[]]\n\n/**\n * returns enum and the union of enum members\n * https://stackoverflow.com/a/77528920\n */\nexport type EnumToPrimitiveUnion<T extends EnumLike> =\n\tT extends Record<string, infer V extends string> ? `${V}` : never\n\n/**\n * Function that takes in an enum,\n * and creates a union of zod.enum and zod.nativeEnum\n *\n * To allow usage of string props rather than enum members on component props.\n * e.g. to allow `'danger'` instead of `SomeEnum.DANGER`, if needed.\n */\nexport function createLooseZodEnumSchema<E extends EnumLike>(\n\tsomeEnum: E,\n): z.ZodUnion<\n\t[z.ZodEnum<OneOrMore<EnumToPrimitiveUnion<E>>>, z.ZodNativeEnum<E>]\n> {\n\tconst enumValues = Object.values(someEnum) as OneOrMore<\n\t\tEnumToPrimitiveUnion<E>\n\t>\n\n\treturn z.union([z.enum(enumValues), z.nativeEnum(someEnum)])\n}\n","import { z } from 'zod'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiAvatar {\n\texport enum Size {\n\t\tLARGE = 'lg',\n\t\tMEDIUM = 'md',\n\t\tSMALL = 'sm',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tisHoverable: z.boolean().default(false),\n\t\tname: z.string().nullable().default(null),\n\t\tsize: createLooseZodEnumSchema(Size).default(Size.MEDIUM),\n\t\tsrc: z.string().nullable().default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import type { z } from 'zod'\n\n/**\n * Similar to z.array().nonempty(), but doesn’t alter type definitions\n *\n * We previously had issues with `.nonempty()` causing arrays generated from\n * `Array.prototype.map` to be detected as possibly empty.\n *\n * @example\n *\n * z.array(z.number()).refine(...refinementNonEmpty)\n */\nexport const refinementNonEmpty: Parameters<z.ZodArray<z.ZodAny>['refine']> = [\n\t(array: unknown[]): boolean => array.length > 0,\n\t{ message: 'array may not be empty' },\n]\n","import { z } from 'zod'\n\nimport { KottiAvatar } from '../kotti-avatar/types'\nimport { refinementNonEmpty } from '../zod-utilities/refinements'\n\nexport namespace KottiAvatarGroup {\n\t/**\n\t * same type of name and src but they are required keys on the item object schema;\n\t * removeDefault: removes the default value &\n\t * unwrap: removes the Nullable wrapper.\n\t */\n\tconst itemSchema = z.object({\n\t\tname: KottiAvatar.propsSchema.shape.name.removeDefault().unwrap(),\n\t\tsrc: KottiAvatar.propsSchema.shape.src.removeDefault().unwrap(),\n\t})\n\n\texport const propsSchema = KottiAvatar.propsSchema\n\t\t.pick({\n\t\t\tisHoverable: true,\n\t\t\tsize: true,\n\t\t})\n\t\t.extend({\n\t\t\tcount: z.number().default(2),\n\t\t\tisStack: z.boolean().default(false),\n\t\t\titems: z.array(itemSchema).refine(...refinementNonEmpty),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nexport namespace KottiBanner {\n\texport const styleSchema = z\n\t\t.object({\n\t\t\tbackgroundColor: z.string(),\n\t\t\tdarkColor: z.string(),\n\t\t\ticon: yocoIconSchema.nullable(),\n\t\t\tlightColor: z.string(),\n\t\t})\n\t\t.strict()\n\n\texport type Style = z.infer<typeof styleSchema>\n\n\texport const propsSchema = z.object({\n\t\taction: z.string().nullable().default(null),\n\t\theader: z.string().nullable().default(null),\n\t\tisCloseable: z.boolean().default(false),\n\t\ttext: z.string().nullable().default(null),\n\t\ttype: z\n\t\t\t.union([styleSchema, z.enum(['error', 'info', 'success', 'warning'])])\n\t\t\t.default('info'),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { Yoco, yocoIconSchema } from '@3yourmind/yoco'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiBreadcrumb {\n\texport enum SeparatorType {\n\t\tICON = 'icon',\n\t\tTEXT = 'text',\n\t}\n\texport const separatorTypeSchema = createLooseZodEnumSchema(SeparatorType)\n\n\texport const breadcrumbSchema = z.object({\n\t\tdataTest: z.string().nullable().default(null),\n\t\tisCompleted: z.boolean().default(false),\n\t\tisDisabled: z.boolean().default(false),\n\t\tonClick: z.function(z.tuple([]), z.void()),\n\t\ttitle: z.string(),\n\t})\n\texport type Breadcrumb = z.infer<typeof breadcrumbSchema>\n\n\texport const separatorSchema = z.union([\n\t\tz.object({\n\t\t\tstyle: z.literal(SeparatorType.ICON),\n\t\t\tvalue: yocoIconSchema,\n\t\t}),\n\t\tz.object({\n\t\t\tstyle: z.literal(SeparatorType.TEXT),\n\t\t\tvalue: z.string(),\n\t\t}),\n\t])\n\texport type Separator = z.infer<typeof separatorSchema>\n\n\texport const propsSchema = z.object({\n\t\tactiveIndex: z.number().int().nullable().default(null),\n\t\tbreadcrumbs: z.array(breadcrumbSchema),\n\t\tseparator: separatorSchema.default(\n\t\t\t() =>\n\t\t\t\t({\n\t\t\t\t\tstyle: SeparatorType.ICON,\n\t\t\t\t\tvalue: Yoco.Icon.CHEVRON_RIGHT,\n\t\t\t\t}) as const,\n\t\t),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace Shared {\n\texport enum IconPosition {\n\t\tLEFT = 'left',\n\t\tRIGHT = 'right',\n\t}\n\texport const iconPositionSchema = createLooseZodEnumSchema(IconPosition)\n\n\texport enum Size {\n\t\tLARGE = 'large',\n\t\tMEDIUM = 'medium',\n\t\tSMALL = 'small',\n\t}\n\texport const sizeSchema = createLooseZodEnumSchema(Size)\n\n\texport const propsSchema = z.object({\n\t\ticon: yocoIconSchema.nullable().default(null),\n\t\ticonPosition: iconPositionSchema.default(IconPosition.LEFT),\n\t\tisLoading: z.boolean().default(false),\n\t\tisSubmit: z.boolean().default(false),\n\t\tsize: sizeSchema.default(Size.MEDIUM),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiButton {\n\texport import IconPosition = Shared.IconPosition\n\texport import iconPositionSchema = Shared.iconPositionSchema\n\n\texport import Size = Shared.Size\n\texport import sizeSchema = Shared.sizeSchema\n\n\texport enum ToggleStatus {\n\t\tOFF = 'off',\n\t\tON = 'on',\n\t}\n\texport const toggleStatusSchema = createLooseZodEnumSchema(ToggleStatus)\n\n\texport enum Type {\n\t\tDANGER = 'danger',\n\t\tDEFAULT = 'default',\n\t\tPRIMARY = 'primary',\n\t\tSECONDARY = 'secondary',\n\t\tTEXT = 'text',\n\t}\n\texport const typeSchema = createLooseZodEnumSchema(Type)\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\thelpText: z.string().nullable().default(null),\n\t\tisBlock: z.boolean().default(false),\n\t\tisMultiline: z.boolean().default(false),\n\t\tlabel: z.string().nullable().default(null),\n\t\ttoggleStatus: toggleStatusSchema.nullable().default(null),\n\t\ttype: typeSchema.default(Type.DEFAULT),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiSplitButton {\n\texport import IconPosition = Shared.IconPosition\n\texport import iconPositionSchema = Shared.iconPositionSchema\n\n\texport import Size = Shared.Size\n\texport import sizeSchema = Shared.sizeSchema\n\n\texport enum Type {\n\t\tDEFAULT = 'default',\n\t\tPRIMARY = 'primary',\n\t}\n\texport const typeSchema = createLooseZodEnumSchema(Type)\n\n\texport const actionSchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\ticon: yocoIconSchema.nullable().default(null),\n\t\tisDisabled: z.boolean().default(false),\n\t\tlabel: z.string(),\n\t\tonClick: z.function(z.tuple([]), z.void()),\n\t})\n\texport type Action = z.output<typeof actionSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tactions: z.array(actionSchema).default(() => []),\n\t\tdataTest: z.string().optional(),\n\t\tisDisabled: z.boolean().default(false),\n\t\tlabel: z.string(),\n\t\ttype: typeSchema.default(Type.DEFAULT),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiCard {\n\texport enum ImagePosition {\n\t\tBOTTOM = 'bottom',\n\t\tMIDDLE = 'middle',\n\t\tTOP = 'top',\n\t}\n\n\texport const propsSchema = z.object({\n\t\timgPosition: createLooseZodEnumSchema(ImagePosition).default(\n\t\t\tImagePosition.TOP,\n\t\t),\n\t\timgUrl: z.string().nullable().default(null),\n\t\tisImgLoading: z.boolean().default(false),\n\t\tisTextLoading: z.boolean().default(false),\n\t\tprimaryActionDataTest: z.string().optional(),\n\t\tprimaryActionLabel: z.string().nullable().default(null),\n\t\tsecondaryActionDataTest: z.string().optional(),\n\t\tsecondaryActionLabel: z.string().nullable().default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import escape from 'lodash/escape.js'\n\nexport const defaultParser = (message: string): string => escape(message)\n\nexport const defaultPostEscapeParser = (message: string): string =>\n\tmessage.replaceAll('\\n', '</br>')\n\nexport const resizeTextarea = (textarea: HTMLTextAreaElement | null): void => {\n\ttextarea?.setAttribute('style', 'height: auto')\n\ttextarea?.setAttribute(\n\t\t'style',\n\t\t`height: ${textarea.scrollHeight.toString()}px`,\n\t)\n}\n","import { z } from 'zod'\n\nimport { defaultParser, defaultPostEscapeParser } from './utilities'\n\nconst idSchema = z.union([z.number(), z.string()])\n\nexport namespace KottiComment {\n\texport const userSchema = z.object({\n\t\tavatar: z.string().optional(),\n\t\tid: idSchema,\n\t\tname: z.string(),\n\t})\n\texport type User = z.output<typeof userSchema>\n\n\texport const commentSchema = z.object({\n\t\tcreatedAt: z.string().nullable().default(null),\n\t\tid: idSchema,\n\t\tisDeletable: z.boolean().default(false),\n\t\tisEditable: z.boolean().default(false),\n\t\tisInternal: z.boolean().default(false),\n\t\tisModified: z.boolean().default(false),\n\t\tmessage: z.string(),\n\t\tuser: userSchema,\n\t})\n\n\tconst parseFunctionSchema = z.function().args(z.string()).returns(z.string())\n\n\tconst sharedSchema = commentSchema.extend({\n\t\tallowInternal: z.boolean().default(false),\n\t\tdangerouslyOverrideParser: parseFunctionSchema.default(defaultParser),\n\t\tforceInternal: z.boolean().default(false),\n\t\tisReadOnly: z.boolean().default(false),\n\t\tpostEscapeParser: parseFunctionSchema.default(defaultPostEscapeParser),\n\t\ttabIndex: z.number().default(0),\n\t\tuserAvatar: userSchema.shape.avatar,\n\t})\n\n\texport namespace Reply {\n\t\texport const schema = commentSchema\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport const propsSchema = sharedSchema.extend({\n\t\tdataTest: z.string().optional(),\n\t\treplies: z.array(Reply.schema),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport namespace Entry {\n\t\texport const schema = sharedSchema.omit({ userAvatar: true }).extend({\n\t\t\tdataTest: z.string(),\n\t\t\tisReply: z.boolean().default(false),\n\t\t\tparentId: idSchema.optional(),\n\t\t})\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace Actions {\n\t\texport const schema = sharedSchema\n\t\t\t.pick({\n\t\t\t\tisDeletable: true,\n\t\t\t\tisEditable: true,\n\t\t\t\ttabIndex: true,\n\t\t\t})\n\t\t\t.merge(\n\t\t\t\tEntry.schema.pick({\n\t\t\t\t\tdataTest: true,\n\t\t\t\t\tisReply: true,\n\t\t\t\t}),\n\t\t\t)\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace Header {\n\t\texport const schema = commentSchema\n\t\t\t.pick({\n\t\t\t\tcreatedAt: true,\n\t\t\t\tisInternal: true,\n\t\t\t\tisModified: true,\n\t\t\t\tuser: true,\n\t\t\t})\n\t\t\t.merge(\n\t\t\t\tEntry.schema.pick({\n\t\t\t\t\tisReply: true,\n\t\t\t\t}),\n\t\t\t)\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace InlineEdit {\n\t\texport const schema = sharedSchema\n\t\t\t.pick({\n\t\t\t\tallowInternal: true,\n\t\t\t\tdangerouslyOverrideParser: true,\n\t\t\t\tid: true,\n\t\t\t\tisInternal: true,\n\t\t\t\tmessage: true,\n\t\t\t\tpostEscapeParser: true,\n\t\t\t\ttabIndex: true,\n\t\t\t})\n\t\t\t.merge(\n\t\t\t\tEntry.schema.pick({\n\t\t\t\t\tdataTest: true,\n\t\t\t\t\tisReply: true,\n\t\t\t\t\tparentId: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.extend({\n\t\t\t\tisEditing: z.boolean().default(false),\n\t\t\t})\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace TextArea {\n\t\texport const schema = InlineEdit.schema\n\t\t\t.pick({\n\t\t\t\tallowInternal: true,\n\t\t\t\tdataTest: true,\n\t\t\t\tisInternal: true,\n\t\t\t\tisReply: true,\n\t\t\t\ttabIndex: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\tautofocus: z.boolean().default(false),\n\t\t\t\tplaceholder: z.string().optional(),\n\t\t\t\tvalue: InlineEdit.schema.shape.message,\n\t\t\t})\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace Events {\n\t\texport type Add = {\n\t\t\tisInternal?: PropsInternal['isInternal']\n\t\t\tmessage: PropsInternal['message']\n\t\t\tparentId?: PropsInternal['id']\n\t\t\treplyToUserId?: PropsInternal['user']['id']\n\t\t}\n\n\t\texport type Delete = {\n\t\t\tid: PropsInternal['id']\n\t\t\tparentId?: PropsInternal['id']\n\t\t}\n\n\t\texport type Edit = {\n\t\t\tid: PropsInternal['id']\n\t\t\tisInternal?: PropsInternal['isInternal']\n\t\t\tmessage: PropsInternal['message']\n\t\t\tparentId?: PropsInternal['id']\n\t\t}\n\t}\n\n\texport type Translations = {\n\t\tcancelMessage: string\n\t\tclickToCancelLabel: string\n\t\tdeleteButton: string\n\t\teditButton: string\n\t\teditedLabel: string\n\t\tinternalLabel: string\n\t\tlockedHelpText: string\n\t\tpostButton: string\n\t\treplyButton: string\n\t\treplyToLabel: string\n\t\tunlockedHelpText: string\n\t}\n}\n\nexport namespace KottiCommentInput {\n\texport const propsSchema = KottiComment.propsSchema\n\t\t.pick({\n\t\t\tallowInternal: true,\n\t\t\tdataTest: true,\n\t\t\tforceInternal: true,\n\t\t\tisInternal: true,\n\t\t\ttabIndex: true,\n\t\t})\n\t\t.merge(\n\t\t\tKottiComment.TextArea.schema.pick({\n\t\t\t\tautofocus: true,\n\t\t\t\tplaceholder: true,\n\t\t\t}),\n\t\t)\n\t\t.merge(\n\t\t\tKottiComment.Entry.schema.pick({\n\t\t\t\tisReply: true,\n\t\t\t\tparentId: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\treplyToUserId: KottiComment.userSchema.shape.id.optional(),\n\t\t\tuserAvatar: KottiComment.userSchema.shape.avatar,\n\t\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nexport namespace KottiDrawer {\n\texport const propsSchema = z.object({\n\t\tdefaultWidth: z.string().nullable().default(null),\n\t\tdisallowCloseOutside: z.boolean().default(false),\n\t\texpandWidth: z.string().nullable().default(null),\n\t\tisWide: z.boolean().default(false),\n\t})\n\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Props = z.input<typeof propsSchema>\n}\n","/**\n * Explicitly opt-out of using formKey within a KtFormContext\n */\nexport const FORM_KEY_NONE = 'NONE'\n","import type { Ref } from 'vue'\nimport { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nimport type { ReplaceRecordType } from '../types/utilities'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nimport { FORM_KEY_NONE } from './constants'\n\nexport namespace KottiField {\n\texport enum Size {\n\t\tLARGE = 'large',\n\t\tMEDIUM = 'medium',\n\t\tSMALL = 'small',\n\t}\n\n\texport namespace Validation {\n\t\texport const emptySchema = z.object({\n\t\t\ttype: z.literal('empty'),\n\t\t})\n\t\texport type Empty = z.output<typeof emptySchema>\n\n\t\texport const errorSchema = z.object({\n\t\t\ttext: z.string().nullable(),\n\t\t\ttype: z.literal('error'),\n\t\t})\n\t\texport type Error = z.output<typeof errorSchema>\n\n\t\texport const successSchema = z.object({\n\t\t\ttext: z.string().nullable(),\n\t\t\ttype: z.literal('success'),\n\t\t})\n\t\texport type Success = z.output<typeof successSchema>\n\n\t\texport const warningSchema = z.object({\n\t\t\ttext: z.string().nullable(),\n\t\t\ttype: z.literal('warning'),\n\t\t})\n\t\texport type Warning = z.output<typeof warningSchema>\n\n\t\texport const resultSchema = z.union([\n\t\t\temptySchema,\n\t\t\terrorSchema,\n\t\t\tsuccessSchema,\n\t\t\twarningSchema,\n\t\t])\n\t\texport type Result = z.output<typeof resultSchema>\n\n\t\texport const functionSchema = z\n\t\t\t.function()\n\t\t\t.args(z.any())\n\t\t\t.returns(resultSchema)\n\t\texport type Function = z.output<typeof functionSchema>\n\t}\n\n\texport namespace Hook {\n\t\texport interface Parameters<DATA_TYPE> {\n\t\t\temit: (name: 'input', ...args: unknown[]) => void\n\n\t\t\t/**\n\t\t\t * Useful for checking validation on required fields\n\t\t\t */\n\t\t\tisEmpty: (value: DATA_TYPE) => boolean\n\t\t\tprops: KottiField.PropsInternal\n\t\t\tsupports: KottiField.Supports\n\t\t}\n\n\t\texport type Returns<DATA_TYPE> = Pick<\n\t\t\tKottiField.PropsInternal,\n\t\t\t| 'helpDescription'\n\t\t\t| 'helpText'\n\t\t\t| 'hideClear'\n\t\t\t| 'hideValidation'\n\t\t\t| 'isBorderless'\n\t\t\t| 'isDisabled'\n\t\t\t| 'isLoading'\n\t\t\t| 'isOptional'\n\t\t\t| 'label'\n\t\t\t| 'leftIcon'\n\t\t\t| 'prefix'\n\t\t\t| 'rightIcon'\n\t\t\t| 'showVisibilityToggle'\n\t\t\t| 'size'\n\t\t\t| 'suffix'\n\t\t> & {\n\t\t\tcurrentValue: DATA_TYPE\n\t\t\tinputProps: Readonly<{\n\t\t\t\t/**\n\t\t\t\t * Native HTML Props should have lowercase keys\n\t\t\t\t */\n\t\t\t\t'data-test': string\n\t\t\t\tdisabled: boolean\n\t\t\t\tid: string\n\t\t\t\ttabindex: number\n\t\t\t}>\n\t\t\tisEmpty: boolean\n\t\t\tsetValue(newValue: DATA_TYPE, options?: { forceUpdate: boolean }): void\n\t\t\tvalidation: Readonly<KottiField.Validation.Result>\n\t\t}\n\n\t\texport type ReturnsWithRefs<DATA_TYPE> = {\n\t\t\t[KEY in keyof Returns<DATA_TYPE>]: Ref<Returns<DATA_TYPE>[KEY]>\n\t\t}\n\t}\n\n\texport enum AutoComplete {\n\t\tOFF = 'off',\n\t\tON = 'on',\n\t}\n\n\t/**\n\t * Each attribute on KottiField.Supports maps to one or more\n\t * KtField prop, as follows:\n\t * {\n\t * \tclear: ['hideClear']\n\t * \tdecoration: ['leftIcon', 'rightIcon', 'prefix', 'suffix']\n\t * \ttabIndex: ['tabIndex']\n\t * \tplaceholder: ['placeholder']\n\t * }\n\t *\n\t * The schema is only concerned with props that would have the same type,\n\t * if extended (e.g. decoration props).\n\t * Therefore, doesn't include `placeholder` since it is extended\n\t * differently per field.\n\t */\n\texport const potentiallySupportedPropsSchema = z.object({\n\t\tautoComplete: z\n\t\t\t.union([\n\t\t\t\tz.literal(AutoComplete.ON),\n\t\t\t\tz.literal(AutoComplete.OFF),\n\t\t\t\tz.string(),\n\t\t\t])\n\t\t\t.default(AutoComplete.OFF),\n\t\thideClear: z.boolean().default(false),\n\t\tisBorderless: z.boolean().default(false),\n\t\tleftIcon: yocoIconSchema.nullable().default(null),\n\t\tprefix: z.string().nullable().default(null),\n\t\trightIcon: yocoIconSchema.nullable().default(null),\n\t\tshowVisibilityToggle: z.boolean().default(false),\n\t\tsuffix: z.string().nullable().default(null),\n\t\ttabIndex: z.number().default(0),\n\t})\n\n\t/**\n\t * Includes, but is not limited to, properties that are not consumed by the KtForm itself,\n\t * but rather just passed-down to all fields inside the form to make common\n\t * tasks like disabling the entire form or hiding validation easier.\n\t *\n\t * These values can be explicitly overriden in the field usage\n\t */\n\texport const inheritablePropsSchema = z.object({\n\t\t/**\n\t\t * Is the field disabled?\n\t\t * This will e.g. prevent changing the value\n\t\t */\n\t\tisDisabled: z.boolean().default(false),\n\n\t\t/**\n\t\t * Show a skeleton in place of the input area of the field\n\t\t */\n\t\tisLoading: z.boolean().default(false),\n\n\t\t/**\n\t\t * Should the user have the option to clear the field\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it\n\t\t */\n\t\thideClear: z.never(),\n\n\t\t/**\n\t\t * Prevents the validation (e.g. color, text) from being shown\n\t\t */\n\t\thideValidation: z.boolean().default(false),\n\t\tshowVisibilityToggle: z.boolean().default(false),\n\n\t\t/**\n\t\t * Defines the size of the field which influences child styles\n\t\t * to make fields e.g. appear more compact\n\t\t */\n\t\tsize: createLooseZodEnumSchema(Size).nullable().default(null),\n\t})\n\n\texport type InheritableProps = z.input<typeof inheritablePropsSchema>\n\t/**\n\t * Warning: All values of type `never` are replaced with `any`\n\t */\n\texport type InheritablePropsInternal = ReplaceRecordType<\n\t\tz.output<typeof inheritablePropsSchema>\n\t>\n\n\texport const propsSchema = inheritablePropsSchema.extend({\n\t\t/**\n\t\t * Is the field borderless when not interacted with?\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it.\n\t\t */\n\t\tisBorderless: z.never(),\n\n\t\t/**\n\t\t * Is used as the 'data-test' property\n\t\t * on the input level\n\t\t */\n\t\tdataTest: z.string().nullable().default(null),\n\n\t\t/**\n\t\t * Specifies that the data KtFormContext[formKey]\n\t\t * If formKey is \"NONE\", it is treated as an explicit opt-out\n\t\t * of the context-based behavior\n\t\t */\n\t\tformKey: z\n\t\t\t.union([z.string(), z.literal(FORM_KEY_NONE)])\n\t\t\t.nullable()\n\t\t\t.default(null),\n\n\t\t/**\n\t\t * Adds a small questionmark popover to the label to explain\n\t\t * more complicated forms to the user on-demand\n\t\t */\n\t\thelpDescription: z.string().nullable().default(null),\n\t\t/**\n\t\t * Adds a description below the label\n\t\t */\n\t\thelpText: z.string().nullable().default(null),\n\n\t\t/**\n\t\t * Shows a Yoco icon on the left side of the field\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it.\n\t\t */\n\t\tleftIcon: z.never(),\n\n\t\t/**\n\t\t * Shown when no value was entered yet\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it\n\t\t *\n\t\t * The overridden type may differ\n\t\t * e.g. KtFieldDateRange needs two placeholders `[string | null, string | null]`\n\t\t */\n\t\tplaceholder: z.never(),\n\n\t\t/**\n\t\t * Shows a Yoco icon on the right side of the field\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it\n\t\t */\n\t\tisOptional: z.boolean().default(false),\n\n\t\tlabel: z.string().nullable().default(null),\n\n\t\trightIcon: z.never(),\n\n\t\t/**\n\t\t * Show some an eye icon on the right side of the field to hide/show the field content\n\t\t *\n\t\t * This is false by default and is meant to be used for KtFieldPassword\n\t\t */\n\t\tshowVisibilityToggle: z.boolean().default(false),\n\t\t/**\n\t\t * Show some string before the field\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it\n\t\t */\n\t\tprefix: z.never(),\n\n\t\t/**\n\t\t * Show some string after the field\n\t\t *\n\t\t * This is never by default and specified by component schemas that need it\n\t\t */\n\t\tsuffix: z.never(),\n\n\t\t/**\n\t\t * This is never by default and specified by component schemas that need it\n\t\t */\n\t\ttabIndex: z.never(),\n\n\t\t/**\n\t\t * Without a validator, everything will always default to being valid\n\t\t */\n\t\tvalidator: KottiField.Validation.functionSchema.default(() => ({\n\t\t\ttype: 'empty',\n\t\t})),\n\n\t\t/**\n\t\t * This is never, and specified by each component's schema\n\t\t * v-model value\n\t\t */\n\t\tvalue: z.never(),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\t/**\n\t * Warning: All keys of type `never` are replaced with `any`\n\t */\n\texport type PropsInternal = ReplaceRecordType<z.output<typeof propsSchema>>\n\n\t/**\n\t * Object that explicitly specifies which of the KtField.Props are\n\t * supported, since it may not always make sense to have some of\n\t * the props on certain fields.\n\t */\n\texport type Supports = {\n\t\t/**\n\t\t * All fields except KtFieldToggle (checkbox), KtFieldRadioGroup (radio), KtFieldFileUpload,\n\t\t * and KtFieldDate[Range|Time|TimeRange]\n\t\t */\n\t\tautoComplete: boolean\n\n\t\t/**\n\t\t * All fields except KtFieldToggle/KtFieldToggleGroup (checkbox), KtFieldRadioGroup (radio),\n\t\t * and KtFieldFileUpload\n\t\t */\n\t\tborderless: boolean\n\n\t\t/**\n\t\t * In some fields, having a clear button would be nonsensical (e.g. KtFieldToggle)\n\t\t */\n\t\tclear: boolean\n\n\t\t/**\n\t\t * Affects all decoration properties like icons and affixes.\n\t\t * These aren’t supported on e.g. the KtFieldToggleGroup\n\t\t */\n\t\tdecoration: boolean\n\n\t\t/**\n\t\t * Some components don’t have a well-defined place to put placeholders\n\t\t */\n\t\tplaceholder: boolean\n\n\t\t/**\n\t\t * Some third-party components do not support passing a custom tabIndex\n\t\t */\n\t\ttabIndex: boolean\n\t}\n\n\texport type Translations = {\n\t\toptionalLabel: string\n\t\trequiredMessage: string\n\t}\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nexport namespace KottiFieldCurrency {\n\tconst VALUE_PROP_REGEX = /^-?(0?|([1-9]\\d*))?(\\.\\d+)?$/\n\texport const valueSchema = z.string().regex(VALUE_PROP_REGEX).nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\tautoComplete: true,\n\t\t\t\tisBorderless: true,\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tcurrency: z.string(),\n\t\t\tmaximum: z.number().nullable().default(null),\n\t\t\tminimum: z.number().nullable().default(null),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { Dashes } from '@metatypes/typography'\n\nimport type { KottiField } from '../kotti-field/types'\n\nconst EL_SHARED_INTERNAL_PROPS = {\n\teditable: true,\n}\n\nexport const EL_DATE_RANGE_PROPS = {\n\trangeSeparator: Dashes.EnDash,\n}\n\nexport const EL_DATE_PROPS = {\n\t...EL_SHARED_INTERNAL_PROPS,\n\tformat: 'yyyy-MM-dd',\n\tvalueFormat: 'yyyy-MM-dd',\n}\n\nexport const EL_DATE_TIME_PROPS = {\n\t...EL_SHARED_INTERNAL_PROPS,\n\tformat: 'yyyy-MM-dd HH:mm',\n\tvalueFormat: 'yyyy-MM-dd HH:mm:ss',\n}\n\n/**\n * ISO8601\n */\nexport const DATE_FORMAT_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/\n/**\n * ISO8601 time without `T`\n */\nexport const DATE_TIME_FORMAT_REGEX = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}(:\\d{2})?$/\n\nexport const KOTTI_FIELD_DATE_SUPPORTS: KottiField.Supports = {\n\tautoComplete: false,\n\tborderless: true,\n\tclear: true,\n\tdecoration: false,\n\tplaceholder: true,\n\ttabIndex: false,\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nimport { DATE_FORMAT_REGEX, DATE_TIME_FORMAT_REGEX } from './constants'\n\nexport namespace Shared {\n\texport const dateShortcutSchema = z.object({\n\t\tkeepOpen: z.boolean().optional(),\n\t\tlabel: z.string(),\n\t\tvalue: z.never(), // overridden per date*-field\n\t})\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\thideClear: true,\n\t\t\t\tisBorderless: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tmaximumDate: z\n\t\t\t\t.union([\n\t\t\t\t\tz.string().regex(DATE_FORMAT_REGEX),\n\t\t\t\t\tz.string().regex(DATE_TIME_FORMAT_REGEX),\n\t\t\t\t])\n\t\t\t\t.nullable()\n\t\t\t\t.default(null),\n\t\t\tminimumDate: z\n\t\t\t\t.union([\n\t\t\t\t\tz.string().regex(DATE_FORMAT_REGEX),\n\t\t\t\t\tz.string().regex(DATE_TIME_FORMAT_REGEX),\n\t\t\t\t])\n\t\t\t\t.nullable()\n\t\t\t\t.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiFieldDate {\n\texport const valueSchema = z.string().regex(DATE_FORMAT_REGEX).nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tplaceholder: z.string().nullable().default(null),\n\t\tshortcuts: z\n\t\t\t.array(\n\t\t\t\tShared.dateShortcutSchema.extend({\n\t\t\t\t\tvalue: z.string().regex(DATE_FORMAT_REGEX),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.default(() => []),\n\t\tvalue: valueSchema.default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiFieldDateRange {\n\texport const valueSchema = z.tuple([\n\t\tz.string().regex(DATE_FORMAT_REGEX).nullable(),\n\t\tz.string().regex(DATE_FORMAT_REGEX).nullable(),\n\t])\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tplaceholder: z\n\t\t\t.tuple([z.string().nullable(), z.string().nullable()])\n\t\t\t.default((): [null, null] => [null, null]),\n\t\tshortcuts: z\n\t\t\t.array(\n\t\t\t\tShared.dateShortcutSchema.extend({\n\t\t\t\t\tvalue: z.tuple([\n\t\t\t\t\t\tz.string().regex(DATE_FORMAT_REGEX),\n\t\t\t\t\t\tz.string().regex(DATE_FORMAT_REGEX),\n\t\t\t\t\t]),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.default(() => []),\n\t\tvalue: valueSchema.default((): [null, null] => [null, null]),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiFieldDateTime {\n\texport const valueSchema = z.string().regex(DATE_TIME_FORMAT_REGEX).nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tplaceholder: z.string().nullable().default(null),\n\t\tshortcuts: z\n\t\t\t.array(\n\t\t\t\tShared.dateShortcutSchema.extend({\n\t\t\t\t\tvalue: z.string().regex(DATE_TIME_FORMAT_REGEX),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.default(() => []),\n\t\tvalue: valueSchema.default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiFieldDateTimeRange {\n\texport const valueSchema = z.tuple([\n\t\tz.string().regex(DATE_TIME_FORMAT_REGEX).nullable(),\n\t\tz.string().regex(DATE_TIME_FORMAT_REGEX).nullable(),\n\t])\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tplaceholder: z\n\t\t\t.tuple([z.string().nullable(), z.string().nullable()])\n\t\t\t.default((): [null, null] => [null, null]),\n\t\tshortcuts: z\n\t\t\t.array(\n\t\t\t\tShared.dateShortcutSchema.extend({\n\t\t\t\t\tvalue: z.tuple([\n\t\t\t\t\t\tz.string().regex(DATE_TIME_FORMAT_REGEX),\n\t\t\t\t\t\tz.string().regex(DATE_TIME_FORMAT_REGEX),\n\t\t\t\t\t]),\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.default(() => []),\n\t\tvalue: valueSchema.default((): [null, null] => [null, null]),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { Yoco, yocoIconSchema } from '@3yourmind/yoco'\n\nimport { KottiField } from '../kotti-field/types'\nimport type { EnumToPrimitiveUnion } from '../zod-utilities/enums'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace Shared {\n\texport enum Validation {\n\t\tINVALID_EXTENSION = 'INVALID_EXTENSION',\n\t\tMAX_SIZE_EXCEEDED = 'MAX_SIZE_EXCEEDED',\n\t\tSUCCESS = 'SUCCESS',\n\t}\n\texport const validationSchema = z.nativeEnum(Validation)\n\n\texport const idSchema = z.union([z.number(), z.string()])\n\n\texport const fileInfoSchema = z.object({\n\t\tdownloadUrl: z.string().optional(),\n\t\tisInternal: z.boolean().optional(),\n\t\tname: z.string(),\n\t\tsize: z.number().int().min(0),\n\t\tvalidation: createLooseZodEnumSchema(Validation),\n\t\tviewUrl: z.string().optional(),\n\t})\n\texport type FileInfo = z.output<typeof fileInfoSchema>\n\n\t// New selected files\n\texport const selectedFileSchema = z.object({\n\t\tfile: z.custom<File>(),\n\t\tid: z.string(),\n\t})\n\n\t// Pre-uploaded files\n\texport const preUploadedFileSchema = z.object({\n\t\tdownloadUrl: z.string().optional(),\n\t\tid: idSchema,\n\t\tisInternal: z.boolean().optional(),\n\t\tname: z.string(),\n\t\tsize: z.number().int().min(0),\n\t\tviewUrl: z.string().optional(),\n\t})\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tallowMultiple: z.boolean().default(false),\n\t\t\tallowPhotos: z.boolean().default(false),\n\t\t\tcollapseExtensionsAfter: z\n\t\t\t\t.number()\n\t\t\t\t.int()\n\t\t\t\t.min(0)\n\t\t\t\t.default(Number.MAX_SAFE_INTEGER),\n\t\t\textensions: z.array(z.string().min(1)).default(() => []),\n\t\t\texternalUrl: z.string().nullable().default(null),\n\t\t\thideDropArea: z.boolean().default(false),\n\t\t\ticon: yocoIconSchema.default(Yoco.Icon.CLOUD_UPLOAD),\n\t\t\tmaxFileSize: z.number().int().min(0).default(Number.MAX_SAFE_INTEGER),\n\t\t})\n\n\texport namespace Events {\n\t\texport type AddFiles = Array<File>\n\n\t\texport type RemoveFile = z.infer<typeof idSchema>\n\t}\n\n\texport namespace ActionButton {\n\t\texport const schema = propsSchema\n\t\t\t.pick({\n\t\t\t\tisDisabled: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\ticon: yocoIconSchema,\n\t\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace DropArea {\n\t\texport const schema = propsSchema\n\t\t\t.pick({\n\t\t\t\tallowMultiple: true,\n\t\t\t\tcollapseExtensionsAfter: true,\n\t\t\t\tdataTest: true,\n\t\t\t\textensions: true,\n\t\t\t\texternalUrl: true,\n\t\t\t\thideDropArea: true,\n\t\t\t\ticon: true,\n\t\t\t\tisDisabled: true,\n\t\t\t\tisLoading: true,\n\t\t\t\tmaxFileSize: true,\n\t\t\t\ttabIndex: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\tinputId: z.string(),\n\t\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace FileItem {\n\t\texport const schema = propsSchema.pick({\n\t\t\tdataTest: true,\n\t\t\textensions: true,\n\t\t\tisDisabled: true,\n\t\t\tmaxFileSize: true,\n\t\t})\n\t}\n\n\texport namespace TakePhoto {\n\t\texport const schema = propsSchema.pick({\n\t\t\tdataTest: true,\n\t\t\tisDisabled: true,\n\t\t\ttabIndex: true,\n\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\n\t\texport const captureSchema = schema.pick({\n\t\t\tdataTest: true,\n\t\t})\n\t\texport type CaptureProps = z.output<typeof captureSchema>\n\n\t\texport const reviewSchema = captureSchema.extend({\n\t\t\tphotoUrl: z.string().nullable().default(null),\n\t\t})\n\t\texport type ReviewProps = z.output<typeof reviewSchema>\n\n\t\texport const errorSchema = captureSchema.extend({\n\t\t\terror: z.string().nullable().default(null),\n\t\t})\n\t\texport type ErrorProps = z.output<typeof errorSchema>\n\n\t\texport namespace Events {\n\t\t\texport type Capture = {\n\t\t\t\tfile: File\n\t\t\t\tphotoUrl: string\n\t\t\t}\n\n\t\t\texport type Error = string\n\t\t}\n\t}\n\n\texport type Translations = {\n\t\tbutton: {\n\t\t\tacceptPhoto: string\n\t\t\tcancel: string\n\t\t\tnextCamera: string\n\t\t\trejectPhoto: string\n\t\t\tretry: string\n\t\t\ttakePhoto: string\n\t\t}\n\t\terror: {\n\t\t\tmultipleNotAllowed: string\n\t\t\tnotAllowed: string\n\t\t\tnotFound: string\n\t\t\tnotSupported: string\n\t\t}\n\t\tlabel: {\n\t\t\tcapture: string\n\t\t\terror: string\n\t\t\tinternal: string\n\t\t\treview: string\n\t\t\tunknown: string\n\t\t}\n\t\tstatusMsg: {\n\t\t\tCANCELED: string\n\t\t\tERROR: string\n\t\t\tHIDDEN: string\n\t\t\tINVALID: string\n\t\t\tNOT_STARTED: string\n\t\t\tREADY_TO_UPLOAD: string\n\t\t\tUPLOADED: string\n\t\t\tUPLOADED_WITH_ERROR: string\n\t\t\tUPLOADING: string\n\t\t}\n\t\ttext: {\n\t\t\tclickToUpload: string\n\t\t\tdragAndDrop: string\n\t\t\tlearnMore: string\n\t\t\tmax: string\n\t\t}\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: string\n\t\t\tMAX_SIZE_EXCEEDED: string\n\t\t}\n\t}\n}\n\nexport namespace KottiFieldFileUpload {\n\texport enum Status {\n\t\tINVALID = 'INVALID',\n\t\tNOT_STARTED = 'NOT_STARTED',\n\t\tREADY_TO_UPLOAD = 'READY_TO_UPLOAD',\n\t\tUPLOADED = 'UPLOADED',\n\t\tUPLOADED_WITH_ERROR = 'UPLOADED_WITH_ERROR',\n\t}\n\texport const statusSchema = createLooseZodEnumSchema(Status)\n\n\texport const selectedFileSchema = Shared.selectedFileSchema.extend({\n\t\tstatus: statusSchema,\n\t})\n\texport type SelectedFile = z.input<typeof selectedFileSchema>\n\n\texport const preUploadedFileSchema = Shared.preUploadedFileSchema.extend({\n\t\tstatus: statusSchema.optional(),\n\t})\n\texport type PreUploadedFile = z.input<typeof preUploadedFileSchema>\n\n\texport const valueSchema = selectedFileSchema.or(preUploadedFileSchema)\n\texport const valuesSchema = valueSchema.array()\n\texport type Value = z.input<typeof valuesSchema>\n\texport type ValueInternal = z.output<typeof valuesSchema>\n\n\texport const fileInfoSchema = Shared.fileInfoSchema.extend({\n\t\tid: Shared.idSchema,\n\t\tstatus: statusSchema,\n\t})\n\texport type FileInfo = z.output<typeof fileInfoSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tvalue: valuesSchema.default(() => []),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport namespace Events {\n\t\texport type SetStatus = {\n\t\t\tid: z.infer<typeof Shared.idSchema>\n\t\t\tstatus: EnumToPrimitiveUnion<typeof Status> | Status\n\t\t}\n\t}\n\n\texport namespace FileItem {\n\t\texport const schema = z.object({\n\t\t\tdataTest: Shared.propsSchema.shape.dataTest,\n\t\t\tfileInfo: fileInfoSchema,\n\t\t\tisDisabled: Shared.propsSchema.shape.isDisabled,\n\t\t})\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n}\n\nexport namespace KottiFieldFileUploadRemote {\n\texport enum Status {\n\t\tCANCELED = 'CANCELED',\n\t\tERROR = 'ERROR',\n\t\tHIDDEN = 'HIDDEN',\n\t\tINVALID = 'INVALID',\n\t\tNOT_STARTED = 'NOT_STARTED',\n\t\tUPLOADED = 'UPLOADED',\n\t\tUPLOADED_WITH_ERROR = 'UPLOADED_WITH_ERROR',\n\t\tUPLOADING = 'UPLOADING',\n\t}\n\texport const statusSchema = createLooseZodEnumSchema(Status)\n\n\texport const selectedFileSchema = Shared.selectedFileSchema.extend({\n\t\tstatus: statusSchema,\n\t})\n\texport type SelectedFile = z.input<typeof selectedFileSchema>\n\n\texport const preUploadedFileSchema = Shared.preUploadedFileSchema.extend({\n\t\tstatus: statusSchema.optional(),\n\t})\n\texport type PreUploadedFile = z.input<typeof preUploadedFileSchema>\n\n\texport const valueSchema = selectedFileSchema.or(preUploadedFileSchema)\n\texport const valuesSchema = valueSchema.array()\n\n\texport type Value = z.input<typeof valuesSchema>\n\texport type ValueInternal = z.output<typeof valuesSchema>\n\n\texport const fileInfoSchema = Shared.fileInfoSchema.extend({\n\t\tid: Shared.idSchema,\n\t\tprogress: z.number().min(0).max(1).optional(),\n\t\tstatus: statusSchema,\n\t})\n\texport type FileInfo = z.output<typeof fileInfoSchema>\n\n\texport const actionsSchema = z.object({\n\t\tonCancel: z.function().args(Shared.idSchema).returns(z.void()),\n\t\tonDelete: z.function().args(Shared.idSchema).returns(z.void()),\n\t\tonRetry: z.function().args(Shared.idSchema).returns(z.void()),\n\t\tonUpload: z.function().args(Shared.idSchema).returns(z.void()),\n\t})\n\texport type Actions = z.output<typeof actionsSchema>\n\n\texport const payloadEntrySchema = z.object({\n\t\tprogress: z.number().min(0).max(1).default(0),\n\t\tstatus: z\n\t\t\t.enum([\n\t\t\t\tStatus.CANCELED,\n\t\t\t\tStatus.ERROR,\n\t\t\t\tStatus.HIDDEN,\n\t\t\t\tStatus.UPLOADED,\n\t\t\t\tStatus.UPLOADING,\n\t\t\t])\n\t\t\t.default(Status.UPLOADING),\n\t})\n\t// Record Key is the File Item ID\n\texport const payloadSchema = z.record(payloadEntrySchema)\n\texport type Payload = z.output<typeof payloadSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tactions: actionsSchema,\n\t\tpayload: payloadSchema,\n\t\tvalue: valuesSchema.default(() => []),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport namespace Events {\n\t\texport type SetStatus = {\n\t\t\tid: z.infer<typeof Shared.idSchema>\n\t\t\tstatus: EnumToPrimitiveUnion<typeof Status> | Status\n\t\t}\n\t}\n\n\texport namespace FileItem {\n\t\texport const schema = Shared.propsSchema.extend({\n\t\t\tactions: actionsSchema,\n\t\t\tfileInfo: fileInfoSchema,\n\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace ProgressBar {\n\t\texport const schema = payloadEntrySchema\n\t\t\t.pick({\n\t\t\t\tprogress: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\tisError: z.boolean().default(false),\n\t\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiFieldInlineEdit {\n\texport const valueSchema = z.string().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport enum ConfirmationValidation {\n\t\tERROR = 'error',\n\t\tNEVER = 'never',\n\t\tWARNING = 'warning',\n\t}\n\n\texport enum TextStyle {\n\t\tHEADER_ONE = 'h1',\n\t\tHEADER_THREE = 'h3',\n\t\tHEADER_TWO = 'h2',\n\t}\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\tautoComplete: true,\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tisMultiline: z.boolean().default(false),\n\t\t\tisReadonly: z.boolean().default(false),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\tpreventConfirmationOn: createLooseZodEnumSchema(\n\t\t\t\tConfirmationValidation,\n\t\t\t).default(ConfirmationValidation.NEVER),\n\t\t\ttextStyle: createLooseZodEnumSchema(TextStyle).nullable().default(null),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport namespace Events {\n\t\texport type Confirm = KottiFieldInlineEdit.Value\n\t}\n\n\texport type Translations = {\n\t\tplaceholder: string\n\t}\n}\n\nexport type FieldInlineEditElement = HTMLInputElement | HTMLTextAreaElement\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiFieldNumber {\n\texport const valueSchema = z.number().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport enum Align {\n\t\tLEFT = 'left',\n\t\tRIGHT = 'right',\n\t}\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\tautoComplete: true,\n\t\t\t\tisBorderless: true,\n\t\t\t\tleftIcon: true,\n\t\t\t\tprefix: true,\n\t\t\t\trightIcon: true,\n\t\t\t\tsuffix: true,\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\talign: createLooseZodEnumSchema(Align).default(Align.LEFT),\n\t\t\t// eslint-disable-next-line no-magic-numbers\n\t\t\tdecimalPlaces: z.number().default(3),\n\t\t\thideChangeButtons: z.boolean().default(false),\n\t\t\thideMaximum: z.boolean().default(false),\n\t\t\tmaximum: z.number().nullable().default(null),\n\t\t\tminimum: z.number().nullable().default(null),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\tstep: z.number().min(0).default(1),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiFieldPassword {\n\texport const valueSchema = z.string().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport enum AutoComplete {\n\t\tCURRENT = 'current-password',\n\t\tNEW = 'new-password',\n\t\tONE_TIME_CODE = 'one-time-code',\n\t}\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.omit({ autoComplete: true }),\n\t\t)\n\t\t.extend({\n\t\t\tautoComplete: createLooseZodEnumSchema(AutoComplete),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\tshowVisibilityToggle: z.boolean().default(false),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\nimport { refinementNonEmpty } from '../zod-utilities/refinements'\n\nexport namespace KottiFieldRadioGroup {\n\texport const valueSchema = z\n\t\t.union([z.string(), z.number(), z.boolean()])\n\t\t.nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const entrySchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\tisDisabled: z.boolean().optional(),\n\t\tlabel: z.string(),\n\t\ttooltip: z.string().optional(),\n\t\tvalue: valueSchema,\n\t})\n\texport type Entry = z.output<typeof entrySchema>\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(KottiField.potentiallySupportedPropsSchema.pick({ tabIndex: true }))\n\t\t.extend({\n\t\t\tisInline: z.boolean().default(false),\n\t\t\toptions: z\n\t\t\t\t.array(entrySchema)\n\t\t\t\t.refine(...refinementNonEmpty)\n\t\t\t\t.refine(\n\t\t\t\t\t(options) =>\n\t\t\t\t\t\tnew Set(options.map(({ value }) => value)).size === options.length,\n\t\t\t\t\t{ message: 'options need to be unique by `value`' },\n\t\t\t\t),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nexport namespace Shared {\n\texport const valueSchema = z\n\t\t.union([z.boolean(), z.number(), z.string()])\n\t\t.nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const optionSchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\tisDisabled: z.boolean().optional(),\n\t\tlabel: z.string(),\n\t\tvalue: valueSchema,\n\t})\n\texport type Option = z.output<typeof optionSchema>\n\n\texport const actionSchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\tlabel: z.string(),\n\t\tonClick: z.function(z.tuple([]), z.void()),\n\t})\n\texport type Action = z.output<typeof actionSchema>\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(KottiField.potentiallySupportedPropsSchema)\n\t\t.extend({\n\t\t\tactions: z.array(actionSchema).default(() => []),\n\t\t\tisUnsorted: z.boolean().default(false),\n\t\t\toptions: z.array(optionSchema),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t})\n\n\texport const isMultipleSchema = z.object({\n\t\tclearOnSelect: z.boolean().default(false),\n\t\tcollapseTagsAfter: z.number().int().min(0).default(Number.MAX_SAFE_INTEGER),\n\t\tmaximumSelectable: z.number().int().min(0).default(Number.MAX_SAFE_INTEGER),\n\t\tvalue: z.array(Shared.valueSchema).default(() => []),\n\t})\n\n\texport const isRemoteSchema = z.object({\n\t\tisLoadingOptions: z.boolean().default(false),\n\t\tquery: z.string().nullable().default(null),\n\t})\n\n\texport const isSingleSchema = z.object({\n\t\tvalue: Shared.valueSchema.default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = {\n\t\tloadingText: string\n\t\tnoDataText: string\n\t\tnoMatchText: string\n\t\tplaceholder: string\n\t}\n}\n\nexport namespace KottiFieldMultiSelect {\n\texport const valueSchema = Shared.isMultipleSchema.shape.value._def.innerType\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.merge(Shared.isMultipleSchema)\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = Shared.Translations\n}\n\nexport namespace KottiFieldMultiSelectRemote {\n\texport const valueSchema = Shared.isMultipleSchema.shape.value._def.innerType\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema\n\t\t.merge(Shared.isMultipleSchema)\n\t\t.merge(Shared.isRemoteSchema)\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = Shared.Translations\n\n\texport namespace Events {\n\t\texport type UpdateQuery = KottiFieldMultiSelectRemote.Props['query']\n\t}\n}\n\nexport namespace KottiFieldSingleSelect {\n\texport const valueSchema = Shared.valueSchema\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.merge(Shared.isSingleSchema)\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = Shared.Translations\n}\n\nexport namespace KottiFieldSingleSelectRemote {\n\texport const valueSchema = Shared.valueSchema\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema\n\t\t.merge(Shared.isSingleSchema)\n\t\t.merge(Shared.isRemoteSchema)\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = Shared.Translations\n\n\texport namespace Events {\n\t\texport type UpdateQuery = KottiFieldSingleSelectRemote.Props['query']\n\t}\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nexport namespace KottiFieldTextArea {\n\texport const valueSchema = z.string().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\tautoComplete: true,\n\t\t\t\tisBorderless: true,\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tautoSize: z.boolean().default(false),\n\t\t\tmaxHeight: z.number().nullable().default(null),\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\t// eslint-disable-next-line no-magic-numbers\n\t\t\trows: z.number().default(5),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nexport namespace KottiFieldText {\n\texport const valueSchema = z.string().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.merge(KottiField.potentiallySupportedPropsSchema)\n\t\t.extend({\n\t\t\tplaceholder: z.string().nullable().default(null),\n\t\t\tvalue: valueSchema.default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import type { VNode } from 'vue'\nimport { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\nimport { refinementNonEmpty } from '../zod-utilities/refinements'\n\nexport namespace KottiFieldToggle {\n\texport namespace Shared {\n\t\texport enum Type {\n\t\t\tCHECKBOX = 'checkbox',\n\t\t\tSWITCH = 'switch',\n\t\t}\n\t\texport const propsSchema = KottiField.propsSchema\n\t\t\t.merge(\n\t\t\t\tKottiField.potentiallySupportedPropsSchema.pick({ tabIndex: true }),\n\t\t\t)\n\t\t\t.extend({\n\t\t\t\ttype: createLooseZodEnumSchema(Type).default(Type.CHECKBOX),\n\t\t\t})\n\t}\n\n\texport const valueSchema = z.boolean().nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const propsSchema = Shared.propsSchema.extend({\n\t\tvalue: valueSchema.default(null),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type InnerSuffix = Pick<\n\t\tKottiField.Hook.Returns<Value>,\n\t\t'helpText' | 'hideValidation' | 'isEmpty' | 'isOptional' | 'validation'\n\t> & {\n\t\thelpTextSlot: VNode[]\n\t}\n}\n\nexport namespace KottiFieldToggleGroup {\n\texport const valueSchema = z.record(z.boolean().nullable()).nullable()\n\texport type Value = z.output<typeof valueSchema>\n\n\texport const entrySchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\tisDisabled: z.boolean().optional(),\n\t\tkey: z.string(),\n\t\tlabel: z.string(),\n\t\ttooltip: z.string().optional(),\n\t})\n\texport type Entry = z.output<typeof entrySchema>\n\n\texport const propsSchema = KottiFieldToggle.Shared.propsSchema.extend({\n\t\tisInline: z.boolean().default(false),\n\t\toptions: z\n\t\t\t.array(entrySchema)\n\t\t\t.refine(...refinementNonEmpty)\n\t\t\t.refine(\n\t\t\t\t(options) =>\n\t\t\t\t\tnew Set(options.map(({ key }) => key)).size === options.length,\n\t\t\t\t{ message: 'options need to be unique by `key`' },\n\t\t\t),\n\t\tvalue: valueSchema.default(null),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { Yoco, yocoIconSchema } from '@3yourmind/yoco'\n\nimport { KottiField } from '../kotti-field/types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiFileUpload {\n\texport enum Validation {\n\t\tINVALID_EXTENSION = 'INVALID_EXTENSION',\n\t\tMAX_SIZE_EXCEEDED = 'MAX_SIZE_EXCEEDED',\n\t\tSUCCESS = 'SUCCESS',\n\t}\n\texport const validationSchema = z.nativeEnum(Validation)\n\n\texport enum Status {\n\t\tCANCELED = 'CANCELED',\n\t\tERROR = 'ERROR',\n\t\tINVALID = 'INVALID',\n\t\tNOT_STARTED = 'NOT_STARTED',\n\t\tUPLOADED = 'UPLOADED',\n\t\tUPLOADED_WITH_ERROR = 'UPLOADED_WITH_ERROR',\n\t\tUPLOADING = 'UPLOADING',\n\t}\n\texport const statusSchema = createLooseZodEnumSchema(Status)\n\t\t.transform((status) => status as Status)\n\t\t.or(\n\t\t\tz.object({\n\t\t\t\tlabel: z.string(),\n\t\t\t\tshowProgress: z.boolean().optional(),\n\t\t\t\ttype: z.enum(['error', 'loading']),\n\t\t\t}),\n\t\t)\n\n\texport const idSchema = z.union([z.number(), z.string()])\n\n\texport const fileInfoSchema = z.object({\n\t\tdownloadUrl: z.string().optional(),\n\t\tid: idSchema,\n\t\tisInternal: z.boolean().optional(),\n\t\tname: z.string(),\n\t\tprogress: z\n\t\t\t.number()\n\t\t\t.min(0)\n\t\t\t.transform((val) => Math.max(1, val))\n\t\t\t.optional(),\n\t\tsize: z.number().int().min(0).optional(),\n\t\tstatus: statusSchema.default(Status.UPLOADED),\n\t\tvalidation: validationSchema.optional(),\n\t\tviewUrl: z.string().optional(),\n\t})\n\texport type FileInfo = z.output<typeof fileInfoSchema>\n\n\t// New selected files\n\texport const selectedFileSchema = z.object({\n\t\tfile: z.custom<File>(),\n\t\tid: z.string(),\n\t})\n\n\texport const interceptedFileSchema = z.object({\n\t\tfile: z.custom<File>(),\n\t\tid: idSchema,\n\t\tstatus: statusSchema,\n\t\tvalidation: validationSchema,\n\t})\n\n\texport type InterceptedFile = z.input<typeof interceptedFileSchema>\n\n\t// Pre-uploaded files\n\texport const preUploadedFileSchema = z.object({\n\t\tdownloadUrl: z.string().optional(),\n\t\tid: idSchema,\n\t\tisInternal: z.boolean().optional(),\n\t\tname: z.string(),\n\t\tsize: z.number().int().min(0),\n\t\tviewUrl: z.string().optional(),\n\t})\n\n\texport const uploadPropsSchema = z.object({\n\t\tallowMultiple: z.boolean().default(false),\n\t\tallowPhotos: z.boolean().default(false),\n\t\tcollapseExtensionsAfter: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(0)\n\t\t\t.default(Number.MAX_SAFE_INTEGER),\n\t\textensions: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.array()\n\t\t\t.default(() => []),\n\t\texternalUrl: z.string().nullable().default(null),\n\t\thideDropArea: z.boolean().default(false),\n\t\ticon: yocoIconSchema.default(Yoco.Icon.CLOUD_UPLOAD),\n\t\tmaxFileSize: z.number().int().min(0).default(Number.MAX_SAFE_INTEGER),\n\t\tstate: z.array(fileInfoSchema),\n\t})\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.pick({\n\t\t\tdataTest: true,\n\t\t\thelpDescription: true,\n\t\t\thelpText: true,\n\t\t\tisDisabled: true,\n\t\t\tisLoading: true,\n\t\t\tlabel: true,\n\t\t})\n\t\t.merge(\n\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\ttabIndex: true,\n\t\t\t}),\n\t\t)\n\t\t.merge(uploadPropsSchema)\n\n\texport namespace Events {\n\t\texport type AddFiles = Array<{\n\t\t\tfile: File\n\t\t\tfileInfo: FileInfo\n\t\t}>\n\n\t\texport type CancelUpload = z.infer<typeof idSchema>\n\n\t\texport type RemoveFile = z.infer<typeof idSchema>\n\n\t\texport type RestartUpload = z.infer<typeof idSchema>\n\t}\n\n\texport namespace ActionButton {\n\t\texport const schema = propsSchema\n\t\t\t.pick({\n\t\t\t\tisDisabled: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\ticon: yocoIconSchema,\n\t\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace DropArea {\n\t\texport const schema = propsSchema\n\t\t\t.pick({\n\t\t\t\tallowMultiple: true,\n\t\t\t\tcollapseExtensionsAfter: true,\n\t\t\t\tdataTest: true,\n\t\t\t\textensions: true,\n\t\t\t\texternalUrl: true,\n\t\t\t\thideDropArea: true,\n\t\t\t\ticon: true,\n\t\t\t\tisDisabled: true,\n\t\t\t\tisLoading: true,\n\t\t\t\tmaxFileSize: true,\n\t\t\t\ttabIndex: true,\n\t\t\t})\n\t\t\t.extend({\n\t\t\t\tinputId: z.string(),\n\t\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\t}\n\n\texport namespace FileItem {\n\t\texport const schema = propsSchema.pick({\n\t\t\tdataTest: true,\n\t\t\textensions: true,\n\t\t\tisDisabled: true,\n\t\t\tmaxFileSize: true,\n\t\t})\n\t}\n\n\texport namespace TakePhoto {\n\t\texport const schema = propsSchema.pick({\n\t\t\tdataTest: true,\n\t\t\tisDisabled: true,\n\t\t\ttabIndex: true,\n\t\t})\n\n\t\texport type Props = z.input<typeof schema>\n\t\texport type PropsInternal = z.output<typeof schema>\n\n\t\texport const captureSchema = schema.pick({\n\t\t\tdataTest: true,\n\t\t})\n\t\texport type CaptureProps = z.output<typeof captureSchema>\n\n\t\texport const reviewSchema = captureSchema.extend({\n\t\t\tphotoUrl: z.string().nullable().default(null),\n\t\t})\n\t\texport type ReviewProps = z.output<typeof reviewSchema>\n\n\t\texport const errorSchema = captureSchema.extend({\n\t\t\terror: z.string().nullable().default(null),\n\t\t})\n\t\texport type ErrorProps = z.output<typeof errorSchema>\n\n\t\texport namespace Events {\n\t\t\texport type Capture = {\n\t\t\t\tfile: File\n\t\t\t\tphotoUrl: string\n\t\t\t}\n\n\t\t\texport type Error = string\n\t\t}\n\t}\n\n\texport type Translations = {\n\t\tbutton: {\n\t\t\tacceptPhoto: string\n\t\t\tcancel: string\n\t\t\tnextCamera: string\n\t\t\trejectPhoto: string\n\t\t\tretry: string\n\t\t\ttakePhoto: string\n\t\t}\n\t\terror: {\n\t\t\tmultipleNotAllowed: string\n\t\t\tnotAllowed: string\n\t\t\tnotFound: string\n\t\t\tnotSupported: string\n\t\t}\n\t\tlabel: {\n\t\t\tcapture: string\n\t\t\terror: string\n\t\t\tinternal: string\n\t\t\treview: string\n\t\t\tunknown: string\n\t\t}\n\t\tstatusMsg: {\n\t\t\tCANCELED: string\n\t\t\tERROR: string\n\t\t\tHIDDEN: string\n\t\t\tINVALID: string\n\t\t\tNOT_STARTED: string\n\t\t\tREADY_TO_UPLOAD: string\n\t\t\tUPLOADED: string\n\t\t\tUPLOADED_WITH_ERROR: string\n\t\t\tUPLOADING: string\n\t\t}\n\t\ttext: {\n\t\t\tclickToUpload: string\n\t\t\tdragAndDrop: string\n\t\t\tlearnMore: string\n\t\t\tmax: string\n\t\t}\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: string\n\t\t\tMAX_SIZE_EXCEEDED: string\n\t\t}\n\t}\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import type { KottiFieldCurrency } from '../kotti-field-currency/types'\nimport type { KottiFieldDateRange } from '../kotti-field-date/types'\nimport type { KottiFieldNumber } from '../kotti-field-number/types'\nimport type {\n\tKottiFieldMultiSelect,\n\tKottiFieldSingleSelect,\n} from '../kotti-field-select/types'\nimport type { KottiFieldText } from '../kotti-field-text/types'\nimport type { KottiFieldToggle } from '../kotti-field-toggle/types'\nimport type { SpecifyRequiredProps } from '../types/utilities'\n\nexport namespace KottiFilters {\n\texport enum ButtonLinkType {\n\t\tDANGER = 'danger',\n\t\tPRIMARY = 'primary',\n\t}\n\n\texport enum FilterType {\n\t\tBOOLEAN = 'BOOLEAN',\n\t\tCURRENCY = 'CURRENCY',\n\t\tDATE_RANGE = 'DATE_RANGE',\n\t\tFLOAT = 'FLOAT',\n\t\tINTEGER = 'INTEGER',\n\t\tMULTI_ENUM = 'MULTI_ENUM',\n\t\tSEARCH = 'SEARCH',\n\t\tSINGLE_ENUM = 'SINGLE_ENUM',\n\t\tSTRING = 'STRING',\n\t}\n\n\texport namespace Operation {\n\t\texport enum Boolean {\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t}\n\n\t\texport enum Currency {\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tGREATER_THAN = 'GREATER_THAN',\n\t\t\tGREATER_THAN_OR_EQUAL = 'GREATER_THAN_OR_EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t\tLESS_THAN = 'LESS_THAN',\n\t\t\tLESS_THAN_OR_EQUAL = 'LESS_THAN_OR_EQUAL',\n\t\t}\n\n\t\texport enum DateRange {\n\t\t\tIN_RANGE = 'IN_RANGE',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t}\n\n\t\texport enum Float {\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tGREATER_THAN = 'GREATER_THAN',\n\t\t\tGREATER_THAN_OR_EQUAL = 'GREATER_THAN_OR_EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t\tLESS_THAN = 'LESS_THAN',\n\t\t\tLESS_THAN_OR_EQUAL = 'LESS_THAN_OR_EQUAL',\n\t\t}\n\n\t\texport enum Integer {\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tGREATER_THAN = 'GREATER_THAN',\n\t\t\tGREATER_THAN_OR_EQUAL = 'GREATER_THAN_OR_EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t\tLESS_THAN = 'LESS_THAN',\n\t\t\tLESS_THAN_OR_EQUAL = 'LESS_THAN_OR_EQUAL',\n\t\t}\n\n\t\texport enum MultiEnum {\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t\tONE_OF = 'ONE_OF', // OR\n\t\t}\n\n\t\texport enum Search {\n\t\t\tCONTAINS = 'CONTAINS',\n\t\t}\n\n\t\texport enum SingleEnum {\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t}\n\n\t\texport enum String {\n\t\t\tCONTAINS = 'CONTAINS',\n\t\t\tEQUAL = 'EQUAL',\n\t\t\tIS_EMPTY = 'IS_EMPTY',\n\t\t}\n\n\t\texport type Any =\n\t\t\t| Operation.Boolean\n\t\t\t| Operation.Currency\n\t\t\t| Operation.DateRange\n\t\t\t| Operation.Float\n\t\t\t| Operation.Integer\n\t\t\t| Operation.MultiEnum\n\t\t\t| Operation.Search\n\t\t\t| Operation.SingleEnum\n\t\t\t| Operation.String\n\t}\n\n\texport namespace Column {\n\t\texport type Common = {\n\t\t\tkey: string\n\t\t\tlabel: string\n\t\t}\n\n\t\texport type Boolean<\n\t\t\tOPERATION extends Operation.Boolean = Operation.Boolean,\n\t\t> = Common & {\n\t\t\toperations: OPERATION[]\n\t\t\ttype: FilterType.BOOLEAN\n\t\t}\n\n\t\texport type Currency<\n\t\t\tOPERATION extends Operation.Currency = Operation.Currency,\n\t\t> = Common & {\n\t\t\tcurrency: KottiFieldCurrency.Props['currency']\n\t\t\toperations: OPERATION[]\n\t\t\ttype: FilterType.CURRENCY\n\t\t}\n\n\t\texport type DateRange<\n\t\t\tOPERATION extends Operation.DateRange = Operation.DateRange,\n\t\t> = Common &\n\t\t\tPick<\n\t\t\t\tKottiFieldDateRange.Props,\n\t\t\t\t'maximumDate' | 'minimumDate' | 'shortcuts'\n\t\t\t> & {\n\t\t\t\toperations: OPERATION[]\n\t\t\t\ttype: FilterType.DATE_RANGE\n\t\t\t}\n\n\t\texport type Float<OPERATION extends Operation.Float = Operation.Float> =\n\t\t\tCommon &\n\t\t\t\tPick<\n\t\t\t\t\tKottiFieldNumber.Props,\n\t\t\t\t\t'decimalPlaces' | 'maximum' | 'minimum' | 'prefix' | 'step' | 'suffix'\n\t\t\t\t> & {\n\t\t\t\t\toperations: OPERATION[]\n\t\t\t\t\ttype: FilterType.FLOAT\n\t\t\t\t}\n\n\t\texport type Integer<\n\t\t\tOPERATION extends Operation.Integer = Operation.Integer,\n\t\t> = Common &\n\t\t\tPick<\n\t\t\t\tKottiFieldNumber.Props,\n\t\t\t\t'maximum' | 'minimum' | 'prefix' | 'suffix'\n\t\t\t> & {\n\t\t\t\toperations: OPERATION[]\n\t\t\t\ttype: FilterType.INTEGER\n\t\t\t}\n\n\t\texport type MultiEnum<\n\t\t\tOPERATION extends Operation.MultiEnum = Operation.MultiEnum,\n\t\t> = Common & {\n\t\t\toperations: OPERATION[]\n\t\t\toptions: KottiFieldMultiSelect.Props['options']\n\t\t\ttype: FilterType.MULTI_ENUM\n\t\t}\n\n\t\texport type Search = Common & {\n\t\t\tplaceholder?: string | null\n\t\t\ttype: FilterType.SEARCH\n\t\t}\n\n\t\texport type SingleEnum<\n\t\t\tOPERATION extends Operation.SingleEnum = Operation.SingleEnum,\n\t\t> = Common & {\n\t\t\toperations: OPERATION[]\n\t\t\toptions: KottiFieldSingleSelect.Props['options']\n\t\t\ttype: FilterType.SINGLE_ENUM\n\t\t}\n\n\t\texport type String<OPERATION extends Operation.String = Operation.String> =\n\t\t\tCommon & {\n\t\t\t\toperations: OPERATION[]\n\t\t\t\ttype: FilterType.STRING\n\t\t\t}\n\n\t\texport type Any =\n\t\t\t| Column.Boolean\n\t\t\t| Column.Currency\n\t\t\t| Column.DateRange\n\t\t\t| Column.Float\n\t\t\t| Column.Integer\n\t\t\t| Column.MultiEnum\n\t\t\t| Column.Search\n\t\t\t| Column.SingleEnum\n\t\t\t| Column.String\n\t}\n\n\texport type FilterValue =\n\t\t| KottiFieldCurrency.Value\n\t\t| KottiFieldDateRange.Value\n\t\t| KottiFieldMultiSelect.Value\n\t\t| KottiFieldNumber.Value\n\t\t| KottiFieldSingleSelect.Value\n\t\t| KottiFieldText.Value\n\t\t| KottiFieldToggle.Value\n\n\texport type InternalFilter = {\n\t\tkey: Column.Any['key']\n\t\toperation: Operation.Any\n\t\tvalue: FilterValue\n\t}\n\n\texport type InternalFilterSearch = {\n\t\tkey: Column.Search['key']\n\t\toperation: Operation.Search\n\t\tvalue: KottiFieldText.Value\n\t}\n\n\texport type Filter = SpecifyRequiredProps<\n\t\tInternalFilter,\n\t\t'key' | 'operation' | 'value'\n\t>\n\n\texport type Value = Filter[]\n\n\texport type PropsInternal = {\n\t\tcolumns: Column.Any[]\n\t\tdataTest: string | null\n\t\tisLoading: boolean\n\t\tvalue: Value\n\t}\n\n\texport type Props = SpecifyRequiredProps<PropsInternal, 'columns' | 'value'>\n\n\texport namespace Events {\n\t\texport type UpdateColumns = PropsInternal['columns']\n\n\t\texport type UpdateValue = PropsInternal['value']\n\t}\n\n\texport type Translations = {\n\t\taddFilterLabel: string\n\t\tandLabel: string\n\t\tboolean: Record<Operation.Boolean, string>\n\t\tclearAllLabel: string\n\t\tcurrency: Record<Operation.Currency, string>\n\t\tdateRange: Record<Operation.DateRange, string>\n\t\temptyListLabel: string\n\t\tfilterLabel: string\n\t\tfiltersLabel: string\n\t\tfloat: Record<Operation.Float, string>\n\t\tinteger: Record<Operation.Integer, string>\n\t\tmultiEnum: Record<Operation.MultiEnum, string>\n\t\tsearchLabel: string\n\t\tsingleEnum: Record<Operation.SingleEnum, string>\n\t\tstring: Record<Operation.String, string>\n\t\tunsetLabel: string\n\t\twhereLabel: string\n\t}\n}\n","import { z } from 'zod'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiHeading {\n\texport enum Type {\n\t\tACTION = 'action',\n\t\tTOGGLE = 'toggle',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tactionText: z.string().nullable().default(null),\n\t\ticon: createLooseZodEnumSchema(Yoco.Icon).nullable().default(null),\n\t\ttext: z.string(),\n\t\ttoggleCloseText: z.string().default('Close'),\n\t\ttoggleStatus: z.boolean().default(false),\n\t\ttoggleText: z.string().default('View'),\n\t\ttype: createLooseZodEnumSchema(Type).nullable().default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiLine {\n\texport enum Position {\n\t\tCENTER = 'center',\n\t\tLEFT = 'left',\n\t\tRIGHT = 'right',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tisInteractive: z.boolean().default(false),\n\t\tposition: createLooseZodEnumSchema(Position).default(Position.CENTER),\n\t\ttext: z.string().nullable().default(null),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nexport namespace KottiModal {\n\texport enum Size {\n\t\tEXTRA_LARGE = 'xl',\n\t\tLARGE = 'lg',\n\t\tMEDIUM = 'md',\n\t\tSMALL = 'sm',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tisOpen: z.boolean().default(false),\n\t\tpreventCloseOutside: z.boolean().default(false),\n\t\tshowCloseButton: z.boolean().default(false),\n\t\tsize: createLooseZodEnumSchema(Size).default(Size.MEDIUM),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nimport { refinementNonEmpty } from '../zod-utilities/refinements'\n\nexport namespace KottiNavbar {\n\texport type Context = {\n\t\tisNarrow: boolean\n\t\ttheme: KottiNavbar.Theme\n\t}\n\n\texport const notificationSchema = z.object({\n\t\tcount: z.number().int(),\n\t\tlink: z.string(),\n\t\ttitle: z.string(),\n\t})\n\texport type Notification = z.infer<typeof notificationSchema>\n\n\texport const quickLinkSchema = z.object({\n\t\tlink: z.string(),\n\t\ttitle: z.string(),\n\t})\n\texport type QuickLink = z.infer<typeof quickLinkSchema>\n\n\texport const sectionLinkSchema = z.object({\n\t\tcomponent: z.string().default('a'),\n\t\ticon: yocoIconSchema,\n\t\tisActive: z.boolean(),\n\t\tprops: z.record(z.unknown()).optional(),\n\t\ttitle: z.string(),\n\t})\n\texport type SectionLink = z.infer<typeof sectionLinkSchema>\n\n\texport const sectionSchema = z.object({\n\t\tlinks: z.array(sectionLinkSchema).refine(...refinementNonEmpty),\n\t\ttitle: z.string().nullable(),\n\t})\n\texport type Section = z.infer<typeof sectionSchema>\n\n\texport enum Theme {\n\t\tDARK = 'dark',\n\t\tDEFAULT = 'default',\n\t\tLIGHT = 'light',\n\t\tREVERSE = 'reverse',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tisNarrow: z.boolean().default(false),\n\t\tlogoUrl: z.string(),\n\t\tnotification: notificationSchema.nullable().default(null),\n\t\tquickLinks: z.array(quickLinkSchema).default(() => []),\n\t\tsections: z.array(sectionSchema).refine(...refinementNonEmpty),\n\t\ttheme: z.nativeEnum(Theme).default(Theme.DEFAULT),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = {\n\t\tmenuCollapse: string\n\t\tmenuExpand: string\n\t\tquickLinksTitle: string\n\t}\n}\n","import { z } from 'zod'\n\nexport namespace KottiPagination {\n\texport enum PagingStyle {\n\t\tEXPAND = 'expand',\n\t\tFLEX = 'flex',\n\t\tFRACTION = 'fraction',\n\t}\n\n\texport const propsSchema = z.object({\n\t\tadjacentAmount: z.number().default(1),\n\t\tfixedWidth: z.boolean().default(false),\n\t\tpage: z.number(),\n\t\tpageSize: z.number().default(10),\n\t\tpagingStyle: z.nativeEnum(PagingStyle).default(PagingStyle.EXPAND),\n\t\ttotal: z.number(),\n\t})\n\n\texport type PropsInternal = z.output<typeof propsSchema>\n\texport type Props = z.input<typeof propsSchema>\n}\n","import type { Instance as TippyInstance } from 'tippy.js'\nimport { z } from 'zod'\n\nimport { yocoIconSchema } from '@3yourmind/yoco'\n\nimport type { Kotti } from '../types'\nimport { createLooseZodEnumSchema } from '../zod-utilities/enums'\n\nconst baseOptionSchema = z.object({\n\tdataTest: z.string().optional(),\n\ticon: yocoIconSchema.optional(),\n\tisActive: z.boolean().default(false),\n\tisClickable: z.boolean().default(false),\n\tisDisabled: z.boolean().default(false),\n\tisOptional: z.boolean().default(false),\n\tisSelected: z.boolean().default(false),\n\tlabel: z.string(),\n\tonClick: z.function(z.tuple([]), z.void()).optional(),\n})\n\nexport namespace KottiPopover {\n\t/**\n\t * @see `@popperjs/core`\n\t */\n\texport enum Placement {\n\t\tAUTO = 'auto',\n\t\tAUTO_END = 'auto-end',\n\t\tAUTO_START = 'auto-start',\n\t\tBOTTOM = 'bottom',\n\t\tBOTTOM_END = 'bottom-end',\n\t\tBOTTOM_START = 'bottom-start',\n\t\tLEFT = 'left',\n\t\tLEFT_END = 'left-end',\n\t\tLEFT_START = 'left-start',\n\t\tRIGHT = 'right',\n\t\tRIGHT_END = 'right-end',\n\t\tRIGHT_START = 'right-start',\n\t\tTOP = 'top',\n\t\tTOP_END = 'top-end',\n\t\tTOP_START = 'top-start',\n\t}\n\n\t/* eslint-disable perfectionist/sort-enums */\n\texport enum Size {\n\t\tAUTO = 'auto',\n\t\tSMALL = 'sm',\n\t\tMEDIUM = 'md',\n\t\tLARGE = 'lg',\n\t\tEXTRA_LARGE = 'xl',\n\t}\n\t/* eslint-enable perfectionist/sort-enums */\n\n\texport enum Trigger {\n\t\t/**\n\t\t * Trigger By:\n\t\t * - mouse click\n\t\t * - tab + enter\n\t\t *\n\t\t * Untrigger By:\n\t\t * - second mouse-click\n\t\t * - second enter\n\t\t */\n\t\tCLICK = 'click',\n\t\t/**\n\t\t * Trigger By:\n\t\t * - hover\n\t\t * - tab\n\t\t *\n\t\t * Untrigger By:\n\t\t * - hover away\n\t\t * - clickaway\n\t\t * - tab away\n\t\t */\n\t\tHOVER = 'hover',\n\t\tMANUAL = 'manual',\n\t}\n\n\texport type Ref = {\n\t\tclose: TippyInstance['hide']\n\t\topen: TippyInstance['show']\n\t}\n\n\t/**\n\t * some attributes are internally inferred and therefore not picked\n\t * to be exposed on the external API.\n\t * @example `isClickable`\n\t */\n\texport const optionSchema = baseOptionSchema.pick({\n\t\tdataTest: true,\n\t\ticon: true,\n\t\tisActive: true,\n\t\tisDisabled: true,\n\t\tisOptional: true,\n\t\tisSelected: true,\n\t\tlabel: true,\n\t\tonClick: true,\n\t})\n\n\texport const propsSchema = z.object({\n\t\tareOptionsSelectable: z.boolean().default(false),\n\t\tisDisabled: z.boolean().default(false),\n\t\toptions: z.array(optionSchema).default(() => []),\n\t\tplacement: createLooseZodEnumSchema(Placement).default(Placement.AUTO),\n\t\tsize: createLooseZodEnumSchema(Size).default(Size.AUTO),\n\t\ttrigger: createLooseZodEnumSchema(Trigger).default(Trigger.CLICK),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport namespace Events {\n\t\texport type UpdateIsSelected = {\n\t\t\tindex: number\n\t\t\toption: KottiPopover.PropsInternal['options'][0]\n\t\t\tvalue: Kotti.FieldToggle.Value\n\t\t}\n\t}\n}\n\nexport namespace IconTextItem {\n\texport const propsSchema = baseOptionSchema.pick({\n\t\tdataTest: true,\n\t\ticon: true,\n\t\tisActive: true,\n\t\tisClickable: true,\n\t\tisDisabled: true,\n\t\tlabel: true,\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import type { Ref } from 'vue'\n\nimport type { SpecifyRequiredProps } from '../types/utilities'\n\nexport namespace KottiRow {\n\texport type Context = {\n\t\tgap: Readonly<Ref<number>>\n\t\tgutter: Readonly<Ref<number>>\n\t}\n\n\texport enum Align {\n\t\tBOTTOM = 'bottom',\n\t\tCENTER = 'center',\n\t\tTOP = 'top',\n\t}\n\n\texport enum Justify {\n\t\tCENTER = 'center',\n\t\tEND = 'end',\n\t\tSTART = 'start',\n\t}\n\n\texport type PropsInternal = {\n\t\talign: Align\n\t\tgap: number\n\t\tgutter: number\n\t\tjustify: Justify\n\t\ttag: string\n\t}\n\n\texport type Props = SpecifyRequiredProps<PropsInternal, never>\n}\n","/* eslint-disable perfectionist/sort-object-types */\nimport type { CreateElement, VNode, VNodeChildren } from 'vue'\n\nimport type { Store } from './logic/types'\n\nexport namespace KottiTableLegacy {\n\texport namespace Column {\n\t\texport enum Align {\n\t\t\tCENTER = 'center',\n\t\t\tLEFT = 'left',\n\t\t\tRIGHT = 'right',\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\texport const SortOrders = {\n\t\t\tASCENDING: 'ascending',\n\t\t\tDESCENDING: 'descending',\n\t\t\tNONE: null,\n\t\t} as const\n\t\texport type SortOrders = (typeof SortOrders)[keyof typeof SortOrders]\n\n\t\texport type SortBy =\n\t\t\t| (((row: Row.Props, rowIndex: number) => number | string) | string)[]\n\t\t\t| ((row: Row.Props, rowIndex: number) => number | string)\n\t\t\t| string\n\n\t\texport type SortOrder =\n\t\t\t| (typeof SortOrders)[keyof typeof SortOrders]\n\t\t\t| -1\n\t\t\t| 0\n\t\t\t| 1\n\n\t\texport type SortMethod = <T>(a: T, b: T) => number\n\n\t\texport interface Context {\n\t\t\tcolumn: Store.StateComponents.ColumnRepresentation\n\t\t\tcolumnIndex: number\n\t\t\trow: Row.Props\n\t\t\trowIndex: number\n\t\t\tvalue: unknown\n\t\t}\n\n\t\texport type Filtered = {\n\t\t\tprop: Props['prop']\n\t\t\tfilter: unknown\n\t\t}\n\n\t\texport type Hidden = {\n\t\t\tprop: Props['prop']\n\t\t\thidden: boolean\n\t\t}\n\n\t\texport type Ordered = {\n\t\t\tprop: Props['prop']\n\t\t\torder: number\n\t\t}\n\n\t\texport type Sorted = {\n\t\t\tprop: Props['prop']\n\t\t\tsortBy: SortBy\n\t\t\tsortOrder: SortOrder\n\t\t}\n\n\t\texport type Formatter = (\n\t\t\tvalue: Context['value'],\n\t\t\trow: Context['row'],\n\t\t\tcolumn: Context['column'],\n\t\t\tcolumnIndex: Context['columnIndex'],\n\t\t\trowIndex: Context['rowIndex'],\n\t\t) => unknown\n\n\t\texport type RenderCell = (h: CreateElement, data: Context) => VNodeChildren\n\n\t\texport type RenderHeader = (\n\t\t\th: CreateElement,\n\t\t\tdata: Pick<Context, 'column' | 'columnIndex' | 'value'>,\n\t\t) => VNodeChildren\n\n\t\texport type Props = {\n\t\t\tindex?: number // Unused\n\t\t\tlabel?: string\n\t\t\torder?: number\n\t\t\tprop: string\n\n\t\t\tcellClass?: Record<string, unknown> | string[] | string\n\t\t\theaderCellClass?: Record<string, unknown> | string[] | string\n\t\t\ttdClass?: Record<string, unknown> | string[] | string\n\t\t\tthClass?: Record<string, unknown> | string[] | string\n\n\t\t\talign?: Align\n\t\t\tminWidth?: string\n\t\t\tmaxWidth?: string\n\t\t\twidth?: string\n\n\t\t\thidden?: boolean\n\n\t\t\tsortBy?: SortBy\n\t\t\tsortMethod?: SortMethod\n\t\t\tsortOrder?: SortOrder\n\t\t\tsortOrders?: SortOrders[]\n\t\t\t// whether this column is sortable, string means sortOrder is remote\n\t\t\tsortable?: boolean | string\n\n\t\t\tdefault?: string\n\t\t\tdisableRowClick?: boolean\n\t\t\tformatter?: Formatter\n\t\t\trenderCell?: RenderCell\n\t\t\trenderHeader?: RenderHeader\n\t\t}\n\n\t\texport namespace Slots {\n\t\t\texport type Default = Context\n\n\t\t\texport type Header = Pick<Context, 'row' | 'rowIndex' | 'value'>\n\t\t}\n\t}\n\n\texport namespace Consumer {\n\t\texport type Props = {\n\t\t\tid: string | null\n\t\t}\n\n\t\texport namespace Slots {\n\t\t\texport type Default = {\n\t\t\t\tcolumns: Column.Props[]\n\t\t\t\tfilteredColumns: Column.Props[]\n\t\t\t\thiddenColumns: Column.Props[]\n\t\t\t\thideColumn: (column: Column.Props, toggle: boolean) => void\n\t\t\t\torderBeforeColumn: (\n\t\t\t\t\tfromColumn: Column.Props,\n\t\t\t\t\ttoColumn: Column.Props,\n\t\t\t\t) => void\n\t\t\t\tsortedColumns: Column.Props[]\n\t\t\t\tshowAllColumns: () => void\n\t\t\t\tstore: Record<string, unknown>\n\t\t\t}\n\t\t}\n\t}\n\n\texport namespace Provider {\n\t\texport type Props = KottiTableLegacy.Props\n\t}\n\n\texport namespace Row {\n\t\texport type Props = {\n\t\t\t[key: string]: unknown\n\t\t}\n\t}\n\n\texport type RowKey = ((row: Row.Props) => number | string) | string\n\n\texport type Props = {\n\t\tcolumns: Column.Props[] | null\n\t\temptyText: string\n\t\tid: string | null\n\t\trowKey?: ((row: Row.Props) => number | string) | string\n\t\trows: Row.Props[]\n\t\tuseColumnDragToOrder: boolean\n\n\t\tisInteractive: boolean\n\t\tisScrollable: boolean\n\t\tisSelectable: boolean\n\n\t\tremoteSort: boolean\n\t\tsortMultiple: boolean\n\t\tsortable: 'all' | boolean\n\t\tuseQuickSortControl: boolean\n\n\t\tfilteredColumns: Column.Filtered[] // Unused\n\t\thiddenColumns: Column.Hidden[]\n\t\torderedColumns: Column.Ordered[]\n\t\tsortedColumns: Omit<Column.Sorted, 'sortBy'>[]\n\n\t\tloading: boolean\n\n\t\theaderClass?: Record<string, unknown> | string[] | string\n\t\ttdClasses?: Record<string, unknown> | string[] | string\n\t\tthClasses?: Record<string, unknown> | string[] | string\n\t\ttrClasses?: Record<string, unknown> | string[] | string\n\n\t\trenderActions?: (\n\t\t\th: CreateElement,\n\t\t\tdata: Pick<Column.Context, 'row' | 'rowIndex'>,\n\t\t) => VNode\n\t\trenderEmpty?: () => VNode\n\t\trenderExpand?: (\n\t\t\th: CreateElement,\n\t\t\tdata: Pick<Column.Context, 'row' | 'rowIndex'>,\n\t\t) => VNode\n\t\trenderLoading?: () => VNode\n\n\t\tdisableRow: (data: Pick<Column.Context, 'row' | 'rowIndex'>) => boolean\n\n\t\texpandMultiple: boolean\n\t\tselected: Row.Props[]\n\t}\n\n\texport namespace Events {\n\t\texport type ActivateRow = {\n\t\t\trow: Row.Props\n\t\t\tindex: number\n\t\t}\n\n\t\texport type CellClick = Column.Context\n\n\t\texport type Expand = {\n\t\t\trow: Row.Props\n\t\t\tisExpanded: boolean\n\t\t}\n\n\t\texport type ExpandChange = {\n\t\t\texpanded: Row.Props[]\n\t\t}\n\n\t\texport type OrderChange = {\n\t\t\tcolumns: Column.Ordered[]\n\t\t}\n\n\t\texport type RowBlur = {\n\t\t\trow: Row.Props\n\t\t\tindex: number\n\t\t}\n\n\t\texport type RowClick = {\n\t\t\trow: Row.Props\n\t\t\tindex: number\n\t\t}\n\n\t\texport type RowFocus = {\n\t\t\trow: Row.Props\n\t\t\tindex: number\n\t\t}\n\n\t\texport type Select = {\n\t\t\tselection: Row.Props[]\n\t\t\trow: Row.Props\n\t\t}\n\n\t\texport type SelectAll = {\n\t\t\tselection: Row.Props[]\n\t\t}\n\n\t\texport type SelectionChange = {\n\t\t\tselection: Row.Props[]\n\t\t}\n\n\t\texport type SortChange = Column.Sorted & {\n\t\t\tcolumn: Column.Props\n\t\t\tsortedColumns: Column.Sorted[]\n\t\t}\n\t}\n\n\texport namespace Slots {\n\t\texport type Actions = Pick<Column.Context, 'row' | 'rowIndex' | 'value'>\n\n\t\texport type Empty = undefined\n\n\t\texport type Expand = Pick<Column.Context, 'row' | 'rowIndex' | 'value'>\n\n\t\texport type Loading = undefined\n\t}\n}\n\n/* eslint-enable perfectionist/sort-object-types */\n","import type { Ref } from 'vue'\nimport { z } from 'zod'\n\nimport { KottiFieldDateRange } from '../../kotti-field-date/types'\nimport { KottiFieldNumber } from '../../kotti-field-number/types'\nimport {\n\tKottiFieldMultiSelect,\n\tKottiFieldSingleSelect,\n} from '../../kotti-field-select/types'\nimport { KottiFieldToggle } from '../../kotti-field-toggle/types'\nimport { KottiPopover } from '../../kotti-popover/types'\nimport type { KottiTable } from '../table/types'\n\nconst DEFAULT_PAGE_SIZE = 10\n// eslint-disable-next-line no-magic-numbers\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\nconst MIN_PAGE_SIZE = 5\n\nexport type FilterInfo = Pick<\n\tKottiStandardTable.FilterInternal,\n\t'operations' | 'type'\n>\n\nexport namespace KottiStandardTable {\n\texport enum FilterType {\n\t\tBOOLEAN = 'BOOLEAN',\n\t\tDATE_RANGE = 'DATE_RANGE',\n\t\tMULTI_SELECT = 'MULTI_SELECT',\n\t\tNUMBER_RANGE = 'NUMBER_RANGE',\n\t\tSINGLE_SELECT = 'SINGLE_SELECT',\n\t}\n\texport namespace FilterOperation {\n\t\texport enum Boolean {\n\t\t\tEQUAL = 'EQUAL',\n\t\t}\n\n\t\texport enum DateRange {\n\t\t\tIN_RANGE = 'IN_RANGE',\n\t\t}\n\n\t\texport enum MultiEnum {\n\t\t\tONE_OF = 'ONE_OF', // OR\n\t\t}\n\n\t\texport enum NumberRange {\n\t\t\tIN_RANGE = 'IN_RANGE',\n\t\t}\n\n\t\texport enum SingleEnum {\n\t\t\tEQUAL = 'EQUAL',\n\t\t}\n\n\t\texport const schema = z.union([\n\t\t\tz.nativeEnum(Boolean),\n\t\t\tz.nativeEnum(DateRange),\n\t\t\tz.nativeEnum(MultiEnum),\n\t\t\tz.nativeEnum(NumberRange),\n\t\t\tz.nativeEnum(SingleEnum),\n\t\t])\n\t}\n\n\tconst sharedFilterSchema = z.object({\n\t\tdataTest: z.string().optional(),\n\t\tdisplayInline: z.boolean().default(false),\n\t\tid: z.string(),\n\t\tlabel: z.string(),\n\t})\n\n\tconst booleanFilterSchema = sharedFilterSchema.extend({\n\t\tdefaultValue: KottiFieldToggle.valueSchema.optional(),\n\t\toperations: z\n\t\t\t.nativeEnum(FilterOperation.Boolean)\n\t\t\t.array()\n\t\t\t.nonempty()\n\t\t\t.default([FilterOperation.Boolean.EQUAL]),\n\t\tslotLabels: z.tuple([z.string(), z.string()]).optional(),\n\t\ttype: z.literal(FilterType.BOOLEAN),\n\t})\n\n\tconst dateRangeFilterSchema = sharedFilterSchema.extend({\n\t\tdefaultValue: KottiFieldDateRange.valueSchema.optional(),\n\t\toperations: z\n\t\t\t.nativeEnum(FilterOperation.DateRange)\n\t\t\t.array()\n\t\t\t.nonempty()\n\t\t\t.default([FilterOperation.DateRange.IN_RANGE]),\n\t\ttype: z.literal(FilterType.DATE_RANGE),\n\t})\n\n\tconst multiSelectFilterSchema = sharedFilterSchema\n\t\t.merge(\n\t\t\tKottiFieldMultiSelect.propsSchema.pick({\n\t\t\t\tisUnsorted: true,\n\t\t\t\toptions: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tdefaultValue: KottiFieldMultiSelect.valueSchema.optional(),\n\t\t\toperations: z\n\t\t\t\t.nativeEnum(FilterOperation.MultiEnum)\n\t\t\t\t.array()\n\t\t\t\t.nonempty()\n\t\t\t\t.default([FilterOperation.MultiEnum.ONE_OF]),\n\t\t\ttype: z.literal(FilterType.MULTI_SELECT),\n\t\t})\n\n\tconst numberRangeFilterSchema = sharedFilterSchema\n\t\t.merge(\n\t\t\tKottiFieldNumber.propsSchema.pick({\n\t\t\t\tdecimalPlaces: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tdefaultValue: z\n\t\t\t\t.tuple([KottiFieldNumber.valueSchema, KottiFieldNumber.valueSchema])\n\t\t\t\t.optional(),\n\t\t\toperations: z\n\t\t\t\t.nativeEnum(FilterOperation.NumberRange)\n\t\t\t\t.array()\n\t\t\t\t.nonempty()\n\t\t\t\t.default([FilterOperation.NumberRange.IN_RANGE]),\n\t\t\ttype: z.literal(FilterType.NUMBER_RANGE),\n\t\t\tunit: KottiFieldNumber.propsSchema.shape.prefix,\n\t\t})\n\n\tconst singleSelectFilterSchema = sharedFilterSchema\n\t\t.merge(\n\t\t\tKottiFieldSingleSelect.propsSchema.pick({\n\t\t\t\tisUnsorted: true,\n\t\t\t\toptions: true,\n\t\t\t}),\n\t\t)\n\t\t.extend({\n\t\t\tdefaultValue: KottiFieldSingleSelect.valueSchema.optional(),\n\t\t\toperations: z\n\t\t\t\t.nativeEnum(FilterOperation.SingleEnum)\n\t\t\t\t.array()\n\t\t\t\t.nonempty()\n\t\t\t\t.default([FilterOperation.SingleEnum.EQUAL]),\n\t\t\ttype: z.literal(FilterType.SINGLE_SELECT),\n\t\t})\n\n\texport const filterSchema = z.discriminatedUnion('type', [\n\t\tbooleanFilterSchema,\n\t\tdateRangeFilterSchema,\n\t\tmultiSelectFilterSchema,\n\t\tnumberRangeFilterSchema,\n\t\tsingleSelectFilterSchema,\n\t])\n\texport type Filter = z.input<typeof filterSchema>\n\texport type FilterInternal = z.output<typeof filterSchema>\n\n\texport const filterValueSchema = z.union([\n\t\tKottiFieldToggle.valueSchema,\n\t\tKottiFieldDateRange.valueSchema,\n\t\tKottiFieldMultiSelect.valueSchema,\n\t\tz.tuple([KottiFieldNumber.valueSchema, KottiFieldNumber.valueSchema]),\n\t\tKottiFieldSingleSelect.valueSchema,\n\t])\n\texport type FilterValue = z.output<typeof filterValueSchema>\n\n\texport const appliedBooleanSchema = z.object({\n\t\tid: z.string(),\n\t\toperation: z.nativeEnum(FilterOperation.Boolean),\n\t\tvalue: KottiFieldToggle.valueSchema,\n\t})\n\texport const appliedDateRangeSchema = z.object({\n\t\tid: z.string(),\n\t\toperation: z.nativeEnum(FilterOperation.DateRange),\n\t\tvalue: KottiFieldDateRange.valueSchema,\n\t})\n\texport const appliedMultiEnumSchema = z.object({\n\t\tid: z.string(),\n\t\toperation: z.nativeEnum(FilterOperation.MultiEnum),\n\t\tvalue: KottiFieldMultiSelect.valueSchema,\n\t})\n\texport const appliedNumberRangeSchema = z.object({\n\t\tid: z.string(),\n\t\toperation: z.nativeEnum(FilterOperation.NumberRange),\n\t\tvalue: z.tuple([\n\t\t\tKottiFieldNumber.valueSchema,\n\t\t\tKottiFieldNumber.valueSchema,\n\t\t]),\n\t})\n\texport const appliedSingleEnumSchema = z.object({\n\t\tid: z.string(),\n\t\toperation: z.nativeEnum(FilterOperation.SingleEnum),\n\t\tvalue: KottiFieldSingleSelect.valueSchema,\n\t})\n\n\texport const appliedFilterSchema = z.union([\n\t\tappliedBooleanSchema,\n\t\tappliedDateRangeSchema,\n\t\tappliedMultiEnumSchema,\n\t\tappliedNumberRangeSchema,\n\t\tappliedSingleEnumSchema,\n\t])\n\texport type AppliedFilter = z.output<typeof appliedFilterSchema>\n\n\texport const optionsSchema = z.object({\n\t\thideControls: z\n\t\t\t.object({\n\t\t\t\tcolumns: z.boolean().default(false),\n\t\t\t\tfilters: z.boolean().default(false),\n\t\t\t\tsearch: z.boolean().default(false),\n\t\t\t})\n\t\t\t.optional(),\n\t\tpopoversSize: z\n\t\t\t.object({\n\t\t\t\tcolumns: KottiPopover.propsSchema.shape.size,\n\t\t\t\tfilters: KottiPopover.propsSchema.shape.size,\n\t\t\t})\n\t\t\t.optional(),\n\t\tsearchPlaceholder: z.string().optional(),\n\t})\n\texport type Options = z.input<typeof optionsSchema>\n\n\tconst sharedPaginationSchema = z.object({\n\t\tpageIndex: z.number().int().finite().min(0),\n\t\tpageSize: z.number().int().finite().gt(0),\n\t\tpageSizeOptions: z\n\t\t\t.array(z.number().int().finite().min(MIN_PAGE_SIZE))\n\t\t\t.refine(\n\t\t\t\t(val) =>\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tval.slice(1).every((entry, entryIndex) => entry > val[entryIndex]!),\n\t\t\t\t{\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t'Entries in pageSizeOptions must be a strictly increasing sequence',\n\t\t\t\t},\n\t\t\t),\n\t\trowCount: z.number().int().finite().min(0),\n\t})\n\n\texport const paginationSchema = z\n\t\t.discriminatedUnion('type', [\n\t\t\tz.object({\n\t\t\t\tpageSize:\n\t\t\t\t\tsharedPaginationSchema.shape.pageSize.default(DEFAULT_PAGE_SIZE),\n\t\t\t\tpageSizeOptions: sharedPaginationSchema.shape.pageSizeOptions.default(\n\t\t\t\t\t() => DEFAULT_PAGE_SIZE_OPTIONS,\n\t\t\t\t),\n\t\t\t\ttype: z.literal('local'),\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tpageSize:\n\t\t\t\t\tsharedPaginationSchema.shape.pageSize.default(DEFAULT_PAGE_SIZE),\n\t\t\t\tpageSizeOptions: sharedPaginationSchema.shape.pageSizeOptions.default(\n\t\t\t\t\t() => DEFAULT_PAGE_SIZE_OPTIONS,\n\t\t\t\t),\n\t\t\t\trowCount: sharedPaginationSchema.shape.rowCount,\n\t\t\t\ttype: z.literal('remote'),\n\t\t\t}),\n\t\t])\n\t\t.default({\n\t\t\tpageSize: DEFAULT_PAGE_SIZE,\n\t\t\tpageSizeOptions: DEFAULT_PAGE_SIZE_OPTIONS,\n\t\t\ttype: 'local',\n\t\t})\n\texport type Pagination = z.input<typeof paginationSchema>\n\n\texport const propsSchema = z.object({\n\t\temptyText: z.string().nullable().default(null),\n\t\ttableId: z.string().min(1, { message: 'Field cannot be empty' }),\n\t\ttitle: z.string().optional(),\n\t})\n\texport type Props = z.input<typeof propsSchema>\n\n\texport namespace Events {\n\t\texport type UpdateFetchData = {\n\t\t\tfilters: AppliedFilter[]\n\t\t\tordering: { id: string; value: 'ascending' | 'descending' }[]\n\t\t\tpagination: {\n\t\t\t\tpageIndex: number\n\t\t\t\tpageSize: number\n\t\t\t}\n\t\t\tsearch: string | null\n\t\t}\n\t}\n\n\texport namespace Hook {\n\t\texport type Returns<COLUMN_ID extends string> =\n\t\t\tKottiTable.Hook.Returns<COLUMN_ID> & {\n\t\t\t\tappliedFilters: Ref<AppliedFilter[]>\n\t\t\t\tpagination: Ref<{\n\t\t\t\t\tpageIndex: number\n\t\t\t\t\tpageSize: number\n\t\t\t\t}>\n\t\t\t\tsearchValue: Ref<string | null>\n\t\t\t}\n\t}\n\n\texport type Translations = {\n\t\tclearAll: string\n\t\tclearSelection: string\n\t\teditColumns: string\n\t\teditFilters: string\n\t\tendDate: string\n\t\titemsPerPage: string\n\t\tlastMonth: string\n\t\tlastWeek: string\n\t\tlastYear: string\n\t\tmax: string\n\t\tmin: string\n\t\tmoreThan: string\n\t\tresultsCounter: string\n\t\tsearch: string\n\t\tselectionCount: string\n\t\tshowAll: string\n\t\tstartDate: string\n\t\ttoday: string\n\t\tupTo: string\n\t}\n}\n","import type { RowSelectionState } from '@tanstack/table-core'\nimport type { Ref, VNode } from 'vue'\nimport { z } from 'zod'\n\nimport type { yocoIconSchema } from '@3yourmind/yoco'\n\nimport type { KottiI18n } from '../../kotti-i18n/types'\n\n/**\n * @see {@link ./hooks.ts paramsSchema}\n */\nexport type GetRowBehavior<\n\tROW extends KottiTable.AnyRow,\n\tROW_BEHAVIOR_CLICK_COMPONENT extends string = string,\n> = (params: { row: ROW; rowIndex: number }) => {\n\tactions?: {\n\t\tdataTest?: string\n\t\ticon: z.input<typeof yocoIconSchema>\n\t\tisDisabled?: boolean\n\t\tonClick: () => Promise<void> | void\n\t\ttooltip?: string\n\t}[]\n\tclasses?: string[]\n\tclick?:\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * For example for opening drawers. Should not be used for navigation. Also consider using normal link with\n\t\t\t\t * a query parameter instead.\n\t\t\t\t */\n\t\t\t\tcomponent: null\n\t\t\t\tonClick: () => Promise<void> | void\n\t\t  }\n\t\t| 'expand'\n\t\t| ({\n\t\t\t\t/**\n\t\t\t\t * This should be used in most use cases and would usually be a `router-link`\n\t\t\t\t */\n\t\t\t\tcomponent: ROW_BEHAVIOR_CLICK_COMPONENT\n\t\t\t\ton?: Record<string, unknown>\n\t\t  } & (ROW_BEHAVIOR_CLICK_COMPONENT extends 'a'\n\t\t\t\t? {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t[k: string]: unknown\n\t\t\t\t\t\t\thref: string\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t: { props?: Record<string, unknown> }))\n\tdisable?: {\n\t\tactions: boolean\n\t\tclick: boolean\n\t\texpand: boolean\n\t\tselect: boolean\n\t}\n\tid: string\n\tisLoading?: boolean\n}\n\nexport namespace KottiTable {\n\texport type Display<DATA_TYPE> = {\n\t\talign: 'center' | 'left' | 'right'\n\t\tdisableCellClick: boolean\n\t\tisNumeric: boolean\n\t\trender: (\n\t\t\tvalue: DATA_TYPE,\n\t\t\tcontext: { i18n: KottiI18n.ContextInternal },\n\t\t) => VNode | string | null\n\t\tsortBehavior: 'asc-desc' | 'desc-asc'\n\t}\n\n\t/**\n\t * This is the column passed to `useKottiTable`’s `columns`\n\t */\n\texport type Column<\n\t\tROW extends AnyRow,\n\t\tCOLUMN_ID extends string = string,\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tDATA = any,\n\t> = {\n\t\tdisplay: Display<DATA>\n\t\tgetData: (row: ROW) => DATA\n\t\tid: COLUMN_ID\n\t\tisSortable?: boolean\n\t\tlabel: string\n\t\tmaxWidth?: string\n\t\tminWidth?: string\n\t\twidth?: string\n\t}\n\n\texport type Ordering<COLUMN_ID extends string = string> = {\n\t\tid: COLUMN_ID\n\t\tvalue: 'ascending' | 'descending'\n\t}\n\n\texport type AnyRow = Record<string, unknown>\n\n\texport const propsSchema = z\n\t\t.object({\n\t\t\temptyText: z.string().nullable().default(null),\n\t\t\tisLoading: z.boolean().default(false),\n\t\t\tisNotScrollable: z.boolean().default(false),\n\t\t\ttableId: z.string(),\n\t\t})\n\t\t.strict()\n\n\texport namespace Hook {\n\t\texport type Returns<COLUMN_ID extends string> = {\n\t\t\tcolumnOrder: Ref<COLUMN_ID[]>\n\t\t\texpandedRows: Ref<Record<string, boolean>>\n\t\t\thiddenColumns: Ref<Set<COLUMN_ID>>\n\t\t\tordering: Ref<KottiTable.Ordering<COLUMN_ID>[]>\n\t\t\tselectedRows: Ref<RowSelectionState>\n\t\t}\n\t}\n\n\texport type Translations = {\n\t\tno: string\n\t\tnoItems: string\n\t\tyes: string\n\t}\n}\n","import { z } from 'zod'\n\nexport namespace KottiTag {\n\texport const propsSchema = z.object({\n\t\thideActions: z.boolean().optional().default(false),\n\t\tisDisabled: z.boolean().default(false),\n\t\tlabel: z.string().optional(),\n\t\ttext: z.string(),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiBanner } from '../kotti-banner/types'\n\nexport namespace KottiToaster {\n\texport const propsSchema = z.object({\n\t\ttoaster: z.object({\n\t\t\t_internal_pls_dont_touch: z.object({}).passthrough(),\n\t\t\tabort: z.function(),\n\t\t\tshow: z.function(),\n\t\t\twithOptions: z.function(),\n\t\t}),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n\nexport namespace KottiToast {\n\texport const propsSchema = z.object({\n\t\theader: z.string().nullable().default(null),\n\t\tprogress: z.number().int().finite().positive().nullable().default(null),\n\t\ttext: z.string().nullable().default(null),\n\t\ttype: z\n\t\t\t.union([\n\t\t\t\tKottiBanner.styleSchema,\n\t\t\t\tz.enum(['error', 'info', 'success', 'warning']),\n\t\t\t])\n\t\t\t.default('info'),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { refinementNonEmpty } from '../zod-utilities/refinements'\n\nexport namespace KottiUserMenu {\n\texport const sectionLinkSchema = z.object({\n\t\tcomponent: z.string().default('a'),\n\t\tprops: z.record(z.unknown()).optional(),\n\t\ttitle: z.string(),\n\t})\n\texport type SectionLink = z.infer<typeof sectionLinkSchema>\n\n\texport const sectionSchema = z.object({\n\t\tlinks: z.array(sectionLinkSchema).refine(...refinementNonEmpty),\n\t\ttitle: z.string().nullable(),\n\t})\n\n\texport type Section = z.infer<typeof sectionSchema>\n\n\texport const propsSchema = z.object({\n\t\tsections: z.array(sectionSchema).refine(...refinementNonEmpty),\n\t\tuserAvatar: z.string().nullable().default(null),\n\t\tuserName: z.string().nullable().default(null),\n\t\tuserStatus: z.string(),\n\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n}\n","import { z } from 'zod'\n\nimport { KottiField } from '../kotti-field/types'\n\nexport namespace KottiValueLabel {\n\texport const validationSchema = z.union([\n\t\tKottiField.Validation.errorSchema,\n\t\tKottiField.Validation.successSchema,\n\t\tKottiField.Validation.warningSchema,\n\t])\n\n\texport const propsSchema = KottiField.propsSchema\n\t\t.pick({\n\t\t\tdataTest: true,\n\t\t\thelpDescription: true,\n\t\t\thelpText: true,\n\t\t\tisLoading: true,\n\t\t\tlabel: true,\n\t\t})\n\t\t.extend({\n\t\t\tisUnset: z.boolean().default(false),\n\t\t\tvalidation: validationSchema.nullable().default(null),\n\t\t\tvalue: z.union([z.number(), z.string()]).nullable().default(null),\n\t\t})\n\n\texport type Props = z.input<typeof propsSchema>\n\texport type PropsInternal = z.output<typeof propsSchema>\n\n\texport type Translations = {\n\t\tnotSet: string\n\t}\n}\n","/**\n * @see {@link https://en.wikipedia.org/wiki/Decimal_separator#/media/File:DecimalSeparator.svg}\n */\nexport enum DecimalSeparator {\n\tARABIC_COMMA = '٫',\n\tCOMMA = ',',\n\tDOT = '.',\n}\n","/**\n * _WARNING_ avoid using `export type` as it does not support enums\n * (which most kotti types files use)\n *\n * vite build errors if a file doesn't have enums so you'd use it\n * but does not warn about the opposite scenario\n */\nimport type { ZodSchema } from 'zod'\n\nexport { KottiAccordion as Accordion } from '../kotti-accordion/types'\nexport { KottiActionbar as Actionbar } from '../kotti-actionbar/types'\nexport { KottiAvatarGroup as AvatarGroup } from '../kotti-avatar-group/types'\nexport { KottiAvatar as Avatar } from '../kotti-avatar/types'\nexport { KottiBanner as Banner } from '../kotti-banner/types'\nexport { KottiBreadcrumb as Breadcrumb } from '../kotti-breadcrumb/types'\nexport type { KottiButtonGroup as ButtonGroup } from '../kotti-button-group/types'\nexport { KottiButton as Button } from '../kotti-button/types'\nexport { KottiSplitButton as SplitButton } from '../kotti-button/types'\nexport { KottiCard as Card } from '../kotti-card/types'\nexport type { KottiCol as Col } from '../kotti-col/types'\nexport {\n\tKottiComment as Comment,\n\tKottiCommentInput as CommentInput,\n} from '../kotti-comment/types'\nexport { KottiDrawer as Drawer } from '../kotti-drawer/types'\nexport { KottiFieldCurrency as FieldCurrency } from '../kotti-field-currency/types'\nexport {\n\tKottiFieldDate as FieldDate,\n\tKottiFieldDateRange as FieldDateRange,\n\tKottiFieldDateTime as FieldDateTime,\n\tKottiFieldDateTimeRange as FieldDateTimeRange,\n} from '../kotti-field-date/types'\nexport {\n\tKottiFieldFileUpload as FieldFileUpload,\n\tKottiFieldFileUploadRemote as FieldFileUploadRemote,\n} from '../kotti-field-file-upload/types'\nexport { KottiFieldInlineEdit as FieldInlineEdit } from '../kotti-field-inline-edit/types'\nexport { KottiFieldNumber as FieldNumber } from '../kotti-field-number/types'\nexport { KottiFieldPassword as FieldPassword } from '../kotti-field-password/types'\nexport { KottiFieldRadioGroup as FieldRadioGroup } from '../kotti-field-radio-group/types'\nexport {\n\tKottiFieldMultiSelect as FieldMultiSelect,\n\tKottiFieldMultiSelectRemote as FieldMultiSelectRemote,\n\tKottiFieldSingleSelect as FieldSingleSelect,\n\tKottiFieldSingleSelectRemote as FieldSingleSelectRemote,\n} from '../kotti-field-select/types'\nexport { KottiFieldTextArea as FieldTextArea } from '../kotti-field-text-area/types'\nexport { KottiFieldText as FieldText } from '../kotti-field-text/types'\nexport {\n\tKottiFieldToggle as FieldToggle,\n\tKottiFieldToggleGroup as FieldToggleGroup,\n} from '../kotti-field-toggle/types'\nexport { KottiField as Field } from '../kotti-field/types'\nexport { KottiFileUpload as FileUpload } from '../kotti-file-upload/types'\nexport { KottiFilters as Filters } from '../kotti-filters/types'\nexport type { KottiFormControllerList as FormControllerList } from '../kotti-form-controller-list/types'\nexport type { KottiFormControllerObject as FormControllerObject } from '../kotti-form-controller-object/types'\nexport type { KottiFormSubmit as FormSubmit } from '../kotti-form-submit/types'\nexport type { KottiForm as Form } from '../kotti-form/types'\nexport { KottiHeading as Heading } from '../kotti-heading/types'\nexport type { KottiI18n as I18n } from '../kotti-i18n/types'\nexport { KottiLine as Line } from '../kotti-line/types'\nexport { KottiModal as Modal } from '../kotti-modal/types'\nexport { KottiNavbar as Navbar } from '../kotti-navbar/types'\nexport { KottiPagination as Pagination } from '../kotti-pagination/types'\nexport { KottiPopover as Popover } from '../kotti-popover/types'\nexport { KottiRow as Row } from '../kotti-row/types'\nexport { KottiTableLegacy as TableLegacy } from '../kotti-table-legacy/types'\nexport { KottiStandardTable as StandardTable } from '../kotti-table/standard-table/types'\nexport { KottiTable as Table } from '../kotti-table/table/types'\nexport { KottiTag as Tag } from '../kotti-tag/types'\nexport {\n\tKottiToast as Toast,\n\tKottiToaster as Toaster,\n} from '../kotti-toaster/types'\nexport { KottiUserMenu as UserMenu } from '../kotti-user-menu/types'\nexport { KottiValueLabel as ValueLabel } from '../kotti-value-label/types'\nexport * from './decimal-separator'\nexport * from './typed-emit'\n\nexport enum MetaDesignType {\n\tFIGMA = 'FIGMA',\n}\n\nexport type Meta = {\n\taddedVersion: string | null\n\tcomponentFolder?: string\n\tdeprecated: {\n\t\talternatives: string[]\n\t\treason: string\n\t\tversion: string\n\t} | null\n\tdesigns:\n\t\t| Array<{\n\t\t\t\ttitle: string\n\t\t\t\ttype: MetaDesignType\n\t\t\t\turl: string\n\t\t  }>\n\t\t| {\n\t\t\t\ttype: MetaDesignType\n\t\t\t\turl: string\n\t\t  }\n\t\t| null\n\tslots: Record<\n\t\tstring,\n\t\t{\n\t\t\tdescription: string | null\n\t\t\tscope: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\tdescription: string | null\n\t\t\t\t\ttype: 'float' | 'function' | 'integer' | 'object' | 'string'\n\t\t\t\t}\n\t\t\t> | null\n\t\t}\n\t>\n\ttypeScript: {\n\t\tnamespace: string\n\t\tschema: ZodSchema<unknown> | null\n\t} | null\n}\n","import type { ComponentPublicInstanceConstructor } from 'vue/types/v3-component-public-instance'\nimport type { Vue as _Vue } from 'vue/types/vue'\n\nimport type { Kotti } from './types'\nimport { DecimalSeparator } from './types/decimal-separator'\n\n/**\n * Takes a Vue Component and assigns a meta object which\n * describes various properties of the component\n */\nexport const attachMeta = <C extends ComponentPublicInstanceConstructor, T>(\n\tcomponent: C,\n\tmeta: Kotti.Meta,\n\tother?: T,\n): C & { meta: Kotti.Meta & T } =>\n\tObject.assign(component, { meta: Object.assign({}, meta, other) })\n\n/**\n * Checks if the given HTML element, or any of its children, is in focus\n * @param element The HTML element\n */\nexport const isInFocus = (element: HTMLElement | null): boolean =>\n\tdocument.activeElement instanceof HTMLElement &&\n\t(document.activeElement === element ||\n\t\t(element?.contains(document.activeElement) ?? false))\n\n/**\n * Triggers blur() on the given HTML element if it, or any of its children, is in focus\n * @param element The HTML element\n */\nexport const blurElement = (element: HTMLElement | null): void => {\n\tif (document.activeElement instanceof HTMLElement && isInFocus(element))\n\t\tdocument.activeElement.blur()\n}\n/**\n * Checks if the given HTML element or Vue component is/contains the specified event target\n * @param component The HTML element or Vue component\n * @param eventTarget The target of the event being checked\n *\n * This function doesn't work if the event target is (inside) an SVG Element\n * {@link https://web.archive.org/web/20231208174614/https://gomakethings.com/detecting-click-events-on-svgs-with-vanilla-js-event-delegation/}\n */\nexport const isOrContainsEventTarget = (\n\tcomponent: HTMLElement | { $el: HTMLElement } | null,\n\teventTarget: EventTarget | null,\n): boolean => {\n\tif (component === null) return false\n\tconst element = '$el' in component ? component.$el : component\n\n\treturn (\n\t\telement === eventTarget ||\n\t\t(eventTarget instanceof HTMLElement && element.contains(eventTarget))\n\t)\n}\n\n/**\n * Takes a Vue Component and assigns an install function to it\n * this makes sure that it can be used with Vue.use(component)\n */\nexport const makeInstallable = <C extends ComponentPublicInstanceConstructor>(\n\tcomponent: C,\n): C & { install: Vue.PluginFunction<Record<string, never>> } =>\n\tObject.assign(component, {\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tinstall: (Vue: typeof _Vue) => Vue.component(component.name, component),\n\t})\n\nexport const isNumberInRange = ({\n\tmaximum,\n\tminimum,\n\tvalue,\n}: {\n\tmaximum: number | null\n\tminimum: number | null\n\tvalue: number | null\n}): boolean => {\n\tif (value === null) return true\n\n\tconst fitsMinimum = minimum === null || value >= minimum\n\tconst fitsMaximum = maximum === null || value <= maximum\n\n\treturn fitsMinimum && fitsMaximum\n}\n\n/**\n * RegExp character set for use within other regular expressions\n */\nexport const DECIMAL_SEPARATORS_CHARACTER_SET = [\n\t'[',\n\t...Object.values(DecimalSeparator),\n\t']',\n].join('')\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition -- disable as only intentionally-set DEBUG flags are being marked */\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport uniq from 'lodash/uniq.js'\nimport type { PropOptions, PropType } from 'vue'\nimport type { Prop } from 'vue/types/options'\nimport { z } from 'zod'\n\nconst DEBUG_MAKE_PROPS = false as const // enable to print debug log\nconst DEBUG_WALK_SCHEMA_TYPES = false as const // enable to print debug log\n\nconst NEVER = Symbol('NEVER')\n\nconst setUnion = <T>(...sets: Set<T>[]): Set<T> => {\n\tconst result = new Set<T>()\n\tfor (const set of sets) {\n\t\tfor (const item of set) {\n\t\t\tresult.add(item)\n\t\t}\n\t}\n\treturn result\n}\n\nconst propValidator = <SCHEMA extends z.ZodTypeAny>({\n\tisNever,\n\tpropName,\n\tpropSchema,\n}: {\n\tisNever: boolean\n\tpropName: string\n\tpropSchema: SCHEMA\n}): ((value: unknown) => value is SCHEMA) => {\n\tconst validator = (value: unknown): value is SCHEMA => {\n\t\tif (isNever && value === NEVER) return true\n\n\t\ttry {\n\t\t\tconst result = propSchema.safeParse(value)\n\n\t\t\tif (result.success) return true\n\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.group(`propValidator found issues with prop “${propName}”`)\n\n\t\t\tconsole.error(result.error)\n\n\t\t\tconst clonedValue = cloneDeep(value)\n\t\t\tif (Array.isArray(value)) console.table(clonedValue)\n\t\t\telse console.log(clonedValue)\n\n\t\t\tconsole.trace()\n\n\t\t\tconsole.groupEnd()\n\t\t\t/* eslint-enable no-console */\n\n\t\t\treturn false\n\t\t} catch (error) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.group(`propValidator crashed while parsing prop “${propName}”`)\n\n\t\t\tconsole.error(error)\n\n\t\t\tconst clonedValue = cloneDeep(value)\n\t\t\tif (Array.isArray(value)) console.table(clonedValue)\n\t\t\telse console.log(clonedValue)\n\n\t\t\tconsole.trace()\n\n\t\t\tconsole.info('used zod schema (window.lastZodSchema)', propSchema)\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t;(window as any).lastZodSchema = propSchema\n\n\t\t\tconsole.groupEnd()\n\t\t\t/* eslint-enable no-console */\n\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// assign name for better debugging and to improve props rendering in the documentation\n\tObject.defineProperty(validator, 'name', {\n\t\tvalue: `propValidator('${propName}')`,\n\t\twritable: false,\n\t})\n\n\treturn validator\n}\n\n/**\n * Collects all unique types used in the top level of a Zod schema\n */\nconst walkSchemaTypes = (\n\tschema: z.ZodTypeAny,\n): Set<z.ZodFirstPartyTypeKind> => {\n\t/* eslint-disable no-console */\n\tconst typeName = schema._def.typeName as z.ZodFirstPartyTypeKind\n\n\tif (DEBUG_WALK_SCHEMA_TYPES)\n\t\tconsole.log(`walkSchemaTypes: found “ZodFirstPartyTypeKind.${typeName}”`)\n\n\tswitch (typeName) {\n\t\tcase z.ZodFirstPartyTypeKind.ZodArray:\n\t\tcase z.ZodFirstPartyTypeKind.ZodBoolean:\n\t\tcase z.ZodFirstPartyTypeKind.ZodDate:\n\t\tcase z.ZodFirstPartyTypeKind.ZodEnum:\n\t\tcase z.ZodFirstPartyTypeKind.ZodFunction:\n\t\tcase z.ZodFirstPartyTypeKind.ZodLiteral:\n\t\tcase z.ZodFirstPartyTypeKind.ZodNativeEnum:\n\t\tcase z.ZodFirstPartyTypeKind.ZodNever: // special case for abstract props\n\t\tcase z.ZodFirstPartyTypeKind.ZodNumber:\n\t\tcase z.ZodFirstPartyTypeKind.ZodObject:\n\t\tcase z.ZodFirstPartyTypeKind.ZodRecord:\n\t\tcase z.ZodFirstPartyTypeKind.ZodString:\n\t\tcase z.ZodFirstPartyTypeKind.ZodTuple: {\n\t\t\tif (DEBUG_WALK_SCHEMA_TYPES)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`walkSchemaTypes: adding “ZodFirstPartyTypeKind.${typeName}”`,\n\t\t\t\t)\n\n\t\t\treturn new Set([typeName])\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodDefault:\n\t\tcase z.ZodFirstPartyTypeKind.ZodNullable:\n\t\tcase z.ZodFirstPartyTypeKind.ZodOptional: {\n\t\t\tconst { innerType } = schema._def as\n\t\t\t\t| z.ZodDefaultDef\n\t\t\t\t| z.ZodNullableDef\n\t\t\t\t| z.ZodOptionalDef\n\n\t\t\tif (DEBUG_WALK_SCHEMA_TYPES)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`walkSchemaTypes: walking innerType of “ZodFirstPartyTypeKind.${typeName}”`,\n\t\t\t\t)\n\n\t\t\treturn setUnion(\n\t\t\t\tnew Set<z.ZodFirstPartyTypeKind>([typeName]),\n\t\t\t\twalkSchemaTypes(innerType),\n\t\t\t)\n\t\t}\n\t\t// e.g. z.refine()\n\t\tcase z.ZodFirstPartyTypeKind.ZodEffects: {\n\t\t\tconst def = schema._def as z.ZodEffectsDef\n\n\t\t\tif (DEBUG_WALK_SCHEMA_TYPES)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`walkSchemaTypes: walking schema of “ZodFirstPartyTypeKind.ZodEffects”`,\n\t\t\t\t)\n\n\t\t\treturn walkSchemaTypes(def.schema)\n\t\t}\n\t\tcase z.ZodFirstPartyTypeKind.ZodUnion: {\n\t\t\tconst { options } = schema._def as z.ZodUnionDef\n\n\t\t\tif (DEBUG_WALK_SCHEMA_TYPES)\n\t\t\t\tconsole.group('walkSchemaTypes: walking union')\n\n\t\t\t// walk every option in the union and merge results\n\t\t\tconst result = setUnion(...options.map((x) => walkSchemaTypes(x)))\n\n\t\t\tif (DEBUG_WALK_SCHEMA_TYPES) console.groupEnd()\n\n\t\t\treturn result\n\t\t}\n\n\t\tdefault: {\n\t\t\tthrow new Error(\n\t\t\t\t`walkSchemaTypes: encountered unknown “ZodFirstPartyTypeKind.${typeName}”`,\n\t\t\t)\n\t\t}\n\t}\n\t/* eslint-enable no-console */\n}\n\n/**\n * These types do not influence the generation of Vue’s `propName.type` Arrays and are therefore discarded\n */\nconst ignoredZodTypes = new Set([\n\tz.ZodFirstPartyTypeKind.ZodDefault,\n\tz.ZodFirstPartyTypeKind.ZodNullable,\n\tz.ZodFirstPartyTypeKind.ZodOptional,\n])\n\n/**\n * This maps the internal zod name of a type to the the constructor that Vue expects in `propName.type`\n */\nconst zodToVueType = new Map<z.ZodFirstPartyTypeKind, Prop<unknown>>([\n\t[z.ZodFirstPartyTypeKind.ZodArray, Array],\n\t[z.ZodFirstPartyTypeKind.ZodBoolean, Boolean],\n\t[z.ZodFirstPartyTypeKind.ZodDate, Date],\n\t[z.ZodFirstPartyTypeKind.ZodEnum, String], // educated guess, can be fixed if the need for non-string enums arises\n\t[z.ZodFirstPartyTypeKind.ZodFunction, Function],\n\t[z.ZodFirstPartyTypeKind.ZodLiteral, String], // educated guess, can be fixed if the need for non-string literals arises\n\t[z.ZodFirstPartyTypeKind.ZodNativeEnum, String], // educated guess, can be fixed if the need for non-string enums arises\n\t[z.ZodFirstPartyTypeKind.ZodNumber, Number],\n\t[z.ZodFirstPartyTypeKind.ZodObject, Object],\n\t[z.ZodFirstPartyTypeKind.ZodRecord, Object],\n\t[z.ZodFirstPartyTypeKind.ZodString, String],\n\t[z.ZodFirstPartyTypeKind.ZodTuple, Array],\n])\n\n/**\n * @summary Easily define & validate vue props, improve error messages drastically\n *\n * @description\n * This augments/replaces Vue’s props entirely, including the need to add prop.validator\n * by using zod and therefore actually prints errors to the console that can help developers\n * rather than the non-distinct vue-warn message about a validator failing for a component.\n *\n * ## Known limitations:\n *\n * 1. Deeply defined defaults are only applied when manually `schema.safeParse`-ing the data (only top-level defaults are possible to transform to Vue)\n * 2. `z.safeParse()` fails for type: `z.function()` if we specify the default, without explicitly chaining\n *    `optional()` on the function type. (See {@link https://github.com/colinhacks/zod/issues/647})\n *    However, it is inconsequential for Vue prop validation, as Vue doesn’t execute the `validator` if the prop is not passed/undefined.\n *\n * @example\n * // KtUserMenu.vue\n * export default defineComponent({\n *   name: 'KtUserMenu',\n *   props: makeProps(KottiUserMenu.propsSchema)\n *   setup(props)\n * })\n *\n * // types.ts\n * export namespace KottiUserMenu {\n *   export const propsSchema = z.object({\n *     // ...\n *   })\n *   type Props = z.input<typeof propsSchema>\n *   type PropsInternal = z.output<typeof propsSchema>\n * }\n */\nexport const makeProps = <PROPS_SCHEMA extends z.ZodObject<z.ZodRawShape>>(\n\tpropsSchema: PROPS_SCHEMA,\n): {\n\t[PROP_NAME in keyof PROPS_SCHEMA['shape']]: Omit<\n\t\tPropOptions,\n\t\t'default' | 'required' | 'type'\n\t> & {\n\t\tdefault: undefined extends z.input<PROPS_SCHEMA>[PROP_NAME]\n\t\t\t? () => z.output<PROPS_SCHEMA>[PROP_NAME]\n\t\t\t: undefined\n\t\trequired: undefined extends z.input<PROPS_SCHEMA>[PROP_NAME] ? false : true\n\t\ttype: PropType<z.output<PROPS_SCHEMA>[PROP_NAME]>\n\t}\n} =>\n\tObject.fromEntries(\n\t\tObject.entries(propsSchema.shape).map(([propName, propSchema]) => {\n\t\t\t/* eslint-disable no-console */\n\t\t\tif (DEBUG_MAKE_PROPS) console.log(`makeProps: generating “${propName}”`)\n\n\t\t\tconst zodTypeSet = walkSchemaTypes(propSchema)\n\n\t\t\tconst isNever = zodTypeSet.has(z.ZodFirstPartyTypeKind.ZodNever)\n\n\t\t\tif (isNever && zodTypeSet.size > 1)\n\t\t\t\tthrow new Error('makeProps: Unexpected Mixed Usage of Never')\n\n\t\t\tconst propDefinition: PropOptions<unknown> = {\n\t\t\t\tvalidator: propValidator({\n\t\t\t\t\tisNever,\n\t\t\t\t\tpropName,\n\t\t\t\t\tpropSchema,\n\t\t\t\t}),\n\t\t\t}\n\n\t\t\tif (isNever) {\n\t\t\t\t// HACK: for the KtFields because we are constrained by VueTypes\n\t\t\t\tpropDefinition.default = NEVER\n\t\t\t\tpropDefinition.type = Symbol\n\t\t\t} else {\n\t\t\t\tconst vuePropTypes = uniq(\n\t\t\t\t\tArray.from(zodTypeSet)\n\t\t\t\t\t\t.filter((x) => !ignoredZodTypes.has(x))\n\t\t\t\t\t\t.map((zodTypeName) => {\n\t\t\t\t\t\t\tif (DEBUG_MAKE_PROPS)\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t`makeProps: found “ZodFirstPartyTypeKind.${zodTypeName}”`,\n\t\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\tif (!zodToVueType.has(zodTypeName))\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`makeProps: unknown “ZodFirstPartyTypeKind.${zodTypeName}”`,\n\t\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\treturn zodToVueType.get(zodTypeName) as Prop<unknown>\n\t\t\t\t\t\t}),\n\t\t\t\t)\n\n\t\t\t\tif (vuePropTypes.length === 0)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`makeProps: Could not determine vue prop.type for prop ${propName}`,\n\t\t\t\t\t)\n\n\t\t\t\tpropDefinition.type =\n\t\t\t\t\tvuePropTypes.length === 1 ? vuePropTypes[0] : vuePropTypes\n\n\t\t\t\t/**\n\t\t\t\t * WORKAROUND: Usually, one should probably call shape.isOptional()\n\t\t\t\t *\n\t\t\t\t * However, this currently doesn’t seem to work with z.function().default()\n\t\t\t\t * and this also internally just calls safeParse on the object — evaluating\n\t\t\t\t * the default function, which wastes performance AND could cause\n\t\t\t\t * unintended side-effects\n\t\t\t\t */\n\t\t\t\tconst isOptional =\n\t\t\t\t\tzodTypeSet.has(z.ZodFirstPartyTypeKind.ZodDefault) ||\n\t\t\t\t\tzodTypeSet.has(z.ZodFirstPartyTypeKind.ZodOptional)\n\n\t\t\t\tif (isOptional) propDefinition.default = propSchema._def.defaultValue\n\t\t\t\telse propDefinition.required = true\n\t\t\t}\n\n\t\t\treturn [propName, propDefinition]\n\t\t\t/* eslint-enable no-console */\n\t\t}),\n\t) as {\n\t\t[KEY in keyof PROPS_SCHEMA['shape']]: Omit<\n\t\t\tPropOptions,\n\t\t\t'default' | 'required' | 'type'\n\t\t> & {\n\t\t\tdefault: undefined extends z.input<PROPS_SCHEMA>[KEY]\n\t\t\t\t? () => z.output<PROPS_SCHEMA>[KEY]\n\t\t\t\t: undefined\n\t\t\trequired: undefined extends z.input<PROPS_SCHEMA>[KEY] ? false : true\n\t\t\ttype: PropType<z.output<PROPS_SCHEMA>[KEY]>\n\t\t}\n\t}\n/* eslint-enable @typescript-eslint/no-unnecessary-condition */\n","import type { Ref } from 'vue'\nimport { watch } from 'vue'\n\nconst getDefaultOptions = (): KeyframeAnimationOptions => ({\n\tduration: 250,\n\teasing: 'ease',\n\tfill: 'forwards',\n})\n\nexport const useSlideAnimation = (\n\telement: Ref<HTMLElement | null>,\n\tisContentOpen: Readonly<Ref<boolean>>,\n\toptions: KeyframeAnimationOptions,\n): void => {\n\tconst finalOptions = { ...getDefaultOptions(), ...options }\n\tconst getRawHeight = (element: HTMLElement) => element.clientHeight\n\n\tconst executeAnimation = async (willOpen: boolean): Promise<void> => {\n\t\tconst animatedObject = element.value ?? null\n\t\tif (animatedObject === null) return\n\t\tconst rawHeight = getRawHeight(animatedObject).toString()\n\n\t\tconst frames: Keyframe[] = ['0px', `${rawHeight}px`].map((height) => ({\n\t\t\theight,\n\t\t\toverflow: 'hidden',\n\t\t}))\n\t\tconst animation = animatedObject.animate(frames, finalOptions)\n\n\t\tanimation.pause()\n\n\t\tif (willOpen) animation.play()\n\t\telse animation.reverse()\n\n\t\tawait animation.finished\n\n\t\t// Clear animation keyframeEffects to allow animatedObject to resize\n\t\tanimation.cancel()\n\t}\n\n\twatch(\n\t\t() => isContentOpen.value,\n\t\t(shouldBeShown, wasShown) => {\n\t\t\tif (shouldBeShown === wasShown) return\n\n\t\t\tvoid executeAnimation(shouldBeShown)\n\t\t},\n\t\t{ flush: 'post', immediate: true },\n\t)\n}\n","<template>\n\t<div class=\"kt-accordion\">\n\t\t<div class=\"kt-accordion__header\" :data-test=\"dataTest\" @click=\"toggle\">\n\t\t\t<div class=\"kt-accordion__title\">\n\t\t\t\t<slot name=\"title\">\n\t\t\t\t\t<i v-if=\"icon\" class=\"yoco kt-accordion__icon\" v-text=\"icon\" />\n\t\t\t\t\t<div class=\"kt-accordion__text\" v-text=\"title\" />\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t\t<div class=\"kt-accordion__toggle\" @click.stop=\"toggle\">\n\t\t\t\t<i class=\"yoco\" v-text=\"toggleIcon\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div :class=\"contentClasses\">\n\t\t\t<div ref=\"contentInnerRef\" class=\"kt-accordion__inner\">\n\t\t\t\t<slot />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport { useSlideAnimation } from './hooks'\nimport { KottiAccordion } from './types'\n\n//** How much time should be spent on open/close animation in milliseconds */\nconst ANIMATION_DURATION = 300\n\nexport default defineComponent({\n\tname: 'KtAccordion',\n\tprops: makeProps(KottiAccordion.propsSchema),\n\temits: ['update:isClosed'],\n\tsetup(props, { emit }) {\n\t\tconst contentInnerRef = ref<HTMLElement | null>(null)\n\n\t\tuseSlideAnimation(\n\t\t\tcontentInnerRef,\n\t\t\tcomputed(() => !props.isClosed),\n\t\t\t{ duration: ANIMATION_DURATION },\n\t\t)\n\t\treturn {\n\t\t\tcontentClasses: computed(() => ({\n\t\t\t\t'kt-accordion__content': true,\n\t\t\t\t'kt-accordion__content--is-closed': props.isClosed,\n\t\t\t\t'kt-accordion__content--is-open': !props.isClosed,\n\t\t\t})),\n\t\t\tcontentInnerRef,\n\t\t\ttoggle: () => {\n\t\t\t\temit('update:isClosed', !props.isClosed)\n\t\t\t},\n\t\t\ttoggleIcon: computed(() =>\n\t\t\t\tprops.isClosed ? Yoco.Icon.PLUS : Yoco.Icon.MINUS,\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n:root {\n\t--accordion-color: var(--interactive-03);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.kt-accordion {\n\tmargin-bottom: var(--unit-4);\n\tborder-radius: 2px;\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tpadding: var(--unit-2) var(--unit-8);\n\t\tcursor: pointer;\n\t\tborder: 1px solid var(--ui-02);\n\n\t\t.yoco {\n\t\t\tfont-size: 1.2rem;\n\t\t}\n\t}\n\n\t&__title {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\talign-items: center;\n\t\talign-self: center;\n\t\tfont-size: 16px;\n\t\tfont-weight: 600;\n\t}\n\n\t&__icon {\n\t\tdisplay: inline-block;\n\t\tmargin-right: var(--unit-4);\n\t\tcolor: var(--accordion-color);\n\t}\n\n\t&__text {\n\t\tdisplay: inline-block;\n\t}\n\n\t&__content {\n\t\tmargin-top: -1px; // prevent border overlap when closed\n\t\toverflow: hidden;\n\t\tborder: 1px solid var(--ui-02);\n\t\tborder-top: none;\n\n\t\t&--is-open {\n\t\t\theight: auto;\n\t\t}\n\n\t\t&--is-closed {\n\t\t\theight: 0;\n\t\t}\n\t}\n\n\t&__inner {\n\t\tpadding: var(--unit-2) var(--unit-8);\n\t}\n\n\t&__toggle {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\talign-self: center;\n\t\tmargin-left: var(--unit-4);\n\t\tcolor: var(--accordion-color);\n\t\tuser-select: none;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtAccordionVue from './KtAccordion.vue'\nimport { KottiAccordion } from './types'\n\nexport const KtAccordion = attachMeta(makeInstallable(KtAccordionVue), {\n\taddedVersion: null,\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=173%3A2598',\n\t},\n\tslots: {\n\t\tdefault: { description: null, scope: null },\n\t\ttitle: { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Accordion',\n\t\tschema: KottiAccordion.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"kt-actionbar-nav\">\n\t\t<!-- FIXME: External Dependencies Should not Be Used without Injection -->\n\t\t<router-link v-for=\"(item, index) in menu\" :key=\"index\" :to=\"item.to\">\n\t\t\t<li class=\"kt-actionbar-nav__item\" :class=\"navItemClass(item)\">\n\t\t\t\t<i\n\t\t\t\t\tclass=\"yoco kt-actionbar-nav__icon\"\n\t\t\t\t\t:class=\"`kt-actionbar-nav__icon--${menuStyle.iconPosition}`\"\n\t\t\t\t\tv-text=\"item.icon\"\n\t\t\t\t/>\n\t\t\t\t<span class=\"kt-actionbar-nav__label\" v-text=\"item.label\" />\n\t\t\t</li>\n\t\t</router-link>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { defineComponent } from 'vue'\n\nimport type { KottiActionbar } from '../types'\n\nexport default defineComponent({\n\tname: 'ActionbarMenu',\n\tprops: {\n\t\tmenu: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiActionbar.PropsInternal['menu']>,\n\t\t},\n\t\tmenuStyle: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiActionbar.PropsInternal['menuStyle']>,\n\t\t},\n\t},\n\tsetup() {\n\t\treturn {\n\t\t\tnavItemClass: (item: KottiActionbar.MenuItem) => ({\n\t\t\t\t'kt-actionbar-nav__item--active': item.active,\n\t\t\t\t'kt-actionbar-nav__item--disabled': item.disabled,\n\t\t\t}),\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<div class=\"kt-actionbar\">\n\t\t<div class=\"kt-actionbar-wrapper\">\n\t\t\t<div class=\"kt-actionbar-header\">\n\t\t\t\t<h1 v-if=\"headerTitle\" v-text=\"headerTitle\" />\n\t\t\t\t<slot name=\"actionbar-header\" />\n\t\t\t</div>\n\t\t\t<div class=\"kt-actionbar-body\">\n\t\t\t\t<ActionbarMenu\n\t\t\t\t\tv-if=\"menu.length > 0\"\n\t\t\t\t\t:menu=\"menu\"\n\t\t\t\t\t:menuStyle=\"menuStyle\"\n\t\t\t\t/>\n\t\t\t\t<slot name=\"actionbar-body\" />\n\t\t\t</div>\n\t\t\t<div class=\"kt-actionbar-footer\">\n\t\t\t\t<slot name=\"actionbar-footer\" />\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport ActionbarMenu from './components/ActionbarMenu.vue'\nimport { KottiActionbar } from './types'\n\nexport default defineComponent({\n\tname: 'KtActionbar',\n\tcomponents: {\n\t\tActionbarMenu,\n\t},\n\tprops: makeProps(KottiActionbar.propsSchema),\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-style/_variables.scss';\n\n:root {\n\t--action-bar-color-active: var(--interactive-03);\n\t--action-bar-width: 16rem;\n}\n\n// Action bar element\n.kt-actionbar {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tdisplay: flex;\n\tflex: 0 0 var(--action-bar-width);\n\tflex-direction: column;\n\twidth: var(--action-bar-width);\n\tmin-height: 100vh;\n\tbackground: #fcfcfc;\n\tborder-right: 1px solid #ddd;\n\n\t.kt-actionbar-wrapper {\n\t\tposition: fixed;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: var(--action-bar-width);\n\t\theight: 100%;\n\t\tpadding: var(--unit-6);\n\t\toverflow-y: auto;\n\t}\n\n\t.kt-actionbar-header {\n\t\tflex: 0 0 auto;\n\t}\n\n\t.kt-actionbar-body {\n\t\tflex: 1 1 100%;\n\t}\n\n\t.kt-actionbar-footer {\n\t\tflex: 1 1 auto;\n\t\tpadding-top: 1.2rem;\n\t}\n}\n\n.kt-actionbar-back {\n\tmargin-top: 0;\n\tmargin-bottom: 0.8rem;\n\tmargin-left: -0.8rem;\n\tfont-size: 0.7rem;\n\tfont-weight: 600;\n\tline-height: 1.2rem;\n\tcolor: var(--action-bar-color-active);\n}\n\n.kt-actionbar-nav {\n\tmargin: 0 calc(-1 * var(--unit-2));\n\n\t&__item {\n\t\tpadding: var(--unit-2);\n\t\tmargin: var(--unit-2) 0;\n\t\tfont-size: 0.75rem;\n\t\tcolor: $darkgray-500;\n\t\tlist-style: none;\n\t\tborder-radius: 0.2rem;\n\n\t\t&:hover {\n\t\t\tcursor: pointer;\n\t\t\tbackground: $lightgray-400;\n\t\t}\n\n\t\t&--active {\n\t\t\t.kt-actionbar-nav__icon {\n\t\t\t\tcolor: var(--action-bar-color-active);\n\t\t\t}\n\n\t\t\t.kt-actionbar-nav__label {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--action-bar-color-active);\n\t\t\t}\n\t\t}\n\n\t\t&--disabled {\n\t\t\t&:hover {\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.kt-actionbar-nav__label,\n\t\t\t.kt-actionbar-nav__icon {\n\t\t\t\tcolor: $lightgray-500;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__icon {\n\t\tpadding-right: 0.4rem;\n\t\tcolor: $darkgray-500;\n\n\t\t&--right {\n\t\t\tfloat: right;\n\t\t\tpadding-right: 0;\n\t\t\tpadding-left: 0.4rem;\n\t\t}\n\t}\n\n\t&__label {\n\t\tcolor: $darkgray-500;\n\t}\n}\n\n.kt-actionbar-menu {\n\tul {\n\t\tposition: relative;\n\t\tmargin: 0;\n\t}\n\n\tli {\n\t\tpadding: var(--unit-2) 0;\n\t\tfont-size: 0.75rem;\n\t\tcolor: $darkgray-500;\n\t\tlist-style: none;\n\t}\n\n\ta {\n\t\ttext-decoration: none;\n\t}\n\n\ti {\n\t\tcolor: $lightgray-500;\n\t}\n\n\t&.has-icon-right i {\n\t\tfloat: right;\n\t}\n\n\t.router-link-active {\n\t\tli {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: var(--action-bar-color-active);\n\t\t}\n\n\t\ti {\n\t\t\tcolor: var(--action-bar-color-active);\n\t\t}\n\t}\n}\n\n@media (width <= $size-md) {\n\t.kt-actionbar {\n\t\tz-index: $zindex-1;\n\t\tflex: 1 1 auto;\n\t\twidth: 100%;\n\t\tmin-height: auto;\n\t\tborder-right: 0;\n\t\tborder-bottom: 1px solid #ddd;\n\n\t\t.kt-actionbar-wrapper {\n\t\t\tposition: relative;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtActionbarVue from './KtActionbar.vue'\nimport { KottiActionbar } from './types'\n\nexport const KtActionbar = attachMeta(makeInstallable(KtActionbarVue), {\n\taddedVersion: '0.0.9',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=133%3A2651',\n\t},\n\tslots: {\n\t\t'actionbar-body': { description: null, scope: null },\n\t\t'actionbar-footer': { description: null, scope: null },\n\t\t'actionbar-header': { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Actionbar',\n\t\tschema: KottiActionbar.propsSchema,\n\t},\n})\n","export const DEFAULT_DEBOUNCE = 500\n\nexport const ISO8601 = 'YYYY-MM-DD'\nexport const ISO8601_SECONDS = 'YYYY-MM-DD HH:mm:ss'\n\nexport const ONE_HUNDRED_PERCENT = 100\n\nexport const TIPPY_DISTANCE_OFFSET = 4\n","<template>\n\t<div :class=\"avatarClasses\" @click=\"onAvatarContainerClick\">\n\t\t<img\n\t\t\tv-if=\"avatarAvailable\"\n\t\t\tref=\"triggerRef\"\n\t\t\tclass=\"kt-avatar__image\"\n\t\t\t:src=\"src ?? undefined\"\n\t\t\t@error=\"onImageFailedToLoad\"\n\t\t/>\n\t\t<div v-else ref=\"triggerRef\" class=\"kt-avatar__fallback\">\n\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.USER_SOLID\" />\n\t\t</div>\n\t\t<div ref=\"contentRef\">\n\t\t\t<slot name=\"content\">\n\t\t\t\t<span v-text=\"name\" />\n\t\t\t</slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../constants'\nimport { makeProps } from '../make-props'\n\nimport { KottiAvatar } from './types'\n\nexport default defineComponent({\n\tname: 'KtAvatar',\n\tprops: makeProps(KottiAvatar.propsSchema),\n\temits: ['click'],\n\tsetup(props, { emit, slots }) {\n\t\tconst avatarFallback = ref(true)\n\n\t\tconst contentRef = ref<HTMLElement | null>(null)\n\t\tconst triggerRef = ref<HTMLElement | null>(null)\n\n\t\tconst hideTippy = computed(\n\t\t\t() => !props.isHoverable || (!slots.content && props.name === null),\n\t\t)\n\n\t\tuseTippy(\n\t\t\ttriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: contentRef.value ?? undefined,\n\t\t\t\tinteractive: true,\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\ttheme: 'light-border',\n\t\t\t\t...(hideTippy.value\n\t\t\t\t\t? { trigger: 'manual' }\n\t\t\t\t\t: { trigger: 'mouseenter focusin' }),\n\t\t\t})),\n\t\t)\n\n\t\tonMounted(() => {\n\t\t\tif (contentRef.value === null)\n\t\t\t\tthrow new Error('KtAvatar: Unbound `contentRef` for tippy: null')\n\t\t})\n\n\t\treturn {\n\t\t\tavatarAvailable: computed(() => props.src && avatarFallback.value),\n\t\t\tavatarClasses: computed(() => ({\n\t\t\t\t'kt-avatar': true,\n\t\t\t\t'kt-avatar--is-hoverable': props.isHoverable,\n\t\t\t\t'kt-avatar--is-size-large': props.size === KottiAvatar.Size.LARGE,\n\t\t\t\t'kt-avatar--is-size-medium': props.size === KottiAvatar.Size.MEDIUM,\n\t\t\t\t'kt-avatar--is-size-small': props.size === KottiAvatar.Size.SMALL,\n\t\t\t})),\n\t\t\tavatarFallback,\n\t\t\tcontentRef,\n\t\t\tonAvatarContainerClick(event: MouseEvent) {\n\t\t\t\temit('click', event)\n\t\t\t},\n\t\t\tonImageFailedToLoad: () => {\n\t\t\t\tavatarFallback.value = false\n\t\t\t},\n\t\t\ttriggerRef,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n:root {\n\t--avatar-color: var(--interactive-01);\n}\n\n.kt-avatar {\n\tposition: relative;\n\tdisplay: inline-flex;\n\taspect-ratio: 1/1;\n\tcolor: var(--white);\n\tbackground: var(--ui-02);\n\tborder: 0.1rem solid var(--white);\n\tborder-radius: 100%;\n\n\t&__fallback,\n\t&__image {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\taspect-ratio: 1/1;\n\t}\n\n\t&__fallback {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t&__image {\n\t\tborder-radius: 100%;\n\t\tobject-fit: cover;\n\t}\n\n\t&--is-hoverable:hover {\n\t\tcursor: pointer;\n\t\tborder: 0.1rem solid var(--avatar-color);\n\t}\n\n\t&--is-size-small {\n\t\twidth: 1.6rem;\n\t\theight: 1.6rem;\n\t\tmax-height: 1.6rem;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t&--is-size-medium {\n\t\twidth: 2.4rem;\n\t\theight: 2.4rem;\n\t\tmax-height: 2.4rem;\n\t\tfont-size: 1.8rem;\n\t}\n\n\t&--is-size-large {\n\t\twidth: 3.2rem;\n\t\theight: 3.2rem;\n\t\tmax-height: 3.2rem;\n\t\tfont-size: 2.4rem;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtAvatarVue from './KtAvatar.vue'\nimport { KottiAvatar } from './types'\n\nexport const KtAvatar = attachMeta(makeInstallable(KtAvatarVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A66',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Avatar',\n\t\tschema: KottiAvatar.propsSchema,\n\t},\n})\n","<template>\n\t<div :class=\"avatarGroupClasses\">\n\t\t<div v-if=\"avatarRemainders > 0\" class=\"kt-avatar-group__number\">\n\t\t\t<div v-text=\"`+${avatarRemainders}`\" />\n\t\t</div>\n\t\t<KtAvatar\n\t\t\tv-for=\"(item, index) in visibleItems\"\n\t\t\t:key=\"index\"\n\t\t\t:isHoverable=\"isHoverable\"\n\t\t\t:name=\"item.name\"\n\t\t\t:size=\"size\"\n\t\t\t:src=\"item.src\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<slot :item=\"item\" name=\"content\" />\n\t\t\t</template>\n\t\t</KtAvatar>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { KtAvatar } from '../kotti-avatar/'\nimport { KottiAvatar } from '../kotti-avatar/types'\nimport { makeProps } from '../make-props'\n\nimport { KottiAvatarGroup } from './types'\n\nexport default defineComponent({\n\tname: 'KtAvatarGroup',\n\tcomponents: {\n\t\tKtAvatar,\n\t},\n\tprops: makeProps(KottiAvatarGroup.propsSchema),\n\tsetup(props) {\n\t\treturn {\n\t\t\tavatarGroupClasses: computed(() => ({\n\t\t\t\t'kt-avatar-group': true,\n\t\t\t\t'kt-avatar-group--is-size-large': props.size === KottiAvatar.Size.LARGE,\n\t\t\t\t'kt-avatar-group--is-size-medium':\n\t\t\t\t\tprops.size === KottiAvatar.Size.MEDIUM,\n\t\t\t\t'kt-avatar-group--is-size-small': props.size === KottiAvatar.Size.SMALL,\n\t\t\t\t'kt-avatar-group--is-stack': props.isStack,\n\t\t\t})),\n\t\t\tavatarRemainders: computed(() => props.items.length - props.count),\n\t\t\tvisibleItems: computed(() => {\n\t\t\t\tconst reversedItems = [...props.items].reverse()\n\n\t\t\t\treturn reversedItems.filter((_item, index) => index < props.count)\n\t\t\t}),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-avatar-group {\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\talign-items: center;\n\tjustify-content: center;\n\n\t.kt-avatar-group__number {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmargin-left: 0.2rem;\n\t\tcolor: var(--text-03);\n\t\tbackground: var(--ui-02);\n\t\tborder: 0.1rem solid var(--white);\n\t\tborder-radius: 100%;\n\t}\n\n\t&--is-size-small {\n\t\t.kt-avatar-group__number {\n\t\t\twidth: 1.6rem;\n\t\t\theight: 1.6rem;\n\t\t\tfont-size: 0.4rem;\n\t\t}\n\n\t\t&.kt-avatar-group--is-stack > * {\n\t\t\tmargin-left: -0.4rem;\n\t\t}\n\t}\n\n\t&--is-size-medium {\n\t\t.kt-avatar-group__number {\n\t\t\twidth: 2.4rem;\n\t\t\theight: 2.4rem;\n\t\t\tfont-size: 0.6rem;\n\t\t}\n\n\t\t&.kt-avatar-group--is-stack > * {\n\t\t\tmargin-left: -0.6rem;\n\t\t}\n\t}\n\n\t&--is-size-large {\n\t\t.kt-avatar-group__number {\n\t\t\twidth: 3.2rem;\n\t\t\theight: 3.2rem;\n\t\t\tfont-size: 0.8rem;\n\t\t}\n\n\t\t&.kt-avatar-group--is-stack > * {\n\t\t\tmargin-left: -0.8rem;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtAvatarGroupVue from './KtAvatarGroup.vue'\n\nexport const KtAvatarGroup = attachMeta(makeInstallable(KtAvatarGroupVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A66',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.AvatarGroup',\n\t\tschema: null,\n\t},\n})\n","<template>\n\t<button\n\t\tref=\"helpTextTriggerRef\"\n\t\t:class=\"mainClasses\"\n\t\t:type=\"isSubmit ? 'submit' : 'button'\"\n\t\t@click=\"handleClick\"\n\t>\n\t\t<i v-if=\"isLoading\" class=\"kt-circle-loading\" />\n\t\t<i v-if=\"hasIconLeft\" class=\"yoco\" v-text=\"icon\" />\n\t\t<span v-if=\"hasSlot\">\n\t\t\t<slot />\n\t\t</span>\n\t\t<span v-else-if=\"label !== null\" v-text=\"label\" />\n\t\t<i v-if=\"hasIconRight\" class=\"yoco\" v-text=\"icon\" />\n\t\t<div v-if=\"showHelpText\" ref=\"helpTextContentRef\" v-text=\"helpText\" />\n\t</button>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../constants'\nimport { makeProps } from '../make-props'\n\nimport { KottiButton } from './types'\n\nexport default defineComponent({\n\tname: 'KtButton',\n\tprops: makeProps(KottiButton.propsSchema),\n\temits: ['click', 'update:toggleStatus'],\n\tsetup(props, { emit, slots }) {\n\t\tconst helpTextContentRef = ref<Element | null>(null)\n\t\tconst helpTextTriggerRef = ref<Element | null>(null)\n\n\t\tconst hasSlot = computed(() => Boolean(slots.default))\n\n\t\tconst isIconButton = computed(\n\t\t\t() => props.icon !== null && props.label === null,\n\t\t)\n\n\t\tconst showHelpText = computed(\n\t\t\t() => isIconButton.value && props.helpText !== null,\n\t\t)\n\n\t\tconst isToggle = computed(() => props.toggleStatus !== null)\n\n\t\tuseTippy(\n\t\t\thelpTextTriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: props.helpText\n\t\t\t\t\t? (helpTextContentRef.value ?? undefined)\n\t\t\t\t\t: undefined,\n\t\t\t\tinteractive: true,\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\ttheme: 'light-border',\n\t\t\t\t...(showHelpText.value\n\t\t\t\t\t? { trigger: 'mouseenter focusin' }\n\t\t\t\t\t: { trigger: 'manual' }),\n\t\t\t})),\n\t\t)\n\n\t\tonMounted(() => {\n\t\t\tif (props.label !== null && props.helpText !== null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'KtButton: Guideline Uncompliance: attempted to use helpText with a button that already has a label.',\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisToggle.value &&\n\t\t\t\tprops.type !== KottiButton.Type.DEFAULT &&\n\t\t\t\tprops.type !== KottiButton.Type.TEXT\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'KtButton: Guideline Uncompliance: attempted to use toggleStatus with a button of type different than \"DEFAULT\" or \"TEXT\"',\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\thandleClick: (event: Event) => {\n\t\t\t\tif (isToggle.value)\n\t\t\t\t\temit(\n\t\t\t\t\t\t'update:toggleStatus',\n\t\t\t\t\t\tprops.toggleStatus === KottiButton.ToggleStatus.OFF\n\t\t\t\t\t\t\t? KottiButton.ToggleStatus.ON\n\t\t\t\t\t\t\t: KottiButton.ToggleStatus.OFF,\n\t\t\t\t\t)\n\t\t\t\temit('click', event)\n\t\t\t},\n\t\t\thasIconLeft: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.icon !== null &&\n\t\t\t\t\tprops.iconPosition === KottiButton.IconPosition.LEFT,\n\t\t\t),\n\t\t\thasIconRight: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.icon !== null &&\n\t\t\t\t\tprops.iconPosition === KottiButton.IconPosition.RIGHT,\n\t\t\t),\n\t\t\thasSlot,\n\t\t\thelpTextContentRef,\n\t\t\thelpTextTriggerRef,\n\t\t\tmainClasses: computed(() => ({\n\t\t\t\t'kt-button': true,\n\t\t\t\t'kt-button--has-content': props.label !== null || hasSlot.value,\n\t\t\t\t'kt-button--has-icon': props.icon !== null,\n\t\t\t\t'kt-button--is-block': props.isBlock,\n\t\t\t\t'kt-button--is-multiline': props.isMultiline,\n\t\t\t\t...(props.toggleStatus\n\t\t\t\t\t? { [`kt-button--is-toggle-${props.toggleStatus}`]: isToggle.value }\n\t\t\t\t\t: {}),\n\t\t\t\t[`kt-button--size-${props.size}`]: true,\n\t\t\t\t[`kt-button--type-${props.type}`]: true,\n\t\t\t})),\n\t\t\tshowHelpText,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n:root {\n\t--default-button-height: var(--unit-8);\n\t--default-button-line-height: var(--unit-6);\n\t--large-button-height: var(--unit-9);\n\t--small-button-height: var(--unit-7);\n\t--button-main-color: var(--interactive-01);\n\t--button-main-color-dark: var(--interactive-01-hover);\n\t--button-main-color-light: var(--interactive-02-hover);\n}\n\n.kt-button {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-weight: 600;\n\n\t// Since this is an inline element (display: inline-flex), we need to\n\t// care about vertical-alignment. The default setting would cause\n\t// different alignments between buttons with or without icon.\n\tvertical-align: middle;\n\tcursor: pointer;\n\tuser-select: none;\n\tborder: 1px solid transparent;\n\tborder-radius: var(--border-radius);\n\ttransition: 30ms opacity ease-in-out;\n\n\t&:active {\n\t\topacity: 0.85;\n\t}\n\n\t&:disabled {\n\t\tpointer-events: none;\n\t\topacity: 0.46;\n\t}\n\n\t&:focus-visible {\n\t\toutline: none;\n\t}\n\n\t> *:not(:first-child) {\n\t\tmargin-left: 0.2rem;\n\t}\n\n\t&--has-content {\n\t\tpadding: 0 var(--unit-4);\n\t}\n\n\t&--has-icon {\n\t\t.yoco {\n\t\t\tfont-size: 1rem;\n\t\t}\n\n\t\t&:not(.kt-button--has-content) {\n\t\t\tpadding: 0 var(--unit-2);\n\t\t}\n\t}\n\n\t// increase selector specificity by using .kt-button twice\n\t&--is-block.kt-button {\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t}\n\n\t// increase selector specificity by using .kt-button twice\n\t&--is-multiline.kt-button {\n\t\theight: auto;\n\t\tpadding-top: var(--unit-1);\n\t\tpadding-bottom: var(--unit-1);\n\t\tline-height: var(--default-button-line-height);\n\n\t\t&.kt-button--has-icon {\n\t\t\talign-items: baseline;\n\t\t\ttext-align: left;\n\n\t\t\t.yoco {\n\t\t\t\tposition: relative;\n\t\t\t\tleft: calc(-1 * var(--unit-1));\n\t\t\t}\n\t\t}\n\t}\n\n\t&--size {\n\t\t&-small {\n\t\t\theight: var(--small-button-height);\n\t\t}\n\n\t\t&-medium {\n\t\t\theight: var(--default-button-height);\n\t\t}\n\n\t\t&-large {\n\t\t\theight: var(--large-button-height);\n\t\t}\n\t}\n\n\t&--type {\n\t\t&-danger {\n\t\t\tcolor: var(--danger);\n\t\t\tbackground-color: var(--ui-01);\n\t\t\tborder-color: var(--ui-02);\n\n\t\t\t&:hover,\n\t\t\t&:focus-visible {\n\t\t\t\tcolor: var(--text-04);\n\t\t\t\tbackground-color: var(--danger);\n\t\t\t\tborder-color: transparent;\n\n\t\t\t\t.kt-circle-loading {\n\t\t\t\t\tborder-bottom-color: var(--text-04);\n\t\t\t\t\tborder-left-color: var(--text-04);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-circle-loading {\n\t\t\t\tborder-bottom-color: var(--danger);\n\t\t\t\tborder-left-color: var(--danger);\n\t\t\t}\n\t\t}\n\n\t\t&-default {\n\t\t\tcolor: var(--button-main-color-dark);\n\t\t\tbackground-color: var(--interactive-02);\n\t\t\tborder-color: var(--ui-02);\n\n\t\t\t&:hover,\n\t\t\t&:focus-visible {\n\t\t\t\tbackground-color: var(--button-main-color-light);\n\t\t\t\tborder-color: var(--button-main-color-light);\n\t\t\t}\n\n\t\t\t.kt-circle-loading {\n\t\t\t\tborder-bottom-color: var(--button-main-color-dark);\n\t\t\t\tborder-left-color: var(--button-main-color-dark);\n\t\t\t}\n\n\t\t\t&.kt-button--is-toggle-on {\n\t\t\t\tcolor: var(--text-04);\n\t\t\t\tbackground-color: var(--button-main-color);\n\t\t\t\tborder-color: var(--button-main-color-dark);\n\n\t\t\t\t&:hover,\n\t\t\t\t&:focus-visible {\n\t\t\t\t\tbackground-color: var(--button-main-color-dark);\n\t\t\t\t\tborder-color: var(--button-main-color-dark);\n\t\t\t\t}\n\n\t\t\t\t.kt-circle-loading {\n\t\t\t\t\tborder-bottom-color: var(--text-04);\n\t\t\t\t\tborder-left-color: var(--text-04);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&-primary {\n\t\t\tcolor: var(--text-04);\n\t\t\tbackground-color: var(--button-main-color);\n\t\t\tborder-color: var(--button-main-color-dark);\n\n\t\t\t&:hover,\n\t\t\t&:focus-visible {\n\t\t\t\tbackground-color: var(--button-main-color-dark);\n\t\t\t\tborder-color: var(--button-main-color-dark);\n\t\t\t}\n\n\t\t\t.kt-circle-loading {\n\t\t\t\tborder-bottom-color: var(--text-04);\n\t\t\t\tborder-left-color: var(--text-04);\n\t\t\t}\n\t\t}\n\n\t\t&-secondary {\n\t\t\tcolor: var(--button-main-color-dark);\n\t\t\tbackground-color: var(--interactive-02);\n\t\t\tborder-color: var(--button-main-color-dark);\n\n\t\t\t&:hover,\n\t\t\t&:focus-visible {\n\t\t\t\tbackground-color: var(--button-main-color-light);\n\t\t\t\tborder-color: var(--button-main-color-dark);\n\t\t\t}\n\n\t\t\t.kt-circle-loading {\n\t\t\t\tborder-bottom-color: var(--button-main-color-dark);\n\t\t\t\tborder-left-color: var(--button-main-color-dark);\n\t\t\t}\n\t\t}\n\n\t\t&-text {\n\t\t\tcolor: var(--button-main-color-dark);\n\t\t\tbackground-color: transparent;\n\t\t\tborder-color: transparent;\n\n\t\t\t&:hover,\n\t\t\t&:focus-visible {\n\t\t\t\tbackground-color: var(--button-main-color-light);\n\t\t\t\tborder-color: var(--button-main-color-light);\n\t\t\t}\n\n\t\t\t.kt-circle-loading {\n\t\t\t\tborder-bottom-color: var(--button-main-color-dark);\n\t\t\t\tborder-left-color: var(--button-main-color-dark);\n\t\t\t}\n\n\t\t\t&.kt-button--is-toggle-on {\n\t\t\t\tcolor: var(--button-main-color-dark);\n\t\t\t\tbackground-color: var(--interactive-04);\n\n\t\t\t\t&:hover,\n\t\t\t\t&:focus-visible {\n\t\t\t\t\tbackground-color: var(--button-main-color-light);\n\t\t\t\t\tborder-color: var(--button-main-color-light);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<button\n\t\tref=\"itemRef\"\n\t\tv-bind=\"itemProps\"\n\t\t@click.stop=\"onItemClick\"\n\t\t@keydown.down.prevent\n\t\t@keydown.up.prevent\n\t>\n\t\t<i v-if=\"icon\" class=\"yoco\" v-text=\"icon\" />\n\t\t<span v-text=\"label\" />\n\t</button>\n</template>\n\n<script lang=\"ts\">\nimport {\n\tcomputed,\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tref,\n\twatch,\n} from 'vue'\nimport { z } from 'zod'\n\nimport { makeProps } from '../../make-props'\nimport { isInFocus } from '../../utilities'\nimport { KottiSplitButton } from '../types'\n\nconst propsSchema = KottiSplitButton.actionSchema.extend({\n\thasFocus: z.boolean().default(false),\n\tindex: z.number(),\n\trootDataTest: z.string().nullable().default(null),\n})\n\nexport default defineComponent({\n\tname: 'SplitButtonActionsItem',\n\tprops: makeProps(propsSchema),\n\temits: ['click', 'updateIndexInFocus'],\n\tsetup(props, { emit }) {\n\t\tconst itemRef = ref<HTMLButtonElement | null>(null)\n\n\t\tconst focusListener = () => {\n\t\t\tif (isInFocus(itemRef.value) && !props.hasFocus)\n\t\t\t\temit('updateIndexInFocus', props.index)\n\t\t}\n\n\t\tonMounted(() =>\n\t\t\titemRef.value?.addEventListener('focus', focusListener, {\n\t\t\t\tcapture: true,\n\t\t\t}),\n\t\t)\n\n\t\tonBeforeUnmount(() =>\n\t\t\titemRef.value?.removeEventListener('focus', focusListener),\n\t\t)\n\n\t\twatch(\n\t\t\t() => props.hasFocus,\n\t\t\t(hasFocus, hadFocus) => {\n\t\t\t\tif (hasFocus && !hadFocus) itemRef.value?.focus({ preventScroll: true })\n\t\t\t},\n\t\t)\n\n\t\treturn {\n\t\t\titemProps: computed(() => ({\n\t\t\t\tclass: {\n\t\t\t\t\t'kt-split-button-actions-item': true,\n\t\t\t\t\t'kt-split-button-actions-item--is-disabled': props.isDisabled,\n\t\t\t\t},\n\t\t\t\t'data-test': [\n\t\t\t\t\tprops.rootDataTest,\n\t\t\t\t\t`action-${String(props.index)}`,\n\t\t\t\t\tprops.dataTest,\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join('.'),\n\t\t\t\tdisabled: props.isDisabled,\n\t\t\t})),\n\t\t\titemRef,\n\t\t\tonItemClick: () => {\n\t\t\t\tif (props.isDisabled) return\n\t\t\t\temit('click')\n\t\t\t\tprops.onClick()\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n// Remove default styles from <button /> elements\n@mixin remove-button-styles {\n\tpadding: 0;\n\tmargin: 0;\n\tfont: inherit;\n\ttext-align: inherit;\n\tappearance: none;\n\tbackground-color: transparent;\n\tborder: none;\n\tborder-radius: 0;\n}\n\n.kt-split-button-actions-item {\n\t@include remove-button-styles;\n\n\tdisplay: flex;\n\tgap: var(--unit-2);\n\talign-items: center;\n\twidth: 100%;\n\tpadding: var(--unit-2) var(--unit-4);\n\tcolor: var(--text-01);\n\tcursor: pointer;\n\n\t&--is-disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.46;\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n\n\t&:focus,\n\t&:hover:not(.kt-split-button-actions-item--is-disabled) {\n\t\tbackground-color: var(--ui-01);\n\t}\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n\n\tspan {\n\t\tfont-size: 16px;\n\t\tline-height: 20px;\n\t}\n}\n</style>\n","import type { Instance } from 'tippy.js'\nimport type { Ref } from 'vue'\nimport { computed, ref, watch } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../../constants'\n\nexport const useActionsTippy = ({\n\tisDisabled,\n\tisLoading,\n}: {\n\tisDisabled: Ref<boolean>\n\tisLoading: Ref<boolean>\n}): {\n\tisTippyOpen: Ref<boolean>\n\tsetIsTippyOpen: (isTippyOpen: boolean) => void\n\ttippyContentRef: Ref<HTMLDivElement | null>\n\ttippyTriggerRef: Ref<HTMLDivElement | null>\n} => {\n\tconst isTippyOpen = ref(false)\n\tconst tippyContentRef = ref<HTMLDivElement | null>(null)\n\tconst tippyInstanceRef = ref<Instance | null>(null)\n\tconst tippyTriggerRef = ref<HTMLDivElement | null>(null)\n\n\tconst setIsTippyOpen = (isOpen: boolean) => {\n\t\tif (!tippyInstanceRef.value) return\n\n\t\tif (isOpen) tippyInstanceRef.value.show()\n\t\telse tippyInstanceRef.value.hide()\n\t}\n\n\tuseTippy(\n\t\ttippyTriggerRef,\n\t\tcomputed(() => ({\n\t\t\tappendTo: () => document.body,\n\t\t\tarrow: false,\n\t\t\tcontent: tippyContentRef.value ?? undefined,\n\t\t\thideOnClick: false,\n\t\t\tinteractive: true,\n\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\tonClickOutside: () => {\n\t\t\t\tsetIsTippyOpen(false)\n\t\t\t},\n\t\t\tonCreate(instance: Instance) {\n\t\t\t\ttippyInstanceRef.value = instance\n\t\t\t},\n\t\t\tonHide: () => {\n\t\t\t\tisTippyOpen.value = false\n\t\t\t},\n\t\t\tonShow: () => {\n\t\t\t\tif (isDisabled.value || isLoading.value) return false\n\t\t\t\tisTippyOpen.value = true\n\t\t\t},\n\t\t\tplacement: 'bottom-end',\n\t\t\ttheme: 'light-border',\n\t\t\ttrigger: 'manual',\n\t\t})),\n\t)\n\n\twatch(isTippyOpen, (isOpen) => {\n\t\tif (!tippyInstanceRef.value || !isOpen) return\n\n\t\tconst tippyEl = document.querySelector(\n\t\t\t`#tippy-${tippyInstanceRef.value.id.toString()}`,\n\t\t)\n\n\t\tif (tippyEl) {\n\t\t\tconst containerEl = tippyEl.querySelector('.tippy-content')\n\t\t\tif (!containerEl) {\n\t\t\t\tthrow new Error('useActionsTippy: container element was not found ')\n\t\t\t}\n\t\t\tcontainerEl.setAttribute('style', 'padding: 8px')\n\t\t}\n\t})\n\n\twatch(\n\t\t[isDisabled, isLoading],\n\t\t() => {\n\t\t\tif (isDisabled.value || isLoading.value) setIsTippyOpen(false)\n\t\t},\n\t\t{ immediate: true },\n\t)\n\n\treturn {\n\t\tisTippyOpen,\n\t\tsetIsTippyOpen,\n\t\ttippyContentRef,\n\t\ttippyTriggerRef,\n\t}\n}\n","<template>\n\t<div class=\"kt-split-button\">\n\t\t<KtButton\n\t\t\tclass=\"kt-split-button__primary-action\"\n\t\t\tv-bind=\"primaryActionButtonProps\"\n\t\t\t@click=\"onClickPrimaryAction\"\n\t\t/>\n\t\t<div ref=\"tippyTriggerRef\">\n\t\t\t<KtButton\n\t\t\t\t:class=\"secondaryActionsButtonClasses\"\n\t\t\t\tv-bind=\"secondaryActionsButtonProps\"\n\t\t\t\t@click.stop=\"onClickSecondaryActions\"\n\t\t\t/>\n\t\t</div>\n\t\t<div ref=\"tippyContentRef\">\n\t\t\t<ActionsItem\n\t\t\t\tv-for=\"(action, index) in actions\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tv-bind=\"{\n\t\t\t\t\t...action,\n\t\t\t\t\thasFocus: isActionInFocus(index),\n\t\t\t\t\tindex,\n\t\t\t\t\trootDataTest: dataTest,\n\t\t\t\t}\"\n\t\t\t\t@click=\"onClickAction\"\n\t\t\t\t@updateIndexInFocus=\"onUpdateIndexInFocus\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport omit from 'lodash/omit.js'\nimport {\n\tcomputed,\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tref,\n\twatch,\n} from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport ActionsItem from './components/ActionsItem.vue'\nimport { useActionsTippy } from './hooks/use-actions-tippy'\nimport { KottiSplitButton } from './types'\n\n/**\n * Do not change. UNSET_INDEX is expected to be -1.\n */\nconst UNSET_INDEX = -1\n\nexport default defineComponent({\n\tname: 'KtSplitButton',\n\tcomponents: {\n\t\tActionsItem,\n\t},\n\tprops: makeProps(KottiSplitButton.propsSchema),\n\temits: ['click'],\n\tsetup(props, { emit }) {\n\t\tconst { isTippyOpen, setIsTippyOpen, tippyContentRef, tippyTriggerRef } =\n\t\t\tuseActionsTippy({\n\t\t\t\tisDisabled: computed(() => props.isDisabled),\n\t\t\t\tisLoading: computed(() => props.isLoading),\n\t\t\t})\n\n\t\tconst currentActionIndexInFocus = ref<number>(UNSET_INDEX)\n\n\t\tconst hasAvailableActions = computed(() =>\n\t\t\tprops.actions.some((action) => !action.isDisabled),\n\t\t)\n\n\t\tconst getNextAvailableActionIndex = (\n\t\t\tcurrentIndex: number,\n\t\t\tdirection: 'down' | 'up',\n\t\t) => {\n\t\t\tif (\n\t\t\t\t(currentIndex === 0 && direction === 'up') ||\n\t\t\t\t(currentIndex === props.actions.length - 1 && direction === 'down')\n\t\t\t)\n\t\t\t\treturn currentIndex\n\n\t\t\tconst step = direction === 'down' ? 1 : -1\n\n\t\t\tfor (\n\t\t\t\tlet nextIndex = currentIndex + step;\n\t\t\t\tnextIndex < props.actions.length && nextIndex >= 0;\n\t\t\t\tnextIndex += step\n\t\t\t) {\n\t\t\t\tconst action = props.actions[nextIndex]\n\n\t\t\t\tif (!action)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`KtSplitButton: action item not found for index: ${String(nextIndex)}`,\n\t\t\t\t\t)\n\n\t\t\t\tif (!action.isDisabled) return nextIndex\n\t\t\t}\n\n\t\t\treturn currentIndex\n\t\t}\n\n\t\tconst keydownListener = (event: KeyboardEvent) => {\n\t\t\tif (!hasAvailableActions.value) return\n\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown': {\n\t\t\t\t\tcurrentActionIndexInFocus.value = getNextAvailableActionIndex(\n\t\t\t\t\t\tcurrentActionIndexInFocus.value,\n\t\t\t\t\t\t'down',\n\t\t\t\t\t)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tcase 'ArrowUp': {\n\t\t\t\t\tcurrentActionIndexInFocus.value = getNextAvailableActionIndex(\n\t\t\t\t\t\tcurrentActionIndexInFocus.value,\n\t\t\t\t\t\t'up',\n\t\t\t\t\t)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tonMounted(() => {\n\t\t\ttippyContentRef.value?.addEventListener('keydown', keydownListener, {\n\t\t\t\tcapture: true,\n\t\t\t})\n\t\t})\n\n\t\tonBeforeUnmount(() => {\n\t\t\ttippyContentRef.value?.removeEventListener('keydown', keydownListener)\n\t\t})\n\n\t\twatch(\n\t\t\t() => isTippyOpen.value,\n\t\t\t(isOpen) => {\n\t\t\t\t// eslint-disable-next-line sonarjs/no-selector-parameter\n\t\t\t\tif (!isOpen) currentActionIndexInFocus.value = UNSET_INDEX\n\t\t\t\telse if (hasAvailableActions.value)\n\t\t\t\t\t// Focus the 1st available action item\n\t\t\t\t\tcurrentActionIndexInFocus.value = getNextAvailableActionIndex(\n\t\t\t\t\t\tUNSET_INDEX,\n\t\t\t\t\t\t'down',\n\t\t\t\t\t)\n\t\t\t},\n\t\t)\n\n\t\treturn {\n\t\t\tcurrentActionIndexInFocus,\n\t\t\tisActionInFocus: (actionIndex: number) =>\n\t\t\t\tactionIndex === currentActionIndexInFocus.value,\n\t\t\tonClickAction: () => {\n\t\t\t\tsetIsTippyOpen(false)\n\t\t\t},\n\t\t\tonClickPrimaryAction: () => {\n\t\t\t\tif (props.isDisabled || props.isLoading) return\n\t\t\t\temit('click')\n\t\t\t},\n\t\t\tonClickSecondaryActions: () => {\n\t\t\t\tsetIsTippyOpen(!isTippyOpen.value)\n\t\t\t},\n\t\t\tonUpdateIndexInFocus: (index: number) => {\n\t\t\t\tif (isTippyOpen.value) currentActionIndexInFocus.value = index\n\t\t\t},\n\t\t\tprimaryActionButtonProps: computed(() => ({\n\t\t\t\t...omit(props, ['actions', 'dataTest', 'isDisabled']),\n\t\t\t\t'data-test': [props.dataTest, 'primary-action']\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join('.'),\n\t\t\t\tdisabled: props.isDisabled,\n\t\t\t})),\n\t\t\tsecondaryActionsButtonClasses: computed(() => ({\n\t\t\t\t'kt-split-button__secondary-actions': true,\n\t\t\t\t'kt-split-button__secondary-actions--is-active': isTippyOpen.value,\n\t\t\t})),\n\t\t\tsecondaryActionsButtonProps: computed(() => ({\n\t\t\t\t'data-test': [props.dataTest, 'secondary-actions']\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join('.'),\n\t\t\t\tdisabled: props.isDisabled,\n\t\t\t\ticon: Yoco.Icon.CHEVRON_DOWN,\n\t\t\t\tsize: props.size,\n\t\t\t\ttype: props.type,\n\t\t\t})),\n\t\t\ttippyContentRef,\n\t\t\ttippyTriggerRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-split-button {\n\tdisplay: -webkit-inline-box;\n\n\t&__primary-action {\n\t\tborder-radius: var(--border-radius) 0 0 var(--border-radius);\n\t}\n\n\t&__secondary-actions {\n\t\twidth: var(--unit-6);\n\t\tborder-left: 0;\n\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0;\n\n\t\t&--is-active {\n\t\t\t&.kt-button--type-default:not(:hover) {\n\t\t\t\tbackground-color: var(--primary-20);\n\t\t\t\tborder-color: var(--primary-20);\n\t\t\t}\n\n\t\t\t&.kt-button--type-primary:not(:hover) {\n\t\t\t\tbackground-color: var(--primary-80);\n\t\t\t\tborder-color: var(--primary-80);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtButtonVue from './KtButton.vue'\nimport KtSplitButtonVue from './KtSplitButton.vue'\nimport { KottiButton, KottiSplitButton } from './types'\n\nconst componentFolder = 'kotti-button'\n\nexport const KtButton = attachMeta(makeInstallable(KtButtonVue), {\n\taddedVersion: '0.0.1',\n\tcomponentFolder,\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A123',\n\t},\n\tslots: {\n\t\tdefault: {\n\t\t\tdescription: 'Used to replace label with custom HTML',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Button',\n\t\tschema: KottiButton.propsSchema,\n\t},\n})\n\nexport const KtSplitButton = attachMeta(makeInstallable(KtSplitButtonVue), {\n\taddedVersion: '5.7.0',\n\tcomponentFolder,\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?type=design&node-id=5586-8691&mode=design&t=x2i9HCwj1BucUZrh-0',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.SplitButton',\n\t\tschema: KottiSplitButton.propsSchema,\n\t},\n})\n","<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtButton } from '../kotti-button'\nimport { makeProps } from '../make-props'\n\nimport { KottiBanner } from './types'\n\nexport default defineComponent({\n\tname: 'KtBanner',\n\tcomponents: {\n\t\tKtButton,\n\t},\n\tprops: makeProps(KottiBanner.propsSchema),\n\temits: ['action', 'close'],\n\tsetup(props, { emit, slots }) {\n\t\tconst styles = computed((): KottiBanner.Style => {\n\t\t\tswitch (props.type) {\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbackgroundColor: 'var(--banner-error-bg)',\n\t\t\t\t\t\tdarkColor: 'var(--banner-error-dark)',\n\t\t\t\t\t\ticon: Yoco.Icon.CIRCLE_CROSS,\n\t\t\t\t\t\tlightColor: 'var(--banner-error-light)',\n\t\t\t\t\t}\n\n\t\t\t\tcase 'info':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbackgroundColor: 'var(--banner-info-bg)',\n\t\t\t\t\t\tdarkColor: 'var(--banner-info-dark)',\n\t\t\t\t\t\ticon: Yoco.Icon.CIRCLE_I,\n\t\t\t\t\t\tlightColor: 'var(--banner-info-light)',\n\t\t\t\t\t}\n\n\t\t\t\tcase 'success':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbackgroundColor: 'var(--banner-success-bg)',\n\t\t\t\t\t\tdarkColor: 'var(--banner-success-dark)',\n\t\t\t\t\t\ticon: Yoco.Icon.CIRCLE_CHECK,\n\t\t\t\t\t\tlightColor: 'var(--banner-success-light)',\n\t\t\t\t\t}\n\n\t\t\t\tcase 'warning':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tbackgroundColor: 'var(--banner-warning-bg)',\n\t\t\t\t\t\tdarkColor: 'var(--banner-warning-dark)',\n\t\t\t\t\t\ticon: Yoco.Icon.CIRCLE_ATTENTION,\n\t\t\t\t\t\tlightColor: 'var(--banner-warning-light)',\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn props.type\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\thasActionSlot: computed((): boolean => Boolean(slots.action)),\n\t\t\thasFooter: computed((): boolean => Boolean(slots.footer)),\n\t\t\thasHeader: computed(\n\t\t\t\t(): boolean => props.header !== null || Boolean(slots.header),\n\t\t\t),\n\t\t\tonAction: (event: MouseEvent) => {\n\t\t\t\temit('action', event)\n\t\t\t},\n\t\t\tonClose: (event: MouseEvent) => {\n\t\t\t\temit('close', event)\n\t\t\t},\n\t\t\tstyles,\n\t\t}\n\t},\n})\n</script>\n\n<template>\n\t<div class=\"kt-banner\" :style=\"{ borderColor: styles.lightColor }\">\n\t\t<div\n\t\t\tv-if=\"styles.icon !== null\"\n\t\t\tclass=\"kt-banner__icon\"\n\t\t\t:style=\"{\n\t\t\t\tcolor: styles.darkColor,\n\t\t\t\tbackgroundColor: styles.backgroundColor,\n\t\t\t}\"\n\t\t>\n\t\t\t<i class=\"yoco\" v-text=\"styles.icon\" />\n\t\t</div>\n\t\t<div class=\"kt-banner__text\" :class=\"{ 'ml-1': styles.icon === null }\">\n\t\t\t<div v-if=\"hasHeader\" class=\"kt-banner__header\">\n\t\t\t\t<slot name=\"header\">\n\t\t\t\t\t{{ header }}\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<slot name=\"text\">\n\t\t\t\t\t{{ text }}\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t\t<div v-if=\"hasFooter\">\n\t\t\t\t<slot name=\"footer\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"hasActionSlot\" class=\"kt-banner__action\">\n\t\t\t<slot name=\"action\" />\n\t\t</div>\n\t\t<div v-else-if=\"action\" class=\"kt-banner__action\">\n\t\t\t<KtButton :label=\"action\" type=\"text\" @click=\"onAction\" />\n\t\t</div>\n\t\t<div v-if=\"isCloseable\" class=\"kt-banner__close\" @click=\"onClose\">\n\t\t\t<i class=\"yoco\">close</i>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n:root {\n\t--banner-error-bg: var(--support-error-bg);\n\t--banner-error-light: var(--support-error-light);\n\t--banner-error-dark: var(--support-error-dark);\n\t--banner-info-bg: var(--support-info-bg);\n\t--banner-info-light: var(--support-info-light);\n\t--banner-info-dark: var(--support-info-dark);\n\t--banner-warning-bg: var(--support-warning-bg);\n\t--banner-warning-light: var(--support-warning-light);\n\t--banner-warning-dark: var(--support-warning-dark);\n\t--banner-success-bg: var(--support-success-bg);\n\t--banner-success-light: var(--support-success-light);\n\t--banner-success-dark: var(--support-success-dark);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.kt-banner {\n\tdisplay: flex;\n\tgap: var(--unit-2);\n\tpadding: var(--unit-1);\n\tuser-select: none;\n\tbackground-color: var(--ui-background);\n\tborder: 1px solid transparent;\n\tborder-radius: var(--unit-2);\n\n\t&__icon,\n\t&__close,\n\t&__action {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t&__icon,\n\t&__close {\n\t\twidth: var(--unit-7);\n\t\theight: var(--unit-7);\n\n\t\t.yoco {\n\t\t\tfont-size: var(--unit-5);\n\t\t}\n\t}\n\n\t&__close,\n\t&__action {\n\t\t.yoco {\n\t\t\tcolor: var(--icon-02);\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t&:hover .yoco {\n\t\t\tcolor: var(--icon-01);\n\t\t}\n\t}\n\n\t&__action {\n\t\talign-self: flex-start;\n\t\tmargin-top: -2px;\n\t}\n\n\t&__icon {\n\t\tborder-radius: var(--border-radius);\n\t}\n\n\t&__header {\n\t\tfont-weight: 700;\n\t\tuser-select: text;\n\t}\n\n\t&__text {\n\t\tdisplay: flex;\n\t\tflex: 1 0;\n\t\tflex-direction: column;\n\t\tgap: var(--unit-1);\n\t\tmargin-top: 4px;\n\t\tline-height: var(--unit-5);\n\t\tuser-select: text;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtBannerVue from './KtBanner.vue'\nimport { KottiBanner } from './types'\n\nexport const KtBanner = attachMeta(makeInstallable(KtBannerVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/design/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=7096-5539',\n\t},\n\tslots: {\n\t\taction: {\n\t\t\tdescription:\n\t\t\t\t'Use this only if you need to implement a custom action button',\n\t\t\tscope: null,\n\t\t},\n\t\tfooter: {\n\t\t\tdescription:\n\t\t\t\t'Used to put e.g. buttons or other interactive elements at the bottom of the banner',\n\t\t\tscope: null,\n\t\t},\n\t\theader: {\n\t\t\tdescription: 'Used to replace the optional header text',\n\t\t\tscope: null,\n\t\t},\n\t\ttext: {\n\t\t\tdescription: 'Used to replace the main text',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Banner',\n\t\tschema: KottiBanner.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"kt-breadcrumb\">\n\t\t<ol>\n\t\t\t<li\n\t\t\t\tv-for=\"(breadcrumb, index) in breadcrumbs\"\n\t\t\t\t:key=\"index\"\n\t\t\t\t:class=\"breadCrumbClasses(breadcrumb, index)\"\n\t\t\t\t:data-test=\"breadcrumb.dataTest ? breadcrumb.dataTest : undefined\"\n\t\t\t>\n\t\t\t\t<span v-if=\"showSeparator(index)\" class=\"kt-breadcrumb__separator\">\n\t\t\t\t\t<i\n\t\t\t\t\t\tv-if=\"separator.style === KottiBreadcrumb.SeparatorType.ICON\"\n\t\t\t\t\t\tclass=\"yoco\"\n\t\t\t\t\t\tv-text=\"separator.value\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-else-if=\"separator.style === KottiBreadcrumb.SeparatorType.TEXT\"\n\t\t\t\t\t\tv-text=\"separator.value\"\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"kt-breadcrumb__text\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=\"handleClick(breadcrumb)\"\n\t\t\t\t\tv-text=\"breadcrumb.title\"\n\t\t\t\t/>\n\t\t\t</li>\n\t\t</ol>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiBreadcrumb } from './types'\n\nexport default defineComponent({\n\tname: 'KtBreadcrumb',\n\tprops: makeProps(KottiBreadcrumb.propsSchema),\n\tsetup(props) {\n\t\treturn {\n\t\t\tbreadCrumbClasses: (item: KottiBreadcrumb.Breadcrumb, index: number) => {\n\t\t\t\treturn {\n\t\t\t\t\t'kt-breadcrumb__list-item': true,\n\t\t\t\t\t'kt-breadcrumb__list-item--is-active':\n\t\t\t\t\t\t!item.isDisabled && index === props.activeIndex,\n\t\t\t\t\t'kt-breadcrumb__list-item--is-completed':\n\t\t\t\t\t\t!item.isDisabled && item.isCompleted,\n\t\t\t\t\t'kt-breadcrumb__list-item--is-disabled': item.isDisabled,\n\t\t\t\t}\n\t\t\t},\n\t\t\thandleClick: (item: KottiBreadcrumb.Breadcrumb) => {\n\t\t\t\tif (item.isDisabled) return\n\t\t\t\titem.onClick()\n\t\t\t},\n\t\t\tKottiBreadcrumb,\n\t\t\tshowSeparator: (index: number) =>\n\t\t\t\tindex > 0 && index < props.breadcrumbs.length,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-breadcrumb {\n\t--breadcrumb-color-completed: var(--interactive-03);\n\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\tol {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t}\n\n\t&__list-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin: 0.1rem 0;\n\t\tcolor: var(--text-01);\n\n\t\t&--is-active,\n\t\t&--is-completed {\n\t\t\tcolor: var(--breadcrumb-color-completed);\n\t\t}\n\n\t\t&--is-active {\n\t\t\tfont-weight: 700;\n\t\t}\n\n\t\t&--is-disabled {\n\t\t\tcolor: var(--text-05);\n\t\t\tcursor: not-allowed;\n\n\t\t\t.kt-breadcrumb__text:hover {\n\t\t\t\tcolor: var(--text-05);\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__text:hover {\n\t\tcolor: var(--interactive-01-hover);\n\t\tcursor: pointer;\n\t}\n\n\t&__separator {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin: 0 0.2rem;\n\n\t\t.yoco {\n\t\t\tfont-size: 1rem;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtBreadcrumbVue from './KtBreadcrumb.vue'\nimport { KottiBreadcrumb } from './types'\n\nexport const KtBreadcrumb = attachMeta(makeInstallable(KtBreadcrumbVue), {\n\taddedVersion: '0.0.5',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A126',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Breadcrumb',\n\t\tschema: KottiBreadcrumb.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"kt-button-group\">\n\t\t<slot />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n\tname: 'KtButtonGroup',\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-style/_variables.scss';\n\n.kt-button-group {\n\tfont-size: 0; /* Fix for inline element space https://css-tricks.com/fighting-the-space-between-inline-block-elements/ */\n\n\t.kt-button {\n\t\tfont-size: $font-size;\n\t\tborder-radius: 0;\n\n\t\t&:first-of-type {\n\t\t\tborder-radius: var(--border-radius) 0 0 var(--border-radius);\n\t\t}\n\n\t\t&:last-of-type {\n\t\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0;\n\t\t}\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtButtonGroupVue from './KtButtonGroup.vue'\n\nexport const KtButtonGroup = attachMeta(makeInstallable(KtButtonGroupVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {\n\t\tdefault: { description: 'Should contain KtButtons', scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.ButtonGroup',\n\t\tschema: null,\n\t},\n})\n","<template>\n\t<div :class=\"cardClass\" tabindex=\"0\" @click.prevent=\"handleClick\">\n\t\t<div v-if=\"imgUrl\" :class=\"imageRowClass\">\n\t\t\t<div v-if=\"isImgLoading\" class=\"skeleton square md\" />\n\t\t\t<img v-else class=\"kt-card__image\" :src=\"imgUrl\" />\n\t\t</div>\n\t\t<div v-if=\"$slots['card-header']\" class=\"kt-card__header\">\n\t\t\t<div v-if=\"isTextLoading\" class=\"skeleton rectangle md\" />\n\t\t\t<slot v-else name=\"card-header\" />\n\t\t</div>\n\t\t<div v-if=\"$slots['card-body']\" class=\"kt-card__body\">\n\t\t\t<div v-if=\"isTextLoading\" class=\"skeleton rectangle sm\" />\n\t\t\t<slot v-else name=\"card-body\" />\n\t\t</div>\n\t\t<div v-if=\"hasActions\" class=\"kt-card__footer\">\n\t\t\t<div v-if=\"hasActions && !isTextLoading\">\n\t\t\t\t<KtButton\n\t\t\t\t\t:data-test=\"secondaryActionDataTest\"\n\t\t\t\t\t:label=\"secondaryActionLabel\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t@click.prevent=\"$emit('clickOnSecondaryButton')\"\n\t\t\t\t/>\n\t\t\t\t<KtButton\n\t\t\t\t\t:data-test=\"primaryActionDataTest\"\n\t\t\t\t\t:label=\"primaryActionLabel\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t@click.prevent=\"$emit('clickOnPrimaryButton')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { KtButton } from '../kotti-button'\nimport { makeProps } from '../make-props'\n\nimport { KottiCard } from './types'\n\nexport default defineComponent({\n\tname: 'KtCard',\n\tcomponents: { KtButton },\n\tprops: makeProps(KottiCard.propsSchema),\n\temits: ['click', 'clickOnPrimaryButton', 'clickOnSecondaryButton'],\n\tsetup(props, { emit }) {\n\t\tconst hasActions = computed(\n\t\t\t() =>\n\t\t\t\tprops.primaryActionLabel != null && props.secondaryActionLabel != null,\n\t\t)\n\n\t\treturn {\n\t\t\tcardClass: computed(() => ({\n\t\t\t\t[`kt-card--has-${props.imgPosition}-image`]: props.imgUrl,\n\t\t\t\t'kt-card': true,\n\t\t\t\t'kt-card--is-clickable': !hasActions.value,\n\t\t\t})),\n\t\t\thandleClick: () => {\n\t\t\t\tif (!hasActions.value) emit('click')\n\t\t\t},\n\t\t\thasActions,\n\t\t\timageRowClass: computed(() => ({\n\t\t\t\t[`kt-card__image-row--is-${props.imgPosition}`]: props.imgUrl,\n\t\t\t\t'kt-card__image-row': true,\n\t\t\t})),\n\t\t\tKottiCard,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-card {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: var(--unit-4);\n\tword-break: break-word;\n\tbackground: var(--ui-background);\n\tborder-radius: var(--border-radius);\n\n\t&--has-top-image {\n\t\tpadding-top: 0;\n\t}\n\n\t&--has-bottom-image {\n\t\tpadding-bottom: 0;\n\t}\n\n\t&--is-clickable {\n\t\tborder: 1px solid var(--ui-01);\n\n\t\t&:hover {\n\t\t\tcursor: pointer;\n\t\t\tborder: 1px solid var(--interactive-01-hover);\n\t\t}\n\n\t\t&:active {\n\t\t\tborder-color: var(--primary-90);\n\t\t}\n\t}\n\n\t.skeleton {\n\t\tmargin: 0;\n\t}\n\n\t&__header {\n\t\torder: 2;\n\n\t\t.skeleton {\n\t\t\tmargin: 0 0 var(--unit-2) 0;\n\t\t}\n\t}\n\n\t&__body {\n\t\torder: 4;\n\t}\n\n\t&__footer {\n\t\torder: 5;\n\t\ttext-align: right;\n\t}\n\n\t&__image-row {\n\t\tmargin: var(--unit-4) calc(-1 * var(--unit-4));\n\n\t\t&--is-top {\n\t\t\torder: 1;\n\t\t\tmargin-top: 0;\n\n\t\t\t.kt-card__image {\n\t\t\t\tborder-top-left-radius: var(--border-radius);\n\t\t\t\tborder-top-right-radius: var(--border-radius);\n\t\t\t}\n\t\t}\n\n\t\t&--is-middle {\n\t\t\torder: 3;\n\t\t}\n\n\t\t&--is-bottom {\n\t\t\torder: 6;\n\t\t\tmargin-bottom: 0;\n\n\t\t\t.kt-card__image {\n\t\t\t\tborder-bottom-right-radius: var(--border-radius);\n\t\t\t\tborder-bottom-left-radius: var(--border-radius);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__image {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtCardVue from './KtCard.vue'\nimport { KottiCard } from './types'\n\nexport const KtCard = attachMeta(makeInstallable(KtCardVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?type=design&node-id=5144-11435&mode=design&t=lct468cSPHUMxSuu-0',\n\t},\n\tslots: {\n\t\t'card-body': { description: null, scope: null },\n\t\t'card-footer': { description: null, scope: null },\n\t\t'card-header': { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Card',\n\t\tschema: KottiCard.propsSchema,\n\t},\n})\n","export const KT_ROW_CONTEXT = Symbol('KT_ROW_CONTEXT')\n","import { computed, defineComponent, h, inject } from 'vue'\nimport type { PropType } from 'vue'\n\nimport { KT_ROW_CONTEXT } from '../kotti-row/constants'\nimport type { KottiRow } from '../kotti-row/types'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport type { KottiCol } from './types'\n\nexport const KtCol = attachMeta(\n\tmakeInstallable(\n\t\tdefineComponent({\n\t\t\tname: 'KtCol',\n\t\t\tprops: {\n\t\t\t\tlg: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['lg']>,\n\t\t\t\t},\n\t\t\t\tmd: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['md']>,\n\t\t\t\t},\n\t\t\t\toffset: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['offset']>,\n\t\t\t\t},\n\t\t\t\tpull: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['pull']>,\n\t\t\t\t},\n\t\t\t\tpush: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['push']>,\n\t\t\t\t},\n\t\t\t\tsm: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['sm']>,\n\t\t\t\t},\n\t\t\t\tspan: {\n\t\t\t\t\tdefault: 24,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['span']>,\n\t\t\t\t},\n\t\t\t\ttag: {\n\t\t\t\t\tdefault: 'div',\n\t\t\t\t\ttype: String as PropType<KottiCol.PropsInternal['tag']>,\n\t\t\t\t},\n\t\t\t\txl: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['xl']>,\n\t\t\t\t},\n\t\t\t\txs: {\n\t\t\t\t\tdefault: null,\n\t\t\t\t\ttype: Number as PropType<KottiCol.PropsInternal['xs']>,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsetup(props, { slots }) {\n\t\t\t\tconst context = inject<KottiRow.Context | null>(KT_ROW_CONTEXT, null)\n\n\t\t\t\tconst style = computed(() => {\n\t\t\t\t\tif (context === null) return undefined\n\n\t\t\t\t\tconst { gap, gutter } = context\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaddingBottom: `${(gap.value / 2).toString()}px`,\n\t\t\t\t\t\tpaddingLeft: `${(gutter.value / 2).toString()}px`,\n\t\t\t\t\t\tpaddingRight: `${(gutter.value / 2).toString()}px`,\n\t\t\t\t\t\tpaddingTop: `${(gap.value / 2).toString()}px`,\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tconst classes = computed(() => [\n\t\t\t\t\t'kt-col',\n\t\t\t\t\t`kt-col-${props.span.toString()}`,\n\t\t\t\t\t...Object.entries(props)\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t([key, value]) =>\n\t\t\t\t\t\t\t\tvalue !== null &&\n\t\t\t\t\t\t\t\t/* eslint-disable perfectionist/sort-array-includes */\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t'offset',\n\t\t\t\t\t\t\t\t\t'pull',\n\t\t\t\t\t\t\t\t\t'push',\n\t\t\t\t\t\t\t\t\t'xs',\n\t\t\t\t\t\t\t\t\t'sm',\n\t\t\t\t\t\t\t\t\t'md',\n\t\t\t\t\t\t\t\t\t'lg',\n\t\t\t\t\t\t\t\t\t'xl',\n\t\t\t\t\t\t\t\t].includes(key),\n\t\t\t\t\t\t\t/* eslint-enable perfectionist/sort-array-includes */\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map(([key, value]) => `kt-col-${key}-${value?.toString() ?? ''}`),\n\t\t\t\t])\n\n\t\t\t\treturn () =>\n\t\t\t\t\th(\n\t\t\t\t\t\tprops.tag,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclass: classes.value,\n\t\t\t\t\t\t\tstyle: style.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[slots.default?.() ?? null],\n\t\t\t\t\t)\n\t\t\t},\n\t\t}),\n\t),\n\t{\n\t\taddedVersion: '0.0.1',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: {\n\t\t\tdefault: { description: null, scope: null },\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.Col',\n\t\t\tschema: null,\n\t\t},\n\t},\n)\n","export const KT_I18N_CONTEXT = Symbol('KT_I18N_CONTEXT')\n","import type { KottiI18n } from '../types'\n\nnamespace Common {\n\texport const is = 'ist'\n\n\texport const isEmpty = 'ist leer'\n\n\texport const number = {\n\t\tEQUAL: 'ist gleich',\n\t\tGREATER_THAN: 'ist größer als',\n\t\tGREATER_THAN_OR_EQUAL: 'ist größer als oder gleich',\n\t\tIS_EMPTY: Common.isEmpty,\n\t\tLESS_THAN: 'ist weniger als',\n\t\tLESS_THAN_OR_EQUAL: 'ist weniger als oder gleich',\n\t}\n\n\texport const restrictedAccess = 'Eingeschränkter Zugriff'\n}\n\nexport const deDE: KottiI18n.Messages = {\n\tKtComment: {\n\t\tcancelMessage: 'Esc drücken oder',\n\t\tclickToCancelLabel: 'klicken, um abzubrechen',\n\t\tdeleteButton: 'Löschen',\n\t\teditButton: 'Bearbeiten',\n\t\teditedLabel: 'Bearbeitet',\n\t\tinternalLabel: Common.restrictedAccess,\n\t\tlockedHelpText: Common.restrictedAccess,\n\t\tpostButton: 'Posten',\n\t\treplyButton: 'Antworten',\n\t\treplyToLabel: 'Antwort an',\n\t\tunlockedHelpText: 'Für alle Nutzer sichtbar',\n\t},\n\tKtFieldFileUpload: {\n\t\tbutton: {\n\t\t\tacceptPhoto: 'Foto verwenden',\n\t\t\tcancel: 'Abbrechen',\n\t\t\tnextCamera: 'Nächste Kamera',\n\t\t\trejectPhoto: 'Foto erneut aufnehmen',\n\t\t\tretry: 'Erneut versuchen',\n\t\t\ttakePhoto: 'Foto aufnehmen',\n\t\t},\n\t\terror: {\n\t\t\tmultipleNotAllowed: 'Hochladen mehrerer Dateien nicht erlaubt',\n\t\t\tnotAllowed: 'Zugriff auf die Kamera verweigert',\n\t\t\tnotFound: 'Es konnte keine Kamera gefunden werden',\n\t\t\tnotSupported: 'Es konnte keine kompatible Kamera gefunden werden',\n\t\t},\n\t\tlabel: {\n\t\t\tcapture: 'Foto aufnehmen',\n\t\t\terror: 'Fehler',\n\t\t\tinternal: Common.restrictedAccess,\n\t\t\treview: 'Überprüfen',\n\t\t\tunknown: 'Unbekannt',\n\t\t},\n\t\tstatusMsg: {\n\t\t\tCANCELED: 'Abgebrochen',\n\t\t\tERROR: 'Upload fehlgeschlagen, bitte versuchen Sie es erneut',\n\t\t\tHIDDEN: '',\n\t\t\tINVALID: 'Ungültig',\n\t\t\tNOT_STARTED: 'Nicht angefangen',\n\t\t\tREADY_TO_UPLOAD: 'Bereit zum Hochladen bei Einreichung',\n\t\t\tUPLOADED: 'Hochgeladen',\n\t\t\tUPLOADED_WITH_ERROR: 'Mit Fehler hochgeladen',\n\t\t\tUPLOADING: 'Wird hochgeladen …',\n\t\t},\n\t\ttext: {\n\t\t\tclickToUpload: 'Zum Hochladen klicken',\n\t\t\tdragAndDrop: 'or drag and drop your files here',\n\t\t\tlearnMore: 'Mehr erfahren',\n\t\t\tmax: 'max.',\n\t\t},\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: 'Nicht unterstütztes Dateiformat',\n\t\t\tMAX_SIZE_EXCEEDED: 'Maximal zulässige Dateigröße überschritten',\n\t\t},\n\t},\n\tKtFieldInlineEdit: {\n\t\tplaceholder: 'Zum Bearbeiten klicken',\n\t},\n\tKtFields: {\n\t\toptionalLabel: 'Optional',\n\t\trequiredMessage: 'Dieses Feld ist erforderlich',\n\t},\n\tKtFieldSelects: {\n\t\tloadingText: 'Wird geladen',\n\t\tnoDataText: 'Keine Ergebnisse',\n\t\tnoMatchText: 'Keine passenden Daten',\n\t\tplaceholder: 'Auswählen',\n\t},\n\tKtFilters: {\n\t\taddFilterLabel: 'Filter hinzufügen',\n\t\tandLabel: 'Und',\n\t\tboolean: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tclearAllLabel: 'Alles löschen',\n\t\tcurrency: Common.number,\n\t\tdateRange: {\n\t\t\tIN_RANGE: 'ist im Bereich',\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\temptyListLabel: 'Keine Filter angewendet',\n\t\tfilterLabel: 'Filter',\n\t\tfiltersLabel: 'Filter',\n\t\tfloat: Common.number,\n\t\tinteger: Common.number,\n\t\tmultiEnum: {\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t\tONE_OF: 'ist einer von',\n\t\t},\n\t\tsearchLabel: 'Suche',\n\t\tsingleEnum: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tstring: {\n\t\t\tCONTAINS: 'enthält',\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tunsetLabel: 'Einstellung aufheben',\n\t\twhereLabel: 'Wo',\n\t},\n\tKtFormSubmit: {\n\t\terrorsSectionTitle: 'Fehler',\n\t\ttitle: 'Formularübertragung nicht erlaubt',\n\t\twarningsSectionTitle: 'Warnungen',\n\t},\n\tKtNavbar: {\n\t\tmenuCollapse: 'Menü einklappen',\n\t\tmenuExpand: 'Menü ausklappen',\n\t\tquickLinksTitle: 'Kurzlinks',\n\t},\n\tKtStandardTable: {\n\t\tclearAll: 'Alles löschen',\n\t\tclearSelection: 'Auswahl löschen',\n\t\teditColumns: 'Spalten bearbeiten',\n\t\teditFilters: 'Filter bearbeiten',\n\t\tendDate: 'Ende',\n\t\titemsPerPage: 'Elemente pro Seite',\n\t\tlastMonth: 'Letzter Monat',\n\t\tlastWeek: 'Letzte Woche',\n\t\tlastYear: 'Letztes Jahr',\n\t\tmax: 'Max.',\n\t\tmin: 'Min.',\n\t\tmoreThan: 'Mehr als',\n\t\tresultsCounter:\n\t\t\t'Keine Elemente | {range} von {total} Element | {range} von {total} Elementen',\n\t\tsearch: 'Suche',\n\t\tselectionCount: '| {count} Element ausgewählt | {count} items ausgewählt',\n\t\tshowAll: 'Alles anzeigen',\n\t\tstartDate: 'Start',\n\t\ttoday: 'Heute',\n\t\tupTo: 'Bis zu',\n\t},\n\tKtTable: {\n\t\tno: 'Nein',\n\t\tnoItems: 'Keine Elemente',\n\t\tyes: 'Ja',\n\t},\n\tKtValueLabel: {\n\t\tnotSet: 'Nicht festgelegt',\n\t},\n}\n","import type { KottiI18n } from '../types'\n\nnamespace Common {\n\texport const is = 'is'\n\n\texport const isEmpty = 'is empty'\n\n\texport const number = {\n\t\tEQUAL: 'is equal to',\n\t\tGREATER_THAN: 'is greater than',\n\t\tGREATER_THAN_OR_EQUAL: 'is greater than or equal to',\n\t\tIS_EMPTY: Common.isEmpty,\n\t\tLESS_THAN: 'is less than',\n\t\tLESS_THAN_OR_EQUAL: 'is less than or equal to',\n\t}\n\n\texport const restrictedAccess = 'Restricted access'\n}\n\nexport const enUS: KottiI18n.Messages = {\n\tKtComment: {\n\t\tcancelMessage: 'Press Esc key or',\n\t\tclickToCancelLabel: 'click to cancel',\n\t\tdeleteButton: 'Delete',\n\t\teditButton: 'Edit',\n\t\teditedLabel: 'Edited',\n\t\tinternalLabel: Common.restrictedAccess,\n\t\tlockedHelpText: Common.restrictedAccess,\n\t\tpostButton: 'Post',\n\t\treplyButton: 'Reply',\n\t\treplyToLabel: 'Reply to',\n\t\tunlockedHelpText: 'Visible to all users',\n\t},\n\tKtFieldFileUpload: {\n\t\tbutton: {\n\t\t\tacceptPhoto: 'Use Photo',\n\t\t\tcancel: 'Cancel',\n\t\t\tnextCamera: 'Next Camera',\n\t\t\trejectPhoto: 'Retake Photo',\n\t\t\tretry: 'Retry',\n\t\t\ttakePhoto: 'Take Photo',\n\t\t},\n\t\terror: {\n\t\t\tmultipleNotAllowed: 'Multiple files upload not allowed',\n\t\t\tnotAllowed: 'Permission denied to use the camera',\n\t\t\tnotFound: 'No available camera found',\n\t\t\tnotSupported: 'No compatible camera found',\n\t\t},\n\t\tlabel: {\n\t\t\tcapture: 'Take Photo',\n\t\t\terror: 'Error',\n\t\t\tinternal: Common.restrictedAccess,\n\t\t\treview: 'Review',\n\t\t\tunknown: 'Unknown',\n\t\t},\n\t\tstatusMsg: {\n\t\t\tCANCELED: 'Canceled',\n\t\t\tERROR: 'Upload failed, please try again',\n\t\t\tHIDDEN: '',\n\t\t\tINVALID: 'Invalid',\n\t\t\tNOT_STARTED: 'Not started',\n\t\t\tREADY_TO_UPLOAD: 'Ready to upload on submittal',\n\t\t\tUPLOADED: 'Uploaded',\n\t\t\tUPLOADED_WITH_ERROR: 'Uploaded with error',\n\t\t\tUPLOADING: 'Uploading...',\n\t\t},\n\t\ttext: {\n\t\t\tclickToUpload: 'Click to upload',\n\t\t\tdragAndDrop: 'or drag and drop your files here',\n\t\t\tlearnMore: 'Learn more',\n\t\t\tmax: 'max.',\n\t\t},\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: 'File format not supported',\n\t\t\tMAX_SIZE_EXCEEDED: 'Maximum file size allowed exceeded',\n\t\t},\n\t},\n\tKtFieldInlineEdit: {\n\t\tplaceholder: 'Click to Edit',\n\t},\n\tKtFields: {\n\t\toptionalLabel: 'Optional',\n\t\trequiredMessage: 'This field is required',\n\t},\n\tKtFieldSelects: {\n\t\tloadingText: 'Loading',\n\t\tnoDataText: 'No results',\n\t\tnoMatchText: 'No matching data',\n\t\tplaceholder: 'Select',\n\t},\n\tKtFilters: {\n\t\taddFilterLabel: 'Add Filter',\n\t\tandLabel: 'And',\n\t\tboolean: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tclearAllLabel: 'Clear All',\n\t\tcurrency: Common.number,\n\t\tdateRange: {\n\t\t\tIN_RANGE: 'is in range',\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\temptyListLabel: 'No Filters Applied',\n\t\tfilterLabel: 'Filter',\n\t\tfiltersLabel: 'Filters',\n\t\tfloat: Common.number,\n\t\tinteger: Common.number,\n\t\tmultiEnum: {\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t\tONE_OF: 'is one of',\n\t\t},\n\t\tsearchLabel: 'Search',\n\t\tsingleEnum: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tstring: {\n\t\t\tCONTAINS: 'contains',\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tunsetLabel: 'Unset',\n\t\twhereLabel: 'Where',\n\t},\n\tKtFormSubmit: {\n\t\terrorsSectionTitle: 'Errors',\n\t\ttitle: 'Form Submission Not Allowed',\n\t\twarningsSectionTitle: 'Warnings',\n\t},\n\tKtNavbar: {\n\t\tmenuCollapse: 'Collapse menu',\n\t\tmenuExpand: 'Expand menu',\n\t\tquickLinksTitle: 'Quick Links',\n\t},\n\tKtStandardTable: {\n\t\tclearAll: 'Clear All',\n\t\tclearSelection: 'Clear Selection',\n\t\teditColumns: 'Edit Columns',\n\t\teditFilters: 'Edit Filters',\n\t\tendDate: 'End',\n\t\titemsPerPage: 'Items per page',\n\t\tlastMonth: 'Last Month',\n\t\tlastWeek: 'Last Week',\n\t\tlastYear: 'Last Year',\n\t\tmax: 'Max.',\n\t\tmin: 'Min.',\n\t\tmoreThan: 'More Than',\n\t\tresultsCounter:\n\t\t\t'No items | {range} of {total} item | {range} of {total} items',\n\t\tsearch: 'Search',\n\t\tselectionCount: '| {count} item selected | {count} items selected',\n\t\tshowAll: 'Show All',\n\t\tstartDate: 'Start',\n\t\ttoday: 'Today',\n\t\tupTo: 'Up To',\n\t},\n\tKtTable: {\n\t\tno: 'No',\n\t\tnoItems: 'No items',\n\t\tyes: 'Yes',\n\t},\n\tKtValueLabel: {\n\t\tnotSet: 'Not Set',\n\t},\n}\n","import type { KottiI18n } from '../types'\n\nnamespace Common {\n\texport const is = 'es'\n\n\texport const isEmpty = 'está vacío'\n\n\texport const number = {\n\t\tEQUAL: 'es igual a',\n\t\tGREATER_THAN: 'es mayor que',\n\t\tGREATER_THAN_OR_EQUAL: 'es mayor o igual a',\n\t\tIS_EMPTY: Common.isEmpty,\n\t\tLESS_THAN: 'es menor que',\n\t\tLESS_THAN_OR_EQUAL: 'es menor o igual a',\n\t}\n\n\texport const restrictedAccess = 'Acceso restringido'\n}\n\nexport const esES: KottiI18n.Messages = {\n\tKtComment: {\n\t\tcancelMessage: 'Pulse la tecla Esc o',\n\t\tclickToCancelLabel: 'haga clic para cancelar',\n\t\tdeleteButton: 'Borrar',\n\t\teditButton: 'Editar',\n\t\teditedLabel: 'Editado',\n\t\tinternalLabel: Common.restrictedAccess,\n\t\tlockedHelpText: Common.restrictedAccess,\n\t\tpostButton: 'Publicar',\n\t\treplyButton: 'Responder',\n\t\treplyToLabel: 'Responder a',\n\t\tunlockedHelpText: 'Visible para todos los usuarios',\n\t},\n\tKtFieldFileUpload: {\n\t\tbutton: {\n\t\t\tacceptPhoto: 'Usar Foto',\n\t\t\tcancel: 'Cancelar',\n\t\t\tnextCamera: 'Siguiente Cámara',\n\t\t\trejectPhoto: 'Volver a tomar Foto',\n\t\t\tretry: 'Reintentar',\n\t\t\ttakePhoto: 'Tomar Foto',\n\t\t},\n\t\terror: {\n\t\t\tmultipleNotAllowed: 'No se permite cargar múltiples archivos',\n\t\t\tnotAllowed: 'Permiso denegado para usar la cámara',\n\t\t\tnotFound: 'No se ha encontrado ninguna cámara disponible',\n\t\t\tnotSupported: 'No se ha encontrado ninguna cámara compatible',\n\t\t},\n\t\tlabel: {\n\t\t\tcapture: 'Tomar Foto',\n\t\t\terror: 'Error',\n\t\t\tinternal: Common.restrictedAccess,\n\t\t\treview: 'Revisar',\n\t\t\tunknown: 'Desconocido',\n\t\t},\n\t\tstatusMsg: {\n\t\t\tCANCELED: 'Cancelado',\n\t\t\tERROR: 'Carga fallida, por favor inténtelo de nuevo',\n\t\t\tHIDDEN: '',\n\t\t\tINVALID: 'Inválido',\n\t\t\tNOT_STARTED: 'No iniciado',\n\t\t\tREADY_TO_UPLOAD: 'Listo para cargar en el envío',\n\t\t\tUPLOADED: 'Cargado',\n\t\t\tUPLOADED_WITH_ERROR: 'Cargado con error',\n\t\t\tUPLOADING: 'Cargando...',\n\t\t},\n\t\ttext: {\n\t\t\tclickToUpload: 'Haga clic para cargar',\n\t\t\tdragAndDrop: 'o arrastre y suelte sus archivos aquí',\n\t\t\tlearnMore: 'Más información',\n\t\t\tmax: 'máx.',\n\t\t},\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: 'Formato de archivo no compatible',\n\t\t\tMAX_SIZE_EXCEEDED: 'Se ha excedido el tamaño máximo de archivo permitido',\n\t\t},\n\t},\n\tKtFieldInlineEdit: {\n\t\tplaceholder: 'Haga clic para editar',\n\t},\n\tKtFields: {\n\t\toptionalLabel: 'Opcional',\n\t\trequiredMessage: 'Este campo es obligatorio',\n\t},\n\tKtFieldSelects: {\n\t\tloadingText: 'Cargando',\n\t\tnoDataText: 'Sin resultados',\n\t\tnoMatchText: 'No hay datos que coincidan',\n\t\tplaceholder: 'Seleccionar',\n\t},\n\tKtFilters: {\n\t\taddFilterLabel: 'Añadir Filtro',\n\t\tandLabel: 'Y',\n\t\tboolean: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tclearAllLabel: 'Borrar Todo',\n\t\tcurrency: Common.number,\n\t\tdateRange: {\n\t\t\tIN_RANGE: 'está en el rango',\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\temptyListLabel: 'No se han aplicado filtros',\n\t\tfilterLabel: 'Filtro',\n\t\tfiltersLabel: 'Filtros',\n\t\tfloat: Common.number,\n\t\tinteger: Common.number,\n\t\tmultiEnum: {\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t\tONE_OF: 'es uno de',\n\t\t},\n\t\tsearchLabel: 'Buscar',\n\t\tsingleEnum: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tstring: {\n\t\t\tCONTAINS: 'contiene',\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tunsetLabel: 'No establecido',\n\t\twhereLabel: 'Dónde',\n\t},\n\tKtFormSubmit: {\n\t\terrorsSectionTitle: 'Errores',\n\t\ttitle: 'Envío de formulario no permitido',\n\t\twarningsSectionTitle: 'Advertencias',\n\t},\n\tKtNavbar: {\n\t\tmenuCollapse: 'Contraer el menú',\n\t\tmenuExpand: 'Expandir el menú',\n\t\tquickLinksTitle: 'Enlaces rápidos',\n\t},\n\tKtStandardTable: {\n\t\tclearAll: 'Despejar todo',\n\t\tclearSelection: 'Clear Selection',\n\t\teditColumns: 'Editar columnas',\n\t\teditFilters: 'Editar filtros',\n\t\tendDate: 'Finalización',\n\t\titemsPerPage: 'Artículos por página',\n\t\tlastMonth: 'Mes pasado',\n\t\tlastWeek: 'Semana pasada',\n\t\tlastYear: 'Año pasado',\n\t\tmax: 'Máx.',\n\t\tmin: 'Mín.',\n\t\tmoreThan: 'Más de',\n\t\tresultsCounter:\n\t\t\t'No hay artículos | {range} de {total} artículo | {range} de {total} artículos',\n\t\tsearch: 'Buscar',\n\t\tselectionCount: '| {count} item selected | {count} items selected',\n\t\tshowAll: 'Mostrar todo',\n\t\tstartDate: 'Inicio',\n\t\ttoday: 'Hoy',\n\t\tupTo: 'Hasta',\n\t},\n\tKtTable: {\n\t\tno: 'No',\n\t\tnoItems: 'No hay artículos',\n\t\tyes: 'Yes',\n\t},\n\tKtValueLabel: {\n\t\tnotSet: 'No Establecido',\n\t},\n}\n","import type { KottiI18n } from '../types'\n\nnamespace Common {\n\texport const is = 'est'\n\n\texport const isEmpty = 'est vide'\n\n\texport const number = {\n\t\tEQUAL: 'est égal à',\n\t\tGREATER_THAN: 'est supérieur à',\n\t\tGREATER_THAN_OR_EQUAL: 'est supérieur ou égal à',\n\t\tIS_EMPTY: Common.isEmpty,\n\t\tLESS_THAN: 'est inférieur à',\n\t\tLESS_THAN_OR_EQUAL: 'est inférieur ou égal à',\n\t}\n\n\texport const restrictedAccess = 'Accès limité'\n}\n\nexport const frFR: KottiI18n.Messages = {\n\tKtComment: {\n\t\tcancelMessage: 'Appuyez sur la touche Échap ou',\n\t\tclickToCancelLabel: 'cliquez pour annuler',\n\t\tdeleteButton: 'Supprimer',\n\t\teditButton: 'Modifier',\n\t\teditedLabel: 'Modifié',\n\t\tinternalLabel: Common.restrictedAccess,\n\t\tlockedHelpText: Common.restrictedAccess,\n\t\tpostButton: 'Publier',\n\t\treplyButton: 'Répondre',\n\t\treplyToLabel: 'Répondre à',\n\t\tunlockedHelpText: 'Visible par tous les utilisateurs',\n\t},\n\tKtFieldFileUpload: {\n\t\tbutton: {\n\t\t\tacceptPhoto: 'Utiliser la photo',\n\t\t\tcancel: 'Annuler',\n\t\t\tnextCamera: 'Appareil photo suivant',\n\t\t\trejectPhoto: 'Reprendre la photo',\n\t\t\tretry: 'Réessayer',\n\t\t\ttakePhoto: 'Prendre une photo',\n\t\t},\n\t\terror: {\n\t\t\tmultipleNotAllowed:\n\t\t\t\t\"Le téléchargement de plusieurs fichiers n'est pas autorisé\",\n\t\t\tnotAllowed: \"L'autorisation d'accès à l'appareil photo a été refusée\",\n\t\t\tnotFound: 'Aucun appareil photo disponible trouvé',\n\t\t\tnotSupported: 'Aucun appareil photo compatible trouvé',\n\t\t},\n\t\tlabel: {\n\t\t\tcapture: 'Prendre une photo',\n\t\t\terror: 'Erreur',\n\t\t\tinternal: Common.restrictedAccess,\n\t\t\treview: 'Examiner',\n\t\t\tunknown: 'Inconnu',\n\t\t},\n\t\tstatusMsg: {\n\t\t\tCANCELED: 'Annulé',\n\t\t\tERROR: 'Échec du téléchargement, veuillez réessayer',\n\t\t\tHIDDEN: '',\n\t\t\tINVALID: 'Non valide',\n\t\t\tNOT_STARTED: 'Pas commencé',\n\t\t\tREADY_TO_UPLOAD: 'Prêt au téléchargement après envoi',\n\t\t\tUPLOADED: 'Téléchargement terminé',\n\t\t\tUPLOADED_WITH_ERROR: 'Téléchargement terminé avec une erreur',\n\t\t\tUPLOADING: 'Téléchargement en cours…',\n\t\t},\n\t\ttext: {\n\t\t\tclickToUpload: 'Cliquer pour télécharger',\n\t\t\tdragAndDrop: 'or drag and drop your files here',\n\t\t\tlearnMore: 'En savoir plus',\n\t\t\tmax: 'max.',\n\t\t},\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: 'Format de fichier non pris en charge',\n\t\t\tMAX_SIZE_EXCEEDED:\n\t\t\t\t'La taille maximale autorisée pour un fichier est dépassée',\n\t\t},\n\t},\n\tKtFieldInlineEdit: {\n\t\tplaceholder: 'Cliquez pour modifier',\n\t},\n\tKtFields: {\n\t\toptionalLabel: 'Facultatif',\n\t\trequiredMessage: 'Ce champ est obligatoire',\n\t},\n\tKtFieldSelects: {\n\t\tloadingText: 'Chargement en cours',\n\t\tnoDataText: 'Aucun résultat',\n\t\tnoMatchText: 'Aucune donnée trouvée',\n\t\tplaceholder: 'Sélectionner',\n\t},\n\tKtFilters: {\n\t\taddFilterLabel: 'Ajouter un filtre',\n\t\tandLabel: 'Et',\n\t\tboolean: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tclearAllLabel: 'Tout effacer',\n\t\tcurrency: Common.number,\n\t\tdateRange: {\n\t\t\tIN_RANGE: 'est dans la période',\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\temptyListLabel: 'Aucun filtre appliqué',\n\t\tfilterLabel: 'Filtre',\n\t\tfiltersLabel: 'Filtres',\n\t\tfloat: Common.number,\n\t\tinteger: Common.number,\n\t\tmultiEnum: {\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t\tONE_OF: \"est l'un de\",\n\t\t},\n\t\tsearchLabel: 'Rechercher',\n\t\tsingleEnum: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tstring: {\n\t\t\tCONTAINS: 'contient',\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tunsetLabel: 'Ne plus définir',\n\t\twhereLabel: 'Où',\n\t},\n\tKtFormSubmit: {\n\t\terrorsSectionTitle: 'Erreurs',\n\t\ttitle: \"L'envoi du formulaire n'est pas autorisé\",\n\t\twarningsSectionTitle: 'Avertissements',\n\t},\n\tKtNavbar: {\n\t\tmenuCollapse: 'Réduire le menu',\n\t\tmenuExpand: 'Développer le menu',\n\t\tquickLinksTitle: 'Liens rapides',\n\t},\n\tKtStandardTable: {\n\t\tclearAll: 'Tout effacer',\n\t\tclearSelection: 'Clear Selection',\n\t\teditColumns: 'Odifier les colonnes',\n\t\teditFilters: 'Modifier les filtres',\n\t\tendDate: 'Fin',\n\t\titemsPerPage: 'Éléments par page',\n\t\tlastMonth: 'Le mois dernier',\n\t\tlastWeek: 'La semaine dernière',\n\t\tlastYear: \"L'année dernière\",\n\t\tmax: 'Max.',\n\t\tmin: 'Min.',\n\t\tmoreThan: 'Plus de',\n\t\tresultsCounter:\n\t\t\t'Aucun élément | {range} de {total} élément | {range} de {total} éléments',\n\t\tsearch: 'Rechercher',\n\t\tselectionCount: '| {count} item selected | {count} items selected',\n\t\tshowAll: 'Afficher tout',\n\t\tstartDate: 'Début',\n\t\ttoday: \"Aujourd'hui\",\n\t\tupTo: \"Jusqu'à\",\n\t},\n\tKtTable: {\n\t\tno: 'Non',\n\t\tnoItems: 'Aucun élément',\n\t\tyes: 'Oui',\n\t},\n\tKtValueLabel: {\n\t\tnotSet: 'Non défini',\n\t},\n}\n","import type { KottiI18n } from '../types'\n\nnamespace Common {\n\texport const is = 'です'\n\n\texport const isEmpty = '空です'\n\n\texport const number = {\n\t\tEQUAL: 'に等しい',\n\t\tGREATER_THAN: 'より大きい',\n\t\tGREATER_THAN_OR_EQUAL: '以上',\n\t\tIS_EMPTY: Common.isEmpty,\n\t\tLESS_THAN: 'よりも少ない',\n\t\tLESS_THAN_OR_EQUAL: '以下である',\n\t}\n\n\texport const restrictedAccess = '制限付きアクセス'\n}\n\nexport const jaJP: KottiI18n.Messages = {\n\tKtComment: {\n\t\tcancelMessage: 'Escキーを押すか',\n\t\tclickToCancelLabel: 'クリックしてキャンセルします',\n\t\tdeleteButton: '消す',\n\t\teditButton: 'エディット',\n\t\teditedLabel: '編集済み',\n\t\tinternalLabel: Common.restrictedAccess,\n\t\tlockedHelpText: Common.restrictedAccess,\n\t\tpostButton: '送信',\n\t\treplyButton: '返信',\n\t\treplyToLabel: '返信',\n\t\tunlockedHelpText: 'すべてのユーザーに表示されます',\n\t},\n\tKtFieldFileUpload: {\n\t\tbutton: {\n\t\t\tacceptPhoto: '写真を使用',\n\t\t\tcancel: 'キャンセル',\n\t\t\tnextCamera: '次のカメラ',\n\t\t\trejectPhoto: '写真を撮り直す',\n\t\t\tretry: 'リトライ',\n\t\t\ttakePhoto: '写真を撮る',\n\t\t},\n\t\terror: {\n\t\t\tmultipleNotAllowed: '複数のファイルのアップロードは許可されていません',\n\t\t\tnotAllowed: 'カメラの使用が拒否されました',\n\t\t\tnotFound: '利用可能なカメラが見つかりません',\n\t\t\tnotSupported: '互換性のあるカメラが見つかりません',\n\t\t},\n\t\tlabel: {\n\t\t\tcapture: '写真を撮る',\n\t\t\terror: 'エラー',\n\t\t\tinternal: Common.restrictedAccess,\n\t\t\treview: 'レビュー',\n\t\t\tunknown: '知らない',\n\t\t},\n\t\tstatusMsg: {\n\t\t\tCANCELED: 'キャンセル',\n\t\t\tERROR: 'アップロードに失敗しました。もう一度お試しください',\n\t\t\tHIDDEN: '',\n\t\t\tINVALID: '無効',\n\t\t\tNOT_STARTED: '始まっていない',\n\t\t\tREADY_TO_UPLOAD: '提出時にアップロードする準備ができました',\n\t\t\tUPLOADED: 'アップロード済み',\n\t\t\tUPLOADED_WITH_ERROR: 'エラーでアップロードされました',\n\t\t\tUPLOADING: 'アップロード中...',\n\t\t},\n\t\ttext: {\n\t\t\tclickToUpload: 'クリックしてアップロード',\n\t\t\tdragAndDrop: 'or drag and drop your files here',\n\t\t\tlearnMore: 'もっと詳しく知る',\n\t\t\tmax: '最大',\n\t\t},\n\t\tvalidationMsg: {\n\t\t\tINVALID_EXTENSION: 'サポートされていないファイル形式',\n\t\t\tMAX_SIZE_EXCEEDED: '許容される最大ファイル サイズを超えました',\n\t\t},\n\t},\n\tKtFieldInlineEdit: {\n\t\tplaceholder: 'クリックで編集',\n\t},\n\tKtFields: {\n\t\toptionalLabel: '任意',\n\t\trequiredMessage: 'このフィールドは必須です。',\n\t},\n\tKtFieldSelects: {\n\t\tloadingText: 'ロード中',\n\t\tnoDataText: '結果がありません',\n\t\tnoMatchText: 'データなし',\n\t\tplaceholder: '選択してください',\n\t},\n\tKtFilters: {\n\t\taddFilterLabel: 'フィルタを追加',\n\t\tandLabel: 'そして',\n\t\tboolean: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tclearAllLabel: 'すべてクリア',\n\t\tcurrency: Common.number,\n\t\tdateRange: {\n\t\t\tIN_RANGE: '範囲内です',\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\temptyListLabel: 'フィルタが適用されていません',\n\t\tfilterLabel: 'フィルタ',\n\t\tfiltersLabel: 'フィルタ',\n\t\tfloat: Common.number,\n\t\tinteger: Common.number,\n\t\tmultiEnum: {\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t\tONE_OF: 'の一つであります',\n\t\t},\n\t\tsearchLabel: '探す',\n\t\tsingleEnum: {\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tstring: {\n\t\t\tCONTAINS: '含まれています',\n\t\t\tEQUAL: Common.is,\n\t\t\tIS_EMPTY: Common.isEmpty,\n\t\t},\n\t\tunsetLabel: '設定解除',\n\t\twhereLabel: 'どこ',\n\t},\n\tKtFormSubmit: {\n\t\terrorsSectionTitle: 'エラー',\n\t\ttitle: 'フォーム送信ができない',\n\t\twarningsSectionTitle: '注意事項',\n\t},\n\tKtNavbar: {\n\t\tmenuCollapse: 'メニューを閉じる',\n\t\tmenuExpand: '拡張メニュー',\n\t\tquickLinksTitle: 'クイックリンク',\n\t},\n\tKtStandardTable: {\n\t\tclearAll: 'Clear All',\n\t\tclearSelection: 'Clear Selection',\n\t\teditColumns: 'Edit Columns',\n\t\teditFilters: 'Edit Filters',\n\t\tendDate: 'End',\n\t\titemsPerPage: 'Items per page',\n\t\tlastMonth: 'Last Month',\n\t\tlastWeek: 'Last Week',\n\t\tlastYear: 'Last Year',\n\t\tmax: 'Max.',\n\t\tmin: 'Min.',\n\t\tmoreThan: 'More Than',\n\t\tresultsCounter:\n\t\t\t'No items | {range} of {total} item | {range} of {total} items',\n\t\tsearch: 'Search',\n\t\tselectionCount: '| {count} item selected | {count} items selected',\n\t\tshowAll: 'Show All',\n\t\tstartDate: 'Start',\n\t\ttoday: 'Today',\n\t\tupTo: 'Up To',\n\t},\n\tKtTable: {\n\t\tno: 'No',\n\t\tnoItems: 'No items',\n\t\tyes: 'Yes',\n\t},\n\tKtValueLabel: {\n\t\tnotSet: '未設定',\n\t},\n}\n","import deepmerge from 'deepmerge'\n\nimport type { DeepPartial } from './types'\n\n/**\n * deepmerge types do not support the DeepPartial type\n * although deepmerge supports the behavior\n * This helper function works-around that issue\n */\nexport const fixDeepMerge = <T extends Record<string, unknown>>(\n\tx: DeepPartial<T>,\n\ty: DeepPartial<T>,\n\t// @ts-expect-error deepmerge's parameters are typed with Partial<T>,\n\t// which is not compatible with DeepPartial<T>\n): T => deepmerge<T>(x, y)\n","import elementLocale from 'element-ui/lib/locale/index.js'\nimport type { Ref, UnwrapRef } from 'vue'\nimport { computed, inject, provide, reactive, watch } from 'vue'\n\nimport { DecimalSeparator } from '../types/decimal-separator'\n\nimport { KT_I18N_CONTEXT } from './constants'\nimport { deDE } from './locales/de-DE'\nimport { enUS } from './locales/en-US'\nimport { esES } from './locales/es-ES'\nimport { frFR } from './locales/fr-FR'\nimport { jaJP } from './locales/ja-JP'\nimport type { KottiI18n } from './types'\nimport { fixDeepMerge } from './utilities'\n\nexport const useI18nContext = (): KottiI18n.ContextInternal => {\n\tconst context = inject<KottiI18n.Context | null>(KT_I18N_CONTEXT, null)\n\n\tif (context === null)\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(\n\t\t\t'useI18nContext: Missing Translation Context, falling back to English',\n\t\t)\n\n\treturn reactive({\n\t\tcurrencyMap: computed<UnwrapRef<KottiI18n.Context['currencyMap']>>(\n\t\t\t() => context?.currencyMap.value ?? {},\n\t\t),\n\t\tlocale: computed<UnwrapRef<KottiI18n.Context['locale']>>(\n\t\t\t() => context?.locale.value ?? 'en-US',\n\t\t),\n\t\tmessages: computed<UnwrapRef<KottiI18n.Context['messages']>>(\n\t\t\t() => context?.messages.value ?? enUS,\n\t\t),\n\t\tnumberFormat: computed<UnwrapRef<KottiI18n.Context['numberFormat']>>(\n\t\t\t() =>\n\t\t\t\tcontext?.numberFormat.value ?? {\n\t\t\t\t\tdecimalSeparator: DecimalSeparator.DOT,\n\t\t\t\t},\n\t\t),\n\t})\n}\n\nexport const useTranslationNamespace = <NS extends keyof KottiI18n.Messages>(\n\tnamespace: NS,\n): Ref<Readonly<KottiI18n.Messages[NS]>> => {\n\tconst context = useI18nContext()\n\n\treturn computed(() => context.messages[namespace])\n}\n\ninterface DefaultObject<R extends Record<string, unknown>> {\n\tdefault: DefaultObject<R> | R\n}\n\n/**\n * HACK: This function works around a CJS/ESM/EsModule interop issue.\n *\n * The objects we import at `element-ui/lib/locale/lang/[a-z]{2}.js` are EsModules\n * (exports.__esModule = true). Due to current javascript flavour shenanigans,\n * the imported object that we need can be found at the root, at the `.default` key,\n * or even at the `.default.default` key.\n * To mitigate we iterate down the potential default chain until we arrive at the\n * right position.\n */\nconst accessDefaultKey = <R extends Record<string, unknown>>(\n\tobj: DefaultObject<R>,\n): R => {\n\tif (!('default' in obj)) return obj\n\n\tlet current: DefaultObject<R> | R = obj\n\n\t// Practically, this should terminate after at most 2 iterations. Make it 10 for good measure\n\tfor (let i = 0; i < 10; i++) {\n\t\tcurrent = current.default as DefaultObject<R> | R\n\t\tif (!('default' in current)) {\n\t\t\treturn current\n\t\t}\n\t}\n\tthrow new Error('accessDefaultKey: could not exhaust nested default keys')\n}\n\n/**\n * Provides the translation context to child components\n */\nexport const useI18nProvide = ({\n\tcurrencyMap,\n\tlocale,\n\tmessages,\n\tnumberFormat,\n}: {\n\tcurrencyMap: Ref<KottiI18n.Props['currencyMap']>\n\tlocale: Ref<KottiI18n.Props['locale']>\n\tmessages: Ref<KottiI18n.Props['messages']>\n\tnumberFormat: Ref<KottiI18n.Props['numberFormat']>\n}): void => {\n\tconst defaultMessages = computed(\n\t\t(): KottiI18n.Messages =>\n\t\t\t({\n\t\t\t\t'de-DE': deDE,\n\t\t\t\t'en-US': enUS,\n\t\t\t\t'es-ES': esES,\n\t\t\t\t'fr-FR': frFR,\n\t\t\t\t'ja-JP': jaJP,\n\t\t\t})[locale.value],\n\t)\n\n\t/**\n\t * Necessary for the date pickers\n\t */\n\twatch(\n\t\tlocale,\n\t\tasync (newValue) => {\n\t\t\ttry {\n\t\t\t\tconst elementUiTranslations = await {\n\t\t\t\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\t\t\t\t'de-DE': () => import('element-ui/lib/locale/lang/de.js'),\n\t\t\t\t\t'en-US': () => import('element-ui/lib/locale/lang/en.js'),\n\t\t\t\t\t'es-ES': () => import('element-ui/lib/locale/lang/es.js'),\n\t\t\t\t\t'fr-FR': () => import('element-ui/lib/locale/lang/fr.js'),\n\t\t\t\t\t'ja-JP': () => import('element-ui/lib/locale/lang/ja.js'),\n\t\t\t\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\t\t\t\t}[newValue]()\n\n\t\t\t\tconst resolvedEsModuleInterop = accessDefaultKey(elementUiTranslations)\n\n\t\t\t\telementLocale.use(resolvedEsModuleInterop)\n\t\t\t} catch (error) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t},\n\t\t{ flush: 'post', immediate: true },\n\t)\n\n\tprovide<KottiI18n.Context>(KT_I18N_CONTEXT, {\n\t\tcurrencyMap,\n\t\tlocale,\n\t\tmessages: computed(() =>\n\t\t\tfixDeepMerge<KottiI18n.Messages>(defaultMessages.value, messages.value),\n\t\t),\n\t\tnumberFormat: computed(() =>\n\t\t\tfixDeepMerge<KottiI18n.NumberFormat>(\n\t\t\t\t{\n\t\t\t\t\tdecimalSeparator: DecimalSeparator.DOT,\n\t\t\t\t},\n\t\t\t\tnumberFormat.value,\n\t\t\t),\n\t\t),\n\t})\n}\n","<template>\n\t<div class=\"kt-comment__actions\">\n\t\t<KtButton\n\t\t\tv-if=\"!isReply\"\n\t\t\tclass=\"kt-comment__actions__reply-button\"\n\t\t\t:data-test=\"`${dataTest}.reply-button`\"\n\t\t\t:label=\"translations.replyButton\"\n\t\t\t:tabIndex=\"tabIndex\"\n\t\t\ttype=\"text\"\n\t\t\t@click.stop=\"onReply\"\n\t\t/>\n\t\t<KtButton\n\t\t\tv-if=\"isEditable\"\n\t\t\tclass=\"kt-comment__actions__edit-button\"\n\t\t\t:data-test=\"`${dataTest}.edit-button`\"\n\t\t\t:label=\"translations.editButton\"\n\t\t\t:tabIndex=\"tabIndex\"\n\t\t\ttype=\"text\"\n\t\t\t@click.stop=\"onEdit\"\n\t\t/>\n\t\t<KtButton\n\t\t\tv-if=\"isDeletable\"\n\t\t\tclass=\"kt-comment__actions__delete-button\"\n\t\t\t:data-test=\"`${dataTest}.delete-button`\"\n\t\t\t:label=\"translations.deleteButton\"\n\t\t\t:tabIndex=\"tabIndex\"\n\t\t\ttype=\"text\"\n\t\t\t@click.stop=\"onDelete\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { KottiComment } from '../types'\n\nexport default defineComponent({\n\tname: 'CommentActions',\n\tprops: makeProps(KottiComment.Actions.schema),\n\temits: ['delete', 'reply', 'update:isEditing'],\n\tsetup(_, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtComment')\n\n\t\treturn {\n\t\t\tonDelete: () => {\n\t\t\t\temit('delete')\n\t\t\t},\n\t\t\tonEdit: () => {\n\t\t\t\temit('update:isEditing', true)\n\t\t\t},\n\t\t\tonReply: () => {\n\t\t\t\temit('reply')\n\t\t\t},\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment__actions {\n\tdisplay: flex;\n}\n</style>\n","<template>\n\t<div class=\"kt-comment-header\">\n\t\t<div class=\"kt-comment-header__left-wrapper\">\n\t\t\t<span class=\"kt-comment-header__user-name\" v-text=\"user.name\" />\n\t\t\t<span v-if=\"isInternal && !isReply\" class=\"kt-comment-header__internal\">\n\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.PERMISSION_LOCKED\" />\n\t\t\t\t{{ translations.internalLabel }}\n\t\t\t</span>\n\t\t</div>\n\t\t<div class=\"kt-comment-header__right-wrapper\">\n\t\t\t<span\n\t\t\t\tv-if=\"isModified\"\n\t\t\t\tclass=\"kt-comment-header__modified\"\n\t\t\t\tv-text=\"translations.editedLabel\"\n\t\t\t/>\n\t\t\t<span class=\"kt-comment-header__created-at\" v-text=\"createdAt\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { KottiComment } from '../types'\n\nexport default defineComponent({\n\tname: 'CommentHeader',\n\tprops: makeProps(KottiComment.Header.schema),\n\tsetup() {\n\t\tconst translations = useTranslationNamespace('KtComment')\n\n\t\treturn {\n\t\t\ttranslations,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment-header {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tline-height: 20px;\n\n\t&__left-wrapper {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tcolumn-gap: var(--unit-3);\n\t\talign-items: center;\n\t}\n\n\t&__right-wrapper {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap-reverse;\n\t\tcolumn-gap: var(--unit-4);\n\t\talign-items: center;\n\t\tjustify-content: flex-end;\n\t}\n\n\t&__created-at,\n\t&__modified {\n\t\tcolor: var(--text-03);\n\t}\n\n\t&__internal {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-1);\n\t\tcolor: var(--text-02);\n\n\t\t.yoco {\n\t\t\tfont-size: 0.9rem;\n\t\t}\n\t}\n\n\t&__user-name {\n\t\tcolor: var(--text-01);\n\t}\n}\n</style>\n","import type { Ref } from 'vue'\nimport { watch } from 'vue'\n\nimport type { KottiComment } from './types'\nimport { resizeTextarea } from './utilities'\n\nexport const useResizeTextarea = (\n\ttextareaRef: Ref<HTMLTextAreaElement | null>,\n\tvalue: Ref<KottiComment.TextArea.PropsInternal['value']>,\n): void => {\n\twatch(\n\t\t[textareaRef, value],\n\t\t() => {\n\t\t\tresizeTextarea(textareaRef.value)\n\t\t},\n\t\t{\n\t\t\tflush: 'post',\n\t\t\timmediate: true,\n\t\t},\n\t)\n}\n","<template>\n\t<div class=\"kt-comment-text-area\">\n\t\t<div\n\t\t\tref=\"containerRef\"\n\t\t\tclass=\"kt-comment-text-area__container\"\n\t\t\t:data-test=\"`${dataTest}.input-container`\"\n\t\t\t@focusin=\"hasFocus = true\"\n\t\t\t@focusout=\"hasFocus = false\"\n\t\t\t@keydown.esc.stop.prevent=\"onCancel\"\n\t\t>\n\t\t\t<textarea\n\t\t\t\tref=\"textareaRef\"\n\t\t\t\tclass=\"form-input\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\trows=\"1\"\n\t\t\t\t:tabindex=\"tabIndex\"\n\t\t\t\t:value=\"value\"\n\t\t\t\t@input=\"onInput\"\n\t\t\t/>\n\t\t\t<div class=\"kt-comment-text-area__actions\">\n\t\t\t\t<template v-if=\"allowInternal && !isReply\">\n\t\t\t\t\t<KtButton\n\t\t\t\t\t\t:data-test=\"`${dataTest}.toggle-internal-button`\"\n\t\t\t\t\t\t:tabIndex=\"hasFocus ? tabIndex : -1\"\n\t\t\t\t\t\tv-bind=\"toggleInternalButtonProps\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t@click=\"onToggleInternal\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div class=\"kt-comment-text-area__actions-divider\" />\n\t\t\t\t</template>\n\t\t\t\t<KtButton\n\t\t\t\t\t:data-test=\"`${dataTest}.confirm-button`\"\n\t\t\t\t\t:disabled=\"isEmpty\"\n\t\t\t\t\t:icon=\"Yoco.Icon.SEND\"\n\t\t\t\t\t:tabIndex=\"hasFocus ? tabIndex : -1\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t@click.stop.prevent=\"onConfirm\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"showCancelMessage\" class=\"kt-comment-text-area__footer\">\n\t\t\t<span v-text=\"translations.cancelMessage\" />\n\t\t\t<!-- eslint-disable-next-line vue/no-useless-mustaches -->\n\t\t\t{{ ' ' }}\n\t\t\t<a\n\t\t\t\t:tabIndex=\"cancelMessageTabindex\"\n\t\t\t\t@click.stop.prevent=\"onCancel\"\n\t\t\t\t@keydown.enter.stop.prevent=\"onCancel\"\n\t\t\t\t@keydown.esc.stop.prevent=\"onCancel\"\n\t\t\t\t@keydown.space.stop.prevent=\"onCancel\"\n\t\t\t\tv-text=\"translations.clickToCancelLabel\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport isNil from 'lodash/isNil.js'\nimport { computed, defineComponent, onMounted, onUnmounted, ref } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KottiButton } from '../../kotti-button/types'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { blurElement, isOrContainsEventTarget } from '../../utilities'\nimport { useResizeTextarea } from '../hooks'\nimport { KottiComment } from '../types'\n\nexport default defineComponent({\n\tname: 'CommentTextArea',\n\tprops: makeProps(KottiComment.TextArea.schema),\n\temits: ['cancel', 'confirm', 'input', 'toggleInternal'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtComment')\n\n\t\tconst containerRef = ref<HTMLDivElement | null>(null)\n\t\tconst hasFocus = ref(false)\n\t\tconst showCancelMessage = ref(false)\n\t\tconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\n\t\tuseResizeTextarea(\n\t\t\ttextareaRef,\n\t\t\tcomputed(() => props.value),\n\t\t)\n\n\t\tconst blurTextarea = () => {\n\t\t\tblurElement(containerRef.value)\n\t\t}\n\t\tconst focusTextarea = () => {\n\t\t\ttextareaRef.value?.focus()\n\t\t\tshowCancelMessage.value = true\n\t\t}\n\n\t\tconst onCancel = () => {\n\t\t\temit('cancel')\n\t\t\tblurTextarea()\n\t\t\tshowCancelMessage.value = false\n\t\t}\n\n\t\tconst onClick = (event: KeyboardEvent | MouseEvent) => {\n\t\t\tif (event.target === null) return\n\n\t\t\tconst isClickInside = isOrContainsEventTarget(\n\t\t\t\tcontainerRef.value,\n\t\t\t\tevent.target,\n\t\t\t)\n\n\t\t\tif (isClickInside) focusTextarea()\n\t\t}\n\n\t\tonMounted(() => {\n\t\t\tif (props.autofocus) focusTextarea()\n\t\t\twindow.addEventListener('click', onClick)\n\t\t})\n\n\t\tonUnmounted(() => {\n\t\t\twindow.removeEventListener('click', onClick)\n\t\t})\n\n\t\treturn {\n\t\t\tcancelMessageTabindex: computed(() =>\n\t\t\t\tisNil(props.tabIndex) ? 0 : props.tabIndex,\n\t\t\t),\n\t\t\tcontainerRef,\n\t\t\thasFocus,\n\t\t\tisEmpty: computed(() => props.value.trim() === ''),\n\t\t\tonCancel,\n\t\t\tonConfirm: () => {\n\t\t\t\temit('confirm')\n\t\t\t\tblurTextarea()\n\t\t\t},\n\t\t\tonInput: (event: Event) => {\n\t\t\t\temit('input', (event.target as HTMLTextAreaElement).value)\n\t\t\t},\n\t\t\tonToggleInternal: () => {\n\t\t\t\temit('toggleInternal')\n\t\t\t},\n\t\t\tshowCancelMessage,\n\t\t\ttextareaRef,\n\t\t\ttoggleInternalButtonProps: computed(\n\t\t\t\t(): Pick<\n\t\t\t\t\tKottiButton.PropsInternal,\n\t\t\t\t\t'helpText' | 'icon' | 'toggleStatus'\n\t\t\t\t> =>\n\t\t\t\t\tprops.isInternal\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\thelpText: translations.value.lockedHelpText,\n\t\t\t\t\t\t\t\ticon: Yoco.Icon.PERMISSION_LOCKED,\n\t\t\t\t\t\t\t\ttoggleStatus: KottiButton.ToggleStatus.ON,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\thelpText: translations.value.unlockedHelpText,\n\t\t\t\t\t\t\t\ticon: Yoco.Icon.PERMISSION_UNLOCKED,\n\t\t\t\t\t\t\t\ttoggleStatus: KottiButton.ToggleStatus.OFF,\n\t\t\t\t\t\t\t},\n\t\t\t),\n\t\t\ttranslations,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment-text-area {\n\twidth: 100%;\n\n\t&__actions {\n\t\tdisplay: flex;\n\t\tcolumn-gap: var(--unit-1);\n\t\tmargin-bottom: var(--unit-1);\n\t}\n\n\t&__actions-divider {\n\t\twidth: var(--unit-q);\n\t\tbackground: var(--ui-02);\n\t}\n\n\t&__container {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\trow-gap: var(--unit-4);\n\t\talign-items: flex-end;\n\t\tpadding: var(--unit-3) var(--unit-4) 0 var(--unit-4);\n\t\tbackground: var(--ui-background);\n\t\tborder: 1px solid var(--ui-02);\n\t\tborder-radius: var(--field-border-radius);\n\n\t\t&:focus-within {\n\t\t\tborder-color: var(--interactive-05);\n\t\t\tbox-shadow: 0 0 0 1px var(--interactive-05);\n\t\t}\n\n\t\ttextarea {\n\t\t\tpadding: 0;\n\t\t\tresize: none;\n\t\t\tborder: none;\n\t\t}\n\t}\n\n\t&__footer {\n\t\tfont-size: 12px;\n\t\tline-height: 20px;\n\n\t\tspan {\n\t\t\tcolor: var(--text-03);\n\t\t}\n\n\t\ta {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-comment-inline-edit\">\n\t\t<CommentTextArea\n\t\t\tv-if=\"isEditing\"\n\t\t\tv-model=\"localMessage\"\n\t\t\tv-bind=\"{\n\t\t\t\tallowInternal,\n\t\t\t\tdataTest,\n\t\t\t\tisInternal,\n\t\t\t\tisReply,\n\t\t\t\ttabIndex,\n\t\t\t}\"\n\t\t\tautofocus\n\t\t\t@cancel=\"onCancel\"\n\t\t\t@confirm=\"onConfirm\"\n\t\t\t@toggleInternal=\"onToggleInternal\"\n\t\t/>\n\t\t<div\n\t\t\tv-else\n\t\t\tclass=\"kt-comment-inline-edit__message\"\n\t\t\t:data-test=\"`${dataTest}.message`\"\n\t\t>\n\t\t\t<!-- eslint-disable vue/no-v-html -->\n\t\t\t<span v-html=\"postEscapeParser(dangerouslyOverrideParser(message))\" />\n\t\t\t<!-- eslint-enable vue/no-v-html -->\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref, watch } from 'vue'\n\nimport { makeProps } from '../../make-props'\nimport { KottiComment } from '../types'\n\nimport CommentTextArea from './CommentTextArea.vue'\n\nexport default defineComponent({\n\tname: 'CommentInlineEdit',\n\tcomponents: {\n\t\tCommentTextArea,\n\t},\n\tprops: makeProps(KottiComment.InlineEdit.schema),\n\temits: ['edit', 'update:isEditing'],\n\tsetup(props, { emit }) {\n\t\tconst localMessage =\n\t\t\tref<KottiComment.InlineEdit.PropsInternal['message']>('')\n\n\t\twatch(\n\t\t\t() => props.isEditing,\n\t\t\t(isEditing, wasEditing) => {\n\t\t\t\tif (isEditing === wasEditing) return\n\n\t\t\t\tlocalMessage.value = isEditing ? props.message : ''\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tlocalMessage,\n\t\t\tonCancel: () => {\n\t\t\t\temit('update:isEditing', false)\n\t\t\t\tlocalMessage.value = ''\n\t\t\t},\n\t\t\tonConfirm: () => {\n\t\t\t\temit('update:isEditing', false)\n\n\t\t\t\tif (localMessage.value === '') return\n\n\t\t\t\tconst payload: KottiComment.Events.Edit = {\n\t\t\t\t\tid: props.id,\n\t\t\t\t\tisInternal: props.isInternal,\n\t\t\t\t\tmessage: localMessage.value,\n\t\t\t\t\tparentId: props.parentId,\n\t\t\t\t}\n\n\t\t\t\temit('edit', payload)\n\t\t\t},\n\t\t\tonToggleInternal: () => {\n\t\t\t\tconst payload: KottiComment.Events.Edit = {\n\t\t\t\t\tid: props.id,\n\t\t\t\t\tisInternal: !props.isInternal,\n\t\t\t\t\tmessage: props.message,\n\t\t\t\t\tparentId: props.parentId,\n\t\t\t\t}\n\n\t\t\t\temit('edit', payload)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-field/mixins';\n\n.kt-comment-inline-edit {\n\t&__message {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tword-break: break-word;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-comment-entry\">\n\t\t<KtAvatar size=\"sm\" :src=\"user.avatar\" />\n\t\t<div class=\"kt-comment-entry__wrapper\">\n\t\t\t<CommentHeader\n\t\t\t\tv-bind=\"{ createdAt, isInternal, isModified, isReply, user }\"\n\t\t\t/>\n\t\t\t<CommentInlineEdit\n\t\t\t\tv-bind=\"{\n\t\t\t\t\tallowInternal,\n\t\t\t\t\tdangerouslyOverrideParser,\n\t\t\t\t\tdataTest,\n\t\t\t\t\tid,\n\t\t\t\t\tisEditing,\n\t\t\t\t\tisInternal,\n\t\t\t\t\tisReply,\n\t\t\t\t\tmessage,\n\t\t\t\t\tparentId,\n\t\t\t\t\tpostEscapeParser,\n\t\t\t\t\ttabIndex,\n\t\t\t\t}\"\n\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t@update:isEditing=\"isEditing = $event\"\n\t\t\t/>\n\t\t\t<CommentActions\n\t\t\t\tv-if=\"!isReadOnly && !isEditing\"\n\t\t\t\tv-bind=\"{ dataTest, isDeletable, isEditable, isReply, tabIndex }\"\n\t\t\t\t@delete=\"onDelete\"\n\t\t\t\t@reply=\"onReply\"\n\t\t\t\t@update:isEditing=\"isEditing = $event\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport pick from 'lodash/pick.js'\nimport { defineComponent, ref } from 'vue'\n\nimport { makeProps } from '../../make-props'\nimport { KottiComment } from '../types'\n\nimport CommentActions from './CommentActions.vue'\nimport CommentHeader from './CommentHeader.vue'\nimport CommentInlineEdit from './CommentInlineEdit.vue'\n\nexport default defineComponent({\n\tname: 'CommentEntry',\n\tcomponents: {\n\t\tCommentActions,\n\t\tCommentHeader,\n\t\tCommentInlineEdit,\n\t},\n\tprops: makeProps(KottiComment.Entry.schema),\n\temits: ['delete', 'edit', 'reply'],\n\tsetup(props, { emit }) {\n\t\tconst isEditing = ref(false)\n\n\t\treturn {\n\t\t\tisEditing,\n\t\t\tonDelete: () => {\n\t\t\t\tconst payload: KottiComment.Events.Delete = pick(props, [\n\t\t\t\t\t'id',\n\t\t\t\t\t'parentId',\n\t\t\t\t])\n\t\t\t\temit('delete', payload)\n\t\t\t},\n\t\t\tonEdit: (payload: KottiComment.Events.Edit) => {\n\t\t\t\temit('edit', payload)\n\t\t\t},\n\t\t\tonReply: () => {\n\t\t\t\temit('reply', props.user)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment-entry {\n\tdisplay: flex;\n\tcolumn-gap: var(--unit-2);\n\n\t&__wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\trow-gap: var(--unit-1);\n\t\twidth: 100%;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-comment-input\">\n\t\t<KtAvatar size=\"sm\" :src=\"userAvatar\" />\n\t\t<CommentTextArea\n\t\t\tv-model=\"localMessage\"\n\t\t\tv-bind=\"{ allowInternal, autofocus, isReply, placeholder, tabIndex }\"\n\t\t\t:dataTest=\"localDataTest\"\n\t\t\t:isInternal=\"localIsInternal\"\n\t\t\t@cancel=\"onCancel\"\n\t\t\t@confirm=\"onConfirm\"\n\t\t\t@toggleInternal=\"onToggleInternal\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, watch } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport CommentTextArea from './components/CommentTextArea.vue'\nimport type { KottiComment } from './types'\nimport { KottiCommentInput } from './types'\n\nexport default defineComponent({\n\tname: 'KtCommentInput',\n\tcomponents: {\n\t\tCommentTextArea,\n\t},\n\tprops: makeProps(KottiCommentInput.propsSchema),\n\temits: ['add', 'cancel'],\n\tsetup(props, { emit }) {\n\t\t// eslint-disable-next-line vue/no-setup-props-reactivity-loss\n\t\tconst localIsInternal = ref<KottiComment.PropsInternal['isInternal']>(\n\t\t\tprops.isInternal,\n\t\t)\n\t\tconst localMessage = ref<KottiComment.PropsInternal['message']>('')\n\n\t\twatch(\n\t\t\t() => props.isInternal,\n\t\t\t(isInternal) => (localIsInternal.value = isInternal),\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\treturn {\n\t\t\tlocalDataTest: computed(() => {\n\t\t\t\tconst commentType = `new-${props.isReply ? 'reply' : 'comment'}`\n\t\t\t\treturn props.dataTest ? `${props.dataTest}.${commentType}` : commentType\n\t\t\t}),\n\t\t\tlocalIsInternal,\n\t\t\tlocalMessage,\n\t\t\tonCancel: () => {\n\t\t\t\tlocalIsInternal.value = props.isInternal\n\t\t\t\tlocalMessage.value = ''\n\t\t\t\temit('cancel')\n\t\t\t},\n\t\t\tonConfirm: () => {\n\t\t\t\tif (localMessage.value === '') return\n\n\t\t\t\tconst payload: KottiComment.Events.Add = {\n\t\t\t\t\tisInternal: localIsInternal.value,\n\t\t\t\t\tmessage: localMessage.value,\n\t\t\t\t\tparentId: props.parentId,\n\t\t\t\t\treplyToUserId: props.replyToUserId,\n\t\t\t\t}\n\n\t\t\t\temit('add', payload)\n\n\t\t\t\tlocalIsInternal.value = props.isInternal\n\t\t\t\tlocalMessage.value = ''\n\t\t\t},\n\t\t\tonToggleInternal: () => {\n\t\t\t\tif (localIsInternal.value && props.allowInternal && props.forceInternal)\n\t\t\t\t\treturn\n\t\t\t\tlocalIsInternal.value = !localIsInternal.value\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment-input {\n\tdisplay: flex;\n\tcolumn-gap: var(--unit-2);\n}\n</style>\n","<template>\n\t<div :class=\"classes\">\n\t\t<CommentEntry\n\t\t\tv-bind=\"commentProps\"\n\t\t\t@delete=\"onDelete\"\n\t\t\t@edit=\"onEdit\"\n\t\t\t@reply=\"onReply\"\n\t\t/>\n\t\t<div v-if=\"showCommentThread\" class=\"kt-comment__thread\">\n\t\t\t<CommentEntry\n\t\t\t\tv-for=\"reply in replies\"\n\t\t\t\t:key=\"reply.id\"\n\t\t\t\tv-bind=\"{\n\t\t\t\t\t...reply,\n\t\t\t\t\tdangerouslyOverrideParser,\n\t\t\t\t\tisReadOnly,\n\t\t\t\t\tpostEscapeParser,\n\t\t\t\t\ttabIndex,\n\t\t\t\t}\"\n\t\t\t\t:dataTest=\"`${rootDataTest}.reply.${reply.id}`\"\n\t\t\t\tisReply\n\t\t\t\t:parentId=\"id\"\n\t\t\t\t@delete=\"onDelete\"\n\t\t\t\t@edit=\"onEdit\"\n\t\t\t/>\n\t\t\t<KtCommentInput\n\t\t\t\tv-if=\"userToReply\"\n\t\t\t\tv-bind=\"{\n\t\t\t\t\tforceInternal,\n\t\t\t\t\tisInternal,\n\t\t\t\t\tplaceholder,\n\t\t\t\t\ttabIndex,\n\t\t\t\t\tuserAvatar,\n\t\t\t\t}\"\n\t\t\t\tautofocus\n\t\t\t\t:dataTest=\"rootDataTest\"\n\t\t\t\tisReply\n\t\t\t\t:parentId=\"id\"\n\t\t\t\t:replyToUserId=\"userToReply.id\"\n\t\t\t\t@add=\"onAdd\"\n\t\t\t\t@cancel=\"onCancel\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport omit from 'lodash/omit.js'\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { makeProps } from '../make-props'\n\nimport CommentEntry from './components/CommentEntry.vue'\nimport KtCommentInput from './KtCommentInput.vue'\nimport { KottiComment } from './types'\n\nexport default defineComponent({\n\tname: 'KtComment',\n\tcomponents: {\n\t\tCommentEntry,\n\t\tKtCommentInput,\n\t},\n\tprops: makeProps(KottiComment.propsSchema),\n\temits: ['add', 'delete', 'edit'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtComment')\n\n\t\tconst userToReply = ref<KottiComment.User | null>(null)\n\n\t\tconst rootDataTest = computed(() =>\n\t\t\tprops.dataTest\n\t\t\t\t? `${props.dataTest}.comment.${String(props.id)}`\n\t\t\t\t: `comment.${String(props.id)}`,\n\t\t)\n\n\t\treturn {\n\t\t\tclasses: computed(() => ({\n\t\t\t\t'kt-comment': true,\n\t\t\t\t'kt-comment--is-internal': props.isInternal,\n\t\t\t})),\n\t\t\tcommentProps: computed<KottiComment.Entry.PropsInternal>(() => ({\n\t\t\t\t...omit(props, 'replies'),\n\t\t\t\tdataTest: rootDataTest.value,\n\t\t\t\tisReply: false,\n\t\t\t})),\n\t\t\tonAdd: (payload: KottiComment.Events.Add) => {\n\t\t\t\tuserToReply.value = null\n\t\t\t\temit('add', payload)\n\t\t\t},\n\t\t\tonCancel: () => (userToReply.value = null),\n\t\t\tonDelete: (payload: KottiComment.Events.Delete) => {\n\t\t\t\temit('delete', payload)\n\t\t\t},\n\t\t\tonEdit: (payload: KottiComment.Events.Edit) => {\n\t\t\t\temit('edit', payload)\n\t\t\t},\n\t\t\tonReply: (user: KottiComment.User) => (userToReply.value = user),\n\t\t\tplaceholder: computed(() =>\n\t\t\t\tuserToReply.value\n\t\t\t\t\t? [translations.value.replyToLabel, userToReply.value.name].join(' ')\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t\trootDataTest,\n\t\t\tshowCommentThread: computed(\n\t\t\t\t() => props.replies.length > 0 || userToReply.value !== null,\n\t\t\t),\n\t\t\tuserToReply,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-comment {\n\tpadding: var(--unit-4);\n\n\t&--is-internal {\n\t\tbackground-color: var(--ui-01);\n\t}\n\n\t&__thread {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\trow-gap: var(--unit-4);\n\t\tpadding: var(--unit-4) 0 0 var(--unit-10);\n\t}\n}\n</style>\n","import type { ComponentPublicInstanceConstructor } from 'vue/types/v3-component-public-instance'\n\nimport type { Kotti } from '../types'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtCommentVue from './KtComment.vue'\nimport KtCommentInputVue from './KtCommentInput.vue'\nimport { KottiComment, KottiCommentInput } from './types'\n\nconst META: Omit<Kotti.Meta, 'typeScript'> = {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=133%3A2594',\n\t},\n\tslots: {},\n}\n\nexport const KtComment = attachMeta(\n\tmakeInstallable(KtCommentVue as ComponentPublicInstanceConstructor),\n\t{\n\t\t...META,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.Comment',\n\t\t\tschema: KottiComment.propsSchema,\n\t\t},\n\t},\n)\n\nexport const KtCommentInput = attachMeta(\n\tmakeInstallable(KtCommentInputVue as ComponentPublicInstanceConstructor),\n\t{\n\t\t...META,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.CommentInput',\n\t\t\tschema: KottiCommentInput.propsSchema,\n\t\t},\n\t},\n)\n","<template>\n\t<transition mode=\"out-in\" name=\"kt-drawer\">\n\t\t<div class=\"kt-drawer__mask\" @click.self=\"onOutsideDrawerClick\">\n\t\t\t<div :class=\"drawerClass\" :style=\"drawerWidth\">\n\t\t\t\t<div class=\"kt-drawer__header\">\n\t\t\t\t\t<slot name=\"drawer-header\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"kt-drawer__body\">\n\t\t\t\t\t<slot name=\"drawer-body\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"kt-drawer__footer\">\n\t\t\t\t\t<slot name=\"drawer-footer\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"kt-drawer__handle\" @click=\"onDrawerHandleClick\">\n\t\t\t\t\t<i v-if=\"isExpanded\" class=\"yoco\" v-text=\"Yoco.Icon.CHEVRON_RIGHT\" />\n\t\t\t\t\t<i v-else class=\"yoco\" v-text=\"Yoco.Icon.CHEVRON_LEFT\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</transition>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiDrawer } from './types'\n\nexport default defineComponent({\n\tname: 'KtDrawer',\n\tprops: makeProps(KottiDrawer.propsSchema),\n\temits: ['close'],\n\tsetup(props, { emit }) {\n\t\tconst isExpanded = ref(false)\n\n\t\treturn {\n\t\t\tdrawerClass: computed(() => ({\n\t\t\t\t'kt-drawer__container': true,\n\t\t\t\t'kt-drawer__container--is-expanded': isExpanded.value,\n\t\t\t\t'kt-drawer__container--is-wide': props.isWide,\n\t\t\t})),\n\t\t\tdrawerWidth: computed(() => {\n\t\t\t\treturn props.defaultWidth === null || props.expandWidth === null\n\t\t\t\t\t? {}\n\t\t\t\t\t: { width: isExpanded.value ? props.expandWidth : props.defaultWidth }\n\t\t\t}),\n\t\t\tisExpanded,\n\t\t\tonDrawerHandleClick: () => {\n\t\t\t\tisExpanded.value = !isExpanded.value\n\t\t\t},\n\t\t\tonOutsideDrawerClick: () => {\n\t\t\t\tif (!props.disallowCloseOutside) {\n\t\t\t\t\temit('close')\n\t\t\t\t}\n\t\t\t},\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n:root {\n\t--kt-drawer-default-width: 18.8rem;\n\t--kt-drawer-wide-width: 26.8rem;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n.kt-drawer {\n\t&__mask {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: $zindex-4;\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: rgb(0 0 0 / 50%);\n\t\ttransition: opacity 0.5s ease;\n\t}\n\n\t&__container {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: var(--kt-drawer-default-width);\n\t\theight: 100%;\n\t\tpadding: var(--unit-6);\n\t\tpadding-left: var(--unit-8);\n\t\toverflow-y: auto;\n\t\tbackground-color: var(--ui-background);\n\t\tbox-shadow: 0 2px 8px rgb(0 0 0 / 33%);\n\t\ttransition: all 0.3s ease;\n\n\t\t&--is-expanded {\n\t\t\twidth: 50%;\n\t\t}\n\n\t\t&--is-wide {\n\t\t\twidth: var(--kt-drawer-wide-width);\n\n\t\t\t&.kt-drawer__container--is-expanded {\n\t\t\t\twidth: 75%;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__handle {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: var(--unit-1);\n\t\tdisplay: block;\n\t\twidth: 1.5rem;\n\t\theight: 1.5rem;\n\t\tmargin-top: -0.725rem;\n\t\tline-height: 1.5rem;\n\t\tcolor: var(--icon-02);\n\t\tcursor: pointer;\n\n\t\t&:hover {\n\t\t\tcolor: var(--interactive-03);\n\t\t}\n\t}\n\n\t&__header {\n\t\tflex: 0 0 auto;\n\t}\n\n\t&__body {\n\t\tflex: 1 1 auto;\n\t\tpadding: 0 0.8rem;\n\t\tmargin: 0 -0.8rem 0.8rem -0.8rem; /* stylelint-disable-line */\n\t\toverflow-y: auto;\n\t}\n\n\t&__footer {\n\t\tflex: 0 0 auto;\n\t\talign-self: flex-end;\n\t\twidth: 100%;\n\t}\n\n\t/* Vue Transition classes */\n\n\t&-enter {\n\t\topacity: 0;\n\t\ttransition: opacity 0.5s;\n\t}\n\n\t&-leave-active {\n\t\topacity: 0;\n\t}\n\n\t&-enter .kt-drawer__container,\n\t&-leave-active .kt-drawer__container {\n\t\ttransform: translate(20em, 0);\n\t}\n}\n\n@media (width <= $size-sm) {\n\t.kt-drawer {\n\t\t&__container,\n\t\t&__container--is-wide {\n\t\t\ttop: auto;\n\t\t\tbottom: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 80%;\n\t\t\tpadding: var(--unit-4);\n\t\t\tpadding-top: var(--unit-8);\n\n\t\t\t&.kt-drawer__container--is-expanded {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t}\n\n\t\t&__handle {\n\t\t\ttop: 0;\n\t\t\tleft: 50%;\n\t\t\tmargin-top: 0.2rem;\n\t\t\tmargin-left: -0.75rem;\n\t\t\ttransform: rotate(90deg);\n\t\t}\n\n\t\t&-enter .kt-drawer__container,\n\t\t&-leave-active .kt-drawer__container {\n\t\t\ttransform: translate(0, 20rem);\n\t\t}\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtDrawerVue from './KtDrawer.vue'\nimport { KottiDrawer } from './types'\n\nexport const KtDrawer = attachMeta(makeInstallable(KtDrawerVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {\n\t\t'drawer-body': { description: null, scope: null },\n\t\t'drawer-footer': { description: null, scope: null },\n\t\t'drawer-header': { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Drawer',\n\t\tschema: KottiDrawer.propsSchema,\n\t},\n})\n","<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, h, ref } from 'vue'\nimport type { VNode } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../../constants'\n\nexport default defineComponent({\n\tname: 'FieldHelpText',\n\tprops: {\n\t\thelpText: { default: null, type: String as PropType<string | null> },\n\t\thelpTextSlot: { default: () => [], type: Array as PropType<VNode[]> },\n\t},\n\tsetup(props) {\n\t\tconst helpTextContentRef = ref<Element | null>(null)\n\t\tconst helpTextTriggerRef = ref<Element | null>(null)\n\n\t\tuseTippy(\n\t\t\thelpTextTriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: helpTextContentRef.value ?? undefined,\n\t\t\t\tinteractive: true,\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\ttheme: 'light-border',\n\t\t\t})),\n\t\t)\n\n\t\treturn () =>\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\th(\n\t\t\t\t\t\t'i',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclass: 'yoco',\n\t\t\t\t\t\t\tref: helpTextTriggerRef,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[Yoco.Icon.CIRCLE_QUESTION],\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tref: helpTextContentRef,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tprops.helpTextSlot.length > 0\n\t\t\t\t\t\t\t? props.helpTextSlot\n\t\t\t\t\t\t\t: [props.helpText],\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t)\n\t},\n})\n</script>\n","export const KT_FORM_CONTEXT = Symbol('KT_FORM_CONTEXT')\nexport const KT_FORM_SUBMIT_CONTEXT = Symbol('KT_FORM_SUBMIT_CONTEXT')\n","import type { KottiField } from './types'\n\nconst createErrorMessage = (\n\tprops: KottiField.PropsInternal,\n\tmessages: string[],\n) => `useField(${String(props.formKey ?? props.label)}): ${messages.join('\\n')}`\n\nclass DisabledSetValueCalledError extends Error {\n\tconstructor(props: KottiField.PropsInternal) {\n\t\tsuper(\n\t\t\tcreateErrorMessage(props, [\n\t\t\t\t'Attempted to setValue on a disabled field.',\n\t\t\t\t'Disabled fields should never call setValue as it causes unexpected behavior.',\n\t\t\t]),\n\t\t)\n\t\tthis.name = 'DisabledSetValueCalledError'\n\t}\n}\n\nclass ImplicitFormKeyNoneError extends Error {\n\tconstructor(props: KottiField.PropsInternal) {\n\t\tsuper(\n\t\t\tcreateErrorMessage(props, [\n\t\t\t\t'Encountered a KtField without a “formKey” inside a KtForm.',\n\t\t\t\t'This means that the field will not connect itself to the KtForm’s Context Values',\n\t\t\t\t'If this is not a mistake, please add formKey=\"NONE\" to your field and bind v-model explicitly.',\n\t\t\t]),\n\t\t)\n\t\tthis.name = 'ImplicitFormKeyNoneError'\n\t}\n}\n\nclass InvalidPropOutsideOfContextError extends Error {\n\tconstructor(\n\t\tprops: KottiField.PropsInternal,\n\t\tpropName: keyof KottiField.PropsInternal,\n\t) {\n\t\tsuper(\n\t\t\tcreateErrorMessage(props, [\n\t\t\t\t`Encountered a KtField with a “${propName}” outside a KtForm.`,\n\t\t\t\t'This is most likely a mistake and should be removed.',\n\t\t\t]),\n\t\t)\n\t\tthis.name = 'InvalidPropOutsideOfContextError'\n\t}\n}\n\nexport const ktFieldErrors = {\n\tDisabledSetValueCalledError,\n\tImplicitFormKeyNoneError,\n\tInvalidPropOutsideOfContextError,\n}\n","import cloneDeep from 'lodash/cloneDeep.js'\nimport type { Ref } from 'vue'\nimport {\n\tcomputed,\n\tinject,\n\tonBeforeMount,\n\tonMounted,\n\tonUnmounted,\n\treactive,\n\tref,\n\twatch,\n} from 'vue'\n\nimport { KT_FORM_CONTEXT } from '../kotti-form/constants'\nimport type { KottiForm } from '../kotti-form/types'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { isOrContainsEventTarget } from '../utilities'\n\nimport { FORM_KEY_NONE } from './constants'\nimport { ktFieldErrors } from './errors'\nimport { KottiField } from './types'\n\nlet ktFieldId = 1\n\nconst useDecoration = <DATA_TYPE>({\n\tprops,\n\tsupports,\n}: Pick<KottiField.Hook.Parameters<DATA_TYPE>, 'props' | 'supports'>) => {\n\treturn {\n\t\tleftIcon: computed(() => (supports.decoration ? props.leftIcon : null)),\n\t\tprefix: computed(() => (supports.decoration ? props.prefix : null)),\n\t\trightIcon: computed(() => (supports.decoration ? props.rightIcon : null)),\n\t\tshowVisibilityToggle: computed(() =>\n\t\t\tsupports.decoration ? props.showVisibilityToggle : false,\n\t\t),\n\t\tsuffix: computed(() => (supports.decoration ? props.suffix : null)),\n\t}\n}\n\nconst useInputProps = <DATA_TYPE>({\n\tcontext,\n\tisDisabled,\n\tprops,\n}: Pick<KottiField.Hook.Parameters<DATA_TYPE>, 'props'> & {\n\tcontext: KottiForm.Context | null\n\tisDisabled: Ref<boolean>\n}) => {\n\t// Generate unique id for input outside computed to avoid undesired reactivity\n\tconst id = String(++ktFieldId)\n\n\tconst formPath = computed(() => {\n\t\tif (context === null) return []\n\n\t\tif (props.formKey === null)\n\t\t\tthrow new ktFieldErrors.ImplicitFormKeyNoneError(props)\n\n\t\treturn props.formKey === FORM_KEY_NONE\n\t\t\t? [...context.formPath.value]\n\t\t\t: [...context.formPath.value, props.formKey]\n\t})\n\n\treturn {\n\t\tinputProps: computed(() => ({\n\t\t\t'data-test': props.dataTest ?? formPath.value.join('.'),\n\t\t\tdisabled: isDisabled.value,\n\t\t\tid,\n\t\t\ttabindex: props.tabIndex,\n\t\t})),\n\t}\n}\n\nconst useTexts = (props: KottiField.PropsInternal) => {\n\treturn {\n\t\thelpDescription: computed(() => props.helpDescription),\n\t\thelpText: computed(() => props.helpText),\n\t\tlabel: computed(() => props.label),\n\t}\n}\n\nconst useValue = <DATA_TYPE>({\n\tcontext,\n\temit,\n\tisDisabled,\n\tisEmpty,\n\tisLoading,\n\tprops,\n}: Pick<KottiField.Hook.Parameters<DATA_TYPE>, 'emit' | 'isEmpty' | 'props'> & {\n\tcontext: KottiForm.Context | null\n\tisDisabled: Ref<boolean>\n\tisLoading: Ref<boolean>\n}) => {\n\twatch(\n\t\t() => props.formKey,\n\t\t(newFormKey) => {\n\t\t\tif (context !== null && newFormKey === null)\n\t\t\t\tthrow new ktFieldErrors.ImplicitFormKeyNoneError(props)\n\n\t\t\tif (context === null && newFormKey !== null)\n\t\t\t\tthrow new ktFieldErrors.InvalidPropOutsideOfContextError(\n\t\t\t\t\tprops,\n\t\t\t\t\t'formKey',\n\t\t\t\t)\n\t\t},\n\t\t{ flush: 'post', immediate: true },\n\t)\n\n\t// fetch value\n\n\tconst currentValue = computed((): DATA_TYPE => {\n\t\tif (context === null) return cloneDeep(props.value)\n\n\t\tswitch (props.formKey) {\n\t\t\tcase FORM_KEY_NONE:\n\t\t\t\treturn cloneDeep(props.value)\n\n\t\t\tcase null:\n\t\t\t\tthrow new ktFieldErrors.ImplicitFormKeyNoneError(props)\n\n\t\t\tdefault:\n\t\t\t\treturn context.values.value[props.formKey] as DATA_TYPE\n\t\t}\n\t})\n\n\treturn {\n\t\tcurrentValue,\n\t\tisEmpty: computed(() => isEmpty(currentValue.value)),\n\t\t/**\n\t\t * setValue\n\t\t * @param newValue the value to set\n\t\t * @param options defines forceUpdate to set value even when the field is disabled\n\t\t */\n\t\tsetValue: ref((newValue: unknown, options?: { forceUpdate: boolean }) => {\n\t\t\tif ((isDisabled.value || isLoading.value) && !options?.forceUpdate)\n\t\t\t\tthrow new ktFieldErrors.DisabledSetValueCalledError(props)\n\n\t\t\tif (\n\t\t\t\tcontext === null ||\n\t\t\t\tprops.formKey === null ||\n\t\t\t\tprops.formKey === FORM_KEY_NONE\n\t\t\t) {\n\t\t\t\temit('input', newValue)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tcontext.setValue(props.formKey, newValue)\n\t\t}),\n\t}\n}\n\nconst useValidation = <DATA_TYPE>({\n\tcontext,\n\tcurrentValue,\n\thideValidation,\n\tisEmpty,\n\tprops,\n}: Pick<KottiField.Hook.Parameters<DATA_TYPE>, 'props'> &\n\tPick<\n\t\tKottiField.Hook.ReturnsWithRefs<DATA_TYPE>,\n\t\t'currentValue' | 'isEmpty'\n\t> & {\n\t\tcontext: KottiForm.Context | null\n\t\thideValidation: Ref<KottiField.InheritablePropsInternal['hideValidation']>\n\t}) => {\n\tconst translations = useTranslationNamespace('KtFields')\n\n\tconst isMissingRequiredField = computed(\n\t\t(): boolean => !props.isOptional && isEmpty.value,\n\t)\n\n\treturn {\n\t\thideValidation,\n\t\t// FIXME: Write unit test to figure out if props.isDisabled affects this function or if a computed() is necessary\n\t\tvalidation: computed((): KottiField.Validation.Result => {\n\t\t\tconst customValidation = (() => {\n\t\t\t\tif (!context && props.formKey)\n\t\t\t\t\tthrow new ktFieldErrors.InvalidPropOutsideOfContextError(\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\t'formKey',\n\t\t\t\t\t)\n\n\t\t\t\tif (\n\t\t\t\t\tcontext &&\n\t\t\t\t\tprops.formKey !== null &&\n\t\t\t\t\tprops.formKey !== FORM_KEY_NONE &&\n\t\t\t\t\tprops.formKey in context.validators.value\n\t\t\t\t)\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\treturn context.validators.value[props.formKey]!(currentValue.value)\n\n\t\t\t\treturn props.validator(currentValue.value)\n\t\t\t})()\n\n\t\t\treturn isMissingRequiredField.value\n\t\t\t\t? customValidation.type === 'error'\n\t\t\t\t\t? customValidation\n\t\t\t\t\t: { text: translations.value.requiredMessage, type: 'error' }\n\t\t\t\t: customValidation\n\t\t}),\n\t}\n}\n\n/**\n * Implements KottiField.InheritablePropsInternal\n * Prioritizes the field props, the context, and the passed default, respectively\n */\nconst useInheritableProperties = <DATA_TYPE>({\n\tcontext,\n\tprops,\n}: Pick<KottiField.Hook.Parameters<DATA_TYPE>, 'props'> & {\n\tcontext: KottiForm.Context | null\n}) => {\n\t/**\n\t * Get a single property from either the KtFieldComponents or the KtFormContext\n\t * Gives priority to the KtFieldComponents and implements default fallbacks\n\t */\n\tconst useShared = <KEY extends keyof KottiField.InheritablePropsInternal>(\n\t\tkey: KEY,\n\t\tdefaultValue: KottiField.InheritablePropsInternal[KEY],\n\t) =>\n\t\tcomputed((): KottiField.InheritablePropsInternal[KEY] => {\n\t\t\tif (props[key]) return props[key]\n\n\t\t\tif (context !== null && context.fieldInheritableProps.value[key])\n\t\t\t\treturn context.fieldInheritableProps.value[key]\n\n\t\t\treturn defaultValue\n\t\t})\n\n\tconst isLoading = useShared('isLoading', false)\n\n\treturn {\n\t\thideClear: useShared('hideClear', false),\n\t\thideValidation: computed(() =>\n\t\t\tisLoading.value ? true : useShared('hideValidation', false).value,\n\t\t),\n\t\tisDisabled: useShared('isDisabled', false),\n\t\tisLoading,\n\t\tsize: useShared('size', KottiField.Size.MEDIUM),\n\t}\n}\n\n/**\n * hook into lifecycle events\n */\nconst useNotifyContext = <DATA_TYPE>({\n\tcontext,\n\tfield,\n}: {\n\tcontext: KottiForm.Context | null\n\tfield: KottiField.Hook.Returns<DATA_TYPE>\n}) => {\n\tonMounted(() => {\n\t\tif (context) context.onAddField(field)\n\t})\n\n\tonUnmounted(() => {\n\t\tif (context) context.onRemoveField(field)\n\t})\n}\n\nexport const useField = <DATA_TYPE>({\n\temit,\n\tisEmpty,\n\tprops,\n\tsupports,\n}: KottiField.Hook.Parameters<DATA_TYPE>): KottiField.Hook.Returns<DATA_TYPE> => {\n\tconst context = inject<KottiForm.Context | null>(KT_FORM_CONTEXT, null)\n\n\tconst sharedProperties = useInheritableProperties({ context, props })\n\tconst values = useValue({\n\t\tcontext,\n\t\temit,\n\t\tisDisabled: sharedProperties.isDisabled,\n\t\tisEmpty,\n\t\tisLoading: sharedProperties.isLoading,\n\t\tprops,\n\t})\n\n\t// export\n\n\tconst field = reactive<KottiField.Hook.ReturnsWithRefs<DATA_TYPE>>({\n\t\t...sharedProperties,\n\t\t...useDecoration({ props, supports }),\n\t\t...useInputProps({\n\t\t\tcontext,\n\t\t\tisDisabled: sharedProperties.isDisabled,\n\t\t\tprops,\n\t\t}),\n\t\t...useTexts(props),\n\t\t...useValidation({\n\t\t\tcontext,\n\t\t\tcurrentValue: values.currentValue,\n\t\t\thideValidation: sharedProperties.hideValidation,\n\t\t\tisEmpty: values.isEmpty,\n\t\t\tprops,\n\t\t}),\n\t\t...values,\n\t\thideClear: computed(\n\t\t\t() =>\n\t\t\t\tvalues.isEmpty.value ||\n\t\t\t\tsharedProperties.isDisabled.value ||\n\t\t\t\t(supports.clear ? sharedProperties.hideClear.value : true),\n\t\t),\n\t\tisBorderless: computed(() => supports.borderless && props.isBorderless),\n\t\tisOptional: computed(() => props.isOptional),\n\t}) as KottiField.Hook.Returns<DATA_TYPE>\n\n\tuseNotifyContext({ context, field })\n\n\treturn field\n}\n\nexport const useInput = (\n\tfieldId: string,\n): {\n\tclickInput: () => void\n\tfocusInput: () => void\n} => {\n\treturn {\n\t\tclickInput: () => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-query-selector\n\t\t\tconst inputEl = document.getElementById(fieldId)\n\t\t\tinputEl?.click()\n\t\t},\n\t\tfocusInput: () => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-query-selector\n\t\t\tconst inputEl = document.getElementById(fieldId)\n\t\t\tinputEl?.focus()\n\t\t},\n\t}\n}\n\n/**\n * Vue doesn't support controlled input fields without explicitly re-rendering.\n * Therefore, in case nothing changed, we may need to re-render\n *\n * @description Vue doesn't alter native html input behavior; that is, the emitted value is immediately bound to :value\n * We need to force the component to re-render with the value that we actually last wanted to bind to `:value`\n * The emitted value doesn't immediately have to be the actually bound value; making the input `controlled`\n */\nexport const useForceUpdate = (): {\n\tforceUpdate: () => void\n\tforceUpdateKey: Ref<number>\n} => {\n\tconst forceUpdateKey = ref(0)\n\n\treturn {\n\t\tforceUpdate: () => {\n\t\t\t// HACK: This basically just updates some arbitrary ref so that vue thinks the input element needs to be re-rendered\n\t\t\tforceUpdateKey.value++\n\t\t},\n\t\tforceUpdateKey,\n\t}\n}\n\nexport const useKtFieldRef = (): Ref<{\n\tinputContainerRef: HTMLDivElement\n\tinputContainerWrapperRef: HTMLDivElement\n} | null> => {\n\t/**\n\t * both inputContainerRef and inputContainerWrapperRef\n\t * are template refs on KtField.vue\n\t */\n\tconst ktFieldRef = ref<{\n\t\tinputContainerRef: Ref<HTMLDivElement>\n\t\tinputContainerWrapperRef: Ref<HTMLDivElement>\n\t} | null>(null)\n\n\treturn ktFieldRef\n}\n\nexport const useEmitBlur = <T>({\n\temit,\n\tfield,\n\tfieldTarget,\n\tfindEventTarget,\n\tvalueOverride,\n}: {\n\temit: (event: 'blur', value: T | null) => void\n\tfield: KottiField.Hook.Returns<T>\n\tfieldTarget: Ref<Array<HTMLElement | null> | HTMLElement | null>\n\tfindEventTarget?: (target: EventTarget | null) => EventTarget | null\n\tvalueOverride?: T | null\n}): void => {\n\t/**\n\t * last element to capture the click or focus event\n\t */\n\tconst lastEventTarget = ref<EventTarget | null>(null)\n\n\tconst isFieldTargeted = (target: Event['target'] | null): boolean =>\n\t\tArray.isArray(fieldTarget.value)\n\t\t\t? fieldTarget.value.some((ft) => isOrContainsEventTarget(ft, target))\n\t\t\t: isOrContainsEventTarget(fieldTarget.value, target)\n\n\tconst onClickOrFocusChange = (event: Event) => {\n\t\tif (event.target === null || field.isDisabled) return\n\n\t\tconst eventTarget = findEventTarget?.(event.target) ?? event.target\n\n\t\tconst wasFieldTargetedBefore = isFieldTargeted(lastEventTarget.value)\n\t\tconst isFieldTargetedNow = isFieldTargeted(eventTarget)\n\n\t\tif (!isFieldTargetedNow && wasFieldTargetedBefore) {\n\t\t\tif (valueOverride !== undefined) {\n\t\t\t\temit('blur', field.currentValue === null ? null : valueOverride)\n\t\t\t} else {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t}\n\t\t}\n\n\t\tlastEventTarget.value = eventTarget\n\t}\n\n\tonBeforeMount(() => {\n\t\twindow.addEventListener('click', onClickOrFocusChange, true)\n\t\twindow.addEventListener('focus', onClickOrFocusChange, true)\n\t})\n\n\tonUnmounted(() => {\n\t\twindow.removeEventListener('click', onClickOrFocusChange)\n\t\twindow.removeEventListener('focus', onClickOrFocusChange)\n\t})\n}\n","<template>\n\t<div class=\"kt-field\">\n\t\t<component\n\t\t\t:is=\"useFieldset ? 'fieldset' : isComponent ? isComponent : 'div'\"\n\t\t\t:class=\"wrapperClasses\"\n\t\t\t@click=\"$emit('click', $event)\"\n\t\t\t@mousedown=\"$emit('mousedown', $event)\"\n\t\t>\n\t\t\t<div v-if=\"hasLabel || hasHelpText\" class=\"kt-field__header\">\n\t\t\t\t<component\n\t\t\t\t\t:is=\"useFieldset ? 'legend' : 'label'\"\n\t\t\t\t\tv-if=\"hasLabel\"\n\t\t\t\t\tclass=\"kt-field__header__label\"\n\t\t\t\t\t:for=\"useFieldset ? undefined : inputId\"\n\t\t\t\t\t@click=\"onClickLabel\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"kt-field__header__label__text\" v-text=\"field.label\" />\n\t\t\t\t\t<span :class=\"labelSuffixClasses\" v-text=\"labelSuffix\" />\n\t\t\t\t</component>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"hasHelpText\"\n\t\t\t\t\tclass=\"kt-field__header__help-text\"\n\t\t\t\t\t:class=\"iconClasses('header__help-text', ['interactive'])\"\n\t\t\t\t>\n\t\t\t\t\t<FieldHelpText\n\t\t\t\t\t\t:helpText=\"field.helpText\"\n\t\t\t\t\t\t:helpTextSlot=\"helpTextSlot\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"field.helpDescription\"\n\t\t\t\tclass=\"kt-field__help-description\"\n\t\t\t\tv-text=\"field.helpDescription\"\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tv-if=\"field.isLoading\"\n\t\t\t\tclass=\"kt-field__input-container-wrapper-loading skeleton rectangle\"\n\t\t\t/>\n\t\t\t<div\n\t\t\t\tv-show=\"!field.isLoading\"\n\t\t\t\tref=\"inputContainerWrapperRef\"\n\t\t\t\tclass=\"kt-field__input-container-wrapper\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"$slots['container-left']\"\n\t\t\t\t\tclass=\"kt-field__input-container__prefix\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"container-left\" />\n\t\t\t\t</div>\n\t\t\t\t<slot name=\"container\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tref=\"inputContainerRef\"\n\t\t\t\t\t\tclass=\"kt-field__input-container\"\n\t\t\t\t\t\t@click=\"focusInput\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.prefix\"\n\t\t\t\t\t\t\t:class=\"affixClasses(['left'])\"\n\t\t\t\t\t\t\tv-text=\"field.prefix\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.leftIcon\"\n\t\t\t\t\t\t\t:class=\"iconClasses('input-container', ['left'])\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<i class=\"yoco\" v-text=\"field.leftIcon\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"kt-field__input-container__slot\">\n\t\t\t\t\t\t\t<slot name=\"default\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\t:classes=\"iconClasses('input-container', ['interactive'])\"\n\t\t\t\t\t\t\t:handleClear=\"handleClear\"\n\t\t\t\t\t\t\tname=\"actionIcon\"\n\t\t\t\t\t\t\t:showClear=\"!field.hideClear\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-if=\"!field.hideClear\"\n\t\t\t\t\t\t\t\t:class=\"iconClasses('input-container', ['interactive'])\"\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t@click.stop=\"handleClear\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.CLOSE\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.showVisibilityToggle\"\n\t\t\t\t\t\t\t:class=\"iconClasses('input-container', ['right', 'interactive'])\"\n\t\t\t\t\t\t\t@click.stop=\"handleVisibilityChange\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\tv-if=\"valueVisibility\"\n\t\t\t\t\t\t\t\tclass=\"yoco\"\n\t\t\t\t\t\t\t\tv-text=\"Yoco.Icon.EYE_SLASHED\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<i v-else class=\"yoco\" v-text=\"Yoco.Icon.EYE\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.rightIcon\"\n\t\t\t\t\t\t\t:class=\"iconClasses('input-container', ['right'])\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<i class=\"yoco\" v-text=\"field.rightIcon\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"field.suffix\"\n\t\t\t\t\t\t\t:class=\"affixClasses(['right'])\"\n\t\t\t\t\t\t\tv-text=\"field.suffix\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</slot>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"$slots['container-right']\"\n\t\t\t\t\tclass=\"kt-field__input-container__suffix\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"container-right\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"!field.isLoading && showValidation && validationText !== null\"\n\t\t\t\tclass=\"kt-field__validation-text\"\n\t\t\t>\n\t\t\t\t<i class=\"yoco\" v-text=\"validationTextIcon\" />\n\t\t\t\t{{ validationText }}\n\t\t\t</div>\n\t\t</component>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport debounce from 'lodash/debounce.js'\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref } from 'vue'\nimport type { VNode } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\n\nimport FieldHelpText from './components/FieldHelpText.vue'\nimport { useInput } from './hooks'\nimport type { KottiField } from './types'\n\nconst LABEL_CLICK_DEBOUNCE = 200\n\nexport default defineComponent({\n\tname: 'KtField',\n\tcomponents: { FieldHelpText },\n\tprops: {\n\t\tdebounceLabelClick: { default: false, type: Boolean },\n\t\tfield: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiField.Hook.Returns<unknown>>,\n\t\t},\n\t\t/**\n\t\t * What’s the appropriate value for an empty field of this data type?\n\t\t * Used when clearing the field. Most likely either null or []\n\t\t */\n\t\tgetEmptyValue: { default: null, type: Function as PropType<() => unknown> },\n\t\thelpTextSlot: { default: () => [], type: Array as PropType<VNode[]> },\n\t\tisComponent: { default: null, type: String as PropType<string | null> },\n\t\tisRange: { default: false, type: Boolean },\n\t\tuseFieldset: { default: false, type: Boolean },\n\t},\n\temits: ['click', 'mousedown', 'visibilityChange'],\n\tsetup(props, { emit }) {\n\t\tconst inputId = computed(() =>\n\t\t\tprops.isRange\n\t\t\t\t? `${props.field.inputProps.id}-start`\n\t\t\t\t: props.field.inputProps.id,\n\t\t)\n\t\tconst valueVisibility = ref(false)\n\t\tconst validationType = computed(() => props.field.validation.type)\n\t\tconst showValidation = computed(\n\t\t\t() => !(props.field.hideValidation || validationType.value === 'empty'),\n\t\t)\n\n\t\tconst { clickInput, focusInput } = useInput(inputId.value)\n\t\tconst translations = useTranslationNamespace('KtFields')\n\n\t\tconst debouncedLabelClick = debounce((event: MouseEvent) => {\n\t\t\tif (event.detail === 1) {\n\t\t\t\tfocusInput()\n\t\t\t\tclickInput()\n\t\t\t}\n\t\t}, LABEL_CLICK_DEBOUNCE)\n\n\t\treturn {\n\t\t\taffixClasses: computed(() => (modifications: string[]) => [\n\t\t\t\t'kt-field__input-container__affix',\n\t\t\t\t...modifications.map(\n\t\t\t\t\t(modification) => `kt-field__input-container__affix--${modification}`,\n\t\t\t\t),\n\t\t\t]),\n\t\t\tfocusInput,\n\t\t\thandleClear: () => {\n\t\t\t\t/**\n\t\t\t\t * useSupports hook returns null if hideClear is not supported on ktField component\n\t\t\t\t */\n\t\t\t\tif (props.field.hideClear === null)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'KtField: hideClear is unsupported and yet handleClear was called',\n\t\t\t\t\t)\n\n\t\t\t\tprops.field.setValue(props.getEmptyValue())\n\t\t\t\tfocusInput()\n\t\t\t},\n\t\t\thandleVisibilityChange: () => {\n\t\t\t\tif (props.field.showVisibilityToggle) emit('visibilityChange')\n\t\t\t\tvalueVisibility.value = !valueVisibility.value\n\t\t\t},\n\t\t\thasHelpText: computed(\n\t\t\t\t() => props.helpTextSlot.length > 0 || props.field.helpText !== null,\n\t\t\t),\n\t\t\thasLabel: computed(() => props.field.label !== null),\n\t\t\ticonClasses: computed(\n\t\t\t\t() => (element: string, modifications: string[]) => [\n\t\t\t\t\t`kt-field__${element}__icon`,\n\t\t\t\t\t...modifications.map(\n\t\t\t\t\t\t(modification) => `kt-field__${element}__icon--${modification}`,\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t),\n\t\t\tinputId,\n\t\t\t/**\n\t\t\t * HACK: This template ref is used by child components, refactor with caution if needed\n\t\t\t */\n\t\t\tinputContainerRef: ref<HTMLDivElement | null>(null),\n\t\t\t/**\n\t\t\t * HACK: This template ref is used by child components, refactor with caution if needed\n\t\t\t */\n\t\t\tinputContainerWrapperRef: ref<HTMLDivElement | null>(null),\n\t\t\tlabelSuffix: computed(() =>\n\t\t\t\tprops.field.isOptional ? `(${translations.value.optionalLabel})` : '*',\n\t\t\t),\n\t\t\tlabelSuffixClasses: computed(() => {\n\t\t\t\treturn {\n\t\t\t\t\t'kt-field__header__label__suffix': true,\n\t\t\t\t\t'kt-field__header__label__suffix--error':\n\t\t\t\t\t\tshowValidation.value &&\n\t\t\t\t\t\t!props.field.isOptional &&\n\t\t\t\t\t\tprops.field.isEmpty,\n\t\t\t\t}\n\t\t\t}),\n\t\t\tonClickLabel: (event: MouseEvent) => {\n\t\t\t\tif (props.debounceLabelClick) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tdebouncedLabelClick(event)\n\t\t\t\t} else if (event.detail > 1) event.preventDefault()\n\t\t\t},\n\t\t\tshowValidation,\n\t\t\tvalidationText: computed(() =>\n\t\t\t\tprops.field.validation.type === 'empty'\n\t\t\t\t\t? null\n\t\t\t\t\t: props.field.validation.text,\n\t\t\t),\n\t\t\tvalidationTextIcon: computed(\n\t\t\t\t() =>\n\t\t\t\t\t({\n\t\t\t\t\t\tempty: null,\n\t\t\t\t\t\terror: Yoco.Icon.CIRCLE_CROSS,\n\t\t\t\t\t\tsuccess: Yoco.Icon.CIRCLE_CHECK,\n\t\t\t\t\t\twarning: Yoco.Icon.CIRCLE_ATTENTION,\n\t\t\t\t\t})[validationType.value],\n\t\t\t),\n\t\t\tvalueVisibility,\n\t\t\twrapperClasses: computed(() => {\n\t\t\t\tconst classes = ['kt-field__wrapper']\n\n\t\t\t\tif (props.field.isDisabled) classes.push('kt-field__wrapper--disabled')\n\t\t\t\tif (props.field.isBorderless)\n\t\t\t\t\tclasses.push('kt-field__wrapper--is-borderless')\n\t\t\t\t// eslint-disable-next-line unicorn/explicit-length-check -- size is an enum, and thus a false positive\n\t\t\t\tif (props.field.size)\n\t\t\t\t\tclasses.push(`kt-field__wrapper--is-${props.field.size}`)\n\n\t\t\t\tclasses.push(\n\t\t\t\t\t`kt-field__wrapper--is-validation-${\n\t\t\t\t\t\tshowValidation.value ? validationType.value : 'empty'\n\t\t\t\t\t}`,\n\t\t\t\t)\n\n\t\t\t\treturn classes\n\t\t\t}),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<!-- FIXME: https://github.com/3YOURMIND/kotti/issues/829 should this be implemented,\nwe would be able to extend on demand instead of unscoping all field classes -->\n<style lang=\"scss\">\n@import './mixins';\n\n:root {\n\t--field-border-radius: 4px;\n}\n\n/* stylelint-disable selector-class-pattern */\n.kt-field {\n\t&:not(:last-child) {\n\t\tmargin-bottom: 0.8rem;\n\t}\n\n\t&__wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: space-between;\n\n\t\t> :not(:last-child) {\n\t\t\tmargin-bottom: 0.4rem;\n\t\t}\n\n\t\t@include no-outline;\n\t\t@include sizes;\n\t\t@include input-colors;\n\n\t\t@include validations using ($type) {\n\t\t\t&:not(.kt-field__wrapper--disabled) {\n\t\t\t\t@if $type != empty {\n\t\t\t\t\t&.kt-field__wrapper--is-borderless {\n\t\t\t\t\t\t.kt-field__input-container {\n\t\t\t\t\t\t\tbackground-color: rgb(\n\t\t\t\t\t\t\t\tfrom var(--support-#{$type}-bg) r g b / 25%\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t&:not(.kt-field__wrapper--is-borderless) {\n\t\t\t\t\t\t.kt-field__input-container {\n\t\t\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.kt-field__validation-text {\n\t\t\t\t\t\tcolor: var(--support-#{$type});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t.kt-field__input-container:focus-within {\n\t\t\t\t\t--support-empty-light: var(--interactive-05);\n\n\t\t\t\t\tbackground-color: unset;\n\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t\tbox-shadow: 0 0 0 1px var(--support-#{$type}-light);\n\t\t\t\t}\n\n\t\t\t\t.kt-field__input-container:not(:focus-within):hover {\n\t\t\t\t\t--support-empty-bg: var(--interactive-02-hover);\n\t\t\t\t\t--support-empty-light: var(--interactive-04);\n\n\t\t\t\t\tbackground-color: var(--support-#{$type}-bg);\n\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&--disabled {\n\t\t\t* {\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.kt-field__input-container {\n\t\t\t\tborder: 1px solid var(--ui-01);\n\n\t\t\t\t&__affix {\n\t\t\t\t\tcolor: var(--text-05);\n\t\t\t\t}\n\n\t\t\t\t&__icon {\n\t\t\t\t\tcolor: var(--text-05);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&--is-borderless {\n\t\t\t.kt-field__input-container {\n\t\t\t\tbackground-color: rgb(from var(--gray-20) r g b / 25%);\n\t\t\t\tborder-color: transparent;\n\t\t\t}\n\t\t}\n\t}\n\n\tfieldset {\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tborder: 0;\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tfont-size: 0.9em;\n\n\t\t> :not(:first-child) {\n\t\t\tmargin-left: 0.2rem;\n\t\t}\n\n\t\t&--is-suffix {\n\t\t\t/*\n\t\t\tFor suffix case, align the suffix with the first line of the toggle's label.\n\t\t\tto roughly calculate this, note that the fontsize of the suffix is 90% of the\n\t\t\tlabel's fontsize (0.9em). So we push it 10% down to make them even (enough)\n\t\t\t*/\n\t\t\talign-self: flex-start;\n\t\t\ttransform: translateY(10%);\n\t\t}\n\n\t\t&__help-text {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\n\t\t\t&__icon {\n\t\t\t\t.yoco {\n\t\t\t\t\tfont-size: 1.4em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__label {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tcolor: var(--text-02);\n\n\t\t\t&__suffix {\n\t\t\t\tmargin-left: 0.2rem;\n\n\t\t\t\t&--error {\n\t\t\t\t\tcolor: var(--support-error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__text {\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__help-description {\n\t\tcolor: var(--text-03);\n\t}\n\n\t&__input-container-wrapper {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-2);\n\t\talign-items: stretch;\n\t}\n\n\t&__input-container-wrapper-loading {\n\t\theight: 40px !important;\n\t\tmargin-bottom: 0 !important;\n\t}\n\n\t// placeholders for slots\n\t&__input-container__prefix,\n\t&__input-container__suffix {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&__input-container {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\talign-items: center;\n\t\tpadding: 0 0.8rem;\n\t\tborder: 1px solid var(--ui-02);\n\t\tborder-radius: var(--field-border-radius);\n\n\t\t// The actual input\n\t\t&__slot {\n\t\t\tflex: 1;\n\t\t}\n\n\t\t// Prefix and Suffix\n\t\t&__affix {\n\t\t\tcolor: var(--text-02);\n\t\t\tcursor: default;\n\n\t\t\t&--left {\n\t\t\t\tpadding-right: 0.8rem;\n\t\t\t\tmargin-right: 0.8rem;\n\t\t\t\tborder-right: 1px solid var(--ui-02);\n\t\t\t}\n\n\t\t\t&--right {\n\t\t\t\tpadding-left: 0.8rem;\n\t\t\t\tmargin-left: 0.8rem;\n\t\t\t\tborder-left: 1px solid var(--ui-02);\n\t\t\t}\n\t\t}\n\n\t\t&__icon {\n\t\t\t.yoco {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__header__help-text,\n\t&__input-container {\n\t\t&__icon {\n\t\t\tcolor: var(--icon-02);\n\n\t\t\t.yoco {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t&--left,\n\t\t\t&--right {\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t&--left {\n\t\t\t\ttransform: translateX(-0.2rem);\n\t\t\t}\n\n\t\t\t&--right {\n\t\t\t\ttransform: translateX(0.2rem);\n\t\t\t}\n\n\t\t\t&--interactive {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__validation-text {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--text-03);\n\n\t\t> i {\n\t\t\tmargin-right: 0.1rem;\n\t\t}\n\t}\n}\n/* stylelint-enable selector-class-pattern */\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFieldVue from './KtField.vue'\nimport { KottiField } from './types'\n\nexport const KtField = attachMeta(makeInstallable(KtFieldVue), {\n\taddedVersion: '2.0.0',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=415%3A1',\n\t},\n\tslots: {\n\t\tcontainer: {\n\t\t\tdescription: 'useful for complex fields',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Field',\n\t\tschema: KottiField.propsSchema,\n\t},\n})\n\nexport * from './constants'\n","export const FIELD_META_BASE_SLOTS = {\n\thelpText: { description: 'custom helpText support (HTML)', scope: null },\n}\n","import type { KottiField } from '../kotti-field/types'\nimport { DECIMAL_SEPARATORS_CHARACTER_SET } from '../utilities'\n\nexport const KOTTI_FIELD_CURRENCY_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n\nexport const VALID_REGEX = new RegExp(\n\t`^[-]?[0-9]*${DECIMAL_SEPARATORS_CHARACTER_SET}?[0-9]*$`,\n)\n","import Big from 'big.js'\n\nimport type { DecimalSeparator } from '../types/decimal-separator'\nimport { DECIMAL_SEPARATORS_CHARACTER_SET } from '../utilities'\n\nexport const toNumber = <T extends string | null>(\n\tvalue: T,\n): T extends null ? null : number =>\n\t(value === null\n\t\t? null\n\t\t: Number.parseFloat(\n\t\t\t\t// `.` is the only accepted decimal place by parseFloat\n\t\t\t\tvalue.replace(new RegExp(DECIMAL_SEPARATORS_CHARACTER_SET), '.'),\n\t\t\t)) as T extends null ? null : number\n\nexport const truncate = (value: number, decimalPlaces: number): Big =>\n\tBig(value).round(decimalPlaces, Big.roundDown)\n\nexport const replaceDecimalSeparator = <T extends string | null>(\n\tstring: T,\n\tdecimalSeparator: DecimalSeparator,\n): T extends null ? null : string =>\n\t(string?.replace(\n\t\tnew RegExp(DECIMAL_SEPARATORS_CHARACTER_SET),\n\t\tdecimalSeparator,\n\t) ?? null) as T extends null ? null : string\n\nexport const toFixedPrecisionString = (\n\tstring: string | null,\n\tdecimalPlaces: number,\n): string | null => {\n\tconst number = toNumber(string)\n\tif (number === null) return null\n\n\tif (Number.isNaN(number)) return null\n\n\treturn truncate(number, decimalPlaces).toFixed(decimalPlaces)\n}\n","import { VALID_REGEX } from './constants'\nimport { toFixedPrecisionString } from './utilities'\n\n/**\n * Note: function assumes that the decimal separator for\n * `value` & `oldValue` is `.`\n *\n * The function assumes a value that passes VALID_REGEX\n * It may work for some strings, and return a valid number\n * (e.g. value: 'a', decimalPlaces: 2, returned value: '0.00')\n * as a side-effect of using `toFixedPrecisionString`,\n * but this is undefined behavior.\n */\nexport const formatCurrencyUserInput = ({\n\tdecimalPlaces,\n\tvalue,\n}: {\n\tdecimalPlaces: number\n\tvalue: string\n}): string => {\n\tif (!VALID_REGEX.test(value))\n\t\tthrow new Error(\n\t\t\t`KtFieldCurrency: formatCurrencyUserInput recieved invalid value \"${value}\".`,\n\t\t)\n\n\tconst isNegativeValue = value.startsWith('-')\n\tconst strippedSign = value.replace(/-/, '')\n\t// enforces at least as many digits as (decimal places + 1) (aka `0.00`)\n\tconst paddedString = `${'0'.repeat(decimalPlaces + 1)}${strippedSign}`\n\n\tconst withoutDecimalPoint = paddedString.replace('.', '')\n\n\tconst relocatedDecimalPoint = [\n\t\t...(isNegativeValue ? ['-'] : []),\n\t\twithoutDecimalPoint.slice(0, -decimalPlaces),\n\t\t'.',\n\t\twithoutDecimalPoint.slice(-decimalPlaces),\n\t].join('')\n\n\t// to remove leading zeroes (from padding or from user)\n\treturn toFixedPrecisionString(relocatedDecimalPoint, decimalPlaces) ?? ''\n}\n","<template>\n\t<KtField\n\t\tref=\"ktFieldRef\"\n\t\t:field=\"modifiedField\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<input\n\t\t\tref=\"inputRef\"\n\t\t\tv-bind=\"inputProps\"\n\t\t\t@input=\"onInput\"\n\t\t\t@keyup=\"onKeyup\"\n\t\t/>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport type { UnwrapRef } from 'vue'\nimport { computed, defineComponent, nextTick, ref, watch } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtField } from '../kotti-field'\nimport {\n\tuseEmitBlur,\n\tuseField,\n\tuseForceUpdate,\n\tuseKtFieldRef,\n} from '../kotti-field/hooks'\nimport { useI18nContext } from '../kotti-i18n/hooks'\nimport type { KottiI18n } from '../kotti-i18n/types'\nimport { makeProps } from '../make-props'\nimport { DecimalSeparator } from '../types/decimal-separator'\nimport { isNumberInRange } from '../utilities'\n\nimport { KOTTI_FIELD_CURRENCY_SUPPORTS, VALID_REGEX } from './constants'\nimport { formatCurrencyUserInput } from './input-formatter'\nimport { KottiFieldCurrency } from './types'\nimport {\n\treplaceDecimalSeparator,\n\ttoFixedPrecisionString,\n\ttoNumber,\n\ttruncate,\n} from './utilities'\n\n/**\n * flag to decide to set field to null,\n * when user deletes twice in a row,\n * after already getting to 0.00\n */\nconst shouldClear = (newValue: string, oldValue: string | null) => {\n\tconst isOldValueZeroOrNull = !toNumber(oldValue)\n\tconst isNewValueZero = !toNumber(newValue)\n\tconst isDeleting =\n\t\tnewValue.length < (oldValue?.length ?? Number.MIN_SAFE_INTEGER)\n\n\treturn isOldValueZeroOrNull && isNewValueZero && isDeleting\n}\n\nexport default defineComponent({\n\tname: 'KtFieldCurrency',\n\tcomponents: { KtField },\n\tprops: makeProps(KottiFieldCurrency.propsSchema),\n\temits: ['blur', 'input', 'keyup'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldCurrency.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_CURRENCY_SUPPORTS,\n\t\t})\n\n\t\tconst i18nContext = useI18nContext()\n\t\tconst ktFieldRef = useKtFieldRef()\n\n\t\tuseEmitBlur({\n\t\t\temit,\n\t\t\tfield,\n\t\t\tfieldTarget: computed(() => ktFieldRef.value?.inputContainerRef ?? null),\n\t\t})\n\n\t\tconst currencyFormat = computed<KottiI18n.CurrencyMap[string]>(() => {\n\t\t\tconst result = i18nContext.currencyMap[props.currency]\n\n\t\t\tif (!result)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`KtFieldCurrency: couldn't find key: ${props.currency} in KtI18nContext.Props['currencyMap']`,\n\t\t\t\t)\n\t\t\treturn result\n\t\t})\n\n\t\t/**\n\t\t * reference to input element, in order to track cursor position\n\t\t * prior to feeding the value back to the input, which resets the position to the end.\n\t\t */\n\t\tconst inputRef = ref<HTMLInputElement | null>(null)\n\t\tconst userCursorPositionFromRight = ref<number | null>(null)\n\n\t\tconst setCursorPosition = (position: number | null) => {\n\t\t\tnextTick(() => {\n\t\t\t\tif (position === null || inputRef.value === null) return\n\n\t\t\t\tconst newPosition = inputRef.value.value.length - position\n\t\t\t\tinputRef.value.setSelectionRange(newPosition, newPosition)\n\t\t\t})\n\t\t}\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\n\t\tconst internalStringValue = ref('')\n\n\t\twatch(\n\t\t\t(): [KottiFieldCurrency.Value, KottiI18n.CurrencyMap[string]] => [\n\t\t\t\tfield.currentValue,\n\t\t\t\tcurrencyFormat.value,\n\t\t\t],\n\t\t\t([newValue, newFormat]) => {\n\t\t\t\tconst newNumber = toNumber(newValue)\n\t\t\t\tif (newNumber === null) return\n\n\t\t\t\tconst newDecimalPlaces = newFormat.decimalPlaces\n\n\t\t\t\tconst isEqualPrecision = truncate(newNumber, newDecimalPlaces).eq(\n\t\t\t\t\tnewNumber,\n\t\t\t\t)\n\n\t\t\t\tif (!isEqualPrecision)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t`KtFieldCurrency: field.currentValue “${String(newValue)}” has more precision than is allowed (${String(newDecimalPlaces)}).`,\n\t\t\t\t\t\t\t'This is an issue because there would be a difference between displayed and actual value',\n\t\t\t\t\t\t].join(' '),\n\t\t\t\t\t)\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\twatch(\n\t\t\t(): [\n\t\t\t\tKottiFieldCurrency.Value,\n\t\t\t\tUnwrapRef<KottiI18n.Context['numberFormat']>['decimalSeparator'],\n\t\t\t\ttypeof currencyFormat,\n\t\t\t] => [\n\t\t\t\tfield.currentValue,\n\t\t\t\ti18nContext.numberFormat.decimalSeparator,\n\t\t\t\tcurrencyFormat,\n\t\t\t],\n\t\t\t([newValue, newDecimalSeparator, newCurrencyFormat]) => {\n\t\t\t\tif (\n\t\t\t\t\t!isNumberInRange({\n\t\t\t\t\t\tmaximum: props.maximum,\n\t\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\t\tvalue: toNumber(newValue),\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t`KtFieldCurrency: encountered an out-of-range number \"${String(newValue)}\"`,\n\t\t\t\t\t)\n\n\t\t\t\tconst isLogicallyDifferent =\n\t\t\t\t\ttoNumber(newValue) !== toNumber(internalStringValue.value)\n\n\t\t\t\tif (isLogicallyDifferent) {\n\t\t\t\t\tinternalStringValue.value =\n\t\t\t\t\t\treplaceDecimalSeparator(\n\t\t\t\t\t\t\ttoFixedPrecisionString(\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t\tnewCurrencyFormat.value.decimalPlaces,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tnewDecimalSeparator,\n\t\t\t\t\t\t) ?? ''\n\n\t\t\t\t\tsetCursorPosition(userCursorPositionFromRight.value)\n\t\t\t\t\tuserCursorPositionFromRight.value = null\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tinputProps: computed(\n\t\t\t\t(): InputHTMLAttributes & {\n\t\t\t\t\tclass: Record<string, boolean>\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} => ({\n\t\t\t\t\t...field.inputProps,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: {\n\t\t\t\t\t\t'kt-field-currency__input': true,\n\t\t\t\t\t},\n\t\t\t\t\tdisabled: field.isDisabled,\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\ttype: 'text', // NOT A MISTAKE\n\t\t\t\t\tvalue: internalStringValue.value,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tinputRef,\n\t\t\tktFieldRef,\n\t\t\tmodifiedField: computed(() => ({\n\t\t\t\t...field,\n\t\t\t\tprefix: currencyFormat.value.symbol,\n\t\t\t})),\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst value = (event.target as HTMLInputElement).value\n\n\t\t\t\tconst startPosition = inputRef.value?.selectionStart ?? 0\n\t\t\t\tuserCursorPositionFromRight.value = value.length - startPosition\n\n\t\t\t\tconst { maximum, minimum } = props\n\n\t\t\t\tconst isValid = VALID_REGEX.test(value)\n\n\t\t\t\tconst nextString = isValid\n\t\t\t\t\t? formatCurrencyUserInput({\n\t\t\t\t\t\t\tdecimalPlaces: currencyFormat.value.decimalPlaces,\n\t\t\t\t\t\t\tvalue: replaceDecimalSeparator(value, DecimalSeparator.DOT),\n\t\t\t\t\t\t})\n\t\t\t\t\t: ''\n\n\t\t\t\tconst isTypedNumberValid =\n\t\t\t\t\tisValid &&\n\t\t\t\t\tisNumberInRange({\n\t\t\t\t\t\tmaximum,\n\t\t\t\t\t\tminimum,\n\t\t\t\t\t\tvalue: nextString === '' ? null : Number.parseFloat(nextString),\n\t\t\t\t\t})\n\n\t\t\t\tconst emitNull = shouldClear(value, internalStringValue.value)\n\t\t\t\tif (isTypedNumberValid) field.setValue(emitNull ? null : nextString)\n\n\t\t\t\tforceUpdate()\n\n\t\t\t\tsetCursorPosition(userCursorPositionFromRight.value)\n\t\t\t},\n\t\t\tonKeyup: (event: KeyboardEvent) => {\n\t\t\t\temit('keyup', event)\n\t\t\t},\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.kt-field-currency__input {\n\tdisplay: flex;\n\twidth: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tfont-variant-numeric: tabular-nums;\n\tline-height: 1.6;\n\ttext-align: right;\n\tborder: 0;\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_CURRENCY_SUPPORTS } from './constants'\nimport * as KottiFieldCurrencyConstants from './constants'\nimport KtFieldCurrencyVue from './KtFieldCurrency.vue'\nimport { KottiFieldCurrency } from './types'\n\nexport const KtFieldCurrency = attachMeta(\n\tmakeInstallable(KtFieldCurrencyVue),\n\t{\n\t\taddedVersion: '3.0.0-beta.17',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldCurrency',\n\t\t\tschema: KottiFieldCurrency.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_CURRENCY_SUPPORTS },\n)\n\nexport { KottiFieldCurrencyConstants }\n","import type { InjectionKey } from 'vue'\n\nexport const KT_IS_IN_POPOVER: InjectionKey<boolean> =\n\tSymbol('KT_IS_IN_POPOVER')\n","import type { DatePicker as ElDate } from 'element-ui'\nimport type { Instance } from 'tippy.js'\nimport type { Ref } from 'vue'\nimport { onMounted, type default as Vue, watchEffect } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport type { KottiField } from '../kotti-field/types'\n\nimport type {\n\tKottiFieldDate,\n\tKottiFieldDateRange,\n\tKottiFieldDateTime,\n\tKottiFieldDateTimeRange,\n} from './types'\n\nexport type ElDateWithInternalAPI = ElDate & {\n\tblur(): void\n\thaveTrigger: boolean\n\tpicker: Vue & {\n\t\t$el: HTMLElement\n\t\tleftLabel?: string\n\t\trightLabel?: string\n\t\twidth: number\n\t}\n\tpickerVisible: boolean\n\tpopperJS: Exclude<Instance['popperInstance'], null>\n\treferenceElm: Element\n\tshowClose: boolean\n}\n\ntype HookParameters<DATA_TYPE extends Values> = {\n\telDateRef: Ref<ElDateWithInternalAPI | null>\n\tfield: KottiField.Hook.Returns<DATA_TYPE>\n\tinputContainerRef: Ref<Element | null>\n\tpopperHeight: string\n\tpopperWidth: string\n}\n\ntype Values =\n\t| KottiFieldDate.Value\n\t| KottiFieldDateRange.Value\n\t| KottiFieldDateTime.Value\n\t| KottiFieldDateTimeRange.Value\n\nconst getDateComponent = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tconst dateComponent = elDateRef.value\n\tif (dateComponent === null) throw new Error('el-date not available')\n\n\treturn dateComponent\n}\n\n/**\n * `picker` (the popper component) is (un)set with `(un)mountPicker`.\n * dependency tracking is done through `pickerVisible`, an internally computed prop,\n * because the `picker` gets a new reference on each call of `mountPicker()`.\n * so using any property on the picker to trigger the `watchEffect` won’t work.\n *\n * if a field is disabled, clicking on it, will set dateComponent.pickerVisible to true\n * instaneously but won't open the picker (dateComponent.picker will remain null)\n * and `pickerVisible` will reset itself\n * therefore, isPickerVisible() has to guard that picker exists\n *\n * NOTE: The order inside if-condition in any `watchEffect` hook matters\n * so pickerVisible needs to be accessed first\n */\nconst isPickerVisible = (dateComponent: ElDateWithInternalAPI) =>\n\tdateComponent.pickerVisible && dateComponent.picker\n\nconst useInputDecoration = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tonMounted(() => {\n\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\t// replace el-input affix icons with yoco icons\n\t\tfor (const icon of dateComponent.$el.querySelectorAll('.el-input__icon'))\n\t\t\ticon.classList.add('yoco')\n\n\t\tconst prefixIcon = dateComponent.$el.querySelector(\n\t\t\t'.el-input__icon.el-icon-time, .el-input__icon.el-icon-date',\n\t\t)\n\n\t\t// DO NOT misuse `append` in a hook that will retriger multiple times in the same lifecycle;\n\t\t// make sure the node you're adding is not already there (see other usage here) OR use `innerHTML`\n\t\tprefixIcon?.append(\n\t\t\tprefixIcon.classList.contains('el-icon-time')\n\t\t\t\t? Yoco.Icon.CALENDAR_CLOCK\n\t\t\t\t: Yoco.Icon.CALENDAR,\n\t\t)\n\n\t\tlet suffixIcon: Element | null = null\n\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef }) // don't refactor out of hooks\n\n\t\t\t\t// if `haveTrigger` is false, the suffixIcon is not rendered; `v-if` condition on the suffixIcon of el-ui dates\n\t\t\t\tif (dateComponent.haveTrigger) {\n\t\t\t\t\t// these are the default classes added to suffixIcon\n\t\t\t\t\t// there are more classes added when the clearIcon is hidden/shown\n\t\t\t\t\t// selecting with default selectors guarantees we get a suffixIcon even if it's hidden as long\n\t\t\t\t\t// as it's rendered. The other hook will handle the show/hide effect, while this should handle the existence of suffixIcon\n\t\t\t\t\tsuffixIcon = dateComponent.$el.querySelector(\n\t\t\t\t\t\t'.el-input__icon.el-range__close-icon, .el-input__icon:not(.el-icon-date):not(.el-icon-time)',\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\t\t\t/**\n\t\t\t\t * true onMouseEnter (when value is not Empty & field is clearable)\n\t\t\t\t * false onMouseLeave or when value is Empty or when the field is not clearable\n\t\t\t\t */\n\t\t\t\tconst showClear = dateComponent.showClose\n\n\t\t\t\tif (suffixIcon) {\n\t\t\t\t\tif (!suffixIcon.classList.contains('yoco'))\n\t\t\t\t\t\tsuffixIcon.classList.add('yoco')\n\n\t\t\t\t\tif (showClear) {\n\t\t\t\t\t\tif (!suffixIcon.hasChildNodes()) suffixIcon.append('close')\n\t\t\t\t\t} else if (suffixIcon.hasChildNodes() && suffixIcon.lastChild)\n\t\t\t\t\t\tsuffixIcon.lastChild.remove()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\n/**\n * Allow Inputs to Shrink\n * @see {@link https://stackoverflow.com/a/29990524/2857873}\n */\nconst useInputSizeFix = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tonMounted(() => {\n\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\tconst elInputs = dateComponent.$el.querySelectorAll(\n\t\t\t'.el-input__inner, .el-range-input',\n\t\t)\n\t\tArray.from(elInputs).forEach((element) => {\n\t\t\telement.setAttribute('size', '1')\n\t\t})\n\t})\n}\n\nconst usePickerDimensionsFix = <DATA_TYPE extends Values>({\n\telDateRef,\n\tpopperHeight,\n\tpopperWidth,\n}: Pick<\n\tHookParameters<DATA_TYPE>,\n\t'elDateRef' | 'popperHeight' | 'popperWidth'\n>) => {\n\tonMounted(() => {\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\t\t\tif (isPickerVisible(dateComponent)) {\n\t\t\t\t\tdateComponent.picker.$el.style.width = popperWidth\n\t\t\t\t\tdateComponent.picker.$el.style.height = popperHeight\n\t\t\t\t\t/**\n\t\t\t\t\t * HACK: to force re-compute the boundaries of the popper element (through the `update` prototype function),\n\t\t\t\t\t * thus properly position it.\n\t\t\t\t\t *\n\t\t\t\t\t * When we open the date-picker we trigger `showPicker`\n\t\t\t\t\t * https://github.com/ElemeFE/element/blob/649670c55a45c7343eb7148565e2d873bc3d52dd/packages/date-picker/src/picker.vue#L806\n\t\t\t\t\t * which calls `updatePopper` from the mixin vue-popper, which, in turn, either\n\t\t\t\t\t * creates a new PopperJs instance or updates the already-exisiting instance's props\n\t\t\t\t\t * https://github.com/ElemeFE/element/blob/649670c55a45c7343eb7148565e2d873bc3d52dd/src/utils/vue-popper.js#L120\n\t\t\t\t\t * In the latter case, it calls the prototype-defined function `update` from popper.js\n\t\t\t\t\t * https://github.com/ElemeFE/element/blob/3ceec7aa6a7ab46e61dbafa4c68b77ba09384b40/src/utils/popper.js#L224\n\t\t\t\t\t * to compute the boundaries of the popper, and thus its placement, among other things.\n\t\t\t\t\t *\n\t\t\t\t\t * On the first trigger of `showPopper`, a popperJs instance is created with the height and width defined by element-ui.\n\t\t\t\t\t * After creation, we mutate the popper width and height to fit our kotti styles and needs.\n\t\t\t\t\t * This mutation changes the boundaries of the popper without triggering a position adjustment. So, we force it.\n\t\t\t\t\t */\n\t\t\t\t\tvoid dateComponent.popperJS.update()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\nconst usePickerInnerInputsFix = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tonMounted(() => {\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\t\t\t\tif (isPickerVisible(dateComponent)) {\n\t\t\t\t\tconst dateTimePickerInputWrapper =\n\t\t\t\t\t\t'.el-date-picker__editor-wrap  > .el-input--small'\n\t\t\t\t\tconst dateTimeRangeInputWrapper =\n\t\t\t\t\t\t'.el-date-range-picker__time-picker-wrap > .el-input--small'\n\t\t\t\t\tconst pickerInputWrappers: Array<Element> = Array.from(\n\t\t\t\t\t\tdateComponent.picker.$el.querySelectorAll(\n\t\t\t\t\t\t\t[dateTimePickerInputWrapper, dateTimeRangeInputWrapper].join(\n\t\t\t\t\t\t\t\t', ',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t// divs around input fields inside the picker of KtFieldDateTime, KtFieldDateTimeRange\n\t\t\t\t\tpickerInputWrappers.forEach((input) => {\n\t\t\t\t\t\tinput.classList.add(\n\t\t\t\t\t\t\t'kt-field__wrapper',\n\t\t\t\t\t\t\t'kt-field__wrapper--is-small',\n\t\t\t\t\t\t\t'kt-field__wrapper--is-validation-empty',\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\n\t\t\t\t\tconst innerInputs: Array<Element> = Array.from(\n\t\t\t\t\t\tdateComponent.picker.$el.querySelectorAll('.el-input__inner'),\n\t\t\t\t\t)\n\n\t\t\t\t\tinnerInputs.forEach((input) => {\n\t\t\t\t\t\tinput.classList.add('kt-field__input-container')\n\t\t\t\t\t\tinput.setAttribute('size', '1')\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\n/**\n * If the field is loading, we want to unfocus in case the popper is open\n * so that when isLoading changes, the popper isn't misplaced\n */\nconst usePickerMisplacementFix = <DATA_TYPE extends Values>({\n\telDateRef,\n\tfield,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef' | 'field'>) => {\n\tonMounted(() => {\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\t\t\tif (field.isLoading || field.isDisabled) {\n\t\t\t\t\tdateComponent.blur()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\n/**\n * add yoco class to header icons to enable yoco icons\n */\nconst usePickerNavigationIcons = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tonMounted(() => {\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\t\t\tif (isPickerVisible(dateComponent)) {\n\t\t\t\t\tconst insertYocoIcon = (icon: Yoco.Icon) =>\n\t\t\t\t\t\t`<i class=\"yoco\">${icon}</i>`\n\n\t\t\t\t\tconst pickerHeaderIcons: Array<HTMLElement> = Array.from(\n\t\t\t\t\t\tdateComponent.picker.$el.querySelectorAll(\n\t\t\t\t\t\t\t'.el-picker-panel__icon-btn',\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\n\t\t\t\t\tconst headerYocoIcons = [\n\t\t\t\t\t\tinsertYocoIcon(Yoco.Icon.CHEVRON_LEFT_DOUBLE),\n\t\t\t\t\t\tinsertYocoIcon(Yoco.Icon.CHEVRON_LEFT),\n\t\t\t\t\t\tinsertYocoIcon(Yoco.Icon.CHEVRON_RIGHT_DOUBLE),\n\t\t\t\t\t\tinsertYocoIcon(Yoco.Icon.CHEVRON_RIGHT),\n\t\t\t\t\t]\n\n\t\t\t\t\tpickerHeaderIcons.forEach((icon, index) => {\n\t\t\t\t\t\ticon.innerHTML = headerYocoIcons[index] as string\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\n/**\n * placement fix\n * same hack as the one used in the selects but for the datepickers, the popper component.data\n * are merged with the DateComponent’s own data, therefore allowing access to properties on popper component\n * directly through dateComponent\n */\nconst usePickerPlacementFix = <DATA_TYPE extends Values>({\n\telDateRef,\n\tinputContainerRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef' | 'inputContainerRef'>) => {\n\tonMounted(() => {\n\t\tconst dateComponent = getDateComponent({ elDateRef })\n\n\t\tconst ktFieldDateInputContainer = inputContainerRef.value\n\t\tif (ktFieldDateInputContainer === null)\n\t\t\tthrow new Error('kt-field-date__input-container not available')\n\n\t\tdateComponent.referenceElm = ktFieldDateInputContainer\n\t})\n}\n\nconst useRangePickerHeaderFix = <DATA_TYPE extends Values>({\n\telDateRef,\n}: Pick<HookParameters<DATA_TYPE>, 'elDateRef'>) => {\n\tonMounted(() => {\n\t\twatchEffect(\n\t\t\t() => {\n\t\t\t\tconst dateComponent = getDateComponent({ elDateRef })\n\t\t\t\tif (isPickerVisible(dateComponent)) {\n\t\t\t\t\t// change when any of the navigation buttons in the range-pickers are clicked\n\t\t\t\t\t/**\n\t\t\t\t\t * @example\n\t\t\t\t\t * [\n\t\t\t\t\t * \t['2024', 'May'],\n\t\t\t\t\t * \t['2024', 'June'],\n\t\t\t\t\t * ]\n\t\t\t\t\t */\n\t\t\t\t\tconst dates = [\n\t\t\t\t\t\tdateComponent.picker.leftLabel?.split(/\\s+/) ?? ['', ''],\n\t\t\t\t\t\tdateComponent.picker.rightLabel?.split(/\\s+/) ?? ['', ''],\n\t\t\t\t\t]\n\n\t\t\t\t\tconst headers = dateComponent.picker.$el.querySelectorAll(\n\t\t\t\t\t\t'.el-date-range-picker__header',\n\t\t\t\t\t)\n\n\t\t\t\t\theaders.forEach((header, index) => {\n\t\t\t\t\t\tconst fullDate = header.querySelector('div')\n\t\t\t\t\t\tif (fullDate) {\n\t\t\t\t\t\t\tfullDate.innerHTML = dates[index]?.[0] as string // leftMonth or rightMonth\n\t\t\t\t\t\t\tif (header.lastChild?.nodeType === window.Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\t// we add a text node each call with the new year value, thus need to remove the old first\n\t\t\t\t\t\t\t\theader.lastChild.remove()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\theader.append(dates[index]?.[1] as string)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\t})\n}\n\nexport const usePicker = <DATA_TYPE extends Values>({\n\telDateRef,\n\tfield,\n\tinputContainerRef,\n\tpopperHeight,\n\tpopperWidth,\n}: HookParameters<DATA_TYPE>): void => {\n\tuseInputDecoration({ elDateRef })\n\tuseInputSizeFix({ elDateRef })\n\tusePickerDimensionsFix({\n\t\telDateRef,\n\t\tpopperHeight,\n\t\tpopperWidth,\n\t})\n\tusePickerInnerInputsFix({ elDateRef })\n\tusePickerMisplacementFix({ elDateRef, field })\n\tusePickerNavigationIcons({ elDateRef })\n\tusePickerPlacementFix({ elDateRef, inputContainerRef })\n\tuseRangePickerHeaderFix({ elDateRef })\n}\n","import dayjs from 'dayjs'\n\nimport type { Shared } from './types'\n\nexport const isInvalidDate = (\n\tprops: Pick<Shared.PropsInternal, 'maximumDate' | 'minimumDate'>,\n\tdate: Date,\n): boolean => {\n\tconst { maximumDate, minimumDate } = props\n\n\treturn (\n\t\t(maximumDate !== null && dayjs(date).isAfter(maximumDate, 'day')) ||\n\t\t(minimumDate !== null && dayjs(date).isBefore(minimumDate, 'day'))\n\t)\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tclass=\"kt-field-date\"\n\t\tdebounceLabelClick\n\t\t:getEmptyValue=\"() => null\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<template #container>\n\t\t\t<div ref=\"inputContainerRef\" class=\"kt-field__input-container\">\n\t\t\t\t<ElDate\n\t\t\t\t\tref=\"elDateRef\"\n\t\t\t\t\tv-bind=\"elDatePickerProps\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport ElDate from 'element-ui/lib/date-picker.js'\nimport type {\n\tDatePickerOptions,\n\tElDatePicker,\n} from 'element-ui/types/date-picker'\nimport type { Ref } from 'vue'\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { KT_IS_IN_POPOVER } from '../kotti-popover/constants'\nimport { makeProps } from '../make-props'\n\nimport { EL_DATE_PROPS, KOTTI_FIELD_DATE_SUPPORTS } from './constants'\nimport type { ElDateWithInternalAPI } from './hooks'\nimport { usePicker } from './hooks'\nimport { KottiFieldDate } from './types'\nimport { isInvalidDate } from './utilities'\n\nexport default defineComponent({\n\tname: 'KtFieldDate',\n\tcomponents: { ElDate, KtField },\n\tprops: makeProps(KottiFieldDate.propsSchema),\n\temits: ['blur', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldDate.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_DATE_SUPPORTS,\n\t\t})\n\n\t\tconst elDateRef = ref<ElDateWithInternalAPI | null>(null)\n\t\tconst inputContainerRef = ref<Element | null>(null)\n\n\t\tusePicker({\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tpopperHeight: '470px',\n\t\t\tpopperWidth: '400px',\n\t\t})\n\n\t\tconst pickerOptions: Ref<\n\t\t\tPick<DatePickerOptions, 'disabledDate' | 'shortcuts'>\n\t\t> = computed(() => ({\n\t\t\tdisabledDate: (date: Date) => isInvalidDate(props, date),\n\t\t\tshortcuts: props.shortcuts.map(({ keepOpen, label, value }) => ({\n\t\t\t\tonClick(picker: ElDatePicker) {\n\t\t\t\t\t/**\n\t\t\t\t\t * close the picker if it shouldn’t stay open\n\t\t\t\t\t */\n\t\t\t\t\tif (keepOpen !== true) picker.$emit('pick', value)\n\n\t\t\t\t\tfield.setValue(value)\n\t\t\t\t},\n\t\t\t\ttext: label,\n\t\t\t})),\n\t\t}))\n\n\t\tconst isInPopover = inject(KT_IS_IN_POPOVER, false)\n\n\t\treturn {\n\t\t\telDatePickerProps: computed(\n\t\t\t\t(): Partial<ElDatePicker> => ({\n\t\t\t\t\t...EL_DATE_PROPS,\n\t\t\t\t\t/**\n\t\t\t\t\t * @see {@link https://github.com/ElemeFE/element/blob/v2.13.1/packages/date-picker/src/picker.vue#L334)}\n\t\t\t\t\t * */\n\t\t\t\t\t// @ts-expect-error (exposed through mixin on picker.vue on element-ui's implementation)\n\t\t\t\t\tappendToBody: !isInPopover,\n\t\t\t\t\tclearable: !field.hideClear,\n\t\t\t\t\t'data-test': field.inputProps['data-test'],\n\t\t\t\t\tdisabled: field.isDisabled || field.isLoading,\n\t\t\t\t\tid: field.inputProps.id,\n\t\t\t\t\tpickerOptions: pickerOptions.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? '',\n\t\t\t\t\ttype: 'date',\n\t\t\t\t\tvalue: field.currentValue ?? '',\n\t\t\t\t}),\n\t\t\t),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonInput: (value: KottiFieldDate.Value) => {\n\t\t\t\tif (!field.isDisabled && !field.isLoading) field.setValue(value)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import 'styles';\n</style>\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tclass=\"kt-field-date-range\"\n\t\tdebounceLabelClick\n\t\t:getEmptyValue=\"() => [null, null]\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\tisRange\n\t>\n\t\t<template #container>\n\t\t\t<div ref=\"inputContainerRef\" class=\"kt-field__input-container\">\n\t\t\t\t<ElDate\n\t\t\t\t\tref=\"elDateRef\"\n\t\t\t\t\tv-bind=\"elDateRangePickerProps\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport ElDate from 'element-ui/lib/date-picker.js'\nimport type {\n\tDatePickerOptions,\n\tElDatePicker,\n} from 'element-ui/types/date-picker'\nimport type { Ref } from 'vue'\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { KT_IS_IN_POPOVER } from '../kotti-popover/constants'\nimport { makeProps } from '../make-props'\n\nimport {\n\tEL_DATE_PROPS,\n\tEL_DATE_RANGE_PROPS,\n\tKOTTI_FIELD_DATE_SUPPORTS,\n} from './constants'\nimport type { ElDateWithInternalAPI } from './hooks'\nimport { usePicker } from './hooks'\nimport { KottiFieldDateRange } from './types'\nimport { isInvalidDate } from './utilities'\n\nexport default defineComponent({\n\tname: 'KtFieldDateRange',\n\tcomponents: { ElDate, KtField },\n\tprops: makeProps(KottiFieldDateRange.propsSchema),\n\temits: ['blur', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldDateRange.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (dateRangeValue) =>\n\t\t\t\tdateRangeValue.every((date) => date === null),\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_DATE_SUPPORTS,\n\t\t})\n\n\t\tconst elDateRef = ref<ElDateWithInternalAPI | null>(null)\n\n\t\tconst inputContainerRef = ref<Element | null>(null)\n\n\t\tusePicker({\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tpopperHeight: '470px',\n\t\t\tpopperWidth: '700px',\n\t\t})\n\n\t\tconst pickerOptions: Ref<\n\t\t\tPick<DatePickerOptions, 'disabledDate' | 'shortcuts'>\n\t\t> = computed(() => ({\n\t\t\tdisabledDate: (date: Date) => isInvalidDate(props, date),\n\t\t\tshortcuts: props.shortcuts.map(({ keepOpen, label, value }) => ({\n\t\t\t\tonClick(_picker: ElDatePicker) {\n\t\t\t\t\tif (keepOpen !== true) _picker.$emit('pick', value)\n\t\t\t\t\tfield.setValue(value)\n\t\t\t\t},\n\t\t\t\ttext: label,\n\t\t\t})),\n\t\t}))\n\n\t\tconst isInPopover = inject(KT_IS_IN_POPOVER, false)\n\n\t\treturn {\n\t\t\telDateRangePickerProps: computed(\n\t\t\t\t(): Partial<ElDatePicker> => ({\n\t\t\t\t\t...EL_DATE_PROPS,\n\t\t\t\t\t...EL_DATE_RANGE_PROPS,\n\t\t\t\t\t/**\n\t\t\t\t\t * @see {@link https://github.com/ElemeFE/element/blob/v2.13.1/packages/date-picker/src/picker.vue#L334)}\n\t\t\t\t\t * */\n\t\t\t\t\t// @ts-expect-error (exposed through mixin on picker.vue on element-ui's implementation)\n\t\t\t\t\tappendToBody: !isInPopover,\n\t\t\t\t\tclearable: !field.hideClear,\n\t\t\t\t\t'data-test': field.inputProps['data-test'],\n\t\t\t\t\tdisabled: field.isDisabled || field.isLoading,\n\t\t\t\t\tendPlaceholder: props.placeholder[1] ?? '',\n\t\t\t\t\tid: [`${field.inputProps.id}-start`, `${field.inputProps.id}-end`],\n\t\t\t\t\tpickerOptions: pickerOptions.value,\n\t\t\t\t\tstartPlaceholder: props.placeholder[0] ?? '',\n\t\t\t\t\ttype: 'daterange',\n\t\t\t\t\tvalue: field.currentValue.map((date) => date ?? '') as [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tstring,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonInput: (value: KottiFieldDateRange.Value | null) => {\n\t\t\t\tif (field.isDisabled || field.isLoading) return\n\n\t\t\t\t// element-ui emits `null` on clear\n\t\t\t\tfield.setValue(value ?? [null, null])\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import 'styles';\n</style>\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tclass=\"kt-field-datetime\"\n\t\tdebounceLabelClick\n\t\t:getEmptyValue=\"() => null\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<template #container>\n\t\t\t<div ref=\"inputContainerRef\" class=\"kt-field__input-container\">\n\t\t\t\t<ElDate\n\t\t\t\t\tref=\"elDateRef\"\n\t\t\t\t\tv-bind=\"elDateTimePickerProps\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport ElDate from 'element-ui/lib/date-picker.js'\nimport type {\n\tDatePickerOptions,\n\tElDatePicker,\n} from 'element-ui/types/date-picker'\nimport type { Ref } from 'vue'\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { KT_IS_IN_POPOVER } from '../kotti-popover/constants'\nimport { makeProps } from '../make-props'\n\nimport { EL_DATE_TIME_PROPS, KOTTI_FIELD_DATE_SUPPORTS } from './constants'\nimport type { ElDateWithInternalAPI } from './hooks'\nimport { usePicker } from './hooks'\nimport { KottiFieldDateTime } from './types'\nimport { isInvalidDate } from './utilities'\n\nexport default defineComponent({\n\tname: 'KtFieldDateTime',\n\tcomponents: { ElDate, KtField },\n\tprops: makeProps(KottiFieldDateTime.propsSchema),\n\temits: ['blur', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldDateTime.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_DATE_SUPPORTS,\n\t\t})\n\n\t\tconst elDateRef = ref<ElDateWithInternalAPI | null>(null)\n\n\t\tconst inputContainerRef = ref<Element | null>(null)\n\n\t\tusePicker({\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tpopperHeight: '550px',\n\t\t\tpopperWidth: '400px',\n\t\t})\n\n\t\tconst pickerOptions: Ref<\n\t\t\tPick<DatePickerOptions, 'disabledDate' | 'shortcuts'>\n\t\t> = computed(() => ({\n\t\t\tdisabledDate: (date: Date) => isInvalidDate(props, date),\n\t\t\tshortcuts: props.shortcuts.map(({ keepOpen, label, value }) => ({\n\t\t\t\tonClick(picker: ElDatePicker) {\n\t\t\t\t\t/**\n\t\t\t\t\t * close the picker if it shouldn’t stay open\n\t\t\t\t\t */\n\t\t\t\t\tif (keepOpen !== true) picker.$emit('pick', value)\n\n\t\t\t\t\tfield.setValue(value)\n\t\t\t\t},\n\t\t\t\ttext: label,\n\t\t\t})),\n\t\t}))\n\n\t\tconst isInPopover = inject(KT_IS_IN_POPOVER, false)\n\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\telDateTimePickerProps: computed(\n\t\t\t\t(): Partial<ElDatePicker> => ({\n\t\t\t\t\t...EL_DATE_TIME_PROPS,\n\t\t\t\t\t/**\n\t\t\t\t\t * @see {@link https://github.com/ElemeFE/element/blob/v2.13.1/packages/date-picker/src/picker.vue#L334)}\n\t\t\t\t\t * */\n\t\t\t\t\t// @ts-expect-error (exposed through mixin on picker.vue on element-ui's implementation)\n\t\t\t\t\tappendToBody: !isInPopover,\n\t\t\t\t\tclearable: !field.hideClear,\n\t\t\t\t\t'data-test': field.inputProps['data-test'],\n\t\t\t\t\tdisabled: field.isDisabled || field.isLoading,\n\t\t\t\t\tid: field.inputProps.id,\n\t\t\t\t\tpickerOptions: pickerOptions.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? '',\n\t\t\t\t\ttype: 'datetime',\n\t\t\t\t\tvalue: field.currentValue ?? '',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonInput: (value: KottiFieldDateTime.Value) => {\n\t\t\t\tif (!field.isDisabled && !field.isLoading) field.setValue(value)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import 'styles';\n</style>\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tclass=\"kt-field-datetime-range\"\n\t\tdebounceLabelClick\n\t\t:getEmptyValue=\"() => [null, null]\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\tisRange\n\t>\n\t\t<template #container>\n\t\t\t<div ref=\"inputContainerRef\" class=\"kt-field__input-container\">\n\t\t\t\t<ElDate\n\t\t\t\t\tref=\"elDateRef\"\n\t\t\t\t\tv-bind=\"elDateTimeRangePickerProps\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport ElDate from 'element-ui/lib/date-picker.js'\nimport type {\n\tDatePickerOptions,\n\tElDatePicker,\n} from 'element-ui/types/date-picker'\nimport type { Ref } from 'vue'\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { KT_IS_IN_POPOVER } from '../kotti-popover/constants'\nimport { makeProps } from '../make-props'\n\nimport {\n\tEL_DATE_RANGE_PROPS,\n\tEL_DATE_TIME_PROPS,\n\tKOTTI_FIELD_DATE_SUPPORTS,\n} from './constants'\nimport type { ElDateWithInternalAPI } from './hooks'\nimport { usePicker } from './hooks'\nimport { KottiFieldDateTimeRange } from './types'\nimport { isInvalidDate } from './utilities'\n\nexport default defineComponent({\n\tname: 'KtFieldDateTimeRange',\n\tcomponents: { ElDate, KtField },\n\tprops: makeProps(KottiFieldDateTimeRange.propsSchema),\n\temits: ['blur', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldDateTimeRange.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (dateTimeRangeValue) =>\n\t\t\t\tdateTimeRangeValue.every((dateTime) => dateTime === null),\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_DATE_SUPPORTS,\n\t\t})\n\n\t\tconst elDateRef = ref<ElDateWithInternalAPI | null>(null)\n\n\t\tconst inputContainerRef = ref<Element | null>(null)\n\n\t\tusePicker({\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tpopperHeight: '550px',\n\t\t\tpopperWidth: '700px',\n\t\t})\n\n\t\tconst pickerOptions: Ref<\n\t\t\tPick<DatePickerOptions, 'disabledDate' | 'shortcuts'>\n\t\t> = computed(() => ({\n\t\t\tdisabledDate: (date: Date) => isInvalidDate(props, date),\n\t\t\tshortcuts: props.shortcuts.map(({ keepOpen, label, value }) => ({\n\t\t\t\tonClick(_picker: ElDatePicker) {\n\t\t\t\t\tif (keepOpen !== true) _picker.$emit('pick', value)\n\t\t\t\t\tfield.setValue(value)\n\t\t\t\t},\n\t\t\t\ttext: label,\n\t\t\t})),\n\t\t}))\n\n\t\tconst isInPopover = inject(KT_IS_IN_POPOVER, false)\n\n\t\treturn {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\telDateRef: elDateRef as any,\n\t\t\telDateTimeRangePickerProps: computed(\n\t\t\t\t(): Partial<ElDatePicker> => ({\n\t\t\t\t\t...EL_DATE_TIME_PROPS,\n\t\t\t\t\t...EL_DATE_RANGE_PROPS,\n\t\t\t\t\t/**\n\t\t\t\t\t * @see {@link https://github.com/ElemeFE/element/blob/v2.13.1/packages/date-picker/src/picker.vue#L334)}\n\t\t\t\t\t * */\n\t\t\t\t\t// @ts-expect-error (exposed through mixin on picker.vue on element-ui's implementation)\n\t\t\t\t\tappendToBody: !isInPopover,\n\t\t\t\t\tclearable: !field.hideClear,\n\t\t\t\t\t'data-test': field.inputProps['data-test'],\n\t\t\t\t\tdisabled: field.isDisabled || field.isLoading,\n\t\t\t\t\tendPlaceholder: props.placeholder[1] ?? '',\n\t\t\t\t\tid: [`${field.inputProps.id}-start`, `${field.inputProps.id}-end`],\n\t\t\t\t\tpickerOptions: pickerOptions.value,\n\t\t\t\t\tstartPlaceholder: props.placeholder[0] ?? '',\n\t\t\t\t\ttype: 'datetimerange',\n\t\t\t\t\tvalue: field.currentValue.map((date) => date ?? '') as [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tstring,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfield,\n\t\t\tinputContainerRef,\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonInput: (value: KottiFieldDateTimeRange.Value | null) => {\n\t\t\t\tif (field.isDisabled || field.isLoading) return\n\n\t\t\t\t// element-ui emits `null` on clear\n\t\t\t\tfield.setValue(value ?? [null, null])\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import 'styles';\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_DATE_SUPPORTS } from './constants'\nimport KtFieldDateVue from './KtFieldDate.vue'\nimport KtFieldDateRangeVue from './KtFieldDateRange.vue'\nimport KtFieldDateTimeVue from './KtFieldDateTime.vue'\nimport KtFieldDateTimeRangeVue from './KtFieldDateTimeRange.vue'\nimport {\n\tKottiFieldDate,\n\tKottiFieldDateRange,\n\tKottiFieldDateTime,\n\tKottiFieldDateTimeRange,\n} from './types'\n\nconst componentFolder = 'kotti-field-date'\nconst DESIGN_URL =\n\t'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=773%3A6059'\n\nexport const KtFieldDate = attachMeta(\n\tmakeInstallable(KtFieldDateVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: DESIGN_URL,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldDate',\n\t\t\tschema: KottiFieldDate.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_DATE_SUPPORTS },\n)\n\nexport const KtFieldDateRange = attachMeta(\n\tmakeInstallable(KtFieldDateRangeVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: DESIGN_URL,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldDateRange',\n\t\t\tschema: KottiFieldDateRange.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_DATE_SUPPORTS },\n)\n\nexport const KtFieldDateTime = attachMeta(\n\tmakeInstallable(KtFieldDateTimeVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: DESIGN_URL,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldDateTime',\n\t\t\tschema: KottiFieldDateTime.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_DATE_SUPPORTS },\n)\n\nexport const KtFieldDateTimeRange = attachMeta(\n\tmakeInstallable(KtFieldDateTimeRangeVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: DESIGN_URL,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldDateTimeRange',\n\t\t\tschema: KottiFieldDateTimeRange.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_DATE_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport enum ErrorCodes {\n\tNOT_ALLOWED_ERROR = 'NotAllowedError',\n\tNOT_FOUND_ERROR = 'NotFoundError',\n\tNOT_SUPPORTED_ERROR = 'NotSupportedError',\n}\n\nexport const KOTTI_FIELD_FILE_UPLOAD_SUPPORTS: KottiField.Supports = {\n\tautoComplete: false,\n\tborderless: false,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: false,\n\ttabIndex: true,\n}\n","import { filesize } from 'filesize'\n\n/**\n * Formats an array of strings to a comma-separated string in uppercase\n * @param extensions Array of allowed file extensions\n * @param collapseExtensionsAfter Maximum number of extensions to display\n * @returns Formatted string, e.g.: \"JPG, JPEG, JP2, PNG\"\n */\nexport const formatExtensions = (\n\textensions: Array<string>,\n\tcollapseExtensionsAfter: number,\n): string =>\n\t[\n\t\t...extensions\n\t\t\t.slice(0, collapseExtensionsAfter)\n\t\t\t.map((extension: string) => extension.replaceAll('.', '').trim()),\n\t\t...(extensions.length > collapseExtensionsAfter ? ['…'] : []),\n\t]\n\t\t.join(', ')\n\t\t.toUpperCase()\n\n/**\n * Formats file size to a human readable file size string from a number\n * @param fileSize File size in bytes\n * @param round Decimal place, default is 1\n * @returns Formatted file size string\n */\nexport const formatFileSize = (fileSize: number, round = 1): string =>\n\tfilesize(fileSize, { round, standard: 'iec' })\n","/**\n * Builds a valid string for the HTML file input's accept attribute\n * @param extensions Array of allowed file extensions\n * @returns Accept string, e.g.: \".jpg,.jpeg,.jp2,.png\"\n */\nexport const buildAcceptString = (\n\textensions: Array<string>,\n): HTMLInputElement['accept'] | undefined =>\n\textensions.length > 0\n\t\t? extensions\n\t\t\t\t.map((extension) => `.${extension.replaceAll('.', '').trim()}`)\n\t\t\t\t.join(',')\n\t\t\t\t.toLowerCase()\n\t\t: undefined\n","import {\n\tKottiFieldFileUpload,\n\tKottiFieldFileUploadRemote,\n\tShared,\n} from './types'\n\nexport const isSelectingMultipleFilesWhenNotAllowed = (\n\tallowMultiple: boolean,\n\tselectionSize: number,\n): boolean => !allowMultiple && selectionSize > 1\n\nconst isValidFileSize = (fileSize: number, maxFileSize: number): boolean =>\n\tfileSize <= maxFileSize\n\nconst isValidFileExtension = (\n\tfileName: string,\n\tvalidFileExtensions: Array<string>,\n): boolean => {\n\tif (validFileExtensions.length === 0) return true\n\n\tconst fileExtension = fileName.split('.').pop() ?? null\n\n\tif (fileExtension === null) return false\n\n\treturn validFileExtensions.some(\n\t\t(extension) =>\n\t\t\textension.localeCompare(fileExtension.trim(), undefined, {\n\t\t\t\tsensitivity: 'accent',\n\t\t\t}) === 0,\n\t)\n}\n\n/**\n * Validates a File Item\n * @param param0.extensions Allowed file extensions\n * @param param0.fileName The name of the file (muss include file extension)\n * @param param0.fileSize The size of the file in bytes\n * @param param0.maxFileSize The maximum file size allowed in bytes\n * @returns Validation.SUCCESS if the file is valid, else either\n * Validation.INVALID_EXTENSION or Validation.MAX_SIZE_EXCEEDED.\n * Validation.INVALID_EXTENSION has higher priority.\n */\nexport const validateFile = ({\n\textensions,\n\tfileName,\n\tfileSize,\n\tmaxFileSize,\n}: {\n\textensions: KottiFieldFileUpload.PropsInternal['extensions']\n\tfileName: string\n\tfileSize: number\n\tmaxFileSize: KottiFieldFileUpload.PropsInternal['maxFileSize']\n}): Shared.Validation => {\n\tif (!isValidFileExtension(fileName, extensions))\n\t\treturn Shared.Validation.INVALID_EXTENSION\n\n\tif (!isValidFileSize(fileSize, maxFileSize))\n\t\treturn Shared.Validation.MAX_SIZE_EXCEEDED\n\n\treturn Shared.Validation.SUCCESS\n}\n\nconst isValidValueNonRemote = (\n\tvalue: KottiFieldFileUpload.ValueInternal,\n): boolean =>\n\tvalue.some(\n\t\t(fileItem) =>\n\t\t\tfileItem.status === KottiFieldFileUpload.Status.READY_TO_UPLOAD ||\n\t\t\tfileItem.status === KottiFieldFileUpload.Status.UPLOADED,\n\t)\n\nconst isValidValueRemote = (\n\tvalue: KottiFieldFileUploadRemote.ValueInternal,\n): boolean =>\n\tvalue.some(\n\t\t(fileItem) =>\n\t\t\tfileItem.status === KottiFieldFileUploadRemote.Status.UPLOADED ||\n\t\t\tfileItem.status === KottiFieldFileUploadRemote.Status.UPLOADING,\n\t)\n\n/**\n * Checks whether Value is valid\n * @param value The value to evaluate\n * @returns true if at least one selected file is valid, else false\n */\nexport const isValidValue = <\n\tT extends\n\t\t| KottiFieldFileUpload.ValueInternal\n\t\t| KottiFieldFileUploadRemote.ValueInternal,\n>(\n\tvalue: T,\n\ttype: T extends KottiFieldFileUpload.ValueInternal ? 'NonRemote' : 'Remote',\n): boolean =>\n\ttype === 'NonRemote'\n\t\t? isValidValueNonRemote(value as KottiFieldFileUpload.ValueInternal)\n\t\t: isValidValueRemote(value as KottiFieldFileUploadRemote.ValueInternal)\n","<template>\n\t<div\n\t\t:class=\"rootClasses\"\n\t\t:data-test=\"dataTest ? `${dataTest}.dropArea` : undefined\"\n\t\t:tabIndex=\"localTabIndex\"\n\t\t@blur=\"onBlur\"\n\t\t@click.stop=\"onTriggerInput\"\n\t\t@dragleave.stop.prevent=\"onDragLeave\"\n\t\t@dragover.stop.prevent=\"onDragOver\"\n\t\t@drop.stop.prevent=\"onDrop\"\n\t\t@keydown.enter.stop.prevent=\"onTriggerInput\"\n\t\t@keydown.space.stop.prevent=\"onTriggerInput\"\n\t\t@mouseenter.stop.prevent=\"isHovering = true\"\n\t\t@mouseleave.stop.prevent=\"isHovering = false\"\n\t>\n\t\t<div class=\"kt-field-file-upload-drop-area__description\">\n\t\t\t<i v-if=\"icon\" class=\"yoco\" v-text=\"icon\" />\n\t\t\t<a v-text=\"translations.text.clickToUpload\" />\n\t\t\t{{ translations.text.dragAndDrop }}\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"showInformation\"\n\t\t\tclass=\"kt-field-file-upload-drop-area__information\"\n\t\t>\n\t\t\t{{ informationText }}\n\t\t\t<a\n\t\t\t\tv-if=\"externalUrl\"\n\t\t\t\tclass=\"kt-field-file-upload-drop-area__external-link\"\n\t\t\t\t:href=\"externalUrl\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t{{ translations.text.learnMore }}\n\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.LINK\" />\n\t\t\t</a>\n\t\t</div>\n\t\t<input\n\t\t\tv-show=\"false\"\n\t\t\tref=\"uploadInputRef\"\n\t\t\tv-bind=\"inputProps\"\n\t\t\t@cancel=\"onCancelSelect\"\n\t\t\t@change=\"onSelect\"\n\t\t/>\n\t\t<div\n\t\t\tv-if=\"$slots.footer\"\n\t\t\tclass=\"kt-field-file-upload-drop-area__footer-slot\"\n\t\t\t@keydown.enter.stop\n\t\t\t@keydown.space.stop\n\t\t\t@mouseenter.prevent.stop=\"isHovering = false\"\n\t\t\t@mouseleave.prevent.stop=\"isHovering = true\"\n\t\t>\n\t\t\t<slot name=\"footer\" />\n\t\t</div>\n\t\t<span\n\t\t\tv-if=\"!allowMultiple\"\n\t\t\tv-show=\"isError\"\n\t\t\tclass=\"kt-field-file-upload-drop-area__error\"\n\t\t\tv-text=\"translations.error.multipleNotAllowed\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { formatExtensions, formatFileSize } from '../formatters'\nimport { Shared } from '../types'\nimport { buildAcceptString } from '../utils'\nimport { isSelectingMultipleFilesWhenNotAllowed } from '../validators'\n\nexport default defineComponent({\n\tname: 'DropArea',\n\tprops: makeProps(Shared.DropArea.schema),\n\temits: ['addFiles', 'blur'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst isDragging = ref<boolean>(false)\n\t\tconst isError = ref<boolean>(false)\n\t\tconst isFileExplorerOpen = ref<boolean>(false)\n\t\tconst isHovering = ref<boolean>(false)\n\t\tconst uploadInputRef = ref<HTMLInputElement | null>(null)\n\n\t\tconst informationText = computed(() =>\n\t\t\t[\n\t\t\t\tformatExtensions(props.extensions, props.collapseExtensionsAfter),\n\t\t\t\tprops.maxFileSize !== Number.MAX_SAFE_INTEGER\n\t\t\t\t\t? `(${translations.value.text.max} ${formatFileSize(\n\t\t\t\t\t\t\tprops.maxFileSize,\n\t\t\t\t\t\t)})`\n\t\t\t\t\t: null,\n\t\t\t]\n\t\t\t\t.filter((str) => str)\n\t\t\t\t.join(' '),\n\t\t)\n\n\t\tconst emitFiles = (files: FileList | null) => {\n\t\t\tif (props.isDisabled || !files?.length) return\n\n\t\t\tif (\n\t\t\t\tisSelectingMultipleFilesWhenNotAllowed(\n\t\t\t\t\tprops.allowMultiple,\n\t\t\t\t\tfiles.length,\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn\n\n\t\t\tconst payload: Shared.Events.AddFiles = Array.from(files)\n\t\t\temit('addFiles', payload)\n\t\t\tisFileExplorerOpen.value = false\n\t\t}\n\n\t\treturn {\n\t\t\tinformationText,\n\t\t\tinputProps: computed(() => ({\n\t\t\t\taccept: buildAcceptString(props.extensions),\n\t\t\t\t'data-test': props.dataTest ? `${props.dataTest}.input` : undefined,\n\t\t\t\tdisabled: props.isDisabled || props.isLoading,\n\t\t\t\tid: props.inputId,\n\t\t\t\tmultiple: props.allowMultiple,\n\t\t\t\ttype: 'file',\n\t\t\t})),\n\t\t\tisError,\n\t\t\tisHovering,\n\t\t\tlocalTabIndex: computed(() =>\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\t\t\tprops.isDisabled ? -1 : (props.tabIndex ?? 0),\n\t\t\t),\n\t\t\tonBlur: () => {\n\t\t\t\tif (isFileExplorerOpen.value) return\n\t\t\t\temit('blur')\n\t\t\t},\n\t\t\tonCancelSelect: () => {\n\t\t\t\tisFileExplorerOpen.value = false\n\t\t\t},\n\t\t\tonDragLeave: () => {\n\t\t\t\tisDragging.value = false\n\t\t\t\tisError.value = false\n\t\t\t},\n\t\t\tonDragOver: (event: DragEvent) => {\n\t\t\t\tconst items = Array.from(event.dataTransfer?.items ?? [])\n\t\t\t\tisDragging.value = true\n\t\t\t\tisError.value = isSelectingMultipleFilesWhenNotAllowed(\n\t\t\t\t\tprops.allowMultiple,\n\t\t\t\t\titems.length,\n\t\t\t\t)\n\t\t\t},\n\t\t\tonDrop: (event: DragEvent) => {\n\t\t\t\tisDragging.value = false\n\t\t\t\tisError.value = false\n\t\t\t\temitFiles(event.dataTransfer?.files ?? null)\n\t\t\t},\n\t\t\tonSelect: (event: Event) => {\n\t\t\t\tconst target = event.target as HTMLInputElement\n\t\t\t\temitFiles(target.files)\n\t\t\t},\n\t\t\tonTriggerInput: () => {\n\t\t\t\tif (uploadInputRef.value === null)\n\t\t\t\t\tthrow new Error('uploadInputRef is null')\n\n\t\t\t\tisFileExplorerOpen.value = true\n\t\t\t\tuploadInputRef.value.click()\n\t\t\t},\n\t\t\trootClasses: computed(() => ({\n\t\t\t\t'kt-field-file-upload-drop-area': true,\n\t\t\t\t'kt-field-file-upload-drop-area--is-disabled': props.isDisabled,\n\t\t\t\t'kt-field-file-upload-drop-area--is-error':\n\t\t\t\t\t!props.isDisabled && isError.value,\n\t\t\t\t'kt-field-file-upload-drop-area--is-hover':\n\t\t\t\t\t!props.isDisabled &&\n\t\t\t\t\t!isError.value &&\n\t\t\t\t\t(isDragging.value || isHovering.value),\n\t\t\t})),\n\t\t\tshowInformation: computed(\n\t\t\t\t() => informationText.value || props.externalUrl,\n\t\t\t),\n\t\t\ttranslations,\n\t\t\tuploadInputRef,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-field/mixins.scss';\n\n.kt-field__wrapper {\n\t@include validations using ($type) {\n\t\t&:not(.kt-field__wrapper--disabled) {\n\t\t\t@if $type != empty {\n\t\t\t\t.kt-field-file-upload-drop-area {\n\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-field-file-upload-drop-area:focus {\n\t\t\t\t--support-empty-light: var(--interactive-05);\n\n\t\t\t\tpadding: calc(var(--unit-9) - 1px) calc(var(--unit-6) - 1px);\n\t\t\t\tborder: 2px dashed var(--support-#{$type}-light);\n\t\t\t}\n\n\t\t\t.kt-field-file-upload-drop-area:not(:focus-within):hover {\n\t\t\t\t--support-empty-bg: var(--interactive-02-hover);\n\t\t\t\t--support-empty-light: var(--interactive-04);\n\n\t\t\t\tbackground-color: var(--support-#{$type}-bg);\n\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.kt-field-file-upload-drop-area {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: var(--unit-9) var(--unit-6);\n\tcursor: pointer;\n\tbackground-color: var(--ui-01);\n\tborder: 1px dashed var(--ui-02);\n\tborder-radius: var(--unit-1);\n\n\t&--is-disabled {\n\t\tpointer-events: none;\n\t\tbackground-color: var(--ui-background);\n\n\t\t.kt-field-file-upload-drop-area__description a {\n\t\t\tcolor: var(--text-05);\n\t\t}\n\t}\n\n\t&--is-error {\n\t\tbackground-color: var(--support-error-bg);\n\t\tborder-color: var(--support-error-light);\n\t}\n\n\t&__description {\n\t\tfont-size: 16px;\n\t\tline-height: 20px;\n\t\tcolor: var(--text-02);\n\t\ttext-align: center;\n\n\t\ti {\n\t\t\tmargin-right: var(--unit-1);\n\t\t\tfont-size: var(--unit-6);\n\t\t\tcolor: var(--icon-02);\n\t\t\tvertical-align: bottom;\n\t\t}\n\n\t\ta {\n\t\t\tcolor: var(--interactive-01);\n\t\t}\n\t}\n\n\t&__error {\n\t\tposition: absolute;\n\t\tright: var(--unit-2);\n\t\tbottom: var(--unit-1);\n\t\tleft: var(--unit-2);\n\t\tfont-size: 12px;\n\t\tline-height: 20px;\n\t\tcolor: var(--support-error);\n\t\ttext-align: center;\n\t}\n\n\t&__external-link {\n\t\tcolor: var(--interactive-01);\n\t\tcursor: pointer;\n\t}\n\n\t&__footer-slot {\n\t\tmargin-top: var(--unit-4);\n\t}\n\n\t&__information {\n\t\tmargin-top: calc(var(--unit-1) + var(--unit-h));\n\t\tfont-size: 14px;\n\t\tline-height: 20px;\n\t\tcolor: var(--text-03);\n\t\ttext-align: center;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"classes\" @click=\"$emit('click')\">\n\t\t<i class=\"yoco\" v-text=\"icon\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { makeProps } from '../../make-props'\nimport { Shared } from '../types'\n\nexport default defineComponent({\n\tname: 'ActionButton',\n\tprops: makeProps(Shared.ActionButton.schema),\n\temits: ['click'],\n\tsetup(props) {\n\t\treturn {\n\t\t\tclasses: computed(() => ({\n\t\t\t\t'action-button': true,\n\t\t\t\t'action-button--is-disabled': props.isDisabled,\n\t\t\t})),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.action-button {\n\tdisplay: flex;\n\talign-items: center;\n\theight: var(--unit-8);\n\tpadding: 0 var(--unit-2);\n\tfont-size: 1rem;\n\tcolor: var(--interactive-01);\n\tcursor: pointer;\n\tborder-radius: var(--border-radius);\n\n\t&:not(&--is-disabled):hover {\n\t\tcolor: var(--interactive-01-hover);\n\t\tbackground-color: var(--interactive-02-hover);\n\t\tborder-color: var(--interactive-02-hover);\n\t}\n\n\t&--is-disabled {\n\t\tpointer-events: none;\n\t\topacity: 0.46;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"wrapperClasses\">\n\t\t<div class=\"kt-field-file-upload-item__wrapper\">\n\t\t\t<div>\n\t\t\t\t<div class=\"kt-field-file-upload-item__name\">\n\t\t\t\t\t<span v-text=\"name\" />\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"isInternal\"\n\t\t\t\t\t\tclass=\"kt-field-file-upload-item__is-internal-tag\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.PERMISSION_LOCKED\" />\n\t\t\t\t\t\t<span v-text=\"translations.label.internal\" />\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"kt-field-file-upload-item__description\">\n\t\t\t\t\t<slot name=\"description\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"kt-field-file-upload-item__actions\">\n\t\t\t\t<slot name=\"actions\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<slot name=\"footer\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\n\nexport default defineComponent({\n\tname: 'ItemLayout',\n\tprops: {\n\t\tisInternal: { default: false, type: Boolean },\n\t\tname: { required: true, type: String },\n\t},\n\tsetup(props) {\n\t\treturn {\n\t\t\ttranslations: useTranslationNamespace('KtFieldFileUpload'),\n\t\t\twrapperClasses: computed(() => ({\n\t\t\t\t'kt-field-file-upload-item': true,\n\t\t\t\t'kt-field-file-upload-item--is-internal': props.isInternal,\n\t\t\t})),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-field-file-upload-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: var(--unit-2);\n\tborder-bottom: 1px solid var(--ui-02);\n\n\t&__actions {\n\t\tdisplay: flex;\n\t\tflex: 0 0 auto;\n\t\talign-items: center;\n\t}\n\n\t&__description {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tfont-size: 14px;\n\t\tline-height: 20px;\n\t\tcolor: var(--text-03);\n\n\t\t.yoco {\n\t\t\tflex: 0 0 auto;\n\t\t\tmargin-right: var(--unit-1);\n\t\t\tfont-size: calc(var(--unit-4) + var(--unit-h));\n\t\t\tcolor: var(--support-error);\n\t\t}\n\t}\n\n\t&--is-internal {\n\t\tbackground-color: var(--ui-01);\n\t}\n\n\t&__is-internal-tag {\n\t\tdisplay: inline-flex;\n\t\talign-items: baseline;\n\t\tpadding: 0;\n\t\tmargin-left: 0;\n\t\tfont-size: calc(var(--unit-3) + var(--unit-h));\n\t\tcolor: var(--text-02);\n\n\t\t.yoco {\n\t\t\talign-self: center;\n\t\t\tmargin-right: var(--unit-1);\n\t\t\tfont-size: var(--unit-4);\n\t\t}\n\t}\n\n\t&__name {\n\t\tmargin-bottom: var(--unit-1);\n\t\tfont-size: 16px;\n\t\tline-height: 20px;\n\t\tcolor: var(--text-01);\n\t}\n\n\t&__wrapper {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-2);\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tword-break: break-word;\n\t}\n}\n</style>\n","<template>\n\t<ItemLayout :isInternal=\"fileInfo.isInternal\" :name=\"fileInfo.name\">\n\t\t<template #description>\n\t\t\t<i v-if=\"isError\" class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_ATTENTION\" />\n\t\t\t{{ description }}\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showViewOrDownloadAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.viewOrDownloadButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"viewOrDownloadActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickViewOrDownload\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest ? `${dataTest}.${fileInfo.id}.deleteButton` : undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"deleteActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickDelete\"\n\t\t\t/>\n\t\t</template>\n\t</ItemLayout>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { formatFileSize } from '../formatters'\nimport { KottiFieldFileUpload, Shared } from '../types'\n\nimport ActionButton from './ActionButton.vue'\nimport ItemLayout from './ItemLayout.vue'\n\nexport default defineComponent({\n\tname: 'FileItem',\n\tcomponents: {\n\t\tActionButton,\n\t\tItemLayout,\n\t},\n\tprops: makeProps(KottiFieldFileUpload.FileItem.schema),\n\temits: ['remove'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst status = computed(() => props.fileInfo.status)\n\t\tconst statusText = computed(() =>\n\t\t\tprops.fileInfo.validation === Shared.Validation.SUCCESS\n\t\t\t\t? translations.value.statusMsg[status.value]\n\t\t\t\t: translations.value.validationMsg[props.fileInfo.validation],\n\t\t)\n\n\t\treturn {\n\t\t\tdeleteActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\t[\n\t\t\t\t\tKottiFieldFileUpload.Status.READY_TO_UPLOAD,\n\t\t\t\t\tKottiFieldFileUpload.Status.UPLOADED,\n\t\t\t\t].includes(status.value as KottiFieldFileUpload.Status)\n\t\t\t\t\t? Yoco.Icon.TRASH\n\t\t\t\t\t: Yoco.Icon.CLOSE,\n\t\t\t),\n\t\t\tdescription: computed(() =>\n\t\t\t\t[formatFileSize(props.fileInfo.size), statusText.value].join(' - '),\n\t\t\t),\n\t\t\tisError: computed(\n\t\t\t\t() => status.value === KottiFieldFileUpload.Status.INVALID,\n\t\t\t),\n\t\t\tonClickDelete: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\tconst payload: Shared.Events.RemoveFile = props.fileInfo.id\n\t\t\t\temit('remove', payload)\n\t\t\t},\n\t\t\tonClickViewOrDownload: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\twindow.open(\n\t\t\t\t\tprops.fileInfo.viewUrl ?? props.fileInfo.downloadUrl,\n\t\t\t\t\t'_blank',\n\t\t\t\t)\n\t\t\t},\n\t\t\tshowViewOrDownloadAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tstatus.value === KottiFieldFileUpload.Status.UPLOADED &&\n\t\t\t\t\t(Boolean(props.fileInfo.viewUrl) ||\n\t\t\t\t\t\tBoolean(props.fileInfo.downloadUrl)),\n\t\t\t),\n\t\t\tviewOrDownloadActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tprops.fileInfo.viewUrl ? Yoco.Icon.EYE : Yoco.Icon.DOWNLOAD,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<ItemLayout\n\t\tclass=\"pre-uploaded-item\"\n\t\t:isInternal=\"fileInfo.isInternal\"\n\t\t:name=\"fileInfo.name\"\n\t>\n\t\t<template #description>\n\t\t\t<i v-if=\"isInvalid\" class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_ATTENTION\" />\n\t\t\t{{ description }}\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showViewOrDownloadAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.viewOrDownloadButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"viewOrDownloadActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickViewOrDownload\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest ? `${dataTest}.${fileInfo.id}.deleteButton` : undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"Yoco.Icon.TRASH\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickDelete\"\n\t\t\t/>\n\t\t</template>\n\t</ItemLayout>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { formatFileSize } from '../formatters'\nimport { KottiFieldFileUpload, Shared } from '../types'\n\nimport ActionButton from './ActionButton.vue'\nimport ItemLayout from './ItemLayout.vue'\n\nexport default defineComponent({\n\tname: 'PreUploadedFileItem',\n\tcomponents: {\n\t\tActionButton,\n\t\tItemLayout,\n\t},\n\tprops: makeProps(KottiFieldFileUpload.FileItem.schema),\n\temits: ['remove'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst errorMessage = computed(() =>\n\t\t\tprops.fileInfo.validation !== Shared.Validation.SUCCESS\n\t\t\t\t? translations.value.validationMsg[props.fileInfo.validation]\n\t\t\t\t: null,\n\t\t)\n\n\t\treturn {\n\t\t\tdescription: computed(() =>\n\t\t\t\t[formatFileSize(props.fileInfo.size), errorMessage.value]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(' - '),\n\t\t\t),\n\t\t\tisInvalid: computed(\n\t\t\t\t() => props.fileInfo.validation !== Shared.Validation.SUCCESS,\n\t\t\t),\n\t\t\tonClickDelete: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\tconst payload: Shared.Events.RemoveFile = props.fileInfo.id\n\t\t\t\temit('remove', payload)\n\t\t\t},\n\t\t\tonClickViewOrDownload: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\twindow.open(\n\t\t\t\t\tprops.fileInfo.viewUrl ?? props.fileInfo.downloadUrl,\n\t\t\t\t\t'_blank',\n\t\t\t\t)\n\t\t\t},\n\t\t\tshowViewOrDownloadAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tBoolean(props.fileInfo.viewUrl) ||\n\t\t\t\t\tBoolean(props.fileInfo.downloadUrl),\n\t\t\t),\n\t\t\tviewOrDownloadActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tprops.fileInfo.viewUrl ? Yoco.Icon.EYE : Yoco.Icon.DOWNLOAD,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.pre-uploaded-item {\n\tbackground-color: var(--ui-01);\n}\n</style>\n","<template>\n\t<div>\n\t\t<div ref=\"targetRef\" />\n\t\t<div ref=\"contentRef\" class=\"kt-modal__mask\" @click.self=\"closeModal\">\n\t\t\t<slot name=\"container\">\n\t\t\t\t<div :class=\"modalClass\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"hasSlot('header') || showCloseButton\"\n\t\t\t\t\t\tclass=\"kt-modal__header-wrapper\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div v-if=\"hasSlot('header')\" class=\"kt-modal__header\">\n\t\t\t\t\t\t\t<slot name=\"header\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<KtButton\n\t\t\t\t\t\t\tv-if=\"showCloseButton\"\n\t\t\t\t\t\t\tclass=\"kt-modal__close-button\"\n\t\t\t\t\t\t\t:icon=\"Yoco.Icon.CLOSE\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t@click=\"$emit('close')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"hasSlot('body')\" class=\"kt-modal__body\">\n\t\t\t\t\t\t<slot name=\"body\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"hasSlot('footer')\" class=\"kt-modal__footer\">\n\t\t\t\t\t\t<slot name=\"footer\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { Instance, Props as TippyProps } from 'tippy.js'\nimport { computed, defineComponent, ref, watch } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiModal } from './types'\n\nexport default defineComponent({\n\tname: 'KtModal',\n\tprops: makeProps(KottiModal.propsSchema),\n\temits: ['close'],\n\tsetup(props, { emit, slots }) {\n\t\tconst contentRef = ref<HTMLElement | null>(null)\n\t\tconst targetRef = ref<HTMLElement | null>(null)\n\t\tconst tippyInstanceRef = ref<Instance | null>(null)\n\n\t\tuseTippy(\n\t\t\ttargetRef,\n\t\t\tcomputed<Partial<TippyProps>>(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\thideOnClick: false,\n\t\t\t\tinteractive: true,\n\t\t\t\t/**\n\t\t\t\t * The `onCreate` function of `tippyjs` gets executed after the `KtModal`\n\t\t\t\t * component renders.\n\t\t\t\t *\n\t\t\t\t * `props.isOpen` therefore has an initial value, assigned in the watcher\n\t\t\t\t * that would not have an effect, unless we manually update it in `onCreate`\n\t\t\t\t *\n\t\t\t\t * It can alternatively be passed as a prop to tippy (`showOnCreate`)\n\t\t\t\t * @see {@link https://atomiks.github.io/tippyjs/v6/all-props/#showoncreate}\n\t\t\t\t */\n\t\t\t\toffset: [0, 0],\n\t\t\t\tonCreate(instance) {\n\t\t\t\t\ttippyInstanceRef.value = instance\n\n\t\t\t\t\tif (props.isOpen) tippyInstanceRef.value.show()\n\t\t\t\t},\n\t\t\t\tpopperOptions: {\n\t\t\t\t\tmodifiers: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'computeStyles',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tadaptive: false,\n\t\t\t\t\t\t\t\tgpuAcceleration: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\trender() {\n\t\t\t\t\tconst popper = document.createElement('div')\n\n\t\t\t\t\tif (contentRef.value === null)\n\t\t\t\t\t\tthrow new Error('KtModal: Unbound contentRef')\n\n\t\t\t\t\tpopper.append(contentRef.value)\n\n\t\t\t\t\treturn { popper }\n\t\t\t\t},\n\t\t\t\ttrigger: 'manual',\n\t\t\t})),\n\t\t)\n\n\t\t/**\n\t\t * 'slots' is non-reactive, so we need to use a function to check\n\t\t * if a slot exists instead of a computed value\n\t\t */\n\t\tconst hasSlot = (name: string): boolean => name in slots\n\n\t\twatch(\n\t\t\t() => props.isOpen,\n\t\t\t(shouldOpen, wasOpen) => {\n\t\t\t\t// component just mounted but tippy hasn't\n\t\t\t\tif (wasOpen === undefined && tippyInstanceRef.value === null) return\n\n\t\t\t\tif (tippyInstanceRef.value === null)\n\t\t\t\t\tthrow new Error('KtModal: Unbound tippyInstanceRef')\n\n\t\t\t\tif (shouldOpen) tippyInstanceRef.value.show()\n\t\t\t\telse tippyInstanceRef.value.unmount()\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tcloseModal: () => {\n\t\t\t\tif (!props.preventCloseOutside) emit('close')\n\t\t\t},\n\t\t\tcontentRef,\n\t\t\thasSlot,\n\t\t\tmodalClass: computed(() => [\n\t\t\t\t'kt-modal__container',\n\t\t\t\t`kt-modal--is-size-${props.size}`,\n\t\t\t]),\n\t\t\ttargetRef,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n.kt-modal {\n\t&__mask {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: $zindex-4;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: rgb(0 0 0 / 46%);\n\t\ttransition: opacity var(--transition-long) ease;\n\t}\n\n\t&__container {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0.8rem;\n\t\twidth: 90%;\n\t\tmax-height: 90%;\n\t\tpadding: var(--unit-4);\n\t\tbackground-color: #fff;\n\t\tborder-radius: var(--border-radius);\n\t\tbox-shadow: 0 2px 8px rgb(0 0 0 / 33%);\n\t\ttransition: all 0.3s ease;\n\t}\n\n\t&--is-size {\n\t\t&-sm {\n\t\t\tmax-width: 24rem;\n\t\t}\n\n\t\t&-md {\n\t\t\tmax-width: 36rem;\n\t\t}\n\n\t\t&-lg {\n\t\t\tmax-width: 48rem;\n\t\t}\n\n\t\t&-xl {\n\t\t\tmax-width: 64rem;\n\t\t}\n\t}\n\n\t&__close-button {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tpadding: 0;\n\t\tcolor: var(--icon-01);\n\n\t\t&:hover,\n\t\t&:focus-visible {\n\t\t\tbackground-color: var(--ui-01);\n\t\t\tborder-color: var(--ui-01);\n\t\t}\n\n\t\t:deep(.yoco) {\n\t\t\tfont-size: 21px;\n\t\t}\n\t}\n\n\t&__header-wrapper {\n\t\tdisplay: flex;\n\t\tflex: 1 1 auto;\n\t\tjustify-content: space-between;\n\n\t\t&:not(:has(.kt-modal__header)) {\n\t\t\tjustify-content: flex-end;\n\t\t}\n\t}\n\n\t&__header {\n\t\tflex: 1 1 auto;\n\t}\n\n\t&__body {\n\t\tflex: 1 1 auto;\n\t\toverflow: auto;\n\t}\n\n\t&__footer {\n\t\tflex: 0 0 auto;\n\t\ttext-align: right;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtModalVue from './KtModal.vue'\nimport { KottiModal } from './types'\n\nexport const KtModal = attachMeta(makeInstallable(KtModalVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=99%3A46',\n\t},\n\tslots: {\n\t\tbody: { description: null, scope: null },\n\t\tcontainer: {\n\t\t\tdescription: 'Allows overriding the entire inside of the modal',\n\t\t\tscope: null,\n\t\t},\n\t\tfooter: { description: null, scope: null },\n\t\theader: { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Modal',\n\t\tschema: KottiModal.propsSchema,\n\t},\n})\n","import dayjs from 'dayjs'\n\nimport { ISO8601_SECONDS } from '../../../../constants'\n\n/**\n * Creates a File from a Blob.\n * File name is set to current time in ISO8601 format with \".png\" file extension.\n * @param blob Blob object\n * @returns File object\n */\nconst blobToFile = (blob: Blob): File =>\n\tnew File([blob], `${dayjs().format(ISO8601_SECONDS)}.png`, {\n\t\tlastModified: Date.now(),\n\t\ttype: blob.type,\n\t})\n\n/**\n * Generates a PNG file and image url string from the current data in the canvas element\n * @param canvasEl HTML Canvas Element\n * @param context Canvas Rendering Context 2D\n * @param videoEl HTML Video Element\n * @returns File object and url string\n */\nexport const generateImageFileAndUrl = async (\n\tcanvasEl: HTMLCanvasElement,\n\tcontext: CanvasRenderingContext2D,\n\tvideoEl: HTMLVideoElement,\n): Promise<{\n\tfile: File\n\tphotoUrl: string\n}> => {\n\tconst { videoHeight, videoWidth } = videoEl\n\tcanvasEl.height = videoHeight\n\tcanvasEl.width = videoWidth\n\tcontext.drawImage(videoEl, 0, 0, videoWidth, videoHeight)\n\n\tconst blob = await new Promise<Blob | null>((resolve) => {\n\t\tcanvasEl.toBlob(resolve)\n\t})\n\n\tif (!blob) throw new Error('KtFieldFileUpload: error generating image blob')\n\n\tconst file = blobToFile(blob)\n\tconst photoUrl = canvasEl.toDataURL('image/png')\n\n\treturn {\n\t\tfile,\n\t\tphotoUrl,\n\t}\n}\n","/**\n * Checks whether WebRTC is supported\n * @returns true if supported, else false\n */\nexport const isWebRTCSupported = (): boolean =>\n\tBoolean(window.navigator.mediaDevices) &&\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tBoolean(window.navigator.mediaDevices.enumerateDevices) &&\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tBoolean(window.navigator.mediaDevices.getUserMedia)\n\n/**\n * Requests a list of the available cameras\n * @returns MediaDeviceInfo array describing the cameras\n */\nexport const getConnectedCameras = async (): Promise<MediaDeviceInfo[]> => {\n\tconst devices = await window.navigator.mediaDevices.enumerateDevices()\n\treturn devices.filter((device) => device.kind === 'videoinput')\n}\n\n/**\n * Requests a camera by its deviceId. It will prompt the user for permission to use the camera.\n * @param cameraId The camera ID\n * @returns MediaStream with the camera's video track\n */\nexport const requestCamera = async (cameraId: string): Promise<MediaStream> => {\n\tconst constraints: MediaStreamConstraints = {\n\t\taudio: false,\n\t\tvideo: {\n\t\t\tdeviceId: cameraId,\n\t\t\theight: { ideal: 8192 },\n\t\t\twidth: { ideal: 8192 },\n\t\t},\n\t}\n\treturn await window.navigator.mediaDevices.getUserMedia(constraints)\n}\n\n/**\n * Stops the camera's associated stream media video tracks\n * @param stream MediaStream with the camera's video track\n */\nexport const stopCameraStream = (stream: MediaStream | null): void => {\n\tstream?.getTracks().forEach((track) => {\n\t\ttrack.stop()\n\t})\n}\n","<template>\n\t<KtModal :isOpen=\"shouldOpenModal\" size=\"lg\">\n\t\t<template #header>\n\t\t\t<h2 v-text=\"translations.label.capture\" />\n\t\t</template>\n\t\t<template #body>\n\t\t\t<video v-show=\"isReady\" ref=\"videoRef\" autoplay muted playsinline />\n\t\t\t<div v-if=\"isLoading\" class=\"loading lg\" />\n\t\t</template>\n\t\t<template #footer>\n\t\t\t<KtButton\n\t\t\t\tv-if=\"hasMultipleCameras\"\n\t\t\t\tclass=\"mr-4\"\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.nextCamera` : undefined\"\n\t\t\t\t:disabled=\"!isReady\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t:label=\"translations.button.nextCamera\"\n\t\t\t\t@click=\"onClickNextCamera\"\n\t\t\t/>\n\t\t\t<KtButton\n\t\t\t\tclass=\"mr-4\"\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.capture` : undefined\"\n\t\t\t\t:disabled=\"!isReady\"\n\t\t\t\t:icon=\"Yoco.Icon.CAMERA\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t:label=\"translations.button.takePhoto\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t@click.stop=\"onClickCapture\"\n\t\t\t/>\n\t\t\t<KtButton\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.cancel` : undefined\"\n\t\t\t\t:label=\"translations.button.cancel\"\n\t\t\t\t@click.stop=\"$emit('close')\"\n\t\t\t/>\n\t\t</template>\n\t</KtModal>\n</template>\n\n<script lang=\"ts\">\nimport isError from 'lodash/isError.js'\nimport {\n\tcomputed,\n\tdefineComponent,\n\tonBeforeMount,\n\tonBeforeUnmount,\n\tref,\n} from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtButton } from '../../../kotti-button'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { KtModal } from '../../../kotti-modal'\nimport { makeProps } from '../../../make-props'\nimport { ErrorCodes } from '../../constants'\nimport { Shared } from '../../types'\n\nimport {\n\tgenerateImageFileAndUrl,\n\tgetConnectedCameras,\n\tisWebRTCSupported,\n\trequestCamera,\n\tstopCameraStream,\n} from './utils'\n\nenum State {\n\tCAPTURING = 'capturing',\n\tLOADING = 'loading',\n\tREADY = 'ready',\n\tSTOPPED = 'stopped',\n}\n\nexport default defineComponent({\n\tname: 'CapturePhoto',\n\tcomponents: {\n\t\tKtButton,\n\t\tKtModal,\n\t},\n\tprops: makeProps(Shared.TakePhoto.captureSchema),\n\temits: ['capture', 'close', 'error'],\n\tsetup(_, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst cameraIndex = ref<number>(0)\n\t\tconst cameraList = ref<MediaDeviceInfo[]>([])\n\t\tconst shouldOpenModal = ref<boolean>(false)\n\t\tconst state = ref<State>(State.STOPPED)\n\t\tconst stream = ref<MediaStream | null>(null)\n\t\tconst videoRef = ref<HTMLVideoElement | null>(null)\n\n\t\tconst findCameras = async () => {\n\t\t\tstate.value = State.LOADING\n\t\t\ttry {\n\t\t\t\tcameraList.value = await getConnectedCameras()\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error)\n\t\t\t\temit('error', isError(error) ? error.name : String(error))\n\t\t\t}\n\t\t}\n\t\tconst startCamera = async () => {\n\t\t\tstate.value = State.LOADING\n\t\t\ttry {\n\t\t\t\tif (!videoRef.value) {\n\t\t\t\t\tthrow new Error('KtFieldFileUpload: unbound HTML video element')\n\t\t\t\t}\n\t\t\t\tstream.value = await requestCamera(\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tcameraList.value[cameraIndex.value]!.deviceId,\n\t\t\t\t)\n\t\t\t\tvideoRef.value.srcObject = stream.value\n\t\t\t\tstate.value = State.READY\n\t\t\t} catch (error: unknown) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error(error)\n\t\t\t\temit('error', isError(error) ? error.name : String(error))\n\t\t\t}\n\t\t}\n\t\tconst stopCamera = () => {\n\t\t\tstate.value = State.STOPPED\n\t\t\tstopCameraStream(stream.value)\n\t\t\tstream.value = null\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\tonBeforeMount(async () => {\n\t\t\tif (isWebRTCSupported()) {\n\t\t\t\tawait findCameras()\n\t\t\t\tawait startCamera()\n\t\t\t\tshouldOpenModal.value = true\n\t\t\t} else emit('error', ErrorCodes.NOT_SUPPORTED_ERROR)\n\t\t})\n\n\t\tonBeforeUnmount(() => {\n\t\t\tstopCamera()\n\t\t})\n\n\t\treturn {\n\t\t\thasMultipleCameras: computed(() => cameraList.value.length > 1),\n\t\t\tisLoading: computed(() => state.value === State.LOADING),\n\t\t\tisReady: computed(() => state.value === State.READY),\n\t\t\tonClickCapture: async () => {\n\t\t\t\tstate.value = State.CAPTURING\n\t\t\t\ttry {\n\t\t\t\t\tconst canvas = document.createElement('canvas')\n\t\t\t\t\tconst context = canvas.getContext('2d')\n\n\t\t\t\t\tif (!context)\n\t\t\t\t\t\tthrow new Error('KtFieldFileUpload: 2d canvas context unavailable')\n\n\t\t\t\t\tif (!videoRef.value)\n\t\t\t\t\t\tthrow new Error('KtFieldFileUpload: unbound HTML video element')\n\n\t\t\t\t\tconst payload: Shared.TakePhoto.Events.Capture =\n\t\t\t\t\t\tawait generateImageFileAndUrl(canvas, context, videoRef.value)\n\n\t\t\t\t\temit('capture', payload)\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\temit('error', isError(error) ? error.name : String(error))\n\t\t\t\t}\n\t\t\t},\n\t\t\tonClickNextCamera: async () => {\n\t\t\t\tcameraIndex.value = (cameraIndex.value + 1) % cameraList.value.length\n\t\t\t\tstopCamera()\n\t\t\t\tawait startCamera()\n\t\t\t},\n\t\t\tshouldOpenModal,\n\t\t\ttranslations,\n\t\t\tvideoRef,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\nvideo {\n\twidth: 100%;\n}\n\n.loading {\n\tmargin-bottom: var(--unit-3);\n}\n</style>\n","<template>\n\t<KtModal isOpen size=\"lg\">\n\t\t<template #header>\n\t\t\t<h2 v-text=\"translations.label.error\" />\n\t\t</template>\n\t\t<template #body>\n\t\t\t<div v-if=\"error\" v-text=\"errorText\" />\n\t\t</template>\n\t\t<template #footer>\n\t\t\t<KtButton\n\t\t\t\tclass=\"mr-4\"\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.retakePhoto` : undefined\"\n\t\t\t\t:label=\"translations.button.retry\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t@click.stop=\"$emit('retry')\"\n\t\t\t/>\n\t\t\t<KtButton\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.closeError` : undefined\"\n\t\t\t\t:label=\"translations.button.cancel\"\n\t\t\t\t@click.stop=\"$emit('close')\"\n\t\t\t/>\n\t\t</template>\n\t</KtModal>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { KtButton } from '../../../kotti-button'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { KtModal } from '../../../kotti-modal'\nimport { makeProps } from '../../../make-props'\nimport { ErrorCodes } from '../../constants'\nimport { Shared } from '../../types'\n\nexport default defineComponent({\n\tname: 'ErrorViewer',\n\tcomponents: {\n\t\tKtButton,\n\t\tKtModal,\n\t},\n\tprops: makeProps(Shared.TakePhoto.errorSchema),\n\temits: ['close', 'retry'],\n\tsetup(props) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst errors = computed<Record<string, string>>(() => ({\n\t\t\tdefault: `${translations.value.label.unknown}: ${String(props.error)}`,\n\t\t\t[ErrorCodes.NOT_ALLOWED_ERROR]: translations.value.error.notAllowed,\n\t\t\t[ErrorCodes.NOT_FOUND_ERROR]: translations.value.error.notFound,\n\t\t\t[ErrorCodes.NOT_SUPPORTED_ERROR]: translations.value.error.notSupported,\n\t\t}))\n\n\t\treturn {\n\t\t\terrorText: computed(() =>\n\t\t\t\tprops.error && props.error in errors.value\n\t\t\t\t\t? errors.value[props.error]\n\t\t\t\t\t: errors.value.default,\n\t\t\t),\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<KtModal isOpen size=\"lg\">\n\t\t<template #header>\n\t\t\t<h2 v-text=\"translations.label.review\" />\n\t\t</template>\n\t\t<template #body>\n\t\t\t<img v-if=\"photoUrl\" :src=\"photoUrl\" />\n\t\t</template>\n\t\t<template #footer>\n\t\t\t<KtButton\n\t\t\t\tclass=\"mr-4\"\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.rejectPhoto` : undefined\"\n\t\t\t\t:icon=\"Yoco.Icon.CAMERA\"\n\t\t\t\t:label=\"translations.button.rejectPhoto\"\n\t\t\t\t@click.stop=\"$emit('reject')\"\n\t\t\t/>\n\t\t\t<KtButton\n\t\t\t\tclass=\"mr-4\"\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.acceptPhoto` : undefined\"\n\t\t\t\t:icon=\"Yoco.Icon.PICTURE\"\n\t\t\t\t:label=\"translations.button.acceptPhoto\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t@click.stop=\"$emit('accept')\"\n\t\t\t/>\n\t\t\t<KtButton\n\t\t\t\t:data-test=\"dataTest ? `${dataTest}.closeReview` : undefined\"\n\t\t\t\t:label=\"translations.button.cancel\"\n\t\t\t\t@click.stop=\"$emit('close')\"\n\t\t\t/>\n\t\t</template>\n\t</KtModal>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtButton } from '../../../kotti-button'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { KtModal } from '../../../kotti-modal'\nimport { makeProps } from '../../../make-props'\nimport { Shared } from '../../types'\n\nexport default defineComponent({\n\tname: 'ReviewPhoto',\n\tcomponents: {\n\t\tKtButton,\n\t\tKtModal,\n\t},\n\tprops: makeProps(Shared.TakePhoto.reviewSchema),\n\temits: ['accept', 'close', 'reject'],\n\tsetup() {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\treturn {\n\t\t\ttranslations,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\nimg {\n\twidth: 100%;\n}\n</style>\n","<template>\n\t<div>\n\t\t<KtButton\n\t\t\t:data-test=\"localDataTest\"\n\t\t\t:disabled=\"isDisabled\"\n\t\t\t:label=\"translations.button.takePhoto\"\n\t\t\t:tabindex=\"tabIndex\"\n\t\t\t@click.stop=\"state = State.CAPTURE\"\n\t\t/>\n\t\t<CapturePhoto\n\t\t\tv-if=\"state === State.CAPTURE\"\n\t\t\t:dataTest=\"localDataTest\"\n\t\t\t@capture=\"onCapturePhoto\"\n\t\t\t@close=\"onClose\"\n\t\t\t@error=\"onError\"\n\t\t/>\n\t\t<ReviewPhoto\n\t\t\tv-else-if=\"state === State.REVIEW\"\n\t\t\t:dataTest=\"localDataTest\"\n\t\t\t:photoUrl=\"photoUrl\"\n\t\t\t@accept=\"onAcceptPhoto\"\n\t\t\t@close=\"onClose\"\n\t\t\t@reject=\"onRejectPhoto\"\n\t\t/>\n\t\t<Error\n\t\t\tv-else-if=\"state === State.ERROR\"\n\t\t\t:dataTest=\"localDataTest\"\n\t\t\t:error=\"error\"\n\t\t\t@close=\"onClose\"\n\t\t\t@retry=\"onErrorRetry\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { KtButton } from '../../../kotti-button'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { makeProps } from '../../../make-props'\nimport { Shared } from '../../types'\n\nimport CapturePhoto from './Capture.vue'\nimport Error from './Error.vue'\nimport ReviewPhoto from './Review.vue'\n\nenum State {\n\tCAPTURE = 'capture',\n\tCLOSED = 'closed',\n\tERROR = 'error',\n\tREVIEW = 'review',\n}\n\nexport default defineComponent({\n\tname: 'TakePhoto',\n\tcomponents: {\n\t\tCapturePhoto,\n\t\tError,\n\t\tKtButton,\n\t\tReviewPhoto,\n\t},\n\tprops: makeProps(Shared.TakePhoto.schema),\n\temits: ['addFiles'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst error = ref<string | null>(null)\n\t\tconst file = ref<File | null>(null)\n\t\tconst photoUrl = ref<string | null>(null)\n\t\tconst state = ref<State>(State.CLOSED)\n\n\t\tconst reset = () => {\n\t\t\terror.value = null\n\t\t\tfile.value = null\n\t\t\tphotoUrl.value = null\n\t\t}\n\n\t\treturn {\n\t\t\terror,\n\t\t\tlocalDataTest: computed(() =>\n\t\t\t\tprops.dataTest ? `${props.dataTest}.takePhoto` : null,\n\t\t\t),\n\t\t\tonAcceptPhoto: () => {\n\t\t\t\tif (!file.value) return\n\t\t\t\tconst payload: Shared.Events.AddFiles = [file.value]\n\t\t\t\temit('addFiles', payload)\n\t\t\t\treset()\n\t\t\t\tstate.value = State.CLOSED\n\t\t\t},\n\t\t\tonCapturePhoto: (payload: Shared.TakePhoto.Events.Capture) => {\n\t\t\t\treset()\n\t\t\t\tfile.value = payload.file\n\t\t\t\tphotoUrl.value = payload.photoUrl\n\t\t\t\tstate.value = State.REVIEW\n\t\t\t},\n\t\t\tonClose: () => {\n\t\t\t\treset()\n\t\t\t\tstate.value = State.CLOSED\n\t\t\t},\n\t\t\tonError: (err: Shared.TakePhoto.Events.Error) => {\n\t\t\t\treset()\n\t\t\t\terror.value = err\n\t\t\t\tstate.value = State.ERROR\n\t\t\t},\n\t\t\tonErrorRetry: () => {\n\t\t\t\treset()\n\t\t\t\tstate.value = State.CAPTURE\n\t\t\t},\n\t\t\tonRejectPhoto: () => {\n\t\t\t\treset()\n\t\t\t\tstate.value = State.CAPTURE\n\t\t\t},\n\t\t\tphotoUrl,\n\t\t\tstate,\n\t\t\tState,\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n","import shortid from 'shortid'\n\nimport { KottiFieldFileUpload, Shared } from '../types'\nimport { validateFile } from '../validators'\n\n/**\n * Builds a File Item element for the field.value array.\n * Called when selecting a file via the input picker or drag & drop.\n * @param file The raw file\n * @returns The File Item\n */\nexport const buildFileItem = (\n\tfile: File,\n): KottiFieldFileUpload.ValueInternal[0] => ({\n\tfile,\n\tid: shortid(),\n\tstatus: KottiFieldFileUpload.Status.NOT_STARTED,\n})\n\n/**\n * Builds a File Info object\n * @param param0.extensions The allowed file extensions\n * @param param0.fileItem The file item element from the field.value array\n * @param param0.isPreUploaded Whether the file is pre-uploaded or not\n * @param param0.maxFileSize The maximum file size allowed\n * @returns The File Info object\n */\nexport const buildFileInfo = ({\n\textensions,\n\tfileItem,\n\tisPreUploaded = false,\n\tmaxFileSize,\n}: {\n\textensions: KottiFieldFileUpload.PropsInternal['extensions']\n\tfileItem: KottiFieldFileUpload.ValueInternal[0]\n\tisPreUploaded?: boolean\n\tmaxFileSize: KottiFieldFileUpload.PropsInternal['maxFileSize']\n}): KottiFieldFileUpload.FileInfo => {\n\tconst fileName = 'file' in fileItem ? fileItem.file.name : fileItem.name\n\tconst fileSize = 'file' in fileItem ? fileItem.file.size : fileItem.size\n\tconst validation = validateFile({\n\t\textensions,\n\t\tfileName,\n\t\tfileSize,\n\t\tmaxFileSize,\n\t})\n\n\tconst status: KottiFieldFileUpload.Status = (() => {\n\t\tif (isPreUploaded)\n\t\t\treturn validation === Shared.Validation.SUCCESS\n\t\t\t\t? KottiFieldFileUpload.Status.UPLOADED\n\t\t\t\t: KottiFieldFileUpload.Status.UPLOADED_WITH_ERROR\n\n\t\treturn validation === Shared.Validation.SUCCESS\n\t\t\t? KottiFieldFileUpload.Status.READY_TO_UPLOAD\n\t\t\t: KottiFieldFileUpload.Status.INVALID\n\t})()\n\n\treturn {\n\t\tdownloadUrl: 'downloadUrl' in fileItem ? fileItem.downloadUrl : undefined,\n\t\tid: fileItem.id,\n\t\tisInternal: 'isInternal' in fileItem ? fileItem.isInternal : undefined,\n\t\tname: fileName,\n\t\tsize: fileSize,\n\t\tstatus,\n\t\tvalidation,\n\t\tviewUrl: 'viewUrl' in fileItem ? fileItem.viewUrl : undefined,\n\t}\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tdebounceLabelClick\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<template #container>\n\t\t\t<div class=\"kt-field-file-upload\">\n\t\t\t\t<DropArea\n\t\t\t\t\tv-if=\"showDropArea\"\n\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\tallowMultiple,\n\t\t\t\t\t\tcollapseExtensionsAfter,\n\t\t\t\t\t\texternalUrl,\n\t\t\t\t\t\ticon,\n\t\t\t\t\t\tinputId,\n\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t}\"\n\t\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t>\n\t\t\t\t\t<template #footer>\n\t\t\t\t\t\t<TakePhoto\n\t\t\t\t\t\t\tv-if=\"allowPhotos\"\n\t\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</DropArea>\n\t\t\t\t<div v-if=\"filesList.length > 0\" :style=\"filesListStyle\">\n\t\t\t\t\t<FileItem\n\t\t\t\t\t\tv-for=\"fileInfo in filesList\"\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t\t@remove=\"onRemoveFile\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"preUploadedFilesList.length > 0\"\n\t\t\t\t\t:style=\"preUploadedFilesListStyle\"\n\t\t\t\t>\n\t\t\t\t\t<PreUploadedFileItem\n\t\t\t\t\t\tv-for=\"fileInfo in preUploadedFilesList\"\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t\t@remove=\"onRemoveFile\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onBeforeMount } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport DropArea from './components/DropArea.vue'\nimport FileItem from './components/FileItem.vue'\nimport PreUploadedFileItem from './components/PreUploadedFileItem.vue'\nimport TakePhoto from './components/TakePhoto/TakePhoto.vue'\nimport { KOTTI_FIELD_FILE_UPLOAD_SUPPORTS } from './constants'\nimport type { Shared } from './types'\nimport { KottiFieldFileUpload } from './types'\nimport { buildFileInfo, buildFileItem } from './utils/non-remote'\nimport { isValidValue } from './validators'\n\nexport default defineComponent({\n\tname: 'KtFieldFileUpload',\n\tcomponents: {\n\t\tDropArea,\n\t\tFileItem,\n\t\tKtField,\n\t\tPreUploadedFileItem,\n\t\tTakePhoto,\n\t},\n\tprops: makeProps(KottiFieldFileUpload.propsSchema),\n\temits: ['blur', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldFileUpload.ValueInternal>({\n\t\t\temit,\n\t\t\t/**\n\t\t\t * We consider this field empty if:\n\t\t\t * a. No files are selected, or\n\t\t\t * b. Value is invalid\n\t\t\t */\n\t\t\tisEmpty: (value) =>\n\t\t\t\tvalue.length === 0 || !isValidValue(value, 'NonRemote'),\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_FILE_UPLOAD_SUPPORTS,\n\t\t})\n\n\t\tconst preUploadedFilesIds = new Set<KottiFieldFileUpload.FileInfo['id']>()\n\n\t\tconst setStatus = (payload: KottiFieldFileUpload.Events.SetStatus) => {\n\t\t\tfield.setValue(\n\t\t\t\tfield.currentValue.map((fileItem) =>\n\t\t\t\t\tfileItem.id === payload.id\n\t\t\t\t\t\t? { ...fileItem, status: payload.status }\n\t\t\t\t\t\t: fileItem,\n\t\t\t\t),\n\t\t\t\t{ forceUpdate: true },\n\t\t\t)\n\t\t}\n\n\t\tconst filesList = computed<KottiFieldFileUpload.FileInfo[]>(() =>\n\t\t\tfield.currentValue\n\t\t\t\t.filter((fileItem) => !preUploadedFilesIds.has(fileItem.id))\n\t\t\t\t.map((fileItem) => {\n\t\t\t\t\tconst fileInfo = buildFileInfo({\n\t\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\t\tfileItem,\n\t\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (fileItem.status !== fileInfo.status)\n\t\t\t\t\t\tsetStatus({ id: fileItem.id, status: fileInfo.status })\n\n\t\t\t\t\treturn fileInfo\n\t\t\t\t}),\n\t\t)\n\t\tconst showDropArea = computed(\n\t\t\t() =>\n\t\t\t\t(props.allowMultiple || field.currentValue.length === 0) &&\n\t\t\t\t!props.hideDropArea,\n\t\t)\n\n\t\tonBeforeMount(() => {\n\t\t\tfield.currentValue.forEach((fileItem) => {\n\t\t\t\tif (\n\t\t\t\t\t[\n\t\t\t\t\t\tKottiFieldFileUpload.Status.UPLOADED,\n\t\t\t\t\t\tKottiFieldFileUpload.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t].includes(fileItem.status as KottiFieldFileUpload.Status | undefined)\n\t\t\t\t)\n\t\t\t\t\tpreUploadedFilesIds.add(fileItem.id)\n\t\t\t})\n\t\t})\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tfilesList,\n\t\t\tfilesListStyle: computed(() =>\n\t\t\t\tshowDropArea.value ? { 'padding-top': 'var(--unit-4)' } : undefined,\n\t\t\t),\n\t\t\tinputId: computed(() => field.inputProps.id),\n\t\t\tonAddFiles: (value: Shared.Events.AddFiles) => {\n\t\t\t\tif (props.allowMultiple)\n\t\t\t\t\tfield.setValue([\n\t\t\t\t\t\t...field.currentValue,\n\t\t\t\t\t\t...value.map((file) => buildFileItem(file)),\n\t\t\t\t\t])\n\t\t\t\telse field.setValue([buildFileItem(value[0] as File)])\n\t\t\t},\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonRemoveFile: (id: Shared.Events.RemoveFile) => {\n\t\t\t\tfield.setValue(\n\t\t\t\t\tfield.currentValue.filter((fileItem) => fileItem.id !== id),\n\t\t\t\t)\n\t\t\t},\n\t\t\tpreUploadedFilesList: computed<KottiFieldFileUpload.FileInfo[]>(() =>\n\t\t\t\tfield.currentValue\n\t\t\t\t\t.filter((fileItem) => preUploadedFilesIds.has(fileItem.id))\n\t\t\t\t\t.map((fileItem) => {\n\t\t\t\t\t\tconst fileInfo = buildFileInfo({\n\t\t\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\t\t\tfileItem,\n\t\t\t\t\t\t\tisPreUploaded: true,\n\t\t\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (fileItem.status !== fileInfo.status)\n\t\t\t\t\t\t\tsetStatus({ id: fileItem.id, status: fileInfo.status })\n\n\t\t\t\t\t\treturn fileInfo\n\t\t\t\t\t}),\n\t\t\t),\n\t\t\tpreUploadedFilesListStyle: computed(() =>\n\t\t\t\tshowDropArea.value\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t'padding-top': `var(${\n\t\t\t\t\t\t\t\tfilesList.value.length > 0 ? '--unit-8' : '--unit-4'\n\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t\tsharedProps: computed(() => ({\n\t\t\t\tdataTest: field.inputProps['data-test'],\n\t\t\t\textensions: props.extensions,\n\t\t\t\tisDisabled: field.isDisabled,\n\t\t\t\tisLoading: field.isLoading,\n\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t})),\n\t\t\tshowDropArea,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import './styles.scss';\n</style>\n","<template>\n\t<div class=\"progress-bar\">\n\t\t<div class=\"progress-bar__background\">\n\t\t\t<div :class=\"fillClasses\" :style=\"{ width: progressCssWidth }\" />\n\t\t</div>\n\t\t<div class=\"progress-bar__label-wrapper\">\n\t\t\t<!-- HACK: this invisible span calculates the width for \"99%\" -->\n\t\t\t<span\n\t\t\t\tclass=\"progress-bar__label\"\n\t\t\t\tstyle=\"user-select: none; opacity: 0\"\n\t\t\t\tv-text=\"'99%'\"\n\t\t\t/>\n\t\t\t<span class=\"progress-bar__label\" v-text=\"progressPercent\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { ONE_HUNDRED_PERCENT } from '../../constants'\nimport { makeProps } from '../../make-props'\nimport { KottiFieldFileUploadRemote } from '../types'\n\nexport default defineComponent({\n\tname: 'ProgressBar',\n\tprops: makeProps(KottiFieldFileUploadRemote.ProgressBar.schema),\n\tsetup(props) {\n\t\treturn {\n\t\t\tfillClasses: computed(() => ({\n\t\t\t\t'progress-bar__fill': true,\n\t\t\t\t'progress-bar__fill--is-error': props.isError,\n\t\t\t})),\n\t\t\tprogressCssWidth: computed(\n\t\t\t\t() => `${String(props.progress * ONE_HUNDRED_PERCENT)}%`,\n\t\t\t),\n\t\t\tprogressPercent: computed(\n\t\t\t\t() => `${String(Math.floor(props.progress * ONE_HUNDRED_PERCENT))}%`,\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.progress-bar {\n\tdisplay: flex;\n\tgap: var(--unit-2);\n\talign-items: center;\n\theight: var(--unit-5);\n\n\t&__background {\n\t\twidth: 100%;\n\t\theight: var(--unit-2);\n\t\tbackground-color: var(--ui-02);\n\t\tborder-radius: var(--unit-1);\n\t}\n\n\t&__fill {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tbackground-color: var(--interactive-03);\n\t\tborder-radius: var(--unit-1);\n\t\ttransition: width 50ms ease-in-out;\n\n\t\t&--is-error {\n\t\t\tbackground-color: var(--support-error);\n\t\t}\n\t}\n\n\t&__label-wrapper {\n\t\tdisplay: grid;\n\t}\n\n\t&__label {\n\t\tgrid-row: 1;\n\t\tgrid-column: 1;\n\t\tfont-size: 16px;\n\t\tfont-variant-numeric: tabular-nums;\n\t\tline-height: 20px;\n\t\tcolor: var(--text-01);\n\t\ttext-align: end;\n\t}\n}\n</style>\n","<template>\n\t<ItemLayout :isInternal=\"fileInfo.isInternal\" :name=\"fileInfo.name\">\n\t\t<template #description>\n\t\t\t<i v-if=\"isError\" class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_ATTENTION\" />\n\t\t\t{{ description }}\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showViewOrDownloadAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.viewOrDownloadButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"viewOrDownloadActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickViewOrDownload\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showRetryAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest ? `${dataTest}.${fileInfo.id}.retryButton` : undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"Yoco.Icon.RELOAD\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickRetry\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.cancelOrDeleteButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"cancelOrDeleteActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickCancelOrDelete\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #footer>\n\t\t\t<ProgressBar\n\t\t\t\tv-if=\"showProgressBar\"\n\t\t\t\t:key=\"progressBarForceRenderKey\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:progress=\"progress\"\n\t\t\t/>\n\t\t</template>\n\t</ItemLayout>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, watch } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { formatFileSize } from '../formatters'\nimport { KottiFieldFileUploadRemote, Shared } from '../types'\n\nimport ActionButton from './ActionButton.vue'\nimport ItemLayout from './ItemLayout.vue'\nimport ProgressBar from './ProgressBar.vue'\n\nexport default defineComponent({\n\tname: 'FileItemRemote',\n\tcomponents: {\n\t\tActionButton,\n\t\tItemLayout,\n\t\tProgressBar,\n\t},\n\tprops: makeProps(KottiFieldFileUploadRemote.FileItem.schema),\n\tsetup(props) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst progressBarForceRenderKey = ref<number>(0)\n\t\tconst shouldTriggerRemoteUpload = ref<boolean>(true)\n\n\t\tconst status = computed(() => props.fileInfo.status)\n\t\tconst statusText = computed(() =>\n\t\t\tprops.fileInfo.validation === Shared.Validation.SUCCESS\n\t\t\t\t? translations.value.statusMsg[status.value]\n\t\t\t\t: translations.value.validationMsg[props.fileInfo.validation],\n\t\t)\n\n\t\twatch(\n\t\t\tstatus,\n\t\t\t(newStatus) => {\n\t\t\t\tif (\n\t\t\t\t\tnewStatus === KottiFieldFileUploadRemote.Status.UPLOADING &&\n\t\t\t\t\tshouldTriggerRemoteUpload.value\n\t\t\t\t) {\n\t\t\t\t\tprops.actions.onUpload(props.fileInfo.id)\n\t\t\t\t\tshouldTriggerRemoteUpload.value = false\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tcancelOrDeleteActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tstatus.value === KottiFieldFileUploadRemote.Status.UPLOADED\n\t\t\t\t\t? Yoco.Icon.TRASH\n\t\t\t\t\t: Yoco.Icon.CLOSE,\n\t\t\t),\n\t\t\tdescription: computed(() =>\n\t\t\t\t[formatFileSize(props.fileInfo.size), statusText.value].join(' - '),\n\t\t\t),\n\t\t\tisError: computed(() =>\n\t\t\t\t[\n\t\t\t\t\tKottiFieldFileUploadRemote.Status.ERROR,\n\t\t\t\t\tKottiFieldFileUploadRemote.Status.INVALID,\n\t\t\t\t\tKottiFieldFileUploadRemote.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t].includes(status.value as KottiFieldFileUploadRemote.Status),\n\t\t\t),\n\t\t\tonClickCancelOrDelete: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\tif (status.value === KottiFieldFileUploadRemote.Status.UPLOADING) {\n\t\t\t\t\tprops.actions.onCancel(props.fileInfo.id)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tprops.actions.onDelete(props.fileInfo.id)\n\t\t\t},\n\t\t\tonClickRetry: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\t// Force re-render Progress Bar to get rid of previous progress value\n\t\t\t\tprogressBarForceRenderKey.value++\n\t\t\t\tprops.actions.onRetry(props.fileInfo.id)\n\t\t\t},\n\t\t\tonClickViewOrDownload: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\twindow.open(\n\t\t\t\t\tprops.fileInfo.viewUrl ?? props.fileInfo.downloadUrl,\n\t\t\t\t\t'_blank',\n\t\t\t\t)\n\t\t\t},\n\t\t\tprogress: computed(() => props.fileInfo.progress ?? 0),\n\t\t\tprogressBarForceRenderKey,\n\t\t\tshowProgressBar: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.fileInfo.validation === Shared.Validation.SUCCESS &&\n\t\t\t\t\t(status.value === KottiFieldFileUploadRemote.Status.ERROR ||\n\t\t\t\t\t\tstatus.value === KottiFieldFileUploadRemote.Status.UPLOADING),\n\t\t\t),\n\t\t\tshowRetryAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.fileInfo.validation === Shared.Validation.SUCCESS &&\n\t\t\t\t\t(status.value === KottiFieldFileUploadRemote.Status.CANCELED ||\n\t\t\t\t\t\tstatus.value === KottiFieldFileUploadRemote.Status.ERROR),\n\t\t\t),\n\t\t\tshowViewOrDownloadAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tstatus.value === KottiFieldFileUploadRemote.Status.UPLOADED &&\n\t\t\t\t\t(Boolean(props.fileInfo.viewUrl) ||\n\t\t\t\t\t\tBoolean(props.fileInfo.downloadUrl)),\n\t\t\t),\n\t\t\tviewOrDownloadActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tprops.fileInfo.viewUrl ? Yoco.Icon.EYE : Yoco.Icon.DOWNLOAD,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n","import shortid from 'shortid'\n\nimport { KottiFieldFileUploadRemote, Shared } from '../types'\nimport { validateFile } from '../validators'\n\n/**\n * Builds a File Item element for the field.value array.\n * Called when selecting a file via the input picker or drag & drop.\n * @param file The raw file\n * @returns The File Item\n */\nexport const buildFileItem = (\n\tfile: File,\n): KottiFieldFileUploadRemote.ValueInternal[0] => ({\n\tfile,\n\tid: shortid(),\n\tstatus: KottiFieldFileUploadRemote.Status.NOT_STARTED,\n})\n\n/**\n * Builds a File Info object\n * @param param0.extensions The allowed file extensions\n * @param param0.fileItem The file item element from the field.value array\n * @param param0.isUploaded Whether the file has been uploaded successfully\n * @param param0.maxFileSize The maximum file size allowed\n * @param param0.progress The upload progress (0 to 1)\n * @returns The File Info object\n */\nexport const buildFileInfo = ({\n\textensions,\n\tfileItem,\n\tisUploaded,\n\tmaxFileSize,\n\tprogress,\n}: {\n\textensions: KottiFieldFileUploadRemote.PropsInternal['extensions']\n\tfileItem: KottiFieldFileUploadRemote.ValueInternal[0]\n\tisUploaded: boolean\n\tmaxFileSize: KottiFieldFileUploadRemote.PropsInternal['maxFileSize']\n\tprogress: KottiFieldFileUploadRemote.Payload[0]['progress']\n}): KottiFieldFileUploadRemote.FileInfo => {\n\tconst fileName = 'file' in fileItem ? fileItem.file.name : fileItem.name\n\tconst fileSize = 'file' in fileItem ? fileItem.file.size : fileItem.size\n\tconst validation = validateFile({\n\t\textensions,\n\t\tfileName,\n\t\tfileSize,\n\t\tmaxFileSize,\n\t})\n\n\tconst status: KottiFieldFileUploadRemote.Status = (() => {\n\t\tif (isUploaded)\n\t\t\treturn validation === Shared.Validation.SUCCESS\n\t\t\t\t? KottiFieldFileUploadRemote.Status.UPLOADED\n\t\t\t\t: KottiFieldFileUploadRemote.Status.UPLOADED_WITH_ERROR\n\n\t\t/**\n\t\t * If the File Item is already UPLOADED and there is\n\t\t * no validation errors, keep the UPLOADED status.\n\t\t */\n\t\tif (\n\t\t\tfileItem.status === KottiFieldFileUploadRemote.Status.UPLOADED &&\n\t\t\tvalidation === Shared.Validation.SUCCESS\n\t\t)\n\t\t\treturn KottiFieldFileUploadRemote.Status.UPLOADED\n\n\t\treturn validation === Shared.Validation.SUCCESS\n\t\t\t? KottiFieldFileUploadRemote.Status.UPLOADING\n\t\t\t: KottiFieldFileUploadRemote.Status.INVALID\n\t})()\n\n\treturn {\n\t\tdownloadUrl: 'downloadUrl' in fileItem ? fileItem.downloadUrl : undefined,\n\t\tid: fileItem.id,\n\t\tisInternal: 'isInternal' in fileItem ? fileItem.isInternal : undefined,\n\t\tname: fileName,\n\t\tprogress,\n\t\tsize: fileSize,\n\t\tstatus:\n\t\t\tfileItem.status === KottiFieldFileUploadRemote.Status.CANCELED ||\n\t\t\tfileItem.status === KottiFieldFileUploadRemote.Status.ERROR\n\t\t\t\t? fileItem.status\n\t\t\t\t: status,\n\t\tvalidation,\n\t\tviewUrl: 'viewUrl' in fileItem ? fileItem.viewUrl : undefined,\n\t}\n}\n\n/**\n * Builds a PreUploaded File Info object\n * @param param0.extensions The allowed file extensions\n * @param param0.fileItem The file item element from the field.value array\n * @param param0.maxFileSize The maximum file size allowed\n * @returns The File Info object\n */\nexport const buildPreUploadedFileInfo = ({\n\textensions,\n\tfileItem,\n\tmaxFileSize,\n}: {\n\textensions: KottiFieldFileUploadRemote.PropsInternal['extensions']\n\tfileItem: KottiFieldFileUploadRemote.ValueInternal[0]\n\tmaxFileSize: KottiFieldFileUploadRemote.PropsInternal['maxFileSize']\n}): KottiFieldFileUploadRemote.FileInfo => {\n\tconst fileName = 'file' in fileItem ? fileItem.file.name : fileItem.name\n\tconst fileSize = 'file' in fileItem ? fileItem.file.size : fileItem.size\n\tconst validation = validateFile({\n\t\textensions,\n\t\tfileName,\n\t\tfileSize,\n\t\tmaxFileSize,\n\t})\n\n\treturn {\n\t\tdownloadUrl: 'downloadUrl' in fileItem ? fileItem.downloadUrl : undefined,\n\t\tid: fileItem.id,\n\t\tisInternal: 'isInternal' in fileItem ? fileItem.isInternal : undefined,\n\t\tname: fileName,\n\t\tsize: fileSize,\n\t\tstatus:\n\t\t\tvalidation === Shared.Validation.SUCCESS\n\t\t\t\t? KottiFieldFileUploadRemote.Status.UPLOADED\n\t\t\t\t: KottiFieldFileUploadRemote.Status.UPLOADED_WITH_ERROR,\n\t\tvalidation,\n\t\tviewUrl: 'viewUrl' in fileItem ? fileItem.viewUrl : undefined,\n\t}\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tdebounceLabelClick\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<template #container>\n\t\t\t<div class=\"kt-field-file-upload\">\n\t\t\t\t<DropArea\n\t\t\t\t\tv-if=\"showDropArea\"\n\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\tallowMultiple,\n\t\t\t\t\t\tcollapseExtensionsAfter,\n\t\t\t\t\t\texternalUrl,\n\t\t\t\t\t\ticon,\n\t\t\t\t\t\tinputId,\n\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t}\"\n\t\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t\t>\n\t\t\t\t\t<template #footer>\n\t\t\t\t\t\t<TakePhoto\n\t\t\t\t\t\t\tv-if=\"allowPhotos\"\n\t\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</DropArea>\n\t\t\t\t<div v-if=\"filesList.length > 0\" :style=\"filesListStyle\">\n\t\t\t\t\t<FileItemRemote\n\t\t\t\t\t\tv-for=\"fileInfo in filesList\"\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\tactions,\n\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"preUploadedFilesList.length > 0\"\n\t\t\t\t\t:style=\"preUploadedFilesListStyle\"\n\t\t\t\t>\n\t\t\t\t\t<PreUploadedFileItem\n\t\t\t\t\t\tv-for=\"fileInfo in preUploadedFilesList\"\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t\t@remove=\"onRemoveFile\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onBeforeMount, watch } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport { useField } from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport DropArea from './components/DropArea.vue'\nimport FileItemRemote from './components/FileItemRemote.vue'\nimport PreUploadedFileItem from './components/PreUploadedFileItem.vue'\nimport TakePhoto from './components/TakePhoto/TakePhoto.vue'\nimport { KOTTI_FIELD_FILE_UPLOAD_SUPPORTS } from './constants'\nimport type { KottiFieldFileUpload, Shared } from './types'\nimport { KottiFieldFileUploadRemote } from './types'\nimport {\n\tbuildFileInfo,\n\tbuildFileItem,\n\tbuildPreUploadedFileInfo,\n} from './utils/remote'\nimport { isValidValue } from './validators'\n\nexport default defineComponent({\n\tname: 'KtFieldFileUploadRemote',\n\tcomponents: {\n\t\tDropArea,\n\t\tFileItemRemote,\n\t\tKtField,\n\t\tPreUploadedFileItem,\n\t\tTakePhoto,\n\t},\n\tprops: makeProps(KottiFieldFileUploadRemote.propsSchema),\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldFileUploadRemote.ValueInternal>({\n\t\t\temit,\n\t\t\t/**\n\t\t\t * We consider this field empty if:\n\t\t\t * a. No files are selected, or\n\t\t\t * b. Value is invalid\n\t\t\t */\n\t\t\tisEmpty: (value) => value.length === 0 || !isValidValue(value, 'Remote'),\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_FILE_UPLOAD_SUPPORTS,\n\t\t})\n\n\t\tconst newUploadedFiles = new Set<\n\t\t\tKottiFieldFileUploadRemote.FileInfo['id']\n\t\t>()\n\t\tconst preUploadedFiles = new Set<\n\t\t\tKottiFieldFileUploadRemote.FileInfo['id']\n\t\t>()\n\n\t\tconst setStatus = (\n\t\t\tpayload: KottiFieldFileUploadRemote.Events.SetStatus,\n\t\t) => {\n\t\t\tfield.setValue(\n\t\t\t\tfield.currentValue.map((fileItem) =>\n\t\t\t\t\tfileItem.id === payload.id\n\t\t\t\t\t\t? { ...fileItem, status: payload.status }\n\t\t\t\t\t\t: fileItem,\n\t\t\t\t),\n\t\t\t\t{ forceUpdate: true },\n\t\t\t)\n\n\t\t\tif (payload.status === KottiFieldFileUploadRemote.Status.UPLOADED)\n\t\t\t\tnewUploadedFiles.add(payload.id)\n\t\t}\n\n\t\tconst filesList = computed<KottiFieldFileUploadRemote.FileInfo[]>(() =>\n\t\t\tfield.currentValue\n\t\t\t\t.filter((fileItem) => !preUploadedFiles.has(fileItem.id))\n\t\t\t\t.filter(\n\t\t\t\t\t(fileItem) =>\n\t\t\t\t\t\tfileItem.status !== KottiFieldFileUploadRemote.Status.HIDDEN,\n\t\t\t\t)\n\t\t\t\t.map((fileItem) => {\n\t\t\t\t\tconst fileInfo = buildFileInfo({\n\t\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\t\tfileItem,\n\t\t\t\t\t\tisUploaded: newUploadedFiles.has(fileItem.id),\n\t\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t\t\tprogress: props.payload[fileItem.id]?.progress ?? 0,\n\t\t\t\t\t})\n\n\t\t\t\t\tif (fileItem.status !== fileInfo.status)\n\t\t\t\t\t\tsetStatus({ id: fileItem.id, status: fileInfo.status })\n\n\t\t\t\t\treturn fileInfo\n\t\t\t\t}),\n\t\t)\n\n\t\tconst showDropArea = computed(\n\t\t\t() =>\n\t\t\t\t(props.allowMultiple || field.currentValue.length === 0) &&\n\t\t\t\t!props.hideDropArea,\n\t\t)\n\n\t\tconst setStatuses = (\n\t\t\tpayload: Map<\n\t\t\t\tKottiFieldFileUploadRemote.ValueInternal[number]['id'],\n\t\t\t\tKottiFieldFileUploadRemote.Status\n\t\t\t>,\n\t\t) => {\n\t\t\tfield.setValue(\n\t\t\t\tfield.currentValue.map((fileItem) => {\n\t\t\t\t\tconst status = payload.get(fileItem.id)\n\t\t\t\t\treturn status ? { ...fileItem, status } : fileItem\n\t\t\t\t}),\n\t\t\t\t{ forceUpdate: true },\n\t\t\t)\n\n\t\t\tObject.entries(payload).forEach(([id, status]) => {\n\t\t\t\tif (status === KottiFieldFileUploadRemote.Status.UPLOADED)\n\t\t\t\t\tnewUploadedFiles.add(id)\n\t\t\t})\n\t\t}\n\n\t\tonBeforeMount(() => {\n\t\t\tfield.currentValue.forEach((fileItem) => {\n\t\t\t\tif (\n\t\t\t\t\t[\n\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.UPLOADED,\n\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t].includes(\n\t\t\t\t\t\tfileItem.status as KottiFieldFileUploadRemote.Status | undefined,\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t\tpreUploadedFiles.add(fileItem.id)\n\t\t\t})\n\t\t})\n\n\t\twatch(\n\t\t\t() => props.payload,\n\t\t\t(newPayload, oldPayload) => {\n\t\t\t\tconst newStatuses = new Map(\n\t\t\t\t\tObject.entries(newPayload)\n\t\t\t\t\t\t.filter(([id, { status }]) => oldPayload[id]?.status !== status)\n\t\t\t\t\t\t.filter(([id, _]) => {\n\t\t\t\t\t\t\tconst fileItemStatus =\n\t\t\t\t\t\t\t\tfield.currentValue.find((fileItem) => fileItem.id === id)\n\t\t\t\t\t\t\t\t\t?.status ?? null\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tfileItemStatus !== null &&\n\t\t\t\t\t\t\t\t![\n\t\t\t\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.INVALID,\n\t\t\t\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.NOT_STARTED,\n\t\t\t\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.UPLOADED,\n\t\t\t\t\t\t\t\t\tKottiFieldFileUploadRemote.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t\t\t\t\t].includes(fileItemStatus as KottiFieldFileUploadRemote.Status)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.map(([id, { status }]) => [id, status]),\n\t\t\t\t)\n\t\t\t\tsetStatuses(newStatuses)\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tfilesList,\n\t\t\tfilesListStyle: computed(() =>\n\t\t\t\tshowDropArea.value ? { 'padding-top': 'var(--unit-4)' } : undefined,\n\t\t\t),\n\t\t\tinputId: computed(() => field.inputProps.id),\n\t\t\tonAddFiles: (value: Shared.Events.AddFiles) => {\n\t\t\t\tif (props.allowMultiple)\n\t\t\t\t\tfield.setValue([\n\t\t\t\t\t\t...field.currentValue,\n\t\t\t\t\t\t...value.map((file) => buildFileItem(file)),\n\t\t\t\t\t])\n\t\t\t\telse field.setValue([buildFileItem(value[0] as File)])\n\t\t\t},\n\t\t\tonRemoveFile: (id: Shared.Events.RemoveFile) => {\n\t\t\t\tprops.actions.onDelete(id)\n\t\t\t},\n\t\t\tpreUploadedFilesList: computed<\n\t\t\t\tKottiFieldFileUpload.FileItem.Props['fileInfo'][]\n\t\t\t>(() =>\n\t\t\t\tfield.currentValue\n\t\t\t\t\t.filter((fileItem) => preUploadedFiles.has(fileItem.id))\n\t\t\t\t\t.map((fileItem) => {\n\t\t\t\t\t\tconst fileInfo = buildPreUploadedFileInfo({\n\t\t\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\t\t\tfileItem,\n\t\t\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (fileItem.status !== fileInfo.status)\n\t\t\t\t\t\t\tsetStatus({ id: fileItem.id, status: fileInfo.status })\n\n\t\t\t\t\t\t// FIXME: status seems to be incompatible between remote and non-remote\n\t\t\t\t\t\treturn fileInfo as unknown as KottiFieldFileUpload.FileItem.Props['fileInfo']\n\t\t\t\t\t}),\n\t\t\t),\n\t\t\tpreUploadedFilesListStyle: computed(() =>\n\t\t\t\tshowDropArea.value\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t'padding-top': `var(${\n\t\t\t\t\t\t\t\tfilesList.value.length > 0 ? '--unit-8' : '--unit-4'\n\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t\tsharedProps: computed(() => ({\n\t\t\t\tdataTest: field.inputProps['data-test'],\n\t\t\t\textensions: props.extensions,\n\t\t\t\tisDisabled: field.isDisabled,\n\t\t\t\tisLoading: field.isLoading,\n\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t})),\n\t\t\tshowDropArea,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import './styles.scss';\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_FILE_UPLOAD_SUPPORTS } from './constants'\nimport KtFieldFileUploadVue from './KtFieldFileUpload.vue'\nimport KtFieldFileUploadRemoteVue from './KtFieldFileUploadRemote.vue'\nimport { KottiFieldFileUpload, KottiFieldFileUploadRemote } from './types'\n\nconst componentFolder = 'kotti-field-file-upload'\nconst url =\n\t'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=3547%3A8456&t=hhn880dUtUMnmX06-0'\nexport const KtFieldFileUpload = attachMeta(\n\tmakeInstallable(KtFieldFileUploadVue),\n\t{\n\t\taddedVersion: '3.0.0-beta.43',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldFileUpload',\n\t\t\tschema: KottiFieldFileUpload.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_FILE_UPLOAD_SUPPORTS },\n)\n\nexport const KtFieldFileUploadRemote = attachMeta(\n\tmakeInstallable(KtFieldFileUploadRemoteVue),\n\t{\n\t\taddedVersion: '3.0.0-beta.43',\n\t\tcomponentFolder,\n\t\tdeprecated: {\n\t\t\talternatives: ['Use KtFileUpload instead'],\n\t\t\treason:\n\t\t\t\t'Implementing a component that is meant to upload files immediately as a form field is inherently flawed',\n\t\t\tversion: '7.2.0',\n\t\t},\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldFileUploadRemote',\n\t\t\tschema: KottiFieldFileUploadRemote.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_FILE_UPLOAD_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_INLINE_EDIT_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: false,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n","<template>\n\t<KtButton\n\t\tv-bind=\"buttonProps\"\n\t\tclass=\"kt-field-inline-edit__confirm-button\"\n\t\t@click.stop.prevent=\"handleConfirm\"\n\t\t@keyup.enter.stop.prevent=\"handleConfirm\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nexport default defineComponent({\n\tname: 'ConfirmButton',\n\tprops: {\n\t\tdataTest: { default: null, type: String },\n\t\ttabIndex: { default: 0, type: Number },\n\t},\n\temits: ['confirm'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tbuttonProps: computed(() => ({\n\t\t\t\t['data-test']: props.dataTest ? `${props.dataTest}.confirm` : undefined,\n\t\t\t\ticon: Yoco.Icon.CHECK,\n\t\t\t\ttabindex: props.tabIndex,\n\t\t\t})),\n\t\t\thandleConfirm: () => {\n\t\t\t\temit('confirm')\n\t\t\t},\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-field-inline-edit__confirm-button {\n\tdisplay: flex;\n\tflex: 1;\n}\n</style>\n","<template>\n\t<div :class=\"rootClasses\" :tabindex=\"-1\" v-text=\"Yoco.Icon.EDIT\" />\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nexport default defineComponent({\n\tname: 'EditIcon',\n\tprops: {\n\t\tisDisabled: { default: false, type: Boolean },\n\t},\n\tsetup(props) {\n\t\treturn {\n\t\t\trootClasses: computed(() => ({\n\t\t\t\t'kt-field-inline-edit__edit-icon': true,\n\t\t\t\t'kt-field-inline-edit__edit-icon--disabled': props.isDisabled,\n\t\t\t\tyoco: true,\n\t\t\t})),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-field-inline-edit__edit-icon {\n\tdisplay: flex;\n\tfont-size: var(--unit-4);\n\n\t&--disabled {\n\t\tcolor: var(--text-05);\n\t}\n}\n</style>\n","import { nextTick } from 'vue'\n\nimport type { FieldInlineEditElement } from './types'\n\nexport const resizeField = async ({\n\tinputRef,\n}: {\n\tinputRef: FieldInlineEditElement | null\n}): Promise<void> => {\n\tinputRef?.setAttribute('style', 'height: auto')\n\n\t// ensure that DOM has updated properly before scrollHeight is retrieved\n\tawait nextTick()\n\n\tconst scrollHeight = inputRef?.scrollHeight ?? null\n\n\tif (scrollHeight === null)\n\t\tthrow new Error(`KtFieldInlinEdit: resizeTextArea: 'scrollHeight' is null.`)\n\n\tinputRef?.setAttribute('style', `height: ${scrollHeight.toString()}px`)\n}\n","import type { ComputedRef, Ref } from 'vue'\nimport { computed, onMounted, watch } from 'vue'\n\nimport type { KottiField } from '../kotti-field/types'\nimport type { Nullable } from '../types/utilities'\n\nimport type { FieldInlineEditElement } from './types'\nimport { KottiFieldInlineEdit } from './types'\nimport { resizeField } from './utils'\n\nexport const useAdjustHeight = ({\n\tfield,\n\tinputRef: _inputRef,\n\tprops,\n}: {\n\tfield: KottiField.Hook.Returns<KottiFieldInlineEdit.Value>\n\tinputRef: Ref<Nullable<FieldInlineEditElement>>\n\tprops: KottiFieldInlineEdit.PropsInternal\n}): void => {\n\tconst inputRef = _inputRef\n\tconst currentValue = computed(() => field.currentValue)\n\n\tonMounted(() => {\n\t\tif (inputRef.value) void resizeField({ inputRef: inputRef.value })\n\t})\n\n\twatch(\n\t\t() => [\n\t\t\tcurrentValue.value,\n\t\t\tinputRef.value,\n\t\t\tprops.isLoading,\n\t\t\tprops.placeholder,\n\t\t\tprops.textStyle,\n\t\t],\n\t\t() => {\n\t\t\tif (inputRef.value) void resizeField({ inputRef: inputRef.value })\n\t\t},\n\t\t{ immediate: true },\n\t)\n}\n\nexport const usePreventConfirm = ({\n\tfield,\n\tprops,\n}: {\n\tfield: KottiField.Hook.Returns<KottiFieldInlineEdit.Value>\n\tprops: KottiFieldInlineEdit.PropsInternal\n}): {\n\tpreventConfirm: ComputedRef<boolean>\n} => {\n\tconst fieldValidation = computed(() => field.validation.type)\n\n\tconst preventConfirm = computed<boolean>(() => {\n\t\tswitch (props.preventConfirmationOn) {\n\t\t\tcase KottiFieldInlineEdit.ConfirmationValidation.ERROR:\n\t\t\t\treturn fieldValidation.value === 'error'\n\t\t\tcase KottiFieldInlineEdit.ConfirmationValidation.NEVER:\n\t\t\t\treturn false\n\t\t\tcase KottiFieldInlineEdit.ConfirmationValidation.WARNING:\n\t\t\t\treturn ['error', 'warning'].includes(fieldValidation.value)\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`KtFieldInlineEdit: Unexpected type for 'preventConfirmationOn': ${props.preventConfirmationOn}`,\n\t\t\t\t)\n\t\t}\n\t})\n\n\treturn {\n\t\tpreventConfirm,\n\t}\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field: modifiedField }\"\n\t\tref=\"ktFieldRef\"\n\t\t:class=\"rootClasses\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<EditIcon v-if=\"!isReadonly && !isEditing\" :isDisabled=\"isDisabled\" />\n\t\t<textarea\n\t\t\tv-if=\"isMultiline\"\n\t\t\tref=\"inputRef\"\n\t\t\tv-bind=\"textareaProps\"\n\t\t\t@input=\"onEdit\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keyup.esc=\"onCancel\"\n\t\t/>\n\t\t<input\n\t\t\tv-else\n\t\t\tref=\"inputRef\"\n\t\t\tv-bind=\"inputProps\"\n\t\t\t@input=\"onEdit\"\n\t\t\t@keydown.enter=\"onEnter\"\n\t\t\t@keyup.esc=\"onCancel\"\n\t\t/>\n\t\t<template #container-right>\n\t\t\t<ConfirmButton\n\t\t\t\tv-if=\"isEditing\"\n\t\t\t\t:dataTest=\"sharedProps['data-test']\"\n\t\t\t\t:tabIndex=\"sharedProps['tabindex']\"\n\t\t\t\t@confirm=\"onConfirm\"\n\t\t\t/>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport {\n\tcomputed,\n\tdefineComponent,\n\tonBeforeMount,\n\tonUnmounted,\n\treactive,\n\tref,\n\ttoRefs,\n\twatch,\n} from 'vue'\nimport type { InputHTMLAttributes, TextareaHTMLAttributes } from 'vue/types/jsx'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useField, useForceUpdate, useKtFieldRef } from '../kotti-field/hooks'\nimport type { KottiField } from '../kotti-field/types'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { makeProps } from '../make-props'\nimport type { Nullable } from '../types/utilities'\nimport { blurElement, isInFocus, isOrContainsEventTarget } from '../utilities'\n\nimport ConfirmButton from './components/ConfirmButton.vue'\nimport EditIcon from './components/EditIcon.vue'\nimport { KOTTI_FIELD_INLINE_EDIT_SUPPORTS } from './constants'\nimport { useAdjustHeight, usePreventConfirm } from './hooks'\nimport type { FieldInlineEditElement } from './types'\nimport { KottiFieldInlineEdit } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldInlineEdit',\n\tcomponents: {\n\t\tConfirmButton,\n\t\tEditIcon,\n\t},\n\tprops: makeProps(KottiFieldInlineEdit.propsSchema),\n\temits: ['confirm', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\t\tconst translations = useTranslationNamespace('KtFieldInlineEdit')\n\n\t\tconst ktFieldRef = useKtFieldRef()\n\t\tconst inputContainerWrapperRef = ref<HTMLDivElement | null>(null)\n\t\tconst inputRef = ref<Nullable<FieldInlineEditElement>>(null)\n\n\t\tconst isEditing = ref(false)\n\t\tconst updateIsEditing = (shouldEdit: typeof isEditing.value) => {\n\t\t\tif (shouldEdit && props.isReadonly) {\n\t\t\t\tblurElement(inputContainerWrapperRef.value)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (shouldEdit && !isInFocus(inputRef.value)) inputRef.value?.focus()\n\n\t\t\tif (shouldEdit === isEditing.value) return\n\n\t\t\tisEditing.value = shouldEdit\n\t\t}\n\n\t\tconst field = useField<KottiFieldInlineEdit.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null || value.trim() === '',\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_INLINE_EDIT_SUPPORTS,\n\t\t})\n\n\t\tconst modifiedField = reactive({\n\t\t\t...toRefs(field),\n\t\t\thideValidation: computed(() => {\n\t\t\t\tif (props.isReadonly) return true\n\t\t\t\tif (isEditing.value) return false\n\t\t\t\treturn field.hideValidation\n\t\t\t}),\n\t\t})\n\n\t\tuseAdjustHeight({\n\t\t\tfield: modifiedField,\n\t\t\tinputRef,\n\t\t\tprops,\n\t\t})\n\n\t\tconst fieldPlaceholder = computed(() =>\n\t\t\tprops.isReadonly\n\t\t\t\t? null\n\t\t\t\t: (props.placeholder ?? translations.value.placeholder),\n\t\t)\n\n\t\tconst setFieldValue = (newValue: KottiFieldInlineEdit.Value) => {\n\t\t\tmodifiedField.setValue(newValue === '' ? null : newValue)\n\t\t\tforceUpdate()\n\t\t}\n\n\t\tconst preEditingValue = ref<KottiFieldInlineEdit.Value>(\n\t\t\tmodifiedField.currentValue,\n\t\t)\n\n\t\tconst { preventConfirm } = usePreventConfirm({\n\t\t\tfield: modifiedField,\n\t\t\tprops,\n\t\t})\n\n\t\twatch(\n\t\t\t() => modifiedField.currentValue,\n\t\t\t(newValue) => {\n\t\t\t\tif (!isEditing.value) preEditingValue.value = newValue\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\tconst onConfirm = () => {\n\t\t\tif (preventConfirm.value) {\n\t\t\t\tif (!isInFocus(inputRef.value)) inputRef.value?.focus()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tpreEditingValue.value = modifiedField.currentValue\n\n\t\t\tupdateIsEditing(false)\n\t\t\tblurElement(inputContainerWrapperRef.value)\n\n\t\t\temit('confirm', modifiedField.currentValue)\n\t\t}\n\n\t\tconst onCancel = () => {\n\t\t\tsetFieldValue(preEditingValue.value)\n\n\t\t\tupdateIsEditing(false)\n\n\t\t\tblurElement(inputContainerWrapperRef.value)\n\t\t}\n\n\t\t/**\n\t\t * The last DOM element to capture focus/click events.\n\t\t *\n\t\t * In case of clicking on a focusable element, the focus event is captured first then the click event.\n\t\t * In case of clicking on a non-focusable element, the focus event doesn't trigger.\n\t\t */\n\t\tconst lastEventTarget = ref<EventTarget | null>(null)\n\n\t\tconst onMouseDown = (event: KeyboardEvent | MouseEvent) => {\n\t\t\tif (\n\t\t\t\tevent.target === null ||\n\t\t\t\tprops.isDisabled ||\n\t\t\t\tprops.isLoading ||\n\t\t\t\tprops.isReadonly\n\t\t\t)\n\t\t\t\treturn\n\n\t\t\tconst isClickOutside = !isOrContainsEventTarget(\n\t\t\t\tinputContainerWrapperRef.value,\n\t\t\t\tevent.target,\n\t\t\t)\n\n\t\t\tlastEventTarget.value = event.target\n\n\t\t\tif (isClickOutside) onCancel()\n\t\t\telse updateIsEditing(true)\n\t\t}\n\n\t\tconst onFocusChange = (event: Event) => {\n\t\t\tif (event.target === null || props.isDisabled) return\n\n\t\t\tconst wasFieldTriggered = isOrContainsEventTarget(\n\t\t\t\tinputContainerWrapperRef.value,\n\t\t\t\tlastEventTarget.value,\n\t\t\t)\n\t\t\tconst isFieldTriggered = isOrContainsEventTarget(\n\t\t\t\tinputContainerWrapperRef.value,\n\t\t\t\tevent.target,\n\t\t\t)\n\n\t\t\tlastEventTarget.value = event.target\n\n\t\t\tif (wasFieldTriggered === isFieldTriggered) return\n\n\t\t\tif (!isFieldTriggered) onCancel()\n\t\t\telse updateIsEditing(true)\n\t\t}\n\n\t\twatch(ktFieldRef, () => {\n\t\t\tif (ktFieldRef.value?.inputContainerWrapperRef)\n\t\t\t\tinputContainerWrapperRef.value =\n\t\t\t\t\tktFieldRef.value.inputContainerWrapperRef\n\t\t})\n\n\t\twatch(\n\t\t\t() => props.textStyle,\n\t\t\t() => {\n\t\t\t\tif (props.textStyle !== null && props.isMultiline) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`textStyle prop is not supported with isMultiline prop`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\tonBeforeMount(() => {\n\t\t\twindow.addEventListener('mousedown', onMouseDown)\n\t\t\twindow.addEventListener('focus', onFocusChange, { capture: true })\n\t\t})\n\n\t\tonUnmounted(() => {\n\t\t\twindow.removeEventListener('mousedown', onMouseDown)\n\t\t\twindow.removeEventListener('focus', onFocusChange)\n\t\t})\n\n\t\tconst sharedProps = computed(\n\t\t\t(): KottiField.Hook.Returns<\n\t\t\t\tNonNullable<KottiFieldInlineEdit.Value>\n\t\t\t>['inputProps'] & {\n\t\t\t\tforceUpdateKey: number\n\t\t\t\tplaceholder: string\n\t\t\t\treadonly: boolean\n\t\t\t\tvalue: NonNullable<KottiFieldInlineEdit.Value>\n\t\t\t} => ({\n\t\t\t\t...modifiedField.inputProps,\n\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\tplaceholder: isEditing.value ? '' : (fieldPlaceholder.value ?? ''),\n\t\t\t\treadonly: props.isReadonly,\n\t\t\t\tvalue: modifiedField.currentValue ?? '',\n\t\t\t}),\n\t\t)\n\n\t\treturn {\n\t\t\tinputContainerWrapperRef,\n\t\t\tinputProps: computed(\n\t\t\t\t(): {\n\t\t\t\t\tclass: Record<string, boolean>\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} & (InputHTMLAttributes | TextareaHTMLAttributes) => ({\n\t\t\t\t\t...sharedProps.value,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: {\n\t\t\t\t\t\t'kt-field-inline-edit__input': true,\n\t\t\t\t\t\t...(props.textStyle !== null && { [props.textStyle]: true }),\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'text',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tinputRef,\n\t\t\tisEditing,\n\t\t\tktFieldRef,\n\t\t\tmodifiedField,\n\t\t\tonCancel,\n\t\t\tonConfirm,\n\t\t\tonEdit: (event: Event) => {\n\t\t\t\tif (props.isReadonly || !isEditing.value) return\n\n\t\t\t\tconst newValue = (event.target as FieldInlineEditElement).value\n\n\t\t\t\tsetFieldValue(newValue)\n\t\t\t},\n\t\t\tonEnter: (event: KeyboardEvent) => {\n\t\t\t\tif (!props.isMultiline || !event.shiftKey) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tonConfirm()\n\t\t\t\t}\n\t\t\t},\n\t\t\trootClasses: computed(() => ({\n\t\t\t\t'kt-field-inline-edit': true,\n\t\t\t\t'kt-field-inline-edit--is-editable': !props.isReadonly,\n\t\t\t\t'kt-field-inline-edit--is-editing':\n\t\t\t\t\tisEditing.value && !props.isDisabled,\n\t\t\t\t'kt-field-inline-edit--is-readonly': props.isReadonly,\n\t\t\t})),\n\t\t\tsharedProps,\n\t\t\ttextareaProps: computed(\n\t\t\t\t(): TextareaHTMLAttributes & {\n\t\t\t\t\tclass: Record<string, boolean>\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} => ({\n\t\t\t\t\t...sharedProps.value,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: {\n\t\t\t\t\t\t'kt-field-inline-edit__input': true,\n\t\t\t\t\t\t'kt-field-inline-edit__input--is-multiline': true,\n\t\t\t\t\t},\n\t\t\t\t\trows: 1,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n.kt-field-inline-edit {\n\t// slot that wraps <input /> & <EditIcon/>\n\n\t/* stylelint-disable-next-line selector-class-pattern */\n\t:deep(.kt-field__input-container__slot) {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-2);\n\t\talign-items: center;\n\t}\n\n\t.h1,\n\t.h2,\n\t.h3 {\n\t\tmargin: 0;\n\t}\n\n\t:deep(.kt-field__input-container) {\n\t\tbackground-color: transparent;\n\t}\n\n\t&--is-readonly {\n\t\t:deep(.kt-field__input-container) {\n\t\t\tbox-shadow: none !important;\n\t\t}\n\t}\n\n\t&__input {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\twidth: 100%;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tline-height: 1.6;\n\t\tborder: 0;\n\n\t\t&:not(.kt-field-inline-edit__input--is-multiline) {\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&--is-multiline {\n\t\t\tpadding-top: 0.6em;\n\t\t\tpadding-bottom: 0.6em;\n\t\t\toverflow: hidden;\n\t\t\tresize: none;\n\t\t}\n\t}\n\n\t&.kt-field-inline-edit--is-editable:hover:not(\n\t\t\t.kt-field-inline-edit--is-editing\n\t\t) {\n\t\t:deep(.kt-field__wrapper:not(.kt-field__wrapper--disabled)) {\n\t\t\t.kt-field__input-container:hover {\n\t\t\t\tcursor: pointer;\n\t\t\t\tbackground-color: var(--ui-05);\n\n\t\t\t\tinput,\n\t\t\t\ttextarea {\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&:not(.kt-field-inline-edit--is-editing) {\n\t\t.kt-field-inline-edit__input--is-multiline {\n\t\t\tword-break: break-word;\n\t\t}\n\n\t\t:deep(.kt-field__input-container) {\n\t\t\tborder: 0;\n\t\t}\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_INLINE_EDIT_SUPPORTS } from './constants'\nimport KtFieldInlineEditVue from './KtFieldInlineEdit.vue'\nimport { KottiFieldInlineEdit } from './types'\n\nexport const KtFieldInlineEdit = attachMeta(\n\tmakeInstallable(KtFieldInlineEditVue),\n\t{\n\t\taddedVersion: '3.0.0-beta-29',\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/qfT3ItoKI6OAXYWF6oOjwR/Inline-Edit?node-id=0%3A1',\n\t\t},\n\t\tslots: {\n\t\t\t...FIELD_META_BASE_SLOTS,\n\t\t\thelpText: {\n\t\t\t\tdescription:\n\t\t\t\t\t'custom helpText support (HTML). Only available in `Regular` Mode',\n\t\t\t\tscope: null,\n\t\t\t},\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldInlineEdit',\n\t\t\tschema: KottiFieldInlineEdit.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_INLINE_EDIT_SUPPORTS },\n)\n\nexport { KOTTI_FIELD_INLINE_EDIT_SUPPORTS } from './constants'\n","import type { KottiField } from '../kotti-field/types'\nimport { DecimalSeparator } from '../types/decimal-separator'\nimport { DECIMAL_SEPARATORS_CHARACTER_SET } from '../utilities'\n\nexport const KOTTI_FIELD_NUMBER_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: false,\n\tdecoration: true,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n\nexport const STRINGS_THAT_ARE_TREATED_AS_NULL = [\n\t...Object.values(DecimalSeparator),\n\t'-',\n\t'',\n]\n\nexport const LEADING_ZEROES_REGEX = new RegExp(\n\t`^0+([1-9]|0${DECIMAL_SEPARATORS_CHARACTER_SET}?)`,\n)\n\nexport const TRAILING_ZEROES_REGEX = new RegExp(\n\t`${DECIMAL_SEPARATORS_CHARACTER_SET}0*$|(${DECIMAL_SEPARATORS_CHARACTER_SET}[0-9]*[1-9])0+$`,\n)\n\nexport const VALID_REGEX = (decimalPlaces: number): RegExp =>\n\tnew RegExp(\n\t\t`^[-]?(0?|([1-9][0-9]*))?(${DECIMAL_SEPARATORS_CHARACTER_SET}[0-9]{0,${decimalPlaces.toString()}})?$`,\n\t)\n","import Big from 'big.js'\n\nimport type { DecimalSeparator } from '../types/decimal-separator'\nimport { DECIMAL_SEPARATORS_CHARACTER_SET } from '../utilities'\n\nimport {\n\tSTRINGS_THAT_ARE_TREATED_AS_NULL,\n\tTRAILING_ZEROES_REGEX,\n} from './constants'\n\nexport const isStepMultiple = ({\n\tminimum,\n\tstep,\n\tvalue,\n}: {\n\tminimum: number | null\n\tstep: number\n\tvalue: number | null\n}): boolean => {\n\tif (minimum === null || value === null) return true\n\n\t// (value - minimum) / step\n\tconst stepFactor = Big(value).minus(minimum).div(step)\n\n\t// is integer?\n\treturn stepFactor.eq(stepFactor.round())\n}\n\nexport const toNumber = (string: string): number | null =>\n\tSTRINGS_THAT_ARE_TREATED_AS_NULL.includes(string)\n\t\t? null\n\t\t: Number.parseFloat(\n\t\t\t\t// `.` is the only accepted decimal place by parseFloat\n\t\t\t\tstring.replace(new RegExp(DECIMAL_SEPARATORS_CHARACTER_SET), '.'),\n\t\t\t)\n\nexport const toString = (\n\tnumber: number | null,\n\tdecimalPlaces: number,\n\tdecimalSeparator: DecimalSeparator,\n): string =>\n\tnumber === null\n\t\t? ''\n\t\t: number\n\t\t\t\t.toFixed(decimalPlaces)\n\t\t\t\t.replace('.', decimalSeparator)\n\t\t\t\t.replace(TRAILING_ZEROES_REGEX, '$1')\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tref=\"ktFieldRef\"\n\t\t:class=\"{\n\t\t\t'kt-field__number-field--has-buttons': !hideChangeButtons,\n\t\t}\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<div class=\"kt-field-number\" :tabIndex=\"-1\">\n\t\t\t<KtButton\n\t\t\t\tv-if=\"!hideChangeButtons\"\n\t\t\t\tclass=\"kt-field-number__button\"\n\t\t\t\t:data-test=\"`${inputProps['data-test']}-decrement`\"\n\t\t\t\t:disabled=\"!isDecrementEnabled\"\n\t\t\t\t:icon=\"Yoco.Icon.MINUS\"\n\t\t\t\t:tabIndex=\"-1\"\n\t\t\t\t@click.stop=\"decrementValue\"\n\t\t\t/>\n\t\t\t<div class=\"kt-field-number__middle\" @click=\"onClickMiddle\">\n\t\t\t\t<input\n\t\t\t\t\tref=\"inputRef\"\n\t\t\t\t\tv-bind=\"inputProps\"\n\t\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t\t@keydown=\"onKeydown\"\n\t\t\t\t\t@keyup=\"onKeyup\"\n\t\t\t\t/>\n\t\t\t\t<div v-if=\"showMaximum\" v-text=\"'/'\" />\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"showMaximum\"\n\t\t\t\t\tclass=\"kt-field-number__maximum\"\n\t\t\t\t\tv-text=\"maximum\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<KtButton\n\t\t\t\tv-if=\"!hideChangeButtons\"\n\t\t\t\tclass=\"kt-field-number__button\"\n\t\t\t\t:data-test=\"`${inputProps['data-test']}-increment`\"\n\t\t\t\t:disabled=\"!isIncrementEnabled\"\n\t\t\t\t:icon=\"Yoco.Icon.PLUS\"\n\t\t\t\t:tabIndex=\"-1\"\n\t\t\t\t@click.stop=\"incrementValue\"\n\t\t\t/>\n\t\t</div>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport Big from 'big.js'\nimport type { UnwrapRef } from 'vue'\nimport { computed, defineComponent, nextTick, ref, watch } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtButton } from '../kotti-button'\nimport { KtField } from '../kotti-field'\nimport {\n\tuseEmitBlur,\n\tuseField,\n\tuseForceUpdate,\n\tuseInput,\n\tuseKtFieldRef,\n} from '../kotti-field/hooks'\nimport type { KottiField } from '../kotti-field/types'\nimport { useI18nContext } from '../kotti-i18n/hooks'\nimport type { KottiI18n } from '../kotti-i18n/types'\nimport { makeProps } from '../make-props'\nimport { DECIMAL_SEPARATORS_CHARACTER_SET, isNumberInRange } from '../utilities'\n\nimport {\n\tKOTTI_FIELD_NUMBER_SUPPORTS,\n\tLEADING_ZEROES_REGEX,\n\tVALID_REGEX,\n} from './constants'\nimport { KottiFieldNumber } from './types'\nimport { isStepMultiple, toNumber, toString } from './utilities'\n\nexport default defineComponent({\n\tname: 'KtFieldNumber',\n\tcomponents: {\n\t\tKtButton,\n\t\tKtField,\n\t},\n\tprops: makeProps(KottiFieldNumber.propsSchema),\n\temits: ['blur', 'input', 'keyup'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldNumber.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_NUMBER_SUPPORTS,\n\t\t})\n\n\t\tconst { focusInput } = useInput(field.inputProps.id)\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\t\tconst i18nContext = useI18nContext()\n\t\tconst ktFieldRef = useKtFieldRef()\n\n\t\tuseEmitBlur({\n\t\t\temit,\n\t\t\tfield,\n\t\t\tfieldTarget: computed(() => ktFieldRef.value?.inputContainerRef ?? null),\n\t\t})\n\n\t\tconst isDecrementEnabled = computed(\n\t\t\t() =>\n\t\t\t\t!field.isDisabled &&\n\t\t\t\tisNumberInRange({\n\t\t\t\t\tmaximum: props.maximum,\n\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\tvalue:\n\t\t\t\t\t\tfield.currentValue === null\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: Big(field.currentValue).minus(props.step).toNumber(),\n\t\t\t\t}),\n\t\t)\n\n\t\tconst isIncrementEnabled = computed(\n\t\t\t() =>\n\t\t\t\t!field.isDisabled &&\n\t\t\t\tisNumberInRange({\n\t\t\t\t\tmaximum: props.maximum,\n\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\tvalue:\n\t\t\t\t\t\tfield.currentValue === null\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: Big(field.currentValue).add(props.step).toNumber(),\n\t\t\t\t}),\n\t\t)\n\n\t\tconst internalStringValue = ref('')\n\t\tconst lastValidTypedStringValue = ref('')\n\t\tconst forceUpdateDisplayedValue = (newNumber: number | null) => {\n\t\t\tinternalStringValue.value = toString(\n\t\t\t\tnewNumber,\n\t\t\t\tprops.decimalPlaces,\n\t\t\t\ti18nContext.numberFormat.decimalSeparator,\n\t\t\t)\n\t\t\tlastValidTypedStringValue.value = ''\n\t\t}\n\n\t\tconst showMaximum = computed(\n\t\t\t() => props.maximum !== null && !props.hideMaximum,\n\t\t)\n\n\t\twatch(\n\t\t\t(): [\n\t\t\t\tKottiFieldNumber.Value,\n\t\t\t\tUnwrapRef<KottiI18n.Context['numberFormat']>['decimalSeparator'],\n\t\t\t] => [field.currentValue, i18nContext.numberFormat.decimalSeparator],\n\t\t\t([newNumber]) => {\n\t\t\t\tif (\n\t\t\t\t\t!isNumberInRange({\n\t\t\t\t\t\tmaximum: props.maximum,\n\t\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\t\tvalue: newNumber,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t`KtFieldNumber: encountered an out-of-range number \"${String(newNumber)}\"`,\n\t\t\t\t\t)\n\n\t\t\t\tif (\n\t\t\t\t\t!isStepMultiple({\n\t\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\t\tstep: props.step,\n\t\t\t\t\t\tvalue: newNumber,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`KtFieldNumber: encountered a value \"${String(newNumber)}\" that doesn't fit ((minimum + k * step): where k is an integer)`,\n\t\t\t\t\t)\n\n\t\t\t\tif (toNumber(lastValidTypedStringValue.value) === newNumber) {\n\t\t\t\t\tinternalStringValue.value = lastValidTypedStringValue.value\n\t\t\t\t} else {\n\t\t\t\t\tforceUpdateDisplayedValue(newNumber)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\t/**\n\t\t * reference to input element, in order to track cursor position\n\t\t * prior to feeding the value back to the input, which resets the position to the end.\n\t\t */\n\t\tconst inputRef = ref<HTMLInputElement | null>(null)\n\t\tconst lastUserSetCursorPosition = ref<number | null>(null)\n\n\t\tconst setCursorPosition = (position: number | null) => {\n\t\t\tif (position !== null)\n\t\t\t\tinputRef.value?.setSelectionRange(position, position)\n\t\t}\n\n\t\twatch(\n\t\t\tinternalStringValue,\n\t\t\t() => {\n\t\t\t\t// in case the parent component accepts the @input event’s change, we need to restore the cursor position\n\t\t\t\tsetCursorPosition(lastUserSetCursorPosition.value)\n\t\t\t\tlastUserSetCursorPosition.value = null\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\t/**\n\t\t * In the scenario when the user clicks the +/- buttons when the value is null\n\t\t * we check if zero is in the range of accepted values, and fallback to it\n\t\t */\n\t\tconst canFallbackToZero = computed<boolean>(\n\t\t\t() =>\n\t\t\t\tisStepMultiple({\n\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\tstep: props.step,\n\t\t\t\t\tvalue: 0,\n\t\t\t\t}) &&\n\t\t\t\tisNumberInRange({\n\t\t\t\t\tmaximum: props.maximum,\n\t\t\t\t\tminimum: props.minimum,\n\t\t\t\t\tvalue: 0,\n\t\t\t\t}),\n\t\t)\n\n\t\tconst decrementValue = () => {\n\t\t\tif (!isDecrementEnabled.value) return\n\n\t\t\tfield.setValue(\n\t\t\t\tfield.currentValue === null\n\t\t\t\t\t? canFallbackToZero.value\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: (props.minimum ?? props.maximum ?? 0)\n\t\t\t\t\t: Big(field.currentValue).minus(props.step).toNumber(),\n\t\t\t)\n\t\t\tfocusInput()\n\t\t}\n\n\t\tconst incrementValue = () => {\n\t\t\tif (!isIncrementEnabled.value) return\n\n\t\t\tfield.setValue(\n\t\t\t\tfield.currentValue === null\n\t\t\t\t\t? canFallbackToZero.value\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: (props.minimum ?? props.maximum ?? 0)\n\t\t\t\t\t: Big(field.currentValue).add(props.step).toNumber(),\n\t\t\t)\n\t\t\tfocusInput()\n\t\t}\n\n\t\treturn {\n\t\t\tdecrementValue,\n\t\t\tfield,\n\t\t\tincrementValue,\n\t\t\tinputProps: computed(\n\t\t\t\t(): InputHTMLAttributes &\n\t\t\t\t\tKottiField.Hook.Returns<KottiFieldNumber.Value>['inputProps'] & {\n\t\t\t\t\t\tclass: Record<string, boolean>\n\t\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t\t} => ({\n\t\t\t\t\t...field.inputProps,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: {\n\t\t\t\t\t\t'kt-field-number__input': true,\n\t\t\t\t\t\t'kt-field-number__input--has-maximum': showMaximum.value,\n\t\t\t\t\t\t'kt-field-number__input--left-aligned':\n\t\t\t\t\t\t\t!showMaximum.value &&\n\t\t\t\t\t\t\tprops.hideChangeButtons &&\n\t\t\t\t\t\t\tprops.align === 'left',\n\t\t\t\t\t\t'kt-field-number__input--right-aligned':\n\t\t\t\t\t\t\t!showMaximum.value &&\n\t\t\t\t\t\t\tprops.hideChangeButtons &&\n\t\t\t\t\t\t\tprops.align === 'right',\n\t\t\t\t\t},\n\t\t\t\t\tdisabled: field.isDisabled,\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\ttype: 'text', // NOT A MISTAKE\n\t\t\t\t\tvalue: internalStringValue.value,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tinputRef,\n\t\t\tisDecrementEnabled,\n\t\t\tisIncrementEnabled,\n\t\t\tktFieldRef,\n\t\t\tonBlur: () => {\n\t\t\t\tforceUpdateDisplayedValue(field.currentValue)\n\t\t\t},\n\t\t\tonClickMiddle: () => inputRef.value?.focus(),\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst value = (event.target as HTMLInputElement).value\n\n\t\t\t\tlastUserSetCursorPosition.value = inputRef.value?.selectionStart ?? null\n\n\t\t\t\tconst { decimalPlaces, maximum, minimum, step } = props\n\n\t\t\t\tconst valueWithoutLeadingZeroes = value.replace(\n\t\t\t\t\tLEADING_ZEROES_REGEX,\n\t\t\t\t\t'$1',\n\t\t\t\t)\n\t\t\t\tconst nextNumber = toNumber(valueWithoutLeadingZeroes)\n\n\t\t\t\tconst isTypedNumberValid =\n\t\t\t\t\tVALID_REGEX(decimalPlaces).test(valueWithoutLeadingZeroes) &&\n\t\t\t\t\tisStepMultiple({\n\t\t\t\t\t\tminimum,\n\t\t\t\t\t\tstep,\n\t\t\t\t\t\tvalue: nextNumber,\n\t\t\t\t\t}) &&\n\t\t\t\t\tisNumberInRange({\n\t\t\t\t\t\tmaximum,\n\t\t\t\t\t\tminimum,\n\t\t\t\t\t\tvalue: nextNumber,\n\t\t\t\t\t})\n\n\t\t\t\tif (isTypedNumberValid) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Replace all decimal places with the one provided by KtI18nContext\n\t\t\t\t\t **/\n\t\t\t\t\tconst valueWithSupportedDecimalSeparator =\n\t\t\t\t\t\tvalueWithoutLeadingZeroes.replace(\n\t\t\t\t\t\t\tnew RegExp(DECIMAL_SEPARATORS_CHARACTER_SET),\n\t\t\t\t\t\t\ti18nContext.numberFormat.decimalSeparator,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Preserve exact user input in case it’s possible to apply later\n\t\t\t\t\t * E.g. when changing `1.01` to `1.0`, so that it doesn’t change to `1`\n\t\t\t\t\t */\n\t\t\t\t\tlastValidTypedStringValue.value = valueWithSupportedDecimalSeparator\n\n\t\t\t\t\tconst shouldEmit = nextNumber !== field.currentValue\n\n\t\t\t\t\tif (shouldEmit) field.setValue(nextNumber)\n\t\t\t\t\telse internalStringValue.value = valueWithSupportedDecimalSeparator\n\t\t\t\t}\n\n\t\t\t\tforceUpdate()\n\n\t\t\t\t/**\n\t\t\t\t * Calculates new cursor position, which might be 1 character different than the last cursor position\n\t\t\t\t * because we might reject the character the user just entered. Then, we’d need to -1 it to undo that change.\n\t\t\t\t *\n\t\t\t\t * FIXME: This may or may not move the cursor by 1 character if the parent component rejects the update.\n\t\t\t\t * We decided that that’s an okay trade-off for now. If this ever needs to be fixed, it’s likely possible to fix by\n\t\t\t\t * also looking at the shouldEmit to figure-out the new cursor position\n\t\t\t\t */\n\t\t\t\tconst newCursorPosition =\n\t\t\t\t\tlastUserSetCursorPosition.value === null\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: lastUserSetCursorPosition.value - (isTypedNumberValid ? 0 : 1)\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tsetCursorPosition(newCursorPosition)\n\t\t\t\t})\n\t\t\t},\n\t\t\tonKeydown: (event: KeyboardEvent) => {\n\t\t\t\tif (event.code === 'ArrowUp') {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tincrementValue()\n\t\t\t\t} else if (event.code === 'ArrowDown') {\n\t\t\t\t\tdecrementValue()\n\t\t\t\t}\n\t\t\t},\n\t\t\tonKeyup: (event: KeyboardEvent) => {\n\t\t\t\temit('keyup', event)\n\t\t\t},\n\t\t\tshowMaximum,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@use 'sass:map';\n\n.kt-field__wrapper {\n\t$sizes: (\n\t\t'small': 1.3rem,\n\t\t'medium': 1.6rem,\n\t\t'large': 2rem,\n\t);\n\n\t@each $type in 'small', 'medium', 'large' {\n\t\t&--is-#{$type} {\n\t\t\t.kt-field-number__button {\n\t\t\t\twidth: map.get($sizes, $type);\n\t\t\t\theight: map.get($sizes, $type);\n\t\t\t}\n\n\t\t\t.kt-field-number__middle {\n\t\t\t\theight: map.get($sizes, $type);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* stylelint-disable selector-class-pattern */\n.kt-field__number-field--has-buttons .kt-field__input-container {\n\tpadding: 0 0.15rem;\n\n\t&__affix--left,\n\t&__affix--right {\n\t\tpadding: 0 var(--unit-2);\n\t}\n\n\t&__icon--left {\n\t\ttransform: translate(-0.1rem);\n\t}\n\n\t&__icon--right {\n\t\ttransform: translate(0.1rem);\n\t}\n}\n/* stylelint-enable selector-class-pattern */\n\n.kt-field-number {\n\tdisplay: flex;\n\talign-items: center;\n\tfont-variant-numeric: tabular-nums;\n\n\t&__middle {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\talign-items: center;\n\t}\n\n\t&__input,\n\t&__maximum {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\talign-items: center;\n\t\tmin-width: 0;\n\t\tpadding: 0;\n\t}\n\n\t&__input {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tborder: none;\n\n\t\t&--has-maximum {\n\t\t\ttext-align: right;\n\t\t}\n\n\t\t&--left-aligned {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t&--right-aligned {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_NUMBER_SUPPORTS } from './constants'\nimport KtFieldNumberVue from './KtFieldNumber.vue'\nimport { KottiFieldNumber } from './types'\n\nexport const KtFieldNumber = attachMeta(\n\tmakeInstallable(KtFieldNumberVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=850%3A468',\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldNumber',\n\t\t\tschema: KottiFieldNumber.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_NUMBER_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_PASSWORD_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: true,\n\tdecoration: true,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tref=\"ktFieldRef\"\n\t\t:getEmptyValue=\"() => null\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\t@visibilityChange=\"handleVisibilityChange\"\n\t>\n\t\t<input v-bind=\"inputProps\" @input=\"onInput\" @keyup=\"onKeyup\" />\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { KtField } from '../kotti-field'\nimport {\n\tuseEmitBlur,\n\tuseField,\n\tuseForceUpdate,\n\tuseKtFieldRef,\n} from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport { KOTTI_FIELD_PASSWORD_SUPPORTS } from './constants'\nimport { KottiFieldPassword } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldPassword',\n\tcomponents: { KtField },\n\tprops: makeProps(KottiFieldPassword.propsSchema),\n\temits: ['blur', 'input', 'keyup'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldPassword.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_PASSWORD_SUPPORTS,\n\t\t})\n\t\tconst fieldType = ref('password')\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\t\tconst ktFieldRef = useKtFieldRef()\n\n\t\tuseEmitBlur({\n\t\t\temit,\n\t\t\tfield,\n\t\t\tfieldTarget: computed(() => ktFieldRef.value?.inputContainerRef ?? null),\n\t\t\tvalueOverride: '•••',\n\t\t})\n\n\t\treturn {\n\t\t\tfield,\n\t\t\thandleVisibilityChange: () => {\n\t\t\t\tconst isValueHidden = fieldType.value === 'password'\n\t\t\t\tfieldType.value = isValueHidden ? 'text' : 'password'\n\t\t\t},\n\t\t\tinputProps: computed(\n\t\t\t\t(): InputHTMLAttributes & {\n\t\t\t\t\tclass: string[]\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} => ({\n\t\t\t\t\t...field.inputProps,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: ['kt-field-password__wrapper'],\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\ttype: fieldType.value,\n\t\t\t\t\tvalue: field.currentValue ?? '',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tktFieldRef,\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst newValue = (event.target as HTMLInputElement).value\n\t\t\t\tfield.setValue(newValue === '' ? null : newValue)\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\tonKeyup: (event: KeyboardEvent) => {\n\t\t\t\temit('keyup', event)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.kt-field-password__wrapper {\n\tdisplay: flex;\n\twidth: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tline-height: 1.6;\n\tborder: 0;\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_PASSWORD_SUPPORTS } from './constants'\nimport KtFieldPasswordVue from './KtFieldPassword.vue'\nimport { KottiFieldPassword } from './types'\n\nexport const KtFieldPassword = attachMeta(\n\tmakeInstallable(KtFieldPasswordVue),\n\t{\n\t\taddedVersion: '2.3.0',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldPassword',\n\t\t\tschema: KottiFieldPassword.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_PASSWORD_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_RADIO_GROUP_SUPPORTS: KottiField.Supports = {\n\tautoComplete: false,\n\tborderless: false,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: false,\n\ttabIndex: true,\n}\n","<template>\n\t<KtField v-bind=\"{ field }\" :helpTextSlot=\"$slots.helpText\" useFieldset>\n\t\t<template #container>\n\t\t\t<div :class=\"rootClasses\" :forceUpdateKey=\"forceUpdateKey\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(option, index) in options\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"kt-field-radio-group__container\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"kt-field-radio-group__header\">\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tclass=\"kt-field-radio-group__label\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t'kt-field-radio-group__label--disabled':\n\t\t\t\t\t\t\t\t\tfield.isDisabled || Boolean(option.isDisabled),\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t:data-test=\"optionDataTest(option)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-bind=\"inputProps(option, index)\"\n\t\t\t\t\t\t\t\t@change=\"onChange(option.value)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"kt-field-radio-group__radio\"\n\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t'kt-field-radio-group__radio--checked':\n\t\t\t\t\t\t\t\t\t\tfield.currentValue === option.value,\n\t\t\t\t\t\t\t\t\t'kt-field-radio-group__radio--is-disabled':\n\t\t\t\t\t\t\t\t\t\tfield.isDisabled || Boolean(option.isDisabled),\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"kt-field-radio-group__radio-inside\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<slot name=\"header\" :option=\"option\">\n\t\t\t\t\t\t\t\t<div v-text=\"option.label\" />\n\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<FieldHelpText\n\t\t\t\t\t\t\tv-if=\"option.tooltip\"\n\t\t\t\t\t\t\tclass=\"kt-field-radio-group__tooltip\"\n\t\t\t\t\t\t\t:helpText=\"option.tooltip\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<slot name=\"headerSide\" :option=\"option\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"kt-field-radio-group__content\">\n\t\t\t\t\t\t<slot name=\"content\" :option=\"option\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport omit from 'lodash/omit.js'\nimport { computed, defineComponent } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { KtField } from '../kotti-field'\nimport FieldHelpText from '../kotti-field/components/FieldHelpText.vue'\nimport { useField, useForceUpdate } from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport { KOTTI_FIELD_RADIO_GROUP_SUPPORTS } from './constants'\nimport { KottiFieldRadioGroup } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldRadioGroup',\n\tcomponents: {\n\t\tFieldHelpText,\n\t\tKtField,\n\t},\n\tprops: makeProps(KottiFieldRadioGroup.propsSchema),\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldRadioGroup.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_RADIO_GROUP_SUPPORTS,\n\t\t})\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\tinputProps: computed(\n\t\t\t\t() =>\n\t\t\t\t\t(\n\t\t\t\t\t\toption: KottiFieldRadioGroup.PropsInternal['options'][0],\n\t\t\t\t\t\tindex: number,\n\t\t\t\t\t): InputHTMLAttributes & { class: string } => ({\n\t\t\t\t\t\t...omit(field.inputProps, ['data-test', 'id']),\n\t\t\t\t\t\tchecked: field.currentValue === option.value,\n\t\t\t\t\t\tclass: 'kt-field-radio-group__input',\n\t\t\t\t\t\tdisabled: field.isDisabled || Boolean(option.isDisabled),\n\t\t\t\t\t\tid: `${field.inputProps.id}-${String(index)}`,\n\t\t\t\t\t\tname: field.inputProps.id,\n\t\t\t\t\t\ttype: 'radio',\n\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t}),\n\t\t\t),\n\t\t\tonChange: (value: KottiFieldRadioGroup.Entry['value']) => {\n\t\t\t\tfield.setValue(value)\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\toptionDataTest: (option: KottiFieldRadioGroup.Entry) => {\n\t\t\t\tif (option.dataTest) return option.dataTest\n\n\t\t\t\tif (Object.keys(field.inputProps).includes('data-test')) {\n\t\t\t\t\treturn [field.inputProps['data-test'], option.value].join('.')\n\t\t\t\t}\n\t\t\t},\n\t\t\trootClasses: computed(() => ({\n\t\t\t\t'kt-field-radio-group': true,\n\t\t\t\t'kt-field-radio-group--inline': props.isInline,\n\t\t\t})),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-field/mixins';\n\n:root {\n\t--radio-size: 0.8rem;\n\t--radio-inside-side: 0.2rem;\n}\n\n.kt-field-radio-group {\n\tdisplay: flex;\n\tflex: 1;\n\n\t&--inline {\n\t\tflex-direction: row;\n\n\t\t.kt-field-radio-group__container:not(:first-child) {\n\t\t\tmargin-left: 1rem;\n\t\t}\n\t}\n\n\t&:not(&--inline) {\n\t\tflex-direction: column;\n\n\t\t.kt-field-radio-group__container:not(:first-child) {\n\t\t\tmargin-top: 0.4rem;\n\t\t}\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\t> *:not(:last-child) {\n\t\t\tmargin-right: 0.3rem;\n\t\t}\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\tcursor: pointer;\n\n\t\t> *:not(:last-child) {\n\t\t\tmargin-right: 0.3rem;\n\t\t}\n\n\t\t&--disabled {\n\t\t\tcolor: var(--text-05);\n\t\t\tcursor: not-allowed;\n\n\t\t\t.kt-field-radio-group__radio {\n\t\t\t\tborder-color: var(--ui-02);\n\n\t\t\t\t&--checked {\n\t\t\t\t\tbackground-color: var(--ui-02);\n\t\t\t\t\tbox-shadow: var(--shadow-base);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&__tooltip {\n\t\t// align tooltip icon with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-6px) Put it up half the height of the tooltip height (12px)\n\t\ttransform: translateY(calc(0.75em - 6px));\n\t}\n\n\t&__input {\n\t\tdisplay: none;\n\n\t\t&:focus + .kt-field-radio-group__radio {\n\t\t\toutline: 1px solid var(--primary-50);\n\t\t\toutline-offset: 3px;\n\t\t}\n\n\t\t&:focus:not(:focus-visible) + .kt-field-radio-group__radio {\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t&__radio {\n\t\tdisplay: grid;\n\t\tflex-shrink: 0;\n\t\tplace-items: center;\n\t\twidth: var(--radio-size);\n\t\theight: var(--radio-size);\n\t\tbackground-color: var(--ui-background);\n\t\tborder: 1px solid var(--ui-02);\n\t\tborder-radius: 50%;\n\t\ttransition: all ease-in-out var(--transition-short);\n\n\t\t// align radio with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-var(--radio-size) * 0.5) Put it up half the height of the radio height\n\t\ttransform: translateY(calc(0.75em - var(--radio-size) * 0.5));\n\n\t\t&:hover {\n\t\t\tborder-color: var(--interactive-01-hover);\n\t\t}\n\n\t\t&:active {\n\t\t\tborder-color: var(--interactive-01-active);\n\t\t}\n\n\t\t&--checked {\n\t\t\tbackground-color: var(--interactive-01);\n\t\t\tborder-color: var(--interactive-01);\n\t\t\tbox-shadow: var(--shadow-base);\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: var(--interactive-01-hover);\n\t\t\t\tborder-color: var(--interactive-01-hover);\n\t\t\t}\n\n\t\t\t&:active {\n\t\t\t\tbackground-color: var(--interactive-01-active);\n\t\t\t\tborder-color: var(--interactive-01-active);\n\t\t\t}\n\t\t}\n\n\t\t&--is-disabled {\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t&__radio-inside {\n\t\tdisplay: block;\n\t\twidth: var(--radio-inside-side);\n\t\theight: var(--radio-inside-side);\n\t\tbackground-color: var(--ui-background);\n\t\tborder-radius: 50%;\n\t}\n\n\t&__content {\n\t\tfont-size: var(--font-size-small);\n\t}\n}\n\n.kt-field__wrapper {\n\t@include validations using ($type) {\n\t\t@if $type != empty {\n\t\t\t&:not(.kt-field__wrapper--disabled) {\n\t\t\t\t.kt-field-radio-group {\n\t\t\t\t\t&__radio {\n\t\t\t\t\t\tborder-color: var(--support-#{$type});\n\n\t\t\t\t\t\t&--checked {\n\t\t\t\t\t\t\tbackground-color: var(--support-#{$type});\n\t\t\t\t\t\t\tbox-shadow: var(--shadow-base);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_RADIO_GROUP_SUPPORTS } from './constants'\nimport KtFieldRadioGroupVue from './KtFieldRadioGroup.vue'\nimport { KottiFieldRadioGroup } from './types'\n\nexport const KtFieldRadioGroup = attachMeta(\n\tmakeInstallable(KtFieldRadioGroupVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=436%3A242',\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldRadioGroup',\n\t\t\tschema: KottiFieldRadioGroup.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_RADIO_GROUP_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_SELECT_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: true,\n\tdecoration: true,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n","<template>\n\t<div class=\"kt-tag\">\n\t\t<div v-if=\"label\" class=\"kt-tag__label\">{{ label }}:&nbsp;</div>\n\t\t<div class=\"kt-tag__text\" v-text=\"text\" />\n\t\t<div\n\t\t\tv-if=\"!isDisabled && !hideActions\"\n\t\t\tclass=\"kt-tag__icon\"\n\t\t\t@click.prevent.stop=\"$emit('close')\"\n\t\t>\n\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.CLOSE\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiTag } from './types'\n\nexport default defineComponent({\n\tname: 'KtTag',\n\tprops: makeProps(KottiTag.propsSchema),\n\temits: ['close'],\n\tsetup() {\n\t\treturn {\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n:root {\n\t--kt-tag-vertical-gap: var(--unit-h);\n\t--kt-tag-horizontal-gap: var(--unit-1);\n\t--kt-tag-border: var(--unit-q);\n\t--kt-tag-padding: var(--unit-1);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.kt-tag {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tpadding: var(--kt-tag-padding);\n\tmargin: var(--kt-tag-vertical-gap) var(--kt-tag-horizontal-gap);\n\tfont-size: 0.875em;\n\tcolor: var(--text-02);\n\twhite-space: nowrap;\n\tbackground-color: var(--interactive-02);\n\tborder: var(--kt-tag-border) solid var(--ui-02);\n\tborder-radius: var(--field-border-radius);\n\n\t&__icon {\n\t\t$size: 1.25em;\n\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: $size;\n\t\theight: $size;\n\t\tmargin-left: var(--unit-1);\n\t\tcursor: pointer;\n\t\tbackground-color: var(--ui-02);\n\t\tborder-radius: 50%;\n\n\t\t// clipping also affects the clickable area\n\t\t@supports (clip-path: circle(#{$size * 0.5} at center)) {\n\t\t\tclip-path: circle(#{$size * 0.5} at center);\n\t\t\tborder-radius: 0;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--interactive-02-hover);\n\t\t}\n\t}\n\n\t&__label {\n\t\tfont-weight: bold;\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtTagVue from './KtTag.vue'\nimport { KottiTag } from './types'\n\nexport const KtTag = attachMeta(makeInstallable(KtTagVue), {\n\taddedVersion: '3.0.0-beta.36',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Tag',\n\t\tschema: KottiTag.propsSchema,\n\t},\n})\n","import type { Props } from 'tippy.js'\n\ntype PopperModifier = Exclude<\n\tProps['popperOptions']['modifiers'],\n\tundefined\n>[number]\n\n/**\n * @see {@link https://github.com/atomiks/tippyjs/issues/731#issuecomment-596460597}\n */\nexport const sameWidth: PopperModifier = {\n\tenabled: true,\n\tfn: ({ instance, state }) => {\n\t\tconst triggerReferenceWidth = `${state.rects.reference.width.toString()}px`\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- popper style always exists at runtime\n\t\tif (state.styles.popper!.width !== triggerReferenceWidth) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tstate.styles.popper!.width = triggerReferenceWidth\n\t\t\t// force update the popper instance, so it can reposition the dropdown properly\n\t\t\tvoid instance.update()\n\t\t}\n\t},\n\tname: 'sameWidth',\n\tphase: 'beforeWrite',\n\trequires: ['computeStyles'],\n}\n","import castArray from 'lodash/castArray.js'\nimport type { Props as TippyProps } from 'tippy.js'\nimport type { Ref } from 'vue'\nimport { computed, inject, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../../constants'\nimport type { KottiField } from '../../kotti-field/types'\nimport { KT_IS_IN_POPOVER } from '../../kotti-popover/constants'\nimport { sameWidth } from '../utils/tippy-utils'\n\nconst TIPPY_CONTENT_WRAPPER_CLASSES = new Set(['tippy-box', 'tippy-content'])\n\nexport const isTippyContentWrapper = (element: HTMLElement): boolean =>\n\t[...element.classList].some((className) =>\n\t\tTIPPY_CONTENT_WRAPPER_CLASSES.has(className),\n\t)\n\nexport const useSelectTippy = <T>(\n\tfield: KottiField.Hook.Returns<T>,\n\ttriggerTargets?: Ref<TippyProps['triggerTarget']>,\n): {\n\tisDropdownMounted: Ref<boolean>\n\tisDropdownOpen: Ref<boolean>\n\tsetIsDropdownOpen: (isDropdownOpen: boolean) => void\n\ttippyContentRef: Ref<HTMLElement | null>\n\ttippyRef: Ref<HTMLElement | null>\n} => {\n\tconst tippyRef = ref<HTMLElement | null>(null)\n\tconst tippyContentRef = ref<HTMLElement | null>(null)\n\n\t// track in a ref because the `tippy.state.isShown` doesn’t immediately update\n\tconst isDropdownOpen = ref(false)\n\tconst isDropdownMounted = ref(true)\n\tconst isInPopover = inject(KT_IS_IN_POPOVER, false)\n\n\tconst { tippy } = useTippy(\n\t\ttippyRef,\n\t\tcomputed(() => ({\n\t\t\t/**\n\t\t\t * if inside a popover, we want to stay inside the same CSS stacking context\n\t\t\t * @see {@link https://atomiks.github.io/tippyjs/v6/all-props/#appendto}\n\t\t\t */\n\t\t\tappendTo: isInPopover ? 'parent' : () => document.body,\n\t\t\tarrow: false,\n\t\t\tcontent: tippyContentRef.value ?? undefined,\n\t\t\t// hides the tippy if we click-away from the tippy\n\t\t\thideOnClick: false,\n\t\t\tinteractive: true,\n\t\t\tmaxWidth: 'none',\n\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\tonClickOutside: () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\t\tsetIsDropdownOpen(false)\n\t\t\t},\n\t\t\tonHidden: () => {\n\t\t\t\tisDropdownMounted.value = false\n\t\t\t},\n\t\t\tonHide: () => {\n\t\t\t\tisDropdownOpen.value = false\n\t\t\t},\n\t\t\tonShow: () => {\n\t\t\t\tif (field.isDisabled || field.isLoading) return false\n\n\t\t\t\t// More correct here, don't move to `onShown()`\n\t\t\t\tisDropdownMounted.value = true\n\n\t\t\t\tisDropdownOpen.value = true\n\t\t\t},\n\t\t\tplacement: 'bottom',\n\t\t\tpopperOptions: {\n\t\t\t\tmodifiers: [sameWidth],\n\t\t\t},\n\t\t\ttheme: 'light-border',\n\t\t\ttrigger: 'click focusin',\n\t\t\ttriggerTarget: triggerTargets?.value ?? undefined,\n\t\t})),\n\t)\n\n\tconst setIsDropdownOpen = (showTippy: boolean) => {\n\t\tif (!tippy.value) return\n\n\t\tconst tippys = castArray(tippy.value)\n\n\t\tfor (const tippy of tippys) {\n\t\t\tif (showTippy) tippy.show()\n\t\t\telse tippy.hide()\n\t\t}\n\t}\n\n\treturn {\n\t\tisDropdownMounted,\n\t\tisDropdownOpen,\n\t\tsetIsDropdownOpen,\n\t\ttippyContentRef,\n\t\ttippyRef,\n\t}\n}\n","<template>\n\t<div :class=\"containerClasses\">\n\t\t<i\n\t\t\tv-if=\"showClear\"\n\t\t\tclass=\"yoco\"\n\t\t\trole=\"button\"\n\t\t\t@click.stop=\"handleClear\"\n\t\t\tv-text=\"Yoco.Icon.CLOSE\"\n\t\t/>\n\t\t<i\n\t\t\tclass=\"yoco\"\n\t\t\trole=\"button\"\n\t\t\t@click.stop.prevent=\"handleSetIsDropdownOpen\"\n\t\t\t@mousedown.stop.prevent\n\t\t\tv-text=\"isDropdownOpen ? Yoco.Icon.CHEVRON_UP : Yoco.Icon.CHEVRON_DOWN\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nexport default defineComponent({\n\tname: 'ActionIcon',\n\tprops: {\n\t\tclasses: { required: true, type: Array as PropType<Array<string>> },\n\t\thandleClear: { required: true, type: Function as PropType<() => void> },\n\t\tisDropdownOpen: { required: true, type: Boolean },\n\t\tshowClear: { required: true, type: Boolean },\n\t},\n\temits: ['update:isDropdownOpen'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tcontainerClasses: computed(() => [\n\t\t\t\t...props.classes,\n\t\t\t\t'action-icon__container',\n\t\t\t]),\n\t\t\thandleSetIsDropdownOpen: () => {\n\t\t\t\temit('update:isDropdownOpen', !props.isDropdownOpen)\n\t\t\t},\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.action-icon__container {\n\tdisplay: flex;\n\tjustify-content: center;\n}\n</style>\n","<template>\n\t<div\n\t\tref=\"optionRef\"\n\t\t:class=\"classes\"\n\t\t:data-test=\"dataTest\"\n\t\t@click.stop=\"(e) => $emit('click', e)\"\n\t>\n\t\t<slot>\n\t\t\t{{ label }}\n\t\t</slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport { z } from 'zod'\n\nimport { makeProps } from '../../make-props'\n\nconst propsSchema = z.object({\n\tdataTest: z.string().nullable().default(null),\n\tisDisabled: z.boolean().default(false),\n\tisHovered: z.boolean().default(false),\n\tisSelected: z.boolean().default(false),\n\tlabel: z.string(),\n\ttype: z.enum(['action', 'option']),\n})\n\nexport default defineComponent({\n\tname: 'FieldSelectOptionsItem',\n\tprops: makeProps(propsSchema),\n\temits: ['click', 'scrollTo'],\n\tsetup(props, { emit }) {\n\t\tconst optionRef = ref<HTMLDivElement | null>(null)\n\n\t\twatch(\n\t\t\t() => props.isHovered,\n\t\t\t(isHovered, wasHovered) => {\n\t\t\t\tif (optionRef.value === null)\n\t\t\t\t\tthrow new Error('Unexpected Unbound option ref: null')\n\n\t\t\t\tif (isHovered && !wasHovered) {\n\t\t\t\t\tconst distanceFromParentTop = optionRef.value.offsetTop\n\n\t\t\t\t\temit('scrollTo', distanceFromParentTop)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\treturn {\n\t\t\tclasses: computed(() => ({\n\t\t\t\t[`kt-field-select-options-item--is-type-${props.type}`]: true,\n\t\t\t\t'kt-field-select-options-item': true,\n\t\t\t\t'kt-field-select-options-item--is-disabled': props.isDisabled,\n\t\t\t\t'kt-field-select-options-item--is-hovered': props.isHovered,\n\t\t\t\t'kt-field-select-options-item--is-selected': props.isSelected,\n\t\t\t})),\n\t\t\toptionRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-field-select-options-item {\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: var(--unit-2) var(--unit-4);\n\tcursor: pointer;\n\n\t&--is-disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.46;\n\t}\n\n\t&--is-selected {\n\t\tfont-weight: 700;\n\t\tcolor: var(--interactive-03);\n\t}\n\n\t&--is-type-action {\n\t\tcolor: var(--interactive-01);\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--ui-01);\n\t\t}\n\t}\n\n\t&:not(.kt-select-options-item--is-disabled) {\n\t\t&:hover,\n\t\t&.kt-field-select-options-item--is-hovered {\n\t\t\tbackground-color: var(--ui-01);\n\n\t\t\t&.kt-select-options-item--is-selected {\n\t\t\t\tcolor: var(--interactive-01-hover);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div ref=\"optionsRef\" class=\"kt-field-select-options\">\n\t\t<div v-if=\"isLoading\" class=\"kt-field-select-options__loading\">\n\t\t\t<div class=\"loading\" />\n\t\t</div>\n\t\t<FieldSelectOptionsItem\n\t\t\tv-if=\"modifiedOptions.length === 0\"\n\t\t\tdataTest=\"NO_DATA\"\n\t\t\tisDisabled\n\t\t\t:label=\"translations.noDataText\"\n\t\t\ttype=\"option\"\n\t\t\t@scrollTo=\"scrollTo\"\n\t\t/>\n\t\t<FieldSelectOptionsItem\n\t\t\tv-for=\"(option, index) in modifiedOptions\"\n\t\t\t:key=\"`option-${index}`\"\n\t\t\t:dataTest=\"option.dataTest\"\n\t\t\t:isDisabled=\"option.isDisabled\"\n\t\t\t:isHovered=\"isHovered('option', index)\"\n\t\t\t:isSelected=\"option.isSelected\"\n\t\t\t:label=\"option.label\"\n\t\t\ttype=\"option\"\n\t\t\t@click=\"() => selectOption(option)\"\n\t\t\t@scrollTo=\"scrollTo\"\n\t\t>\n\t\t\t<slot\n\t\t\t\tv-bind=\"{ index, option, select: () => selectOption(option) }\"\n\t\t\t\tname=\"option\"\n\t\t\t/>\n\t\t</FieldSelectOptionsItem>\n\t\t<div\n\t\t\tv-if=\"modifiedActions.length > 0\"\n\t\t\tclass=\"kt-field-select-options__separator\"\n\t\t/>\n\t\t<FieldSelectOptionsItem\n\t\t\tv-for=\"(action, index) in modifiedActions\"\n\t\t\t:key=\"`action-${index}`\"\n\t\t\t:dataTest=\"action.dataTest\"\n\t\t\t:isHovered=\"isHovered('action', index)\"\n\t\t\t:label=\"action.label\"\n\t\t\ttype=\"action\"\n\t\t\t@click=\"() => onAction(action)\"\n\t\t\t@scrollTo=\"scrollTo\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport camelCase from 'lodash/camelCase.js'\nimport {\n\tcomputed,\n\tdefineComponent,\n\tonBeforeMount,\n\tonUnmounted,\n\tref,\n\twatch,\n} from 'vue'\nimport { z } from 'zod'\n\nimport { useI18nContext } from '../../kotti-i18n/hooks'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { makeProps } from '../../make-props'\nimport { Shared } from '../types'\n\nimport FieldSelectOptionsItem from './OptionsItem.vue'\n\nconst propsSchema = z.object({\n\tactions: z.array(Shared.actionSchema),\n\tdataTestPrefix: z.string(),\n\tisDisabled: z.boolean().default(false),\n\tisDropdownOpen: z.boolean().default(false),\n\tisLoading: z.boolean().default(false),\n\tisMultiple: z.boolean().default(false),\n\tisUnsorted: z.boolean().default(false),\n\tmaximumSelectable: z.number().int().min(0),\n\toptions: z.array(Shared.optionSchema),\n\tvalue: z.array(Shared.valueSchema),\n})\n\ntype ModifiedAction = z.output<\n\t(typeof propsSchema)['shape']['actions']\n>[number] & {\n\tdataTest: string\n}\n\ntype ModifiedOption = z.output<\n\t(typeof propsSchema)['shape']['options']\n>[number] & {\n\tisSelected: boolean\n}\n\nconst mod = (number: number, divisor: number) =>\n\t((number % divisor) + divisor) % divisor\n\nexport default defineComponent({\n\tname: 'FieldSelectOptions',\n\tcomponents: {\n\t\tFieldSelectOptionsItem,\n\t},\n\tprops: makeProps(propsSchema),\n\temits: ['close', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst i18nContext = useI18nContext()\n\t\tconst translations = useTranslationNamespace('KtFieldSelects')\n\n\t\tconst optionsRef = ref<HTMLDivElement | null>(null)\n\n\t\tconst modifiedActions = computed(\n\t\t\t(): Array<ModifiedAction> =>\n\t\t\t\tprops.actions.map((action) => ({\n\t\t\t\t\t...action,\n\t\t\t\t\tdataTest:\n\t\t\t\t\t\taction.dataTest ??\n\t\t\t\t\t\t`${props.dataTestPrefix}.${camelCase(action.label)}`,\n\t\t\t\t})),\n\t\t)\n\n\t\tconst modifiedOptions = computed(() => {\n\t\t\tconst isLimitReached =\n\t\t\t\tprops.isMultiple && props.value.length >= props.maximumSelectable\n\n\t\t\tconst modifiedOptions: ModifiedOption[] = props.options.map((option) => {\n\t\t\t\tconst isSelected = props.value.includes(option.value)\n\n\t\t\t\treturn {\n\t\t\t\t\t...option,\n\t\t\t\t\tdataTest:\n\t\t\t\t\t\toption.dataTest ??\n\t\t\t\t\t\t`${props.dataTestPrefix}.${String(option.value)}`,\n\t\t\t\t\tisDisabled:\n\t\t\t\t\t\tprops.isDisabled ||\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- '??' is not the right choice to handle booleans\n\t\t\t\t\t\toption.isDisabled ||\n\t\t\t\t\t\t(isLimitReached && !isSelected),\n\t\t\t\t\tisSelected,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tif (props.isUnsorted) return modifiedOptions\n\n\t\t\tconst collator = new Intl.Collator(i18nContext.locale, {\n\t\t\t\tnumeric: true,\n\t\t\t\tsensitivity: 'base',\n\t\t\t})\n\n\t\t\treturn modifiedOptions.sort((a, b) => collator.compare(a.label, b.label))\n\t\t})\n\n\t\tconst hoveredIndex = ref(0)\n\t\tconst resetHoveredIndex = () => (hoveredIndex.value = 0)\n\n\t\twatch(\n\t\t\t() => props.isDropdownOpen,\n\t\t\t(isOpen) => {\n\t\t\t\tif (!isOpen) resetHoveredIndex()\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\tconst itemCount = computed(\n\t\t\t() => modifiedOptions.value.length + modifiedActions.value.length,\n\t\t)\n\n\t\twatch(\n\t\t\titemCount,\n\t\t\t(newValue, oldValue) => {\n\t\t\t\tif (newValue !== oldValue) resetHoveredIndex()\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\tconst selectOption = (option: ModifiedOption) => {\n\t\t\tif (option.isDisabled) return\n\n\t\t\tif (props.isMultiple)\n\t\t\t\temit(\n\t\t\t\t\t'input',\n\t\t\t\t\tprops.value.includes(option.value)\n\t\t\t\t\t\t? props.value.filter((v) => v !== option.value)\n\t\t\t\t\t\t: [...props.value, option.value],\n\t\t\t\t)\n\t\t\telse emit('input', [option.value])\n\t\t}\n\n\t\tconst onAction = (action: z.output<typeof Shared.actionSchema>) => {\n\t\t\temit('close')\n\n\t\t\taction.onClick()\n\t\t}\n\n\t\tconst listener = (event: KeyboardEvent) => {\n\t\t\tif (!props.isDropdownOpen) return\n\n\t\t\tswitch (event.key) {\n\t\t\t\tcase 'ArrowDown': {\n\t\t\t\t\thoveredIndex.value = mod(hoveredIndex.value + 1, itemCount.value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcase 'ArrowUp': {\n\t\t\t\t\thoveredIndex.value = mod(hoveredIndex.value - 1, itemCount.value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcase 'Enter': {\n\t\t\t\t\tconst index = hoveredIndex.value\n\t\t\t\t\tconst optionsLength = modifiedOptions.value.length\n\n\t\t\t\t\tif (index < 0) return\n\n\t\t\t\t\tif (index < optionsLength) {\n\t\t\t\t\t\tselectOption(modifiedOptions.value[index] as ModifiedOption)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tonAction(\n\t\t\t\t\t\tmodifiedActions.value[index - optionsLength] as ModifiedAction,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tonBeforeMount(() => {\n\t\t\twindow.addEventListener('keydown', listener)\n\t\t})\n\n\t\tonUnmounted(() => {\n\t\t\twindow.removeEventListener('keydown', listener)\n\t\t})\n\n\t\treturn {\n\t\t\tisHovered: (type: 'action' | 'option', index: number) => {\n\t\t\t\tconst optionsCount = props.options.length\n\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase 'action':\n\t\t\t\t\t\treturn index === hoveredIndex.value - optionsCount\n\n\t\t\t\t\tcase 'option':\n\t\t\t\t\t\treturn index === hoveredIndex.value\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error(`Options.vue: unrecognized type “${String(type)}”`)\n\t\t\t\t}\n\t\t\t},\n\t\t\tmodifiedActions,\n\t\t\tmodifiedOptions,\n\t\t\tonAction,\n\t\t\toptionsRef,\n\t\t\tscrollTo: (optionDistanceToOptionsTop: number) => {\n\t\t\t\tif (optionsRef.value === null)\n\t\t\t\t\tthrow new Error('Unexpected Unbound optionsRef: null')\n\n\t\t\t\toptionsRef.value.scrollTo({ top: optionDistanceToOptionsTop })\n\t\t\t},\n\t\t\tselectOption,\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-field/mixins.scss';\n\n.kt-field-select-options {\n\tposition: relative;\n\n\t@include prettify-scrollbar;\n\n\tmax-height: 40vh;\n\n\t/*\n\t  undo padding from theme,\n\t  alternatively fork theme and remove the left/right padding\n\t*/\n\tmargin-right: -9px;\n\tmargin-left: -9px;\n\toverflow: auto;\n\n\t&__loading {\n\t\tposition: absolute;\n\t\ttop: var(--unit-2);\n\t\tright: var(--unit-6);\n\t}\n\n\t&__separator {\n\t\theight: var(--unit-q);\n\t\tmargin: var(--unit-1) 0;\n\t\tbackground-color: var(--gray-20);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"fieldSelectClasses\">\n\t\t<div\n\t\t\tref=\"tippyRef\"\n\t\t\t@mouseenter=\"isFieldHovered = true\"\n\t\t\t@mouseleave=\"isFieldHovered = false\"\n\t\t>\n\t\t\t<KtField\n\t\t\t\tv-bind=\"{ field }\"\n\t\t\t\tref=\"ktFieldRef\"\n\t\t\t\t:getEmptyValue=\"() => (isMultiple ? [] : null)\"\n\t\t\t\t:helpTextSlot=\"helpTextSlot\"\n\t\t\t>\n\t\t\t\t<div class=\"kt-field-select__input-and-tags\">\n\t\t\t\t\t<KtTag\n\t\t\t\t\t\tv-for=\"option in visibleSelectedTags\"\n\t\t\t\t\t\t:key=\"option.value\"\n\t\t\t\t\t\tclass=\"kt-field-select__tag\"\n\t\t\t\t\t\t:isDisabled=\"field.isDisabled || Boolean(option.isDisabled)\"\n\t\t\t\t\t\t:text=\"option.label\"\n\t\t\t\t\t\t@close=\"removeTag(option.value)\"\n\t\t\t\t\t/>\n\t\t\t\t\t<KtTag\n\t\t\t\t\t\tv-if=\"collapsedTagCount > 0\"\n\t\t\t\t\t\tclass=\"kt-field-select__tag\"\n\t\t\t\t\t\tisDisabled\n\t\t\t\t\t\t:text=\"`+${collapsedTagCount}`\"\n\t\t\t\t\t/>\n\t\t\t\t\t<input\n\t\t\t\t\t\tref=\"inputRef\"\n\t\t\t\t\t\tv-bind=\"inputProps\"\n\t\t\t\t\t\t@blur=\"isFieldFocused = false\"\n\t\t\t\t\t\t@focus=\"isFieldFocused = true\"\n\t\t\t\t\t\t@input=\"updateQuery\"\n\t\t\t\t\t\t@keydown.delete=\"onPressDelete\"\n\t\t\t\t\t\t@keydown.down.prevent\n\t\t\t\t\t\t@keydown.enter.prevent\n\t\t\t\t\t\t@keydown.up.prevent\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<template #actionIcon=\"{ classes, handleClear, showClear }\">\n\t\t\t\t\t<ActionIcon\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\tclasses,\n\t\t\t\t\t\t\thandleClear,\n\t\t\t\t\t\t\tisDropdownOpen,\n\t\t\t\t\t\t\tshowClear: showClearIcon(showClear),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t@update:isDropdownOpen=\"setIsDropdownOpen\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</KtField>\n\t\t</div>\n\t\t<div ref=\"tippyContentRef\">\n\t\t\t<FieldSelectOptions\n\t\t\t\t:actions=\"actions\"\n\t\t\t\t:dataTestPrefix=\"inputProps['data-test']\"\n\t\t\t\t:isDisabled=\"field.isDisabled\"\n\t\t\t\t:isDropdownOpen=\"isDropdownOpen\"\n\t\t\t\t:isLoading=\"isLoadingOptions\"\n\t\t\t\t:isMultiple=\"isMultiple\"\n\t\t\t\t:isUnsorted=\"isUnsorted\"\n\t\t\t\t:maximumSelectable=\"maximumSelectable\"\n\t\t\t\t:options=\"filteredOptions\"\n\t\t\t\t:value=\"optionsValue\"\n\t\t\t\t@close=\"setIsDropdownOpen(false)\"\n\t\t\t\t@input=\"onOptionsInput\"\n\t\t\t>\n\t\t\t\t<template #option=\"values\">\n\t\t\t\t\t<slot v-bind=\"values\" name=\"option\" />\n\t\t\t\t</template>\n\t\t\t</FieldSelectOptions>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport { z } from 'zod'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtField } from '../../kotti-field'\nimport { useField } from '../../kotti-field/hooks'\nimport {\n\tuseEmitBlur,\n\tuseForceUpdate,\n\tuseKtFieldRef,\n} from '../../kotti-field/hooks'\nimport { KtTag } from '../../kotti-tag'\nimport { makeProps } from '../../make-props'\nimport { KOTTI_FIELD_SELECT_SUPPORTS } from '../constants'\nimport {\n\tisTippyContentWrapper,\n\tuseSelectTippy,\n} from '../hooks/use-select-tippy'\nimport type {\n\tKottiFieldMultiSelect,\n\tKottiFieldMultiSelectRemote,\n\tKottiFieldSingleSelect,\n\tKottiFieldSingleSelectRemote,\n} from '../types'\nimport { Shared } from '../types'\n\nimport ActionIcon from './ActionIcon.vue'\nimport FieldSelectOptions from './Options.vue'\n\nconst UPDATE_QUERY = 'update:query'\n\nconst propsSchema = Shared.propsSchema\n\t.merge(Shared.isMultipleSchema)\n\t.merge(Shared.isRemoteSchema)\n\t.merge(Shared.isSingleSchema)\n\t.omit({ value: true })\n\t.extend({\n\t\thelpTextSlot: z.array(z.any()).default(() => []),\n\t\tisMultiple: z.boolean().default(false),\n\t\tisRemote: z.boolean().default(false),\n\t\tvalue: z.union([\n\t\t\tShared.isMultipleSchema.shape.value,\n\t\t\tShared.isSingleSchema.shape.value,\n\t\t]),\n\t})\n\ntype MultiValue =\n\t| KottiFieldMultiSelect.Value\n\t| KottiFieldMultiSelectRemote.Value\n\ntype SingleValue =\n\t| KottiFieldSingleSelect.Value\n\t| KottiFieldSingleSelectRemote.Value\n\nexport default defineComponent({\n\tname: 'GenericSelectField',\n\tcomponents: {\n\t\tActionIcon,\n\t\tFieldSelectOptions,\n\t\tKtField,\n\t\tKtTag,\n\t},\n\tprops: makeProps(propsSchema),\n\temits: ['blur', 'emit', 'input', 'open'],\n\tsetup(props, { emit: rawEmit }) {\n\t\tconst emit = (event: string, payload: unknown) => {\n\t\t\trawEmit('emit', { event, payload })\n\t\t}\n\n\t\tconst field = useField<MultiValue | SingleValue>({\n\t\t\temit,\n\t\t\tisEmpty: (value) =>\n\t\t\t\tprops.isMultiple\n\t\t\t\t\t? (value as MultiValue).length === 0\n\t\t\t\t\t: (value as SingleValue) === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_SELECT_SUPPORTS,\n\t\t})\n\n\t\tconst inputRef = ref<HTMLInputElement | null>(null)\n\t\tconst isFieldFocused = ref(false)\n\t\tconst isFieldHovered = ref(false)\n\t\tconst localQuery = ref<string | null>(null)\n\n\t\tconst { forceUpdateKey, forceUpdate } = useForceUpdate()\n\t\tconst ktFieldRef = useKtFieldRef()\n\n\t\tconst triggerTargets = computed(() =>\n\t\t\tktFieldRef.value ? [ktFieldRef.value.inputContainerRef] : [],\n\t\t)\n\n\t\tconst { isDropdownOpen, isDropdownMounted, ...selectTippy } =\n\t\t\tuseSelectTippy(field, triggerTargets)\n\n\t\tconst deleteQuery = () => {\n\t\t\tif (props.isRemote) {\n\t\t\t\tif (props.query !== null) emit(UPDATE_QUERY, null)\n\t\t\t} else localQuery.value = null\n\t\t}\n\n\t\t/**\n\t\t * Tippy wraps the content inside additional div elements.\n\t\t * So, we need to look for the actual content element.\n\t\t */\n\t\tconst findEventTarget = (\n\t\t\ttarget: EventTarget | null,\n\t\t): EventTarget | null => {\n\t\t\tif (target === null || !(target instanceof HTMLElement)) return target\n\n\t\t\tif (target === selectTippy.tippyContentRef.value) return target\n\n\t\t\treturn isTippyContentWrapper(target)\n\t\t\t\t? findEventTarget((target.childNodes[0] ?? null) as EventTarget | null)\n\t\t\t\t: target\n\t\t}\n\t\tuseEmitBlur({\n\t\t\temit,\n\t\t\tfield,\n\t\t\tfieldTarget: computed(() => [\n\t\t\t\tktFieldRef.value?.inputContainerRef ?? null,\n\t\t\t\tselectTippy.tippyContentRef.value,\n\t\t\t]),\n\t\t\tfindEventTarget,\n\t\t})\n\n\t\twatch(\n\t\t\tisDropdownMounted,\n\t\t\t(isMounted) => {\n\t\t\t\tif (isMounted) return\n\t\t\t\tdeleteQuery()\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\twatch(\n\t\t\tisDropdownOpen,\n\t\t\t(isOpen) => {\n\t\t\t\tif (!isOpen) return\n\t\t\t\tinputRef.value?.focus()\n\t\t\t\temit('open', undefined)\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\tconst queryValue = computed(() =>\n\t\t\tprops.isRemote ? props.query : localQuery.value,\n\t\t)\n\n\t\t/**\n\t\t * keeps reference of already seen option labels so that\n\t\t * the tags can be rendered properly when filtering remotely\n\t\t */\n\t\tconst seenValueLabelMap = ref<Map<Shared.Value, Shared.Option['label']>>(\n\t\t\tnew Map(),\n\t\t)\n\n\t\twatch(\n\t\t\t() => props.options,\n\t\t\t() => {\n\t\t\t\tseenValueLabelMap.value = new Map([\n\t\t\t\t\t...seenValueLabelMap.value,\n\t\t\t\t\t...props.options.map(\n\t\t\t\t\t\t(option): [Shared.Value, Shared.Option['label']] => [\n\t\t\t\t\t\t\toption.value,\n\t\t\t\t\t\t\toption.label,\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t])\n\t\t\t},\n\t\t\t{ flush: 'post', immediate: true },\n\t\t)\n\n\t\tconst isInputVisible = computed(\n\t\t\t// save some space in multi select when tags are shown\n\t\t\t() => !props.isMultiple || isDropdownOpen.value || field.isEmpty,\n\t\t)\n\n\t\treturn {\n\t\t\tcollapsedTagCount: computed(() =>\n\t\t\t\tprops.isMultiple\n\t\t\t\t\t? (field.currentValue as MultiValue).length - props.collapseTagsAfter\n\t\t\t\t\t: 0,\n\t\t\t),\n\t\t\tfield,\n\t\t\tfieldSelectClasses: computed(() => ({\n\t\t\t\t'kt-field-select': true,\n\t\t\t\t'kt-field-select--is-input-visible': !isInputVisible.value,\n\t\t\t})),\n\t\t\tfilteredOptions: computed(() =>\n\t\t\t\tprops.isRemote\n\t\t\t\t\t? props.options\n\t\t\t\t\t: props.options.filter(\n\t\t\t\t\t\t\t(o) =>\n\t\t\t\t\t\t\t\tlocalQuery.value === null ||\n\t\t\t\t\t\t\t\to.label.toLowerCase().includes(localQuery.value.toLowerCase()),\n\t\t\t\t\t\t),\n\t\t\t),\n\t\t\tinputProps: computed(() => ({\n\t\t\t\t...field.inputProps,\n\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\tclass: ['kt-field-select__wrapper'],\n\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\tsize: 1,\n\t\t\t\ttype: 'text',\n\t\t\t\tvalue: (() => {\n\t\t\t\t\tif (isDropdownOpen.value) return queryValue.value ?? undefined\n\n\t\t\t\t\t// can't bind multiple values to input (therefore, we just bind `undefined`)\n\t\t\t\t\tif (field.currentValue === null || props.isMultiple) return undefined\n\n\t\t\t\t\treturn props.options.find(\n\t\t\t\t\t\t(option) => option.value === field.currentValue,\n\t\t\t\t\t)?.label\n\t\t\t\t})(),\n\t\t\t})),\n\t\t\tinputRef,\n\t\t\tisDropdownOpen,\n\t\t\tisFieldFocused,\n\t\t\tisFieldHovered,\n\t\t\tktFieldRef,\n\t\t\tonOptionsInput: (value: MultiValue) => {\n\t\t\t\tif (props.isMultiple) {\n\t\t\t\t\tfield.setValue(value)\n\t\t\t\t\tif (props.clearOnSelect) deleteQuery()\n\t\t\t\t} else {\n\t\t\t\t\tconst newValue = value[0] ?? null\n\t\t\t\t\t// performance optimization\n\t\t\t\t\tif (field.currentValue !== newValue) field.setValue(newValue)\n\t\t\t\t}\n\t\t\t\tinputRef.value?.focus()\n\t\t\t\t// single select: close the tippy instance whenever a selection is made.\n\t\t\t\t// This (watcher on isDropdownMounted) also intentionally resets the query\n\t\t\t\t// so that the api-call (for example) can already trigger and load the non-filtered options\n\t\t\t\tif (!props.isMultiple) selectTippy.setIsDropdownOpen(false)\n\t\t\t},\n\t\t\tonPressDelete: () => {\n\t\t\t\tif (queryValue.value || !props.isMultiple) return // only delete value if query is already empty\n\n\t\t\t\tconst value = field.currentValue as MultiValue\n\t\t\t\tif (value.length > 0) field.setValue(value.slice(0, -1))\n\t\t\t},\n\t\t\toptionsValue: computed(() => {\n\t\t\t\tif (props.isMultiple) return field.currentValue as MultiValue\n\t\t\t\telse\n\t\t\t\t\treturn field.currentValue === null\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [field.currentValue as SingleValue]\n\t\t\t}),\n\t\t\tremoveTag: (value: Shared.Option['value']) => {\n\t\t\t\tif (!props.isMultiple)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'GenericSelectField: Unexpected multi function on single select',\n\t\t\t\t\t)\n\n\t\t\t\tfield.setValue(\n\t\t\t\t\t(field.currentValue as MultiValue).filter((v) => v !== value),\n\t\t\t\t)\n\t\t\t\tinputRef.value?.focus()\n\t\t\t},\n\t\t\tsetIsDropdownOpen: selectTippy.setIsDropdownOpen,\n\t\t\tshowClearIcon: computed(\n\t\t\t\t() => (showClear: boolean) =>\n\t\t\t\t\tshowClear && (isFieldHovered.value || isFieldFocused.value),\n\t\t\t),\n\t\t\ttippyContentRef: selectTippy.tippyContentRef,\n\t\t\ttippyRef: selectTippy.tippyRef,\n\t\t\tupdateQuery: (event: Event) => {\n\t\t\t\tif (!isDropdownOpen.value) {\n\t\t\t\t\tselectTippy.setIsDropdownOpen(true)\n\t\t\t\t} else {\n\t\t\t\t\tconst value = (event.target as HTMLInputElement).value\n\t\t\t\t\tconst newValue = value === '' ? null : value\n\n\t\t\t\t\tif (props.isRemote && props.query !== newValue)\n\t\t\t\t\t\temit(UPDATE_QUERY, newValue)\n\t\t\t\t\telse localQuery.value = newValue\n\t\t\t\t}\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\tvisibleSelectedTags: computed(() =>\n\t\t\t\tprops.isMultiple\n\t\t\t\t\t? (field.currentValue as MultiValue)\n\t\t\t\t\t\t\t.filter((_, index) => index < props.collapseTagsAfter)\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(value): Shared.Option =>\n\t\t\t\t\t\t\t\t\tprops.options.find((option) => option.value === value) ?? {\n\t\t\t\t\t\t\t\t\t\tlabel: seenValueLabelMap.value.get(value) ?? String(value),\n\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t: [],\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-field-select {\n\t&:not(:last-child) {\n\t\tmargin-bottom: 0.8rem;\n\t}\n\n\t// can't rely on v-if because the field wouldn't be focusable\n\t&.kt-field-select--is-input-visible {\n\t\tposition: relative;\n\n\t\t.kt-field-select__wrapper {\n\t\t\tposition: absolute;\n\t\t\tleft: -10000px;\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t&__query {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\twidth: 100%;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tline-height: 1.6;\n\t\tborder: 0;\n\t}\n\n\t$vertical-tag-gap: 2px;\n\t$horizontal-tag-gap: 4px;\n\n\t&__input-and-tags {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\n\t\t// HACK: use negative margins to align multi-line grids of tags\n\t\tmargin: #{-$vertical-tag-gap + 4px} #{-$horizontal-tag-gap};\n\t}\n\n\t&__tag {\n\t\ttext-transform: capitalize;\n\t}\n\n\t&__wrapper {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\tmin-width: 30%;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\tline-height: 1.6;\n\t\tborder: 0;\n\t}\n}\n</style>\n","<template>\n\t<GenericSelectField\n\t\tv-bind=\"$props\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\tisMultiple\n\t\t@emit=\"onEmit\"\n\t>\n\t\t<template #option=\"values\">\n\t\t\t<slot v-bind=\"values\" name=\"option\" />\n\t\t</template>\n\t</GenericSelectField>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport GenericSelectField from './components/GenericSelectField.vue'\nimport { KottiFieldMultiSelect } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldMultiSelect',\n\tcomponents: {\n\t\tGenericSelectField,\n\t},\n\tprops: makeProps(KottiFieldMultiSelect.propsSchema),\n\tsetup(_, { emit }) {\n\t\treturn {\n\t\t\tonEmit: ({ event, payload }: { event: string; payload: unknown }) => {\n\t\t\t\temit(event, payload)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<GenericSelectField\n\t\tv-bind=\"$props\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\tisMultiple\n\t\tisRemote\n\t\t@emit=\"onEmit\"\n\t>\n\t\t<template #option=\"values\">\n\t\t\t<slot v-bind=\"values\" name=\"option\" />\n\t\t</template>\n\t</GenericSelectField>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport GenericSelectField from './components/GenericSelectField.vue'\nimport { KottiFieldMultiSelectRemote } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldMultiSelectRemote',\n\tcomponents: {\n\t\tGenericSelectField,\n\t},\n\tprops: makeProps(KottiFieldMultiSelectRemote.propsSchema),\n\tsetup(_, { emit }) {\n\t\treturn {\n\t\t\tonEmit: ({ event, payload }: { event: string; payload: unknown }) => {\n\t\t\t\temit(event, payload)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<GenericSelectField\n\t\tv-bind=\"$props\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\t@emit=\"onEmit\"\n\t>\n\t\t<template #option=\"values\">\n\t\t\t<slot v-bind=\"values\" name=\"option\" />\n\t\t</template>\n\t</GenericSelectField>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport GenericSelectField from './components/GenericSelectField.vue'\nimport { KottiFieldSingleSelect } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldSingleSelect',\n\tcomponents: {\n\t\tGenericSelectField,\n\t},\n\tprops: makeProps(KottiFieldSingleSelect.propsSchema),\n\tsetup(_, { emit }) {\n\t\treturn {\n\t\t\tonEmit: ({ event, payload }: { event: string; payload: unknown }) => {\n\t\t\t\temit(event, payload)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<GenericSelectField\n\t\tv-bind=\"$props\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t\tisRemote\n\t\t@emit=\"onEmit\"\n\t>\n\t\t<template #option=\"values\">\n\t\t\t<slot v-bind=\"values\" name=\"option\" />\n\t\t</template>\n\t</GenericSelectField>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport GenericSelectField from './components/GenericSelectField.vue'\nimport { KottiFieldSingleSelectRemote } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldSingleSelectRemote',\n\tcomponents: {\n\t\tGenericSelectField,\n\t},\n\tprops: makeProps(KottiFieldSingleSelectRemote.propsSchema),\n\tsetup(_, { emit }) {\n\t\treturn {\n\t\t\tonEmit: ({ event, payload }: { event: string; payload: unknown }) => {\n\t\t\t\temit(event, payload)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport type { Meta } from '../types/kotti'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_SELECT_SUPPORTS } from './constants'\nimport KtFieldMultiSelectVue from './KtFieldMultiSelect.vue'\nimport KtFieldMultiSelectRemoteVue from './KtFieldMultiSelectRemote.vue'\nimport KtFieldSingleSelectVue from './KtFieldSingleSelect.vue'\nimport KtFieldSingleSelectRemoteVue from './KtFieldSingleSelectRemote.vue'\nimport {\n\tKottiFieldMultiSelect,\n\tKottiFieldMultiSelectRemote,\n\tKottiFieldSingleSelect,\n\tKottiFieldSingleSelectRemote,\n} from './types'\n\nconst componentFolder = 'kotti-field-select'\nconst url =\n\t'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=428%3A3482'\n\nconst slots: Meta['slots'] = {\n\t...FIELD_META_BASE_SLOTS,\n\toption: {\n\t\tdescription: null,\n\t\tscope: {\n\t\t\tindex: {\n\t\t\t\tdescription: 'option index (after filtering)',\n\t\t\t\ttype: 'integer',\n\t\t\t},\n\t\t\toption: {\n\t\t\t\tdescription: 'the entire option entry',\n\t\t\t\ttype: 'object',\n\t\t\t},\n\t\t\tselect: {\n\t\t\t\tdescription: 'select the current option',\n\t\t\t\ttype: 'function',\n\t\t\t},\n\t\t},\n\t},\n}\n\nexport const KtFieldSingleSelect = attachMeta(\n\tmakeInstallable(KtFieldSingleSelectVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldSingleSelect',\n\t\t\tschema: KottiFieldSingleSelect.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_SELECT_SUPPORTS },\n)\n\nexport const KtFieldSingleSelectRemote = attachMeta(\n\tmakeInstallable(KtFieldSingleSelectRemoteVue),\n\t{\n\t\taddedVersion: '3.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldSingleSelectRemote',\n\t\t\tschema: KottiFieldSingleSelectRemote.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_SELECT_SUPPORTS },\n)\n\nexport const KtFieldMultiSelect = attachMeta(\n\tmakeInstallable(KtFieldMultiSelectVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldMultiSelect',\n\t\t\tschema: KottiFieldMultiSelect.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_SELECT_SUPPORTS },\n)\n\nexport const KtFieldMultiSelectRemote = attachMeta(\n\tmakeInstallable(KtFieldMultiSelectRemoteVue),\n\t{\n\t\taddedVersion: '3.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl,\n\t\t},\n\t\tslots,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldMultiSelectRemote',\n\t\t\tschema: KottiFieldMultiSelectRemote.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_SELECT_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_TEXT_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: true,\n\tdecoration: true,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field }\"\n\t\tref=\"ktFieldRef\"\n\t\t:getEmptyValue=\"() => null\"\n\t\t:helpTextSlot=\"$slots.helpText\"\n\t>\n\t\t<input v-bind=\"inputProps\" @input=\"onInput\" @keyup=\"onKeyup\" />\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { KtField } from '../kotti-field'\nimport {\n\tuseEmitBlur,\n\tuseField,\n\tuseForceUpdate,\n\tuseKtFieldRef,\n} from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport { KOTTI_FIELD_TEXT_SUPPORTS } from './constants'\nimport { KottiFieldText } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldText',\n\tcomponents: {\n\t\tKtField,\n\t},\n\tprops: makeProps(KottiFieldText.propsSchema),\n\temits: ['blur', 'input', 'keyup'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldText.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_TEXT_SUPPORTS,\n\t\t})\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\t\tconst ktFieldRef = useKtFieldRef()\n\n\t\tuseEmitBlur({\n\t\t\temit,\n\t\t\tfield,\n\t\t\tfieldTarget: computed(() => ktFieldRef.value?.inputContainerRef ?? null),\n\t\t})\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tinputProps: computed(\n\t\t\t\t(): InputHTMLAttributes & {\n\t\t\t\t\tclass: string[]\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} => ({\n\t\t\t\t\t...field.inputProps,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: ['kt-field-text__wrapper'],\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tvalue: field.currentValue ?? '',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tktFieldRef,\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst newValue = (event.target as HTMLInputElement).value\n\t\t\t\tfield.setValue(newValue === '' ? null : newValue)\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\tonKeyup: (event: KeyboardEvent) => {\n\t\t\t\temit('keyup', event)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.kt-field-text__wrapper {\n\tdisplay: flex;\n\twidth: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tline-height: 1.6;\n\tborder: 0;\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_TEXT_SUPPORTS } from './constants'\nimport KtFieldTextVue from './KtFieldText.vue'\nimport { KottiFieldText } from './types'\n\nexport const KtFieldText = attachMeta(\n\tmakeInstallable(KtFieldTextVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=415%3A4',\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldText',\n\t\t\tschema: KottiFieldText.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_TEXT_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_TEXT_AREA_SUPPORTS: KottiField.Supports = {\n\tautoComplete: true,\n\tborderless: true,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: true,\n\ttabIndex: true,\n}\n","<template>\n\t<KtField v-bind=\"{ field }\" :helpTextSlot=\"$slots.helpText\">\n\t\t<template #container>\n\t\t\t<textarea\n\t\t\t\tref=\"textareaRef\"\n\t\t\t\tv-bind=\"inputProps\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t\t@input=\"onInput\"\n\t\t\t\t@keyup=\"onKeyup\"\n\t\t\t/>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref } from 'vue'\nimport type { TextareaHTMLAttributes } from 'vue/types/jsx'\n\nimport { KtField } from '../kotti-field'\nimport { useField, useForceUpdate } from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\n\nimport { KOTTI_FIELD_TEXT_AREA_SUPPORTS } from './constants'\nimport { KottiFieldTextArea } from './types'\n\nconst HEIGHT_OFFSET = 3\n\nconst resizeTextarea = ({\n\tautoSize,\n\tmaxHeight,\n\ttextarea,\n}: {\n\tautoSize: boolean\n\tmaxHeight: number | null\n\ttextarea: HTMLTextAreaElement | null\n}) => {\n\tif (\n\t\ttextarea &&\n\t\tautoSize &&\n\t\t(!maxHeight || textarea.scrollHeight <= maxHeight)\n\t) {\n\t\ttextarea.setAttribute('style', 'height: auto')\n\t\ttextarea.setAttribute(\n\t\t\t'style',\n\t\t\t`height: ${String(textarea.scrollHeight + HEIGHT_OFFSET)}px`,\n\t\t)\n\t}\n}\n\nexport default defineComponent({\n\tname: 'KtFieldTextArea',\n\tcomponents: {\n\t\tKtField,\n\t},\n\tprops: makeProps(KottiFieldTextArea.propsSchema),\n\temits: ['blur', 'input', 'keyup'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldTextArea.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value === null,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_TEXT_AREA_SUPPORTS,\n\t\t})\n\t\tconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tinputProps: computed(\n\t\t\t\t(): TextareaHTMLAttributes & {\n\t\t\t\t\tforceUpdateKey: number\n\t\t\t\t} => ({\n\t\t\t\t\t...field.inputProps,\n\t\t\t\t\tautocomplete: props.autoComplete,\n\t\t\t\t\tclass: 'kt-field-text-area__wrapper',\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tplaceholder: props.placeholder ?? undefined,\n\t\t\t\t\trows: props.rows,\n\t\t\t\t\tvalue: field.currentValue ?? '',\n\t\t\t\t}),\n\t\t\t),\n\t\t\tonBlur: () => {\n\t\t\t\temit('blur', field.currentValue)\n\t\t\t},\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst target = event.target as HTMLTextAreaElement\n\t\t\t\tfield.setValue(target.value === '' ? null : target.value)\n\n\t\t\t\tresizeTextarea({\n\t\t\t\t\tautoSize: props.autoSize,\n\t\t\t\t\tmaxHeight: props.maxHeight,\n\t\t\t\t\ttextarea: target,\n\t\t\t\t})\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\tonKeyup: (event: KeyboardEvent) => {\n\t\t\t\temit('keyup', event)\n\t\t\t},\n\t\t\ttextareaRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-field/mixins';\n\n.kt-field-text-area {\n\t$vertical-padding: 0.6em;\n\n\t&__wrapper {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\tmin-height: calc(#{$vertical-padding} * 2 + 1rem);\n\t\tpadding: $vertical-padding 0.8em;\n\t\tmargin: 0;\n\t\tresize: vertical;\n\t\tborder: 1px solid var(--ui-02);\n\t\tborder-radius: var(--field-border-radius);\n\n\t\t@include prettify-scrollbar;\n\t}\n}\n\n.kt-field__wrapper {\n\t@include validations using ($type) {\n\t\t&:not(.kt-field__wrapper--disabled) {\n\t\t\t@if $type != empty {\n\t\t\t\t&.kt-field__wrapper--is-borderless {\n\t\t\t\t\t.kt-field-text-area__wrapper {\n\t\t\t\t\t\tbackground-color: rgb(from var(--support-#{$type}-bg) r g b / 25%);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&:not(.kt-field__wrapper--is-borderless) {\n\t\t\t\t\t.kt-field-text-area__wrapper {\n\t\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&:focus-within {\n\t\t\t\t--support-empty-light: var(--interactive-05);\n\n\t\t\t\t.kt-field-text-area__wrapper {\n\t\t\t\t\tbackground-color: unset;\n\t\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t\t\tbox-shadow: 0 0 0 1px var(--support-#{$type}-light);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-field-text-area__wrapper:not(:focus-within):hover {\n\t\t\t\t--support-empty-bg: var(--interactive-02-hover);\n\t\t\t\t--support-empty-light: var(--interactive-04);\n\n\t\t\t\tbackground-color: var(--support-#{$type}-bg);\n\t\t\t\tborder-color: var(--support-#{$type}-light);\n\t\t\t}\n\t\t}\n\t}\n\n\t&--disabled {\n\t\t.kt-field-text-area__wrapper {\n\t\t\tborder-color: var(--ui-01);\n\t\t}\n\t}\n\n\t&--is-borderless {\n\t\t.kt-field-text-area__wrapper {\n\t\t\tbackground-color: rgb(from var(--gray-20) r g b / 25%);\n\t\t\tborder-color: transparent;\n\t\t}\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_TEXT_AREA_SUPPORTS } from './constants'\nimport KtFieldTextAreaVue from './KtFieldTextArea.vue'\nimport { KottiFieldTextArea } from './types'\n\nexport const KtFieldTextArea = attachMeta(\n\tmakeInstallable(KtFieldTextAreaVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: {\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=436%3A2104',\n\t\t},\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldTextArea',\n\t\t\tschema: KottiFieldTextArea.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_TEXT_AREA_SUPPORTS },\n)\n\nexport * from './constants'\n","import type { KottiField } from '../kotti-field/types'\n\nexport const KOTTI_FIELD_TOGGLE_SUPPORTS: KottiField.Supports = {\n\tautoComplete: false,\n\tborderless: false,\n\tclear: false,\n\tdecoration: false,\n\tplaceholder: false,\n\ttabIndex: true,\n}\n","<template>\n\t<div class=\"kt-field-toggle-box\">\n\t\t<svg\n\t\t\tfill=\"none\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\twidth=\"16\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tclass=\"kt-field-toggle-box__empty\"\n\t\t\t\theight=\"15\"\n\t\t\t\trx=\"0.5\"\n\t\t\t\twidth=\"15\"\n\t\t\t\tx=\"0.5\"\n\t\t\t\ty=\"0.5\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tclass=\"kt-field-toggle-box__indeterminate\"\n\t\t\t\td=\"M15 0H1C0.45 0 0 0.45 0 1V15C0 15.55 0.45 16 1 16H15C15.55 16 16 15.55 16 15V1C16 0.45 15.55 0 15 0ZM12 9H4C3.45 9 3 8.55 3 8C3 7.45 3.45 7 4 7H12C12.55 7 13 7.45 13 8C13 8.55 12.55 9 12 9Z\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tclass=\"kt-field-toggle-box__check\"\n\t\t\t\td=\"M15 0H1C0.45 0 0 0.45 0 1V15C0 15.55 0.45 16 1 16H15C15.55 16 16 15.55 16 15V1C16 0.45 15.55 0 15 0ZM12.71 5.71L6.5 11.92L3.29 8.71C2.9 8.32 2.9 7.69 3.29 7.3C3.68 6.91 4.31 6.91 4.7 7.3L6.49 9.09L11.28 4.3C11.67 3.91 12.3 3.91 12.69 4.3C13.08 4.69 13.08 5.32 12.69 5.71H12.71Z\"\n\t\t\t/>\n\t\t</svg>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n\tname: 'ToggleBox',\n})\n</script>\n\n<style lang=\"scss\">\n@import '../../kotti-field/mixins';\n\n@mixin toggle-colors($fill-color) {\n\t.kt-field-toggle-box__empty {\n\t\tstroke: $fill-color;\n\t}\n\n\t.kt-field-toggle-box__check,\n\t.kt-field-toggle-box__indeterminate {\n\t\tfill: $fill-color;\n\t}\n}\n\n.kt-field-toggle-box {\n\tdisplay: flex;\n\tflex-shrink: 0;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 0.8rem;\n\theight: 0.8rem;\n\tbackground: var(--ui-background);\n\tborder: 1px solid transparent;\n\ttransition: border-color ease-in-out var(--transition-short);\n\n\t&__check,\n\t&__indetermiate {\n\t\ttransition: all ease-in-out var(--transition-short);\n\t}\n\n\t&__inner {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: transparent;\n\t\ttransition: all ease-in-out var(--transition-short);\n\t}\n\n\t&:focus {\n\t\tbackground-color: red;\n\t}\n}\n\n.kt-field-toggle-inner {\n\t&--is-off {\n\t\t.kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--text-05));\n\n\t\t\t&:hover {\n\t\t\t\t@include toggle-colors(var(--interactive-01-hover));\n\t\t\t}\n\n\t\t\t&:active {\n\t\t\t\t@include toggle-colors(var(--interactive-01-active));\n\t\t\t}\n\n\t\t\t&__check {\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: scale(0);\n\t\t\t}\n\n\t\t\t&__indeterminate {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--is-on {\n\t\t.kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--interactive-03));\n\n\t\t\t&:hover {\n\t\t\t\t@include toggle-colors(var(--interactive-01-hover));\n\t\t\t}\n\n\t\t\t&:active {\n\t\t\t\t@include toggle-colors(var(--interactive-01-active));\n\t\t\t}\n\n\t\t\t&__check {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\n\t\t\t&__indeterminate {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--is-indeterminate {\n\t\t.kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--interactive-03));\n\n\t\t\t&:hover {\n\t\t\t\t@include toggle-colors(var(--interactive-01-hover));\n\t\t\t}\n\n\t\t\t&:active {\n\t\t\t\t@include toggle-colors(var(--interactive-01-active));\n\t\t\t}\n\n\t\t\t&__check {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t&__indeterminate {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: scale(1);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.kt-field__wrapper {\n\t@include validations using ($type) {\n\t\t@if $type != empty {\n\t\t\t.kt-field-toggle-inner {\n\t\t\t\t&--is-indeterminate:not(.kt-field-toggle-inner--is-disabled) {\n\t\t\t\t\t.kt-field-toggle-box {\n\t\t\t\t\t\t@include toggle-colors(var(--support-#{$type}-light));\n\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\t@include toggle-colors(var(--support-#{$type}-dark));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&--is-off:not(.kt-field-toggle-inner--is-disabled),\n\t\t\t\t&--is-on:not(.kt-field-toggle-inner--is-disabled) {\n\t\t\t\t\t.kt-field-toggle-box {\n\t\t\t\t\t\t/* stylelint-disable */\n\t\t\t\t\t\t@include toggle-colors(var(--support-#{$type}));\n\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\t@include toggle-colors(var(--support-#{$type}-dark));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* stylelint-enable */\n\t\t\t}\n\t\t}\n\t}\n}\n\n.kt-field-toggle-inner--is-disabled {\n\t&.kt-field-toggle-inner {\n\t\t&--is-indeterminate .kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--text-05));\n\t\t}\n\n\t\t&--is-off .kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--text-05));\n\n\t\t\tbackground-color: var(--ui-01);\n\t\t}\n\n\t\t&--is-on .kt-field-toggle-box {\n\t\t\t@include toggle-colors(var(--text-05));\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-field-toggle-switch\">\n\t\t<div class=\"kt-field-toggle-switch__inner\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n\tname: 'ToggleSwitch',\n})\n</script>\n\n<style lang=\"scss\">\n@import '../../kotti-field/mixins';\n\n$outer-size: 20px;\n$inner-size: 16px;\n$inner-gap: ($outer-size - $inner-size) * 0.5;\n$track-width: $inner-size * 2.25;\n\n@mixin switch-colors($outer-color, $inner-color) {\n\t.kt-field-toggle-switch {\n\t\tbackground-color: $outer-color;\n\n\t\t&__inner {\n\t\t\tbackground-color: $inner-color;\n\t\t}\n\t}\n}\n\n.kt-field-toggle-switch {\n\twidth: #{$track-width + 2 * $inner-gap};\n\theight: $outer-size;\n\tpadding: $inner-gap;\n\tbackground-color: var(--ui-02);\n\tborder-radius: #{$outer-size * 0.5};\n\n\t&__inner {\n\t\twidth: $inner-size;\n\t\theight: $inner-size;\n\t\tborder-radius: $inner-size * 0.5;\n\t\ttransition: all 0.2s ease-in-out;\n\t}\n}\n\n.kt-field-toggle-inner {\n\t&--is-indeterminate {\n\t\t@include switch-colors(var(--interactive-01), var(--interactive-04));\n\n\t\t.kt-field-toggle-switch__inner {\n\t\t\twidth: $track-width;\n\t\t}\n\n\t\t&:hover {\n\t\t\t@include switch-colors(\n\t\t\t\tvar(--interactive-01-hover),\n\t\t\t\tvar(--interactive-01-hover)\n\t\t\t);\n\t\t}\n\n\t\t&:active {\n\t\t\t@include switch-colors(\n\t\t\t\tvar(--interactive-01-active),\n\t\t\t\tvar(--interactive-01-active)\n\t\t\t);\n\t\t}\n\t}\n\n\t&--is-off {\n\t\t@include switch-colors(var(--ui-02), var(--white));\n\n\t\t.kt-field-toggle-switch__inner {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t&:hover {\n\t\t\t@include switch-colors(var(--ui-03), var(--white));\n\t\t}\n\n\t\t&:active {\n\t\t\t@include switch-colors(var(--ui-04), var(--white));\n\t\t}\n\t}\n\n\t&--is-on {\n\t\t@include switch-colors(var(--interactive-03), var(--white));\n\n\t\t.kt-field-toggle-switch__inner {\n\t\t\tmargin-left: #{$track-width - $inner-size};\n\t\t}\n\n\t\t&:hover {\n\t\t\t@include switch-colors(var(--interactive-01-hover), var(--white));\n\t\t}\n\n\t\t&:active {\n\t\t\t@include switch-colors(var(--interactive-01-active), var(--white));\n\t\t}\n\t}\n}\n\n.kt-field-toggle-inner--is-disabled {\n\t&.kt-field-toggle-inner {\n\t\t&--is-indeterminate {\n\t\t\t@include switch-colors(var(--text-05), var(--ui-02));\n\t\t}\n\n\t\t&--is-off {\n\t\t\t@include switch-colors(var(--text-05), var(--ui-01));\n\t\t}\n\n\t\t&--is-on {\n\t\t\t@include switch-colors(var(--text-05), var(--ui-01));\n\t\t}\n\t}\n}\n\n.kt-field__wrapper {\n\t@include validations using ($type) {\n\t\t@if $type != empty {\n\t\t\t:not(.kt-field-toggle-inner--is-disabled) .kt-field-toggle-switch {\n\t\t\t\t@include switch-colors(\n\t\t\t\t\tvar(--support-#{$type}),\n\t\t\t\t\tvar(--support-#{$type}-dark)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"component\"\n\t\tclass=\"kt-field-toggle-inner\"\n\t\t:class=\"toggleClasses\"\n\t>\n\t\t<input\n\t\t\tv-bind=\"inputProps\"\n\t\t\t:checked=\"value === true\"\n\t\t\t:tabindex=\"isDisabled ? -1 : undefined\"\n\t\t\ttype=\"checkbox\"\n\t\t\t@change=\"onInput\"\n\t\t/>\n\t\t<component :is=\"svgComponent.is\" :class=\"svgComponent.class\" />\n\t\t<slot name=\"default\" />\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType } from 'vue'\nimport type { InputHTMLAttributes } from 'vue/types/jsx'\n\nimport { KottiFieldToggle } from '../../kotti-field-toggle/types'\nimport type { KottiField } from '../../kotti-field/types'\n\nimport ToggleBox from './ToggleBox.vue'\nimport ToggleSwitch from './ToggleSwitch.vue'\n\nexport default defineComponent({\n\tname: 'ToggleInner',\n\tcomponents: { ToggleBox, ToggleSwitch },\n\tprops: {\n\t\tcomponent: { required: true, type: String },\n\t\tinputProps: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiField.Hook.Returns<KottiFieldToggle.Value>['inputProps']\n\t\t\t>,\n\t\t},\n\t\tisDisabled: { required: true, type: Boolean },\n\t\ttype: { default: 'checkbox', type: String },\n\t\tvalue: { default: null, type: Boolean as PropType<boolean | null> },\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tonInput: (event: Event) => {\n\t\t\t\tconst newValue = (event.target as InputHTMLAttributes).checked\n\n\t\t\t\tif (!props.isDisabled) emit('input', newValue)\n\t\t\t},\n\t\t\tsvgComponent: computed(() => {\n\t\t\t\tconst isBox = props.type === KottiFieldToggle.Shared.Type.CHECKBOX\n\t\t\t\treturn {\n\t\t\t\t\tclass: {\n\t\t\t\t\t\t'kt-field-toggle-inner__svg': true,\n\t\t\t\t\t\t'kt-field-toggle-inner__svg--is-box': isBox,\n\t\t\t\t\t\t'kt-field-toggle-inner__svg--is-switch': !isBox,\n\t\t\t\t\t},\n\t\t\t\t\tis: isBox ? ToggleBox.name : ToggleSwitch.name,\n\t\t\t\t}\n\t\t\t}),\n\t\t\ttoggleClasses: computed(() => ({\n\t\t\t\t'kt-field-toggle-inner--is-disabled': props.isDisabled,\n\t\t\t\t'kt-field-toggle-inner--is-indeterminate': props.value === null,\n\t\t\t\t'kt-field-toggle-inner--is-off': props.value === false,\n\t\t\t\t'kt-field-toggle-inner--is-on': props.value === true,\n\t\t\t})),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n:root {\n\t--toggle-border-radius: 1px;\n}\n\n.kt-field-toggle-inner {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tcursor: pointer;\n\n\tinput {\n\t\tdisplay: none;\n\n\t\t&:focus + .kt-field-toggle-inner__svg--is-box {\n\t\t\toutline: 1px solid var(--primary-50);\n\t\t\toutline-offset: 3px;\n\t\t}\n\n\t\t&:focus:not(:focus-visible) + .kt-field-toggle-inner__svg--is-box {\n\t\t\toutline: none;\n\t\t}\n\n\t\t&:focus + .kt-field-toggle-inner__svg--is-switch {\n\t\t\toutline: 1px solid var(--primary-50);\n\t\t\toutline-offset: 1px;\n\t\t}\n\n\t\t&:focus:not(:focus-visible) + .kt-field-toggle-inner__svg--is-switch {\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t&--is-disabled {\n\t\tcolor: var(--text-05);\n\t\tcursor: not-allowed;\n\t}\n\n\t&__svg {\n\t\tmargin-right: var(--unit-2);\n\t}\n}\n</style>\n","<template>\n\t<KtField\n\t\tv-bind=\"{ field: fieldProps }\"\n\t\t:helpTextSlot=\"showHelpTextAsInnerSuffix ? undefined : $slots.helpText\"\n\t\tuseFieldset\n\t>\n\t\t<template #container>\n\t\t\t<div class=\"kt-field-toggle\">\n\t\t\t\t<ToggleInner\n\t\t\t\t\tcomponent=\"label\"\n\t\t\t\t\t:inputProps=\"inputProps\"\n\t\t\t\t\t:isDisabled=\"fieldProps.isDisabled\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:value=\"fieldProps.currentValue\"\n\t\t\t\t\t@input=\"onInput\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"kt-field-toggle__content\">\n\t\t\t\t\t\t<slot name=\"default\" :value=\"fieldProps.currentValue\" />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"showHelpTextAsInnerSuffix\"\n\t\t\t\t\t\t\tclass=\"kt-field__header kt-field__header--is-suffix\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"kt-field__header__label\">\n\t\t\t\t\t\t\t\t<span :class=\"labelSuffixClasses\" v-text=\"labelSuffix\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</ToggleInner>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"showHelpTextAsInnerSuffix && hasHelpText\"\n\t\t\t\t\tclass=\"kt-field__header kt-field__header--is-suffix\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"kt-field__header__help-text\"\n\t\t\t\t\t\t:class=\"iconClasses('header__help-text', ['interactive'])\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<FieldHelpText\n\t\t\t\t\t\t\t:helpText=\"helpText\"\n\t\t\t\t\t\t\t:helpTextSlot=\"$slots.helpText\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport FieldHelpText from '../kotti-field/components/FieldHelpText.vue'\nimport { useField, useForceUpdate } from '../kotti-field/hooks'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { makeProps } from '../make-props'\nimport ToggleInner from '../shared-components/toggle-inner/ToggleInner.vue'\n\nimport { KOTTI_FIELD_TOGGLE_SUPPORTS } from './constants'\nimport { KottiFieldToggle } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldToggle',\n\tcomponents: {\n\t\tFieldHelpText,\n\t\tKtField,\n\t\tToggleInner,\n\t},\n\tprops: makeProps(KottiFieldToggle.propsSchema),\n\temits: ['input'],\n\tsetup(props, { emit, slots }) {\n\t\tconst field = useField<KottiFieldToggle.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) => value !== true,\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_TOGGLE_SUPPORTS,\n\t\t})\n\t\tconst helpText = computed(() => field.helpText)\n\t\tconst showHelpTextAsInnerSuffix = computed(\n\t\t\t() => Boolean(slots.default) && props.label === null,\n\t\t)\n\n\t\tconst validationType = computed(() => field.validation.type)\n\t\tconst showValidation = computed(\n\t\t\t() => !(field.hideValidation || validationType.value === 'empty'),\n\t\t)\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\t\tconst translations = useTranslationNamespace('KtFields')\n\n\t\treturn {\n\t\t\tfieldProps: computed(() => ({\n\t\t\t\t...field,\n\t\t\t\thelpText: showHelpTextAsInnerSuffix.value ? null : helpText.value,\n\t\t\t})),\n\t\t\thasHelpText: computed(\n\t\t\t\t() => Boolean(slots.helpText) || helpText.value !== null,\n\t\t\t),\n\t\t\ticonClasses: computed(\n\t\t\t\t() => (element: string, modifications: string[]) => [\n\t\t\t\t\t`kt-field__${element}__icon`,\n\t\t\t\t\t...modifications.map(\n\t\t\t\t\t\t(modification) => `kt-field__${element}__icon--${modification}`,\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t),\n\t\t\tinputProps: computed(() => ({\n\t\t\t\t...field.inputProps,\n\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t})),\n\t\t\tlabelSuffix: computed(() =>\n\t\t\t\tfield.isOptional ? `(${translations.value.optionalLabel})` : '*',\n\t\t\t),\n\t\t\tlabelSuffixClasses: computed(() => {\n\t\t\t\treturn {\n\t\t\t\t\t'kt-field__header__label__suffix': true,\n\t\t\t\t\t'kt-field__header__label__suffix--error':\n\t\t\t\t\t\tshowValidation.value && !field.isOptional && field.isEmpty,\n\t\t\t\t}\n\t\t\t}),\n\t\t\tonInput: (newValue: boolean | undefined) => {\n\t\t\t\tif (!field.isDisabled && !field.isLoading)\n\t\t\t\t\tfield.setValue(newValue ?? null)\n\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\tshowHelpTextAsInnerSuffix,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.kt-field-toggle {\n\tdisplay: flex;\n\talign-items: center;\n\n\t&__content {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.kt-field-toggle-inner__svg {\n\t\tflex-shrink: 0;\n\t}\n\n\t.kt-field-toggle-inner__svg--is-box {\n\t\t// align checkbox with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-8px) Put it up half the height of the checkbox height (16px)\n\t\ttransform: translateY(calc(0.75em - 8px));\n\t}\n\n\t.kt-field-toggle-inner__svg--is-switch {\n\t\t// align switch with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-10px) Put it up half the height of the switch height (20px)\n\t\ttransform: translateY(calc(0.75em - 10px));\n\t}\n}\n</style>\n","<template>\n\t<KtField v-bind=\"{ field }\" :helpTextSlot=\"$slots.helpText\" useFieldset>\n\t\t<template #container>\n\t\t\t<div :class=\"wrapperClasses\">\n\t\t\t\t<div v-for=\"(option, index) of optionsWithChecked\" :key=\"option.key\">\n\t\t\t\t\t<div class=\"kt-field-toggle-group__header\">\n\t\t\t\t\t\t<ToggleInner\n\t\t\t\t\t\t\tcomponent=\"label\"\n\t\t\t\t\t\t\t:data-test=\"getOptionDataTest(option)\"\n\t\t\t\t\t\t\t:inputProps=\"inputProps(index)\"\n\t\t\t\t\t\t\t:isDisabled=\"field.isDisabled || Boolean(option.isDisabled)\"\n\t\t\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t\t\t:value=\"option.value\"\n\t\t\t\t\t\t\t@input=\"onInput(option.key, $event)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<slot name=\"header\" :option=\"option\">\n\t\t\t\t\t\t\t\t<div v-text=\"option.label\" />\n\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t</ToggleInner>\n\t\t\t\t\t\t<FieldHelpText\n\t\t\t\t\t\t\tv-if=\"option.tooltip\"\n\t\t\t\t\t\t\tclass=\"kt-field-toggle-group__header-tooltip\"\n\t\t\t\t\t\t\t:helpText=\"option.tooltip\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<slot name=\"headerSide\" :option=\"option\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"kt-field-toggle-group__content\">\n\t\t\t\t\t\t<slot name=\"content\" :option=\"option\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</KtField>\n</template>\n\n<script lang=\"ts\">\nimport omit from 'lodash/omit.js'\nimport { computed, defineComponent } from 'vue'\n\nimport { KtField } from '../kotti-field'\nimport FieldHelpText from '../kotti-field/components/FieldHelpText.vue'\nimport { useField, useForceUpdate } from '../kotti-field/hooks'\nimport { makeProps } from '../make-props'\nimport ToggleInner from '../shared-components/toggle-inner/ToggleInner.vue'\n\nimport { KOTTI_FIELD_TOGGLE_SUPPORTS } from './constants'\nimport { KottiFieldToggleGroup } from './types'\n\nexport default defineComponent({\n\tname: 'KtFieldToggleGroup',\n\tcomponents: {\n\t\tFieldHelpText,\n\t\tKtField,\n\t\tToggleInner,\n\t},\n\tprops: makeProps(KottiFieldToggleGroup.propsSchema),\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst field = useField<KottiFieldToggleGroup.Value>({\n\t\t\temit,\n\t\t\tisEmpty: (value) =>\n\t\t\t\tvalue !== null &&\n\t\t\t\ttypeof value === 'object' &&\n\t\t\t\tObject.values(value).every((value) => value !== true),\n\t\t\tprops,\n\t\t\tsupports: KOTTI_FIELD_TOGGLE_SUPPORTS,\n\t\t})\n\n\t\tconst { forceUpdate, forceUpdateKey } = useForceUpdate()\n\n\t\treturn {\n\t\t\tfield,\n\t\t\tgetOptionDataTest: (option: KottiFieldToggleGroup.Entry) => {\n\t\t\t\tif (option.dataTest) return option.dataTest\n\n\t\t\t\tif (Object.keys(field.inputProps).includes('data-test')) {\n\t\t\t\t\treturn [field.inputProps['data-test'], option.key].join('.')\n\t\t\t\t}\n\t\t\t},\n\t\t\tinputProps: computed(() => (index: number) => {\n\t\t\t\treturn {\n\t\t\t\t\t...omit(field.inputProps, 'id'),\n\t\t\t\t\tforceUpdateKey: forceUpdateKey.value,\n\t\t\t\t\tid: `${field.inputProps.id}-${String(index)}`,\n\t\t\t\t}\n\t\t\t}),\n\t\t\tonInput: (\n\t\t\t\tkey: KottiFieldToggleGroup.Entry['key'],\n\t\t\t\tnewValue: boolean | undefined,\n\t\t\t) => {\n\t\t\t\tfield.setValue({\n\t\t\t\t\t...field.currentValue,\n\t\t\t\t\t[key]: newValue ?? null,\n\t\t\t\t})\n\t\t\t\tforceUpdate()\n\t\t\t},\n\t\t\toptionsWithChecked: computed(() =>\n\t\t\t\tprops.options.map((option) => ({\n\t\t\t\t\t...option,\n\t\t\t\t\tvalue: field.currentValue ? field.currentValue[option.key] : null,\n\t\t\t\t})),\n\t\t\t),\n\t\t\twrapperClasses: computed(() => ({\n\t\t\t\t'kt-field-toggle-group': true,\n\t\t\t\t'kt-field-toggle-group--inline': props.isInline,\n\t\t\t})),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n.kt-field-toggle-group {\n\tdisplay: flex;\n\tflex: 1;\n\n\t&--inline {\n\t\tflex-direction: row;\n\n\t\t> *:not(:first-child) {\n\t\t\tmargin-left: 1rem;\n\t\t}\n\t}\n\n\t&:not(&--inline) {\n\t\tflex-direction: column;\n\n\t\t> *:not(:first-child) {\n\t\t\tmargin-top: 0.4rem;\n\t\t}\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\t> *:not(:last-child) {\n\t\t\tmargin-right: 0.3rem;\n\t\t}\n\t}\n\n\t&__header-tooltip {\n\t\t// align tooltip icon with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-6px) Put it up half the height of the roolrip height (12px)\n\t\ttransform: translateY(calc(0.75em - 6px));\n\t}\n\n\t&__content {\n\t\tfont-size: var(--font-size-small);\n\t}\n\n\t.kt-field-toggle-inner__svg {\n\t\tflex-shrink: 0;\n\t}\n\n\t.kt-field-toggle-inner__svg--is-box {\n\t\t// align checkbox with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-8px) Put it up half the height of the checkbox height (16px)\n\t\ttransform: translateY(calc(0.75em - 8px));\n\t}\n\n\t.kt-field-toggle-inner__svg--is-switch {\n\t\t// align switch with the center of the first line of the label\n\t\t// (assumption: font-size comes from common parent element)\n\t\t//  > starting point is upper end of the container (flex-start)\n\t\t//  > (+0.75em) Put upper edge of element into center (since line-height = 1.5 * font-size)\n\t\t//  > (-10px) Put it up half the height of the switch height (20px)\n\t\ttransform: translateY(calc(0.75em - 10px));\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport type { Kotti } from '../types'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KOTTI_FIELD_TOGGLE_SUPPORTS } from './constants'\nimport KtFieldToggleVue from './KtFieldToggle.vue'\nimport KtFieldToggleGroupVue from './KtFieldToggleGroup.vue'\nimport { KottiFieldToggle, KottiFieldToggleGroup } from './types'\n\nconst componentFolder = 'kotti-field-toggle'\n\nconst designs: Kotti.Meta['designs'] = [\n\t{\n\t\ttitle: 'type=switch',\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=436%3A1847',\n\t},\n\t{\n\t\ttitle: 'type=checkbox',\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=435%3A3497',\n\t},\n]\n\nexport const KtFieldToggle = attachMeta(\n\tmakeInstallable(KtFieldToggleVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns,\n\t\tslots: {\n\t\t\t...FIELD_META_BASE_SLOTS,\n\t\t\tdefault: {\n\t\t\t\tdescription: 'Shown next to toggle sausage',\n\t\t\t\tscope: null,\n\t\t\t},\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldToggle',\n\t\t\tschema: KottiFieldToggle.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_TOGGLE_SUPPORTS },\n)\n\nexport const KtFieldToggleGroup = attachMeta(\n\tmakeInstallable(KtFieldToggleGroupVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tcomponentFolder,\n\t\tdeprecated: null,\n\t\tdesigns,\n\t\tslots: FIELD_META_BASE_SLOTS,\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FieldToggleGroup',\n\t\t\tschema: KottiFieldToggleGroup.propsSchema,\n\t\t},\n\t},\n\t{ supports: KOTTI_FIELD_TOGGLE_SUPPORTS },\n)\n\nexport * from './constants'\n","<template>\n\t<ItemLayout :isInternal=\"fileInfo.isInternal\" :name=\"fileInfo.name\">\n\t\t<template #description>\n\t\t\t<i v-if=\"isError\" class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_ATTENTION\" />\n\t\t\t<div v-else-if=\"isLoading\" class=\"description-spinner loading inline\" />\n\t\t\t{{ description }}\n\t\t</template>\n\t\t<template #actions>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showViewOrDownloadAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.viewOrDownloadButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"viewOrDownloadActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickViewOrDownload\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\tv-if=\"showRetryAction\"\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest ? `${dataTest}.${fileInfo.id}.retryButton` : undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"Yoco.Icon.RELOAD\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickRetry\"\n\t\t\t/>\n\t\t\t<ActionButton\n\t\t\t\t:data-test=\"\n\t\t\t\t\tdataTest\n\t\t\t\t\t\t? `${dataTest}.${fileInfo.id}.cancelOrDeleteButton`\n\t\t\t\t\t\t: undefined\n\t\t\t\t\"\n\t\t\t\t:icon=\"cancelOrDeleteActionIcon\"\n\t\t\t\t:isDisabled=\"isDisabled\"\n\t\t\t\t@click=\"onClickCancelOrDelete\"\n\t\t\t/>\n\t\t</template>\n\t\t<template #footer>\n\t\t\t<ProgressBar\n\t\t\t\tv-if=\"showProgressBar\"\n\t\t\t\t:key=\"progressBarForceRenderKey\"\n\t\t\t\t:isError=\"isError\"\n\t\t\t\t:progress=\"progress\"\n\t\t\t/>\n\t\t</template>\n\t</ItemLayout>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType, ref } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport ActionButton from '../../kotti-field-file-upload/components/ActionButton.vue'\nimport ItemLayout from '../../kotti-field-file-upload/components/ItemLayout.vue'\nimport ProgressBar from '../../kotti-field-file-upload/components/ProgressBar.vue'\nimport { formatFileSize } from '../../kotti-field-file-upload/formatters'\nimport { validateFile } from '../../kotti-field-file-upload/validators'\nimport { KottiFileUpload } from '../../kotti-file-upload/types'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\n\nexport default defineComponent({\n\tname: 'UploadedFileItem',\n\tcomponents: {\n\t\tActionButton,\n\t\tItemLayout,\n\t\tProgressBar,\n\t},\n\tprops: {\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\textensions: {\n\t\t\tdefault: () => [],\n\t\t\ttype: Array as PropType<Array<string>>,\n\t\t},\n\t\tfileInfo: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiFileUpload.FileInfo>,\n\t\t},\n\t\tisDisabled: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tmaxFileSize: {\n\t\t\tdefault: Number.MAX_SAFE_INTEGER,\n\t\t\ttype: Number,\n\t\t},\n\t},\n\temits: ['cancelUpload', 'deleteFile', 'restartUpload'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFieldFileUpload')\n\n\t\tconst progressBarForceRenderKey = ref<number>(0)\n\n\t\tconst status = computed<KottiFileUpload.Status>(() => {\n\t\t\tconst { status } = props.fileInfo\n\t\t\tif (typeof status === 'object') {\n\t\t\t\tif (status.type === 'error') return KottiFileUpload.Status.ERROR\n\n\t\t\t\treturn KottiFileUpload.Status.UPLOADED\n\t\t\t}\n\n\t\t\treturn status\n\t\t})\n\n\t\tconst validation = computed<KottiFileUpload.Validation>(() => {\n\t\t\tif (props.fileInfo.validation) return props.fileInfo.validation\n\n\t\t\tif (\n\t\t\t\tprops.fileInfo.status === KottiFileUpload.Status.NOT_STARTED &&\n\t\t\t\tprops.fileInfo.size !== undefined\n\t\t\t)\n\t\t\t\treturn validateFile({\n\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\tfileName: props.fileInfo.name,\n\t\t\t\t\tfileSize: props.fileInfo.size,\n\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t})\n\n\t\t\treturn KottiFileUpload.Validation.SUCCESS\n\t\t})\n\t\tconst statusText = computed(() => {\n\t\t\tconst { status } = props.fileInfo\n\t\t\tif (typeof status === 'object') return status.label\n\n\t\t\treturn validation.value === KottiFileUpload.Validation.SUCCESS\n\t\t\t\t? translations.value.statusMsg[status as KottiFileUpload.Status]\n\t\t\t\t: translations.value.validationMsg[validation.value]\n\t\t})\n\n\t\tconst isDeletable = computed(\n\t\t\t() =>\n\t\t\t\tvalidation.value !== KottiFileUpload.Validation.SUCCESS ||\n\t\t\t\t[\n\t\t\t\t\tKottiFileUpload.Status.CANCELED,\n\t\t\t\t\tKottiFileUpload.Status.ERROR,\n\t\t\t\t\tKottiFileUpload.Status.INVALID,\n\t\t\t\t\tKottiFileUpload.Status.UPLOADED,\n\t\t\t\t\tKottiFileUpload.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t].includes(status.value),\n\t\t)\n\n\t\treturn {\n\t\t\tcancelOrDeleteActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tisDeletable.value ? Yoco.Icon.TRASH : Yoco.Icon.CLOSE,\n\t\t\t),\n\t\t\tdescription: computed(() => {\n\t\t\t\tconst { size } = props.fileInfo\n\t\t\t\tif (size === undefined) return statusText.value\n\n\t\t\t\treturn [formatFileSize(size), statusText.value].join(' - ')\n\t\t\t}),\n\t\t\tisError: computed(() => {\n\t\t\t\tconst { status } = props.fileInfo\n\t\t\t\tif (typeof status === 'string')\n\t\t\t\t\treturn [\n\t\t\t\t\t\tKottiFileUpload.Status.ERROR,\n\t\t\t\t\t\tKottiFileUpload.Status.INVALID,\n\t\t\t\t\t\tKottiFileUpload.Status.UPLOADED_WITH_ERROR,\n\t\t\t\t\t].includes(status)\n\n\t\t\t\treturn status.type === 'error'\n\t\t\t}),\n\t\t\tisLoading: computed(() => {\n\t\t\t\tconst { status } = props.fileInfo\n\t\t\t\treturn typeof status === 'object' && status.type === 'loading'\n\t\t\t}),\n\t\t\tonClickCancelOrDelete: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\tconst eventName = isDeletable.value ? 'deleteFile' : 'cancelUpload'\n\n\t\t\t\temit(eventName, props.fileInfo.id)\n\t\t\t},\n\t\t\tonClickRetry: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\t// Force re-render Progress Bar to get rid of previous progress value\n\t\t\t\tprogressBarForceRenderKey.value++\n\t\t\t\temit('restartUpload', props.fileInfo.id)\n\t\t\t},\n\t\t\tonClickViewOrDownload: () => {\n\t\t\t\tif (props.isDisabled) return\n\n\t\t\t\twindow.open(\n\t\t\t\t\tprops.fileInfo.viewUrl ?? props.fileInfo.downloadUrl,\n\t\t\t\t\t'_blank',\n\t\t\t\t)\n\t\t\t},\n\t\t\tprogress: computed(() => props.fileInfo.progress ?? 0),\n\t\t\tprogressBarForceRenderKey,\n\t\t\tshowProgressBar: computed(() => {\n\t\t\t\tconst { status: s } = props.fileInfo\n\t\t\t\tif (typeof s === 'object' && s.showProgress !== undefined)\n\t\t\t\t\treturn s.showProgress\n\n\t\t\t\treturn (\n\t\t\t\t\tprops.fileInfo.validation === KottiFileUpload.Validation.SUCCESS &&\n\t\t\t\t\t(status.value === KottiFileUpload.Status.ERROR ||\n\t\t\t\t\t\tstatus.value === KottiFileUpload.Status.UPLOADING)\n\t\t\t\t)\n\t\t\t}),\n\t\t\tshowRetryAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.fileInfo.validation === KottiFileUpload.Validation.SUCCESS &&\n\t\t\t\t\t(status.value === KottiFileUpload.Status.CANCELED ||\n\t\t\t\t\t\tstatus.value === KottiFileUpload.Status.ERROR),\n\t\t\t),\n\t\t\tshowViewOrDownloadAction: computed(\n\t\t\t\t() =>\n\t\t\t\t\tstatus.value === KottiFileUpload.Status.UPLOADED &&\n\t\t\t\t\t(Boolean(props.fileInfo.viewUrl) ||\n\t\t\t\t\t\tBoolean(props.fileInfo.downloadUrl)),\n\t\t\t),\n\t\t\tviewOrDownloadActionIcon: computed<Yoco.Icon>(() =>\n\t\t\t\tprops.fileInfo.viewUrl ? Yoco.Icon.EYE : Yoco.Icon.DOWNLOAD,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.description-spinner {\n\tmargin: 0 var(--unit-2) 0 0;\n\ttransform: scale(0.8);\n}\n</style>\n","import shortid from 'shortid'\n\nimport { validateFile } from '../kotti-field-file-upload/validators'\n\nimport { KottiFileUpload } from './types'\n\nexport const buildFileInfo = ({\n\textensions,\n\tfile,\n\tmaxFileSize,\n}: {\n\textensions: KottiFileUpload.PropsInternal['extensions']\n\tfile: File\n\tmaxFileSize: KottiFileUpload.PropsInternal['maxFileSize']\n}): Pick<KottiFileUpload.FileInfo, 'id' | 'name' | 'size' | 'status'> & {\n\tvalidation: KottiFileUpload.Validation\n} => {\n\tconst validation = validateFile({\n\t\textensions,\n\t\tfileName: file.name,\n\t\tfileSize: file.size,\n\t\tmaxFileSize,\n\t})\n\n\treturn {\n\t\tid: shortid(),\n\t\tname: file.name,\n\t\tsize: file.size,\n\t\tstatus:\n\t\t\tvalidation === KottiFileUpload.Validation.SUCCESS\n\t\t\t\t? KottiFileUpload.Status.NOT_STARTED\n\t\t\t\t: KottiFileUpload.Status.ERROR,\n\t\tvalidation,\n\t}\n}\n","<template>\n\t<div class=\"kt-file-upload\">\n\t\t<div v-if=\"hasLabel || hasHelpText\" class=\"kt-file-upload__header\">\n\t\t\t<label\n\t\t\t\tv-if=\"hasLabel\"\n\t\t\t\tclass=\"kt-file-upload__label\"\n\t\t\t\t:for=\"inputId\"\n\t\t\t\tv-text=\"label\"\n\t\t\t/>\n\t\t\t<span v-if=\"hasHelpText\" class=\"kt-field__help-text\">\n\t\t\t\t<FieldHelpText\n\t\t\t\t\t:helpText=\"field.helpText\"\n\t\t\t\t\t:helpTextSlot=\"$slots.helpText\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"helpDescription\"\n\t\t\tclass=\"kt-file-upload__help-description\"\n\t\t\tv-text=\"helpDescription\"\n\t\t/>\n\t\t<div class=\"kt-file-upload__content\">\n\t\t\t<DropArea\n\t\t\t\tv-if=\"showDropArea\"\n\t\t\t\tv-bind=\"{\n\t\t\t\t\t...sharedProps,\n\t\t\t\t\tallowMultiple,\n\t\t\t\t\tcollapseExtensionsAfter,\n\t\t\t\t\texternalUrl,\n\t\t\t\t\ticon,\n\t\t\t\t\tinputId,\n\t\t\t\t\ttabIndex,\n\t\t\t\t}\"\n\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t>\n\t\t\t\t<template #footer>\n\t\t\t\t\t<TakePhoto\n\t\t\t\t\t\tv-if=\"allowPhotos\"\n\t\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t@addFiles=\"onAddFiles\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</DropArea>\n\t\t\t<div v-if=\"uploadedFilesList.length > 0\">\n\t\t\t\t<UploadedFileItem\n\t\t\t\t\tv-for=\"fileInfo in uploadedFilesList\"\n\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t}\"\n\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t@cancelUpload=\"(fileId) => $emit('cancelUpload', fileId)\"\n\t\t\t\t\t@deleteFile=\"onDeleteFile\"\n\t\t\t\t\t@restartUpload=\"(fileId) => $emit('restartUpload', fileId)\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div v-if=\"preUploadedFilesList.length > 0\">\n\t\t\t\t<PreUploadedFileItem\n\t\t\t\t\tv-for=\"fileInfo in preUploadedFilesList\"\n\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\t...sharedProps,\n\t\t\t\t\t\tfileInfo,\n\t\t\t\t\t}\"\n\t\t\t\t\t:key=\"fileInfo.id\"\n\t\t\t\t\t@remove=\"onDeleteFile\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, onMounted, ref } from 'vue'\n\nimport DropArea from '../kotti-field-file-upload/components/DropArea.vue'\nimport PreUploadedFileItem from '../kotti-field-file-upload/components/PreUploadedFileItem.vue'\nimport TakePhoto from '../kotti-field-file-upload/components/TakePhoto/TakePhoto.vue'\nimport type { Shared } from '../kotti-field-file-upload/types'\nimport FieldHelpText from '../kotti-field/components/FieldHelpText.vue'\nimport { makeProps } from '../make-props'\n\nimport UploadedFileItem from './components/UploadedFileItem.vue'\nimport { KottiFileUpload } from './types'\nimport { buildFileInfo } from './utilities'\n\nlet ktFileUploadId = 1\n\nexport default defineComponent({\n\tname: 'KtFileUpload',\n\tcomponents: {\n\t\tDropArea,\n\t\tFieldHelpText,\n\t\tPreUploadedFileItem,\n\t\tTakePhoto,\n\t\tUploadedFileItem,\n\t},\n\tprops: makeProps(KottiFileUpload.propsSchema),\n\temits: ['addFiles', 'cancelUpload', 'deleteFile', 'restartUpload'],\n\tsetup(props, { emit, slots }) {\n\t\tconst interceptedFiles = ref<Array<KottiFileUpload.InterceptedFile>>([])\n\t\tconst preUploadedFileIds = ref<Set<number | string>>(new Set())\n\n\t\tconst uploadedFilesList = computed(() => [\n\t\t\t...interceptedFiles.value.map((file) => ({\n\t\t\t\tid: file.id,\n\t\t\t\tname: file.file.name,\n\t\t\t\tsize: file.file.size,\n\t\t\t\tstatus: file.status,\n\t\t\t\tvalidation: file.validation,\n\t\t\t})),\n\t\t\t...props.state.filter((file) => !preUploadedFileIds.value.has(file.id)),\n\t\t])\n\n\t\tonMounted(() => {\n\t\t\tfor (const file of props.state) {\n\t\t\t\tif (\n\t\t\t\t\t!preUploadedFileIds.value.has(file.id) &&\n\t\t\t\t\t(file.status === KottiFileUpload.Status.UPLOADED ||\n\t\t\t\t\t\tfile.status === KottiFileUpload.Status.UPLOADED_WITH_ERROR)\n\t\t\t\t) {\n\t\t\t\t\tpreUploadedFileIds.value.add(file.id)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\thasHelpText: computed(() => props.helpText !== null || slots.helpText),\n\t\t\thasLabel: computed(() => props.label !== null),\n\t\t\tinputId: computed(() => `kt-file-upload-${ktFileUploadId++}`),\n\t\t\tonAddFiles: (value: Shared.Events.AddFiles) => {\n\t\t\t\tconst payload: KottiFileUpload.Events.AddFiles = []\n\t\t\t\tfor (const file of value) {\n\t\t\t\t\tconst fileInfo = buildFileInfo({\n\t\t\t\t\t\textensions: props.extensions,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t\t\t})\n\t\t\t\t\tif (fileInfo.validation === KottiFileUpload.Validation.SUCCESS)\n\t\t\t\t\t\tpayload.push({ file, fileInfo })\n\t\t\t\t\telse\n\t\t\t\t\t\tinterceptedFiles.value = [\n\t\t\t\t\t\t\t...interceptedFiles.value,\n\t\t\t\t\t\t\t{ ...fileInfo, file },\n\t\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\temit('addFiles', payload)\n\t\t\t},\n\t\t\tonDeleteFile: (fileId: number | string) => {\n\t\t\t\tconst interceptedFileIndex = interceptedFiles.value.findIndex(\n\t\t\t\t\t(file) => file.id === fileId,\n\t\t\t\t)\n\t\t\t\tif (interceptedFileIndex >= 0) {\n\t\t\t\t\tinterceptedFiles.value = [\n\t\t\t\t\t\t...interceptedFiles.value.slice(0, interceptedFileIndex),\n\t\t\t\t\t\t...interceptedFiles.value.slice(\n\t\t\t\t\t\t\tinterceptedFileIndex + 1,\n\t\t\t\t\t\t\tinterceptedFiles.value.length,\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t} else {\n\t\t\t\t\temit('deleteFile', fileId)\n\t\t\t\t}\n\t\t\t},\n\t\t\tpreUploadedFilesList: computed(() =>\n\t\t\t\tprops.state\n\t\t\t\t\t.filter((file) => preUploadedFileIds.value.has(file.id))\n\t\t\t\t\t.map((file) => ({ ...file, validation: 'SUCCESS' })),\n\t\t\t),\n\t\t\tsharedProps: computed(() => ({\n\t\t\t\tdataTest: props.dataTest,\n\t\t\t\textensions: props.extensions,\n\t\t\t\tisDisabled: props.isDisabled,\n\t\t\t\tisLoading: props.isLoading,\n\t\t\t\tmaxFileSize: props.maxFileSize,\n\t\t\t})),\n\t\t\tshowDropArea: computed(\n\t\t\t\t() =>\n\t\t\t\t\t!props.hideDropArea &&\n\t\t\t\t\t(props.allowMultiple || props.state.length === 0),\n\t\t\t),\n\t\t\tuploadedFilesList,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-file-upload {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--unit-2);\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tfont-size: 0.9em;\n\n\t\t> :not(:first-child) {\n\t\t\tmargin-left: 0.2rem;\n\t\t}\n\t}\n\n\t&__help-text {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcursor: pointer;\n\n\t\t.yoco {\n\t\t\tfont-size: 1.4em;\n\t\t}\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tfont-weight: 500;\n\t\tcolor: var(--text-02);\n\t}\n\n\t&__help-description {\n\t\tcolor: var(--text-03);\n\t}\n\n\t&__content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--unit-4);\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFileUploadVue from './KtFileUpload.vue'\nimport { KottiFileUpload } from './types'\n\nexport const KtFileUpload = attachMeta(makeInstallable(KtFileUploadVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {\n\t\thelpText: { description: 'custom helpText support (HTML)', scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.FileUpload',\n\t\tschema: KottiFileUpload.propsSchema,\n\t},\n})\n","<template>\n\t<div :class=\"mainClasses\" :data-test=\"dataTest\" @click=\"handleClick\">\n\t\t<i v-if=\"isLoading\" class=\"kt-circle-loading\" />\n\t\t<i v-else-if=\"icon !== null\" class=\"yoco\" v-text=\"icon\" />\n\t\t<span v-if=\"label !== null\" v-text=\"label\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport type { Yoco } from '@3yourmind/yoco'\nimport { isYocoIcon } from '@3yourmind/yoco'\n\nimport { KottiFilters } from '../types'\n\nexport default defineComponent({\n\tname: 'ButtonLink',\n\tprops: {\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\ticon: {\n\t\t\tdefault: null,\n\t\t\ttype: String as PropType<Yoco.Icon>,\n\t\t\tvalidator: isYocoIcon,\n\t\t},\n\t\tisDisabled: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlabel: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\tdefault: KottiFilters.ButtonLinkType.PRIMARY,\n\t\t\ttype: String as PropType<KottiFilters.ButtonLinkType>,\n\t\t\tvalidator: (value: unknown): value is KottiFilters.ButtonLinkType => {\n\t\t\t\treturn Object.values(KottiFilters.ButtonLinkType).includes(\n\t\t\t\t\tvalue as KottiFilters.ButtonLinkType,\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t},\n\temits: ['click'],\n\tsetup(props, { emit }) {\n\t\tconst mainClasses = computed(() => ({\n\t\t\t[`kt-button-link--type-${props.type}`]: !props.isDisabled,\n\t\t\t'kt-button-link': true,\n\t\t\t'kt-button-link--is-disabled': props.isDisabled,\n\t\t}))\n\n\t\tconst handleClick = (event: Event) => {\n\t\t\tif (props.isDisabled || props.isLoading) return\n\t\t\temit('click', event)\n\t\t}\n\n\t\treturn {\n\t\t\thandleClick,\n\t\t\tmainClasses,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-style/_variables.scss';\n\n.kt-button-link {\n\tdisplay: flex;\n\tfont-weight: 500;\n\tcursor: pointer;\n\n\t&--is-disabled {\n\t\tcolor: var(--text-05);\n\t\tpointer-events: none;\n\t\tcursor: default;\n\t}\n\n\t&--type {\n\t\t&-danger {\n\t\t\tcolor: var(--text-02);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--hover-danger);\n\t\t\t}\n\t\t}\n\n\t\t&-primary {\n\t\t\tcolor: var(--interactive-01);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--interactive-01-hover);\n\t\t\t}\n\t\t}\n\t}\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-filter__actions\">\n\t\t<ButtonLink\n\t\t\t:dataTest=\"dataTest ? `${dataTest}.addFilter` : undefined\"\n\t\t\t:isDisabled=\"isAddDisabled\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:label=\"translations.addFilterLabel\"\n\t\t\t@click=\"handleAdd\"\n\t\t/>\n\t\t<ButtonLink\n\t\t\t:dataTest=\"dataTest ? `${dataTest}.clearAll` : undefined\"\n\t\t\t:isDisabled=\"isClearAllDisabled\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:label=\"translations.clearAllLabel\"\n\t\t\t:type=\"KottiFilters.ButtonLinkType.DANGER\"\n\t\t\t@click=\"handleClearAll\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { KottiFilters } from '../types'\n\nimport ButtonLink from './ButtonLink.vue'\n\nexport default defineComponent({\n\tname: 'FilterActions',\n\tcomponents: {\n\t\tButtonLink,\n\t},\n\tprops: {\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\tisAddDisabled: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisClearAllDisabled: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['clearAll', 'startAddingFilter'],\n\tsetup(_, { emit }) {\n\t\tconst handleAdd = () => {\n\t\t\temit('startAddingFilter')\n\t\t}\n\t\tconst handleClearAll = () => {\n\t\t\temit('clearAll')\n\t\t}\n\t\treturn {\n\t\t\thandleAdd,\n\t\t\thandleClearAll,\n\t\t\tKottiFilters,\n\t\t\ttranslations: useTranslationNamespace('KtFilters'),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-filter__actions {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-top: var(--unit-1);\n}\n</style>\n","import type { KottiFieldSingleSelect } from '../kotti-field-select/types'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\n\nimport { KottiFilters } from './types'\n\nexport const getFilterEmptyValue = (\n\ttype: KottiFilters.Column.Any['type'],\n): [] | [null, null] | null => {\n\tswitch (type) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\tcase KottiFilters.FilterType.SEARCH:\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn null\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn [null, null]\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn []\n\t\tdefault:\n\t\t\tthrow new Error('Invalid Filter Type')\n\t}\n}\n\nconst getFilterInitialOperation = (\n\toperations: KottiFilters.Operation.Any[],\n\tdefaultOperation: KottiFilters.Operation.Any,\n): KottiFilters.Operation.Any => {\n\tif (!Array.isArray(operations) || operations.length === 0)\n\t\tthrow new Error('Invalid Filter Operations')\n\n\treturn operations.includes(defaultOperation)\n\t\t? defaultOperation\n\t\t: (operations[0] as KottiFilters.Operation.Any)\n}\n\nexport const getFilterInitialState = (\n\tcolumnKey: KottiFilters.Column.Any['key'],\n\tcolumns: KottiFilters.Column.Any[],\n): KottiFilters.InternalFilter => {\n\tconst column = columns.find((columnItem) => columnItem.key === columnKey)\n\tif (!column) {\n\t\tthrow new Error('Invalid Filter Type: column for initial state not found')\n\t}\n\n\tswitch (column.type) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.Boolean.EQUAL,\n\t\t\t\t),\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.Currency.EQUAL,\n\t\t\t\t),\n\t\t\t\tvalue: null,\n\t\t\t}\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.DateRange.IN_RANGE,\n\t\t\t\t),\n\t\t\t\tvalue: [null, null],\n\t\t\t}\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.Float.EQUAL,\n\t\t\t\t),\n\t\t\t\tvalue: null,\n\t\t\t}\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.Integer.EQUAL,\n\t\t\t\t),\n\t\t\t\tvalue: null,\n\t\t\t}\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.MultiEnum.ONE_OF,\n\t\t\t\t),\n\t\t\t\tvalue: [],\n\t\t\t}\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.SingleEnum.EQUAL,\n\t\t\t\t),\n\t\t\t\tvalue: null,\n\t\t\t}\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn {\n\t\t\t\tkey: columnKey,\n\t\t\t\toperation: getFilterInitialOperation(\n\t\t\t\t\tcolumn.operations,\n\t\t\t\t\tKottiFilters.Operation.String.CONTAINS,\n\t\t\t\t),\n\t\t\t\tvalue: null,\n\t\t\t}\n\t\tdefault:\n\t\t\tthrow new Error('Invalid Filter Type: initial state not found')\n\t}\n}\n\nexport const getOperationOptions = (\n\tcolumn: KottiFilters.Column.Any,\n): KottiFieldSingleSelect.Props['options'] => {\n\tconst translations = useTranslationNamespace('KtFilters')\n\n\tswitch (column.type) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.boolean[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.currency[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.dateRange[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.float[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.integer[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.multiEnum[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.singleEnum[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn column.operations.map((operation) => ({\n\t\t\t\tlabel: translations.value.string[operation],\n\t\t\t\tvalue: operation,\n\t\t\t}))\n\t\tdefault:\n\t\t\tthrow new Error('Invalid Column Type: filter operations not found')\n\t}\n}\n\nexport const getSearchFilterInitialState = (\n\tsearchColumn: KottiFilters.Column.Search,\n): KottiFilters.InternalFilter => ({\n\tkey: searchColumn.key,\n\toperation: KottiFilters.Operation.Search.CONTAINS,\n\tvalue: null,\n})\n\nexport const getValueComponent = (\n\tfilterType: KottiFilters.FilterType,\n): string => {\n\tswitch (filterType) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\t\treturn 'KtFieldToggle'\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\t\treturn 'KtFieldCurrency'\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn 'KtFieldDateRange'\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\t\treturn 'KtFieldNumber'\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn 'KtFieldMultiSelect'\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\t\treturn 'KtFieldSingleSelect'\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn 'KtFieldText'\n\t\tdefault:\n\t\t\tthrow new Error('Invalid Filter Type: value component not found')\n\t}\n}\n\nexport const isEmptyOperation = (\n\tfilterOperation: KottiFilters.InternalFilter['operation'],\n\tfilterType: KottiFilters.FilterType,\n): boolean => {\n\tswitch (filterType) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\t\treturn filterOperation === KottiFilters.Operation.Boolean.IS_EMPTY\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\t\treturn filterOperation === KottiFilters.Operation.Currency.IS_EMPTY\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn filterOperation === KottiFilters.Operation.DateRange.IS_EMPTY\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\t\treturn filterOperation === KottiFilters.Operation.Float.IS_EMPTY\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\t\treturn filterOperation === KottiFilters.Operation.Integer.IS_EMPTY\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn filterOperation === KottiFilters.Operation.MultiEnum.IS_EMPTY\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\t\treturn filterOperation === KottiFilters.Operation.SingleEnum.IS_EMPTY\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn filterOperation === KottiFilters.Operation.String.IS_EMPTY\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n","import type { KottiField } from '../kotti-field/types'\n\nimport type { KottiForm } from './types'\n\nconst createOnSubmitErrorMessage = (messages: string[]) =>\n\t`KottiForm(onSubmit): ${messages.join('\\n')}`\n\nclass UnexpectedValidationStateError extends Error {\n\tconstructor(_props: KottiForm.Props) {\n\t\tsuper(\n\t\t\tcreateOnSubmitErrorMessage(['Encountered Unexpected Validation State']),\n\t\t)\n\t\tthis.name = 'UnexpectedValidationStateError'\n\t}\n}\n\nclass ValidationError extends Error {\n\tconstructor(\n\t\tprops: KottiForm.Props,\n\t\ttype: Extract<KottiForm.Props['preventSubmissionOn'], 'error' | 'warning'>,\n\t\tvalidations: KottiField.Validation.Result[],\n\t) {\n\t\tsuper(\n\t\t\tcreateOnSubmitErrorMessage([\n\t\t\t\t`Encountered validation with type “${type}” onSubmit:`,\n\t\t\t\tJSON.stringify(validations, null, '\\t'),\n\t\t\t\t`Preventing submission according to preventSubmissionOn=\"${props.preventSubmissionOn}\".`,\n\t\t\t]),\n\t\t)\n\t\tthis.name = 'ValidationError'\n\t}\n}\n\nexport const ktFormErrors = {\n\tUnexpectedValidationStateError,\n\tValidationError,\n}\n","import type { KottiField } from '../kotti-field/types'\n\nimport type { KottiForm } from './types'\n\nexport const getValidationSummary = (\n\tvalidations: ReadonlyArray<KottiField.Validation.Result>,\n): KottiForm.ValidationSummary =>\n\tvalidations.reduce<KottiForm.ValidationSummary>(\n\t\t(accumulator, validation) => {\n\t\t\tswitch (validation.type) {\n\t\t\t\tcase 'empty':\n\t\t\t\t\treturn accumulator\n\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...accumulator,\n\t\t\t\t\t\terrors: [...accumulator.errors, validation],\n\t\t\t\t\t}\n\n\t\t\t\tcase 'success':\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...accumulator,\n\t\t\t\t\t\tsuccesses: [...accumulator.successes, validation],\n\t\t\t\t\t}\n\n\t\t\t\tcase 'warning':\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...accumulator,\n\t\t\t\t\t\twarnings: [...accumulator.warnings, validation],\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\terrors: [],\n\t\t\tsuccesses: [],\n\t\t\twarnings: [],\n\t\t},\n\t)\n","<template>\n\t<form @submit.prevent=\"onSubmit\">\n\t\t<slot name=\"default\" />\n\t\t<!-- onSubmit only triggers if there is a submit button in the form -->\n\t\t<input v-show=\"false\" type=\"submit\" />\n\t</form>\n</template>\n\n<script lang=\"ts\">\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, provide, reactive } from 'vue'\n\nimport { KottiField } from '../kotti-field/types'\nimport { makeProps } from '../make-props'\n\nimport { KT_FORM_CONTEXT, KT_FORM_SUBMIT_CONTEXT } from './constants'\nimport { ktFormErrors } from './errors'\nimport type { KottiForm } from './types'\nimport { getValidationSummary } from './utilities'\n\nlet id = 0\n\nexport default defineComponent({\n\tname: 'KtForm',\n\tprops: {\n\t\t...makeProps(\n\t\t\t// FIXME: should be done on propsSchema level once KtForms use zod\n\t\t\tKottiField.inheritablePropsSchema.merge(\n\t\t\t\tKottiField.potentiallySupportedPropsSchema.pick({\n\t\t\t\t\thideClear: true,\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t\tformId: {\n\t\t\tdefault: () => `autoGeneratedFormId${++id}`,\n\t\t\ttype: String,\n\t\t},\n\t\tpreventSubmissionOn: {\n\t\t\tdefault: 'error',\n\t\t\ttype: String as PropType<KottiForm.Props['preventSubmissionOn']>,\n\t\t\tvalidator: (\n\t\t\t\tvalue: unknown,\n\t\t\t): value is KottiForm.Props['preventSubmissionOn'] => {\n\t\t\t\treturn (\n\t\t\t\t\ttypeof value === 'string' &&\n\t\t\t\t\t['error', 'NEVER', 'warning'].includes(value)\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t\tvalidators: { default: () => ({}), type: Object },\n\t\tvalue: { required: true, type: Object },\n\t},\n\temits: ['input', 'submit'],\n\tsetup(props, { emit }) {\n\t\tconst currentFieldsWrapper = reactive<{\n\t\t\tcurrentFields: KottiField.Hook.Returns<unknown>[]\n\t\t}>({ currentFields: [] })\n\n\t\tconst values = computed(() => cloneDeep(props.value))\n\t\tconst isLoading = computed(() => props.isLoading)\n\n\t\tprovide<KottiForm.Context>(KT_FORM_CONTEXT, {\n\t\t\tfieldInheritableProps: computed(() => ({\n\t\t\t\thideClear: props.hideClear,\n\t\t\t\thideValidation: props.hideValidation,\n\t\t\t\tisDisabled: props.isDisabled,\n\t\t\t\tisLoading: props.isLoading,\n\t\t\t\tshowVisibilityToggle: props.showVisibilityToggle,\n\t\t\t\tsize: props.size,\n\t\t\t})),\n\t\t\tformPath: computed(() => [props.formId]),\n\t\t\tonAddField(toAdd) {\n\t\t\t\tcurrentFieldsWrapper.currentFields = [\n\t\t\t\t\t...currentFieldsWrapper.currentFields,\n\t\t\t\t\ttoAdd as (typeof currentFieldsWrapper.currentFields)[number],\n\t\t\t\t]\n\t\t\t},\n\t\t\tonRemoveField(toRemove) {\n\t\t\t\tcurrentFieldsWrapper.currentFields =\n\t\t\t\t\tcurrentFieldsWrapper.currentFields.filter(\n\t\t\t\t\t\t(field) => field !== toRemove,\n\t\t\t\t\t)\n\t\t\t},\n\t\t\tsetValue(key, newValue) {\n\t\t\t\temit('input', {\n\t\t\t\t\t...props.value,\n\t\t\t\t\t[key]: newValue,\n\t\t\t\t})\n\t\t\t},\n\t\t\tvalidators: computed(() => props.validators),\n\t\t\tvalues,\n\t\t})\n\n\t\tconst validations = computed(() =>\n\t\t\tcurrentFieldsWrapper.currentFields.map((field) => field.validation),\n\t\t)\n\n\t\tconst valueIsValid = ({ type }: KottiField.Validation.Result) => {\n\t\t\tif (props.preventSubmissionOn === 'warning')\n\t\t\t\treturn type !== 'warning' && type !== 'error'\n\n\t\t\tif (props.preventSubmissionOn === 'error') return type !== 'error'\n\n\t\t\treturn true\n\t\t}\n\n\t\tconst validationSummary = computed(() =>\n\t\t\tgetValidationSummary(validations.value),\n\t\t)\n\n\t\tconst isValid = computed(() => validations.value.every(valueIsValid))\n\n\t\tprovide<KottiForm.SubmitContext>(KT_FORM_SUBMIT_CONTEXT, {\n\t\t\tisLoading,\n\t\t\tisValid,\n\t\t\tvalidationSummary,\n\t\t})\n\n\t\treturn {\n\t\t\tonSubmit() {\n\t\t\t\tswitch (props.preventSubmissionOn) {\n\t\t\t\t\tcase 'warning':\n\t\t\t\t\t\tif (validationSummary.value.warnings.length > 0)\n\t\t\t\t\t\t\tthrow new ktFormErrors.ValidationError(\n\t\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\t\t'warning',\n\t\t\t\t\t\t\t\tvalidationSummary.value.warnings,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t// fall through\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\tif (validationSummary.value.errors.length > 0)\n\t\t\t\t\t\t\tthrow new ktFormErrors.ValidationError(\n\t\t\t\t\t\t\t\tprops,\n\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\tvalidationSummary.value.errors,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t// fall through\n\t\t\t\t\tcase 'NEVER':\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tif (!isValid.value)\n\t\t\t\t\tthrow new ktFormErrors.UnexpectedValidationStateError(props)\n\n\t\t\t\tconst onSubmitData: KottiForm.Events.Submit = {\n\t\t\t\t\tvalidationSummary: validationSummary.value,\n\t\t\t\t\tvalues: values.value,\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Deep-clone to prevent users from accidentally modifying the internal state\n\t\t\t\t */\n\t\t\t\temit('submit', cloneDeep(onSubmitData))\n\t\t\t},\n\t\t\tvalidations,\n\t\t}\n\t},\n})\n</script>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFormVue from './KtForm.vue'\n\nexport const KtForm = attachMeta(makeInstallable(KtFormVue), {\n\taddedVersion: '2.0.0',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {\n\t\tdefault: {\n\t\t\tdescription: null,\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Form',\n\t\tschema: null,\n\t},\n})\n\nexport * from './constants'\n","<template>\n\t<KtForm\n\t\tclass=\"kt-filter-row\"\n\t\t:formId=\"dataTest ?? undefined\"\n\t\thideValidation\n\t\t:isLoading=\"isLoading\"\n\t\t:size=\"KottiField.Size.SMALL\"\n\t\tstyle=\"display: contents\"\n\t\t:value=\"filter\"\n\t\t@input=\"handleSetFilter\"\n\t>\n\t\t<div class=\"kt-filter-row__wrapper\">\n\t\t\t<span class=\"kt-filter-row__label\" v-text=\"label\" />\n\t\t\t<KtFieldSingleSelect formKey=\"key\" hideClear :options=\"columnOptions\" />\n\t\t\t<template v-if=\"filter.operation\">\n\t\t\t\t<KtFieldSingleSelect\n\t\t\t\t\tformKey=\"operation\"\n\t\t\t\t\thideClear\n\t\t\t\t\t:isDisabled=\"isOperationSelectDisabled\"\n\t\t\t\t\t:options=\"operationOptions\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"kt-filter-row__value-field\">\n\t\t\t\t\t<component\n\t\t\t\t\t\t:is=\"valueComponent\"\n\t\t\t\t\t\tv-if=\"isValueFieldVisible\"\n\t\t\t\t\t\tv-bind=\"valueComponentProps\"\n\t\t\t\t\t\tformKey=\"value\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t\t<ButtonLink\n\t\t\tclass=\"kt-filter-row__remove\"\n\t\t\t:dataTest=\"dataTest ? `${dataTest}.remove` : undefined\"\n\t\t\t:icon=\"Yoco.Icon.CLOSE\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:type=\"KottiFilters.ButtonLinkType.DANGER\"\n\t\t\t@click=\"handleRemove\"\n\t\t/>\n\t</KtForm>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtFieldCurrency } from '../../kotti-field-currency'\nimport { KtFieldDateRange } from '../../kotti-field-date'\nimport { KtFieldNumber } from '../../kotti-field-number'\nimport { KtFieldMultiSelect } from '../../kotti-field-select'\nimport { KtFieldSingleSelect } from '../../kotti-field-select'\nimport type { KottiFieldSingleSelect } from '../../kotti-field-select/types'\nimport { KtFieldText } from '../../kotti-field-text'\nimport { KtFieldToggle } from '../../kotti-field-toggle'\nimport { KottiField } from '../../kotti-field/types'\nimport { KtForm } from '../../kotti-form'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport { KottiFilters } from '../types'\nimport {\n\tgetFilterEmptyValue,\n\tgetOperationOptions,\n\tgetValueComponent,\n\tisEmptyOperation,\n} from '../utils'\n\nimport ButtonLink from './ButtonLink.vue'\n\nexport default defineComponent({\n\tname: 'FilterRow',\n\tcomponents: {\n\t\tButtonLink,\n\t\tKtFieldCurrency,\n\t\tKtFieldDateRange,\n\t\tKtFieldMultiSelect,\n\t\tKtFieldNumber,\n\t\tKtFieldSingleSelect,\n\t\tKtFieldText,\n\t\tKtFieldToggle,\n\t\tKtForm,\n\t},\n\tprops: {\n\t\tcolumn: {\n\t\t\tdefault: null,\n\t\t\ttype: Object as PropType<KottiFilters.Column.Any | null>,\n\t\t},\n\t\tcolumnOptions: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiFieldSingleSelect.Props['options']>,\n\t\t},\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String as PropType<string | null>,\n\t\t},\n\t\tfilter: {\n\t\t\tdefault: () => ({\n\t\t\t\tkey: null,\n\t\t\t}),\n\t\t\ttype: Object as PropType<KottiFilters.Filter>,\n\t\t},\n\t\tisFirstItem: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['input', 'remove'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFilters')\n\n\t\tconst operationOptions = computed(() =>\n\t\t\tprops.column ? getOperationOptions(props.column) : [],\n\t\t)\n\n\t\tconst handleRemove = () => {\n\t\t\temit('remove')\n\t\t}\n\t\tconst handleSetFilter = (newFilter: KottiFilters.InternalFilter) => {\n\t\t\tif (!props.column) {\n\t\t\t\temit('input', newFilter)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (isEmptyOperation(newFilter.operation, props.column.type)) {\n\t\t\t\temit('input', {\n\t\t\t\t\t...newFilter,\n\t\t\t\t\tvalue: getFilterEmptyValue(props.column.type),\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\temit('input', newFilter)\n\t\t}\n\n\t\treturn {\n\t\t\thandleRemove,\n\t\t\thandleSetFilter,\n\t\t\tisOperationSelectDisabled: computed(\n\t\t\t\t() => operationOptions.value.length <= 1,\n\t\t\t),\n\t\t\tisValueFieldVisible: computed(\n\t\t\t\t() =>\n\t\t\t\t\tprops.column &&\n\t\t\t\t\t!isEmptyOperation(props.filter.operation, props.column.type),\n\t\t\t),\n\t\t\tKottiField,\n\t\t\tKottiFilters,\n\t\t\tlabel: computed(() =>\n\t\t\t\tprops.isFirstItem\n\t\t\t\t\t? translations.value.whereLabel\n\t\t\t\t\t: translations.value.andLabel,\n\t\t\t),\n\t\t\toperationOptions,\n\t\t\tvalueComponent: computed(() => {\n\t\t\t\tif (!props.column?.type) return null\n\t\t\t\treturn getValueComponent(props.column.type)\n\t\t\t}),\n\t\t\tvalueComponentProps: computed(() => ({\n\t\t\t\tcollapseTagsAfter:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.MULTI_ENUM ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.SINGLE_ENUM\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: undefined,\n\t\t\t\tcurrency:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.CURRENCY\n\t\t\t\t\t\t? props.column.currency\n\t\t\t\t\t\t: undefined,\n\t\t\t\tdecimalPlaces:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT\n\t\t\t\t\t\t? props.column.decimalPlaces\n\t\t\t\t\t\t: props.column?.type === KottiFilters.FilterType.INTEGER\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\tmaximum:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.INTEGER\n\t\t\t\t\t\t? props.column.maximum\n\t\t\t\t\t\t: undefined,\n\t\t\t\tmaximumDate:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.DATE_RANGE\n\t\t\t\t\t\t? props.column.maximumDate\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminimum:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.INTEGER\n\t\t\t\t\t\t? props.column.minimum\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminimumDate:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.DATE_RANGE\n\t\t\t\t\t\t? props.column.minimumDate\n\t\t\t\t\t\t: undefined,\n\t\t\t\toptions:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.MULTI_ENUM ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.SINGLE_ENUM\n\t\t\t\t\t\t? props.column.options\n\t\t\t\t\t\t: undefined,\n\t\t\t\tprefix:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.INTEGER\n\t\t\t\t\t\t? props.column.prefix\n\t\t\t\t\t\t: undefined,\n\t\t\t\tshortcuts:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.DATE_RANGE\n\t\t\t\t\t\t? props.column.shortcuts\n\t\t\t\t\t\t: undefined,\n\t\t\t\tstep:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT\n\t\t\t\t\t\t? props.column.step\n\t\t\t\t\t\t: undefined,\n\t\t\t\tsuffix:\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.FLOAT ||\n\t\t\t\t\tprops.column?.type === KottiFilters.FilterType.INTEGER\n\t\t\t\t\t\t? props.column.suffix\n\t\t\t\t\t\t: undefined,\n\t\t\t})),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-style/_variables.scss';\n\n.kt-filter-row {\n\t&__wrapper {\n\t\tdisplay: contents;\n\n\t\t@media (width <= $size-md) {\n\t\t\tdisplay: unset;\n\n\t\t\t> * {\n\t\t\t\tpadding-bottom: var(--unit-1);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--text-02);\n\t}\n\n\t&__value-field {\n\t\tmargin: auto 0;\n\t}\n\n\t&__remove {\n\t\tgrid-column: 5;\n\t\talign-self: center;\n\n\t\t@media (width <= $size-md) {\n\t\t\tgrid-column: 2;\n\t\t}\n\t}\n\n\t:deep(.kt-field-select) {\n\t\tmargin-bottom: 0;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-filter__list\">\n\t\t<i\n\t\t\tv-show=\"filters.length === 0 && !isAddingFilter\"\n\t\t\tv-text=\"translations.emptyListLabel\"\n\t\t/>\n\t\t<FilterRow\n\t\t\tv-for=\"(filter, index) in filters\"\n\t\t\t:key=\"filter.key\"\n\t\t\t:column=\"getColumn(filter.key)\"\n\t\t\t:columnOptions=\"getColumnOptions(filter.key)\"\n\t\t\t:dataTest=\"dataTest ? `${dataTest}.filter.${filter.key}` : null\"\n\t\t\t:filter=\"filter\"\n\t\t\t:isFirstItem=\"index === 0\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t@input=\"handleSetFilter(filter.key, $event)\"\n\t\t\t@remove=\"handleRemoveFilter(filter.key)\"\n\t\t/>\n\t\t<FilterRow\n\t\t\tv-if=\"isAddingFilter\"\n\t\t\t:columnOptions=\"getColumnOptions()\"\n\t\t\t:dataTest=\"dataTest ? `${dataTest}.addingFilter` : null\"\n\t\t\t:isFirstItem=\"filters.length === 0\"\n\t\t\t@input=\"handleAddFilter\"\n\t\t\t@remove=\"handleCancelAddFilter\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport type { KottiFieldSingleSelect } from '../../kotti-field-select/types'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport type { KottiFilters } from '../types'\nimport { getFilterInitialState } from '../utils'\n\nimport FilterRow from './FilterRow.vue'\n\nexport default defineComponent({\n\tname: 'FilterList',\n\tcomponents: {\n\t\tFilterRow,\n\t},\n\tprops: {\n\t\tcolumns: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiFilters.Column.Any[]>,\n\t\t},\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\tfilters: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiFilters.InternalFilter[]>,\n\t\t},\n\t\tisAddingFilter: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['endAddingFilter', 'input'],\n\tsetup(props, { emit }) {\n\t\tconst currentFiltersKeys = computed<KottiFilters.InternalFilter['key'][]>(\n\t\t\t() => props.filters.map((filter) => filter.key),\n\t\t)\n\n\t\tconst getColumn = (\n\t\t\tcolumnKey: KottiFilters.Column.Any['key'],\n\t\t): KottiFilters.Column.Any => {\n\t\t\tconst column =\n\t\t\t\tprops.columns.find((column) => column.key === columnKey) ?? null\n\t\t\tif (column === null)\n\t\t\t\tthrow new Error('Invalid Filter Key: column not found')\n\t\t\treturn column\n\t\t}\n\t\tconst getColumnOptions = (\n\t\t\tselectedColumnKey?: KottiFilters.Column.Any['key'],\n\t\t): KottiFieldSingleSelect.Props['options'] =>\n\t\t\tprops.columns\n\t\t\t\t.filter(\n\t\t\t\t\t(column) =>\n\t\t\t\t\t\tcolumn.key === selectedColumnKey ||\n\t\t\t\t\t\t!currentFiltersKeys.value.includes(column.key),\n\t\t\t\t)\n\t\t\t\t.map((column) => ({\n\t\t\t\t\tlabel: column.label,\n\t\t\t\t\tvalue: column.key,\n\t\t\t\t}))\n\n\t\tconst handleAddFilter = (filter: KottiFilters.InternalFilter) => {\n\t\t\tconst newFilter = getFilterInitialState(filter.key, props.columns)\n\t\t\temit('input', [...props.filters, newFilter])\n\t\t\temit('endAddingFilter')\n\t\t}\n\t\tconst handleCancelAddFilter = () => {\n\t\t\temit('endAddingFilter')\n\t\t}\n\t\tconst handleRemoveFilter = (\n\t\t\tfilterKey: KottiFilters.InternalFilter['key'],\n\t\t) => {\n\t\t\tconst updatedFilters = props.filters.filter(\n\t\t\t\t(filter) => filter.key !== filterKey,\n\t\t\t)\n\t\t\temit('input', updatedFilters)\n\t\t}\n\t\tconst handleSetFilter = (\n\t\t\toldFilterKey: KottiFilters.InternalFilter['key'],\n\t\t\tnewFilter: KottiFilters.InternalFilter,\n\t\t) => {\n\t\t\tconst updatedFilter = currentFiltersKeys.value.includes(newFilter.key)\n\t\t\t\t? newFilter\n\t\t\t\t: getFilterInitialState(newFilter.key, props.columns)\n\n\t\t\tconst updatedFilters = props.filters.map((oldFilter) =>\n\t\t\t\toldFilter.key === oldFilterKey ? updatedFilter : oldFilter,\n\t\t\t)\n\t\t\temit('input', updatedFilters)\n\t\t}\n\n\t\treturn {\n\t\t\tgetColumn,\n\t\t\tgetColumnOptions,\n\t\t\thandleAddFilter,\n\t\t\thandleCancelAddFilter,\n\t\t\thandleRemoveFilter,\n\t\t\thandleSetFilter,\n\t\t\ttranslations: useTranslationNamespace('KtFilters'),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-style/_variables.scss';\n\n.kt-filter__list {\n\tdisplay: grid;\n\tgrid-template-rows: auto;\n\tgrid-template-columns: max-content repeat(3, 1fr) max-content;\n\tgrid-gap: var(--unit-1);\n\twidth: 50vw;\n\n\t@media (width <= $size-md) {\n\t\tgrid-template-columns: auto max-content;\n\t}\n\n\t@media (width <= $size-xl) {\n\t\twidth: 60vw;\n\t}\n\n\t@media (width <= $size-lg) {\n\t\twidth: 75vw;\n\t}\n\n\t@media (width <= $size-md) {\n\t\twidth: 90vw;\n\t}\n\n\t@media (width <= $size-sm) {\n\t\twidth: 95vw;\n\t}\n}\n</style>\n","<template>\n\t<KtFieldText\n\t\tclass=\"kt-filter__search\"\n\t\t:dataTest=\"dataTest ? `${dataTest}.searchInput` : undefined\"\n\t\thideValidation\n\t\t:isLoading=\"isLoading\"\n\t\t:leftIcon=\"Yoco.Icon.SEARCH\"\n\t\t:placeholder=\"placeholder\"\n\t\tsize=\"small\"\n\t\t:value=\"searchValue\"\n\t\t@input=\"handleSetSearchValue\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KtFieldText } from '../../kotti-field-text'\nimport type { KottiFieldText } from '../../kotti-field-text/types'\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport type { KottiFilters } from '../types'\nimport { getSearchFilterInitialState } from '../utils'\n\nexport default defineComponent({\n\tname: 'FilterSearch',\n\tcomponents: {\n\t\tKtFieldText,\n\t},\n\tprops: {\n\t\tcolumn: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiFilters.Column.Search>,\n\t\t},\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\tfilter: {\n\t\t\tdefault: null,\n\t\t\ttype: Object as PropType<KottiFilters.InternalFilterSearch | null>,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFilters')\n\n\t\tconst handleSetSearchValue = (value: string) => {\n\t\t\temit('input', {\n\t\t\t\t...(props.filter ?? getSearchFilterInitialState(props.column)),\n\t\t\t\tvalue,\n\t\t\t})\n\t\t}\n\n\t\treturn {\n\t\t\thandleSetSearchValue,\n\t\t\tplaceholder: computed<string>(\n\t\t\t\t() => props.column.placeholder ?? translations.value.searchLabel,\n\t\t\t),\n\t\t\tsearchValue: computed<KottiFieldText.Value>(\n\t\t\t\t() => props.filter?.value ?? null,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-filter__search {\n\tflex: 1;\n\tmargin: 0 var(--unit-2) 0 0;\n}\n</style>\n","import { KottiFilters } from './types'\n\nconst isNonEmptyString = (value: unknown): value is string =>\n\ttypeof value === 'string' && value.length > 0\n\nconst isValueInEnum = <KEY extends string>(\n\tvalue: string,\n\tenumObject: Record<KEY, string>,\n): boolean => Object.values(enumObject).includes(value)\n\nconst areValidOperations = (\n\toperations: KottiFilters.Operation.Any[],\n\tfilterType: KottiFilters.FilterType,\n): boolean => {\n\tswitch (filterType) {\n\t\tcase KottiFilters.FilterType.BOOLEAN:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.Boolean>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.Boolean,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.CURRENCY:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.Currency>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.Currency,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.DATE_RANGE:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.DateRange>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.DateRange,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.FLOAT:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.Float>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.Float,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.INTEGER:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.Integer>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.Integer,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.MULTI_ENUM:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.MultiEnum>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.MultiEnum,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.SINGLE_ENUM:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.SingleEnum>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.SingleEnum,\n\t\t\t\t),\n\t\t\t)\n\t\tcase KottiFilters.FilterType.STRING:\n\t\t\treturn operations.every((operation) =>\n\t\t\t\tisValueInEnum<KottiFilters.Operation.String>(\n\t\t\t\t\toperation,\n\t\t\t\t\tKottiFilters.Operation.String,\n\t\t\t\t),\n\t\t\t)\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n\nexport const isValidColumn = (\n\tcolumn: KottiFilters.Column.Any,\n): column is KottiFilters.Column.Any => {\n\tconst isValidKey = isNonEmptyString(column.key)\n\tconst isValidLabel = isNonEmptyString(column.label)\n\tif (column.type === KottiFilters.FilterType.SEARCH)\n\t\treturn isValidKey && isValidLabel\n\treturn (\n\t\tisValidKey &&\n\t\tisValidLabel &&\n\t\tArray.isArray(column.operations) &&\n\t\tcolumn.operations.length > 0 &&\n\t\tareValidOperations(column.operations, column.type)\n\t)\n}\n","<template>\n\t<div class=\"kt-filter\">\n\t\t<FilterSearch\n\t\t\tv-if=\"searchColumn !== null\"\n\t\t\t:column=\"searchColumn\"\n\t\t\t:dataTest=\"dataTest\"\n\t\t\t:filter=\"searchValue\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t@input=\"setSearchFilter\"\n\t\t/>\n\t\t<div ref=\"listTriggerRef\">\n\t\t\t<ButtonLink\n\t\t\t\t:dataTest=\"dataTest ? `${dataTest}.showFilters` : undefined\"\n\t\t\t\t:icon=\"Yoco.Icon.FILTER\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t:label=\"filterLabel\"\n\t\t\t\t@click=\"toggleListVisibility\"\n\t\t\t/>\n\t\t</div>\n\t\t<div ref=\"listContentRef\">\n\t\t\t<FilterList\n\t\t\t\t:columns=\"filterListColumns\"\n\t\t\t\t:dataTest=\"dataTest\"\n\t\t\t\t:filters=\"filterListValues\"\n\t\t\t\t:isAddingFilter=\"isAddingFilter\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t@endAddingFilter=\"isAddingFilter = false\"\n\t\t\t\t@input=\"setFilters\"\n\t\t\t/>\n\t\t\t<FilterActions\n\t\t\t\t:dataTest=\"dataTest\"\n\t\t\t\t:isAddDisabled=\"isAddDisabled\"\n\t\t\t\t:isClearAllDisabled=\"isClearAllDisabled\"\n\t\t\t\t:isLoading=\"isLoading\"\n\t\t\t\t@clearAll=\"clearAll\"\n\t\t\t\t@startAddingFilter=\"isAddingFilter = true\"\n\t\t\t/>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"isListVisible\"\n\t\t\tclass=\"kt-filter__background\"\n\t\t\t@click=\"toggleListVisibility\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport castArray from 'lodash/castArray.js'\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../constants'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\n\nimport ButtonLink from './components/ButtonLink.vue'\nimport FilterActions from './components/FilterActions.vue'\nimport FilterList from './components/FilterList.vue'\nimport FilterSearch from './components/FilterSearch.vue'\nimport { KottiFilters } from './types'\nimport { isValidColumn } from './validators'\n\nexport default defineComponent({\n\tname: 'KtFilters',\n\tcomponents: {\n\t\tButtonLink,\n\t\tFilterActions,\n\t\tFilterList,\n\t\tFilterSearch,\n\t},\n\tprops: {\n\t\tcolumns: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiFilters.PropsInternal['columns']>,\n\t\t\tvalidator: (\n\t\t\t\tvalue: unknown,\n\t\t\t): value is KottiFilters.PropsInternal['columns'] => {\n\t\t\t\treturn (\n\t\t\t\t\tArray.isArray(value) && value.every((column) => isValidColumn(column))\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t\tdataTest: {\n\t\t\tdefault: null,\n\t\t\ttype: String,\n\t\t},\n\t\tisLoading: {\n\t\t\tdefault: false,\n\t\t\ttype: Boolean,\n\t\t},\n\t\tvalue: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<KottiFilters.PropsInternal['value']>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtFilters')\n\n\t\tconst listContentRef = ref<Element | null>(null)\n\t\tconst listTriggerRef = ref<Element | null>(null)\n\t\tconst isAddingFilter = ref<boolean>(false)\n\t\tconst isListVisible = ref<boolean>(false)\n\n\t\tconst filterListColumns = computed<KottiFilters.Column.Any[]>(() =>\n\t\t\tprops.columns.filter(\n\t\t\t\t(column) => column.type !== KottiFilters.FilterType.SEARCH,\n\t\t\t),\n\t\t)\n\n\t\tconst searchColumn = computed(\n\t\t\t() =>\n\t\t\t\tprops.columns.find(\n\t\t\t\t\t(column) => column.type === KottiFilters.FilterType.SEARCH,\n\t\t\t\t) ?? null,\n\t\t)\n\n\t\tconst searchValue = computed<KottiFilters.InternalFilterSearch | null>(\n\t\t\t() =>\n\t\t\t\t(props.value.find((filter) => filter.key === searchColumn.value?.key) ??\n\t\t\t\t\tnull) as KottiFilters.InternalFilterSearch | null,\n\t\t)\n\n\t\tconst filterListValues = computed<KottiFilters.Value>(() =>\n\t\t\tprops.value.filter((filter) => filter.key !== searchColumn.value?.key),\n\t\t)\n\t\tconst isAddDisabled = computed(\n\t\t\t() =>\n\t\t\t\tisAddingFilter.value ||\n\t\t\t\tfilterListValues.value.length >= filterListColumns.value.length,\n\t\t)\n\t\tconst isClearAllDisabled = computed(\n\t\t\t() => isAddingFilter.value || filterListValues.value.length === 0,\n\t\t)\n\t\tconst filterLabel = computed<string>(() => {\n\t\t\tconst filtersCount = filterListValues.value.length\n\t\t\tconst label =\n\t\t\t\tfiltersCount > 1\n\t\t\t\t\t? translations.value.filtersLabel\n\t\t\t\t\t: translations.value.filterLabel\n\t\t\tif (filtersCount === 0) return label\n\t\t\treturn `${String(filtersCount)} ${label}`\n\t\t})\n\n\t\tconst clearAll = () => {\n\t\t\tif (searchValue.value === null) {\n\t\t\t\temit('input', [])\n\t\t\t\treturn\n\t\t\t}\n\t\t\temit('input', [searchValue.value])\n\t\t}\n\t\tconst setFilters = (filters: KottiFilters.Value) => {\n\t\t\tif (searchValue.value === null) {\n\t\t\t\temit('input', filters)\n\t\t\t\treturn\n\t\t\t}\n\t\t\temit('input', [...filters, searchValue.value])\n\t\t}\n\t\tconst setSearchFilter = (searchFilter: KottiFilters.InternalFilter) => {\n\t\t\tif (searchColumn.value !== null) {\n\t\t\t\tif (searchFilter.value === null) {\n\t\t\t\t\temit('input', filterListValues.value)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\temit('input', [...filterListValues.value, searchFilter])\n\t\t\t}\n\t\t}\n\n\t\tconst { tippy } = useTippy(\n\t\t\tlistTriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: listContentRef.value ?? undefined,\n\t\t\t\thideOnClick: false,\n\t\t\t\tinteractive: true,\n\t\t\t\tmaxWidth: 'none',\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\tplacement: 'bottom',\n\t\t\t\ttheme: 'light-border',\n\t\t\t\ttrigger: 'manual',\n\t\t\t\tzIndex: 1000,\n\t\t\t})),\n\t\t)\n\n\t\tconst toggleListVisibility = () => {\n\t\t\tif (tippy.value === null) return\n\n\t\t\tconst tippys = castArray(tippy.value)\n\n\t\t\tisListVisible.value = !isListVisible.value\n\n\t\t\tif (!isListVisible.value) {\n\t\t\t\tisAddingFilter.value = false\n\t\t\t}\n\n\t\t\tfor (const tippy of tippys) {\n\t\t\t\tif (isListVisible.value) tippy.show()\n\t\t\t\telse tippy.hide()\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tclearAll,\n\t\t\tfilterLabel,\n\t\t\tfilterListColumns,\n\t\t\tfilterListValues,\n\t\t\tisAddDisabled,\n\t\t\tisAddingFilter,\n\t\t\tisClearAllDisabled,\n\t\t\tisListVisible,\n\t\t\tlistContentRef,\n\t\t\tlistTriggerRef,\n\t\t\tsearchColumn,\n\t\t\tsearchValue,\n\t\t\tsetFilters,\n\t\t\tsetSearchFilter,\n\t\t\ttoggleListVisibility,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n.kt-filter {\n\tdisplay: flex;\n\talign-items: center;\n\n\t&__background {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: 999;\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFiltersVue from './KtFilters.vue'\n\nexport const KtFilters = attachMeta(makeInstallable(KtFiltersVue), {\n\taddedVersion: '3.0.0',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Filters',\n\t\tschema: null,\n\t},\n})\n","<template>\n\t<div><slot /></div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, provide } from 'vue'\n\nimport { KT_FORM_CONTEXT } from '../../kotti-form/constants'\nimport type { KottiForm } from '../../kotti-form/types'\nimport type { KottiFormControllerListItem } from '../types'\n\nexport default defineComponent({\n\tname: 'FormControllerListItem',\n\tprops: {\n\t\tcontext: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiFormControllerListItem.Props['context']>,\n\t\t},\n\t\tformKey: { required: true, type: String },\n\t\tindex: { required: true, type: Number },\n\t\tvalues: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiFormControllerListItem.Props['values']>,\n\t\t},\n\t},\n\temits: ['setValue'],\n\tsetup(props, { emit }) {\n\t\t/* eslint-disable vue/no-setup-props-reactivity-loss */\n\t\t/**\n\t\t * FIXME: This is not reactive and will likely cause issues. Fixing this\n\t\t * would require adjusting types in KottiForm.Context to support computed\n\t\t * which is out of scope\n\t\t */\n\t\tprovide<KottiForm.Context>(KT_FORM_CONTEXT, {\n\t\t\tfieldInheritableProps: props.context.fieldInheritableProps,\n\t\t\tformPath: computed(() => [\n\t\t\t\t...props.context.formPath.value,\n\t\t\t\tprops.formKey,\n\t\t\t\tprops.index,\n\t\t\t]),\n\t\t\tonAddField: props.context.onAddField,\n\t\t\tonRemoveField: props.context.onRemoveField,\n\t\t\tsetValue: (formKey, newValue) => {\n\t\t\t\temit('setValue', { formKey, newValue })\n\t\t\t},\n\t\t\tvalidators: props.context.validators,\n\t\t\tvalues: computed(() => props.values),\n\t\t})\n\t\t/* eslint-enable vue/no-setup-props-reactivity-loss */\n\t},\n})\n</script>\n","<template>\n\t<div>\n\t\t<slot\n\t\t\tv-bind=\"slotFunctions\"\n\t\t\tname=\"header\"\n\t\t\t:values=\"cloneDeep(valuesList)\"\n\t\t/>\n\t\t<FormControllerListItem\n\t\t\tv-for=\"(values, index) in valuesList\"\n\t\t\t:key=\"index\"\n\t\t\t:context=\"context\"\n\t\t\t:formKey=\"formKey\"\n\t\t\t:index=\"index\"\n\t\t\t:values=\"values\"\n\t\t\t@setValue=\"setValue({ ...$event, index })\"\n\t\t>\n\t\t\t<slot\n\t\t\t\t:addAfter=\"addAfter(index)\"\n\t\t\t\t:addBefore=\"addBefore(index)\"\n\t\t\t\t:deleteSelf=\"() => deleteSelf(index)\"\n\t\t\t\t:index=\"index\"\n\t\t\t\tname=\"default\"\n\t\t\t\t:setValues=\"setValuesIndex(index)\"\n\t\t\t\t:values=\"cloneDeep(values)\"\n\t\t\t/>\n\t\t</FormControllerListItem>\n\t\t<slot\n\t\t\tv-bind=\"slotFunctions\"\n\t\t\tname=\"footer\"\n\t\t\t:values=\"cloneDeep(valuesList)\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport { computed, defineComponent, inject } from 'vue'\n\nimport { KT_FORM_CONTEXT } from '../kotti-form/constants'\nimport type { KottiForm } from '../kotti-form/types'\n\nimport FormControllerListItem from './components/FormControllerListItem.vue'\nimport type { KottiFormControllerListItem } from './types'\n\ntype Entry = KottiFormControllerListItem.Props['values']\n\nexport default defineComponent({\n\tname: 'KtFormControllerList',\n\tcomponents: { FormControllerListItem },\n\tprops: {\n\t\tformKey: { required: true, type: String },\n\t},\n\tsetup(props) {\n\t\tconst context = inject<KottiForm.Context | null>(KT_FORM_CONTEXT, null)\n\t\tif (context === null)\n\t\t\tthrow new Error('KtFormControllerList: Could Not Find KtFormContext')\n\n\t\tconst valuesList = computed<Entry[]>(() => {\n\t\t\tconst result = context.values.value[props.formKey]\n\n\t\t\tif (!Array.isArray(result))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`KtFormControllerList: Unexpected Data Type ${typeof result}. Expected Array`,\n\t\t\t\t)\n\n\t\t\treturn result\n\t\t})\n\n\t\treturn {\n\t\t\t/**\n\t\t\t * Adds a new valuesList entry after the given index\n\t\t\t */\n\t\t\taddAfter: (index: number) => (newRow: Entry) => {\n\t\t\t\tcontext.setValue(props.formKey, [\n\t\t\t\t\t...valuesList.value.slice(0, index + 1),\n\t\t\t\t\tnewRow,\n\t\t\t\t\t...valuesList.value.slice(index + 1, valuesList.value.length),\n\t\t\t\t])\n\t\t\t},\n\t\t\t/**\n\t\t\t * Adds a new valuesList entry before the given index\n\t\t\t */\n\t\t\taddBefore: (index: number) => (newRow: Entry) => {\n\t\t\t\tcontext.setValue(props.formKey, [\n\t\t\t\t\t...valuesList.value.slice(0, index),\n\t\t\t\t\tnewRow,\n\t\t\t\t\t...valuesList.value.slice(index, valuesList.value.length),\n\t\t\t\t])\n\t\t\t},\n\t\t\t/**\n\t\t\t * Makes sure that consumers cannot accidentally modify the internal state\n\t\t\t */\n\t\t\tcloneDeep,\n\t\t\tcontext,\n\t\t\t/**\n\t\t\t * Deletes the given index from the valuesList\n\t\t\t */\n\t\t\tdeleteSelf: (index: number) => {\n\t\t\t\tcontext.setValue(\n\t\t\t\t\tprops.formKey,\n\t\t\t\t\tvaluesList.value.filter((_, i) => (i === index ? false : true)),\n\t\t\t\t)\n\t\t\t},\n\t\t\t/**\n\t\t\t * Updates a single formKey in a valuesList entry\n\t\t\t */\n\t\t\tsetValue: ({\n\t\t\t\tformKey,\n\t\t\t\tindex,\n\t\t\t\tnewValue,\n\t\t\t}: {\n\t\t\t\tformKey: string\n\t\t\t\tindex: number\n\t\t\t\tnewValue: unknown\n\t\t\t}) => {\n\t\t\t\tcontext.setValue(\n\t\t\t\t\tprops.formKey,\n\t\t\t\t\tvaluesList.value.map((oldValue, i) =>\n\t\t\t\t\t\ti === index ? { ...oldValue, [formKey]: newValue } : oldValue,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t},\n\t\t\t/**\n\t\t\t * Replaces an entire valuesListEntry with new data\n\t\t\t */\n\t\t\tsetValuesIndex: (index: number) => (newValue: Entry) => {\n\t\t\t\tcontext.setValue(\n\t\t\t\t\tprops.formKey,\n\t\t\t\t\tvaluesList.value.map((oldValue, i) =>\n\t\t\t\t\t\ti === index ? newValue : oldValue,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t},\n\t\t\t/**\n\t\t\t * Functions that are exposed to the footer and header slots\n\t\t\t * these should manipulate the entire array, instead of individual items\n\t\t\t */\n\t\t\tslotFunctions: {\n\t\t\t\t/**\n\t\t\t\t * Adds a new valuesList entry to the end of the entire list\n\t\t\t\t */\n\t\t\t\taddAfter: (newRow: Entry) => {\n\t\t\t\t\tcontext.setValue(props.formKey, [...valuesList.value, newRow])\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Adds a new valuesList entry to the beginning of the entire list\n\t\t\t\t */\n\t\t\t\taddBefore: (newRow: Entry) => {\n\t\t\t\t\tcontext.setValue(props.formKey, [newRow, ...valuesList.value])\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Replaces the entire valuesList with a new one\n\t\t\t\t */\n\t\t\t\tsetValues: (newValuesList: Entry[]) => {\n\t\t\t\t\tcontext.setValue(props.formKey, newValuesList)\n\t\t\t\t},\n\t\t\t},\n\t\t\tvaluesList,\n\t\t}\n\t},\n})\n</script>\n","import type { Kotti } from '../types'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFormControllerListVue from './KtFormControllerList.vue'\n\nexport const sharedHeaderFooterScope: Kotti.Meta['slots'][string]['scope'] = {\n\taddAfter: {\n\t\tdescription: 'append an item to the list',\n\t\ttype: 'function',\n\t},\n\taddBefore: {\n\t\tdescription: 'prepend an item to the list',\n\t\ttype: 'function',\n\t},\n\tsetValues: {\n\t\tdescription: 'replace the list',\n\t\ttype: 'function',\n\t},\n\tvalues: {\n\t\tdescription: 'all items in the list',\n\t\ttype: 'object',\n\t},\n}\n\nexport const KtFormControllerList = attachMeta(\n\tmakeInstallable(KtFormControllerListVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: {\n\t\t\tdefault: {\n\t\t\t\tdescription: null,\n\t\t\t\tscope: {\n\t\t\t\t\taddAfter: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\taddBefore: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\tdeleteSelf: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\tindex: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'integer',\n\t\t\t\t\t},\n\t\t\t\t\tsetValues: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\tvalues: {\n\t\t\t\t\t\tdescription: null,\n\t\t\t\t\t\ttype: 'object',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tfooter: {\n\t\t\t\tdescription: 'inserted below the list, exposes list utilities',\n\t\t\t\tscope: sharedHeaderFooterScope,\n\t\t\t},\n\t\t\theader: {\n\t\t\t\tdescription: 'inserted above the list, exposes list utilities',\n\t\t\t\tscope: sharedHeaderFooterScope,\n\t\t\t},\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FormControllerList',\n\t\t\tschema: null,\n\t\t},\n\t},\n)\n","<template>\n\t<div>\n\t\t<slot :setValue=\"setValue\" :setValues=\"setValues\" :values=\"values\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, provide } from 'vue'\n\nimport { KT_FORM_CONTEXT } from '../kotti-form/constants'\nimport type { KottiForm } from '../kotti-form/types'\n\nexport default defineComponent({\n\tname: 'KtFormControllerObject',\n\tprops: {\n\t\tformKey: { required: true, type: String },\n\t},\n\tsetup(props) {\n\t\tconst context = inject<KottiForm.Context | null>(KT_FORM_CONTEXT, null)\n\t\tif (context === null)\n\t\t\tthrow new Error('KtFormControllerObject: Could Not Find KtFormContext')\n\n\t\tconst values = computed((): KottiForm.ContextType => {\n\t\t\tconst result = context.values.value[props.formKey]\n\n\t\t\tconst errorText = (type: string) =>\n\t\t\t\t`KtFormControllerObject: Unexpected Data Type ${type}. Expected Object`\n\n\t\t\tif (result === null) throw new Error(errorText('null'))\n\t\t\tif (Array.isArray(result)) throw new Error(errorText('array'))\n\t\t\tif (typeof result !== 'object') throw new Error(errorText(typeof result))\n\n\t\t\treturn result as KottiForm.ContextType\n\t\t})\n\n\t\t/**\n\t\t * Updates a single key in a KtFormControllerObject values\n\t\t */\n\t\tconst setValue = (\n\t\t\tkey: keyof KottiForm.ContextType,\n\t\t\tnewValue: KottiForm.ContextType[keyof KottiForm.ContextType],\n\t\t) => {\n\t\t\tcontext.setValue(props.formKey, {\n\t\t\t\t...values.value,\n\t\t\t\t[key]: newValue,\n\t\t\t})\n\t\t}\n\n\t\tprovide<KottiForm.Context>(KT_FORM_CONTEXT, {\n\t\t\tfieldInheritableProps: context.fieldInheritableProps,\n\t\t\tformPath: computed(() => [...context.formPath.value, props.formKey]),\n\t\t\tonAddField: context.onAddField,\n\t\t\tonRemoveField: context.onRemoveField,\n\t\t\tsetValue,\n\t\t\tvalidators: context.validators,\n\t\t\tvalues,\n\t\t})\n\n\t\treturn {\n\t\t\tsetValue,\n\t\t\t/**\n\t\t\t * Updates KtFormControllerObject values\n\t\t\t */\n\t\t\tsetValues: (newFormValues: KottiForm.ContextType) => {\n\t\t\t\tcontext.setValue(props.formKey, newFormValues)\n\t\t\t},\n\t\t\tvalues,\n\t\t}\n\t},\n})\n</script>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFormControllerObjectVue from './KtFormControllerObject.vue'\n\nexport const KtFormControllerObject = attachMeta(\n\tmakeInstallable(KtFormControllerObjectVue),\n\t{\n\t\taddedVersion: '2.0.0',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: {\n\t\t\tdefault: {\n\t\t\t\tdescription: null,\n\t\t\t\tscope: {\n\t\t\t\t\tsetValue: {\n\t\t\t\t\t\tdescription: 'sets a key on the controller object',\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\tsetValues: {\n\t\t\t\t\t\tdescription: 'sets value of the controller object',\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t},\n\t\t\t\t\tvalues: {\n\t\t\t\t\t\tdescription: 'current value of the controller object',\n\t\t\t\t\t\ttype: 'object',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.FormControllerObject',\n\t\t\tschema: null,\n\t\t},\n\t},\n)\n","class InvalidSubmitOutsideContextError extends Error {\n\tpublic constructor() {\n\t\tconst messages = [\n\t\t\t'Encountered a “<KtFormSubmit />” outside of a “<KtForm/>”',\n\t\t]\n\t\tsuper(`KtFormSubmit: ${messages.join('\\n')}`)\n\t\tthis.name = 'InvalidSubmitOutsideContextError'\n\t}\n}\n\nexport const ktFormSubmitErrors = {\n\tInvalidSubmitOutsideContextError,\n}\n","<template>\n\t<div>\n\t\t<!-- TODO: implement popover -->\n\t\t<div v-if=\"showPopup\" class=\"kt-form-submit-popup\">\n\t\t\t<h4 class=\"kt-form-submit-popup__title\" v-text=\"translations.title\" />\n\n\t\t\t<div\n\t\t\t\tv-if=\"errors.length > 0\"\n\t\t\t\tclass=\"kt-form-submit-popup__section kt-form-submit-popup__section--error\"\n\t\t\t>\n\t\t\t\t<h5 v-text=\"translations.errorsSectionTitle\" />\n\t\t\t\t<ul>\n\t\t\t\t\t<li v-for=\"(error, index) in errors\" :key=\"index\">\n\t\t\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_CROSS\" />\n\t\t\t\t\t\t<span v-text=\"error.text\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"warnings.length > 0\"\n\t\t\t\tclass=\"kt-form-submit-popup__section kt-form-submit-popup__section--warning\"\n\t\t\t>\n\t\t\t\t<h5 v-text=\"translations.warningsSectionTitle\" />\n\t\t\t\t<ul>\n\t\t\t\t\t<li v-for=\"(warning, index) in warnings\" :key=\"index\">\n\t\t\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.CIRCLE_ATTENTION\" />\n\t\t\t\t\t\t<span v-text=\"warning.text\" />\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<button\n\t\t\tclass=\"kt-button primary kt-form-submit-button\"\n\t\t\t:disabled=\"isDisabled\"\n\t\t\ttype=\"submit\"\n\t\t>\n\t\t\t<i v-if=\"isLoading\" class=\"kt-circle-loading\" />\n\t\t\t{{ label }}\n\t\t</button>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KT_FORM_SUBMIT_CONTEXT } from '../kotti-form/constants'\nimport type { KottiForm } from '../kotti-form/types'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\n\nimport { ktFormSubmitErrors } from './errors'\n\nexport default defineComponent({\n\tname: 'KtFormSubmit',\n\tprops: {\n\t\tlabel: { default: 'Submit', type: String },\n\t},\n\tsetup() {\n\t\tconst context = inject<KottiForm.SubmitContext | null>(\n\t\t\tKT_FORM_SUBMIT_CONTEXT,\n\t\t\tnull,\n\t\t)\n\n\t\tif (context === null)\n\t\t\tthrow new ktFormSubmitErrors.InvalidSubmitOutsideContextError()\n\n\t\tconst { isLoading, isValid, validationSummary } = context\n\t\tconst errors = computed(() => validationSummary.value.errors)\n\t\tconst warnings = computed(() => validationSummary.value.warnings)\n\n\t\treturn {\n\t\t\terrors,\n\t\t\tisDisabled: computed(() => !isValid.value || isLoading.value),\n\t\t\tisLoading,\n\t\t\tshowPopup: computed(\n\t\t\t\t() => errors.value.length > 0 || warnings.value.length > 0,\n\t\t\t),\n\t\t\ttranslations: useTranslationNamespace('KtFormSubmit'),\n\t\t\twarnings,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n/* FIXME: why isn’t this scoped? */\n\n.kt-form-submit-button {\n\tdisplay: flex;\n}\n\n.kt-form-submit-popup {\n\tdisplay: flex;\n\tflex: 1;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tpadding: 1em;\n\tbackground-color: var(--ui-01);\n\n\t> *:not(:last-child) {\n\t\tmargin-bottom: 1em;\n\t}\n\n\t&__section {\n\t\tul {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tmargin: 0;\n\t\t\tlist-style: none;\n\n\t\t\tli {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmargin: 0.2rem 0;\n\t\t\t\tline-height: 1;\n\n\t\t\t\ti.yoco {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tmargin: 0 0.5em 0 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $type in 'warning', 'error' {\n\t\t\t&--#{$type} ul {\n\t\t\t\tcolor: var(--support-#{$type});\n\t\t\t}\n\t\t}\n\t}\n\n\t&__title,\n\th5 {\n\t\tfont-weight: bold;\n\t\tcolor: var(--text-01);\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtFormSubmitVue from './KtFormSubmit.vue'\n\nexport const KtFormSubmit = attachMeta(makeInstallable(KtFormSubmitVue), {\n\taddedVersion: '2.0.0',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.FormSubmit',\n\t\tschema: null,\n\t},\n})\n","<template>\n\t<div>\n\t\t<h3>\n\t\t\t<span class=\"kt-heading__title\" v-text=\"text\" />\n\t\t\t<span\n\t\t\t\tv-if=\"type === KottiHeading.Type.ACTION\"\n\t\t\t\tclass=\"kt-heading__button\"\n\t\t\t\t@click=\"handleClick\"\n\t\t\t>\n\t\t\t\t{{ actionText }} <i class=\"yoco\" v-text=\"icon\" />\n\t\t\t</span>\n\t\t\t<span\n\t\t\t\tv-if=\"type === KottiHeading.Type.TOGGLE\"\n\t\t\t\tclass=\"kt-heading__button\"\n\t\t\t\t@click=\"handleClick\"\n\t\t\t>\n\t\t\t\t{{ toggleTextRep }}\n\t\t\t\t<i\n\t\t\t\t\tclass=\"yoco\"\n\t\t\t\t\tv-text=\"toggleStatus ? Yoco.Icon.MINUS : Yoco.Icon.PLUS\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</h3>\n\t\t<div v-if=\"toggleStatus && type === KottiHeading.Type.TOGGLE\">\n\t\t\t<slot />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiHeading } from './types'\n\nexport default defineComponent({\n\tname: 'KtHeading',\n\tprops: makeProps(KottiHeading.propsSchema),\n\temits: ['click', 'toggle'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\thandleClick: (event: Event) => {\n\t\t\t\tif (props.type === KottiHeading.Type.ACTION) {\n\t\t\t\t\temit('click', event)\n\t\t\t\t}\n\t\t\t\tif (props.type === KottiHeading.Type.TOGGLE) {\n\t\t\t\t\temit('toggle', event)\n\t\t\t\t}\n\t\t\t},\n\t\t\tKottiHeading,\n\t\t\ttoggleTextRep: computed(() =>\n\t\t\t\tprops.toggleStatus ? props.toggleCloseText : props.toggleText,\n\t\t\t),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-heading__button {\n\tdisplay: flex;\n\talign-items: center;\n\tfloat: right;\n\tfont-weight: 500;\n\tcolor: var(--interactive-01);\n\n\t&:hover {\n\t\tcolor: var(--interactive-01);\n\t\tcursor: pointer;\n\t}\n}\n\n.kt-heading__title {\n\tflex: 1;\n}\n\nh3 {\n\tdisplay: flex;\n\talign-items: center;\n\n\ti.yoco {\n\t\tfont-size: 1rem;\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtHeadingVue from './KtHeading.vue'\n\nexport const KtHeading = attachMeta(makeInstallable(KtHeadingVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A765',\n\t},\n\tslots: {\n\t\tdefault: { description: 'Used for type toggle', scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Heading',\n\t\tschema: null,\n\t},\n})\n","import type { PropType } from 'vue'\nimport { computed, defineComponent, h } from 'vue'\n\nimport { useI18nProvide } from './hooks'\nimport type { KottiI18n } from './types'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst KtI18nContext = defineComponent({\n\tname: 'KtI18nContext',\n\tprops: {\n\t\tcurrencyMap: {\n\t\t\tdefault: (): KottiI18n.Props['currencyMap'] => ({}),\n\t\t\ttype: Object as PropType<KottiI18n.Props['currencyMap']>,\n\t\t},\n\t\tlocale: {\n\t\t\trequired: true,\n\t\t\ttype: String as PropType<KottiI18n.Props['locale']>,\n\t\t},\n\t\tmessages: {\n\t\t\t/**\n\t\t\t * default to a Partial object, because the provision hook handles\n\t\t\t * the default values.\n\t\t\t */\n\t\t\tdefault: (): KottiI18n.Props['messages'] => ({}),\n\t\t\ttype: Object as PropType<KottiI18n.Props['messages']>,\n\t\t},\n\t\tnumberFormat: {\n\t\t\t/**\n\t\t\t * default to a Partial object, because the provision hook handles\n\t\t\t * the default values.\n\t\t\t */\n\t\t\tdefault: (): KottiI18n.Props['numberFormat'] => ({}),\n\t\t\ttype: Object as PropType<KottiI18n.Props['numberFormat']>,\n\t\t},\n\t},\n\tsetup(props, { slots }) {\n\t\tuseI18nProvide({\n\t\t\tcurrencyMap: computed(() => props.currencyMap),\n\t\t\tlocale: computed(() => props.locale),\n\t\t\tmessages: computed(() => props.messages),\n\t\t\tnumberFormat: computed(() => props.numberFormat),\n\t\t})\n\n\t\treturn () => h('div', [slots.default?.() ?? null])\n\t},\n})\n\nexport { KtI18nContext }\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport { KtI18nContext as KtI18nContextVue } from './KtI18nContext'\n\nexport const KtI18nContext = attachMeta(makeInstallable(KtI18nContextVue), {\n\taddedVersion: '2.0.0',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.I18n',\n\t\tschema: null,\n\t},\n})\n\nexport * from './constants'\n","<template>\n\t<div class=\"kt-line\">\n\t\t<div v-if=\"position !== Position.LEFT\" class=\"kt-line__line\" />\n\t\t<div v-if=\"text\" :class=\"textClasses\" @click=\"handleClick\" v-text=\"text\" />\n\t\t<div v-if=\"position !== Position.RIGHT\" class=\"kt-line__line\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport { KottiLine } from './types'\n\nexport default defineComponent({\n\tname: 'KtLine',\n\tprops: makeProps(KottiLine.propsSchema),\n\temits: ['click'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\thandleClick: () => {\n\t\t\t\tif (props.isInteractive) emit('click')\n\t\t\t},\n\t\t\tPosition: KottiLine.Position,\n\t\t\ttextClasses: computed(() => ({\n\t\t\t\t'kt-line__text': true,\n\t\t\t\t'kt-line__text--is-interactive': props.isInteractive,\n\t\t\t})),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-line {\n\tdisplay: flex;\n\talign-items: center;\n\theight: 0.8rem;\n\tmargin: 0.2rem 0;\n\n\t&__line {\n\t\tflex: 1 1 auto;\n\t\twidth: 100%;\n\t\theight: 1px;\n\t\tbackground: var(--ui-02);\n\t}\n\n\t&__text {\n\t\tflex: 1 0 auto;\n\t\tpadding: 0 0.4rem;\n\t\tfont-size: 0.6rem;\n\t\tcolor: var(--text-03);\n\t\ttext-align: center;\n\n\t\t&--is-interactive {\n\t\t\tfont-size: 0.8rem;\n\t\t\tcolor: var(--interactive-01);\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtLineVue from './KtLine.vue'\nimport { KottiLine } from './types'\n\nexport const KtLine = attachMeta(makeInstallable(KtLineVue), {\n\taddedVersion: '1.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A771',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Line',\n\t\tschema: KottiLine.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"kt-navbar-quick-link-tooltip\" @click=\"(e) => $emit('click', e)\">\n\t\t<i ref=\"triggerRef\" class=\"yoco\" v-text=\"icon\" />\n\t\t<div ref=\"contentRef\" v-text=\"label\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport type { Yoco } from '@3yourmind/yoco'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../../constants'\nimport type { EnumToPrimitiveUnion } from '../../zod-utilities/enums'\n\nexport default defineComponent({\n\tname: 'NavbarTooltip',\n\tprops: {\n\t\ticon: {\n\t\t\trequired: true,\n\t\t\ttype: String as PropType<\n\t\t\t\tEnumToPrimitiveUnion<typeof Yoco.Icon> | Yoco.Icon\n\t\t\t>,\n\t\t},\n\t\tlabel: { required: true, type: String },\n\t},\n\temits: ['click'],\n\tsetup() {\n\t\tconst contentRef = ref<Element | null>(null)\n\t\tconst triggerRef = ref<Element | null>(null)\n\n\t\tuseTippy(\n\t\t\ttriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: contentRef.value ?? undefined,\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\tplacement: 'right',\n\t\t\t\ttheme: 'kt-tooltip-navbar',\n\t\t\t})),\n\t\t)\n\n\t\treturn {\n\t\t\tcontentRef,\n\t\t\ttriggerRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-navbar-quick-link-tooltip {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n/* forked from tippy’s light-border theme */\n\n$border: var(--gray-90);\n$fill: var(--gray-90);\n$text: var(--gray-10);\n$shadow: var(--gray-100);\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] {\n\tcolor: $text;\n\tbackground-color: $fill;\n\tborder: 1px solid $border;\n\tbox-shadow: 0 4px 14px -2px $shadow;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-backdrop {\n\tbackground-color: $fill;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-arrow::after,\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-svg-arrow::after {\n\tposition: absolute;\n\tz-index: -1;\n\tcontent: '';\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-arrow::after {\n\tborder-color: transparent;\n\tborder-style: solid;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='top']\n\t> .tippy-arrow::before {\n\tborder-top-color: $border;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='top']\n\t> .tippy-arrow::after {\n\ttop: 17px;\n\tleft: 1px;\n\tborder-width: 7px 7px 0;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='top']\n\t> .tippy-svg-arrow\n\t> svg {\n\ttop: 16px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='top']\n\t> .tippy-svg-arrow::after {\n\ttop: 17px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='bottom']\n\t> .tippy-arrow::before {\n\tbottom: 16px;\n\tborder-bottom-color: $border;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='bottom']\n\t> .tippy-arrow::after {\n\tbottom: 17px;\n\tleft: 1px;\n\tborder-width: 0 7px 7px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='bottom']\n\t> .tippy-svg-arrow\n\t> svg {\n\tbottom: 16px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='bottom']\n\t> .tippy-svg-arrow::after {\n\tbottom: 17px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='left']\n\t> .tippy-arrow::before {\n\tborder-left-color: $border;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='left']\n\t> .tippy-arrow::after {\n\ttop: 1px;\n\tleft: 17px;\n\tborder-width: 7px 0 7px 7px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='left']\n\t> .tippy-svg-arrow\n\t> svg {\n\tleft: 11px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='left']\n\t> .tippy-svg-arrow::after {\n\tleft: 12px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='right']\n\t> .tippy-arrow::before {\n\tright: 16px;\n\tborder-right-color: $border;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='right']\n\t> .tippy-arrow::after {\n\ttop: 1px;\n\tright: 17px;\n\tborder-width: 7px 7px 7px 0;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='right']\n\t> .tippy-svg-arrow\n\t> svg {\n\tright: 11px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'][data-placement^='right']\n\t> .tippy-svg-arrow::after {\n\tright: 12px;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-svg-arrow {\n\tfill: $fill;\n}\n\n.tippy-box[data-theme~='kt-tooltip-navbar'] > .tippy-svg-arrow::after {\n\twidth: 16px;\n\theight: 6px;\n\tbackground-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=');\n\tbackground-size: 16px 6px;\n}\n</style>\n","<template>\n\t<div class=\"kt-navbar-logo-container\">\n\t\t<div\n\t\t\tv-if=\"isNarrow\"\n\t\t\tclass=\"kt-navbar-logo kt-navbar-logo--is-desktop kt-navbar-logo--is-narrow\"\n\t\t>\n\t\t\t<NavbarTooltip\n\t\t\t\t:icon=\"Yoco.Icon.BURGER\"\n\t\t\t\t:label=\"translations.menuExpand\"\n\t\t\t\t@click.stop=\"() => $emit('setIsNarrow', false)\"\n\t\t\t/>\n\t\t</div>\n\t\t<div\n\t\t\tv-else\n\t\t\tclass=\"kt-navbar-logo kt-navbar-logo--is-desktop\"\n\t\t\t@click=\"$emit('logoClick')\"\n\t\t>\n\t\t\t<img alt=\"logo\" class=\"kt-navbar-logo__image\" :src=\"logoUrl\" />\n\t\t\t<NavbarTooltip\n\t\t\t\t:icon=\"Yoco.Icon.HIDE_MENU\"\n\t\t\t\t:label=\"translations.menuCollapse\"\n\t\t\t\t@click.stop=\"() => $emit('setIsNarrow', true)\"\n\t\t\t/>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"kt-navbar-logo kt-navbar-logo--is-mobile\"\n\t\t\t@click=\"$emit('logoClick')\"\n\t\t>\n\t\t\t<img alt=\"logo\" class=\"kt-navbar-logo__image\" :src=\"logoUrl\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\n\nimport NavbarTooltip from './NavbarTooltip.vue'\n\nexport default defineComponent({\n\tname: 'NavbarLogo',\n\tcomponents: {\n\t\tNavbarTooltip,\n\t},\n\tprops: {\n\t\tisNarrow: { default: false, type: Boolean },\n\t\tlogoUrl: { required: true, type: String },\n\t},\n\temits: ['logoClick', 'setIsNarrow'],\n\tsetup() {\n\t\tconst translations = useTranslationNamespace('KtNavbar')\n\n\t\treturn {\n\t\t\ttranslations,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-style/_variables.scss';\n\n$margin: 0.8rem 1rem;\n\n.kt-navbar-logo-container {\n\tdisplay: flex;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.kt-navbar-logo {\n\t:deep(.yoco) {\n\t\tpadding: $margin;\n\t\tfont-size: 1.2rem;\n\t\tcolor: var(--kt-navbar-color-light);\n\n\t\t&:hover {\n\t\t\tcolor: var(--kt-navbar-color-active);\n\t\t}\n\t}\n\n\t&--is-desktop {\n\t\tdisplay: flex;\n\t\tflex: 1;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\n\t\t.kt-navbar-logo__image {\n\t\t\tmargin: $margin;\n\t\t\tmargin-right: 0; // already handled by the padding of the toggle button\n\t\t}\n\t}\n\n\t&--is-mobile {\n\t\tdisplay: none;\n\t\tflex: 1;\n\t\talign-items: center;\n\t\talign-self: center;\n\t\tjustify-content: center;\n\t\theight: 100%;\n\t}\n\n\t&--is-narrow {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t}\n\n\t&__image {\n\t\t// Calculates from:\n\t\t//  12rem (menu width)\n\t\t//  - 1 rem (image margin left)\n\t\t//  - 0 rem (image margin right)\n\t\t//  - 3.2rem (yoco icon container width)\n\t\tmax-width: 7.8rem;\n\t}\n}\n\n@media (width <= $size-md) {\n\t.kt-navbar-logo {\n\t\t&--is-desktop {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&--is-mobile {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&__image {\n\t\t\tmax-height: 2rem;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-navbar-menu\">\n\t\t<div v-for=\"(item, index) in parsedSections\" :key=\"index\">\n\t\t\t<div\n\t\t\t\tv-if=\"item.title\"\n\t\t\t\tclass=\"kt-navbar-menu__section\"\n\t\t\t\tv-text=\"isNarrow ? '' : item.title\"\n\t\t\t/>\n\t\t\t<component\n\t\t\t\t:is=\"link.component\"\n\t\t\t\tv-for=\"(link, linkIndex) in item.links\"\n\t\t\t\t:key=\"linkIndex\"\n\t\t\t\tv-bind=\"link.props\"\n\t\t\t\tclass=\"kt-navbar-menu__item\"\n\t\t\t\t:class=\"{ active: link.isActive, narrow: isNarrow }\"\n\t\t\t\t@click=\"$emit('menuLinkClick', link)\"\n\t\t\t>\n\t\t\t\t<NavbarTooltip v-if=\"isNarrow\" :icon=\"link.icon\" :label=\"link.title\" />\n\t\t\t\t<div v-else class=\"yoco\" v-text=\"link.icon\" />\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isNarrow\"\n\t\t\t\t\t:data-test=\"`kt-navbar-section-item-${link.title.toLowerCase()}`\"\n\t\t\t\t\tv-text=\"link.title\"\n\t\t\t\t/>\n\t\t\t</component>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { makeProps } from '../../make-props'\nimport { KottiNavbar } from '../types'\n\nimport NavbarTooltip from './NavbarTooltip.vue'\n\nconst propsSchema = KottiNavbar.propsSchema.pick({\n\tisNarrow: true,\n\tsections: true,\n})\n\nexport default defineComponent({\n\tname: 'KtNavbarMenu',\n\tcomponents: {\n\t\tNavbarTooltip,\n\t},\n\tprops: makeProps(propsSchema),\n\temits: ['menuLinkClick'],\n\tsetup(props) {\n\t\treturn {\n\t\t\tparsedSections: computed(() =>\n\t\t\t\tpropsSchema.shape.sections.parse(props.sections),\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-navbar-menu {\n\tbox-sizing: border-box;\n\tpadding: 0.4rem 1rem;\n\ttext-align: left;\n\n\t&__section {\n\t\tdisplay: block;\n\t\tpadding: 0.2rem 0;\n\t\tmargin-top: 0.4rem;\n\t\tfont-size: 0.85em;\n\t\tfont-weight: 700;\n\t\tcolor: var(--kt-navbar-color-light);\n\t\ttext-transform: uppercase;\n\t}\n\n\t&__item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding: 0.6rem 0;\n\t\tfont-size: 0.75rem;\n\t\tcolor: inherit;\n\n\t\t&:hover {\n\t\t\tcolor: var(--kt-navbar-color-active);\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t&.narrow {\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t&.active {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: var(--kt-navbar-color-active);\n\t\t}\n\t}\n\n\t&__item span {\n\t\tmargin-left: 0.8rem;\n\t}\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n}\n</style>\n","<template>\n\t<a :href=\"link\">\n\t\t<div class=\"kt-navbar-notification\">\n\t\t\t<div>\n\t\t\t\t<i\n\t\t\t\t\tv-if=\"!count || !isNarrow\"\n\t\t\t\t\tclass=\"kt-navbar-notification__icon yoco\"\n\t\t\t\t\tv-text=\"'bell'\"\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tv-show=\"!isNarrow\"\n\t\t\t\t\tclass=\"kt-navbar-notification__label\"\n\t\t\t\t\tv-text=\"title\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-show=\"count\"\n\t\t\t\tclass=\"kt-navbar-notification__number\"\n\t\t\t\tv-text=\"count\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"kt-navbar-notification--mobile\">\n\t\t\t<i v-if=\"!count\" class=\"yoco\">bell</i> <span v-else v-text=\"count\" />\n\t\t</div>\n\t</a>\n</template>\n\n<script>\n/* eslint-disable perfectionist/sort-objects */\nexport default {\n\tname: 'KtNavbarNotification',\n\tprops: {\n\t\tcount: { type: Number, default: 0 },\n\t\tisNarrow: { type: Boolean, default: false },\n\t\tlink: { type: String, default: null },\n\t\ttitle: { type: String, default: 'Notification' },\n\t},\n}\n/* eslint-enable perfectionist/sort-objects */\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-navbar-notification {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 0.8rem 1rem;\n\tmargin-bottom: 0.4rem;\n\tfont-size: 0.75rem;\n\tline-height: 1.2rem;\n\tborder-bottom: 1px solid var(--kt-navbar-border);\n\n\tspan {\n\t\tmargin-left: 0.8rem;\n\t}\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n\n\t&__number {\n\t\twidth: 1.2rem;\n\t\theight: 1.2rem;\n\t\tfont-size: 0.6rem;\n\t\tline-height: 1.2rem;\n\t\ttext-align: center;\n\t\tbackground: rgb(255 255 255 / 26%);\n\t\tborder-radius: 0.6rem;\n\t}\n\n\t&--mobile {\n\t\tdisplay: none;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-navbar-quick-links\">\n\t\t<div v-if=\"!isNarrow\" class=\"kt-navbar-quick-links__title\" v-text=\"title\" />\n\t\t<a\n\t\t\tv-for=\"(item, index) in links\"\n\t\t\t:key=\"index\"\n\t\t\tclass=\"kt-navbar-quick-link\"\n\t\t\t:href=\"item.link\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\ttarget=\"_blank\"\n\t\t>\n\t\t\t<span v-if=\"!isNarrow\" v-text=\"item.title\" />\n\t\t\t<div v-if=\"!isNarrow\" class=\"yoco\" v-text=\"Yoco.Icon.LINK\" />\n\t\t\t<NavbarTooltip\n\t\t\t\tv-else\n\t\t\t\tclass=\"kt-navbar-quick-link__tooltip\"\n\t\t\t\t:icon=\"Yoco.Icon.LINK\"\n\t\t\t\t:label=\"item.title\"\n\t\t\t/>\n\t\t</a>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../kotti-i18n/hooks'\nimport type { KottiNavbar } from '../types'\n\nimport NavbarTooltip from './NavbarTooltip.vue'\n\nexport default defineComponent({\n\tname: 'KtNavbarQuickLink',\n\tcomponents: {\n\t\tNavbarTooltip,\n\t},\n\tprops: {\n\t\tisNarrow: { default: false, type: Boolean },\n\t\tlinks: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<Array<KottiNavbar.QuickLink>>,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst translations = useTranslationNamespace('KtNavbar')\n\n\t\treturn {\n\t\t\ttitle: computed(() => translations.value.quickLinksTitle),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-navbar-quick-links {\n\tpadding: 1.2rem 1rem;\n\tmargin: 0.4rem 0;\n\n\t&__title {\n\t\tfont-size: 0.6rem;\n\t\tfont-weight: 700;\n\t\ttext-transform: uppercase;\n\t\topacity: 0.64;\n\t}\n}\n\n.kt-navbar-quick-link {\n\tdisplay: flex;\n\talign-items: center;\n\tcolor: var(--kt-navbar-color-light);\n\n\t&:hover {\n\t\tcolor: var(--kt-navbar-color-active);\n\t}\n\n\t:deep(.yoco) {\n\t\tfont-size: 0.8rem;\n\t}\n\n\t&__tooltip {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t}\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue'\n\nimport { KottiNavbar } from './types'\n\nexport const KT_NAVBAR_CONTEXT: InjectionKey<Ref<KottiNavbar.Context>> =\n\tSymbol('KT_NAVBAR_CONTEXT')\n\nexport const NAVBAR_THEME: Record<\n\tKottiNavbar.Theme,\n\t{\n\t\tbackground: string\n\t\tborder: string\n\t\tcolor: string\n\t\tcolorActive: string\n\t\tcolorLight: string\n\t\tuserMenuBackground: string\n\t\tuserMenuBackgroundActive: string\n\t\tuserMenuColor: string\n\t}\n> = {\n\t[KottiNavbar.Theme.DARK]: {\n\t\tbackground: 'var(--gray-90)',\n\t\tborder: 'var(--gray-70)',\n\t\tcolor: 'var(--gray-10)',\n\t\tcolorActive: 'var(--gray-10)',\n\t\tcolorLight: 'var(--primary-10)',\n\t\tuserMenuBackground: 'var(--gray-70)',\n\t\tuserMenuBackgroundActive: 'var(--gray-80)',\n\t\tuserMenuColor: 'var(--gray-10)',\n\t},\n\t[KottiNavbar.Theme.DEFAULT]: {\n\t\tbackground: 'var(--primary-70)',\n\t\tborder: 'var(--primary-60)',\n\t\tcolor: 'var(--primary-10)',\n\t\tcolorActive: 'var(--white)',\n\t\tcolorLight: 'var(--primary-20)',\n\t\tuserMenuBackground: 'var(--primary-60)',\n\t\tuserMenuBackgroundActive: 'var(--primary-70)',\n\t\tuserMenuColor: 'var(--primary-10)',\n\t},\n\t[KottiNavbar.Theme.LIGHT]: {\n\t\tbackground: 'var(--white)',\n\t\tborder: 'var(--gray-20)',\n\t\tcolor: 'var(--primary-90)',\n\t\tcolorActive: 'var(--primary-50)',\n\t\tcolorLight: 'var(--primary-80)',\n\t\tuserMenuBackground: 'var(--gray-10)',\n\t\tuserMenuBackgroundActive: 'var(--gray-20)',\n\t\tuserMenuColor: 'var(--primary-90)',\n\t},\n\t[KottiNavbar.Theme.REVERSE]: {\n\t\tbackground: 'var(--primary-10)',\n\t\tborder: 'var(--primary-20)',\n\t\tcolor: 'var(--primary-80)',\n\t\tcolorActive: 'var(--primary-60)',\n\t\tcolorLight: 'var(--primary-100)',\n\t\tuserMenuBackground: 'var(--primary-20)',\n\t\tuserMenuBackgroundActive: 'var(--primary-30)',\n\t\tuserMenuColor: 'var(--primary-80)',\n\t},\n}\n","<template>\n\t<nav ref=\"navbarRef\" class=\"kt-navbar\" :class=\"classes\">\n\t\t<div class=\"kt-navbar-wrapper\">\n\t\t\t<div ref=\"tippyTriggerRef\" class=\"kt-navbar-toggle\">\n\t\t\t\t<i class=\"yoco\" v-text=\"Yoco.Icon.BURGER\" />\n\t\t\t</div>\n\t\t\t<div class=\"kt-navbar__header\">\n\t\t\t\t<NavbarLogo\n\t\t\t\t\t:isNarrow=\"isNarrow\"\n\t\t\t\t\t:logoUrl=\"logoUrl\"\n\t\t\t\t\t@logoClick=\"$emit('logoClick')\"\n\t\t\t\t\t@setIsNarrow=\"setIsNarrow\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<NavbarNotification\n\t\t\t\tv-if=\"notification\"\n\t\t\t\t:count=\"notification.count\"\n\t\t\t\t:isNarrow=\"isNarrow\"\n\t\t\t\t:link=\"notification.link\"\n\t\t\t\t:title=\"notification.title\"\n\t\t\t/>\n\t\t\t<div class=\"kt-navbar__body\">\n\t\t\t\t<NavbarMenu\n\t\t\t\t\t:isNarrow=\"isNarrow\"\n\t\t\t\t\t:sections=\"sections\"\n\t\t\t\t\t@menuLinkClick=\"$emit('linkClick', $event)\"\n\t\t\t\t/>\n\t\t\t\t<NavbarQuickLink\n\t\t\t\t\tv-if=\"quickLinks.length > 0\"\n\t\t\t\t\t:isNarrow=\"isNarrow\"\n\t\t\t\t\t:links=\"quickLinks\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tref=\"mobileMenuRef\"\n\t\t\t\tclass=\"kt-navbar__dropdown\"\n\t\t\t\t@click=\"hideMobileMenu\"\n\t\t\t>\n\t\t\t\t<NavbarMenu\n\t\t\t\t\t:sections=\"sections\"\n\t\t\t\t\t@menuLinkClick=\"$emit('linkClick', $event)\"\n\t\t\t\t/>\n\n\t\t\t\t<NavbarQuickLink\n\t\t\t\t\tv-if=\"quickLinks.length > 0\"\n\t\t\t\t\t:isNarrow=\"isNarrow\"\n\t\t\t\t\t:links=\"quickLinks\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"kt-navbar__footer\">\n\t\t\t\t<slot name=\"navbar-footer\" />\n\t\t\t</div>\n\t\t</div>\n\t</nav>\n</template>\n\n<script lang=\"ts\">\nimport castArray from 'lodash/castArray.js'\nimport { computed, defineComponent, provide, ref, watch } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport NavbarLogo from './components/NavbarLogo.vue'\nimport NavbarMenu from './components/NavbarMenu.vue'\nimport NavbarNotification from './components/NavbarNotification.vue'\nimport NavbarQuickLink from './components/NavbarQuickLink.vue'\nimport { NAVBAR_THEME } from './constants'\nimport { KT_NAVBAR_CONTEXT } from './constants'\nimport { KottiNavbar } from './types'\n\nexport default defineComponent({\n\tname: 'KtNavbar',\n\tcomponents: {\n\t\tNavbarLogo,\n\t\tNavbarMenu,\n\t\tNavbarNotification,\n\t\tNavbarQuickLink,\n\t},\n\tprops: makeProps(KottiNavbar.propsSchema),\n\temits: ['linkClick', 'logoClick', 'setIsNarrow'],\n\tsetup(props, { emit }) {\n\t\tconst mobileMenuRef = ref<HTMLElement | null>(null)\n\t\tconst navbarRef = ref<HTMLElement | null>(null)\n\t\tconst tippyTriggerRef = ref<HTMLElement | null>(null)\n\n\t\tprovide(\n\t\t\tKT_NAVBAR_CONTEXT,\n\t\t\tcomputed(() => ({ isNarrow: props.isNarrow, theme: props.theme })),\n\t\t)\n\n\t\twatch(\n\t\t\t() => props.theme,\n\t\t\t(newTheme) => {\n\t\t\t\tif (typeof document === 'undefined') return // SSR\n\t\t\t\tconst rootElement = document.querySelector(':root') as HTMLElement\n\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--kt-navbar-background',\n\t\t\t\t\tNAVBAR_THEME[newTheme].background,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--kt-navbar-border',\n\t\t\t\t\tNAVBAR_THEME[newTheme].border,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--kt-navbar-color',\n\t\t\t\t\tNAVBAR_THEME[newTheme].color,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--kt-navbar-color-active',\n\t\t\t\t\tNAVBAR_THEME[newTheme].colorActive,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--kt-navbar-color-light',\n\t\t\t\t\tNAVBAR_THEME[newTheme].colorLight,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--user-menu-background-active',\n\t\t\t\t\tNAVBAR_THEME[newTheme].userMenuBackgroundActive,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--user-menu-background',\n\t\t\t\t\tNAVBAR_THEME[newTheme].userMenuBackground,\n\t\t\t\t)\n\t\t\t\trootElement.style.setProperty(\n\t\t\t\t\t'--user-menu-color',\n\t\t\t\t\tNAVBAR_THEME[newTheme].userMenuColor,\n\t\t\t\t)\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\tconst { tippy } = useTippy(\n\t\t\tnavbarRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: mobileMenuRef.value ?? undefined,\n\t\t\t\tinteractive: true,\n\t\t\t\tmaxWidth: 'none',\n\t\t\t\toffset: [0, 0],\n\t\t\t\tplacement: 'bottom-start',\n\t\t\t\ttheme: `kt-navbar-${props.theme}`,\n\t\t\t\ttrigger: 'click',\n\t\t\t\ttriggerTarget: tippyTriggerRef.value,\n\t\t\t})),\n\t\t)\n\n\t\treturn {\n\t\t\tclasses: computed(() => ({\n\t\t\t\t[`kt-navbar--theme-${props.theme}`]: true,\n\t\t\t\t'kt-navbar--narrow': props.isNarrow,\n\t\t\t})),\n\t\t\thideMobileMenu: () => {\n\t\t\t\tif (tippy.value === null) return\n\t\t\t\tconst tippys = castArray(tippy.value)\n\n\t\t\t\tfor (const tippy of tippys) {\n\t\t\t\t\ttippy.hide()\n\t\t\t\t}\n\t\t\t},\n\t\t\tmobileMenuRef,\n\t\t\tnavbarRef,\n\t\t\tsetIsNarrow: (isNarrow: boolean) => {\n\t\t\t\temit('setIsNarrow', isNarrow)\n\t\t\t},\n\t\t\ttippyTriggerRef,\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-style/_variables.scss';\n\n.tippy-box[data-theme^='kt-navbar'] {\n\twidth: 100vw;\n\tcolor: var(--kt-navbar-color);\n\tbackground-color: var(--kt-navbar-background);\n\tborder-radius: 0 0 0.2rem 0.2rem;\n\tbox-shadow: 0 2px 4px rgb(0 0 0 / 26%);\n\n\t// HACK: tippy box has a 5px offset that I can not get rid of using its props\n\ttransform: translateX(-5px);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n$navbar-width: 12rem;\n$mobile-navbar-height: 2.4rem;\n$narrow-navbar-width: 3.4rem;\n\n.kt-navbar {\n\tflex: 0 0 $navbar-width;\n\twidth: $navbar-width;\n\tmin-height: 100vh;\n\tcolor: var(--kt-navbar-color);\n\tbackground: var(--kt-navbar-background);\n\tborder-right: 1px solid var(--kt-navbar-border);\n\n\ta:active,\n\ta:focus {\n\t\tcolor: var(--kt-navbar-color-active);\n\t}\n\n\t&-wrapper {\n\t\tposition: fixed;\n\t\tdisplay: flex;\n\t\tflex-flow: column nowrap;\n\t\twidth: $navbar-width;\n\t\theight: 100%;\n\t}\n\n\t&-toggle {\n\t\tdisplay: none;\n\t\tflex: 0 0 2.4rem;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2.4rem;\n\t\theight: $mobile-navbar-height;\n\t\tcolor: var(--kt-navbar-color-light);\n\t\tcursor: pointer;\n\n\t\t&:hover {\n\t\t\tcolor: var(--kt-navbar-color-active);\n\t\t}\n\n\t\t.yoco {\n\t\t\tfont-size: 1.2rem;\n\t\t}\n\t}\n\n\t&__header {\n\t\tflex: 0 0 auto;\n\t\tcursor: pointer;\n\t}\n\n\t&__body {\n\t\tflex: 1 1 100%;\n\t\toverflow-y: auto;\n\t\tscrollbar-width: none;\n\n\t\t&::-webkit-scrollbar {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t&__footer {\n\t\tflex: 0 0 auto;\n\t\tpadding: 0.8rem;\n\t\tborder-top: 1px solid var(--kt-navbar-border);\n\t}\n\n\t&__dropdown {\n\t\tdisplay: none;\n\t}\n\n\t&--narrow {\n\t\t// Needed to make the expanded user menu fully visible\n\t\tz-index: 5;\n\t\tflex: 0 0 $narrow-navbar-width;\n\n\t\t.kt-navbar-wrapper {\n\t\t\tflex: 0 0 $narrow-navbar-width;\n\t\t\twidth: $narrow-navbar-width;\n\t\t}\n\n\t\t.kt-navbar__header {\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t.kt-navbar__body {\n\t\t\tpadding: 0;\n\t\t}\n\n\t\t.kt-navbar__footer {\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t:deep(.kt-navbar-menu) {\n\t\t\tpadding: 0.4rem 0;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t:deep(.kt-navbar-notification) {\n\t\t\tjustify-content: center;\n\t\t\tpadding: 0.8rem 0;\n\t\t}\n\n\t\t:deep(.kt-navbar-notification__number) {\n\t\t\tposition: absolute;\n\t\t\tright: 0.4rem;\n\t\t}\n\n\t\t:deep(.kt-navbar-quick-links) {\n\t\t\tpadding: 0.8rem 0;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t:deep(.kt-navbar-quick-link) {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n\n@media (width <= $size-md) {\n\t.kt-navbar {\n\t\tflex: 0 0 $mobile-navbar-height;\n\t\twidth: auto;\n\t\theight: 2.4rem;\n\t\tmin-height: auto;\n\t\tborder: 0;\n\n\t\t&-wrapper {\n\t\t\tposition: relative;\n\t\t\tflex: 0 0 $mobile-navbar-height;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: space-between;\n\t\t\twidth: 100%;\n\t\t\theight: $mobile-navbar-height;\n\t\t\tpadding: 0;\n\t\t\tborder-bottom: 1px solid var(--kt-navbar-border);\n\t\t}\n\n\t\t&-toggle {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&__header {\n\t\t\tdisplay: flex;\n\t\t\tflex: 1;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: auto;\n\t\t\tpadding: 0.2rem 0;\n\t\t}\n\n\t\t&__footer {\n\t\t\tdisplay: flex;\n\t\t\tflex: 0 0 2.4rem;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tborder: 0;\n\t\t}\n\n\t\t&__body {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&__dropdown {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t:deep(.kt-navbar-notification) {\n\t\tdisplay: none;\n\t}\n\n\t:deep(.kt-navbar-notification--mobile) {\n\t\tdisplay: block;\n\t\twidth: 1.2rem;\n\t\theight: 1.2rem;\n\t\tmargin: 0.6rem 0;\n\t\ttext-align: center;\n\t\tborder: 0;\n\t\tborder-radius: 1.2rem;\n\n\t\t.yoco {\n\t\t\tfont-size: 1rem;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtNavbarVue from './KtNavbar.vue'\nimport { KottiNavbar } from './types'\n\nexport const KtNavbar = attachMeta(makeInstallable(KtNavbarVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=133%3A2569',\n\t},\n\tslots: {\n\t\t'navbar-footer': { description: null, scope: null },\n\t\t'navbar-logo': { description: null, scope: null },\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Navbar',\n\t\tschema: KottiNavbar.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"inline-container\">\n\t\t<li\n\t\t\tv-for=\"page in pageAmount\"\n\t\t\t:key=\"page\"\n\t\t\t:class=\"paginatorClasses(page)\"\n\t\t\t@click=\"$emit('setPage', page)\"\n\t\t\tv-text=\"page\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nexport default defineComponent({\n\tname: 'PaginationExpanded',\n\tprops: {\n\t\tcurrentPage: { required: true, type: Number },\n\t\tpageSize: { required: true, type: Number },\n\t\ttotal: { required: true, type: Number },\n\t},\n\temits: ['setPage'],\n\tsetup(props) {\n\t\treturn {\n\t\t\tpageAmount: computed(() => Math.ceil(props.total / props.pageSize)),\n\t\t\tpaginatorClasses: (page: number) => ({\n\t\t\t\t'kt-pagination__page-item': true,\n\t\t\t\t'kt-pagination__page-item--is-active': props.currentPage === page,\n\t\t\t}),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.inline-container {\n\tdisplay: inline;\n}\n</style>\n","<template>\n\t<div class=\"inline-container\" :style=\"containerStyle\">\n\t\t<li\n\t\t\tv-if=\"showFirstPage\"\n\t\t\t:class=\"paginatorClasses(1)\"\n\t\t\t@click=\"$emit('setPage', 1)\"\n\t\t\tv-text=\"humanReadablePageNumber(1)\"\n\t\t/>\n\t\t<li\n\t\t\tv-if=\"showLeftDots\"\n\t\t\tclass=\"c-auto-important kt-pagination__page-item\"\n\t\t\tv-text=\"'…'\"\n\t\t/>\n\t\t<li\n\t\t\tv-for=\"page in neighborValues\"\n\t\t\t:key=\"page\"\n\t\t\t:class=\"paginatorClasses(page)\"\n\t\t\t@click=\"$emit('setPage', page)\"\n\t\t\tv-text=\"humanReadablePageNumber(page)\"\n\t\t/>\n\t\t<li\n\t\t\tv-if=\"showRightDots\"\n\t\t\tclass=\"c-auto-important kt-pagination__page-item\"\n\t\t\tv-text=\"'…'\"\n\t\t/>\n\t\t<li\n\t\t\tv-if=\"showLastPage\"\n\t\t\t:class=\"paginatorClasses(maximumPage)\"\n\t\t\t@click=\"$emit('setPage', maximumPage)\"\n\t\t\tv-text=\"humanReadablePageNumber(maximumPage)\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport range from 'lodash/range.js'\nimport { computed, defineComponent } from 'vue'\n\nconst ADJACENT_MULTIPLIER = 20\nconst BASE_NUMBER_WIDTH = 24.5\nconst BASE_OFFSET = 3\nconst MAX_NUMBER_OF_ELEMENTS = 5\nconst PIXEL_MULTIPLIER = 2.8\n\nexport default defineComponent({\n\tname: 'PaginationFlexible',\n\tprops: {\n\t\tadjacentAmount: { required: true, type: Number },\n\t\tcurrentPage: { required: true, type: Number },\n\t\tfixedWidth: { required: true, type: Boolean },\n\t\tmaximumPage: { required: true, type: Number },\n\t},\n\temits: ['setPage'],\n\tsetup(props) {\n\t\tconst pixelMargin = computed(() => {\n\t\t\tconst digitWidth = props.maximumPage.toString().length - 1\n\t\t\tconst numberWidth = BASE_NUMBER_WIDTH + digitWidth * PIXEL_MULTIPLIER\n\t\t\tconst baseElementsWidth =\n\t\t\t\t(2 * props.adjacentAmount + MAX_NUMBER_OF_ELEMENTS) * numberWidth\n\t\t\tconst adjacentPagesOffset = props.adjacentAmount * ADJACENT_MULTIPLIER\n\t\t\treturn baseElementsWidth + BASE_OFFSET * 2 + adjacentPagesOffset\n\t\t})\n\n\t\tconst neighborValues = computed(() => {\n\t\t\tconst center = ((): number => {\n\t\t\t\tif (props.currentPage - props.adjacentAmount < 1)\n\t\t\t\t\treturn props.adjacentAmount + 1\n\t\t\t\tif (props.currentPage + props.adjacentAmount > props.maximumPage - 2)\n\t\t\t\t\treturn props.maximumPage - props.adjacentAmount - 1\n\t\t\t\treturn props.currentPage\n\t\t\t})()\n\t\t\tconst start = Math.max(1, center - props.adjacentAmount)\n\t\t\tconst end = Math.min(props.maximumPage, center + props.adjacentAmount)\n\t\t\treturn range(start, end + 1)\n\t\t})\n\n\t\tconst showFirstPage = computed(() => !neighborValues.value.includes(1))\n\t\tconst showLastPage = computed(\n\t\t\t() => !neighborValues.value.includes(props.maximumPage),\n\t\t)\n\n\t\treturn {\n\t\t\tcontainerStyle: computed(\n\t\t\t\t() => props.fixedWidth && { width: `${pixelMargin.value}px` },\n\t\t\t),\n\t\t\thumanReadablePageNumber: (page: number) => page,\n\t\t\tneighborValues,\n\t\t\tpaginatorClasses: (page: number) => ({\n\t\t\t\t'kt-pagination__page-item': true,\n\t\t\t\t'kt-pagination__page-item--is-active': props.currentPage === page,\n\t\t\t}),\n\t\t\tshowFirstPage,\n\t\t\tshowLastPage,\n\t\t\tshowLeftDots: computed(\n\t\t\t\t() => showFirstPage.value && !neighborValues.value.includes(2),\n\t\t\t),\n\t\t\tshowRightDots: computed(\n\t\t\t\t() =>\n\t\t\t\t\tshowLastPage.value &&\n\t\t\t\t\t!neighborValues.value.includes(props.maximumPage),\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.inline-container {\n\tdisplay: inline-flex;\n\tjustify-content: center;\n}\n</style>\n","<template>\n\t<li class=\"kt-pagination__fractionated\" v-text=\"fractionRep\" />\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nexport default defineComponent<{\n\tcurrentPage: number\n\tmaximumPage: number\n}>({\n\tname: 'PaginationFractionated',\n\tprops: {\n\t\tcurrentPage: { required: true, type: Number },\n\t\tmaximumPage: { required: true, type: Number },\n\t},\n\tsetup(props) {\n\t\treturn {\n\t\t\tfractionRep: computed(\n\t\t\t\t() => `${props.currentPage} / ${props.maximumPage}`,\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-pagination__fractionated {\n\tdisplay: inline-block;\n}\n</style>\n","<template>\n\t<div>\n\t\t<ul class=\"kt-pagination\">\n\t\t\t<li :class=\"paginatorClasses(1)\" @click=\"previousPage\">\n\t\t\t\t<i\n\t\t\t\t\tclass=\"yoco kt-pagination__page-button\"\n\t\t\t\t\tv-text=\"Yoco.Icon.CHEVRON_LEFT\"\n\t\t\t\t/>\n\t\t\t</li>\n\t\t\t<component\n\t\t\t\t:is=\"paginationComponent\"\n\t\t\t\tv-bind=\"paginationProps\"\n\t\t\t\t@setPage=\"setCurrentPage($event)\"\n\t\t\t/>\n\t\t\t<li :class=\"paginatorClasses(pageAmount)\" @click=\"nextPage\">\n\t\t\t\t<i\n\t\t\t\t\tclass=\"yoco kt-pagination__page-button\"\n\t\t\t\t\tv-text=\"Yoco.Icon.CHEVRON_RIGHT\"\n\t\t\t\t/>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { makeProps } from '../make-props'\n\nimport PaginationExpanded from './components/PaginationExpanded.vue'\nimport PaginationFlexible from './components/PaginationFlexible.vue'\nimport PaginationFractionated from './components/PaginationFractionated.vue'\nimport { KottiPagination } from './types'\n\nexport default defineComponent({\n\tname: 'KtPagination',\n\tcomponents: {\n\t\tPaginationExpanded,\n\t\tPaginationFlexible,\n\t\tPaginationFractionated,\n\t},\n\tprops: makeProps(KottiPagination.propsSchema),\n\temits: [\n\t\t'currentPageChange',\n\t\t'previousPageClicked',\n\t\t'nextPageClicked',\n\t\t'setPage',\n\t],\n\tsetup(props, { emit }) {\n\t\tconst pageAmount = computed(() => Math.ceil(props.total / props.pageSize))\n\n\t\treturn {\n\t\t\tnextPage: () => {\n\t\t\t\tif (props.page >= pageAmount.value) return\n\t\t\t\temit('nextPageClicked', props.page + 1)\n\t\t\t\temit('setPage', props.page + 1)\n\t\t\t},\n\t\t\tpageAmount,\n\t\t\tpaginationComponent: computed(() => {\n\t\t\t\tconst isFlexLogical = 2 * (props.adjacentAmount + 1) < pageAmount.value\n\t\t\t\tswitch (props.pagingStyle) {\n\t\t\t\t\tcase KottiPagination.PagingStyle.FLEX:\n\t\t\t\t\t\treturn !isFlexLogical || pageAmount.value < 2\n\t\t\t\t\t\t\t? PaginationExpanded.name\n\t\t\t\t\t\t\t: PaginationFlexible.name\n\t\t\t\t\tcase KottiPagination.PagingStyle.FRACTION:\n\t\t\t\t\t\treturn PaginationFractionated.name\n\t\t\t\t\tcase KottiPagination.PagingStyle.EXPAND:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn PaginationExpanded.name\n\t\t\t\t}\n\t\t\t}),\n\t\t\tpaginationProps: computed(() => ({\n\t\t\t\tadjacentAmount: props.adjacentAmount,\n\t\t\t\tcurrentPage: props.page,\n\t\t\t\tfixedWidth: props.fixedWidth,\n\t\t\t\tmaximumPage: pageAmount.value,\n\t\t\t\tpageSize: props.pageSize,\n\t\t\t\ttotal: props.total,\n\t\t\t})),\n\t\t\tpaginatorClasses: (page: number) => ({\n\t\t\t\t'kt-pagination__page-item': true,\n\t\t\t\t'kt-pagination__page-item--is-disabled': props.page === page,\n\t\t\t}),\n\t\t\tpreviousPage: () => {\n\t\t\t\tif (props.page === 1) return\n\t\t\t\temit('previousPageClicked', props.page - 1)\n\t\t\t\temit('setPage', props.page - 1)\n\t\t\t},\n\t\t\tsetCurrentPage: (page: number) => {\n\t\t\t\tif (page === props.page) return\n\t\t\t\temit('currentPageChange', page)\n\t\t\t\temit('setPage', page)\n\t\t\t},\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-style/_variables.scss';\n\n:root {\n\t--kt-pagination-color-active: var(--interactive-03);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.kt-pagination {\n\tmargin: 0;\n\tlist-style: none;\n\tuser-select: none;\n\n\t&__page-button {\n\t\tdisplay: inline-block;\n\t\tpadding: var(--unit-1);\n\t\tbackground: var(--gray-10);\n\t\tborder-radius: var(--border-radius);\n\n\t\t&:hover {\n\t\t\tcursor: pointer;\n\t\t\tbackground: var(--gray-20);\n\t\t}\n\t}\n\n\t:deep(.kt-pagination__page-item--is-active) {\n\t\tcolor: var(--kt-pagination-color-active);\n\t}\n\n\t:deep(.kt-pagination__page-item--is-disabled) {\n\t\tcursor: not-allowed;\n\n\t\t.kt-pagination__page-button {\n\t\t\topacity: 0.46;\n\t\t}\n\t}\n\n\t:deep(.kt-pagination__page-item) {\n\t\tdisplay: inline-block;\n\t\tpadding: var(--unit-2);\n\t\tline-height: 24px;\n\t\ttext-align: center;\n\n\t\t&:hover {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t.disabled {\n\t\tcursor: not-allowed;\n\n\t\t.page-button {\n\t\t\topacity: 0.46;\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtPaginationVue from './KtPagination.vue'\nimport { KottiPagination } from './types'\n\nexport const KtPagination = attachMeta(makeInstallable(KtPaginationVue), {\n\taddedVersion: '0.0.6',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=101%3A1106',\n\t},\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'KottiPagination',\n\t\tschema: KottiPagination.propsSchema,\n\t},\n})\n","<template>\n\t<div\n\t\tclass=\"kt-popover-options-item\"\n\t\t:class=\"{\n\t\t\t'kt-popover-options-item--is-active': isActive,\n\t\t\t'kt-popover-options-item--is-clickable': isClickable,\n\t\t\t'kt-popover-options-item--is-disabled': isDisabled,\n\t\t}\"\n\t\t:data-test=\"dataTest\"\n\t\t:tabindex=\"isDisabled || !isClickable ? -1 : 0\"\n\t\t@click.stop=\"onClick\"\n\t>\n\t\t<slot name=\"option\">\n\t\t\t<i v-if=\"icon\" class=\"yoco\" v-text=\"icon\" />\n\t\t\t<div v-if=\"label\" v-text=\"label\" />\n\t\t</slot>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue'\n\nimport { makeProps } from '../../make-props'\nimport { IconTextItem } from '../types'\n\nexport default defineComponent({\n\tname: 'IconTextItem',\n\tprops: makeProps(IconTextItem.propsSchema),\n\temits: ['click'],\n\tsetup(_, { emit }) {\n\t\treturn {\n\t\t\tonClick: (event: MouseEvent) => {\n\t\t\t\temit('click', event)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-field/mixins';\n\n.kt-popover-options-item {\n\t@include no-outline;\n\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: var(--unit-2) var(--unit-4);\n\tuser-select: none;\n\tborder-radius: var(--border-radius);\n\n\t&--is-active {\n\t\tfont-weight: 700;\n\t\tcolor: var(--interactive-03);\n\t}\n\n\t&--is-disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.46;\n\t}\n\n\t&--is-clickable {\n\t\t&:not(.kt-popover-options-item--is-disabled) {\n\t\t\tcursor: pointer;\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: var(--ui-01);\n\n\t\t\t\t&.kt-popover-options-item--is-active {\n\t\t\t\t\tcolor: var(--interactive-01-hover);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.yoco {\n\t\tfont-size: 1rem;\n\t}\n\n\t> *:not(:first-child) {\n\t\tmargin-left: var(--unit-1);\n\t}\n}\n</style>\n","<template>\n\t<div class=\"kt-popover\">\n\t\t<div ref=\"triggerRef\" tabindex=\"0\">\n\t\t\t<slot :showPopover=\"showPopover\" />\n\t\t</div>\n\t\t<div ref=\"contentRef\" :class=\"contentClass\">\n\t\t\t<slot :close=\"close\" name=\"content\">\n\t\t\t\t<IconTextItem\n\t\t\t\t\tv-for=\"(option, index) in options\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t:dataTest=\"option.dataTest\"\n\t\t\t\t\t:icon=\"option.icon\"\n\t\t\t\t\t:isActive=\"option.isActive\"\n\t\t\t\t\t:isClickable=\"option.onClick !== undefined\"\n\t\t\t\t\t:isDisabled=\"option.isDisabled\"\n\t\t\t\t\t:label=\"option.label\"\n\t\t\t\t\t@click=\"handleItemClick(option)\"\n\t\t\t\t>\n\t\t\t\t\t<template v-if=\"areOptionsSelectable\" #option>\n\t\t\t\t\t\t<KtFieldToggle\n\t\t\t\t\t\t\t:dataTest=\"option.dataTest\"\n\t\t\t\t\t\t\t:formKey=\"formKey\"\n\t\t\t\t\t\t\t:isDisabled=\"option.isDisabled\"\n\t\t\t\t\t\t\t:isOptional=\"option.isOptional\"\n\t\t\t\t\t\t\t:value=\"option.isSelected\"\n\t\t\t\t\t\t\t@input=\"(() => handleItemSelection({ index, option }))()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span v-text=\"option.label\" />\n\t\t\t\t\t\t</KtFieldToggle>\n\t\t\t\t\t</template>\n\t\t\t\t</IconTextItem>\n\t\t\t</slot>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport castArray from 'lodash/castArray.js'\nimport type { Props as TippyProps } from 'tippy.js'\nimport {\n\tcomputed,\n\tdefineComponent,\n\tinject,\n\tonMounted,\n\tprovide,\n\tref,\n\twatch,\n} from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\n\nimport { TIPPY_DISTANCE_OFFSET } from '../constants'\nimport { KottiFieldToggle } from '../kotti-field-toggle/types'\nimport { KT_FORM_CONTEXT } from '../kotti-form'\nimport type { KottiForm } from '../kotti-form/types'\nimport { makeProps } from '../make-props'\n\nimport IconTextItem from './components/IconTextItem.vue'\nimport { KT_IS_IN_POPOVER } from './constants'\nimport { KottiPopover } from './types'\n\nconst TRIGGER_MAP: Record<KottiPopover.Trigger, TippyProps['trigger']> = {\n\t[KottiPopover.Trigger.CLICK]: 'click focusin',\n\t[KottiPopover.Trigger.HOVER]: 'mouseenter focusin',\n\t[KottiPopover.Trigger.MANUAL]: 'manual',\n}\n\nexport default defineComponent({\n\tname: 'KtPopover',\n\tcomponents: {\n\t\tIconTextItem,\n\t},\n\tprops: makeProps(KottiPopover.propsSchema),\n\temits: ['update:isSelected'],\n\tsetup(props, { emit }) {\n\t\tconst triggerRef = ref<HTMLElement | null>(null)\n\t\tconst contentRef = ref<HTMLElement | null>(null)\n\n\t\tconst showPopover = ref(false)\n\n\t\tconst formContext = inject<KottiForm.Context | null>(KT_FORM_CONTEXT, null)\n\n\t\tonMounted(() => {\n\t\t\tif (contentRef.value === null)\n\t\t\t\tthrow new Error('KtPopover: Unbound `contentRef` for tippy: null')\n\t\t})\n\n\t\twatch(\n\t\t\ttriggerRef,\n\t\t\t(newRef) => {\n\t\t\t\tif (newRef) {\n\t\t\t\t\tnewRef.addEventListener('focus', () => {\n\t\t\t\t\t\tconst childrenArray = Array.from(newRef.children)\n\n\t\t\t\t\t\tif (childrenArray.length > 0) {\n\t\t\t\t\t\t\tconst focusableChildIndex = childrenArray.findIndex((child) => {\n\t\t\t\t\t\t\t\tif (child instanceof HTMLElement) child.focus()\n\n\t\t\t\t\t\t\t\treturn document.activeElement === child\n\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\tif (focusableChildIndex !== -1) {\n\t\t\t\t\t\t\t\tnewRef.setAttribute('tabIndex', '-1')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ flush: 'post' },\n\t\t)\n\n\t\t/**\n\t\t * expose to children that they are inside a popover\n\t\t */\n\t\tprovide(KT_IS_IN_POPOVER, true)\n\n\t\tconst { tippy } = useTippy(\n\t\t\ttriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () => document.body,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: contentRef.value ?? undefined,\n\t\t\t\t/**\n\t\t\t\t * @see {@link https://atomiks.github.io/tippyjs/v6/all-props/#hideonclick}\n\t\t\t\t */\n\t\t\t\thideOnClick: false,\n\t\t\t\tinteractive: true,\n\t\t\t\tmaxWidth: 'none',\n\t\t\t\toffset: [0, TIPPY_DISTANCE_OFFSET],\n\t\t\t\tonClickOutside: () => {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\t\t\tif (props.trigger !== KottiPopover.Trigger.MANUAL) close()\n\t\t\t\t},\n\t\t\t\tonHide: () => {\n\t\t\t\t\tshowPopover.value = false\n\t\t\t\t},\n\t\t\t\tonShow: () => {\n\t\t\t\t\tif (!props.isDisabled) showPopover.value = true\n\t\t\t\t\telse return false\n\t\t\t\t},\n\t\t\t\tonUntrigger: () => {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\t\t\t\tclose()\n\t\t\t\t},\n\t\t\t\tplacement: props.placement,\n\t\t\t\ttheme: 'light-border',\n\t\t\t\ttrigger: TRIGGER_MAP[props.trigger],\n\t\t\t})),\n\t\t)\n\n\t\tconst setIsShown = (showTippy: boolean) => {\n\t\t\tif (tippy.value === null) return\n\n\t\t\tconst tippys = castArray(tippy.value)\n\n\t\t\tfor (const tippy of tippys) {\n\t\t\t\tif (showTippy) tippy.show()\n\t\t\t\telse tippy.hide()\n\t\t\t}\n\t\t}\n\n\t\tconst close = () => {\n\t\t\tsetIsShown(false)\n\t\t}\n\t\tconst open = () => {\n\t\t\tsetIsShown(true)\n\t\t}\n\n\t\treturn {\n\t\t\tclose,\n\t\t\tcontentClass: computed(() => {\n\t\t\t\tconst classes = [\n\t\t\t\t\t'kt-popover__content',\n\t\t\t\t\t`kt-popover__content--size-${props.size}`,\n\t\t\t\t]\n\n\t\t\t\tif (props.options.length > 0)\n\t\t\t\t\tclasses.push(`kt-popover__content--has-options`)\n\n\t\t\t\treturn classes\n\t\t\t}),\n\t\t\tcontentRef,\n\t\t\tformKey: computed(() => (formContext === null ? null : 'NONE')),\n\t\t\thandleItemClick: (option: KottiPopover.PropsInternal['options'][0]) => {\n\t\t\t\tif (!option.isDisabled && option.onClick) {\n\t\t\t\t\toption.onClick()\n\t\t\t\t\tclose()\n\t\t\t\t}\n\t\t\t},\n\t\t\thandleItemSelection:\n\t\t\t\t({\n\t\t\t\t\tindex,\n\t\t\t\t\toption,\n\t\t\t\t}: Pick<KottiPopover.Events.UpdateIsSelected, 'index' | 'option'>) =>\n\t\t\t\t(value: KottiPopover.Events.UpdateIsSelected['value']) => {\n\t\t\t\t\temit('update:isSelected', {\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\toption,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\tKottiFieldToggle,\n\t\t\topen,\n\t\t\tshowPopover,\n\t\t\ttriggerRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n@import '../kotti-field/mixins';\n\n.kt-popover {\n\tdisplay: inline-block;\n\n\t> div {\n\t\t@include no-outline;\n\t}\n\n\t&__content {\n\t\tmargin: 3px -1px; // tippy theme applies 5px 9px padding, therefore this equals 8px 8px\n\n\t\t&--size {\n\t\t\t&-auto {\n\t\t\t\twidth: auto;\n\t\t\t}\n\n\t\t\t&-sm {\n\t\t\t\twidth: 12rem;\n\t\t\t}\n\n\t\t\t&-md {\n\t\t\t\twidth: 16rem;\n\t\t\t}\n\n\t\t\t&-lg {\n\t\t\t\twidth: 20rem;\n\t\t\t}\n\n\t\t\t&-xl {\n\t\t\t\twidth: 24rem;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtPopoverVue from './KtPopover.vue'\nimport { KottiPopover } from './types'\n\nexport const KtPopover = attachMeta(makeInstallable(KtPopoverVue), {\n\taddedVersion: '0.0.8',\n\tdeprecated: null,\n\tdesigns: [\n\t\t{\n\t\t\ttitle: 'Simple',\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=118%3A35',\n\t\t},\n\t\t{\n\t\t\ttitle: 'With Items',\n\t\t\ttype: MetaDesignType.FIGMA,\n\t\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=95%3A552',\n\t\t},\n\t],\n\tslots: {\n\t\tcontent: {\n\t\t\tdescription: 'Slot for the content of the popper.',\n\t\t\tscope: {\n\t\t\t\tclose: {\n\t\t\t\t\tdescription: 'closes the popover',\n\t\t\t\t\ttype: 'function',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tdescription: 'Slot for the trigger element',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Popover',\n\t\tschema: KottiPopover.propsSchema,\n\t},\n})\n","import type { PropType } from 'vue'\nimport { computed, defineComponent, h, provide } from 'vue'\n\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport { KT_ROW_CONTEXT } from './constants'\nimport { KottiRow } from './types'\n\nexport const KtRow = attachMeta(\n\tmakeInstallable(\n\t\tdefineComponent({\n\t\t\tname: 'KtRow',\n\t\t\tprops: {\n\t\t\t\talign: {\n\t\t\t\t\tdefault: KottiRow.Align.TOP,\n\t\t\t\t\ttype: String as PropType<KottiRow.Align>,\n\t\t\t\t},\n\t\t\t\tgap: { default: 0, type: Number },\n\t\t\t\tgutter: { default: 16, type: Number },\n\t\t\t\tjustify: {\n\t\t\t\t\tdefault: KottiRow.Justify.START,\n\t\t\t\t\ttype: String as PropType<KottiRow.Justify>,\n\t\t\t\t},\n\t\t\t\ttag: { default: 'div', type: String },\n\t\t\t},\n\t\t\tsetup(props, { slots }) {\n\t\t\t\tconst style = computed(() =>\n\t\t\t\t\tprops.gutter\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tmarginLeft: `-${String(props.gutter / 2)}px`,\n\t\t\t\t\t\t\t\tmarginRight: `-${String(props.gutter / 2)}px`,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {},\n\t\t\t\t)\n\n\t\t\t\tprovide<KottiRow.Context>(KT_ROW_CONTEXT, {\n\t\t\t\t\tgap: computed(() => props.gap),\n\t\t\t\t\tgutter: computed(() => props.gutter),\n\t\t\t\t})\n\n\t\t\t\treturn () =>\n\t\t\t\t\th(\n\t\t\t\t\t\tprops.tag,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclass: [\n\t\t\t\t\t\t\t\t'kt-row',\n\t\t\t\t\t\t\t\tprops.justify !== KottiRow.Justify.START\n\t\t\t\t\t\t\t\t\t? `kt-row--justify-${props.justify}`\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\tprops.align !== KottiRow.Align.TOP\n\t\t\t\t\t\t\t\t\t? `kt-row--align-${props.align}`\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tstyle: style.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[slots.default?.() ?? null],\n\t\t\t\t\t)\n\t\t\t},\n\t\t}),\n\t),\n\t{\n\t\taddedVersion: '0.0.1',\n\t\tdeprecated: null,\n\t\tdesigns: null,\n\t\tslots: {\n\t\t\tdefault: { description: 'Should contain KtCols', scope: null },\n\t\t},\n\t\ttypeScript: {\n\t\t\tnamespace: 'Kotti.Row',\n\t\t\tschema: null,\n\t\t},\n\t},\n)\n","<template>\n\t<KtPopover\n\t\tv-if=\"options && options.length > 0\"\n\t\t:size=\"size\"\n\t\t:trigger=\"isLoading ? 'manual' : 'click'\"\n\t>\n\t\t<KtButton\n\t\t\tdata-test=\"table-column-edit-button\"\n\t\t\t:disabled=\"isLoading\"\n\t\t\t:icon=\"Yoco.Icon.CHEVRON_DOWN\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:label=\"translations.editColumns\"\n\t\t/>\n\t\t<template #content>\n\t\t\t<div class=\"table-columns\">\n\t\t\t\t<KtFieldToggleGroup\n\t\t\t\t\tisOptional\n\t\t\t\t\t:options=\"options\"\n\t\t\t\t\t:value=\"value\"\n\t\t\t\t\t@input=\"$emit('input', $event)\"\n\t\t\t\t/>\n\t\t\t\t<!-- FIXME: ideally this button shoud not be behind the fold -->\n\t\t\t\t<KtButton\n\t\t\t\t\tdata-test=\"table-column-show-all-button\"\n\t\t\t\t\t:disabled=\"isShowAllDisabled\"\n\t\t\t\t\t:label=\"translations.showAll\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t@click=\"$emit('showAll')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtPopover>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\n\nexport default defineComponent({\n\tname: 'TableColumns',\n\tprops: {\n\t\tisLoading: { default: false, type: Boolean },\n\t\toptions: {\n\t\t\trequired: true,\n\t\t\ttype: Array as PropType<{ key: string; label: string }[]>,\n\t\t},\n\t\tsize: { default: 'md', type: String },\n\t\tvalue: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<Record<string, boolean>>,\n\t\t},\n\t},\n\temits: ['input', 'showAll'],\n\tsetup(props) {\n\t\treturn {\n\t\t\tisShowAllDisabled: computed(\n\t\t\t\t(): boolean =>\n\t\t\t\t\tprops.isLoading ||\n\t\t\t\t\tObject.values(props.value).every((optionValue) =>\n\t\t\t\t\t\tBoolean(optionValue),\n\t\t\t\t\t),\n\t\t\t),\n\t\t\ttranslations: useTranslationNamespace('KtStandardTable'),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-columns {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmax-height: 50vh;\n\toverflow-y: auto;\n\n\t:deep(.kt-button) {\n\t\tflex-shrink: 0;\n\t\talign-self: end;\n\t}\n}\n</style>\n","import { Dashes } from '@metatypes/typography'\n\nimport type { KottiFieldDateRange } from '../../../kotti-field-date/types'\nimport type { KottiFieldNumber } from '../../../kotti-field-number/types'\nimport type {\n\tKottiFieldMultiSelect,\n\tKottiFieldSingleSelect,\n} from '../../../kotti-field-select/types'\nimport type { KottiFieldToggle } from '../../../kotti-field-toggle/types'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { KottiStandardTable } from '../types'\n\n/**\n * Returns the empty nullish value\n * @param filter the filter\n * @returns the empty value\n */\nexport const getEmptyValue = (\n\tfilter: KottiStandardTable.FilterInternal,\n): KottiStandardTable.FilterValue => {\n\tswitch (filter.type) {\n\t\tcase KottiStandardTable.FilterType.DATE_RANGE:\n\t\tcase KottiStandardTable.FilterType.NUMBER_RANGE:\n\t\t\treturn [null, null]\n\t\tcase KottiStandardTable.FilterType.MULTI_SELECT:\n\t\t\treturn []\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\n/**\n * Returns the option label\n * @param options the options array\n * @param value the option value\n * @returns the option label\n */\nconst getOptionLabel = (\n\toptions: KottiFieldSingleSelect.Props['options'],\n\tvalue: KottiFieldSingleSelect.Value,\n): string => options.find((option) => option.value === value)?.label ?? ''\n\n/**\n * Formats the filter value as a human readably string\n * @param value the value\n * @param filter the filter\n * @returns the value as a formated string\n */\nexport const formatFilterValue = (\n\tvalue: KottiStandardTable.FilterValue,\n\tfilter: KottiStandardTable.FilterInternal,\n\t// eslint-disable-next-line sonarjs/cognitive-complexity\n): string => {\n\tswitch (filter.type) {\n\t\tcase KottiStandardTable.FilterType.BOOLEAN: {\n\t\t\t// FIXME: useTranslationNamespace should not be called outside of hooks => this should be a hook or\n\t\t\t// the translation object should be passed from the outside\n\t\t\tconst translations = useTranslationNamespace('KtTable')\n\t\t\tconst _value = value as KottiFieldToggle.Value\n\t\t\treturn _value ? translations.value.yes : ''\n\t\t}\n\t\tcase KottiStandardTable.FilterType.DATE_RANGE: {\n\t\t\tconst _value = value as KottiFieldDateRange.Value\n\t\t\treturn _value[0] === null ? '' : _value.join(Dashes.EnDash)\n\t\t}\n\t\tcase KottiStandardTable.FilterType.MULTI_SELECT: {\n\t\t\tconst _value = value as KottiFieldMultiSelect.Value\n\t\t\treturn _value.map((v) => getOptionLabel(filter.options, v)).join(', ')\n\t\t}\n\t\tcase KottiStandardTable.FilterType.NUMBER_RANGE: {\n\t\t\tconst _value = value as [KottiFieldNumber.Value, KottiFieldNumber.Value]\n\t\t\tconst [min, max] = _value\n\n\t\t\tif (min === null && max === null) return ''\n\n\t\t\tconst unit = filter.unit ? ` ${filter.unit}` : ''\n\n\t\t\tif (min !== null && max !== null)\n\t\t\t\treturn min === max\n\t\t\t\t\t? `${min}${unit}`\n\t\t\t\t\t: `${min}${Dashes.EnDash}${max}${unit}`\n\n\t\t\t// FIXME: useTranslationNamespace should not be called outside of hooks => this should be a hook or\n\t\t\t// the translation object should be passed from the outside\n\t\t\tconst translations = useTranslationNamespace('KtStandardTable')\n\n\t\t\treturn max !== null\n\t\t\t\t? `${translations.value.upTo} ${max}${unit}`\n\t\t\t\t: min !== null\n\t\t\t\t\t? `${translations.value.moreThan} ${min}${unit}`\n\t\t\t\t\t: ''\n\t\t}\n\t\tcase KottiStandardTable.FilterType.SINGLE_SELECT: {\n\t\t\tconst _value = value as KottiFieldSingleSelect.Value\n\t\t\treturn getOptionLabel(filter.options, _value)\n\t\t}\n\t}\n}\n\n/**\n * Checks if the value is nullish\n * @param value the field value\n * @returns true if the value is nullish, false otherwise\n */\nexport const isEmptyValue = (value: KottiStandardTable.FilterValue): boolean =>\n\tArray.isArray(value)\n\t\t? value.length === 0 || (value[0] === null && value[1] === null)\n\t\t: value === null\n\n/**\n * Re-orders the Number Range filter value to be [min, max].\n * Value is re-ordered only if both, min and max, are not null values.\n * @param range the Number Range filter value\n * @returns the re-ordered range value\n */\nexport const getReorderedRange = (\n\trange: [KottiFieldNumber.Value, KottiFieldNumber.Value],\n): [KottiFieldNumber.Value, KottiFieldNumber.Value] => {\n\tconst [min, max] = range\n\n\tif (min !== null && max !== null && min > max) return [max, min]\n\n\treturn range\n}\n","<template>\n\t<KtFieldToggle\n\t\t:data-test=\"filter.dataTest\"\n\t\t:isLoading=\"isLoading\"\n\t\tisOptional\n\t\t:label=\"filter.label\"\n\t\tsize=\"small\"\n\t\ttype=\"switch\"\n\t\t:value=\"value\"\n\t\t@input=\"onInput\"\n\t>\n\t\t<span v-if=\"slotLabel\" v-text=\"slotLabel\" />\n\t</KtFieldToggle>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType } from 'vue'\n\nimport type { KottiStandardTable } from '../../types'\n\nexport default defineComponent({\n\tname: 'BooleanFilter',\n\tprops: {\n\t\tfilter: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiStandardTable.FilterInternal & {\n\t\t\t\t\ttype: KottiStandardTable.FilterType.BOOLEAN\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: { default: null, type: Boolean as PropType<boolean | null> },\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tonInput: (value: KottiStandardTable.FilterValue) => {\n\t\t\t\temit('input', {\n\t\t\t\t\tid: props.filter.id,\n\t\t\t\t\toperation: props.filter.operations[0], // Current filters support only one operation\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\t\t\t},\n\t\t\tslotLabel: computed(() => {\n\t\t\t\tif (!props.filter.slotLabels || props.value === null) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tconst index = props.value ? 1 : 0\n\t\t\t\treturn props.filter.slotLabels[index]\n\t\t\t}),\n\t\t}\n\t},\n})\n</script>\n","import dayjs from 'dayjs'\nimport type { ManipulateType } from 'dayjs'\n\nimport { ISO8601 } from '../../../constants'\n\n/**\n * Returns formatted today's date. Default template is ISO8601.\n * @param templateFormat dayjs compatible datetime format string\n * @returns formatted date\n */\nexport const getToday = (templateFormat: string = ISO8601): string =>\n\tdayjs().format(templateFormat)\n\n/**\n * Returns formatted today's date with the specified amount of time subtracted. Default template is ISO8601.\n * @param unit dayjs time unit\n * @param templateFormat dayjs compatible datetime format string\n * @returns formatted date\n */\nexport const getLast = (\n\tunit: ManipulateType,\n\ttemplateFormat: string = ISO8601,\n): string => dayjs().subtract(1, unit).format(templateFormat)\n","<template>\n\t<KtFieldDateRange\n\t\t:isLoading=\"isLoading\"\n\t\tisOptional\n\t\t:label=\"filter.label\"\n\t\t:placeholder=\"[translations.startDate, translations.endDate]\"\n\t\t:shortcuts=\"shortcuts\"\n\t\tsize=\"small\"\n\t\t:value=\"value\"\n\t\t@input=\"onInput\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType } from 'vue'\n\nimport { useTranslationNamespace } from '../../../../kotti-i18n/hooks'\nimport type { KottiStandardTable } from '../../types'\nimport { getLast, getToday } from '../../utilities/date'\n\nexport default defineComponent({\n\tname: 'DateRangeFilter',\n\tprops: {\n\t\tfilter: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiStandardTable.FilterInternal & {\n\t\t\t\t\ttype: KottiStandardTable.FilterType.DATE_RANGE\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: {\n\t\t\tdefault: () => [null, null],\n\t\t\ttype: Array as unknown as PropType<[string | null, string | null]>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtStandardTable')\n\n\t\treturn {\n\t\t\tonInput: (value: KottiStandardTable.FilterValue) => {\n\t\t\t\temit('input', {\n\t\t\t\t\tid: props.filter.id,\n\t\t\t\t\toperation: props.filter.operations[0], // Current filters support only one operation\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\t\t\t},\n\t\t\tshortcuts: computed(() => [\n\t\t\t\t{\n\t\t\t\t\tlabel: translations.value.today,\n\t\t\t\t\tvalue: [getToday(), getToday()],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: translations.value.lastWeek,\n\t\t\t\t\tvalue: [getLast('week'), getToday()],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: translations.value.lastMonth,\n\t\t\t\t\tvalue: [getLast('month'), getToday()],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: translations.value.lastYear,\n\t\t\t\t\tvalue: [getLast('year'), getToday()],\n\t\t\t\t},\n\t\t\t]),\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<KtFieldMultiSelect\n\t\t:data-test=\"filter.dataTest\"\n\t\t:isLoading=\"isLoading\"\n\t\t:isUnsorted=\"filter.isUnsorted\"\n\t\tisOptional\n\t\t:label=\"filter.label\"\n\t\t:options=\"filter.options\"\n\t\tsize=\"small\"\n\t\t:value=\"value\"\n\t\t@input=\"onInput\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\n\nimport type { KottiStandardTable } from '../../types'\n\nexport default defineComponent({\n\tname: 'MultiSelectFilter',\n\tprops: {\n\t\tfilter: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiStandardTable.FilterInternal & {\n\t\t\t\t\ttype: KottiStandardTable.FilterType.MULTI_SELECT\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: {\n\t\t\tdefault: () => [null, null],\n\t\t\ttype: Array as PropType<(number | string)[]>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tonInput: (value: KottiStandardTable.FilterValue) => {\n\t\t\t\temit('input', {\n\t\t\t\t\tid: props.filter.id,\n\t\t\t\t\toperation: props.filter.operations[0], // Current filters support only one operation\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<fieldset class=\"number-range-filter\">\n\t\t<div v-if=\"filter.label\" class=\"number-range-filter__header\">\n\t\t\t<legend class=\"number-range-filter__label\">\n\t\t\t\t<span v-text=\"filter.label\" />\n\t\t\t</legend>\n\t\t</div>\n\t\t<div class=\"number-range-filter__field\">\n\t\t\t<KtFieldNumber\n\t\t\t\tv-bind=\"minFieldProps\"\n\t\t\t\t@blur=\"onMinInputBlur\"\n\t\t\t\t@input=\"onMinValueInput\"\n\t\t\t/>\n\t\t\t<KtFieldNumber\n\t\t\t\tv-bind=\"maxFieldProps\"\n\t\t\t\t@blur=\"onMaxInputBlur\"\n\t\t\t\t@input=\"onMaxValueInput\"\n\t\t\t/>\n\t\t</div>\n\t</fieldset>\n</template>\n\n<script lang=\"ts\">\nimport isEqual from 'lodash/isEqual.js'\nimport { computed, defineComponent, type PropType, ref, watch } from 'vue'\n\nimport type { KottiFieldNumber } from '../../../../kotti-field-number/types'\nimport { useTranslationNamespace } from '../../../../kotti-i18n/hooks'\nimport type { KottiStandardTable } from '../../types'\nimport { getReorderedRange } from '../../utilities/filters'\n\nexport default defineComponent({\n\tname: 'NumberRangeFilter',\n\tprops: {\n\t\tfilter: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiStandardTable.FilterInternal & {\n\t\t\t\t\ttype: KottiStandardTable.FilterType.NUMBER_RANGE\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: {\n\t\t\tdefault: () => [null, null],\n\t\t\ttype: Array as unknown as PropType<[number | null, number | null]>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst translations = useTranslationNamespace('KtStandardTable')\n\n\t\tconst range = ref<[KottiFieldNumber.Value, KottiFieldNumber.Value]>([\n\t\t\tnull,\n\t\t\tnull,\n\t\t])\n\n\t\tconst reOrderAndEmitRangeValue = () => {\n\t\t\trange.value = getReorderedRange(range.value)\n\n\t\t\temit('input', {\n\t\t\t\tid: props.filter.id,\n\t\t\t\toperation: props.filter.operations[0], // Current filters support only one operation\n\t\t\t\tvalue: range.value,\n\t\t\t})\n\t\t}\n\n\t\twatch(\n\t\t\t() => props.value,\n\t\t\t(newRange) => {\n\t\t\t\tif (!isEqual(newRange, range.value))\n\t\t\t\t\trange.value = [newRange[0], newRange[1]]\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tmaxFieldProps: computed(() => ({\n\t\t\t\tdataTest: [props.filter.dataTest, 'max-value-input']\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join('.'),\n\t\t\t\tdecimalPlaces: props.filter.decimalPlaces,\n\t\t\t\thideChangeButtons: true,\n\t\t\t\tisLoading: props.isLoading,\n\t\t\t\tisOptional: true,\n\t\t\t\tplaceholder: translations.value.max,\n\t\t\t\tprefix: props.filter.unit,\n\t\t\t\tsize: 'small',\n\t\t\t\tvalue: range.value[1],\n\t\t\t})),\n\t\t\tminFieldProps: computed(() => ({\n\t\t\t\tdataTest: [props.filter.dataTest, 'min-value-input']\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join('.'),\n\t\t\t\tdecimalPlaces: props.filter.decimalPlaces,\n\t\t\t\thideChangeButtons: true,\n\t\t\t\tisLoading: props.isLoading,\n\t\t\t\tisOptional: true,\n\t\t\t\tplaceholder: translations.value.min,\n\t\t\t\tprefix: props.filter.unit,\n\t\t\t\tsize: 'small',\n\t\t\t\tvalue: range.value[0],\n\t\t\t})),\n\t\t\tonMaxInputBlur: (newMax: KottiFieldNumber.Value) => {\n\t\t\t\tif (props.value[1] !== newMax) reOrderAndEmitRangeValue()\n\t\t\t},\n\t\t\tonMaxValueInput: (newMax: KottiFieldNumber.Value) => {\n\t\t\t\trange.value = [range.value[0], newMax]\n\t\t\t},\n\t\t\tonMinInputBlur: (newMin: KottiFieldNumber.Value) => {\n\t\t\t\tif (props.value[0] !== newMin) reOrderAndEmitRangeValue()\n\t\t\t},\n\t\t\tonMinValueInput: (newMin: KottiFieldNumber.Value) => {\n\t\t\t\trange.value = [newMin, range.value[1]]\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.number-range-filter {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--unit-2);\n\n\t/* overwrite fieldset properties */\n\tpadding: 0;\n\tmargin: 0;\n\tborder: none;\n\n\t&__field {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-4);\n\t\talign-items: center;\n\n\t\t:deep(.kt-field) {\n\t\t\tflex: 1 1 auto;\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tfont-size: 0.6rem;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\n\t\t// This emulates the font-size of small kt-field labels\n\t\tfont-size: 0.9em;\n\t\tcolor: var(--text-02);\n\n\t\tspan {\n\t\t\tfont-weight: 500;\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<KtFieldSingleSelect\n\t\t:data-test=\"filter.dataTest\"\n\t\t:isLoading=\"isLoading\"\n\t\t:isUnsorted=\"filter.isUnsorted\"\n\t\tisOptional\n\t\t:label=\"filter.label\"\n\t\t:options=\"filter.options\"\n\t\tsize=\"small\"\n\t\t:value=\"value\"\n\t\t@input=\"onInput\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\n\nimport type { KottiStandardTable } from '../../types'\n\nexport default defineComponent({\n\tname: 'SingleSelectFilter',\n\tprops: {\n\t\tfilter: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<\n\t\t\t\tKottiStandardTable.FilterInternal & {\n\t\t\t\t\ttype: KottiStandardTable.FilterType.SINGLE_SELECT\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: { default: null, type: [String, Number] },\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tonInput: (value: KottiStandardTable.FilterValue) => {\n\t\t\t\temit('input', {\n\t\t\t\t\tid: props.filter.id,\n\t\t\t\t\toperation: props.filter.operations[0], // Current filters support only one operation\n\t\t\t\t\tvalue,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n","<template>\n\t<div class=\"filter-list\">\n\t\t<component\n\t\t\t:is=\"getComponent(filter)\"\n\t\t\tv-for=\"(filter, index) in filters\"\n\t\t\t:key=\"index\"\n\t\t\t:filter=\"filter\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:value=\"getValue(filter)\"\n\t\t\t@input=\"onInput\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\n\nimport { KottiStandardTable } from '../types'\nimport { getEmptyValue, isEmptyValue } from '../utilities/filters'\n\nimport BooleanFilter from './filters/Boolean.vue'\nimport DateRangeFilter from './filters/DateRange.vue'\nimport MultiSelectFilter from './filters/MultiSelect.vue'\nimport NumberRangeFilter from './filters/NumberRange.vue'\nimport SingleSelectFilter from './filters/SingleSelect.vue'\n\nexport default defineComponent({\n\tname: 'FilterList',\n\tcomponents: {\n\t\tBooleanFilter,\n\t\tDateRangeFilter,\n\t\tMultiSelectFilter,\n\t\tNumberRangeFilter,\n\t\tSingleSelectFilter,\n\t},\n\tprops: {\n\t\tfilters: {\n\t\t\tdefault: () => [],\n\t\t\ttype: Array as PropType<KottiStandardTable.FilterInternal[]>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tvalue: {\n\t\t\tdefault: () => [],\n\t\t\ttype: Array as PropType<KottiStandardTable.AppliedFilter[]>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\treturn {\n\t\t\tgetComponent: (filter: KottiStandardTable.FilterInternal) => {\n\t\t\t\tswitch (filter.type) {\n\t\t\t\t\tcase KottiStandardTable.FilterType.BOOLEAN:\n\t\t\t\t\t\treturn 'BooleanFilter'\n\t\t\t\t\tcase KottiStandardTable.FilterType.DATE_RANGE:\n\t\t\t\t\t\treturn 'DateRangeFilter'\n\t\t\t\t\tcase KottiStandardTable.FilterType.MULTI_SELECT:\n\t\t\t\t\t\treturn 'MultiSelectFilter'\n\t\t\t\t\tcase KottiStandardTable.FilterType.NUMBER_RANGE:\n\t\t\t\t\t\treturn 'NumberRangeFilter'\n\t\t\t\t\tcase KottiStandardTable.FilterType.SINGLE_SELECT:\n\t\t\t\t\t\treturn 'SingleSelectFilter'\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetValue: (filter: KottiStandardTable.FilterInternal) =>\n\t\t\t\tprops.value.find((v) => v.id === filter.id)?.value ??\n\t\t\t\tgetEmptyValue(filter),\n\t\t\tonInput: (value: KottiStandardTable.AppliedFilter) => {\n\t\t\t\tconst isNewValue = !props.value.some((v) => v.id === value.id)\n\t\t\t\tconst updatedValueList = (\n\t\t\t\t\tisNewValue\n\t\t\t\t\t\t? [...props.value, value]\n\t\t\t\t\t\t: props.value.map((v) => (v.id === value.id ? value : v))\n\t\t\t\t).filter(({ value }) => !isEmptyValue(value))\n\n\t\t\t\temit('input', updatedValueList)\n\t\t\t},\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n/* stylelint-disable-next-line selector-class-pattern */\n.filter-list :deep(.kt-field__wrapper) .kt-field__header__label__suffix {\n\tdisplay: none;\n}\n\n.filter-list :deep(.kt-field),\n.filter-list :deep(.kt-field-select) {\n\tmargin-bottom: 0;\n}\n</style>\n","<template>\n\t<KtPopover\n\t\tv-if=\"filters && filters.length > 0\"\n\t\t:size=\"size\"\n\t\t:trigger=\"isLoading ? 'manual' : 'click'\"\n\t>\n\t\t<KtButton\n\t\t\tdata-test=\"table-filter-edit-button\"\n\t\t\t:disabled=\"isLoading\"\n\t\t\t:icon=\"Yoco.Icon.CHEVRON_DOWN\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:label=\"translations.editFilters\"\n\t\t/>\n\t\t<template #content>\n\t\t\t<div class=\"table-filters\">\n\t\t\t\t<FilterList\n\t\t\t\t\tclass=\"table-filters__list\"\n\t\t\t\t\tv-bind=\"{\n\t\t\t\t\t\tfilters,\n\t\t\t\t\t\tisLoading,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t}\"\n\t\t\t\t\t@input=\"$emit('input', $event)\"\n\t\t\t\t/>\n\t\t\t\t<KtButton\n\t\t\t\t\tdata-test=\"table-filter-clear-all-button\"\n\t\t\t\t\t:disabled=\"isLoading\"\n\t\t\t\t\t:label=\"translations.clearAll\"\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t@click=\"$emit('input', [])\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t</KtPopover>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, type PropType } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport type { KottiStandardTable } from '../types'\n\nimport FilterList from './FilterList.vue'\n\nexport default defineComponent({\n\tname: 'TableFilters',\n\tcomponents: {\n\t\tFilterList,\n\t},\n\tprops: {\n\t\tfilters: {\n\t\t\tdefault: () => [],\n\t\t\ttype: Array as PropType<KottiStandardTable.FilterInternal[]>,\n\t\t},\n\t\tisLoading: { default: false, type: Boolean },\n\t\tsize: { default: 'md', type: String },\n\t\tvalue: {\n\t\t\tdefault: () => [],\n\t\t\ttype: Array as PropType<KottiStandardTable.AppliedFilter[]>,\n\t\t},\n\t},\n\temits: ['input'],\n\tsetup() {\n\t\treturn {\n\t\t\ttranslations: useTranslationNamespace('KtStandardTable'),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-filters {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmax-height: 50vh;\n\toverflow-y: auto;\n\n\t&__list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--unit-4);\n\t\tmargin-bottom: var(--unit-4);\n\t}\n\n\t:deep(.kt-button) {\n\t\tflex-shrink: 0;\n\t\talign-self: end;\n\t}\n}\n</style>\n","// eslint-disable-next-line sonarjs/slow-regex\nconst separatorRegex = new RegExp(/\\s*\\|\\s*/g)\n\n/**\n * Applies text pluralization\n * @param translation the translated text with pluralization cases separated by `|`\n * @param count the amount of elements\n * @param values a token-value dictionary to replace tokens in the translated text\n * @returns the pluralized text\n */\nexport const pluralize = (\n\ttranslation: string,\n\tcount: number,\n\tvalues: Record<string, number | string>,\n): string => {\n\tconst cases = translation.split(separatorRegex)\n\n\tif (cases.length < 2) {\n\t\tthrow new Error('Invalid translation string')\n\t}\n\n\tlet result = (\n\t\tcount === 0\n\t\t\t? cases[0]\n\t\t\t: count === 1\n\t\t\t\t? (cases[1] ?? cases[0])\n\t\t\t\t: (cases[2] ?? cases[1] ?? cases[0])\n\t) as string\n\n\tObject.entries(values).forEach(([key, value]) => {\n\t\tresult = result.replaceAll(`{${key}}`, String(value))\n\t})\n\n\treturn result\n}\n","<template>\n\t<div class=\"table-global-selection\">\n\t\t<span v-text=\"selectionLabel\" />\n\t\t<KtButton\n\t\t\tclass=\"table-global-selection__clear-all\"\n\t\t\t:label=\"translations.clearAll\"\n\t\t\tsize=\"small\"\n\t\t\ttype=\"text\"\n\t\t\t@click=\"$emit('emptySelection')\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\n\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { pluralize } from '../utilities/translation'\n\nexport default defineComponent({\n\tname: 'GlobalSelection',\n\tprops: {\n\t\tselectionCount: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t},\n\temits: ['emptySelection'],\n\tsetup: (props) => {\n\t\tconst translations = useTranslationNamespace('KtStandardTable')\n\n\t\treturn {\n\t\t\tselectionLabel: computed(() => {\n\t\t\t\treturn pluralize(\n\t\t\t\t\ttranslations.value.selectionCount,\n\t\t\t\t\tprops.selectionCount,\n\t\t\t\t\t{\n\t\t\t\t\t\tcount: props.selectionCount,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}),\n\t\t\ttranslations,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-global-selection__clear-all {\n\tpadding: 0 6px;\n\tmargin-left: 6px;\n}\n</style>\n","<template>\n\t<div class=\"table-page-size\">\n\t\t<span v-text=\"translations.itemsPerPage\" />\n\t\t<KtFieldSingleSelect\n\t\t\tclass=\"table-page-size__selector\"\n\t\t\tdataTest=\"table-page-size-selector\"\n\t\t\thideClear\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:options=\"options\"\n\t\t\tsize=\"small\"\n\t\t\t:value=\"pageSize\"\n\t\t\t@input=\"$emit('updatePageSize', $event)\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, type PropType } from 'vue'\n\nimport type { KottiFieldSingleSelect } from '../../../kotti-field-select/types'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\n\nexport default defineComponent({\n\tname: 'TablePageSize',\n\tprops: {\n\t\tisLoading: { default: false, type: Boolean },\n\t\tpageSize: { required: true, type: Number },\n\t\tpageSizeOptions: { required: true, type: Array as PropType<number[]> },\n\t},\n\temits: ['updatePageSize'],\n\tsetup(props) {\n\t\treturn {\n\t\t\toptions: computed<KottiFieldSingleSelect.Props['options']>(() =>\n\t\t\t\tprops.pageSizeOptions.map((value) => ({\n\t\t\t\t\tdataTest: `table-page-size-options-${value}`,\n\t\t\t\t\tlabel: String(value),\n\t\t\t\t\tvalue,\n\t\t\t\t})),\n\t\t\t),\n\t\t\ttranslations: useTranslationNamespace('KtStandardTable'),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-page-size {\n\tdisplay: flex;\n\tcolumn-gap: var(--unit-4);\n\talign-items: center;\n\n\t&__selector {\n\t\tmin-width: 96px;\n\t}\n}\n</style>\n","<template>\n\t<div class=\"table-pagination\">\n\t\t<div\n\t\t\tv-if=\"isLoading\"\n\t\t\tclass=\"table-pagination__loading skeleton rectangle\"\n\t\t/>\n\t\t<template v-else>\n\t\t\t<span v-text=\"resultLabel\" />\n\t\t\t<KtPagination\n\t\t\t\tv-if=\"rowCount > 0\"\n\t\t\t\t:adjacentAmount=\"1\"\n\t\t\t\t:page=\"pageIndex + 1\"\n\t\t\t\t:pageSize=\"pageSize\"\n\t\t\t\tpagingStyle=\"flex\"\n\t\t\t\t:total=\"rowCount\"\n\t\t\t\t@setPage=\"(value) => $emit('updatePageIndex', value - 1)\"\n\t\t\t/>\n\t\t</template>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { Dashes } from '@metatypes/typography'\nimport { computed, defineComponent } from 'vue'\n\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\nimport { pluralize } from '../utilities/translation'\n\nexport default defineComponent({\n\tname: 'TablePagination',\n\tprops: {\n\t\tisLoading: { default: false, type: Boolean },\n\t\tpageIndex: { required: true, type: Number },\n\t\tpageSize: { required: true, type: Number },\n\t\trowCount: { required: true, type: Number },\n\t},\n\temits: ['updatePageIndex'],\n\tsetup(props) {\n\t\tconst translations = useTranslationNamespace('KtStandardTable')\n\n\t\treturn {\n\t\t\tresultLabel: computed(() => {\n\t\t\t\tconst start = props.pageIndex * props.pageSize\n\t\t\t\tconst end = Math.min(start + props.pageSize, props.rowCount)\n\n\t\t\t\treturn pluralize(translations.value.resultsCounter, props.rowCount, {\n\t\t\t\t\trange: `${start + 1}${Dashes.EnDash}${end}`,\n\t\t\t\t\ttotal: props.rowCount,\n\t\t\t\t})\n\t\t\t}),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-pagination {\n\tdisplay: flex;\n\tcolumn-gap: var(--unit-8);\n\talign-items: center;\n\tjustify-content: flex-end;\n\tmargin-left: auto;\n\n\t&__loading {\n\t\twidth: 100%;\n\t\theight: 32px;\n\t}\n\n\t:deep(.kt-pagination__page-item) {\n\t\tmargin-top: 0;\n\t}\n}\n</style>\n","<template>\n\t<KtFieldText\n\t\tclass=\"table-search\"\n\t\t:dataTest=\"dataTest ? `${dataTest}.searchInput` : undefined\"\n\t\t:isLoading=\"isLoading\"\n\t\tisOptional\n\t\t:leftIcon=\"Yoco.Icon.SEARCH\"\n\t\t:placeholder=\"placeholder ?? translations.search\"\n\t\tsize=\"small\"\n\t\t:value=\"internalValue\"\n\t\t@input=\"onInput\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport debounce from 'lodash/debounce.js'\nimport { defineComponent, ref, watch } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { DEFAULT_DEBOUNCE } from '../../../constants'\nimport type { KottiFieldText } from '../../../kotti-field-text/types'\nimport { useTranslationNamespace } from '../../../kotti-i18n/hooks'\n\nexport default defineComponent({\n\tname: 'TableSearch',\n\tprops: {\n\t\tdataTest: { default: null, type: String },\n\t\tisLoading: { default: false, type: Boolean },\n\t\tplaceholder: { default: null, type: String },\n\t\tvalue: { default: null, type: String },\n\t},\n\temits: ['input'],\n\tsetup(props, { emit }) {\n\t\tconst internalValue = ref<KottiFieldText.Value>(null)\n\n\t\tconst emitValue = debounce(() => {\n\t\t\temit('input', internalValue.value)\n\t\t}, DEFAULT_DEBOUNCE)\n\n\t\twatch(\n\t\t\t() => props.value,\n\t\t\t(newValue) => {\n\t\t\t\tinternalValue.value = newValue\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tinternalValue,\n\t\t\tonInput: (value: KottiFieldText.Value) => {\n\t\t\t\tinternalValue.value = value\n\t\t\t\temitValue()\n\t\t\t},\n\t\t\ttranslations: useTranslationNamespace('KtStandardTable'),\n\t\t\tYoco,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.table-search {\n\tflex: 1 1 auto;\n\tmin-width: 8rem;\n\tmax-width: 10rem;\n\tmargin-bottom: 0;\n}\n</style>\n","import { inject, provide, type Ref } from 'vue'\n\nimport type { KottiFieldText } from '../../kotti-field-text/types'\nimport type { KottiTable } from '../table/types'\n\nimport type { KottiStandardTable } from './types'\n\nexport type StandardTableContext<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string = string,\n> = Ref<{\n\tinternal: {\n\t\tappliedFilters: KottiStandardTable.AppliedFilter[]\n\t\tcolumns: KottiTable.Column<ROW, COLUMN_ID>[]\n\t\tfilters: KottiStandardTable.FilterInternal[]\n\t\tgetFilter: (\n\t\t\tid: KottiStandardTable.FilterInternal['id'],\n\t\t) => KottiStandardTable.FilterInternal | null\n\t\tisLoading: boolean\n\t\toptions?: KottiStandardTable.Options\n\t\tpageSizeOptions: number[]\n\t\tpagination: { pageIndex: number; pageSize: number }\n\t\trowCount: number\n\t\tsearchValue: KottiFieldText.Value\n\t\tselectMode: 'global' | 'single-page' | null\n\t\tsetAppliedFilters: (value: KottiStandardTable.AppliedFilter[]) => void\n\t\tsetPageIndex: (value: number) => void\n\t\tsetPageSize: (value: number) => void\n\t\tsetSearchValue: (value: KottiFieldText.Value) => void\n\t}\n}>\n\nconst getStandardTableContextKey = (id: string): string =>\n\t`kt-standard-table-${id}`\n\nexport const useProvideStandardTableContext = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>(\n\tid: string,\n\tstandardTableContext: StandardTableContext<ROW, COLUMN_ID>,\n): void => {\n\tprovide<StandardTableContext<ROW, COLUMN_ID>>(\n\t\tgetStandardTableContextKey(id),\n\t\tstandardTableContext,\n\t)\n}\n\nexport const useStandardTableContext = <ROW extends KottiTable.AnyRow>(\n\tid: string,\n): StandardTableContext<ROW> => {\n\tconst context = inject<StandardTableContext<ROW>>(\n\t\tgetStandardTableContextKey(id),\n\t)\n\n\tif (!context) {\n\t\tthrow new Error(`KtStandardTable: could not find context for “${id}”`)\n\t}\n\n\treturn context\n}\n","import type { Table, VisibilityState } from '@tanstack/table-core'\nimport { inject, provide, type Ref } from 'vue'\n\nimport type { GetRowBehavior, KottiTable } from './types'\n\nexport type TableContext<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n> = Ref<{\n\tinternal: {\n\t\tgetColumnIndex: (columnId: COLUMN_ID) => number\n\t\tgetOrdering: () => KottiTable.Ordering[]\n\t\tgetRowBehavior: GetRowBehavior<ROW>\n\t\thasDragAndDrop: boolean\n\t\tisDragAndDropActive: boolean\n\t\tisExpandable: boolean\n\t\tselectionCount: number\n\t\tsetDraggedColumnId: (columnId: COLUMN_ID | null) => void\n\t\tsetDropTargetColumnIndex: (columnIndex: number | null) => void\n\t\tswapDraggedAndDropTarget: () => void\n\t\ttable: Ref<Table<ROW>>\n\t\ttriggerExpand: (rowId: string) => void\n\t\tunselectAllRows: () => void\n\t\tunsetDroppedColumnId: () => void\n\t\tvisibleColumns: VisibilityState\n\t}\n}>\n\nconst getTableContextKey = (id: string): string => `kt-table-${id}`\n\nexport const useProvideTableContext = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>(\n\tid: string,\n\ttableContext: TableContext<ROW, COLUMN_ID>,\n): void => {\n\tprovide<TableContext<ROW, COLUMN_ID>>(getTableContextKey(id), tableContext)\n}\n\nexport const useTableContext = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>(\n\tid: string,\n): TableContext<ROW, COLUMN_ID> => {\n\tconst context = inject<TableContext<ROW, COLUMN_ID>>(getTableContextKey(id))\n\n\tif (!context) throw new Error(`KtTable: could not find context for “${id}”`)\n\n\treturn context\n}\n","<template>\n\t<div class=\"kt-standard-table\">\n\t\t<div\n\t\t\tv-if=\"title || $slots['header-actions']\"\n\t\t\tclass=\"kt-standard-table__header\"\n\t\t>\n\t\t\t<h1 v-if=\"title\" v-text=\"title\" />\n\t\t\t<div v-if=\"$slots['header-actions']\" class=\"kt-standard-table__slot\">\n\t\t\t\t<slot name=\"header-actions\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\t!hideTableActions ||\n\t\t\t\t$slots['control-actions'] ||\n\t\t\t\tinlineFilters.length > 0\n\t\t\t\"\n\t\t\tclass=\"kt-standard-table__controls\"\n\t\t>\n\t\t\t<div v-if=\"!hideTableActions\" class=\"kt-standard-table__table-actions\">\n\t\t\t\t<TableSearch\n\t\t\t\t\tv-if=\"!options?.hideControls?.search\"\n\t\t\t\t\tdata-test=\"table-search-field\"\n\t\t\t\t\t:isLoading=\"isLoadingAndEmpty\"\n\t\t\t\t\t:placeholder=\"options?.searchPlaceholder\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t@input=\"onUpdateSearchValue\"\n\t\t\t\t/>\n\t\t\t\t<TableFilters\n\t\t\t\t\tv-if=\"!options?.hideControls?.filters\"\n\t\t\t\t\t:filters=\"popoverFilters\"\n\t\t\t\t\t:isLoading=\"isLoadingAndEmpty\"\n\t\t\t\t\t:size=\"options?.popoversSize?.filters\"\n\t\t\t\t\t:value=\"appliedFilters\"\n\t\t\t\t\t@input=\"onUpdateAppliedFilters\"\n\t\t\t\t/>\n\t\t\t\t<TableColumns\n\t\t\t\t\tv-if=\"!options?.hideControls?.columns\"\n\t\t\t\t\t:isLoading=\"isLoadingAndEmpty\"\n\t\t\t\t\t:options=\"columnOptions\"\n\t\t\t\t\t:size=\"options?.popoversSize?.columns\"\n\t\t\t\t\t:value=\"columnVisibility\"\n\t\t\t\t\t@input=\"onUpdateColumnVisivility\"\n\t\t\t\t\t@showAll=\"onShowAllColumns\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"kt-standard-table__right-aligned-container\">\n\t\t\t\t<div v-if=\"$slots['control-actions']\" class=\"kt-standard-table__slot\">\n\t\t\t\t\t<slot name=\"control-actions\" />\n\t\t\t\t</div>\n\t\t\t\t<FilterList\n\t\t\t\t\tv-if=\"inlineFilters.length > 0\"\n\t\t\t\t\tclass=\"kt-standard-table__inline-filters\"\n\t\t\t\t\t:filters=\"inlineFilters\"\n\t\t\t\t\t:isLoading=\"isLoadingAndEmpty\"\n\t\t\t\t\t:value=\"appliedFilters\"\n\t\t\t\t\t@input=\"onUpdateAppliedFilters\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"filterTags.length > 0 || $slots['applied-filter-actions']\"\n\t\t\tclass=\"kt-standard-table__info\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-if=\"filterTags.length > 0 && !isLoadingAndEmpty\"\n\t\t\t\tclass=\"kt-standard-table__applied-filters\"\n\t\t\t>\n\t\t\t\t<KtTag\n\t\t\t\t\tv-for=\"({ label, value }, index) in filterTags\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"kt-standard-table__applied-filter-tag\"\n\t\t\t\t\thideActions\n\t\t\t\t\t:label=\"label\"\n\t\t\t\t\t:text=\"value\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"$slots['applied-filter-actions']\"\n\t\t\t\tclass=\"kt-standard-table__slot\"\n\t\t\t>\n\t\t\t\t<slot name=\"applied-filter-actions\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<TableGlobalSelection\n\t\t\tv-show=\"showGlobalSelection\"\n\t\t\t:selectionCount=\"selectionCount\"\n\t\t\t@emptySelection=\"unselectAllRows\"\n\t\t/>\n\t\t<slot\n\t\t\tv-if=\"$scopedSlots['table']\"\n\t\t\t:emptyText=\"emptyText\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\tname=\"table\"\n\t\t\t:rows=\"tableRows\"\n\t\t\t:tableId=\"tableId\"\n\t\t\t:tableProps=\"{ emptyText, isLoading, tableId }\"\n\t\t/>\n\t\t<KtTable\n\t\t\tv-else\n\t\t\t:emptyText=\"emptyText\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:tableId=\"tableId\"\n\t\t/>\n\t\t<div class=\"kt-standard-table__footer\">\n\t\t\t<TablePageSize\n\t\t\t\tv-bind=\"{\n\t\t\t\t\tisLoading,\n\t\t\t\t\tpageSize,\n\t\t\t\t\tpageSizeOptions,\n\t\t\t\t}\"\n\t\t\t\t@updatePageSize=\"onUpdatePageSize\"\n\t\t\t/>\n\t\t\t<TablePagination\n\t\t\t\tv-bind=\"{\n\t\t\t\t\tisLoading: isLoadingAndEmpty,\n\t\t\t\t\tpageIndex,\n\t\t\t\t\tpageSize,\n\t\t\t\t\trowCount,\n\t\t\t\t}\"\n\t\t\t\t@updatePageIndex=\"onUpdatePageIndex\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, watch } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport TableColumns from './standard-table/components/Columns.vue'\nimport FilterList from './standard-table/components/FilterList.vue'\nimport TableFilters from './standard-table/components/Filters.vue'\nimport TableGlobalSelection from './standard-table/components/GlobalSelection.vue'\nimport TablePageSize from './standard-table/components/PageSize.vue'\nimport TablePagination from './standard-table/components/Pagination.vue'\nimport TableSearch from './standard-table/components/Search.vue'\nimport { useStandardTableContext } from './standard-table/context'\nimport { KottiStandardTable } from './standard-table/types'\nimport { formatFilterValue } from './standard-table/utilities/filters'\nimport { useTableContext } from './table/context'\n\nexport default defineComponent({\n\tname: 'KtStandardTable',\n\tcomponents: {\n\t\tFilterList,\n\t\tTableColumns,\n\t\tTableFilters,\n\t\tTableGlobalSelection,\n\t\tTablePageSize,\n\t\tTablePagination,\n\t\tTableSearch,\n\t},\n\tprops: makeProps(KottiStandardTable.propsSchema),\n\temits: ['update:fetchData'],\n\tsetup(props, { emit }) {\n\t\t// eslint-disable-next-line vue/no-setup-props-reactivity-loss\n\t\tconst standardTableContext = useStandardTableContext(props.tableId)\n\t\t// eslint-disable-next-line vue/no-setup-props-reactivity-loss\n\t\tconst tableContext = useTableContext(props.tableId)\n\n\t\tconst appliedFilters = computed(\n\t\t\t() => standardTableContext.value.internal.appliedFilters,\n\t\t)\n\t\tconst searchValue = computed(\n\t\t\t() => standardTableContext.value.internal.searchValue,\n\t\t)\n\n\t\tconst filters = computed(() => standardTableContext.value.internal.filters)\n\t\tconst tablePagination = computed(\n\t\t\t() => standardTableContext.value.internal.pagination,\n\t\t)\n\t\tconst options = computed(() => standardTableContext.value.internal.options)\n\n\t\twatch(\n\t\t\t[\n\t\t\t\tappliedFilters,\n\t\t\t\t() => tableContext.value.internal.getOrdering(),\n\t\t\t\ttablePagination,\n\t\t\t\tsearchValue,\n\t\t\t],\n\t\t\t([filters, ordering, pagination, search]) => {\n\t\t\t\temit('update:fetchData', {\n\t\t\t\t\tfilters,\n\t\t\t\t\tordering,\n\t\t\t\t\tpagination,\n\t\t\t\t\tsearch,\n\t\t\t\t})\n\t\t\t},\n\t\t\t{ immediate: true },\n\t\t)\n\n\t\treturn {\n\t\t\tappliedFilters,\n\t\t\tcolumnOptions: computed(() =>\n\t\t\t\tstandardTableContext.value.internal.columns.map(({ id, label }) => ({\n\t\t\t\t\tkey: id,\n\t\t\t\t\tlabel,\n\t\t\t\t})),\n\t\t\t),\n\t\t\tcolumnVisibility: computed(\n\t\t\t\t() =>\n\t\t\t\t\t// FIXME: use hiddenColumns instead of internal api\n\t\t\t\t\ttableContext.value.internal.table.value.getState().columnVisibility,\n\t\t\t),\n\t\t\tfilterTags: computed(() =>\n\t\t\t\tappliedFilters.value\n\t\t\t\t\t.map(({ id, value }) => {\n\t\t\t\t\t\tconst filter = standardTableContext.value.internal.getFilter(id)\n\n\t\t\t\t\t\tif (!filter) {\n\t\t\t\t\t\t\tthrow new Error(`filter not found for id \"${id}\"`)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formattedValue = formatFilterValue(value, filter)\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tlabel: filter.label,\n\t\t\t\t\t\t\tvalue: formattedValue,\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.filter(({ value }) => value.length > 0),\n\t\t\t),\n\t\t\thideTableActions: computed(\n\t\t\t\t() =>\n\t\t\t\t\toptions.value?.hideControls?.columns &&\n\t\t\t\t\toptions.value.hideControls.filters &&\n\t\t\t\t\toptions.value.hideControls.search,\n\t\t\t),\n\t\t\tinlineFilters: computed(() =>\n\t\t\t\tfilters.value.filter((filter) => filter.displayInline),\n\t\t\t),\n\t\t\tisLoading: computed(() => standardTableContext.value.internal.isLoading),\n\t\t\tisLoadingAndEmpty: computed(\n\t\t\t\t() =>\n\t\t\t\t\tstandardTableContext.value.internal.isLoading &&\n\t\t\t\t\ttableContext.value.internal.table.value.getRowModel().rows.length ===\n\t\t\t\t\t\t0,\n\t\t\t),\n\t\t\tonShowAllColumns: () => {\n\t\t\t\ttableContext.value.internal.table.value.toggleAllColumnsVisible()\n\t\t\t},\n\t\t\tonUpdateAppliedFilters: (value: KottiStandardTable.AppliedFilter[]) => {\n\t\t\t\tstandardTableContext.value.internal.setAppliedFilters(value)\n\t\t\t\tstandardTableContext.value.internal.setPageIndex(0)\n\t\t\t},\n\t\t\tonUpdateColumnVisivility: (value: Record<string, boolean>) => {\n\t\t\t\ttableContext.value.internal.table.value.setColumnVisibility(value)\n\t\t\t},\n\t\t\tonUpdatePageIndex: standardTableContext.value.internal.setPageIndex,\n\t\t\tonUpdatePageSize: standardTableContext.value.internal.setPageSize,\n\t\t\tonUpdateSearchValue: (value: string | null) => {\n\t\t\t\tstandardTableContext.value.internal.setSearchValue(value)\n\t\t\t\tstandardTableContext.value.internal.setPageIndex(0)\n\t\t\t},\n\t\t\toptions,\n\t\t\tpageIndex: computed(() => tablePagination.value.pageIndex),\n\t\t\tpageSize: computed(() => tablePagination.value.pageSize),\n\t\t\tpageSizeOptions: computed(\n\t\t\t\t() => standardTableContext.value.internal.pageSizeOptions,\n\t\t\t),\n\t\t\tpopoverFilters: computed(() =>\n\t\t\t\tfilters.value.filter((filter) => !filter.displayInline),\n\t\t\t),\n\t\t\trowCount: computed(() => standardTableContext.value.internal.rowCount),\n\t\t\tsearchValue,\n\t\t\tselectionCount: computed(\n\t\t\t\t() => tableContext.value.internal.selectionCount,\n\t\t\t),\n\t\t\tshowGlobalSelection: computed(\n\t\t\t\t() =>\n\t\t\t\t\tstandardTableContext.value.internal.selectMode === 'global' &&\n\t\t\t\t\ttableContext.value.internal.selectionCount > 0,\n\t\t\t),\n\t\t\ttableRows: computed(() =>\n\t\t\t\ttableContext.value.internal.table.value\n\t\t\t\t\t.getRowModel()\n\t\t\t\t\t.rows.map((row) => row.original),\n\t\t\t),\n\t\t\tunselectAllRows: tableContext.value.internal.unselectAllRows,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.kt-standard-table {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--unit-4);\n\n\t&__applied-filters {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 4px;\n\t\talign-items: center;\n\t\tjustify-content: left;\n\t}\n\n\t&__applied-filter-tag {\n\t\tmargin: 0;\n\t}\n\n\t&__controls {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-4);\n\t\talign-items: center;\n\t}\n\n\t&__footer {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-4);\n\t\talign-items: center;\n\n\t\t> div {\n\t\t\tflex: 1 1 auto;\n\t\t}\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-4);\n\t\talign-items: center;\n\n\t\th1 {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\t&__info {\n\t\tdisplay: flex;\n\t\tgap: var(--unit-4);\n\t}\n\n\t&__inline-filters {\n\t\tmin-width: 9rem;\n\n\t\t:deep(.kt-field__wrapper) {\n\t\t\t.kt-field__header {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__right-aligned-container {\n\t\tdisplay: flex;\n\t\tgap: 0.8rem;\n\t\tgap: var(--unit-4);\n\t\talign-items: center;\n\t\tmargin-left: auto;\n\t}\n\n\t&__slot {\n\t\tmargin-left: auto;\n\t}\n\n\t&__table-actions {\n\t\tdisplay: flex;\n\t\tflex: 1 1 auto;\n\t\tgap: var(--unit-4);\n\t}\n}\n</style>\n","/**\n * Code is taken from https://github.com/TanStack/table/discussions/4930\n */\n\nimport type {\n\tRowData,\n\tTable,\n\tTableOptions,\n\tTableOptionsResolved,\n} from '@tanstack/table-core'\nimport { createTable } from '@tanstack/table-core'\nimport { defineComponent, h, type Ref, shallowRef, watch } from 'vue'\n\nconst createTextVNode = (text: string) => h('span', text).children?.[0]\n\n/**\n * Vue 2 Compatible version of `FlexRender`\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const FlexRender = defineComponent({\n\tname: 'FlexRender',\n\tprops: ['render', 'props'],\n\tsetup: (props) => () => {\n\t\tif (typeof props.render === 'function') {\n\t\t\tconst rendered = props.render(props.props)\n\n\t\t\t// If it is a VNODE we have to wrap it in a function\n\t\t\tif (typeof rendered === 'object') {\n\t\t\t\treturn rendered\n\t\t\t}\n\n\t\t\treturn createTextVNode(rendered)\n\t\t}\n\n\t\tif (typeof props.render === 'object') {\n\t\t\treturn h(props.render, props.props)\n\t\t}\n\n\t\treturn createTextVNode(props.render)\n\t},\n})\n\n/**\n * Vue 2 reactivity wrapper around TanStack Table Core `createTable`\n *\n * FIXME: replace this with the official package `@tanstack/vue-table` in vue3\n * @link https://www.npmjs.com/package/@tanstack/vue-table\n */\nexport const useVueTable = <T_DATA extends RowData>(\n\toptions: Ref<TableOptions<T_DATA>>,\n): Ref<Table<T_DATA>> => {\n\tconst resolvedOptions: TableOptionsResolved<T_DATA> = {\n\t\tonStateChange: () => {},\n\t\trenderFallbackValue: null,\n\t\tstate: {},\n\t\t...options.value,\n\t}\n\n\tconst internalTable = createTable<T_DATA>(resolvedOptions)\n\tconst table = shallowRef(internalTable)\n\tconst state = shallowRef(internalTable.initialState)\n\n\twatch(\n\t\t[options, state],\n\t\t([optionsVal, stateVal]) => {\n\t\t\tinternalTable.setOptions((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\t...optionsVal,\n\t\t\t\tonStateChange: (updater) => {\n\t\t\t\t\tstate.value =\n\t\t\t\t\t\ttypeof updater === 'function' ? updater(stateVal) : updater\n\n\t\t\t\t\toptionsVal.onStateChange?.(updater)\n\t\t\t\t},\n\t\t\t\tstate: {\n\t\t\t\t\t...stateVal,\n\t\t\t\t\t...optionsVal.state,\n\t\t\t\t},\n\t\t\t}))\n\n\t\t\t// Force rerender\n\t\t\ttable.value = { ...internalTable }\n\t\t},\n\t\t{ immediate: true },\n\t)\n\n\treturn table\n}\n","import type { Ref, WritableComputedRef } from 'vue'\nimport { computed } from 'vue'\n\nexport type ReactStyleUpdater<INTERNAL_VALUE> = (\n\tupdater: INTERNAL_VALUE | ((prevState: INTERNAL_VALUE) => INTERNAL_VALUE),\n) => void\n\ntype Other<INTERNAL_VALUE> = {\n\ttanstackGetter: () => INTERNAL_VALUE\n\ttanstackSetter: ReactStyleUpdater<INTERNAL_VALUE>\n}\n\ntype Options<INTERNAL_VALUE, EXTERNAL_VALUE> = {\n\tget(value: INTERNAL_VALUE): EXTERNAL_VALUE\n\tset(oldValue: EXTERNAL_VALUE): INTERNAL_VALUE\n\tvalue: Ref<INTERNAL_VALUE>\n}\n\nexport const useComputedRef = <INTERNAL_VALUE, EXTERNAL_VALUE = INTERNAL_VALUE>(\n\toptions: Options<INTERNAL_VALUE, EXTERNAL_VALUE>,\n): Other<INTERNAL_VALUE> & WritableComputedRef<EXTERNAL_VALUE> => {\n\tconst internalValue = options.value\n\n\tconst result = computed({\n\t\tget(): EXTERNAL_VALUE {\n\t\t\treturn options.get(internalValue.value)\n\t\t},\n\t\tset(external: EXTERNAL_VALUE): void {\n\t\t\tinternalValue.value = options.set(external)\n\t\t},\n\t}) as Partial<Other<INTERNAL_VALUE>> & WritableComputedRef<EXTERNAL_VALUE>\n\n\tresult.tanstackGetter = () => internalValue.value\n\tresult.tanstackSetter = (updater) => {\n\t\tif (typeof updater === 'function') {\n\t\t\tinternalValue.value = (\n\t\t\t\tupdater as (prevState: INTERNAL_VALUE) => INTERNAL_VALUE\n\t\t\t)(internalValue.value)\n\t\t\treturn\n\t\t}\n\n\t\tinternalValue.value = updater\n\t}\n\n\treturn result as Other<INTERNAL_VALUE> & WritableComputedRef<EXTERNAL_VALUE>\n}\n","import { Dashes } from '@metatypes/typography'\nimport type {\n\tCellContext,\n\tExpandedState,\n\tHeaderContext,\n\tRowSelectionState,\n\tVisibilityState,\n} from '@tanstack/table-core'\nimport {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetExpandedRowModel,\n} from '@tanstack/table-core'\nimport classNames from 'classnames'\nimport { computed, h, ref, type Ref } from 'vue'\nimport { z } from 'zod'\n\nimport { Yoco, yocoIconSchema } from '@3yourmind/yoco'\n\nimport { useI18nContext } from '../../kotti-i18n/hooks'\nimport ToggleInner from '../../shared-components/toggle-inner/ToggleInner.vue'\n\nimport { type TableContext, useProvideTableContext } from './context'\nimport { useVueTable } from './tanstack-table'\nimport type { KottiTable } from './types'\nimport { type GetRowBehavior } from './types'\nimport { type ReactStyleUpdater, useComputedRef } from './use-computed-ref'\n\nexport const EXPANSION_COLUMN_ID = 'internal-expand-column'\nexport const SELECTION_COLUMN_ID = 'internal-select-column'\nconst ARRAY_START = 2\n\ntype SortingState<COLUMN_ID extends string = string> = {\n\tdesc: boolean\n\tid: COLUMN_ID\n}[]\n\ntype InternalColumnId<COLUMN_ID extends string = string> =\n\t| COLUMN_ID\n\t| typeof EXPANSION_COLUMN_ID\n\t| typeof SELECTION_COLUMN_ID\n\nexport type KottiTableParameter<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n> = {\n\tcolumns: KottiTable.Column<ROW, COLUMN_ID>[]\n\tdata: ROW[]\n\texpandMode?: 'multi' | 'single'\n\tgetRowBehavior: GetRowBehavior<ROW>\n\thasDragAndDrop?: boolean\n\tid: string\n\tisSelectable?: boolean\n}\n\nexport const paramsSchema = z\n\t.object({\n\t\tcolumns: z.array(\n\t\t\tz\n\t\t\t\t.object({\n\t\t\t\t\tdisplay: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\talign: z.enum(['center', 'left', 'right']),\n\t\t\t\t\t\t\tdisableCellClick: z.boolean(),\n\t\t\t\t\t\t\tisNumeric: z.boolean(),\n\t\t\t\t\t\t\trender: z.function(),\n\t\t\t\t\t\t\tsortBehavior: z.enum(['asc-desc', 'desc-asc']),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.strict(),\n\t\t\t\t\tgetData: z.function(),\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\tisSortable: z.boolean().default(false),\n\t\t\t\t\tlabel: z.string(),\n\t\t\t\t\tmaxWidth: z.string().optional(),\n\t\t\t\t\tminWidth: z.string().optional(),\n\t\t\t\t\twidth: z.string().optional(),\n\t\t\t\t})\n\t\t\t\t.strict(),\n\t\t),\n\t\tdata: z.array(z.any()),\n\t\texpandMode: z.enum(['multi', 'single']).nullable().default(null),\n\t\t/**\n\t\t * Keep in sync with type expression\n\t\t * @see GetRowBehavior\n\t\t */\n\t\tgetRowBehavior: z\n\t\t\t.function()\n\t\t\t.args(z.object({ row: z.record(z.unknown()), rowIndex: z.number() }))\n\t\t\t.returns(\n\t\t\t\tz.object({\n\t\t\t\t\tactions: z\n\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\tz\n\t\t\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\t\t\tdataTest: z.string().optional(),\n\t\t\t\t\t\t\t\t\ticon: yocoIconSchema,\n\t\t\t\t\t\t\t\t\tisDisabled: z.boolean().optional(),\n\t\t\t\t\t\t\t\t\tonClick: z\n\t\t\t\t\t\t\t\t\t\t.function()\n\t\t\t\t\t\t\t\t\t\t.args()\n\t\t\t\t\t\t\t\t\t\t.returns(z.union([z.void(), z.promise(z.void())])),\n\t\t\t\t\t\t\t\t\ttooltip: z.string().optional(),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.strict(),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tclasses: z.array(z.string()).optional(),\n\t\t\t\t\tclick: z\n\t\t\t\t\t\t.union([\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\tcomponent: z.null(),\n\t\t\t\t\t\t\t\tonClick: z\n\t\t\t\t\t\t\t\t\t.function()\n\t\t\t\t\t\t\t\t\t.args()\n\t\t\t\t\t\t\t\t\t.returns(z.union([z.void(), z.promise(z.void())])),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\tcomponent: z.literal('a'),\n\t\t\t\t\t\t\t\ton: z.record(z.unknown()).optional(),\n\t\t\t\t\t\t\t\tprops: z.object({ href: z.string() }).passthrough(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\tcomponent: z.string().regex(/^[^a]($|.+)/),\n\t\t\t\t\t\t\t\ton: z.record(z.unknown()).optional(),\n\t\t\t\t\t\t\t\tprops: z.record(z.unknown()).optional(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tz.literal('expand'),\n\t\t\t\t\t\t])\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tdisable: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\tactions: z.boolean(),\n\t\t\t\t\t\t\tclick: z.boolean(),\n\t\t\t\t\t\t\texpand: z.boolean(),\n\t\t\t\t\t\t\tselect: z.boolean(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\tisLoading: z.boolean().optional(),\n\t\t\t\t}),\n\t\t\t),\n\t\thasDragAndDrop: z.boolean().default(false),\n\t\tid: z.string(),\n\t\tisSelectable: z.boolean().default(false),\n\t})\n\t.strict()\n\ntype InternalKottiTableParameters<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n> = {\n\tcolumns: KottiTable.Column<ROW, COLUMN_ID>[]\n\tdata: ROW[]\n\tgetRowBehavior: GetRowBehavior<ROW>\n} & {\n\texpandMode: 'multi' | 'single' | null\n\thasDragAndDrop: boolean\n\tid: string\n\tisSelectable: boolean\n}\n\ntype KottiTableHook<ROW extends KottiTable.AnyRow, COLUMN_ID extends string> = {\n\tapi: KottiTable.Hook.Returns<COLUMN_ID>\n\ttableContext: TableContext<ROW, COLUMN_ID>\n}\n\nexport const useKottiTable = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>(\n\t_params: Ref<KottiTableParameter<ROW, COLUMN_ID>>,\n): KottiTableHook<ROW, COLUMN_ID> => {\n\tconst params = computed(\n\t\t() =>\n\t\t\tparamsSchema.parse(_params.value) as InternalKottiTableParameters<\n\t\t\t\tROW,\n\t\t\t\tCOLUMN_ID\n\t\t\t>,\n\t)\n\tconst columnHelper = createColumnHelper<ROW>()\n\tconst i18nContext = useI18nContext()\n\n\tconst columnIdSet = computed<Set<COLUMN_ID>>(() => {\n\t\tconst result = new Set(params.value.columns.map((c) => c.id))\n\n\t\tif (result.size !== params.value.columns.length) {\n\t\t\tthrow new Error('Column ids should be unique')\n\t\t}\n\n\t\treturn result\n\t})\n\tconst rowIdSet = computed<Set<string>>(() => {\n\t\tconst { data, getRowBehavior } = params.value\n\t\treturn new Set(\n\t\t\tdata.map((row, rowIndex) => getRowBehavior({ row, rowIndex }).id),\n\t\t)\n\t})\n\n\t// FIXME: This useComputedRef right now assumes that column ids provdided via params\n\t// do not change. If a user would change them, it will lead to unintended behavior\n\tconst columnOrder = useComputedRef<InternalColumnId[], COLUMN_ID[]>({\n\t\tget: (value) => value.toSpliced(0, ARRAY_START) as COLUMN_ID[],\n\t\tset: (value) => {\n\t\t\tconst newValue: InternalColumnId[] = [\n\t\t\t\tEXPANSION_COLUMN_ID,\n\t\t\t\tSELECTION_COLUMN_ID,\n\t\t\t]\n\t\t\t// Drop unknown columns from outside value\n\t\t\tfor (const columnId of value) {\n\t\t\t\tif (columnIdSet.value.has(columnId) && !newValue.includes(columnId)) {\n\t\t\t\t\tnewValue.push(columnId)\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`useKottiTable: dropped unknown column \"${columnId}\"`)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Append missing column ids\n\t\t\tfor (const column of params.value.columns) {\n\t\t\t\tif (!newValue.includes(column.id)) {\n\t\t\t\t\tnewValue.push(column.id)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newValue\n\t\t},\n\t\tvalue: ref([\n\t\t\tEXPANSION_COLUMN_ID,\n\t\t\tSELECTION_COLUMN_ID,\n\t\t\t...params.value.columns.map(({ id }) => id),\n\t\t]),\n\t})\n\n\t// FIXME: This useComputedRef will not clear out row ids that are not present\n\t// in the data provided via params. That means selection is always global.\n\tconst selectedRows = useComputedRef<RowSelectionState>({\n\t\tget: (value) => value,\n\t\tset: (value) => {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries(value).filter(([_, isSelected]) => isSelected),\n\t\t\t)\n\t\t},\n\t\tvalue: ref({}),\n\t})\n\n\tconst expandedRows = useComputedRef<ExpandedState, Record<string, boolean>>({\n\t\tget: (value) => {\n\t\t\tif (value === true)\n\t\t\t\treturn Object.fromEntries(\n\t\t\t\t\t[...rowIdSet.value].map((rowId) => [rowId, true]),\n\t\t\t\t)\n\n\t\t\treturn value\n\t\t},\n\t\tset: (value) => {\n\t\t\tswitch (params.value.expandMode) {\n\t\t\t\tcase 'multi':\n\t\t\t\t\treturn Object.fromEntries(\n\t\t\t\t\t\tObject.entries(value).filter(\n\t\t\t\t\t\t\t([rowId, isExpanded]) => rowIdSet.value.has(rowId) && isExpanded,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\tcase null:\n\t\t\t\t\treturn {}\n\t\t\t\tcase 'single': {\n\t\t\t\t\tfor (const [rowId, isExpanded] of Object.entries(value)) {\n\t\t\t\t\t\tif (rowIdSet.value.has(rowId) && isExpanded) {\n\t\t\t\t\t\t\treturn { [rowId]: true }\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tvalue: ref({}),\n\t})\n\n\t// FIXME: This useComputedRef right now assumes that column ids provdided via params\n\t// do not change. If a user would change them, it will lead to unintended behavior\n\tconst ordering = useComputedRef<\n\t\tSortingState<COLUMN_ID>,\n\t\tKottiTable.Ordering<COLUMN_ID>[]\n\t>({\n\t\tget(value) {\n\t\t\treturn value.map((sorting) => ({\n\t\t\t\tid: sorting.id,\n\t\t\t\tvalue: sorting.desc ? ('descending' as const) : ('ascending' as const),\n\t\t\t}))\n\t\t},\n\t\tset(value) {\n\t\t\treturn (\n\t\t\t\tvalue\n\t\t\t\t\t// Remove entries that do not have a valid column\n\t\t\t\t\t.filter((sorting) => columnIdSet.value.has(sorting.id))\n\t\t\t\t\t.map((sorting) => ({\n\t\t\t\t\t\tdesc: sorting.value === 'descending',\n\t\t\t\t\t\tid: sorting.id,\n\t\t\t\t\t}))\n\t\t\t)\n\t\t},\n\t\tvalue: ref([]),\n\t})\n\n\t// FIXME: This useComputedRef right now assumes that column ids provdided via params\n\t// do not change. If a user would change them, it will lead to unintended behavior\n\tconst hiddenColumns = useComputedRef<VisibilityState, Set<COLUMN_ID>>({\n\t\tget: (value) => {\n\t\t\tconst result = new Set<COLUMN_ID>()\n\n\t\t\tfor (const id of columnIdSet.value) {\n\t\t\t\tif (value[id] === false) result.add(id)\n\t\t\t}\n\n\t\t\treturn result\n\t\t},\n\t\tset: (newSet) => {\n\t\t\tconst newVisibilityState: VisibilityState = {}\n\n\t\t\tfor (const id of columnIdSet.value) {\n\t\t\t\tnewVisibilityState[id] = !newSet.has(id)\n\t\t\t}\n\n\t\t\treturn newVisibilityState\n\t\t},\n\t\tvalue: ref(\n\t\t\tObject.fromEntries(\n\t\t\t\tparams.value.columns.map((column) => [column.id, true]),\n\t\t\t),\n\t\t),\n\t})\n\n\tconst triggerExpand = (rowId: string) => {\n\t\tswitch (params.value.expandMode) {\n\t\t\tcase null: {\n\t\t\t\texpandedRows.value = {}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'single': {\n\t\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\t\tif (rowId in expandedRows.value) {\n\t\t\t\t\texpandedRows.value = {}\n\t\t\t\t} else {\n\t\t\t\t\texpandedRows.value = { [rowId]: true }\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'multi': {\n\t\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\t\tif (rowId in expandedRows.value) {\n\t\t\t\t\texpandedRows.value = { ...expandedRows.value, [rowId]: false }\n\t\t\t\t} else {\n\t\t\t\t\texpandedRows.value = { ...expandedRows.value, [rowId]: true }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst draggedColumnId: Ref<COLUMN_ID | null> = ref(null)\n\t/**\n\t * Primarily used for displaying the drop indicator line\n\t */\n\tconst dropTargetColumnIndex = ref<number | null>(null)\n\tconst successfullyDroppedColumnId = ref<string | null>(null)\n\n\tconst getMovedColumnOrder = (\n\t\tfromColumnId: COLUMN_ID,\n\t\ttoIndex: number,\n\t): COLUMN_ID[] => {\n\t\tconst fromIndex = columnOrder.value.indexOf(fromColumnId)\n\t\tif (fromIndex === -1)\n\t\t\tthrow new Error(`Could not find column id ${fromColumnId}`)\n\n\t\tconst newOrder = columnOrder.value.toSpliced(fromIndex, 1)\n\t\tnewOrder.splice(\n\t\t\ttoIndex > fromIndex ? toIndex - 1 : toIndex,\n\t\t\t0,\n\t\t\tfromColumnId,\n\t\t)\n\t\treturn newOrder\n\t}\n\n\tconst table = useVueTable<ROW>(\n\t\tcomputed(() => ({\n\t\t\tcolumns: [\n\t\t\t\t...(params.value.expandMode !== null\n\t\t\t\t\t? [\n\t\t\t\t\t\t\tcolumnHelper.display({\n\t\t\t\t\t\t\t\tcell: ({ row }: CellContext<ROW, unknown>) => {\n\t\t\t\t\t\t\t\t\tconst rowBehavior = params.value.getRowBehavior({\n\t\t\t\t\t\t\t\t\t\trow: row.original,\n\t\t\t\t\t\t\t\t\t\trowIndex: row.index,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\tconst isDisabled = rowBehavior.disable?.expand ?? false\n\n\t\t\t\t\t\t\t\t\treturn h(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tclass: {\n\t\t\t\t\t\t\t\t\t\t\t\t'kt-table-expand': true,\n\t\t\t\t\t\t\t\t\t\t\t\tyoco: true,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tdomProps: {\n\t\t\t\t\t\t\t\t\t\t\t\tariaDisabled: String(isDisabled),\n\t\t\t\t\t\t\t\t\t\t\t\tariaExpanded: String(row.getIsExpanded()),\n\t\t\t\t\t\t\t\t\t\t\t\t'data-test': `${params.value.id}.column-${EXPANSION_COLUMN_ID}.row-${row.id}.button`,\n\t\t\t\t\t\t\t\t\t\t\t\trole: 'button',\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\t\t\t\tclick: (event: MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (isDisabled) return\n\t\t\t\t\t\t\t\t\t\t\t\t\ttriggerExpand(row.id)\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trow.getIsExpanded()\n\t\t\t\t\t\t\t\t\t\t\t? Yoco.Icon.CHEVRON_DOWN\n\t\t\t\t\t\t\t\t\t\t\t: Yoco.Icon.CHEVRON_RIGHT,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tid: EXPANSION_COLUMN_ID,\n\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\tcellClasses: 'kt-table-cell kt-table-cell--is-body',\n\t\t\t\t\t\t\t\t\tdisableCellClick: true,\n\t\t\t\t\t\t\t\t\theaderClasses: 'kt-table-cell kt-table-cell--is-header',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t...(params.value.isSelectable\n\t\t\t\t\t? [\n\t\t\t\t\t\t\tcolumnHelper.display({\n\t\t\t\t\t\t\t\tcell: ({ row }: CellContext<ROW, unknown>) =>\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tclass: 'kt-table-selection',\n\t\t\t\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\t\t\t\tclick: (event: MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.toggleSelected(!row.getIsSelected())\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\th(ToggleInner, {\n\t\t\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent: 'div',\n\t\t\t\t\t\t\t\t\t\t\t\t\tinputProps: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'data-test': `${params.value.id}.column-${SELECTION_COLUMN_ID}.row-${row.id}.checkbox`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: !row.getCanSelect(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: `${params.value.id}-${row.id}-select`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tisDisabled: !row.getCanSelect(),\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: row.getIsSelected(),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\theader: ({ table }: HeaderContext<ROW, unknown>) =>\n\t\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttable.toggleAllRowsSelected(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t!table.getIsAllRowsSelected(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\th(ToggleInner, {\n\t\t\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent: 'div',\n\t\t\t\t\t\t\t\t\t\t\t\t\tinputProps: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'data-test': `${params.value.id}.column-${SELECTION_COLUMN_ID}.header.checkbox`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: `${params.value.id}-column-select-header`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tisDisabled: false,\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: table.getIsAllRowsSelected()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: table\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.getRowModel()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.rows.some((row) => row.getIsSelected())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: false,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tid: SELECTION_COLUMN_ID,\n\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\tcellClasses: 'kt-table-cell kt-table-cell--is-body',\n\t\t\t\t\t\t\t\t\tdisableCellClick: true,\n\t\t\t\t\t\t\t\t\theaderClasses: 'kt-table-cell kt-table-cell--is-header',\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t\t...params.value.columns.map((column) => {\n\t\t\t\t\tconst index = columnOrder.value.indexOf(column.id)\n\n\t\t\t\t\tconst getCellClasses = (cellType: 'body' | 'header') =>\n\t\t\t\t\t\tclassNames({\n\t\t\t\t\t\t\t[`kt-table-cell--is-${cellType}`]: true,\n\t\t\t\t\t\t\t[`kt-table-cell--is-${column.display.align}-aligned`]: true,\n\t\t\t\t\t\t\t'kt-table-cell': true,\n\t\t\t\t\t\t\t'kt-table-cell--displays-number': column.display.isNumeric,\n\t\t\t\t\t\t\t'kt-table-cell--has-drop-indicator':\n\t\t\t\t\t\t\t\tindex === dropTargetColumnIndex.value,\n\t\t\t\t\t\t\t'kt-table-cell--has-drop-indicator-right':\n\t\t\t\t\t\t\t\tindex + 1 === dropTargetColumnIndex.value &&\n\t\t\t\t\t\t\t\tcolumnOrder.value.length - 1 === index,\n\t\t\t\t\t\t\t'kt-table-cell--is-dragged': column.id === draggedColumnId.value,\n\t\t\t\t\t\t\t'kt-table-cell--was-successfully-dropped':\n\t\t\t\t\t\t\t\tcolumn.id === successfullyDroppedColumnId.value,\n\t\t\t\t\t\t})\n\n\t\t\t\t\treturn columnHelper.accessor(column.getData, {\n\t\t\t\t\t\tcell: (info) => {\n\t\t\t\t\t\t\tconst value = info.getValue()\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcolumn.display.render(value, {\n\t\t\t\t\t\t\t\t\ti18n: i18nContext,\n\t\t\t\t\t\t\t\t}) ?? Dashes.EmDash\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tenableSorting: column.isSortable,\n\t\t\t\t\t\theader: () => h('div', column.label),\n\t\t\t\t\t\tid: column.id,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\tcellClasses: getCellClasses('body'),\n\t\t\t\t\t\t\tdisableCellClick: column.display.disableCellClick,\n\t\t\t\t\t\t\theaderClasses: getCellClasses('header'),\n\t\t\t\t\t\t\tsortBehavior: column.display.sortBehavior,\n\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t'max-width': column.maxWidth,\n\t\t\t\t\t\t\t\t'min-width': column.minWidth,\n\t\t\t\t\t\t\t\twidth: column.width,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t],\n\t\t\tdata: params.value.data,\n\t\t\tenableRowSelection: (row) => {\n\t\t\t\tif (!params.value.isSelectable) return false\n\n\t\t\t\tconst behavior = params.value.getRowBehavior({\n\t\t\t\t\trow: row.original,\n\t\t\t\t\trowIndex: row.index,\n\t\t\t\t})\n\t\t\t\treturn !behavior.disable?.select\n\t\t\t},\n\t\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t\tgetExpandedRowModel:\n\t\t\t\tparams.value.expandMode !== null ? getExpandedRowModel() : undefined,\n\t\t\tgetRowId: (row, rowIndex) =>\n\t\t\t\tparams.value.getRowBehavior({ row, rowIndex }).id,\n\t\t\tonColumnVisibilityChange: hiddenColumns.tanstackSetter,\n\t\t\tonRowSelectionChange: selectedRows.tanstackSetter,\n\t\t\tonSortingChange: ordering.tanstackSetter as ReactStyleUpdater<unknown>,\n\t\t\tstate: {\n\t\t\t\tcolumnOrder: columnOrder.tanstackGetter(),\n\t\t\t\tcolumnVisibility: hiddenColumns.tanstackGetter(),\n\t\t\t\texpanded: expandedRows.tanstackGetter(),\n\t\t\t\trowSelection: selectedRows.tanstackGetter(),\n\t\t\t\tsorting: ordering.tanstackGetter(),\n\t\t\t},\n\t\t})),\n\t)\n\n\tconst tableContext: TableContext<ROW, COLUMN_ID> = computed(() => ({\n\t\tinternal: {\n\t\t\tgetColumnIndex: (columnId) => {\n\t\t\t\treturn columnOrder.value.indexOf(columnId)\n\t\t\t},\n\t\t\tgetOrdering: () => {\n\t\t\t\treturn ordering.value\n\t\t\t},\n\t\t\tgetRowBehavior: params.value.getRowBehavior,\n\t\t\thasDragAndDrop: Boolean(params.value.hasDragAndDrop),\n\t\t\tisDragAndDropActive: draggedColumnId.value !== null,\n\t\t\tisExpandable: Boolean(params.value.expandMode !== null),\n\t\t\tselectionCount: Object.values(selectedRows.value).length,\n\t\t\tsetDraggedColumnId: (columnId) => {\n\t\t\t\tdraggedColumnId.value = columnId\n\t\t\t},\n\t\t\tsetDropTargetColumnIndex: (columnIndex) => {\n\t\t\t\tdropTargetColumnIndex.value = columnIndex\n\t\t\t},\n\t\t\tswapDraggedAndDropTarget: () => {\n\t\t\t\tif (\n\t\t\t\t\tdropTargetColumnIndex.value === null ||\n\t\t\t\t\tdraggedColumnId.value === null\n\t\t\t\t)\n\t\t\t\t\treturn\n\n\t\t\t\tcolumnOrder.value = getMovedColumnOrder(\n\t\t\t\t\tdraggedColumnId.value,\n\t\t\t\t\tdropTargetColumnIndex.value,\n\t\t\t\t)\n\n\t\t\t\tsuccessfullyDroppedColumnId.value = draggedColumnId.value\n\t\t\t},\n\t\t\ttable,\n\t\t\ttriggerExpand,\n\t\t\tunselectAllRows: () => {\n\t\t\t\tselectedRows.value = {}\n\t\t\t},\n\t\t\tunsetDroppedColumnId: () => {\n\t\t\t\t// Avoid eventual redraws since method will be called once per row\n\t\t\t\tif (successfullyDroppedColumnId.value === null) return\n\n\t\t\t\tsuccessfullyDroppedColumnId.value = null\n\t\t\t},\n\t\t\tvisibleColumns: hiddenColumns.tanstackGetter(),\n\t\t},\n\t}))\n\tuseProvideTableContext<ROW, COLUMN_ID>(params.value.id, tableContext)\n\n\treturn {\n\t\tapi: {\n\t\t\tcolumnOrder,\n\t\t\texpandedRows,\n\t\t\thiddenColumns,\n\t\t\tordering,\n\t\t\tselectedRows,\n\t\t},\n\t\ttableContext,\n\t}\n}\n","import type { GetRowBehavior, KottiTable } from './types'\n\ntype RowBehavior = ReturnType<GetRowBehavior<KottiTable.AnyRow>>\n\ntype RowCellWrapper = {\n\tclass: string[]\n\tcomponent: string\n\ton?: Record<string, unknown>\n\tprops?: Record<string, unknown>\n}\n\nexport const DEFAULT_CELL_WRAPPER: RowCellWrapper = {\n\tclass: ['kt-table-cell-content'],\n\tcomponent: 'div',\n}\n\nexport const getCellWrapComponent = (\n\tbehavior: RowBehavior,\n\ttriggerExpanded: (rowId: string) => void,\n): RowCellWrapper => {\n\tif (behavior.disable?.click) return DEFAULT_CELL_WRAPPER\n\n\tconst { click, id: rowId } = behavior\n\tif (!click) return DEFAULT_CELL_WRAPPER\n\n\tif (click === 'expand')\n\t\treturn {\n\t\t\t...DEFAULT_CELL_WRAPPER,\n\t\t\ton: {\n\t\t\t\tclick: () => {\n\t\t\t\t\ttriggerExpanded(rowId)\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\tif (click.component === null)\n\t\treturn {\n\t\t\t...DEFAULT_CELL_WRAPPER,\n\t\t\ton: {\n\t\t\t\tclick: () => {\n\t\t\t\t\tvoid click.onClick()\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\n\treturn {\n\t\t...click,\n\t\tclass: ['kt-table-cell-content'],\n\t}\n}\n","<template>\n\t<div :class=\"tableClasses\">\n\t\t<table\n\t\t\t@dragend=\"handleTableDragEnd\"\n\t\t\t@dragleave=\"handleDragLeave\"\n\t\t\t@drop=\"handleDrop\"\n\t\t>\n\t\t\t<thead>\n\t\t\t\t<tr v-for=\"headerRow in headerRows\" :key=\"headerRow.key\">\n\t\t\t\t\t<th\n\t\t\t\t\t\tv-for=\"header in headerRow.headers\"\n\t\t\t\t\t\t:key=\"header.key\"\n\t\t\t\t\t\t:class=\"header.classes\"\n\t\t\t\t\t\t:colSpan=\"header.colSpan\"\n\t\t\t\t\t\t:data-test=\"header.dataTest\"\n\t\t\t\t\t\t:draggable=\"header.isDraggable\"\n\t\t\t\t\t\t:style=\"header.style\"\n\t\t\t\t\t\t@animationend=\"handleAnimationEnd\"\n\t\t\t\t\t\t@click=\"(e) => handleHeaderClick(e, header)\"\n\t\t\t\t\t\t@dragenter.prevent\n\t\t\t\t\t\t@dragleave.prevent\n\t\t\t\t\t\t@dragover.prevent=\"(e) => handleCellDragOver(e, header.id)\"\n\t\t\t\t\t\t@dragstart=\"(e) => handleHeaderDragStart(e, header.id)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"kt-table-header\">\n\t\t\t\t\t\t\t<FlexRender\n\t\t\t\t\t\t\t\tclass=\"kt-table-header-content\"\n\t\t\t\t\t\t\t\t:props=\"{ ...header.getContext() }\"\n\t\t\t\t\t\t\t\t:render=\"header.column.columnDef.header\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\tv-if=\"header.isSortable\"\n\t\t\t\t\t\t\t\tclass=\"yoco\"\n\t\t\t\t\t\t\t\tv-text=\"header.sortIndicatorIcon\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th v-if=\"$scopedSlots['actions']\" class=\"kt-table__actions-column\" />\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr\n\t\t\t\t\tv-if=\"bodyRows.length === 0 && isLoading\"\n\t\t\t\t\tclass=\"kt-table-row kt-table-row--is-loading\"\n\t\t\t\t>\n\t\t\t\t\t<td :colSpan=\"tableColSpan\">\n\t\t\t\t\t\t<slot name=\"loading\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"key in 3\"\n\t\t\t\t\t\t\t\t:key=\"key\"\n\t\t\t\t\t\t\t\tclass=\"skeleton rectangle\"\n\t\t\t\t\t\t\t\tstyle=\"width: 100%; height: 2rem; margin-top: 0.2rem\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr\n\t\t\t\t\tv-else-if=\"bodyRows.length === 0\"\n\t\t\t\t\tclass=\"kt-table-row kt-table-row--is-empty\"\n\t\t\t\t>\n\t\t\t\t\t<td :colSpan=\"tableColSpan\">\n\t\t\t\t\t\t<slot name=\"empty\">\n\t\t\t\t\t\t\t<div v-text=\"defaultedEmptyText\" />\n\t\t\t\t\t\t</slot>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<template v-for=\"(row, rowIndex) in bodyRows\" v-else>\n\t\t\t\t\t<tr :key=\"row.key\" :class=\"row.classes\">\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tv-for=\"cell in row.cells\"\n\t\t\t\t\t\t\t:key=\"cell.key\"\n\t\t\t\t\t\t\t:class=\"cell.classes\"\n\t\t\t\t\t\t\t:data-test=\"cell.dataTest\"\n\t\t\t\t\t\t\t:style=\"cell.style\"\n\t\t\t\t\t\t\t@dragenter.prevent\n\t\t\t\t\t\t\t@dragleave.prevent\n\t\t\t\t\t\t\t@dragover.prevent=\"(e) => handleCellDragOver(e, cell.columnId)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t:is=\"cell.wrapComponent.component\"\n\t\t\t\t\t\t\t\tv-bind=\"cell.wrapComponent.props\"\n\t\t\t\t\t\t\t\t:class=\"cell.wrapComponent.class\"\n\t\t\t\t\t\t\t\tv-on=\"cell.wrapComponent.on\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FlexRender\n\t\t\t\t\t\t\t\t\t:props=\"{ ...cell.getContext() }\"\n\t\t\t\t\t\t\t\t\t:render=\"cell.column.columnDef.cell\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</component>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td v-if=\"row.actions !== null\" class=\"kt-table__actions-column\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"kt-table__actions\"\n\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t'kt-table__actions--is-disabled': row.isActionDisabled,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template v-for=\"(action, index) in row.actions\">\n\t\t\t\t\t\t\t\t\t<KtPopover\n\t\t\t\t\t\t\t\t\t\tv-if=\"action.tooltip\"\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t\ttrigger=\"hover\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t\t\t\tyoco: true,\n\t\t\t\t\t\t\t\t\t\t\t\t'kt-table__action-icon': true,\n\t\t\t\t\t\t\t\t\t\t\t\t'kt-table__action-icon--is-disabled':\n\t\t\t\t\t\t\t\t\t\t\t\t\trow.isActionDisabled || action.isDisabled,\n\t\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t\t:data-test=\"action.dataTest\"\n\t\t\t\t\t\t\t\t\t\t\t@click=\"\n\t\t\t\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (action.isDisabled) return\n\n\t\t\t\t\t\t\t\t\t\t\t\t\taction.onClick()\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\t\tv-text=\"action.icon\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\t\t\t<span v-text=\"action.tooltip\" />\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</KtPopover>\n\t\t\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t\t\tyoco: true,\n\t\t\t\t\t\t\t\t\t\t\t'kt-table__action-icon': true,\n\t\t\t\t\t\t\t\t\t\t\t'kt-table__action-icon--is-disabled':\n\t\t\t\t\t\t\t\t\t\t\t\trow.isActionDisabled || action.isDisabled,\n\t\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t\t\t:data-test=\"action.dataTest\"\n\t\t\t\t\t\t\t\t\t\t@click=\"\n\t\t\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (action.isDisabled) return\n\n\t\t\t\t\t\t\t\t\t\t\t\taction.onClick()\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\t\tv-text=\"action.icon\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tv-else-if=\"$scopedSlots['actions']\"\n\t\t\t\t\t\t\tclass=\"kt-table__actions-column\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"kt-table__actions\"\n\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t'kt-table__actions--is-disabled': row.isActionDisabled,\n\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<slot name=\"actions\" :row=\"row.original\" :rowIndex=\"rowIndex\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr\n\t\t\t\t\t\tv-if=\"$scopedSlots['expanded-row'] && row.isExpanded\"\n\t\t\t\t\t\t:key=\"row.expandedKey\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<td :colSpan=\"tableColSpan\">\n\t\t\t\t\t\t\t<slot\n\t\t\t\t\t\t\t\tname=\"expanded-row\"\n\t\t\t\t\t\t\t\t:row=\"row.original\"\n\t\t\t\t\t\t\t\t:rowIndex=\"rowIndex\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</template>\n\t\t\t</tbody>\n\t\t</table>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { Header } from '@tanstack/table-core'\nimport classNames from 'classnames'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { makeProps } from '../make-props'\n\nimport { useTableContext } from './table/context'\nimport { EXPANSION_COLUMN_ID, SELECTION_COLUMN_ID } from './table/hooks'\nimport { DEFAULT_CELL_WRAPPER, getCellWrapComponent } from './table/row'\nimport { FlexRender } from './table/tanstack-table'\nimport { KottiTable } from './table/types'\n\nconst TRANSFER_TYPE = 'application/move-column'\n\nconst SORT_BEHAVIOR_MAP = {\n\t'asc-desc': [false, 'asc', 'desc'],\n\t'desc-asc': [false, 'desc', 'asc'],\n} as const\nconst SORT_ORDER_COUNT = 3\n\nexport default defineComponent({\n\tname: 'KtTable',\n\tcomponents: {\n\t\tFlexRender,\n\t},\n\tprops: makeProps(KottiTable.propsSchema),\n\tsetup(props) {\n\t\t// eslint-disable-next-line vue/no-setup-props-reactivity-loss\n\t\tconst tableContext = useTableContext(props.tableId)\n\t\tconst translations = useTranslationNamespace('KtTable')\n\n\t\tconst isColumnMoveDataTransfer = (event: DragEvent): boolean => {\n\t\t\treturn event.dataTransfer?.types.includes(TRANSFER_TYPE) ?? false\n\t\t}\n\n\t\tconst table = computed(() => tableContext.value.internal.table.value)\n\n\t\treturn {\n\t\t\tbodyRows: computed(() =>\n\t\t\t\ttable.value.getRowModel().rows.map((row) => {\n\t\t\t\t\tconst behavior = tableContext.value.internal.getRowBehavior({\n\t\t\t\t\t\trow: row.original,\n\t\t\t\t\t\trowIndex: row.index,\n\t\t\t\t\t})\n\n\t\t\t\t\tconst wrapComponent = getCellWrapComponent(\n\t\t\t\t\t\tbehavior,\n\t\t\t\t\t\ttableContext.value.internal.triggerExpand,\n\t\t\t\t\t)\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tactions: behavior.actions ?? null,\n\t\t\t\t\t\tcells: row.getVisibleCells().map((cell) => ({\n\t\t\t\t\t\t\tclasses: cell.column.columnDef.meta.cellClasses,\n\t\t\t\t\t\t\tcolumn: cell.column,\n\t\t\t\t\t\t\tcolumnId: cell.column.id,\n\t\t\t\t\t\t\tdataTest: `${props.tableId}.column-${cell.column.id}.row-${row.id}`,\n\t\t\t\t\t\t\tgetContext: cell.getContext,\n\t\t\t\t\t\t\tid: cell.id,\n\t\t\t\t\t\t\tkey: cell.id,\n\t\t\t\t\t\t\tstyle: cell.column.columnDef.meta.style,\n\t\t\t\t\t\t\twrapComponent: cell.column.columnDef.meta.disableCellClick\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t...DEFAULT_CELL_WRAPPER,\n\t\t\t\t\t\t\t\t\t\tclass: [\n\t\t\t\t\t\t\t\t\t\t\t...DEFAULT_CELL_WRAPPER.class,\n\t\t\t\t\t\t\t\t\t\t\t'kt-table-cell-content--is-click-disabled',\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: wrapComponent,\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tclasses: classNames(behavior.classes, {\n\t\t\t\t\t\t\t'kt-table-row': true,\n\t\t\t\t\t\t\t'kt-table-row--is-click-disabled': behavior.disable?.click,\n\t\t\t\t\t\t\t'kt-table-row--is-interactive':\n\t\t\t\t\t\t\t\t!behavior.disable?.click && behavior.click,\n\t\t\t\t\t\t\t'kt-table-row--is-loading skeleton rectangle': behavior.isLoading,\n\t\t\t\t\t\t\t'kt-table-row--is-selected': row.getIsSelected(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texpandedColSpan: row.getAllCells().length,\n\t\t\t\t\t\texpandedKey: `${row.id}-expanded-row`,\n\t\t\t\t\t\tisActionDisabled: behavior.disable?.actions === true,\n\t\t\t\t\t\tisExpanded: row.getIsExpanded(),\n\t\t\t\t\t\tkey: row.id,\n\t\t\t\t\t\toriginal: row.original,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t\tdefaultedEmptyText: computed(\n\t\t\t\t() => props.emptyText ?? translations.value.noItems,\n\t\t\t),\n\t\t\thandleAnimationEnd: () => {\n\t\t\t\ttableContext.value.internal.unsetDroppedColumnId()\n\t\t\t},\n\t\t\thandleCellDragOver: (event: DragEvent, columnId: string) => {\n\t\t\t\tif (!isColumnMoveDataTransfer(event)) return\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tevent.dataTransfer!.dropEffect = 'move'\n\t\t\t\tconst columnIndex = tableContext.value.internal.getColumnIndex(columnId)\n\t\t\t\tconst target = event.target as HTMLElement\n\n\t\t\t\tconst { width: elementWidth, x: elementX } =\n\t\t\t\t\ttarget.getBoundingClientRect()\n\n\t\t\t\tconst cursorX = event.clientX\n\n\t\t\t\tconst isLeftHalf = cursorX - elementX < elementWidth / 2\n\t\t\t\tconst targetIndex = columnIndex + (isLeftHalf ? 0 : 1)\n\n\t\t\t\ttableContext.value.internal.setDropTargetColumnIndex(targetIndex)\n\t\t\t},\n\t\t\thandleDragLeave: (_event: DragEvent) => {\n\t\t\t\ttableContext.value.internal.setDropTargetColumnIndex(null)\n\t\t\t},\n\t\t\thandleDrop: (event: DragEvent) => {\n\t\t\t\tif (!isColumnMoveDataTransfer(event)) return\n\n\t\t\t\ttableContext.value.internal.swapDraggedAndDropTarget()\n\t\t\t\ttableContext.value.internal.setDropTargetColumnIndex(null)\n\t\t\t\ttableContext.value.internal.setDraggedColumnId(null)\n\t\t\t},\n\t\t\thandleHeaderClick: (_: MouseEvent, header: Header<unknown, unknown>) => {\n\t\t\t\tif (!header.column.getCanSort()) return\n\n\t\t\t\tconst id = header.column.columnDef.id as string\n\n\t\t\t\tconst sortBehavior =\n\t\t\t\t\tSORT_BEHAVIOR_MAP[\n\t\t\t\t\t\theader.column.columnDef.meta.sortBehavior as 'asc-desc' | 'desc-asc'\n\t\t\t\t\t]\n\n\t\t\t\tconst currentSortIndex = sortBehavior.indexOf(\n\t\t\t\t\theader.column.getIsSorted(),\n\t\t\t\t)\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst nextSort = sortBehavior.at(\n\t\t\t\t\t(currentSortIndex + 1) % SORT_ORDER_COUNT,\n\t\t\t\t)!\n\n\t\t\t\tswitch (nextSort) {\n\t\t\t\t\tcase 'asc':\n\t\t\t\t\t\ttable.value.setSorting([{ desc: false, id }])\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'desc':\n\t\t\t\t\t\ttable.value.setSorting([{ desc: true, id }])\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase false:\n\t\t\t\t\t\ttable.value.setSorting([])\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t},\n\t\t\thandleHeaderDragStart: (event: DragEvent, columnId: string) => {\n\t\t\t\tevent.dataTransfer?.setData(TRANSFER_TYPE, '')\n\t\t\t\ttableContext.value.internal.setDraggedColumnId(columnId)\n\t\t\t},\n\t\t\thandleTableDragEnd: () => {\n\t\t\t\ttableContext.value.internal.setDropTargetColumnIndex(null)\n\t\t\t\ttableContext.value.internal.setDraggedColumnId(null)\n\t\t\t},\n\t\t\theaderRows: computed(() =>\n\t\t\t\ttable.value.getHeaderGroups().map((headerRow) => ({\n\t\t\t\t\theaders: headerRow.headers.map((header, headerIndex) => ({\n\t\t\t\t\t\tclasses: classNames(header.column.columnDef.meta.headerClasses, {\n\t\t\t\t\t\t\t'kt-table-cell--is-sortable': header.column.getCanSort(),\n\t\t\t\t\t\t\t'kt-table-cell--is-sorted': header.column.getIsSorted(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tcolSpan: header.colSpan,\n\t\t\t\t\t\tcolumn: header.column,\n\t\t\t\t\t\tdataTest: `${props.tableId}.column-${header.column.id}.header`,\n\t\t\t\t\t\tgetContext: header.getContext,\n\t\t\t\t\t\tid: header.id,\n\t\t\t\t\t\tisDraggable:\n\t\t\t\t\t\t\ttableContext.value.internal.hasDragAndDrop &&\n\t\t\t\t\t\t\t![EXPANSION_COLUMN_ID, SELECTION_COLUMN_ID].includes(header.id),\n\t\t\t\t\t\tisSortable: header.column.getCanSort(),\n\t\t\t\t\t\tkey: `${header.id}-${headerIndex}`,\n\t\t\t\t\t\tsortIndicatorIcon: {\n\t\t\t\t\t\t\tasc: Yoco.Icon.ARROW_UP,\n\t\t\t\t\t\t\tdesc: Yoco.Icon.ARROW_DOWN,\n\t\t\t\t\t\t\tfalse: Yoco.Icon.ARROW_UP_DOWN,\n\t\t\t\t\t\t}[header.column.getIsSorted() || 'false'],\n\t\t\t\t\t\tstyle: header.column.columnDef.meta.style,\n\t\t\t\t\t})),\n\t\t\t\t\tkey: headerRow.id,\n\t\t\t\t})),\n\t\t\t),\n\t\t\ttable,\n\t\t\ttableClasses: computed(() => ({\n\t\t\t\t'kt-table': true,\n\t\t\t\t'kt-table--is-drag-and-drop-active':\n\t\t\t\t\ttableContext.value.internal.isDragAndDropActive,\n\t\t\t\t'kt-table--is-loading skeleton rectangle':\n\t\t\t\t\tprops.isLoading && table.value.getRowModel().rows.length > 0,\n\t\t\t\t'kt-table--is-scrollable': !props.isNotScrollable,\n\t\t\t})),\n\t\t\ttableColSpan: computed(() => table.value.getAllFlatColumns().length),\n\t\t\ttableContext: computed(() => tableContext.value),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@keyframes flash-green {\n\tfrom {\n\t\tbackground-color: var(--green-20);\n\t\topacity: 0.8;\n\t}\n\n\tto {\n\t\tbackground-color: none;\n\t\topacity: 1;\n\t}\n}\n\n.kt-table {\n\tborder: 1px solid var(--ui-02);\n\tborder-radius: var(--unit-2);\n\n\t&--is-scrollable {\n\t\toverflow-x: scroll;\n\t\twhite-space: nowrap;\n\t}\n\n\t&--is-loading {\n\t\t&.rectangle {\n\t\t\theight: unset;\n\t\t}\n\n\t\ttbody {\n\t\t\tmix-blend-mode: multiply;\n\n\t\t\ttr {\n\t\t\t\tborder-bottom-color: white !important;\n\t\t\t}\n\t\t}\n\t}\n\n\ttable {\n\t\twidth: 100%;\n\t\tborder-collapse: collapse;\n\n\t\ta.kt-table-cell-content {\n\t\t\tcolor: inherit;\n\t\t\ttext-decoration: inherit;\n\t\t}\n\n\t\tthead {\n\t\t\tbackground-color: var(--ui-01);\n\n\t\t\t.kt-table-cell--is-header {\n\t\t\t\theight: 28px;\n\t\t\t\tfont-size: var(--unit-3);\n\t\t\t\tcolor: var(--text-02);\n\t\t\t\ttext-transform: uppercase;\n\n\t\t\t\t&.kt-table-cell--is-sorted {\n\t\t\t\t\tcolor: var(--interactive-01);\n\t\t\t\t}\n\n\t\t\t\t&:not(.kt-table-cell--is-sorted) {\n\t\t\t\t\t.yoco {\n\t\t\t\t\t\topacity: 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\t.yoco {\n\t\t\t\t\t\t\tcolor: var(--icon-02);\n\t\t\t\t\t\t\topacity: 1;\n\n\t\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\t\tcolor: var(--icon-01);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&[draggable='true'] {\n\t\t\t\t\tcursor: grab;\n\t\t\t\t}\n\n\t\t\t\t.kt-table-header {\n\t\t\t\t\tdisplay: inline-flex;\n\t\t\t\t\tgap: 2px;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\tpadding: 0.2rem 0.4rem;\n\t\t\t\t\toverflow: hidden;\n\n\t\t\t\t\t> .yoco {\n\t\t\t\t\t\tmin-width: 0.8rem;\n\t\t\t\t\t\tfont-size: 0.8rem;\n\t\t\t\t\t\tcolor: var(--interactive-03);\n\t\t\t\t\t\tuser-select: none;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.kt-table-cell--is-left-aligned .kt-table-header {\n\t\t\t\t\tjustify-content: flex-start;\n\t\t\t\t}\n\n\t\t\t\t&.kt-table-cell--is-center-aligned .kt-table-header {\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t&.kt-table-cell--is-right-aligned .kt-table-header {\n\t\t\t\t\tflex-flow: row-reverse;\n\t\t\t\t\tjustify-content: flex-start;\n\t\t\t\t}\n\n\t\t\t\t&.kt-table-cell--is-center-aligned.kt-table-cell--is-sortable\n\t\t\t\t\t.kt-table-header-content {\n\t\t\t\t\tmargin-left: 0.9rem;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-table-cell {\n\t\t\t\t&--has-drop-indicator {\n\t\t\t\t\t&::before,\n\t\t\t\t\t&-right::after {\n\t\t\t\t\t\tbackground-color: var(--gray-30);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&--is-dragged {\n\t\t\t\t\tbackground-color: var(--gray-20);\n\n\t\t\t\t\t// setting opacity only for the content, not for the drop\n\t\t\t\t\t// indicator and background color\n\t\t\t\t\t> * {\n\t\t\t\t\t\topacity: 0.5;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttbody {\n\t\t\ttr {\n\t\t\t\tposition: relative;\n\t\t\t\tborder-bottom: 1px solid var(--ui-02);\n\n\t\t\t\t&:last-child {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover .kt-table__actions {\n\t\t\t\t\tdisplay: inline-flex;\n\t\t\t\t\tgap: var(--unit-1);\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tbackground: var(--white);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-table-cell--is-body {\n\t\t\t\t&.kt-table-cell--has-drop-indicator {\n\t\t\t\t\t&::before,\n\t\t\t\t\t&-right::after {\n\t\t\t\t\t\tbackground-color: var(--gray-30);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&.kt-table-cell--is-dragged {\n\t\t\t\t\tbackground-color: var(--gray-10);\n\n\t\t\t\t\t// setting opacity only for the content, not for the drop\n\t\t\t\t\t// indicator and background color\n\t\t\t\t\t> * {\n\t\t\t\t\t\topacity: 0.5;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.kt-table-expand {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tclip-path: circle(12px);\n\t\t\t\tfont-size: 16px;\n\t\t\t\tcolor: var(--icon-02);\n\t\t\t\tcursor: default;\n\t\t\t\tuser-select: none;\n\n\t\t\t\t&:not([aria-disabled='true']):hover {\n\t\t\t\t\tbackground-color: var(--interactive-02-hover);\n\t\t\t\t}\n\n\t\t\t\t&[aria-expanded='true'] {\n\t\t\t\t\tcolor: var(--interactive-03);\n\t\t\t\t}\n\n\t\t\t\t&[aria-disabled='true'] {\n\t\t\t\t\tcolor: var(--text-05);\n\t\t\t\t\tcursor: not-allowed;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.kt-table-cell {\n\t\t\tpadding: 0;\n\n\t\t\t> .kt-table-cell-content {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 100%;\n\t\t\t\tpadding: 0.4rem;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t&--is-left-aligned > .kt-table-cell-content {\n\t\t\t\tjustify-content: flex-start;\n\t\t\t}\n\n\t\t\t&--is-right-aligned > .kt-table-cell-content {\n\t\t\t\tjustify-content: flex-end;\n\t\t\t}\n\n\t\t\t&--is-center-aligned > .kt-table-cell-content {\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__actions-column {\n\t\tposition: sticky;\n\t\tright: 0;\n\t\tpadding: 0;\n\n\t\t.kt-table__actions {\n\t\t\tposition: absolute;\n\t\t\tright: 0.8rem;\n\t\t\tz-index: 400;\n\t\t\tdisplay: none;\n\t\t\tmin-height: var(--unit-8);\n\t\t\tpadding: 0 var(--unit-h);\n\t\t\tmargin-top: -0.8rem;\n\t\t\tfont-size: 0.8rem;\n\t\t\tline-height: 0.8rem;\n\t\t\tborder: 1px solid var(--ui-02);\n\t\t\tborder-radius: var(--border-radius);\n\n\t\t\t&--is-disabled {\n\t\t\t\tcolor: var(--text-05);\n\t\t\t\tcursor: not-allowed;\n\t\t\t\tbackground-color: rgb(248 248 248 / 60%); // ~= rgb(--gray-10 / 60%)\n\t\t\t\tborder-color: rgb(224 224 224 / 60%); // ~= rgb(--gray-20 / 60%)\n\t\t\t}\n\n\t\t\t> * {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t}\n\n\t\t\t.kt-table__action-icon,\n\t\t\t.yoco {\n\t\t\t\tpadding: var(--unit-1);\n\t\t\t\tfont-size: 1rem;\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\n\t\t\t\t&--is-disabled {\n\t\t\t\t\tcolor: var(--text-05);\n\t\t\t\t\tcursor: not-allowed;\n\t\t\t\t}\n\n\t\t\t\t&:not(&--is-disabled) {\n\t\t\t\t\tcolor: var(--icon-02);\n\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tcolor: var(--icon-01);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\ntr.kt-table-row {\n\theight: 44px; // setting height on a tr element is setting its min-height. See https://www.w3.org/TR/CSS22/tables.html#height-layout --- value is taken from design\n\n\t&--is-click-disabled > :not(.kt-table__actions-column) {\n\t\tcolor: var(--text-05);\n\t\tcursor: not-allowed;\n\t\tbackground-color: rgb(248 248 248 / 60%); // ~= rgb(--gray-10 / 60%)\n\t}\n\n\t&--is-empty {\n\t\tcolor: var(--text-05);\n\n\t\ttd {\n\t\t\ttext-align: center;\n\t\t}\n\t}\n\n\t&--is-interactive {\n\t\tcursor: pointer;\n\n\t\t&:hover {\n\t\t\tbackground-color: rgb(234 240 250 / 50%); // ~= rgb(--blue-10 / 60%)\n\t\t}\n\n\t\t.kt-table-cell-content--is-click-disabled:hover {\n\t\t\tcursor: default;\n\t\t}\n\t}\n\n\t&--is-loading.rectangle {\n\t\tdisplay: table-row;\n\t\theight: unset;\n\t}\n\n\t&--is-selected {\n\t\tbackground-color: rgb(234 240 250 / 50%); // ~= rgb(--blue-10 / 60%)\n\t}\n}\n\n.kt-table-cell {\n\t&--was-successfully-dropped {\n\t\tanimation: 0.2s ease-in 1 flash-green;\n\t}\n\n\t&--displays-number {\n\t\tfont-variant-numeric: tabular-nums;\n\t}\n\n\t.kt-table-selection {\n\t\tmargin-right: var(--unit-3);\n\t}\n\n\t&--has-drop-indicator {\n\t\t$drag-indicatordrag-border-width: 2px;\n\n\t\t&,\n\t\t&-right {\n\t\t\tposition: relative;\n\t\t}\n\n\t\t&::before,\n\t\t&-right::after {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\twidth: $drag-indicatordrag-border-width;\n\t\t\theight: 100%;\n\t\t\tpointer-events: none;\n\t\t\tcontent: '';\n\t\t}\n\n\t\t&:first-child::before {\n\t\t\tleft: 0 !important;\n\t\t}\n\n\t\t&-right:last-child::after {\n\t\t\tright: 0 !important;\n\t\t}\n\n\t\t&::before {\n\t\t\tleft: calc($drag-indicatordrag-border-width / -2);\n\t\t}\n\n\t\t&-right::after {\n\t\t\tright: calc($drag-indicatordrag-border-width / -2);\n\t\t}\n\t}\n}\n</style>\n","/**\n * Simple low-effort hashsum\n */\nexport const simpleHash = (strings: string[]): string => {\n\tconst maximumLength = strings.reduce(\n\t\t(acc, next) => Math.max(acc, next.length),\n\t\t0,\n\t)\n\n\tconst result = new window.Uint8Array(maximumLength)\n\n\t// eslint-disable-next-line sonarjs/no-alphabetical-sort\n\tfor (const string of [...strings].sort()) {\n\t\tfor (let charIndex = 0; charIndex < string.length; charIndex++) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst char = result[charIndex]!\n\t\t\t// string.length is added to make collisions less likely (e.g. foo + fooBar = baz + bazBar without this)\n\t\t\tresult[charIndex] = char ^ (string.charCodeAt(charIndex) + string.length)\n\t\t}\n\t}\n\n\tconst simpleHashedValue = window.btoa(String.fromCharCode(...result))\n\n\treturn `${String(strings.length)}${simpleHashedValue}`\n}\n","import { z } from 'zod'\n\nimport { simpleHash } from './simple-hash'\nimport type { FilterInfo } from './types'\nimport { KottiStandardTable } from './types'\n\nexport const serializableStateSchema = z\n\t.object({\n\t\tappliedFilters: z.array(KottiStandardTable.appliedFilterSchema),\n\t\tcolumnOrder: z.array(z.string()),\n\t\thiddenColumns: z.array(z.string()),\n\t\tordering: z.array(\n\t\t\tz\n\t\t\t\t.object({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\tvalue: z.enum(['ascending', 'descending']),\n\t\t\t\t})\n\t\t\t\t.strict(),\n\t\t),\n\t\tpagination: z\n\t\t\t.object({\n\t\t\t\tpageIndex: z.number(),\n\t\t\t\tpageSize: z.number(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tsearchValue: z.string().nullable(),\n\t})\n\t.strict()\n\ntype SerializableState = z.output<typeof serializableStateSchema>\n\nexport interface KottiStandardTableStorage {\n\tload(context: StorageOperationContext): Promise<SerializableState | null>\n\tsave(\n\t\tstate: SerializableState,\n\t\tcontext: StorageOperationContext,\n\t): Promise<void>\n}\n\n/**\n * @knipignore\n */\nexport class DummyStorageAdapter implements KottiStandardTableStorage {\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tasync load(): Promise<SerializableState | null> {\n\t\treturn null\n\t}\n\n\tasync save(): Promise<void> {}\n}\n\nconst localStorageSchema = z\n\t.object({ state: z.unknown(), version: z.string() })\n\t.strict()\n\nexport type StorageOperationContext = {\n\t/**\n\t * Used for column hashing in {@link LocalStorageAdapter}\n\t */\n\tcolumnIds: string[]\n\t/**\n\t * Used to get qualifying information about filters for parsing and validating them\n\t */\n\tfilterInfo: Map<string, FilterInfo>\n}\n\nexport class LocalStorageAdapter implements KottiStandardTableStorage {\n\t#manualVersion: string | null\n\t#storageKey: string\n\n\tconstructor(key: string, manualVersion: string | null = null) {\n\t\tthis.#storageKey = key\n\t\tthis.#manualVersion = manualVersion\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tasync load(\n\t\tcontext: StorageOperationContext,\n\t): Promise<SerializableState | null> {\n\t\tif (typeof window === 'undefined' || !('localStorage' in window))\n\t\t\treturn null\n\n\t\tconst json = window.localStorage.getItem(this.#storageKey)\n\n\t\tif (!json) return null\n\n\t\ttry {\n\t\t\tconst data = localStorageSchema.parse(JSON.parse(json))\n\n\t\t\tif (!this.#validateVersionHash(context.columnIds, data.version))\n\t\t\t\treturn null\n\n\t\t\t// further validation is handled by the caller\n\t\t\treturn data.state as SerializableState\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console -- this is likely something that should be visible as it is unexpected for this to fail, but not serious enough for a throw\n\t\t\tconsole.warn(\n\t\t\t\t'LocalStorageAdapter: recovered after failing to load',\n\t\t\t\terror,\n\t\t\t)\n\t\t\treturn null\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tasync save(\n\t\tstate: SerializableState,\n\t\tcontext: StorageOperationContext,\n\t): Promise<void> {\n\t\tif (typeof window === 'undefined' || !('localStorage' in window)) return\n\n\t\tconst version = this.#getVersionHash(context.columnIds)\n\n\t\tconst json = JSON.stringify({\n\t\t\tstate,\n\t\t\tversion,\n\t\t})\n\n\t\twindow.localStorage.setItem(this.#storageKey, json)\n\t}\n\n\t#getVersionHash(columnIds: string[]): string {\n\t\tconst version = this.#manualVersion ?? simpleHash(columnIds)\n\t\treturn `${this.#storageKey}@${version}`\n\t}\n\n\t#validateVersionHash(columnIds: string[], version: string): boolean {\n\t\tif (!version.startsWith(`${this.#storageKey}@`)) return false\n\n\t\tconst correctHash = this.#manualVersion ?? simpleHash(columnIds)\n\t\tconst givenHash = version.replace(`${this.#storageKey}@`, '')\n\n\t\treturn correctHash === givenHash\n\t}\n}\n","import isEqual from 'lodash/isEqual.js'\nimport isNil from 'lodash/isNil.js'\nimport type { Ref } from 'vue'\nimport { computed, onBeforeMount, ref, watch } from 'vue'\nimport { z } from 'zod'\n\nimport type { KottiFieldText } from '../../kotti-field-text/types'\nimport type { KottiTableParameter } from '../table/hooks'\nimport {\n\tparamsSchema as KottiTableHookParamsSchema,\n\tuseKottiTable,\n} from '../table/hooks'\nimport type { KottiTable } from '../table/types'\nimport { useComputedRef } from '../table/use-computed-ref'\n\nimport type { StandardTableContext } from './context'\nimport { useProvideStandardTableContext } from './context'\nimport type { StorageOperationContext } from './storage'\nimport {\n\tDummyStorageAdapter,\n\ttype KottiStandardTableStorage,\n\tserializableStateSchema,\n} from './storage'\nimport { type FilterInfo, KottiStandardTable } from './types'\n\nconst OPERATION_MAP = {\n\t[KottiStandardTable.FilterType.BOOLEAN]:\n\t\tKottiStandardTable.FilterOperation.Boolean.EQUAL,\n\t[KottiStandardTable.FilterType.DATE_RANGE]:\n\t\tKottiStandardTable.FilterOperation.DateRange.IN_RANGE,\n\t[KottiStandardTable.FilterType.MULTI_SELECT]:\n\t\tKottiStandardTable.FilterOperation.MultiEnum.ONE_OF,\n\t[KottiStandardTable.FilterType.NUMBER_RANGE]:\n\t\tKottiStandardTable.FilterOperation.NumberRange.IN_RANGE,\n\t[KottiStandardTable.FilterType.SINGLE_SELECT]:\n\t\tKottiStandardTable.FilterOperation.SingleEnum.EQUAL,\n}\n\ntype KottiStandardTableParameters<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n> = Ref<{\n\tfilters?: KottiStandardTable.Filter[]\n\tid: string\n\tisLoading?: boolean\n\toptions?: KottiStandardTable.Options\n\tpaginationOptions: KottiStandardTable.Pagination\n\tselectMode?: 'global' | 'single-page' | null\n\tstorageAdapter: KottiStandardTableStorage | null\n\ttable: Omit<KottiTableParameter<ROW, COLUMN_ID>, 'id' | 'isSelectable'>\n}>\n\nconst paramsSchema = z.object({\n\tfilters: KottiStandardTable.filterSchema.array().default(() => []),\n\tid: z.string(),\n\tisLoading: z.boolean().default(false),\n\toptions: KottiStandardTable.optionsSchema.optional(),\n\tpaginationOptions: KottiStandardTable.paginationSchema,\n\tselectMode: z.enum(['global', 'single-page']).nullable().default(null),\n\t/**\n\t * Need to use z.any because there is currently no way in zod to ensure a class extends an interface.\n\t */\n\tstorageAdapter: z.any(),\n\ttable: KottiTableHookParamsSchema.omit({\n\t\tid: true,\n\t\tisSelectable: true,\n\t}),\n})\n\ntype KottiStandardTableHook<\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n> = {\n\tapi: KottiStandardTable.Hook.Returns<COLUMN_ID>\n\tcontext: StandardTableContext<ROW, COLUMN_ID>\n}\n\nexport const useKottiStandardTable = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>(\n\t_params: KottiStandardTableParameters<ROW, COLUMN_ID>,\n): KottiStandardTableHook<ROW, COLUMN_ID> => {\n\tconst params = computed(() => paramsSchema.parse(_params.value))\n\n\tconst filterInfo = computed<Map<string, FilterInfo>>(\n\t\t() =>\n\t\t\tnew Map(\n\t\t\t\tparams.value.filters.map((filter) => {\n\t\t\t\t\tconst { id, operations, type } = filter\n\n\t\t\t\t\treturn [id, { operations, type }]\n\t\t\t\t}),\n\t\t\t),\n\t)\n\n\tconst rowCount = computed(() =>\n\t\tparams.value.paginationOptions.type === 'local'\n\t\t\t? params.value.table.data.length\n\t\t\t: params.value.paginationOptions.rowCount,\n\t)\n\n\t// refs exposed on return/api\n\tconst searchValue = ref<string | null>(null)\n\n\t// FIXME: This useComputedRef right now assumes that the filters provdided via params\n\t// does not change. If a user would change it, it will lead to unintended behavior\n\tconst appliedFilters = useComputedRef<KottiStandardTable.AppliedFilter[]>({\n\t\tget: (value) => value,\n\t\tset(value) {\n\t\t\treturn value.filter((filter) => {\n\t\t\t\tconst meta = filterInfo.value.get(filter.id)\n\t\t\t\tif (!meta) return false\n\n\t\t\t\tswitch (meta.type) {\n\t\t\t\t\tcase KottiStandardTable.FilterType.BOOLEAN: {\n\t\t\t\t\t\treturn KottiStandardTable.appliedBooleanSchema.safeParse(filter)\n\t\t\t\t\t\t\t.success\n\t\t\t\t\t}\n\t\t\t\t\tcase KottiStandardTable.FilterType.DATE_RANGE: {\n\t\t\t\t\t\treturn KottiStandardTable.appliedDateRangeSchema.safeParse(filter)\n\t\t\t\t\t\t\t.success\n\t\t\t\t\t}\n\t\t\t\t\tcase KottiStandardTable.FilterType.MULTI_SELECT:\n\t\t\t\t\t\treturn KottiStandardTable.appliedMultiEnumSchema.safeParse(filter)\n\t\t\t\t\t\t\t.success\n\n\t\t\t\t\tcase KottiStandardTable.FilterType.NUMBER_RANGE:\n\t\t\t\t\t\treturn KottiStandardTable.appliedNumberRangeSchema.safeParse(filter)\n\t\t\t\t\t\t\t.success\n\n\t\t\t\t\tcase KottiStandardTable.FilterType.SINGLE_SELECT:\n\t\t\t\t\t\treturn KottiStandardTable.appliedSingleEnumSchema.safeParse(filter)\n\t\t\t\t\t\t\t.success\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tvalue: ref(\n\t\t\t(() => {\n\t\t\t\tconst filtersWithDefaultValue: KottiStandardTable.AppliedFilter[] = []\n\n\t\t\t\tfor (const filter of params.value.filters) {\n\t\t\t\t\tif (isNil(filter.defaultValue)) continue\n\n\t\t\t\t\tconst appliedFilter = {\n\t\t\t\t\t\tid: filter.id,\n\t\t\t\t\t\toperation: OPERATION_MAP[filter.type],\n\t\t\t\t\t\tvalue: filter.defaultValue,\n\t\t\t\t\t} as KottiStandardTable.AppliedFilter\n\n\t\t\t\t\tfiltersWithDefaultValue.push(appliedFilter)\n\t\t\t\t}\n\n\t\t\t\treturn filtersWithDefaultValue\n\t\t\t})(),\n\t\t),\n\t})\n\n\t// FIXME: This useComputedRef right now assumes that the pageSize provdided via params\n\t// does not change. If a user would change it, it will lead to unintended behavior\n\tconst pagination = useComputedRef<{ pageIndex: number; pageSize: number }>({\n\t\tget: (value) => value,\n\t\tset: ({ pageIndex, pageSize: _pageSize }) => {\n\t\t\tconst pageSize = (() => {\n\t\t\t\tconst { pageSizeOptions } = params.value.paginationOptions\n\t\t\t\tif (pageSizeOptions.includes(_pageSize)) return _pageSize\n\n\t\t\t\tfor (let i = pageSizeOptions.length - 1; i >= 0; i -= 1) {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tif (pageSizeOptions[i]! < _pageSize) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\treturn pageSizeOptions[i]!\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\treturn pageSizeOptions[0]!\n\t\t\t})()\n\t\t\tconst pageFirstRowIndex = pageIndex * pageSize\n\t\t\treturn {\n\t\t\t\tpageIndex:\n\t\t\t\t\tpageIndex < 0 || pageFirstRowIndex > rowCount.value ? 0 : pageIndex,\n\t\t\t\tpageSize,\n\t\t\t}\n\t\t},\n\t\tvalue: ref({\n\t\t\tpageIndex: 0,\n\t\t\tpageSize: params.value.paginationOptions.pageSize,\n\t\t}),\n\t})\n\n\tconst data = computed(() => {\n\t\tif (params.value.paginationOptions.type === 'remote')\n\t\t\treturn params.value.table.data\n\n\t\tconst sliceStart = pagination.value.pageIndex * pagination.value.pageSize\n\t\tconst sliceEnd = sliceStart + pagination.value.pageSize\n\t\treturn params.value.table.data.slice(sliceStart, sliceEnd)\n\t})\n\n\tconst storageAdapter = computed(\n\t\t() => params.value.storageAdapter ?? new DummyStorageAdapter(),\n\t)\n\n\tconst tableHook = useKottiTable<ROW, COLUMN_ID>(\n\t\tcomputed(() => ({\n\t\t\t...(params.value.table as Omit<\n\t\t\t\tKottiTableParameter<ROW, COLUMN_ID>,\n\t\t\t\t'id'\n\t\t\t>),\n\t\t\tdata: data.value,\n\t\t\tid: params.value.id,\n\t\t\tisSelectable: params.value.selectMode !== null,\n\t\t})),\n\t)\n\n\tconst storageOperationContext = computed(\n\t\t(): StorageOperationContext => ({\n\t\t\tcolumnIds: params.value.table.columns.map((x) => x.id),\n\t\t\tfilterInfo: filterInfo.value,\n\t\t}),\n\t)\n\n\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\tonBeforeMount(async () => {\n\t\tconst rawState = await storageAdapter.value.load(\n\t\t\tstorageOperationContext.value,\n\t\t)\n\n\t\tif (!rawState) {\n\t\t\treturn\n\t\t}\n\n\t\tconst state = serializableStateSchema.parse(rawState)\n\n\t\ttableHook.api.columnOrder.value = state.columnOrder as COLUMN_ID[]\n\t\ttableHook.api.hiddenColumns.value = new Set(\n\t\t\tstate.hiddenColumns as COLUMN_ID[],\n\t\t)\n\t\ttableHook.api.ordering.value =\n\t\t\tstate.ordering as KottiTable.Ordering<COLUMN_ID>[]\n\t\tappliedFilters.value = state.appliedFilters\n\t\tpagination.value = state.pagination\n\t\tsearchValue.value = state.searchValue\n\t})\n\n\tconst standardTableContext: StandardTableContext<ROW, COLUMN_ID> = computed(\n\t\t() => ({\n\t\t\tinternal: {\n\t\t\t\tappliedFilters: appliedFilters.value,\n\t\t\t\tcolumns: _params.value.table.columns,\n\t\t\t\tfilters: params.value.filters,\n\t\t\t\tgetFilter: (id) =>\n\t\t\t\t\tparams.value.filters.find((filter) => filter.id === id) ?? null,\n\t\t\t\tisLoading: params.value.isLoading,\n\t\t\t\toptions: params.value.options,\n\t\t\t\tpageSizeOptions: params.value.paginationOptions.pageSizeOptions,\n\t\t\t\tpagination: pagination.value,\n\t\t\t\trowCount: rowCount.value,\n\t\t\t\tsearchValue: searchValue.value,\n\t\t\t\tselectMode: params.value.selectMode,\n\t\t\t\tsetAppliedFilters: (filters: KottiStandardTable.AppliedFilter[]) => {\n\t\t\t\t\tappliedFilters.value = filters\n\t\t\t\t},\n\t\t\t\tsetPageIndex: (pageIndex: number) => {\n\t\t\t\t\tpagination.value = {\n\t\t\t\t\t\t...pagination.value,\n\t\t\t\t\t\tpageIndex,\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetPageSize: (pageSize: number) => {\n\t\t\t\t\tpagination.value = {\n\t\t\t\t\t\tpageIndex: 0,\n\t\t\t\t\t\tpageSize,\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetSearchValue: (search: KottiFieldText.Value) => {\n\t\t\t\t\tsearchValue.value = search\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t)\n\tuseProvideStandardTableContext(params.value.id, standardTableContext)\n\n\twatch(\n\t\tcomputed(() => ({\n\t\t\tappliedFilters: appliedFilters.value,\n\t\t\tcolumnOrder: tableHook.api.columnOrder.value,\n\t\t\thiddenColumns: tableHook.api.hiddenColumns.value,\n\t\t\tordering: tableHook.api.ordering.value,\n\t\t\tpagination: pagination.value,\n\t\t\tsearchValue: searchValue.value,\n\t\t})),\n\t\tasync (newState, oldState) => {\n\t\t\tif (isEqual(newState, oldState)) return\n\n\t\t\tawait storageAdapter.value.save(\n\t\t\t\t{\n\t\t\t\t\t...newState,\n\t\t\t\t\thiddenColumns: Array.from(newState.hiddenColumns),\n\t\t\t\t},\n\t\t\t\tstorageOperationContext.value,\n\t\t\t)\n\t\t},\n\t)\n\n\twatch(\n\t\t() => pagination.value,\n\t\t() => {\n\t\t\tif (params.value.selectMode === 'single-page') {\n\t\t\t\ttableHook.api.selectedRows.value = {}\n\t\t\t}\n\t\t},\n\t)\n\n\treturn {\n\t\tapi: {\n\t\t\t...tableHook.api,\n\t\t\tappliedFilters,\n\t\t\tpagination,\n\t\t\tsearchValue,\n\t\t},\n\t\tcontext: standardTableContext,\n\t}\n}\n","import dayjs from 'dayjs'\nimport { h } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { ISO8601, ISO8601_SECONDS } from '../../constants'\n\nimport type { KottiTable } from './types'\n\n// FIXME: some other often repeated patterns that can potentially be standardized here:\n//  - truncate text, needs clarification on default behavior\n//  - (nice-to-have) attachments, needs design\n//  - (nice-to-have) image, array of urls as data\n//  - (nice-to-have) tuples with separator (e.g. \"1234 x 23\")\n//\nconst numberFormatter = Intl.NumberFormat('us-US', { style: 'decimal' })\n\ntype DisplayOptionBoolean = {\n\tmode: 'icon' | 'text'\n\ttype: 'boolean'\n}\n\ntype DisplayOptionDate = {\n\tformatString?: string\n\ttype: 'date'\n}\ntype DisplayOptionDateTime = {\n\tformatString?: string\n\ttype: 'date-time'\n}\ntype DisplayOptionInteger = { type: 'integer' }\ntype DisplayOptionNumerical = {\n\tmaximumDecimalPlaces?: number\n\tminimumDecimalPlaces?: number\n\ttype: 'numerical'\n}\ntype DisplayOptionText = { type: 'text' }\ntype DisplayOption =\n\t| DisplayOptionBoolean\n\t| DisplayOptionDate\n\t| DisplayOptionDateTime\n\t| DisplayOptionInteger\n\t| DisplayOptionNumerical\n\t| DisplayOptionText\n\ntype ResolvedDisplayType<OPTION extends DisplayOption = DisplayOption> =\n\tKottiTable.Display<\n\t\t{\n\t\t\tboolean: boolean | null\n\t\t\tdate: Date | null\n\t\t\t'date-time': Date | null\n\t\t\tinteger: number | null\n\t\t\tnumerical: number | null\n\t\t\ttext: string | null\n\t\t}[OPTION['type']]\n\t>\n\nexport const getDisplay = <OPTION extends DisplayOption = DisplayOption>(\n\tparam: OPTION,\n): KottiTable.Display<\n\t{\n\t\tboolean: boolean | null\n\t\tdate: Date | null\n\t\t'date-time': Date | null\n\t\tinteger: number | null\n\t\tnumerical: number | null\n\t\ttext: string | null\n\t}[OPTION['type']]\n> => {\n\tswitch (param.type) {\n\t\tcase 'boolean': {\n\t\t\treturn {\n\t\t\t\talign: param.mode === 'text' ? 'left' : 'center',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: false,\n\t\t\t\trender: (value: boolean | null, { i18n }) => {\n\t\t\t\t\tif (value === null) return null\n\n\t\t\t\t\tif (param.mode === 'text') {\n\t\t\t\t\t\treturn value ? i18n.messages.KtTable.yes : i18n.messages.KtTable.no\n\t\t\t\t\t}\n\n\t\t\t\t\tconst [color, icon] = value\n\t\t\t\t\t\t? ['var(--support-success)', Yoco.Icon.CHECK]\n\t\t\t\t\t\t: ['var(--support-error)', Yoco.Icon.CIRCLE_CROSS]\n\n\t\t\t\t\treturn h(\n\t\t\t\t\t\t'i',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclass: 'yoco',\n\t\t\t\t\t\t\tstyle: { color: color, fontSize: '1rem' },\n\t\t\t\t\t\t},\n\t\t\t\t\t\ticon,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\tsortBehavior: 'desc-asc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t\tcase 'date': {\n\t\t\treturn {\n\t\t\t\talign: 'left',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: true,\n\t\t\t\trender: (value: Date | null) => {\n\t\t\t\t\tconst formatString = param.formatString ?? ISO8601\n\t\t\t\t\treturn value === null ? null : dayjs(value).format(formatString)\n\t\t\t\t},\n\t\t\t\tsortBehavior: 'desc-asc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t\tcase 'date-time': {\n\t\t\treturn {\n\t\t\t\talign: 'left',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: true,\n\t\t\t\trender: (value: Date | null) => {\n\t\t\t\t\tconst formatString = param.formatString ?? ISO8601_SECONDS\n\t\t\t\t\treturn value === null ? null : dayjs(value).format(formatString)\n\t\t\t\t},\n\t\t\t\tsortBehavior: 'desc-asc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t\tcase 'integer': {\n\t\t\treturn {\n\t\t\t\talign: 'right',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: true,\n\t\t\t\trender: (value: number | null) =>\n\t\t\t\t\tvalue === null\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: numberFormatter\n\t\t\t\t\t\t\t\t.format(Math.round(value))\n\t\t\t\t\t\t\t\t.replaceAll(',', '\\u2009'),\n\t\t\t\tsortBehavior: 'desc-asc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t\tcase 'numerical': {\n\t\t\treturn {\n\t\t\t\talign: 'right',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: true,\n\t\t\t\trender: (value: number | null, { i18n }) =>\n\t\t\t\t\tvalue === null\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: Intl.NumberFormat('us-US', {\n\t\t\t\t\t\t\t\tmaximumFractionDigits: param.maximumDecimalPlaces ?? 2,\n\t\t\t\t\t\t\t\tminimumFractionDigits: param.minimumDecimalPlaces ?? 2,\n\t\t\t\t\t\t\t\tstyle: 'decimal',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.format(value)\n\t\t\t\t\t\t\t\t.replaceAll(',', ' ') //'\\u2009')\n\t\t\t\t\t\t\t\t.replace('.', i18n.numberFormat.decimalSeparator),\n\t\t\t\tsortBehavior: 'desc-asc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t\tcase 'text': {\n\t\t\treturn {\n\t\t\t\talign: 'left',\n\t\t\t\tdisableCellClick: false,\n\t\t\t\tisNumeric: false,\n\t\t\t\trender: (value: string | null) => value,\n\t\t\t\tsortBehavior: 'asc-desc',\n\t\t\t} as ResolvedDisplayType<OPTION>\n\t\t}\n\t}\n}\n\nexport const getCustomDisplay = <\n\tDATA = 'please provide a generic parameter for your expected data type if you use type custom',\n>(\n\tparam: KottiTable.Display<DATA>,\n): KottiTable.Display<DATA> => {\n\treturn param\n}\n\nexport const createColumnContext = <ROW extends KottiTable.AnyRow>(): {\n\tcreateColumn: <COLUMN_ID extends string, DATA_TYPE>(options: {\n\t\tdisplay: KottiTable.Display<DATA_TYPE>\n\t\tgetData: (row: ROW) => DATA_TYPE\n\t\tid: COLUMN_ID\n\t\tisSortable?: boolean\n\t\tlabel: string\n\t\tmaxWidth?: string\n\t\tminWidth?: string\n\t\twidth?: string\n\t}) => KottiTable.Column<ROW, COLUMN_ID, DATA_TYPE>\n} => {\n\treturn {\n\t\tcreateColumn: (options) => options,\n\t}\n}\n","import clone from 'lodash/clone.js'\nimport type { Ref } from 'vue'\nimport { watch } from 'vue'\n\nimport type { KottiTable } from './types'\n\n/** @public */\nexport type SortMode = 'ascending' | 'descending'\n/** @public */\nexport type SortInstruction = -1 | 0 | 1\n\nconst SORT_MAP: Record<\n\tSortMode,\n\tRecord<\n\t\t'A_IS_B' | 'A_IS_NULL' | 'A_IS_SMALLER' | 'B_IS_NULL' | 'B_IS_SMALLER',\n\t\tSortInstruction\n\t>\n> = {\n\tascending: {\n\t\tA_IS_B: 0, // A and B are equal, no change in order\n\t\tA_IS_NULL: 1, // A is null, so it should move after B\n\t\tA_IS_SMALLER: -1, // A is smaller than B, so it should move before B\n\t\tB_IS_NULL: -1, // B is null, so A should move before B\n\t\tB_IS_SMALLER: 1, // B is smaller than A, so it should move after A\n\t},\n\tdescending: {\n\t\tA_IS_B: 0, // A and B are equal, no change in order\n\t\tA_IS_NULL: 1, // A is null, so it should move after B (same as ascending)\n\t\tA_IS_SMALLER: 1, // A is smaller than B, so it should move after B\n\t\tB_IS_NULL: -1, // B is null, so A should move before B (same as ascending)\n\t\tB_IS_SMALLER: -1, // B is smaller than A, so it should move before A\n\t},\n}\n\nexport function getNumericalSorter<T extends Record<string, unknown>>(\n\tmapper: (data: T) => number | null,\n\tmode: SortMode,\n): (a: T, b: T) => SortInstruction {\n\tconst map = SORT_MAP[mode]\n\n\treturn function mappedNumericalSorter(a: T, b: T) {\n\t\tconst valueA = mapper(a)\n\t\tconst valueB = mapper(b)\n\n\t\t// values are equal\n\t\tif (valueA === valueB) return map.A_IS_B\n\n\t\t// always punish null\n\t\tif (valueA === null) return map.A_IS_NULL\n\t\tif (valueB === null) return map.B_IS_NULL\n\n\t\treturn valueA < valueB ? map.A_IS_SMALLER : map.B_IS_SMALLER\n\t}\n}\n\nexport function getDateSorter<T extends Record<string, unknown>>(\n\tmapper: (data: T) => Date | null,\n\tmode: SortMode,\n): (a: T, b: T) => SortInstruction {\n\tconst map = SORT_MAP[mode]\n\n\treturn function mappedDateSorter(a: T, b: T) {\n\t\tconst valueA = mapper(a)\n\t\tconst valueB = mapper(b)\n\n\t\t// values are equal (nulls)\n\t\tif (valueA === null && valueB === null) return map.A_IS_B\n\n\t\t// always punish null\n\t\tif (valueA === null) return map.A_IS_NULL\n\t\tif (valueB === null) return map.B_IS_NULL\n\n\t\t// values are equal (dates)\n\t\tif (valueA <= valueB && valueB <= valueA) return map.A_IS_B\n\n\t\treturn valueA < valueB ? map.A_IS_SMALLER : map.B_IS_SMALLER\n\t}\n}\n\nexport function getTextSorter<T extends Record<string, unknown>>(\n\tmapper: (data: T) => string | null,\n\tmode: SortMode,\n): (a: T, b: T) => SortInstruction {\n\tconst map = SORT_MAP[mode]\n\n\treturn function mappedTextSorter(a: T, b: T) {\n\t\tconst valueA = mapper(a)\n\t\tconst valueB = mapper(b)\n\n\t\t// values are equal\n\t\tif (valueA === valueB) return map.A_IS_B\n\n\t\t// always punish null\n\t\tif (valueA === null) return map.A_IS_NULL\n\t\tif (valueB === null) return map.B_IS_NULL\n\n\t\treturn valueA.localeCompare(valueB) < 0\n\t\t\t? map.A_IS_SMALLER\n\t\t\t: map.B_IS_SMALLER\n\t}\n}\n\nexport const useLocalSort = <\n\tROW extends KottiTable.AnyRow,\n\tCOLUMN_ID extends string,\n>({\n\tlocallySortedData,\n\tordering,\n\trawData,\n\tsortingFunctions,\n}: {\n\tlocallySortedData: Ref<ROW[]>\n\tordering: Ref<KottiTable.Ordering<COLUMN_ID>[]>\n\trawData: Ref<ROW[]>\n\tsortingFunctions: Record<\n\t\tCOLUMN_ID,\n\t\t(mode: 'ascending' | 'descending') => (a: ROW, b: ROW) => SortInstruction\n\t>\n}): void => {\n\twatch(\n\t\t[rawData, ordering],\n\t\t() => {\n\t\t\tconst sort = ordering.value[0] ?? null\n\n\t\t\tif (sort === null) {\n\t\t\t\tlocallySortedData.value = rawData.value\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlocallySortedData.value = clone(rawData.value).sort(\n\t\t\t\tsortingFunctions[sort.id](sort.value),\n\t\t\t)\n\t\t},\n\t\t{ immediate: true },\n\t)\n}\n","import type { Kotti } from '../types'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtStandardTableVue from './KtStandardTable.vue'\nimport KtTableVue from './KtTable.vue'\nimport { KottiStandardTable } from './standard-table/types'\nimport { KottiTable } from './table/types'\n\nexport { useKottiStandardTable } from './standard-table/hooks'\nexport {\n\ttype KottiStandardTableStorage,\n\tLocalStorageAdapter,\n\ttype StorageOperationContext,\n} from './standard-table/storage'\nexport {\n\tcreateColumnContext,\n\tgetCustomDisplay,\n\tgetDisplay,\n} from './table/column-helper'\nexport { useKottiTable } from './table/hooks'\nexport {\n\tgetDateSorter,\n\tgetNumericalSorter,\n\tgetTextSorter,\n\tuseLocalSort,\n} from './table/local'\n\nconst TABLE_META: Kotti.Meta = {\n\taddedVersion: '8.2.0',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=128%3A0',\n\t},\n\tslots: {\n\t\tactions: {\n\t\t\tdescription: 'E.g. edit/delete row actions',\n\t\t\tscope: {\n\t\t\t\trow: { description: 'Original row data', type: 'object' },\n\t\t\t\trowIndex: { description: 'Position of row', type: 'integer' },\n\t\t\t},\n\t\t},\n\t\tempty: {\n\t\t\tdescription:\n\t\t\t\t'Alternative to emptyText prop. Shown when the Table is empty',\n\t\t\tscope: null,\n\t\t},\n\t\t'expanded-row': {\n\t\t\tdescription: 'Per row, allows showing more info on-demand',\n\t\t\tscope: {\n\t\t\t\trow: { description: 'Original row data', type: 'object' },\n\t\t\t\trowIndex: { description: 'Position of row', type: 'integer' },\n\t\t\t},\n\t\t},\n\t\tloading: {\n\t\t\tdescription: 'Shown when loading',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.Table',\n\t\tschema: KottiTable.propsSchema,\n\t},\n}\n\nconst STANDARD_META: Kotti.Meta = {\n\taddedVersion: '7.4.0',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/design/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=6305-10646&node-type=canvas&t=8lzEM5nlkrh8aUMF-0',\n\t},\n\tslots: {\n\t\t'applied-filter-actions': {\n\t\t\tdescription: 'slot next to the applied filters section',\n\t\t\tscope: null,\n\t\t},\n\t\t'control-actions': {\n\t\t\tdescription: 'slot next to the table controls section',\n\t\t\tscope: null,\n\t\t},\n\t\t'header-actions': {\n\t\t\tdescription: 'slot next to the table title',\n\t\t\tscope: null,\n\t\t},\n\t\ttable: {\n\t\t\tdescription: 'slot to show custom content instead of the KtTable',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.StandardTable',\n\t\tschema: KottiStandardTable.propsSchema,\n\t},\n}\n\nexport const KtTable = attachMeta(makeInstallable(KtTableVue), TABLE_META)\n\nexport const KtStandardTable = attachMeta(\n\tmakeInstallable(KtStandardTableVue),\n\tSTANDARD_META,\n)\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport type { CreateElement, InjectionKey, VNodeChildren } from 'vue'\nimport type { Vue as VueType } from 'vue/types/vue'\n\nimport type { TypedEmit } from '../types/typed-emit'\n\nimport type { TableStore } from './logic/store'\nimport type { Store } from './logic/types'\nimport type { KottiTableLegacy } from './types'\n\nexport const IS_ASC = /ascending|^1/\nexport const IS_DSC = /descending|^-1/\n\ninterface KottiTableContext {\n\t$emit: TypedEmit<{\n\t\tactivateRow: [unknown, number]\n\t\tcellClick: [\n\t\t\t{\n\t\t\t\tcolumn: Store.StateComponents.ColumnRepresentation\n\t\t\t\tcolumnIndex: number\n\t\t\t\trow: KottiTableLegacy.Row.Props\n\t\t\t\trowIndex: number\n\t\t\t\tvalue: unknown\n\t\t\t},\n\t\t]\n\t\tcolumnsChange: unknown[]\n\t\texpand: unknown[]\n\t\texpandChange: unknown[]\n\t\thiddenChange: unknown[]\n\t\torderChange: unknown[]\n\t\trowBlur: [unknown, number]\n\t\trowClick: [unknown, number]\n\t\trowFocus: [unknown, number]\n\t\tselect: unknown[]\n\t\tselectAll: unknown[]\n\t\tselectionChange: unknown[]\n\t\tsortChange: unknown[]\n\t}>\n\t$listeners: VueType['$listeners']\n\t_renderActions: (\n\t\th: CreateElement,\n\t\tpayload: {\n\t\t\tdata: KottiTableLegacy.Row.Props\n\t\t\trow: KottiTableLegacy.Row.Props\n\t\t\trowIndex: number\n\t\t},\n\t) => VNodeChildren\n\t_renderEmpty: (h: CreateElement) => VNodeChildren\n\t_renderExpand: (\n\t\th: CreateElement,\n\t\tpayload: {\n\t\t\tdata: KottiTableLegacy.Row.Props\n\t\t\trow: KottiTableLegacy.Row.Props\n\t\t\trowIndex: number\n\t\t},\n\t) => VNodeChildren\n\t_renderLoading: (h: CreateElement) => VNodeChildren\n\tcolSpan: number\n\tdisableRow: KottiTableLegacy.Props['disableRow']\n\thasActions: boolean\n\theaderClass: KottiTableLegacy.Props['headerClass']\n\tisExpandable: boolean\n\tisInteractive: KottiTableLegacy.Props['isInteractive']\n\tisSelectable: KottiTableLegacy.Props['isSelectable']\n\tloading: boolean\n\ttdClasses: KottiTableLegacy.Props['tdClasses']\n\tthClasses: KottiTableLegacy.Props['thClasses']\n\ttrClasses: KottiTableLegacy.Props['trClasses']\n\tuseColumnDragToOrder: KottiTableLegacy.Props['useColumnDragToOrder']\n\tuseQuickSortControl: KottiTableLegacy.Props['useQuickSortControl']\n}\n\n/**\n * HACK: This is a string type-masquerading as a symbol, because\n *   - using a string works perfectly fine at runtime\n *   - an InjectionKey needs to be a symbol\n *   - using a Symbol will produce strange runtime issues\n *\n * Plan for now: probably this needs to be done for the other injection keys as well.\n * At a later stage of refactoring the table to composition API we can probably use actual symbols\n */\nexport const KT_TABLE: InjectionKey<KottiTableContext> =\n\t'KT_TABLE' as unknown as symbol\nexport const KT_STORE: InjectionKey<TableStore> =\n\t'KT_STORE' as unknown as symbol\nexport const KT_TABLE_STATE_PROVIDER = 'KT_TABLE_STATE_PROVIDER'\nexport const COLUMN_TYPE = Symbol('kt-table-legacy-column')\n\nexport const DEFAULT_DISABLE_ROW = (): boolean => false\n\nexport const PUBLIC_SORT_PROPS = [\n\t'prop',\n\t'sortBy',\n\t'sortOrder',\n] satisfies (keyof Store.StateComponents.ColumnRepresentation)[]\nexport const PUBLIC_COLUMN_PROPS = [\n\t'prop',\n\t'order',\n\t'hidden',\n] satisfies (keyof Store.StateComponents.ColumnRepresentation)[]\n\nexport const DEFAULT_RENDER_CELL = function defaultRenderCell(\n\t_h: CreateElement,\n\t{ column, columnIndex, row, rowIndex, value }: any,\n): [any] {\n\treturn [\n\t\tcolumn.formatter(value, row, column, columnIndex, rowIndex) ??\n\t\t\tcolumn.default,\n\t]\n}\n\nexport const DEFAULT_RENDER_HEADER = function defaultRenderHeader(\n\t_h: CreateElement,\n\t{ column }: any,\n): [any] {\n\treturn [column.label === undefined ? column.prop : column.label]\n}\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import { computed, defineComponent, h, inject } from 'vue'\n\nimport { KT_TABLE } from '../constants'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableBodyEmptyRow = defineComponent({\n\tname: 'TableBodyEmptyRow',\n\tsetup() {\n\t\tconst tableState = inject(KT_TABLE)\n\n\t\tif (!tableState)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst colSpan = computed(() => tableState.colSpan)\n\t\tconst render = computed(() => tableState._renderEmpty)\n\n\t\treturn () =>\n\t\t\th('tr', {}, [\n\t\t\t\th(\n\t\t\t\t\t'td',\n\t\t\t\t\t{\n\t\t\t\t\t\tclass: 'kt-table-legacy__no-row',\n\t\t\t\t\t\tdomProps: { colSpan: colSpan.value },\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\th('span', { class: 'kt-table-legacy__empty-text' }, [\n\t\t\t\t\t\t\trender.value(h),\n\t\t\t\t\t\t]),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t])\n\t},\n})\n","import { computed, defineComponent, h, inject, type PropType } from 'vue'\n\nimport { KT_STORE, KT_TABLE } from '../constants'\nimport type { KottiTableLegacy } from '../types'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableBodyExpandRow = defineComponent({\n\tname: 'TableBodyExpandRow',\n\tprops: {\n\t\trow: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiTableLegacy.Row.Props>,\n\t\t},\n\t\trowIndex: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst tableState = inject(KT_TABLE)\n\t\tconst tableStore = inject(KT_STORE)\n\n\t\tif (!tableState || !tableStore)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst colSpan = computed(() => tableState.colSpan)\n\t\tconst isExpanded = computed(() => tableStore.get('isExpanded', props.row))\n\t\tconst render = computed(() => tableState._renderExpand)\n\n\t\treturn () =>\n\t\t\tisExpanded.value &&\n\t\t\th('tr', {}, [\n\t\t\t\th(\n\t\t\t\t\t'td',\n\t\t\t\t\t{\n\t\t\t\t\t\tattrs: { colSpan: colSpan.value },\n\t\t\t\t\t\tclass: 'kt-table-legacy__expanded-cell',\n\t\t\t\t\t},\n\t\t\t\t\t[\n\t\t\t\t\t\trender.value(h, {\n\t\t\t\t\t\t\tdata: props.row,\n\t\t\t\t\t\t\trow: props.row,\n\t\t\t\t\t\t\trowIndex: props.rowIndex,\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t),\n\t\t\t])\n\t},\n})\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, defineComponent, h, inject } from 'vue'\n\nimport { KT_TABLE } from '../constants'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableBodyLoadingRow: any = defineComponent({\n\tname: 'TableBodyLoadingRow',\n\tsetup() {\n\t\tconst tableState = inject(KT_TABLE)\n\n\t\tif (!tableState)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst colSpan = computed(() => tableState.colSpan)\n\t\tconst render = computed(() => tableState._renderLoading)\n\n\t\treturn () =>\n\t\t\th('tr', {}, [\n\t\t\t\th(\n\t\t\t\t\t'td',\n\t\t\t\t\t{\n\t\t\t\t\t\tattrs: { colSpan: colSpan.value },\n\t\t\t\t\t\tclass: 'kt-table-legacy__loader',\n\t\t\t\t\t},\n\t\t\t\t\t[render.value(h)],\n\t\t\t\t),\n\t\t\t])\n\t},\n})\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import property from 'lodash/property.js'\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, h, inject } from 'vue'\n\nimport { KT_STORE, KT_TABLE } from '../constants'\nimport type { Store } from '../logic/types'\nimport { type KottiTableLegacy } from '../types'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableRowCell = defineComponent({\n\tname: 'TableRowCell',\n\tprops: {\n\t\tcolumn: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<Store.StateComponents.ColumnRepresentation>,\n\t\t},\n\t\tcolumnIndex: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t\trow: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<KottiTableLegacy.Row.Props>,\n\t\t},\n\t\trowIndex: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst tableState = inject(KT_TABLE)\n\t\tconst tableStore = inject(KT_STORE)\n\n\t\tif (!tableState || !tableStore)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst value = computed(() => property(props.column.prop)(props.row))\n\t\tconst _tdClasses = computed(() => [\n\t\t\ttableState.tdClasses,\n\t\t\tprops.column.tdClass,\n\t\t])\n\t\tconst _cellClass = computed(() => [\n\t\t\t'kt-table-legacy__cell',\n\t\t\tprops.column.cellClass,\n\t\t])\n\t\tconst _tdStyles = computed(() => {\n\t\t\tconst { column } = props\n\t\t\treturn {\n\t\t\t\t// @ts-expect-error not clear where styles is coming from, will fix later\n\t\t\t\t...column.styles,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- eslint might be correct here\n\t\t\t\t...(column.align ? { textAlign: column.align } : {}),\n\t\t\t\t...(column.width ? { width: column.width } : {}),\n\t\t\t\t...(column.maxWidth ? { maxWidth: column.maxWidth } : {}),\n\t\t\t\t...(column.minWidth ? { minWidth: column.minWidth } : {}),\n\t\t\t}\n\t\t})\n\n\t\tconst cellClick = (\n\t\t\t$event: MouseEvent,\n\t\t\tdata: {\n\t\t\t\tcolumn: Store.StateComponents.ColumnRepresentation\n\t\t\t\tcolumnIndex: number\n\t\t\t\trow: KottiTableLegacy.Row.Props\n\t\t\t\trowIndex: number\n\t\t\t\tvalue: unknown\n\t\t\t},\n\t\t) => {\n\t\t\tif (data.column.disableRowClick) {\n\t\t\t\t$event.stopPropagation()\n\t\t\t}\n\t\t\ttableState.$emit('cellClick', data)\n\t\t}\n\n\t\treturn () =>\n\t\t\th(\n\t\t\t\t'td',\n\t\t\t\t{\n\t\t\t\t\tclass: _tdClasses,\n\t\t\t\t\ton: {\n\t\t\t\t\t\tclick: ($event: MouseEvent) => {\n\t\t\t\t\t\t\tcellClick($event, {\n\t\t\t\t\t\t\t\tcolumn: props.column,\n\t\t\t\t\t\t\t\tcolumnIndex: props.columnIndex,\n\t\t\t\t\t\t\t\trow: props.row,\n\t\t\t\t\t\t\t\trowIndex: props.rowIndex,\n\t\t\t\t\t\t\t\tvalue: value.value,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tstyle: _tdStyles.value,\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tattrs: {\n\t\t\t\t\t\t\t\t'data-prop': props.column.prop,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tclass: _cellClass,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tprops.column.renderCell(h, {\n\t\t\t\t\t\t\t\tcolumn: props.column,\n\t\t\t\t\t\t\t\tcolumnIndex: props.columnIndex,\n\t\t\t\t\t\t\t\trow: props.row,\n\t\t\t\t\t\t\t\trowIndex: props.rowIndex,\n\t\t\t\t\t\t\t\tvalue: value.value,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t)\n\t},\n})\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, defineComponent, h, inject, type PropType } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport { KT_STORE, KT_TABLE } from '../constants'\n\nimport { TableRowCell } from './TableRowCell'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableRow = defineComponent({\n\tname: 'TableRow',\n\tprops: {\n\t\trow: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<Record<string, unknown>>,\n\t\t},\n\t\trowIndex: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t\trowKey: {\n\t\t\trequired: true,\n\t\t\ttype: [String, Number],\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst tableState = inject(KT_TABLE)\n\t\tconst tableStore = inject(KT_STORE)\n\n\t\tif (!tableState || !tableStore)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst hasActions = computed(() => Boolean(tableState.hasActions))\n\t\tconst hasClickListener = computed(() =>\n\t\t\tBoolean(tableState.$listeners.rowClick),\n\t\t)\n\t\tconst isDisabled = computed(() =>\n\t\t\ttableState.disableRow({ row: props.row, rowIndex: props.rowIndex }),\n\t\t)\n\t\tconst isFocusedRow = computed(() =>\n\t\t\ttableStore.get('isFocusedRow', props.row),\n\t\t)\n\t\tconst isExpandable = computed(() => tableState.isExpandable)\n\t\tconst isExpanded = computed(() => tableStore.get('isExpanded', props.row))\n\t\tconst isInteractive = computed(\n\t\t\t() =>\n\t\t\t\ttableState.isInteractive || Boolean(tableState.$listeners.activateRow),\n\t\t)\n\t\tconst isSelectable = computed(() => tableState.isSelectable)\n\t\tconst isSelectedRow = computed(() =>\n\t\t\ttableStore.get('isSelected', props.row),\n\t\t)\n\n\t\tconst expandToggleIcon = computed(() =>\n\t\t\tisExpanded.value ? Yoco.Icon.CHEVRON_UP : Yoco.Icon.CHEVRON_DOWN,\n\t\t)\n\t\tconst renderActions = computed(() => tableState._renderActions)\n\t\tconst tableColumns = computed(() => tableStore.state.columns)\n\t\tconst _trClasses = computed(() => {\n\t\t\tconst classes: (Record<string, unknown> | string[] | string)[] = []\n\n\t\t\tif ((isInteractive.value || hasClickListener.value) && !isDisabled.value)\n\t\t\t\tclasses.push('clickable')\n\t\t\tif (isSelectedRow.value) classes.push('selected')\n\t\t\tif (isDisabled.value) classes.push('disabled')\n\t\t\tif (tableState.trClasses) classes.push(tableState.trClasses)\n\t\t\treturn classes\n\t\t})\n\n\t\tconst handleActionsClick = ($event: MouseEvent) => {\n\t\t\t$event.stopPropagation()\n\t\t}\n\t\tconst handleBlur = (row: unknown, index: number) => {\n\t\t\tif (!isInteractive.value || isDisabled.value) return\n\n\t\t\ttableStore.commit('blurRow', row)\n\t\t\ttableState.$emit('rowBlur', row, index)\n\t\t}\n\t\tconst handleClick = (row: unknown, index: number) => {\n\t\t\tif (isDisabled.value) return\n\n\t\t\ttableState.$emit('rowClick', row, index)\n\t\t\tif (!isInteractive.value) return\n\n\t\t\ttableState.$emit('activateRow', row, index)\n\t\t}\n\t\tconst handleExpand = ($event: MouseEvent, row: unknown) => {\n\t\t\t$event.stopPropagation()\n\t\t\ttableStore.commit('expandRow', row)\n\t\t}\n\t\tconst handleFocus = (row: unknown, index: number) => {\n\t\t\tif (!isInteractive.value || isDisabled.value) return\n\n\t\t\ttableStore.commit('focusRow', row)\n\t\t\ttableState.$emit('rowFocus', row, index)\n\t\t}\n\t\tconst handleKey = ($event: KeyboardEvent, row: unknown, index: number) => {\n\t\t\tif (\n\t\t\t\t$event.key !== 'Enter' ||\n\t\t\t\t!isInteractive.value ||\n\t\t\t\tisDisabled.value ||\n\t\t\t\t!isFocusedRow.value\n\t\t\t)\n\t\t\t\treturn\n\n\t\t\ttableState.$emit('activateRow', row, index)\n\t\t}\n\t\tconst handleSelect = ($event: MouseEvent, row: unknown) => {\n\t\t\t$event.stopPropagation()\n\t\t\ttableStore.commit('selectRow', row, !isSelectedRow.value)\n\t\t}\n\n\t\treturn () =>\n\t\t\th(\n\t\t\t\t'tr',\n\t\t\t\t{\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\t'data-test': `table:element:${props.rowIndex}:${props.rowKey}`,\n\t\t\t\t\t\ttabIndex: isInteractive.value && !isDisabled.value ? 0 : false,\n\t\t\t\t\t},\n\t\t\t\t\tclass: _trClasses.value,\n\t\t\t\t\tdomProps: {\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\tisInteractive.value && !isDisabled.value ? 'button' : undefined,\n\t\t\t\t\t},\n\t\t\t\t\ton: {\n\t\t\t\t\t\tblur: () => {\n\t\t\t\t\t\t\thandleBlur(props.row, props.rowIndex)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\thandleClick(props.row, props.rowIndex)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfocus: () => {\n\t\t\t\t\t\t\thandleFocus(props.row, props.rowIndex)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tkeyup: ($event: KeyboardEvent) => {\n\t\t\t\t\t\t\thandleKey($event, props.row, props.rowIndex)\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tisExpandable.value &&\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'td',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tclass: 'c-hand',\n\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\tclick: ($event: MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\thandleExpand($event, props.row)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th('div', { class: 'expand-toggle' }, [\n\t\t\t\t\t\t\t\t\th('i', { class: 'yoco' }, [expandToggleIcon.value]),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\tisSelectable.value &&\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'td',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tclass: 'td-selectable kt-table-legacy__checkbox-col',\n\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\tclick: ($event: MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\t$event.stopPropagation()\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tclass: 'form-group',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\th('label', { class: 'form-checkbox' }, [\n\t\t\t\t\t\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\t\t\t\t\t\tattrs: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked: isSelectedRow.value,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled: isDisabled.value,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tdomProps: {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tclick: ($event: MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleSelect($event, props.row)\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\th('i', {\n\t\t\t\t\t\t\t\t\t\t\t\tclass: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t'form-icon',\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSelectedRow.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'form-icon--is-checked'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: isDisabled.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t? { cursor: 'not-allowed' }\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t\t...tableColumns.value.map((column: any, columnIndex: number) =>\n\t\t\t\t\t\th(TableRowCell, {\n\t\t\t\t\t\t\tkey: column.prop || columnIndex,\n\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\t\t\tcolumnIndex,\n\t\t\t\t\t\t\t\trow: props.row,\n\t\t\t\t\t\t\t\trowIndex: props.rowIndex,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t\thasActions.value &&\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'td',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ton: {\n\t\t\t\t\t\t\t\t\tclick: handleActionsClick,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tclass: 'table-actions',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\trenderActions.value(h, {\n\t\t\t\t\t\t\t\t\t\t\tdata: props.row,\n\t\t\t\t\t\t\t\t\t\t\trow: props.row,\n\t\t\t\t\t\t\t\t\t\t\trowIndex: props.rowIndex,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t)\n\t},\n})\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, defineComponent, h, inject } from 'vue'\n\nimport { KT_STORE, KT_TABLE } from '../constants'\n\nimport { TableBodyEmptyRow } from './TableBodyEmptyRow'\nimport { TableBodyExpandRow } from './TableBodyExpandRow'\nimport { TableBodyLoadingRow } from './TableBodyLoadingRow'\nimport { TableRow } from './TableRow'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableBody = defineComponent({\n\tcomponents: { TableRow },\n\tname: 'TableBody',\n\tsetup() {\n\t\tconst tableState = inject(KT_TABLE)\n\t\tconst tableStore = inject(KT_STORE)\n\n\t\tif (!tableState || !tableStore)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst rows = computed(() => tableStore.state.rows)\n\t\tconst loading = computed(() => tableState.loading)\n\t\tconst isExpandable = computed(() => tableState.isExpandable)\n\t\tconst showEmptyText = computed(\n\t\t\t() => rows.value.length === 0 && !loading.value,\n\t\t)\n\n\t\tconst getRowKey = (row: unknown) => tableStore.get('getRowKey', row)\n\n\t\treturn () =>\n\t\t\th('tbody', {}, [\n\t\t\t\tshowEmptyText.value && h(TableBodyEmptyRow),\n\t\t\t\t...(loading.value\n\t\t\t\t\t? [h(TableBodyLoadingRow)]\n\t\t\t\t\t: rows.value.flatMap((row: any, rowIndex: number) => {\n\t\t\t\t\t\t\tconst key = getRowKey(row) || rowIndex\n\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\th(TableRow, {\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\trowIndex,\n\t\t\t\t\t\t\t\t\t\trowKey: key,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tisExpandable.value &&\n\t\t\t\t\t\t\t\t\th(TableBodyExpandRow, {\n\t\t\t\t\t\t\t\t\t\tkey: `${key}-expansion`,\n\t\t\t\t\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\trowIndex,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t})),\n\t\t\t])\n\t},\n})\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import { defineComponent, h } from 'vue'\nimport type { PropType } from 'vue'\n\nimport type { Store } from '../logic/types'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableHeaderCell = defineComponent({\n\tname: 'TableHeaderCell',\n\tprops: {\n\t\tcolumn: {\n\t\t\trequired: true,\n\t\t\ttype: Object as PropType<Store.StateComponents.ColumnRepresentation>,\n\t\t},\n\t\tcolumnIndex: {\n\t\t\trequired: true,\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup(props) {\n\t\treturn () =>\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\t'data-prop': props.column.prop,\n\t\t\t\t\t},\n\t\t\t\t\tclass: [\n\t\t\t\t\t\t'kt-table-legacy__cell',\n\t\t\t\t\t\t'kt-table-legacy__header-cell',\n\t\t\t\t\t\tprops.column.headerCellClass,\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tprops.column.renderHeader(h, {\n\t\t\t\t\t\tcolumn: props.column,\n\t\t\t\t\t\tcolumnIndex: props.columnIndex,\n\t\t\t\t\t\tvalue: props.column.label,\n\t\t\t\t\t}),\n\t\t\t\t],\n\t\t\t)\n\t},\n})\n","<template>\n\t<thead>\n\t\t<tr :class=\"tableHeaderClass\">\n\t\t\t<th v-if=\"isExpandable\" class=\"th-expandable\" />\n\t\t\t<th\n\t\t\t\tv-if=\"isSelectable\"\n\t\t\t\tclass=\"th-selectable kt-table-legacy__checkbox-col\"\n\t\t\t>\n\t\t\t\t<div class=\"form-group\" @click=\"handleSelectAll\">\n\t\t\t\t\t<label class=\"form-checkbox\">\n\t\t\t\t\t\t<input :checked=\"isAllSelected\" type=\"checkbox\" />\n\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t'form-icon': true,\n\t\t\t\t\t\t\t\t'form-icon--is-checked': isAllSelected,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t:style=\"isAllRowsDisabled ? { cursor: 'not-allowed' } : {}\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th\n\t\t\t\tv-for=\"(column, columnIndex) in tableColumns\"\n\t\t\t\t:key=\"column.prop\"\n\t\t\t\t:class=\"getThClasses(column)\"\n\t\t\t\t:draggable=\"useColumnDragToOrder\"\n\t\t\t\t:style=\"getThStyle(column)\"\n\t\t\t\t@click=\"handleThClick(column)\"\n\t\t\t\t@dragend=\"handleDragEnd\"\n\t\t\t\t@dragenter=\"handleDragEnter(column)\"\n\t\t\t\t@dragover.prevent\n\t\t\t\t@dragstart=\"handleDragStart(column)\"\n\t\t\t\t@drop=\"handleDrop(column)\"\n\t\t\t>\n\t\t\t\t<TableHeaderCell v-bind=\"{ column, columnIndex }\" />\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"useQuickSortControl && (canSort(column) || isSorted(column))\"\n\t\t\t\t\tclass=\"kt-table-legacy__controls\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"kt-table-legacy__quick-sort-control clickable\">\n\t\t\t\t\t\t<i :class=\"{ active: isSortedByAsc(column), yoco: true }\">\n\t\t\t\t\t\t\ttriangle_up\n\t\t\t\t\t\t</i>\n\t\t\t\t\t\t<i :class=\"{ active: isSortedByDsc(column), yoco: true }\">\n\t\t\t\t\t\t\ttriangle_down\n\t\t\t\t\t\t</i>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th v-if=\"hasActions\" class=\"th-actions\" />\n\t\t</tr>\n\t</thead>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { KT_STORE, KT_TABLE } from '../constants'\nimport type { Store } from '../logic/types'\nimport { KottiTableLegacy } from '../types'\n\nimport { TableHeaderCell } from './TableHeaderCell'\n\nexport default defineComponent({\n\tname: 'KtTableHeader',\n\tcomponents: {\n\t\tTableHeaderCell,\n\t},\n\tsetup() {\n\t\tconst tableState = inject(KT_TABLE)\n\t\tconst tableStore = inject(KT_STORE)\n\n\t\tif (!tableState || !tableStore)\n\t\t\tthrow new Error(\n\t\t\t\t'TableRowCell: Component was used without providing the right contexts',\n\t\t\t)\n\n\t\tconst dropTargetColumn =\n\t\t\tref<Store.StateComponents.ColumnRepresentation | null>(null)\n\t\tconst draggedColumn =\n\t\t\tref<Store.StateComponents.ColumnRepresentation | null>(null)\n\n\t\tconst useColumnDragToOrder = computed(() => tableState.useColumnDragToOrder)\n\t\tconst isDraggedOver = (column: unknown) =>\n\t\t\tcolumn === dropTargetColumn.value && draggedColumn.value !== column\n\n\t\tconst useQuickSortControl = computed(() => tableState.useQuickSortControl)\n\n\t\tconst canSort = (column: unknown) => tableStore.get('canSort', column)\n\t\tconst isSorted = (column: unknown) => tableStore.get('isSorted', column)\n\n\t\treturn {\n\t\t\tcanSort,\n\t\t\tgetThClasses: (column: Store.StateComponents.ColumnRepresentation) => [\n\t\t\t\t{\n\t\t\t\t\tclickable: canSort(column),\n\t\t\t\t\t'drag-over': isDraggedOver(column),\n\t\t\t\t\tdragging: useColumnDragToOrder.value,\n\t\t\t\t\tsortable: canSort(column),\n\t\t\t\t\tsorted: isSorted(column),\n\t\t\t\t},\n\t\t\t\ttableState.thClasses,\n\t\t\t\tcolumn.thClass,\n\t\t\t],\n\t\t\tgetThStyle: (column: Store.StateComponents.ColumnRepresentation) => ({\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\t\t\ttextAlign: column.align ?? KottiTableLegacy.Column.Align.LEFT,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\t\t\twidth: column.width ?? 'auto',\n\t\t\t}),\n\t\t\thandleDragEnd: () => {\n\t\t\t\tdropTargetColumn.value = null\n\t\t\t},\n\t\t\thandleDragEnter: (column: Store.StateComponents.ColumnRepresentation) => {\n\t\t\t\tdropTargetColumn.value = column\n\t\t\t},\n\t\t\thandleDragStart: (column: Store.StateComponents.ColumnRepresentation) => {\n\t\t\t\tdraggedColumn.value = column\n\t\t\t},\n\t\t\thandleDrop: (column: Store.StateComponents.ColumnRepresentation) => {\n\t\t\t\tif (draggedColumn.value) {\n\t\t\t\t\ttableStore.commit('orderBefore', draggedColumn.value, column)\n\t\t\t\t\tdraggedColumn.value = null\n\t\t\t\t}\n\t\t\t\tdropTargetColumn.value = null\n\t\t\t},\n\t\t\thandleSelectAll: () => {\n\t\t\t\ttableStore.commit('toggleAllSelection')\n\t\t\t},\n\t\t\thandleThClick: (column: Store.StateComponents.ColumnRepresentation) => {\n\t\t\t\tif (!useQuickSortControl.value) return\n\t\t\t\tif (!canSort(column)) return\n\n\t\t\t\ttableStore.commit('sort', { column })\n\t\t\t},\n\t\t\thasActions: computed(() => tableState.hasActions),\n\t\t\tisAllRowsDisabled: computed(() => tableStore.state.isAllRowsDisabled),\n\t\t\tisAllSelected: computed(() => tableStore.state.isAllSelected),\n\t\t\tisExpandable: computed(() => tableState.isExpandable),\n\t\t\tisSelectable: computed(() => tableState.isSelectable),\n\t\t\tisSorted,\n\t\t\tisSortedByAsc: (column: Store.StateComponents.ColumnRepresentation) =>\n\t\t\t\ttableStore.get('isSortedByAsc', column),\n\t\t\tisSortedByDsc: (column: Store.StateComponents.ColumnRepresentation) =>\n\t\t\t\ttableStore.get('isSortedByDsc', column),\n\t\t\ttableColumns: computed(() => tableStore.state.columns),\n\t\t\ttableHeaderClass: computed(() => [\n\t\t\t\t'table-header-row',\n\t\t\t\ttableState.headerClass,\n\t\t\t]),\n\t\t\tuseColumnDragToOrder,\n\t\t\tuseQuickSortControl,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../kotti-style/_variables.scss';\n\n.table-header-row {\n\tbackground-color: var(--ui-01);\n}\n\n.kt-table-legacy__checkbox-col .form-group {\n\tposition: relative;\n}\n\nth {\n\tbox-sizing: border-box;\n\tpadding: var(--unit-2) var(--unit-1);\n\tfont-size: $font-size-sm;\n\tline-height: 1em;\n\tcolor: $lightgray-500;\n\ttext-align: inherit;\n\ttext-transform: uppercase;\n\tborder-width: 0;\n\tborder-left-color: var(--ui-03);\n\ttransition: border 0.2s ease-in-out;\n}\n\nth.drag-over {\n\tborder-left: 0.3rem solid;\n}\n\nth.sortable {\n\tposition: relative;\n\tpadding-right: 1rem;\n}\n\nth.dragging {\n\tcursor: move;\n}\n\nth.sortable .kt-table-legacy__controls {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0.1rem;\n\tdisplay: none;\n\twidth: 0.6rem;\n\theight: 100%;\n\thyphens: none;\n}\n\nth.sortable:hover .kt-table-legacy__controls,\nth.sorted .kt-table-legacy__controls {\n\tdisplay: flex;\n\talign-items: center;\n}\n\nth.sortable:hover .kt-table-legacy__quick-sort-control,\nth.sorted .kt-table-legacy__quick-sort-control {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\twidth: 0.5rem;\n}\n\n.kt-table-legacy__quick-sort-control .yoco {\n\theight: 0.5rem;\n\tline-height: 0.5;\n\tcolor: var(--text-03);\n}\n\n.kt-table-legacy__quick-sort-control .yoco.active {\n\tcolor: var(--interactive-01);\n}\n</style>\n","/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pick from 'lodash/pick.js'\nimport type { CreateElement } from 'vue'\n\nimport {\n\tCOLUMN_TYPE,\n\tDEFAULT_RENDER_CELL,\n\tDEFAULT_RENDER_HEADER,\n\tKT_STORE,\n\tKT_TABLE,\n} from './constants'\nimport { KottiTableLegacy } from './types'\n\nlet columnIdSeed = 1\n\nfunction updateColumnsfor(prop: any) {\n\treturn function updateColumnProp(newVal: unknown) {\n\t\t// @ts-expect-error columnConfig will exist at runtime\n\t\tif (this.columnConfig) {\n\t\t\t// @ts-expect-error columnConfig will exist at runtime\n\t\t\tthis.columnConfig[prop] = newVal\n\t\t\t// @ts-expect-error columnConfig will exist at runtime\n\t\t\tthis[KT_STORE].commit('updateColumns')\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const KtTableLegacyColumn: any = {\n\tname: 'KtTableLegacyColumn',\n\tinheritAttrs: false,\n\tprops: {\n\t\tindex: { required: false, type: Number },\n\t\tlabel: { required: false, type: String },\n\t\torder: { required: false, type: Number },\n\t\tprop: { required: true, type: String },\n\n\t\tcellClass: { required: false, type: [String, Array, Object] },\n\t\theaderCellClass: { required: false, type: [String, Array, Object] },\n\t\ttdClass: { required: false, type: [String, Array, Object] },\n\t\tthClass: { required: false, type: [String, Array, Object] },\n\n\t\talign: { default: KottiTableLegacy.Column.Align.LEFT, type: String },\n\t\tmaxWidth: { required: false, type: String },\n\t\tminWidth: { required: false, type: String },\n\t\twidth: { default: 'auto', type: String },\n\n\t\thidden: { default: false, type: Boolean },\n\n\t\tsortBy: { required: false, type: [String, Function, Array] },\n\t\tsortMethod: { default: null, type: Function },\n\t\tsortOrder: {\n\t\t\tdefault: KottiTableLegacy.Column.SortOrders.NONE,\n\t\t\ttype: [String, Number],\n\t\t},\n\t\tsortOrders: {\n\t\t\tdefault: (): KottiTableLegacy.Column.SortOrders[] =>\n\t\t\t\tObject.values(KottiTableLegacy.Column.SortOrders),\n\t\t\ttype: Array,\n\t\t},\n\t\t// whether this column is sortable, string means sortOrder is remote\n\t\tsortable: { default: undefined, type: [Boolean, String, undefined] },\n\n\t\tdefault: { required: false, type: String },\n\t\tdisableRowClick: { default: false, type: Boolean },\n\t\tformatter: { required: false, type: Function },\n\t\trenderCell: { required: false, type: Function },\n\t\trenderHeader: { required: false, type: Function },\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tisPropDefined: { default: false, type: Boolean },\n\t},\n\twatch: {\n\t\tlabel: updateColumnsfor('label'),\n\t\tindex: updateColumnsfor('index'),\n\t\ttdClass: updateColumnsfor('tdClass'),\n\t\tthClass: updateColumnsfor('thClass'),\n\t\theaderCellClass: updateColumnsfor('headerCellClass'),\n\t\tcellClass: updateColumnsfor('cellClass'),\n\t\tprop: updateColumnsfor('prop'),\n\t\thidden: updateColumnsfor('hidden'),\n\t\tsortable: updateColumnsfor('sortable'),\n\t\tsortOrder: updateColumnsfor('sortOrder'),\n\t\torder: updateColumnsfor('order'),\n\t\twidth: updateColumnsfor('width'),\n\t\tmaxWidth: updateColumnsfor('maxWidth'),\n\t\tminWidth: updateColumnsfor('minWidth'),\n\t\talign: updateColumnsfor('align'),\n\t\tdefault: updateColumnsfor('default'),\n\t},\n\tbeforeCreate(): void {\n\t\tthis.columnConfig = {}\n\t},\n\tcreated(): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tthis.columnConfig = createColumn(this)\n\t},\n\tmounted(): void {\n\t\tconst columnIndex = this[KT_TABLE as symbol].$children.indexOf(this)\n\t\tthis[KT_STORE as any].commit('insertColumn', {\n\t\t\tcolumn: this.columnConfig,\n\t\t\t...(columnIndex !== -1 ? { index: columnIndex } : {}),\n\t\t})\n\t},\n\tdestroyed(): void {\n\t\tif (!this.$parent) return\n\t\tif (this.columnConfig)\n\t\t\tthis[KT_STORE as any].commit('removeColumn', this.columnConfig)\n\t},\n\trender: (): null => null,\n\tinject: { KT_TABLE, KT_STORE },\n}\n\nfunction createColumn(column: any = {}) {\n\tconst _self = column\n\n\tlet columnId = column.id\n\tif (!columnId) {\n\t\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\t\tcolumnId = `${_self[KT_TABLE as symbol].tableId}_column_${columnIdSeed}`\n\t\tcolumnIdSeed++\n\t}\n\t// eslint-disable-next-line no-param-reassign\n\tcolumn = pick(column, [...Object.keys(KtTableLegacyColumn.props), '$attrs'])\n\n\tcolumn.sortOrder = column.sortOrder || KottiTableLegacy.Column.SortOrders.NONE\n\tcolumn.sortOrders =\n\t\tcolumn.sortOrders || Object.values(KottiTableLegacy.Column.SortOrders)\n\tcolumn.formatter = column.formatter || ((value: any) => value)\n\n\tcolumn.id = columnId\n\tcolumn.type = COLUMN_TYPE\n\t// needed for maintaining column state across re-renders as column get removed and re-inserted\n\tcolumn._deleted = false\n\n\tlet renderCell = column.renderCell\n\tlet renderHeader = column.renderHeader\n\n\tcolumn.renderCell = function render(h: CreateElement, data: any) {\n\t\tif (_self.$scopedSlots?.default) {\n\t\t\trenderCell = () => _self.$scopedSlots.default(data)\n\t\t}\n\n\t\tif (!renderCell) {\n\t\t\trenderCell = DEFAULT_RENDER_CELL\n\t\t}\n\t\treturn renderCell(h, data)\n\t}\n\n\tcolumn.renderHeader = function render(h: CreateElement, data: any) {\n\t\tif (_self.$scopedSlots?.header) {\n\t\t\trenderHeader = () => _self.$scopedSlots.header(data)\n\t\t}\n\n\t\tif (!renderHeader) {\n\t\t\trenderHeader = DEFAULT_RENDER_HEADER\n\t\t}\n\n\t\treturn renderHeader(h, data)\n\t}\n\n\treturn column\n}\n/* eslint-enable perfectionist/sort-objects */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { setColumnsArray } from './column'\nimport type { Store } from './types'\n\nfunction getFilteredColumnIndex(state: any, column: any) {\n\treturn state.filteredColumns.findIndex(\n\t\t({ prop }: any) => prop === column.prop,\n\t)\n}\n\nexport const defaultState: Store.StateComponents.Filter = {\n\tfilteredColumns: [],\n}\n\nexport const mutations: Store.MutationComponents.Filter = {\n\tsetFilteredColumns(store, columns = store.state.filteredColumns) {\n\t\tsetColumnsArray(store.state, 'filteredColumns', ['prop', 'hidden'], columns)\n\t\tstore.commit('updateColumns', { emitChange: false })\n\t},\n}\n\nexport const getters: Store.GetterComponents.Filter = {}\n\nexport function setFilteredColumn(state: any, column: any) {\n\tconst columnIndex = getFilteredColumnIndex(state, column)\n\tif (columnIndex !== -1) {\n\t\tstate.filteredColumns[columnIndex] = column\n\t} else {\n\t\tstate.filteredColumns.push(column)\n\t}\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { setColumnsArray } from './column'\nimport type { Store } from './types'\n\nfunction getHiddenColumnIndex(state: any, column: any) {\n\treturn state.hiddenColumns.findIndex(({ prop }: any) => prop === column.prop)\n}\n\nexport function getResolvedHiddenColumns(columns: any) {\n\treturn columns.filter(({ _deleted, hidden }: any) => !_deleted && !hidden)\n}\n\nfunction removeHiddenColumn(state: any, column: any) {\n\tconst columnIndex = getHiddenColumnIndex(state, column)\n\tif (columnIndex !== -1) {\n\t\tstate.hiddenColumns.splice(columnIndex, 1)\n\t}\n}\n\nexport function setHiddenColumn(state: any, column: any) {\n\tconst columnIndex = getHiddenColumnIndex(state, column)\n\tif (columnIndex !== -1) {\n\t\tstate.hiddenColumns[columnIndex] = column\n\t} else {\n\t\tstate.hiddenColumns.push(column)\n\t}\n}\n\nexport const defaultState: Store.StateComponents.Hide = {\n\thiddenColumns: [],\n}\n\nexport const mutations: Store.MutationComponents.Hide = {\n\thide(store, column, hide = !column.hidden) {\n\t\tconst { state } = store\n\t\tcolumn.hidden = hide\n\n\t\tif (column.hidden) {\n\t\t\tsetHiddenColumn(state, column)\n\t\t} else {\n\t\t\tremoveHiddenColumn(state, column)\n\t\t}\n\t\tstore.commit('updateColumns')\n\t\tstore.emit('hiddenChange', state.hiddenColumns)\n\t},\n\tsetHiddenColumns(store, columns = store.state.hiddenColumns) {\n\t\tsetColumnsArray(store.state, 'hiddenColumns', ['prop', 'hidden'], columns)\n\t\tstore.commit('updateColumns', { emitChange: false })\n\t},\n\tshowAll(store) {\n\t\tstore.state._columnsArray.forEach((column: any) => (column.hidden = false))\n\t\tstore.state.hiddenColumns = []\n\n\t\tstore.commit('updateColumns')\n\t\tstore.emit('hiddenChange', store.state.hiddenColumns)\n\t},\n}\n\nexport const getters: Store.GetterComponents.Hide = {}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pick from 'lodash/pick.js'\n\nimport { getColumnIndex, getColumnRealIndex, setColumnsArray } from './column'\nimport type { Store } from './types'\n\nfunction byOrder(a: any, b: any) {\n\treturn a.order < b.order\n\t\t? -1\n\t\t: a.order > b.order\n\t\t\t? 1\n\t\t\t: // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\t\ta.orderAdvantage + a.index - (b.orderAdvantage + b.index)\n}\n\nexport function getOrderedColumns(state: any) {\n\treturn state._columnsArray.map((col: any) => pick(col, ['prop', 'order']))\n}\n\nexport function resolveColumnsOrder({\n\t_columns = {},\n\t_columnsArray = [],\n}: any) {\n\tfor (const col of _columnsArray) {\n\t\tif (_columns[col.prop]) {\n\t\t\t// _columnsArray --> _columns (we assign _columnsArray to _columns then later do the opposite)\n\t\t\t_columns[col.prop].order = col.order\n\t\t}\n\t}\n\n\t// _columns --> _columnsArray\n\treturn Object.values(_columns)\n\t\t.filter(({ _deleted }: any) => !_deleted)\n\t\t.map((col: any, index) => {\n\t\t\treturn {\n\t\t\t\tcol,\n\t\t\t\tindex: typeof col.index === 'number' ? col.index : index,\n\t\t\t\torder: typeof col.order === 'number' ? col.order : col.index,\n\t\t\t\torderAdvantage: 'order' in col ? 1 : -1,\n\t\t\t}\n\t\t})\n\t\t.sort(byOrder)\n\t\t.map(({ col }, order) => {\n\t\t\t// re-allign column index with new order\n\t\t\tcol.order = order\n\t\t\tcol.index = order\n\t\t\treturn col\n\t\t})\n}\n\nexport const defaultState: Store.StateComponents.Order = {\n\torderedColumns: [],\n}\n\nexport const mutations: Store.MutationComponents.Order = {\n\torderBefore(store, fromColumn, toColumn) {\n\t\tconst { state } = store\n\t\tif (fromColumn.id === toColumn.id) return\n\t\tconst fromIndex = getColumnIndex(state, fromColumn.prop)\n\t\tstate._columnsArray.splice(fromIndex, 1)\n\n\t\tconst toIndex = getColumnRealIndex(state, toColumn)\n\t\tstate._columnsArray.splice(toIndex, 0, fromColumn)\n\n\t\tstate._columnsArray.forEach((col: any, index: number) => {\n\t\t\tcol.order = index\n\t\t\tcol.index = index\n\t\t})\n\t\tstore.emit('orderChange', getOrderedColumns(state))\n\t\tstore.commit('updateColumns')\n\t},\n\tsetOrderedColumns(store, columns) {\n\t\tsetColumnsArray(store.state, 'orderedColumns', ['prop', 'order'], columns)\n\t\tstore.commit('updateColumns', {\n\t\t\temitChange: false,\n\t\t\trefreshColumnArray: true,\n\t\t})\n\t},\n}\n\nexport const getters: Store.GetterComponents.Order = {}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-param-reassign */\n\nimport pick from 'lodash/pick.js'\nimport property from 'lodash/property.js'\n\nimport { IS_ASC, IS_DSC, PUBLIC_SORT_PROPS } from '../constants'\nimport { KottiTableLegacy } from '../types'\n\nimport { setColumnsArray } from './column'\nimport type { Store } from './types'\n\nfunction getSortedColumnIndex(state: any, column: any) {\n\treturn state.sortedColumns.findIndex(({ prop }: any) => prop === column.prop)\n}\n\nexport function setSortedColumn(state: any, column: any) {\n\tif (!state.sortMultiple) {\n\t\tstate.sortedColumns = [column]\n\t} else {\n\t\tconst columnIndex = getSortedColumnIndex(state, column)\n\t\tif (columnIndex !== -1) {\n\t\t\tstate.sortedColumns[columnIndex] = column\n\t\t} else {\n\t\t\tstate.sortedColumns = [...state.sortedColumns, column]\n\t\t}\n\t}\n}\n\nfunction getSortedColumn(state: any, column: any) {\n\treturn state.sortedColumns[getSortedColumnIndex(state, column)]\n}\n\nfunction getNextSortOrder(column: any) {\n\tconst length = column.sortOrders.length\n\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\tconst index = (column.sortOrders.indexOf(column.sortOrder) + 1) % length\n\treturn column.sortOrders[Math.max(index, 0)]\n}\n\nfunction getSortValue({ index, value }: any, by: any) {\n\treturn typeof by === 'string' ? property(by)(value) : by(value, index)\n}\n\nfunction compareArray(a: any, b: any, sortArray: any) {\n\tfor (const byProp of sortArray) {\n\t\tconst aVal = getSortValue(a, byProp)\n\t\tconst bVal = getSortValue(b, byProp)\n\t\tif (typeof aVal === 'string') {\n\t\t\treturn aVal.localeCompare(bVal)\n\t\t} else {\n\t\t\tif (aVal < bVal) {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\tif (aVal > bVal) {\n\t\t\t\treturn 1\n\t\t\t}\n\t\t}\n\t}\n\treturn 0\n}\n\nfunction compare(\n\torder: any,\n\ta: any,\n\tb: any,\n\t{ sortBy, sortMethod, sortOrder }: any,\n) {\n\t// eslint-disable-next-line sonarjs/no-parameter-reassignment\n\torder = sortMethod ? sortMethod(a.value, b.value) : compareArray(a, b, sortBy)\n\tif (!order) {\n\t\t// make stable https://en.wikipedia.org/wiki/sortOrder_algorithm#Stability\n\t\torder = a.index - b.index\n\t}\n\treturn order * sortOrder\n}\n\nfunction orderBy(array: any, sortedColumns: any) {\n\tconst columns = sortedColumns.map((column: any) => {\n\t\tconst { prop, sortMethod } = column\n\n\t\tlet { sortBy = prop, sortOrder } = column\n\n\t\tif (typeof sortOrder === 'string') {\n\t\t\tsortOrder =\n\t\t\t\tsortOrder === KottiTableLegacy.Column.SortOrders.DESCENDING ? -1 : 1\n\t\t} else {\n\t\t\tsortOrder = sortOrder && sortOrder < 0 ? -1 : 1\n\t\t}\n\t\tif (!Array.isArray(sortBy)) {\n\t\t\tsortBy = [sortBy]\n\t\t}\n\t\treturn {\n\t\t\tsortBy,\n\t\t\tsortMethod,\n\t\t\tsortOrder,\n\t\t}\n\t})\n\treturn array\n\t\t.map((value: any, index: number) => ({ index, value }))\n\t\t.sort((a: any, b: any) =>\n\t\t\tcolumns.reduce(\n\t\t\t\t(order: any, column: any) => order || compare(order, a, b, column),\n\t\t\t\t0,\n\t\t\t),\n\t\t)\n\t\t.map((item: any) => item.value)\n}\nexport function sortData(data: any, state: any) {\n\tconst sortedColumnNotYetSet = !state.sortedColumns\n\tconst isSortingThroughAPICall = state.remoteSort\n\tif (sortedColumnNotYetSet || isSortingThroughAPICall) {\n\t\treturn data\n\t}\n\treturn orderBy(data, state.sortedColumns)\n}\n\nexport const defaultState: Store.StateComponents.Sort = {\n\tremoteSort: false,\n\tsortable: false,\n\tsortedColumns: [],\n\tsortMultiple: false,\n}\n\nexport const mutations: Store.MutationComponents.Sort = {\n\tchangeSortConditions(store, options) {\n\t\tconst { state } = store\n\t\tstate.rows = sortData(state.filteredData || state._data || [], state)\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\tif (!options?.silent) {\n\t\t\tconst sortedColumns = state.sortedColumns.map((column: any) => {\n\t\t\t\treturn {\n\t\t\t\t\t...pick(column, PUBLIC_SORT_PROPS),\n\t\t\t\t\tsortBy: column.sortBy || column.prop,\n\t\t\t\t}\n\t\t\t})\n\t\t\tstore.emit('sortChange', {\n\t\t\t\tcolumn: options.column,\n\t\t\t\tprop: options.column.prop,\n\t\t\t\tsortBy: options.column.sortBy || options.column.prop,\n\t\t\t\tsortedColumns,\n\t\t\t\tsortOrder: options.column.sortOrder,\n\t\t\t})\n\t\t}\n\t},\n\tremoveSortedColumn(store, column) {\n\t\tconst { state } = store\n\t\tconst index = getSortedColumnIndex(state, column)\n\t\tconst isInsortOrder = index !== -1\n\t\tif (isInsortOrder) {\n\t\t\tstate.sortedColumns.splice(index, 1)\n\t\t}\n\t\tcolumn.sortOrder = KottiTableLegacy.Column.SortOrders.NONE\n\t\tstore.commit('changeSortConditions', { column })\n\t},\n\tsetSortedColumns(store, columns) {\n\t\tsetColumnsArray(store.state, 'sortedColumns', PUBLIC_SORT_PROPS, columns)\n\t\tstore.commit('updateColumns', { emitChange: false })\n\t},\n\tsort(store, options) {\n\t\tconst { column, order } = options\n\t\tsetSortedColumn(store.state, column)\n\t\tcolumn.sortOrder = order || getNextSortOrder(column)\n\t\tif (column.sortOrder === KottiTableLegacy.Column.SortOrders.NONE) {\n\t\t\tstore.commit('removeSortedColumn', column)\n\t\t} else {\n\t\t\tstore.commit('changeSortConditions', { column })\n\t\t}\n\t},\n}\n\nexport const getters: Store.GetterComponents.Sort = {\n\tcanSort(state: any, column: any) {\n\t\treturn column.sortable || (state.sortable && column.sortable !== false)\n\t},\n\thasSortOrder(state: any, column: any) {\n\t\tcolumn = getSortedColumn(state, column)\n\t\treturn column && column.sortOrder !== false\n\t},\n\tisSorted(state: any, column: any) {\n\t\tcolumn = getSortedColumn(state, column)\n\t\treturn (\n\t\t\tcolumn && column.sortOrder !== KottiTableLegacy.Column.SortOrders.NONE\n\t\t)\n\t},\n\tisSortedByAsc(state: any, column: any) {\n\t\tcolumn = getSortedColumn(state, column)\n\t\treturn column && IS_ASC.test(String(column.sortOrder))\n\t},\n\tisSortedByDsc(state: any, column: any) {\n\t\tcolumn = getSortedColumn(state, column)\n\t\treturn column && IS_DSC.test(String(column.sortOrder))\n\t},\n}\n/* eslint-enable no-param-reassign */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport pick from 'lodash/pick.js'\nimport pickBy from 'lodash/pickBy.js'\nimport Vue from 'vue'\n\nimport { PUBLIC_COLUMN_PROPS } from '../constants'\nimport { KottiTableLegacy } from '../types'\n\nimport { setFilteredColumn } from './filter'\nimport { getResolvedHiddenColumns, setHiddenColumn } from './hide'\nimport { getOrderedColumns, resolveColumnsOrder } from './order'\nimport { setSortedColumn } from './sort'\nimport type { Store } from './types'\n\nexport function getColumnRealIndex(\n\tstate: Store.State,\n\tcolumn: Store.StateComponents.ColumnRepresentation,\n) {\n\treturn state._columnsArray.findIndex(({ id }) => id == column.id)\n}\n\nexport function getColumnIndex(state: Store.State, columnProp: string): number {\n\tconst columnInStore = state._columns[columnProp]\n\n\tif (!columnInStore?.index)\n\t\tthrow new Error(\n\t\t\t`Could not find column ${columnProp} in KtTableLegacy Store`,\n\t\t)\n\n\treturn columnInStore.index\n}\n\nexport function setColumnsArray(\n\tstate: Store.State,\n\tprop: keyof Store.State,\n\tshapeKeys: (keyof Store.StateComponents.ColumnRepresentation)[],\n\tcolumns: Store.StateComponents.ColumnRepresentation[],\n) {\n\tstate[prop] = columns.map((column: any) => {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tcolumn = pick(column, shapeKeys)\n\t\tconst oldColumn = state._columns[column.prop] ?? {}\n\t\treturn Object.assign(oldColumn, column)\n\t})\n}\n\nfunction emitColumnsChange(store: any) {\n\tif (store.table.$ready)\n\t\tstore.emit(\n\t\t\t'columnsChange',\n\t\t\tstore.state._columnsArray.map((col: any) =>\n\t\t\t\tpick(col, PUBLIC_COLUMN_PROPS),\n\t\t\t),\n\t\t)\n}\n\nfunction didRestoreDestroyedColumns({\n\t_destroyedColumns,\n}: {\n\t_destroyedColumns: any\n}) {\n\tconst columns = Object.values(_destroyedColumns)\n\n\treturn (\n\t\t// eslint-disable-next-line unicorn/explicit-length-check\n\t\tcolumns.length &&\n\t\t// eslint-disable-next-line sonarjs/reduce-initial-value\n\t\tcolumns.reduce((sum, n) => (sum as number) + (n as number)) === 0\n\t)\n}\n\nexport const defaultState: Store.StateComponents.Column = {\n\t_columns: {},\n\t_columnsArray: [],\n\t_destroyedColumns: {},\n\tcolumns: [],\n\trefreshColumnArray: true,\n}\n\nexport const mutations: Store.MutationComponents.Column = {\n\tinsertColumn(store, { column, index }) {\n\t\tconst { state } = store\n\t\tconst deleted = state._destroyedColumns[column.prop]\n\n\t\tconst newColumn: Store.StateComponents.ColumnRepresentation = (() => {\n\t\t\tconst oldColumn = state._columns[column.prop]\n\n\t\t\tif (!oldColumn) {\n\t\t\t\treturn {\n\t\t\t\t\t...column,\n\t\t\t\t\tindex: index ?? Object.keys(state._columns).length,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (deleted) {\n\t\t\t\treturn {\n\t\t\t\t\t...oldColumn,\n\t\t\t\t\t_deleted: false,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// migrate from slot to props\n\t\t\tconst isNewColumnPropDefined = column.isPropDefined\n\t\t\tconst isOldColumnSlotDefined = !oldColumn.isPropDefined\n\n\t\t\treturn pickBy(\n\t\t\t\t{\n\t\t\t\t\t...oldColumn,\n\t\t\t\t\t...(isNewColumnPropDefined && isOldColumnSlotDefined\n\t\t\t\t\t\t? pick(column, PUBLIC_COLUMN_PROPS)\n\t\t\t\t\t\t: column),\n\t\t\t\t},\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\t\t\t(value) => value !== undefined,\n\t\t\t) as Store.StateComponents.ColumnRepresentation\n\t\t})()\n\t\tVue.set(state._columns, newColumn.prop, newColumn)\n\n\t\tif (newColumn.sortOrder !== KottiTableLegacy.Column.SortOrders.NONE) {\n\t\t\tsetSortedColumn(state, newColumn)\n\t\t}\n\t\tif (newColumn.hidden === true) {\n\t\t\tsetHiddenColumn(state, newColumn)\n\t\t}\n\t\t// @ts-expect-error filter is a dead feature, can be ignored\n\t\tif (newColumn.filter !== undefined) {\n\t\t\tsetFilteredColumn(state, newColumn)\n\t\t}\n\n\t\tif (deleted) {\n\t\t\tVue.set(state._destroyedColumns, column.prop, 0)\n\t\t}\n\t\tstore.commit('updateColumns', { emitChange: false })\n\t},\n\tremoveColumn(store, column) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tcolumn = store.state._columns[column.prop]\n\t\tif (column) {\n\t\t\tcolumn._deleted = true\n\t\t\tstore.state._destroyedColumns[column.prop] = 1\n\t\t\tstore.commit('updateColumns', { emitChange: false })\n\t\t}\n\t},\n\tsetColumns(store, columns = store.state._columnsArray) {\n\t\tfor (const columnsEntry of columns) {\n\t\t\tconst pickedColumn = pick(columnsEntry, PUBLIC_COLUMN_PROPS)\n\t\t\tconst column = store.state._columns[pickedColumn.prop]\n\t\t\tif (column) {\n\t\t\t\tObject.assign(column, pickedColumn)\n\t\t\t}\n\t\t}\n\t\tstore.commit('updateColumns', {\n\t\t\temitChange: false,\n\t\t\trefreshColumnArray: true,\n\t\t})\n\t},\n\tupdateColumns(\n\t\tstore,\n\t\t{\n\t\t\temitChange = true,\n\t\t\trefreshColumnArray = store.state.refreshColumnArray,\n\t\t} = {},\n\t): void {\n\t\tconst { state, table } = store\n\t\tif (table.$ready) {\n\t\t\tif (refreshColumnArray || didRestoreDestroyedColumns(state)) {\n\t\t\t\tstate._columnsArray = resolveColumnsOrder(state)\n\t\t\t\tstate.orderedColumns = getOrderedColumns(state)\n\t\t\t\tstate._destroyedColumns = {}\n\t\t\t\tstate.refreshColumnArray = false\n\t\t\t}\n\t\t\tstate.columns = getResolvedHiddenColumns(state._columnsArray)\n\t\t\tif (emitChange) emitColumnsChange(store)\n\t\t}\n\t},\n}\n\nexport const getters: Store.GetterComponents.Column = {}\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport negate from 'lodash/negate.js'\n\nimport type { Store } from './types'\n\nexport const defaultState: Store.StateComponents.Disable = {\n\tenabledRows: [],\n\tisAllRowsDisabled: false,\n}\n\nfunction getDisabledRows(rows: any, disableRow: any) {\n\treturn rows.filter((row: any, rowIndex: number) => {\n\t\treturn disableRow ? disableRow({ row, rowIndex }) : false\n\t})\n}\n\nfunction getEnabledRows(rows: any, disableRow: any) {\n\treturn getDisabledRows(rows, negate(disableRow))\n}\n\nexport const mutations: Store.MutationComponents.Disable = {\n\tupdateDisabledRows({ state, table }): void {\n\t\tstate.enabledRows = getEnabledRows(state.rows, table.disableRow)\n\t\tstate.isAllRowsDisabled = state.enabledRows.length === 0\n\t},\n}\n\nexport const getters: Store.GetterComponents.Disable = {\n\tisAllRowsDisabled(state) {\n\t\treturn (\n\t\t\tstate.rows.length ===\n\t\t\tgetDisabledRows(state.rows, (this as any).table.disableRow).length\n\t\t)\n\t},\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport isEqual from 'lodash/isEqual.js'\n\nimport type { Store } from './types'\n\nexport const defaultState: Store.StateComponents.Expand = {\n\texpanded: [],\n\texpandMultiple: false,\n}\n\nfunction toggleRowExpansion(state: any, row: any) {\n\tconst expanded = state.expanded\n\tconst index = expanded.findIndex((elem: any) => isEqual(elem, row))\n\tconst shouldExpand = index === -1 //if the row is not already included in state.expanded\n\n\tif (state.expandMultiple) {\n\t\tif (shouldExpand) expanded.push(row)\n\t\telse expanded.splice(index, 1)\n\t} else {\n\t\t//explicitly need state.expanded b/c Object reference will to be changed w/ assignments\n\t\tstate.expanded = shouldExpand ? [row] : []\n\t}\n\treturn shouldExpand\n}\n\nexport const mutations: Store.MutationComponents.Expand = {\n\texpandRow(store, row) {\n\t\tconst { state } = store\n\t\tconst isExpanded = toggleRowExpansion(state, row)\n\t\tstore.emit('expandChange', [...state.expanded])\n\t\tstore.emit('expand', row, isExpanded)\n\t},\n}\n\nexport const getters: Store.GetterComponents.Expand = {\n\tisExpanded(state, row) {\n\t\treturn state.expanded.some((e: any) => isEqual(e, row))\n\t},\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport debounce from 'lodash/debounce.js'\nimport isEqual from 'lodash/isEqual.js'\n\nimport type { Store } from './types'\n\nfunction toggleRowSelection(state: any, row: any, selected: any) {\n\tlet changed = false\n\tconst selection = state.selection\n\tconst index = selection.findIndex((selectedRow: any) =>\n\t\tisEqual(selectedRow, row),\n\t)\n\tif (typeof selected === 'undefined') {\n\t\tif (index === -1) {\n\t\t\tselection.push(row)\n\t\t\tchanged = true\n\t\t} else {\n\t\t\tselection.splice(index, 1)\n\t\t\tchanged = true\n\t\t}\n\t} else if (selected && index === -1) {\n\t\tselection.push(row)\n\t\tchanged = true\n\t} else if (!selected && index !== -1) {\n\t\tselection.splice(index, 1)\n\t\tchanged = true\n\t}\n\n\treturn changed\n}\n\nexport function updateAllSelected(state: any) {\n\tconst { rows, selection } = state\n\tif (!rows || rows.length === 0 || !selection || selection.length === 0) {\n\t\tstate.isAllSelected = false\n\t\treturn\n\t}\n\n\tstate.isAllSelected = selection.length === rows.length\n}\n\nexport function cleanSelection(store: any) {\n\tconst { rowKey, state } = store\n\tconst initialSelectionLength = state.selection.length\n\tif (rowKey) {\n\t\tconst rowsSet = new Set(state.rows.map((r: any) => r[rowKey]))\n\t\tstate.selection = state.selection.filter((s: any) => rowsSet.has(s[rowKey]))\n\t} else {\n\t\tstate.selection = state.selection.filter((s: any) =>\n\t\t\tstate.rows.some((r: any) => isEqual(r, s)),\n\t\t)\n\t}\n\n\tif (initialSelectionLength !== state.selection.length) {\n\t\tstore.emit('selectionChange', [...state.selection])\n\t}\n}\n\nexport function clearSelection(store: any) {\n\tconst state = store.state\n\tstate.isAllSelected = false\n\tif (state.selection.length > 0) {\n\t\tstate.selection = []\n\t\tstore.emit('selectionChange', [])\n\t}\n}\n\nexport const defaultState: Store.StateComponents.Select = {\n\tisAllSelected: false,\n\treserveSelection: false,\n\tselection: [],\n}\n\nexport const mutations: Store.MutationComponents.Select = {\n\tselectRow(store, row, selected) {\n\t\tconst { state } = store\n\t\tconst changed = toggleRowSelection(state, row, selected)\n\t\tconst { selection } = state\n\t\tif (changed) {\n\t\t\tstore.emit('selectionChange', [...selection])\n\t\t\tstore.emit('select', selection, row)\n\t\t}\n\t\tupdateAllSelected(state)\n\t},\n\tsetSelected({ state }, selection) {\n\t\tstate.selection = selection\n\t\tupdateAllSelected(state)\n\t},\n\ttoggleAllSelection: debounce((store) => {\n\t\tconst { state } = store\n\t\t// refresh disabled rows status in case of external influence\n\t\tstore.commit('updateDisabledRows')\n\t\tconst { enabledRows, isAllRowsDisabled, rows = [] } = state\n\t\tif (rows.length === 0 || isAllRowsDisabled) {\n\t\t\t// FIXME: Maybe we should not commit anything here and only return\n\t\t\tstore.commit('setSelected', [])\n\t\t\treturn\n\t\t}\n\n\t\t// eslint-disable-next-line unicorn/consistent-destructuring\n\t\tconst shouldSelectAll = !state.isAllSelected\n\n\t\tstore.commit('setSelected', shouldSelectAll ? [...enabledRows] : [])\n\n\t\tconst selection = [...state.selection]\n\t\tstore.emit('selectionChange', selection)\n\t\tstore.emit('selectAll', selection)\n\t}),\n}\n\nexport const getters: Store.GetterComponents.Select = {\n\tgetRowByVisibleIndex(state, index) {\n\t\treturn state.rows[index]\n\t},\n\tgetRowKey(state, row) {\n\t\treturn typeof state.rowKey === 'function'\n\t\t\t? state.rowKey(row)\n\t\t\t: // @ts-expect-error rowKey may be undefined; in that case this getter returns `undefined`\n\t\t\t\trow[state.rowKey]\n\t},\n\tisSelected(state, row) {\n\t\treturn state.selection.some((e: any) => isEqual(e, row))\n\t},\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","import { cleanSelection, clearSelection, updateAllSelected } from './select'\nimport { sortData } from './sort'\nimport type { Store } from './types'\n\nexport const defaultState: Store.StateComponents.Row = {\n\t_data: [],\n\tfilteredData: null,\n\tfocusedRow: null,\n\trows: null,\n}\n\nexport const mutations: Store.MutationComponents.Row = {\n\tblurRow({ state }) {\n\t\tstate.focusedRow = null\n\t},\n\tfocusRow({ state }, row) {\n\t\tstate.focusedRow = row\n\t},\n\tsetRows(store, data) {\n\t\tconst { state } = store\n\t\tconst { _data } = state\n\t\tconst dataInstanceChanged = _data !== data\n\t\tstate._data = data\n\n\t\tstate.filteredData = data\n\t\tstate.rows = sortData(data || [], state)\n\n\t\tif (dataInstanceChanged) {\n\t\t\tclearSelection(store)\n\t\t} else {\n\t\t\tcleanSelection(store)\n\t\t}\n\t\tupdateAllSelected(state)\n\t},\n}\n\nexport const getters: Store.GetterComponents.Row = {\n\tisFocusedRow(state, row) {\n\t\treturn state.focusedRow === row\n\t},\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport isUndefined from 'lodash/isUndefined.js'\nimport negate from 'lodash/negate.js'\nimport pickBy from 'lodash/pickBy.js'\n\nimport * as column from './column'\nimport * as disable from './disable'\nimport * as expand from './expand'\nimport * as filter from './filter'\nimport * as hide from './hide'\nimport * as order from './order'\nimport * as rows from './row'\nimport * as select from './select'\nimport * as sort from './sort'\nimport type { Store } from './types'\n\nexport class TableStore {\n\tgetters: Store.Getters\n\tid: string | undefined\n\tmutations: Store.Mutations\n\tstate: Store.State\n\ttable: any\n\n\tconstructor(table: any, initialState: Partial<Store.State> = {}) {\n\t\tthis.setTable(table)\n\t\t// we deep clone initial state in order to not refer to the same objects\n\t\tthis.state = cloneDeep({\n\t\t\t...column.defaultState,\n\t\t\t...disable.defaultState,\n\t\t\t...expand.defaultState,\n\t\t\t...filter.defaultState,\n\t\t\t...hide.defaultState,\n\t\t\t...order.defaultState,\n\t\t\t...rows.defaultState,\n\t\t\t...select.defaultState,\n\t\t\t...sort.defaultState,\n\t\t})\n\t\tthis.setInitialState(initialState)\n\n\t\tthis.mutations = {\n\t\t\t...column.mutations,\n\t\t\t...disable.mutations,\n\t\t\t...expand.mutations,\n\t\t\t...filter.mutations,\n\t\t\t...hide.mutations,\n\t\t\t...order.mutations,\n\t\t\t...rows.mutations,\n\t\t\t...select.mutations,\n\t\t\t...sort.mutations,\n\t\t}\n\n\t\tthis.getters = {\n\t\t\t...column.getters,\n\t\t\t...rows.getters,\n\t\t\t...expand.getters,\n\t\t\t...order.getters,\n\t\t\t...disable.getters,\n\t\t\t...select.getters,\n\t\t\t...hide.getters,\n\t\t\t...sort.getters,\n\t\t\t...filter.getters,\n\t\t}\n\t}\n\tcommit<T extends keyof Store.Mutations>(\n\t\tname: T,\n\t\t...args: Store.MutationParameters<T>\n\t) {\n\t\tconst mutations = this.mutations\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\tif (mutations[name]) {\n\t\t\t// FIXME: Can be fixed by e.g. refactoring mutations to take at most one argument\n\t\t\t// @ts-expect-error not easy to represent variadic arguments\n\t\t\tmutations[name].call(this, this, ...args)\n\t\t\treturn\n\t\t} else {\n\t\t\tthrow new Error(`Mutation not found: ${name}`)\n\t\t}\n\t}\n\temit<T extends keyof Store.Emits>(event: T, ...args: Store.Emits[T]) {\n\t\tthis.table.$emit(event, ...args)\n\t}\n\n\tget<T extends keyof Store.Getters>(\n\t\tname: T,\n\t\t...args: Store.GetterParameters<T>\n\t): ReturnType<Store.Getters[T]> {\n\t\tconst getters = this.getters\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\tif (getters[name]) {\n\t\t\t// FIXME: Can be fixed by e.g. refactoring getters to take at most one argument\n\t\t\t// @ts-expect-error not easy to represent variadic arguments\n\t\t\treturn getters[name].call(this, this.state, ...args)\n\t\t} else {\n\t\t\tthrow new Error(`Getter not found: ${name}`)\n\t\t}\n\t}\n\n\tsetInitialState(initialState: Partial<Store.State>) {\n\t\tthis.state = cloneDeep({\n\t\t\t...this.state,\n\t\t\t...pickBy(initialState, negate(isUndefined)),\n\t\t})\n\t}\n\n\tsetTable(table: any) {\n\t\tthis.table = table\n\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\tthis.id = table.tableId + '_store'\n\t}\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n","<template>\n\t<div :class=\"{ 'x-scroll': isScrollable }\">\n\t\t<div class=\"hidden-columns\">\n\t\t\t<!-- NOTE: The order is very important here as columns that are inserted-->\n\t\t\t<!-- last take precedence over columns that are inserted before them. -->\n\t\t\t<slot />\n\t\t\t<!-- NOTE: As the column prop should be the source of truth in case of conflict -->\n\t\t\t<!-- the prop columns need to be added after the columns from the slot. -->\n\t\t\t<!-- @vue-expect-error -->\n\t\t\t<KtTableLegacyColumn\n\t\t\t\tv-for=\"(column, index) in formattedColumns\"\n\t\t\t\t:key=\"`${column.prop}_${index}`\"\n\t\t\t\tv-bind=\"column\"\n\t\t\t\tisPropDefined\n\t\t\t/>\n\t\t</div>\n\t\t<table class=\"kt-table-legacy\">\n\t\t\t<TableHeader />\n\t\t\t<TableBody />\n\t\t</table>\n\t</div>\n</template>\n\n<script lang=\"ts\">\n/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport isEqual from 'lodash/isEqual.js'\nimport pick from 'lodash/pick.js'\nimport type { CreateElement, PropType } from 'vue'\n\nimport { TableBody } from './components/TableBody'\nimport TableHeader from './components/TableHeader.vue'\nimport {\n\tDEFAULT_DISABLE_ROW,\n\tKT_STORE,\n\tKT_TABLE,\n\tKT_TABLE_STATE_PROVIDER,\n} from './constants'\nimport { KtTableLegacyColumn } from './KtTableLegacyColumn'\nimport { TableStore } from './logic/store'\nimport type { KottiTableLegacy } from './types'\n\nlet tableIdSeed = 1\n\nexport const INITIAL_TABLE_STORE_PROPS = [\n\t'expandMultiple',\n\t'filteredColumns',\n\t'hiddenColumns',\n\t'remoteSort',\n\t'rowKey',\n\t'sortable',\n\t'sortedColumns',\n\t'sortMultiple',\n] as const\n\nexport default {\n\tname: 'KtTableLegacy',\n\tcomponents: {\n\t\tKtTableLegacyColumn,\n\t\tTableBody,\n\t\tTableHeader,\n\t},\n\tinject: {\n\t\t[KT_TABLE_STATE_PROVIDER]: {\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\t[KT_TABLE as symbol]: this,\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t[KT_STORE]: this.store,\n\t\t}\n\t},\n\tprops: {\n\t\tcolumns: { default: null, type: Array },\n\t\temptyText: { default: 'No Data', type: String },\n\t\tid: { default: null, type: String },\n\t\t// FIXME: Props should either be required or have a default\n\t\trowKey: {\n\t\t\trequired: false,\n\t\t\ttype: [String, Function] as PropType<KottiTableLegacy.RowKey>,\n\t\t},\n\t\trows: { default: () => [], type: Array },\n\t\tuseColumnDragToOrder: { default: false, type: Boolean },\n\n\t\tisInteractive: { default: false, type: Boolean },\n\t\tisScrollable: { default: false, type: Boolean },\n\t\tisSelectable: { default: false, type: Boolean },\n\n\t\tremoteSort: { default: false, type: Boolean },\n\t\tsortMultiple: { default: false, type: Boolean },\n\t\tsortable: { default: false, type: [Boolean, String] },\n\t\tuseQuickSortControl: { default: false, type: Boolean },\n\n\t\tfilteredColumns: { default: () => [], type: Array },\n\t\thiddenColumns: { default: () => [], type: Array },\n\t\torderedColumns: { default: () => [], type: Array },\n\t\tsortedColumns: { default: () => [], type: Array },\n\n\t\tloading: { default: false, type: Boolean },\n\n\t\t// FIXME: Props should either be required or have a default\n\t\theaderClass: { required: false, type: [String, Array, Object] },\n\t\t// FIXME: Props should either be required or have a default\n\t\ttdClasses: { required: false, type: [String, Array, Object] },\n\t\t// FIXME: Props should either be required or have a default\n\t\tthClasses: { required: false, type: [String, Array, Object] },\n\t\t// FIXME: Props should either be required or have a default\n\t\ttrClasses: { required: false, type: [String, Array, Object] },\n\n\t\t// FIXME: Props should either be required or have a default\n\t\trenderActions: { required: false, type: Function },\n\t\t// FIXME: Props should either be required or have a default\n\t\trenderEmpty: { required: false, type: Function },\n\t\t// FIXME: Props should either be required or have a default\n\t\trenderExpand: { required: false, type: Function },\n\t\t// FIXME: Props should either be required or have a default\n\t\trenderLoading: { required: false, type: Function },\n\n\t\tdisableRow: { default: DEFAULT_DISABLE_ROW, type: Function },\n\n\t\texpandMultiple: { default: false, type: Boolean },\n\t\tselected: { default: () => [], type: Array },\n\t},\n\temits: [\n\t\t'activateRow',\n\t\t'cellClick', // FIXME: Seems unused\n\t\t'columnsChange',\n\t\t'expand', // FIXME: Seems unused\n\t\t'expandChange', // FIXME: Seems unused\n\t\t'hiddenChange', // FIXME: Seems unused\n\t\t'orderChange', // FIXME: Seems unused\n\t\t'rowBlur', // FIXME: Seems unused\n\t\t'rowClick',\n\t\t'rowFocus', // FIXME: Seems unused\n\t\t'select', // FIXME: Seems unused\n\t\t'selectAll', // FIXME: Seems unused\n\t\t'selectionChange',\n\t\t'sortChange',\n\t],\n\tdata() {\n\t\tlet localStore\n\t\tconst initialState = pick(this, INITIAL_TABLE_STORE_PROPS)\n\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\tif (this[KT_TABLE_STATE_PROVIDER]) {\n\t\t\tif (this.id) {\n\t\t\t\tlocalStore = new TableStore(this, initialState)\n\t\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\tthis[KT_TABLE_STATE_PROVIDER].addStore(this.id, localStore)\n\t\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\tthis[KT_TABLE_STATE_PROVIDER].selectedTableId(this.id)\n\t\t\t} else {\n\t\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\tlocalStore = this[KT_TABLE_STATE_PROVIDER].store\n\t\t\t\tlocalStore.setTable(this)\n\t\t\t\tlocalStore.setInitialState(initialState)\n\t\t\t}\n\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\tthis[KT_TABLE_STATE_PROVIDER].addTable(this)\n\t\t} else {\n\t\t\tlocalStore = new TableStore(this, initialState)\n\t\t}\n\n\t\treturn {\n\t\t\tlocalStore,\n\t\t}\n\t},\n\tcomputed: {\n\t\tstore() {\n\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\treturn this[KT_TABLE_STATE_PROVIDER]\n\t\t\t\t? // @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\t\tthis[KT_TABLE_STATE_PROVIDER].store\n\t\t\t\t: // @ts-expect-error localStore will exist at runtime\n\t\t\t\t\tthis.localStore\n\t\t},\n\t\tformattedColumns(): unknown[] {\n\t\t\treturn this.columns\n\t\t\t\t? this.columns.map((column: any) => {\n\t\t\t\t\t\tif (column.key) {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`column ${String(column.prop)} table column property 'key' is deprecated using prop is sufficient to identify the column`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn { ...column, prop: column.prop || column.key }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn column\n\t\t\t\t\t})\n\t\t\t\t: []\n\t\t},\n\t\tcolSpan() {\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\tlet colSpan = this.store.state.columns.length\n\n\t\t\t// @ts-expect-error isExpandable will exist at runtime\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\t\t\tif (this.isExpandable) colSpan++\n\t\t\tif (this.isSelectable) colSpan++\n\n\t\t\treturn colSpan\n\t\t},\n\t\tisExpandable() {\n\t\t\treturn Boolean(this.$scopedSlots.expand || this.renderExpand)\n\t\t},\n\t\thasActions() {\n\t\t\treturn Boolean(this.$scopedSlots.actions || this.renderActions)\n\t\t},\n\t\t_renderExpand() {\n\t\t\treturn (\n\t\t\t\th: CreateElement,\n\t\t\t\trowData: {\n\t\t\t\t\tdata: KottiTableLegacy.Row.Props\n\t\t\t\t\trow: KottiTableLegacy.Row.Props\n\t\t\t\t\trowIndex: number\n\t\t\t\t},\n\t\t\t) => {\n\t\t\t\tif (this.renderExpand) return this.renderExpand(h, rowData)\n\n\t\t\t\t// @ts-expect-error $slots will exist at runtime\n\n\t\t\t\treturn this.$scopedSlots.expand(rowData)\n\t\t\t}\n\t\t},\n\t\t_renderActions() {\n\t\t\treturn (h: CreateElement, rowData: any) => {\n\t\t\t\tif (this.renderActions) return this.renderActions(h, rowData)\n\n\t\t\t\t// @ts-expect-error $slots will exist at runtime\n\n\t\t\t\treturn this.$scopedSlots.actions(rowData)\n\t\t\t}\n\t\t},\n\t\t_renderLoading() {\n\t\t\treturn (h: CreateElement) => {\n\t\t\t\tif (this.renderLoading) return this.renderLoading(h)\n\n\t\t\t\treturn this.$slots.loading || h('div', { class: 'loading lg' })\n\t\t\t}\n\t\t},\n\t\t_renderEmpty() {\n\t\t\treturn (h: CreateElement) => {\n\t\t\t\tif (this.renderEmpty) return this.renderEmpty(h)\n\n\t\t\t\treturn (\n\t\t\t\t\tthis.$slots.empty ||\n\t\t\t\t\tthis.emptyText ||\n\t\t\t\t\t// FIXME: $t is not supposed to be used in kotti, probably a hack\n\t\t\t\t\t// @ts-expect-error $t will exist at runtime (?)\n\t\t\t\t\tthis.$t?.('table.emptyText') ||\n\t\t\t\t\t'No Data'\n\t\t\t\t)\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tid(newId, id) {\n\t\t\t// @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\tthis[KT_TABLE_STATE_PROVIDER].updateStoreId(id, newId)\n\t\t},\n\t\trows: {\n\t\t\timmediate: true,\n\t\t\thandler(value) {\n\t\t\t\t// @ts-expect-error localStore will exist at runtime\n\t\t\t\tthis.localStore.commit('setRows', value)\n\t\t\t},\n\t\t},\n\t\tselected: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (!isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error localStore will exist at runtime\n\t\t\t\t\tthis.localStore.commit('setSelected', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcolumns: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (value && !isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\t\tthis.store.commit('setColumns', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tsortedColumns: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (value && !isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\t\tthis.store.commit('setSortedColumns', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\thiddenColumns: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (value && !isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\t\tthis.store.commit('setHiddenColumns', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tfilteredColumns: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (value && !isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\t\tthis.store.commit('setFilteredColumns', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\torderedColumns: {\n\t\t\timmediate: true,\n\t\t\thandler(value, oldValue) {\n\t\t\t\tif (value && !isEqual(value, oldValue)) {\n\t\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\t\tthis.store.commit('setOrderedColumns', value)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tdisableRow: {\n\t\t\thandler() {\n\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\tthis.store.commit('updateDisabledRows')\n\t\t\t},\n\t\t},\n\t},\n\tbeforeCreate() {\n\t\t// @ts-expect-error tableId will exist at runtime\n\t\tthis.tableId = `kt-table-legacy_${String(tableIdSeed)}`\n\t\ttableIdSeed += 1\n\t},\n\tmounted() {\n\t\t// @ts-expect-error $ready will exist at runtime\n\t\tthis.$ready = true\n\t\t// @ts-expect-error store will exist at runtime\n\t\tthis.store.commit('updateColumns', { emitChange: false })\n\t},\n\tmethods: {\n\t\tisSelected(index: unknown): unknown {\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\treturn this.store.isSelected(\n\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\tthis.store.get('getRowByVisibleIndex', index),\n\t\t\t)\n\t\t},\n\t\ttoggleExpand(index: unknown): void {\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\tthis.store.commit(\n\t\t\t\t'expandRow',\n\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\tthis.store.get('getRowByVisibleIndex', index),\n\t\t\t)\n\t\t},\n\t\ttoggleSelect(index: unknown): void {\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\tthis.store.commit(\n\t\t\t\t'selectRow',\n\t\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\t\tthis.store.get('getRowByVisibleIndex', index),\n\t\t\t)\n\t\t},\n\t\ttoggleSelectAll(): void {\n\t\t\t// @ts-expect-error store will exist at runtime\n\t\t\tthis.store.commit('toggleAllSelection')\n\t\t},\n\t},\n}\n/* eslint-enable perfectionist/sort-objects */\n/* eslint-enable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/form-checkbox.scss';\n@import '../kotti-style/_variables.scss';\n\ntable.kt-table-legacy {\n\tposition: relative;\n\twidth: 100%;\n\thyphens: auto;\n\ttable-layout: auto;\n\tborder-collapse: collapse;\n}\n\n:deep(table.kt-table-legacy tr) {\n\tposition: relative;\n\tmargin: 0;\n\n\t&:hover .table-actions {\n\t\tdisplay: inline-flex;\n\t\tjustify-content: center;\n\t\tbackground: var(--white);\n\t}\n\n\t&.disabled {\n\t\tcursor: not-allowed;\n\t\tbackground-color: var(--ui-01);\n\t\topacity: 0.6;\n\t}\n\n\t&.selected,\n\t&:focus {\n\t\tbackground: var(--ui-01);\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n}\n\n:deep(table.kt-table-legacy td) {\n\tposition: relative;\n\tpadding: var(--unit-2) var(--unit-1);\n\tline-height: 1.2rem;\n\tborder-bottom: 1px solid $lightgray-400;\n\n\t&.empty {\n\t\tcolor: $lightgray-500;\n\t\ttext-align: center;\n\t}\n}\n\n:deep(table.kt-table-legacy) {\n\t.expand-toggle,\n\t.kt-table-legacy__quick-sort-control {\n\t\ti {\n\t\t\tmargin: 0 0.2rem;\n\t\t\tfont-size: 1rem !important;\n\t\t\tcolor: $darkgray-300;\n\n\t\t\t&.disabled {\n\t\t\t\tcolor: $lightgray-500;\n\t\t\t}\n\t\t}\n\t}\n}\n\n:deep(table.kt-table-legacy .table-actions) {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0.8rem;\n\tz-index: $zindex-4;\n\tdisplay: none;\n\tfloat: right;\n\twidth: auto;\n\tpadding: 0.25rem;\n\tmargin-top: -0.8rem;\n\tfont-size: 0.8rem;\n\tline-height: 0.8rem;\n\tborder: 0;\n\tborder-radius: var(--border-radius);\n\tbox-shadow: 0 0 1px #999;\n\n\t> div {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t}\n\n\ti {\n\t\tmargin: 0 var(--unit-1);\n\t\tfont-size: 1rem;\n\t\tcolor: $lightgray-500;\n\n\t\t&:hover {\n\t\t\tcolor: $darkgray-500;\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n}\n\n:deep(table.kt-table-legacy .form-group) {\n\twidth: 32px;\n\tline-height: 0;\n\n\t.form-icon {\n\t\ttop: 0.2rem;\n\t}\n}\n\n:deep(.kt-table-legacy .kt-table-legacy__no-row) {\n\tcolor: $lightgray-500;\n\ttext-align: center;\n}\n\n:deep(.kt-table-legacy .kt-table-legacy__loader) {\n\ttext-align: center;\n}\n\n:deep(.kt-table-legacy .loading) {\n\tmargin: 1.6rem 0;\n\ttext-align: center;\n}\n\n.x-scroll {\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\toverflow-x: auto;\n\twhite-space: nowrap;\n}\n\n.hidden-columns {\n\tdisplay: none;\n}\n</style>\n","/* eslint-disable perfectionist/sort-objects */\nimport { KT_STORE, KT_TABLE, KT_TABLE_STATE_PROVIDER } from './constants'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TableColumnsStateMixin = {\n\tinject: {\n\t\t[KT_TABLE as symbol]: { default: false },\n\t\t[KT_STORE as symbol]: { default: false },\n\t\t[KT_TABLE_STATE_PROVIDER]: {\n\t\t\tdefault: {\n\t\t\t\tget store(): void {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'tried to capture table state without KtTableLegacy or KtTableLegacyProvider',\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\n\tdata(): unknown {\n\t\treturn {\n\t\t\tKtSelectedTableId: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableStore(): unknown {\n\t\t\t// @ts-expect-error `this[KT_TABLE]` seems to emulate a provide/inject pattern of sorts\n\t\t\treturn this[KT_TABLE]\n\t\t\t\t? // @ts-expect-error `this[KT_STORE]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\t\tthis[KT_STORE]\n\t\t\t\t: // @ts-expect-error `this[KT_TABLE_STATE_PROVIDER]` seems to emulate a provide/inject pattern of sorts\n\t\t\t\t\tthis[KT_TABLE_STATE_PROVIDER].getStore(this.KtSelectedTableId)\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableColumns(): unknown {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\treturn this.KtTableStore.state._columnsArray\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableHiddenColumns(): unknown {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\treturn this.KtTableStore.state.hiddenColumns\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableSortedColumns(): unknown {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\treturn this.KtTableStore.state.sortedColumns\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableFilteredColumns(): unknown {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\treturn this.KtTableStore.state.filteredColumns\n\t\t},\n\t},\n\tmethods: {\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableHideColumn(column: unknown, toggle = true): void {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\tthis.KtTableStore.commit('hide', column, toggle)\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableShowAllColumns(): void {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\tthis.KtTableStore.commit('showAll')\n\t\t},\n\t\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\t\tKtTableOrderBeforeColumn(fromColumn: unknown, toColumn: unknown): void {\n\t\t\t// @ts-expect-error this will be resolved correctly by vue at runtime\n\t\t\tthis.KtTableStore.commit('orderBefore', fromColumn, toColumn)\n\t\t},\n\t},\n}\n/* eslint-enable perfectionist/sort-objects */\n","/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { TableColumnsStateMixin } from './mixins'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst KtTableLegacyConsumer: any = {\n\tname: 'KtTableLegacyConsumer',\n\tmixins: [TableColumnsStateMixin],\n\tprops: {\n\t\tid: { default: null, type: String },\n\t},\n\twatch: {\n\t\tid(id: any) {\n\t\t\t// @ts-expect-error KtSelectedTableId will exist at runtime\n\t\t\tthis.KtSelectedTableId = id\n\t\t},\n\t},\n\tcreated(): void {\n\t\tthis.KtSelectedTableId = this.id\n\t},\n\trender(): any {\n\t\tconst {\n\t\t\tKtTableStore: store,\n\t\t\tKtTableColumns: columns,\n\t\t\tKtTableHiddenColumns: hiddenColumns,\n\t\t\tKtTableSortedColumns: sortedColumns,\n\t\t\tKtTableFilteredColumns: filteredColumns,\n\t\t\tKtTableHideColumn: hideColumn,\n\t\t\tKtTableShowAllColumns: showAllColumns,\n\t\t\tKtTableOrderBeforeColumn: orderBeforeColumn,\n\t\t} = this\n\n\t\t// eslint-disable-next-line unicorn/consistent-destructuring\n\t\treturn this.$scopedSlots.default({\n\t\t\tstore,\n\t\t\tcolumns,\n\t\t\thiddenColumns,\n\t\t\tsortedColumns,\n\t\t\tfilteredColumns,\n\t\t\thideColumn,\n\t\t\tshowAllColumns,\n\t\t\torderBeforeColumn,\n\t\t})\n\t},\n}\n\nexport { KtTableLegacyConsumer }\n/* eslint-enable perfectionist/sort-objects */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pick from 'lodash/pick.js'\nimport type { CreateElement } from 'vue'\n\nimport { KT_TABLE_STATE_PROVIDER } from './constants'\nimport KtTableLegacy, { INITIAL_TABLE_STORE_PROPS } from './KtTableLegacy.vue'\nimport { TableStore } from './logic/store'\n\nlet tableProviderIdSeed = 1\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const KtTableLegacyProvider: any = {\n\tname: 'KtTableLegacyProvider',\n\tcomponents: {},\n\tprops: { ...KtTableLegacy.props, rows: Array },\n\tdata(): any {\n\t\tconst defaultStore = new TableStore(\n\t\t\tthis,\n\t\t\tpick(this, INITIAL_TABLE_STORE_PROPS),\n\t\t)\n\t\treturn {\n\t\t\tdefaultStore,\n\t\t\tselectedTableId: null,\n\t\t\tstores: {},\n\t\t\ttables: {},\n\t\t}\n\t},\n\tcomputed: {\n\t\tstore(): unknown {\n\t\t\t// @ts-expect-error getStore and selectedTableId will exist at runtime\n\t\t\treturn this.getStore(this.selectedTableId)\n\t\t},\n\t},\n\tbeforeCreate(): void {\n\t\tthis.tableId = `kt-table-legacy-provider_${tableProviderIdSeed}`\n\t\ttableProviderIdSeed += 1\n\t},\n\tmethods: {\n\t\taddTable(table: any): void {\n\t\t\t// @ts-expect-error tables and $set will exist at runtime\n\t\t\tthis.$set(this.tables, table.tableId, table)\n\t\t},\n\t\taddStore(id: unknown, store: any): void {\n\t\t\t// @ts-expect-error stores and $set will exist at runtime\n\t\t\tthis.$set(this.stores, id, store)\n\t\t},\n\t\tupdateStoreId(id: any, newId: any) {\n\t\t\t// @ts-expect-error stores and $set will exist at runtime\n\t\t\tthis.$set(this.stores, newId, this.stores[id])\n\t\t\t// @ts-expect-error stores and $delete will exist at runtime\n\t\t\tthis.$delete(this.stores, id)\n\t\t\t// @ts-expect-error selectedTableId will exist at runtime\n\t\t\tif (this.selectedTableId === id) {\n\t\t\t\t// @ts-expect-error selectedTableId will exist at runtime\n\t\t\t\tthis.selectedTableId = newId\n\t\t\t}\n\t\t},\n\t\tsetSelectedTableId(id: unknown): void {\n\t\t\t// @ts-expect-error selectedTableId will exist at runtime\n\t\t\tthis.selectedTableId = id\n\t\t},\n\t\tgetStore(id: any): unknown {\n\t\t\t// @ts-expect-error stores and defaultStore will exist at runtime\n\t\t\treturn this.stores[id] || this.defaultStore\n\t\t},\n\t},\n\trender(h: CreateElement) {\n\t\treturn h('div', {}, [this.$slots.default])\n\t},\n\tprovide() {\n\t\treturn {\n\t\t\t[KT_TABLE_STATE_PROVIDER]: this,\n\t\t}\n\t},\n}\n/* eslint-enable perfectionist/sort-objects */\n/* eslint-enable @typescript-eslint/no-explicit-any */\n","import type { Kotti } from '../types'\nimport { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtTableLegacyVue from './KtTableLegacy.vue'\nimport { KtTableLegacyColumn as KtTableLegacyColumnVue } from './KtTableLegacyColumn'\nimport { KtTableLegacyConsumer as KtTableLegacyConsumerVue } from './KtTableLegacyConsumer'\nimport { KtTableLegacyProvider as KtTableLegacyProviderVue } from './KtTableLegacyProvider'\n\nconst META: Kotti.Meta = {\n\taddedVersion: '0.0.1',\n\tdeprecated: {\n\t\talternatives: ['KtTable', 'KtStandardTable'],\n\t\treason:\n\t\t\t'Will be replaced by the new implementation of KtTable with Kotti@9.0.0',\n\t\tversion: '8.0.0',\n\t},\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/file/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=128%3A0',\n\t},\n\tslots: {\n\t\tactions: { description: 'E.g. edit/delete row actions', scope: null },\n\t\tdefault: {\n\t\t\tdescription:\n\t\t\t\t'Could contain columns. Can be used together with columns prop...',\n\t\t\tscope: null,\n\t\t},\n\t\tempty: {\n\t\t\tdescription:\n\t\t\t\t'Alternative to emptyText prop. Shown when the Table is empty',\n\t\t\tscope: null,\n\t\t},\n\t\texpand: {\n\t\t\tdescription: 'Per column, allows showing more info on-demand',\n\t\t\tscope: {\n\t\t\t\trow: { description: null, type: 'object' },\n\t\t\t\trowIndex: { description: null, type: 'integer' },\n\t\t\t},\n\t\t},\n\t\theader: {\n\t\t\tdescription: 'Customizes column header',\n\t\t\tscope: {}, // FIXME: This is missing\n\t\t},\n\t\tloading: {\n\t\t\tdescription: 'Alternative to loadingText prop. Shown when loading',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.TableLegacy',\n\t\tschema: null,\n\t},\n}\n\nexport const KtTableLegacy = attachMeta(makeInstallable(KtTableLegacyVue), META)\nexport const KtTableLegacyColumn = attachMeta(\n\tmakeInstallable(KtTableLegacyColumnVue),\n\tMETA,\n)\nexport const KtTableLegacyProvider = attachMeta(\n\tmakeInstallable(KtTableLegacyProviderVue),\n\tMETA,\n)\nexport const KtTableLegacyConsumer = attachMeta(\n\tmakeInstallable(KtTableLegacyConsumerVue),\n\tMETA,\n)\n","import type { ComputedRef } from 'vue'\n\nexport type ToastContext = ComputedRef<{\n\tdelete: () => void\n\theader: string | null\n\tprogress: number | null\n\ttext: string\n}>\n\nexport const TOAST_CONTEXT = Symbol('TOAST_CONTEXT')\n","<script lang=\"ts\">\nimport { computed, defineComponent, inject } from 'vue'\n\nimport { KtBanner } from '../kotti-banner'\nimport { makeProps } from '../make-props'\n\nimport { TOAST_CONTEXT, type ToastContext } from './context'\nimport { KottiToast } from './types'\n\nexport default defineComponent({\n\tname: 'KtToast',\n\tcomponents: {\n\t\tKtBanner,\n\t},\n\tprops: makeProps(KottiToast.propsSchema),\n\tsetup(props, { slots }) {\n\t\tconst context = inject<ToastContext>(TOAST_CONTEXT) ?? null\n\n\t\tif (context === null) throw new Error('Could not find KtToastContext')\n\n\t\treturn {\n\t\t\thasHeaderSlot: computed((): boolean => Boolean(slots.header)),\n\t\t\theaderWithFallback: computed(() => props.header ?? context.value.header),\n\t\t\tonDelete: () => {\n\t\t\t\tcontext.value.delete()\n\t\t\t},\n\t\t\tprogressWithFallback: computed(\n\t\t\t\t() => props.progress ?? context.value.progress,\n\t\t\t),\n\t\t\ttextWithFallback: computed(() => props.text ?? context.value.text),\n\t\t}\n\t},\n})\n</script>\n\n<template>\n\t<div class=\"kt-toast\">\n\t\t<KtBanner isCloseable :type=\"type\" @close=\"onDelete\">\n\t\t\t<template v-if=\"hasHeaderSlot\" #header>\n\t\t\t\t<slot name=\"header\" />\n\t\t\t</template>\n\t\t\t<template v-else-if=\"headerWithFallback\" #header>\n\t\t\t\t{{ headerWithFallback }}\n\t\t\t</template>\n\t\t\t<template #text>\n\t\t\t\t<slot name=\"text\">\n\t\t\t\t\t{{ textWithFallback }}\n\t\t\t\t</slot>\n\t\t\t</template>\n\t\t\t<template #footer>\n\t\t\t\t<slot name=\"actions\" />\n\t\t\t</template>\n\t\t</KtBanner>\n\t</div>\n</template>\n\n<style lang=\"scss\" scoped>\n.kt-toast {\n\tdisplay: contents;\n}\n\n.kt-toast > * {\n\tbox-shadow:\n\t\t0 4px 6px 0 rgba(0 0 0 / 10%),\n\t\t0 2px 4px 0 rgba(0 0 0 / 6%);\n}\n</style>\n","<script lang=\"ts\">\nimport { computed, defineComponent, type PropType, provide } from 'vue'\n\nimport { TOAST_CONTEXT, type ToastContext } from './context'\n\nexport default defineComponent({\n\tname: 'KtToastProvider',\n\tprops: {\n\t\tdata: { required: true, type: Object as PropType<ToastContext> },\n\t},\n\tsetup(props) {\n\t\tprovide(\n\t\t\tTOAST_CONTEXT,\n\t\t\tcomputed(() => props.data),\n\t\t)\n\n\t\treturn {}\n\t},\n})\n</script>\n\n<template>\n\t<!-- TODO: Wrapping div can possibly be removed in vue3 -->\n\t<div>\n\t\t<slot />\n\t</div>\n</template>\n","<script lang=\"ts\">\nimport { computed, defineComponent, onBeforeMount, onUnmounted, ref } from 'vue'\n\nimport { makeProps } from '../make-props'\n\nimport type { RenderedMessage, ToasterReturn } from './create-toaster'\nimport KtToast from './KtToast.vue'\nimport KtToastProvider from './KtToastProvider.vue'\nimport { KottiToaster } from './types'\n\nexport default defineComponent({\n\tname: 'KtToaster',\n\tcomponents: {\n\t\tKtToast,\n\t\tKtToastProvider,\n\t},\n\tprops: makeProps(KottiToaster.propsSchema),\n\tsetup(props) {\n\t\tconst currentToasts = ref<Array<RenderedMessage>>([])\n\n\t\tconst api = (\n\t\t\tprops.toaster as unknown as ToasterReturn<{\n\t\t\t\t[key: string]: Record<string, unknown>\n\t\t\t\tdefault: Record<string, never>\n\t\t\t}>\n\t\t)._internal_pls_dont_touch\n\n\t\tonBeforeMount(() => {\n\t\t\tapi.subscribe((activeToasts) => {\n\t\t\t\tcurrentToasts.value = activeToasts\n\t\t\t})\n\t\t})\n\n\t\tonUnmounted(() => {\n\t\t\tapi.unsubscribe()\n\t\t\tcurrentToasts.value = []\n\t\t})\n\n\t\treturn {\n\t\t\trenderedToasts: computed(() =>\n\t\t\t\tcurrentToasts.value.map((toast) => ({\n\t\t\t\t\t...toast,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\tcustom: toast.custom,\n\t\t\t\t\t\tdelete: () => {\n\t\t\t\t\t\t\tapi.requestDelete(toast.metadata.id)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tduration: toast.duration,\n\t\t\t\t\t\theader: toast.header,\n\t\t\t\t\t\tprogress: toast.progress,\n\t\t\t\t\t\ttext: toast.text,\n\t\t\t\t\t\ttype: toast.type,\n\t\t\t\t\t},\n\t\t\t\t})),\n\t\t\t),\n\t\t}\n\t},\n})\n</script>\n\n<template>\n\t<div class=\"kt-toaster\">\n\t\t<div class=\"kt-toaster__notifications\">\n\t\t\t<transition-group name=\"toast-yum\" tag=\"div\">\n\t\t\t\t<KtToastProvider\n\t\t\t\t\tv-for=\"toast in renderedToasts\"\n\t\t\t\t\t:key=\"toast.metadata.id\"\n\t\t\t\t\tclass=\"toast-yum-item\"\n\t\t\t\t\t:data=\"toast.context\"\n\t\t\t\t>\n\t\t\t\t\t<slot v-bind=\"toast.context\" :name=\"toast.type\">\n\t\t\t\t\t\t<KtToast />\n\t\t\t\t\t</slot>\n\t\t\t\t</KtToastProvider>\n\t\t\t</transition-group>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\" scoped>\n.kt-toaster__notifications {\n\tposition: fixed;\n\ttop: var(--unit-4);\n\tright: var(--unit-4);\n\tz-index: 100000;\n\twidth: 400px;\n\n\t> div {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--unit-2);\n\t}\n}\n\n// animation\n\n$z-normal: 0;\n$z-leaving: -1;\n\n.toast-yum-item {\n\twidth: 400px;\n\tisolation: isolate;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n\t.toast-yum-item {\n\t\ttransition: all var(--transition-medium) ease-in-out;\n\t}\n\n\t.toast-yum-move {\n\t\ttransition: transform var(--transition-short) ease-in-out;\n\t}\n\n\t.toast-yum-enter,\n\t.toast-yum-leave-to {\n\t\topacity: 0;\n\t\ttransform: translateX(200px);\n\t}\n\n\t.toast-yum-leave-active {\n\t\tposition: absolute;\n\t\tz-index: $z-leaving;\n\t\ttransition: all var(--transition-medium) ease-in-out;\n\t}\n\n\t.toast-yum-leave-from {\n\t\tz-index: $z-normal;\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n</style>\n","/**\n * Creates a deferred promise, useful in scenarios where a promise needs to be created and\n * resolved or rejected from an external context. This exposes `resolve` and `reject` functions,\n * allowing external control over the promise's resolution state.\n *\n * @throws {Error} Throws an error if the promise's `resolve` or `reject` functions could not be initialized (which shouldn't occur under typical JavaScript execution).\n */\nexport const createDeferred = <PROMISE_RESOLUTION_TYPE>(): {\n\tpromise: Promise<PROMISE_RESOLUTION_TYPE>\n\treject: (arg: unknown) => void\n\tresolve: (res: PROMISE_RESOLUTION_TYPE) => void\n} => {\n\tlet resolve: ((res: PROMISE_RESOLUTION_TYPE) => void) | null = null\n\tlet reject: ((arg: unknown) => void) | null = null\n\n\tconst promise = new Promise<PROMISE_RESOLUTION_TYPE>((res, rej) => {\n\t\tresolve = res\n\t\treject = rej\n\t})\n\n\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\tif (resolve === null || reject === null)\n\t\tthrow new Error('could not create deferred promise')\n\n\treturn {\n\t\tpromise,\n\t\treject,\n\t\tresolve,\n\t}\n}\n","import { nanoid } from 'nanoid'\nimport { z } from 'zod'\n\nimport { createDeferred } from './create-deferred'\n\nconst customSchema = z.record(z.unknown())\n\nconst durationSchema = z.number().int().finite().positive().nullable()\n\nconst metadataSchema = z\n\t.object({\n\t\tabortController: z.instanceof(globalThis.AbortController),\n\t\tid: z.string(),\n\t})\n\t.strict()\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst queuedToastSchema = z\n\t.object({\n\t\tcustom: customSchema,\n\t\tdeferred: z\n\t\t\t.object({\n\t\t\t\tpromise: z.promise(z.literal('deleted')),\n\t\t\t\treject: z.function().args(z.unknown()).returns(z.void()),\n\t\t\t\tresolve: z.function().args(z.literal('deleted')).returns(z.void()),\n\t\t\t})\n\t\t\t.strict(),\n\t\tduration: durationSchema,\n\t\theader: z.string().nullable(),\n\t\tmetadata: metadataSchema,\n\t\ttext: z.string(),\n\t\ttype: z.string(),\n\t})\n\t.strict()\n\ntype QueuedToast = z.output<typeof queuedToastSchema>\n\nconst renderedMessageSchema = z\n\t.object({\n\t\tcustom: customSchema,\n\t\tduration: z.number().positive().finite().nullable(),\n\t\theader: z.string().nullable(),\n\t\tmetadata: metadataSchema,\n\t\tprogress: z.number().min(0).max(1).nullable(),\n\t\ttext: z.string(),\n\t\ttype: z.string(),\n\t})\n\t.strict()\n\nexport type RenderedMessage = z.output<typeof renderedMessageSchema>\n\nconst messageSchema = z\n\t.object({\n\t\tcustom: customSchema.default(() => ({})),\n\t\tduration: durationSchema.default(null),\n\t\theader: z.string().nullable().default(null),\n\t\tmetadata: z\n\t\t\t.object({\n\t\t\t\tabortController: z\n\t\t\t\t\t.instanceof(globalThis.AbortController)\n\t\t\t\t\t.default(() => new globalThis.AbortController()),\n\t\t\t\tid: z.string().default(nanoid),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.default(() => ({})),\n\t\ttext: z.string(),\n\t\ttype: z.string().default('default'),\n\t})\n\t.strict()\n\nconst subscribeHandlerSchema = z\n\t.function()\n\t.args(z.array(renderedMessageSchema))\n\t.returns(z.union([z.promise(z.void()), z.void()]))\n\ntype SubscribeHandler = z.output<typeof subscribeHandlerSchema>\n\n// utilties\n\ntype IsEmptyObject<T> = T extends Record<string, never> ? true : false\n\n// messages\n\ntype MessageTypes = {\n\t[key: string]: Record<string, unknown>\n\tdefault: Record<string, never>\n}\n\ntype Messages<MESSAGE_TYPES extends MessageTypes> = {\n\t[TYPE in keyof MESSAGE_TYPES]: Omit<\n\t\tz.input<typeof messageSchema>,\n\t\t'custom' | 'type'\n\t> &\n\t\t(IsEmptyObject<MESSAGE_TYPES[TYPE]> extends true\n\t\t\t? { custom?: MESSAGE_TYPES[TYPE] }\n\t\t\t: { custom: MESSAGE_TYPES[TYPE] }) &\n\t\t(TYPE extends 'default' ? { type?: 'default' } : { type: TYPE })\n}\n\ntype MessagesNoDefault<MESSAGE_TYPES extends MessageTypes> = {\n\t[KEY in keyof MESSAGE_TYPES]: {\n\t\tduration?: number | null\n\t\theader?: string | null\n\t\ttext: string\n\t\ttype: KEY\n\t} & (IsEmptyObject<MESSAGE_TYPES[KEY]> extends true\n\t\t? { custom?: MESSAGE_TYPES[KEY] }\n\t\t: { custom: MESSAGE_TYPES[KEY] })\n}\n\n// show etc.\n\ntype ShowResult<\n\tMESSAGE_TYPES extends MessageTypes,\n\tTYPE extends keyof MESSAGE_TYPES,\n> = {\n\tabort: () => void\n\tcustom: MESSAGE_TYPES[TYPE]\n\tdone: Promise<'deleted'>\n\theader: string | null\n\tmetadata: z.output<typeof metadataSchema>\n\ttext: string\n}\n\ntype Show<MESSAGE_TYPES extends MessageTypes> = <\n\tMESSAGE extends Messages<MESSAGE_TYPES>[keyof MESSAGE_TYPES & string],\n>(\n\tmessage: Exclude<\n\t\tkeyof MESSAGE,\n\t\tkeyof Messages<MESSAGE_TYPES>[keyof MESSAGE_TYPES & string]\n\t> extends never\n\t\t? MESSAGE\n\t\t: never,\n) => ShowResult<\n\tMESSAGE_TYPES,\n\tMESSAGE extends { type: infer TYPE } ? TYPE : 'default'\n>\n\ntype WithInferredOptions<\n\tMESSAGE_TYPES extends MessageTypes,\n\tOPTIONS extends {\n\t\tduration?: number | null\n\t\ttype?: keyof MESSAGE_TYPES\n\t},\n> = OPTIONS extends {\n\tduration?: number | null\n\ttype: infer TYPE extends keyof MESSAGE_TYPES\n}\n\t?\n\t\t\t| MessagesNoDefault<MESSAGE_TYPES>[TYPE]\n\t\t\t| Omit<Messages<MESSAGE_TYPES>[TYPE], 'type'>\n\t: Messages<MESSAGE_TYPES>[keyof MESSAGE_TYPES]\n\ntype WithOptions<MESSAGE_TYPES extends MessageTypes> = <\n\tBASE_OPTIONS extends {\n\t\tduration?: number | null\n\t\ttype?: keyof MESSAGE_TYPES\n\t},\n>(\n\tbaseOptions: Exclude<keyof BASE_OPTIONS, 'duration' | 'type'> extends never\n\t\t? BASE_OPTIONS\n\t\t: `Argument \"${Exclude<keyof BASE_OPTIONS & string, 'duration' | 'type'>}\" is not supported`,\n) => <OPTIONS extends WithInferredOptions<MESSAGE_TYPES, BASE_OPTIONS>>(\n\toptions: Exclude<\n\t\tkeyof OPTIONS,\n\t\tkeyof WithInferredOptions<MESSAGE_TYPES, BASE_OPTIONS>\n\t> extends never\n\t\t? OPTIONS\n\t\t: `Argument \"${Exclude<keyof OPTIONS & string, 'duration' | 'type'>}\" is not supported`,\n) => ShowResult<\n\tMESSAGE_TYPES,\n\tBASE_OPTIONS & OPTIONS extends {\n\t\ttype: infer TYPE extends keyof MESSAGE_TYPES\n\t}\n\t\t? TYPE\n\t\t: 'default'\n>\n\nexport type ToasterReturn<MESSAGE_TYPES extends MessageTypes> = {\n\tabort: (toastId: string) => void\n\tshow: Show<MESSAGE_TYPES>\n\twithOptions: WithOptions<MESSAGE_TYPES>\n\n\t// internal\n\t_internal_pls_dont_touch: {\n\t\trequestDelete: (toastId: string) => void\n\t\tsubscribe: (handler: z.output<typeof subscribeHandlerSchema>) => void\n\t\tunsubscribe: () => void\n\t}\n}\n\nconst createToasterOptions = z\n\t.object({\n\t\tanimationFrame: z\n\t\t\t.object({\n\t\t\t\tgetIsRunning: z.function().args().returns(z.boolean()),\n\t\t\t\tstart: z\n\t\t\t\t\t.function()\n\t\t\t\t\t.args(z.function().args().returns(z.void()))\n\t\t\t\t\t.returns(z.void()),\n\t\t\t\tstop: z.function().args().returns(z.void()),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.default(() => {\n\t\t\t\tlet animationFrameId: number | null = null\n\t\t\t\treturn {\n\t\t\t\t\tgetIsRunning: () => animationFrameId !== null,\n\t\t\t\t\tstart: (update) => {\n\t\t\t\t\t\tconst animate = () => {\n\t\t\t\t\t\t\tanimationFrameId = globalThis.requestAnimationFrame(animate)\n\t\t\t\t\t\t\tupdate()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tanimationFrameId = globalThis.requestAnimationFrame(animate)\n\t\t\t\t\t},\n\t\t\t\t\tstop: () => {\n\t\t\t\t\t\tif (animationFrameId) {\n\t\t\t\t\t\t\tglobalThis.cancelAnimationFrame(animationFrameId)\n\t\t\t\t\t\t\tanimationFrameId = null\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}),\n\t\t// eslint-disable-next-line no-magic-numbers\n\t\tnumberOfToasts: z.number().int().positive().finite().default(3),\n\t})\n\t.strict()\n\t.default(() => ({}))\n\ntype CreateToasterOptions = z.input<typeof createToasterOptions>\n\ntype ActiveToast = {\n\tbeginTime: number\n\tendTime: number | null\n\tmessage: QueuedToast\n\tprogress: number | null\n}\n\nconst INTERNAL_ABORT = 'INTERNAL_ABORT'\n\nconst calculateProgress = (start: number, now: number, end: number): number => {\n\tconst unclamped = (now - start) / (end - start)\n\treturn Math.max(Math.min(unclamped, 1), 0)\n}\n\n// --------------------------------------------------------------- //\n// --------------------------------------------------------------- //\n// -- Begin of implementation ------------------------------------ //\n// --------------------------------------------------------------- //\n// --------------------------------------------------------------- //\n\nexport const createToaster = <\n\tMESSAGE_TYPES extends MessageTypes = { default: Record<string, never> },\n>(\n\t_options: CreateToasterOptions = {},\n): ToasterReturn<MESSAGE_TYPES> => {\n\tconst options = createToasterOptions.parse(_options)\n\n\tconst fifoToasterQueue: Array<QueuedToast> = []\n\tconst activeToasts: Array<ActiveToast> = []\n\n\tlet subscriber: SubscribeHandler | null = null\n\tconst notifySubscriber = () => {\n\t\tif (subscriber === null) return\n\n\t\tvoid subscriber(\n\t\t\tactiveToasts.map((toast) => ({\n\t\t\t\tcustom: toast.message.custom,\n\t\t\t\tduration: toast.message.duration,\n\t\t\t\theader: toast.message.header,\n\t\t\t\tmetadata: toast.message.metadata,\n\t\t\t\tprogress: toast.progress,\n\t\t\t\ttext: toast.message.text,\n\t\t\t\ttype: toast.message.type,\n\t\t\t})),\n\t\t)\n\t}\n\n\tconst deleteToastFromActiveToasts = (toastId: string) => {\n\t\tconst index = activeToasts.findIndex(\n\t\t\t(toast) => toast.message.metadata.id === toastId,\n\t\t)\n\t\tif (index === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`could not find toast in activeToasts with id “${toastId}”`,\n\t\t\t)\n\n\t\tconst removedToast = activeToasts.splice(index, 1)[0]\n\n\t\tif (!removedToast)\n\t\t\tthrow new Error(\n\t\t\t\t`could not find toast in activeToasts with id “${toastId}”`,\n\t\t\t)\n\n\t\tnotifySubscriber()\n\t\treturn removedToast.message\n\t}\n\n\tconst deleteToastFromFifoQueue = (toastId: string) => {\n\t\tconst index = fifoToasterQueue.findIndex(\n\t\t\t(toast) => toast.metadata.id === toastId,\n\t\t)\n\t\tif (index === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`could not find toast in fifoToasterQueue with id “${toastId}”`,\n\t\t\t)\n\n\t\tconst removedToast = fifoToasterQueue.splice(index, 1)[0]\n\n\t\tif (!removedToast)\n\t\t\tthrow new Error(\n\t\t\t\t`could not find toast in fifoToasterQueue with id “${toastId}”`,\n\t\t\t)\n\n\t\treturn removedToast\n\t}\n\n\tconst deleteAndAbortToast = (mode: 'abort' | 'delete', toastId: string) => {\n\t\tconst removedToast = activeToasts.some(\n\t\t\t(toast) => toast.message.metadata.id === toastId,\n\t\t)\n\t\t\t? deleteToastFromActiveToasts(toastId)\n\t\t\t: deleteToastFromFifoQueue(toastId)\n\n\t\tswitch (mode) {\n\t\t\tcase 'abort': {\n\t\t\t\tconst { abortController } = removedToast.metadata\n\n\t\t\t\tif (!abortController.signal.aborted) {\n\t\t\t\t\tabortController.abort(INTERNAL_ABORT)\n\t\t\t\t}\n\n\t\t\t\tremovedToast.deferred.reject(\n\t\t\t\t\tabortController.signal.aborted\n\t\t\t\t\t\t? abortController.signal.reason\n\t\t\t\t\t\t: 'aborted',\n\t\t\t\t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'delete': {\n\t\t\t\tremovedToast.deferred.resolve('deleted')\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates the list of active toasts, managing their display duration and progress.\n\t *\n\t * - If a toast has an `endTime`, it calculates its progress based on the current time.\n\t * - If a toast's progress reaches 100%, it is deleted and resolved.\n\t * - If there is room for more toasts, it moves items from the `fifoToasterQueue` to `activeToasts`.\n\t * - Manages the animation frame, starting or stopping it based on whether there are active toasts.\n\t * - Notifies the subscriber if the state of `activeToasts` changes.\n\t */\n\t// eslint-disable-next-line sonarjs/cognitive-complexity\n\tconst updateActiveToasts = (_dirty = false) => {\n\t\tif (subscriber === null) return\n\t\tlet dirty = _dirty\n\n\t\tlet index = 0\n\t\twhile (index < activeToasts.length) {\n\t\t\tconst toast = activeToasts[index] as ActiveToast\n\n\t\t\tif (toast.endTime === null) {\n\t\t\t\tindex++\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttoast.progress = calculateProgress(\n\t\t\t\ttoast.beginTime,\n\t\t\t\tDate.now(),\n\t\t\t\ttoast.endTime,\n\t\t\t)\n\t\t\tdirty = true\n\n\t\t\tif (toast.progress >= 1) {\n\t\t\t\tdeleteAndAbortToast('delete', toast.message.metadata.id)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tindex++\n\t\t}\n\n\t\twhile (activeToasts.length < options.numberOfToasts) {\n\t\t\tconst message = fifoToasterQueue.shift() ?? null\n\t\t\tif (message === null) break\n\n\t\t\tactiveToasts.push({\n\t\t\t\tbeginTime: Date.now(),\n\t\t\t\tendTime: message.duration ? Date.now() + message.duration : null,\n\t\t\t\tmessage,\n\t\t\t\tprogress: message.duration ? 0 : null,\n\t\t\t})\n\t\t\tdirty = true\n\t\t}\n\n\t\tconst isRunning = options.animationFrame.getIsRunning()\n\t\tconst isNowEmpty = activeToasts.length === 0\n\n\t\tif (!isRunning && !isNowEmpty) {\n\t\t\toptions.animationFrame.start(() => {\n\t\t\t\tupdateActiveToasts()\n\t\t\t})\n\t\t} else if (isRunning && isNowEmpty) {\n\t\t\toptions.animationFrame.stop()\n\t\t}\n\n\t\tif (dirty) notifySubscriber()\n\t}\n\n\tconst show: Show<MESSAGE_TYPES> = <\n\t\tMESSAGE,\n\t\tTYPE extends keyof MESSAGE_TYPES = MESSAGE extends {\n\t\t\ttype: infer TYPE extends keyof MESSAGE_TYPES\n\t\t}\n\t\t\t? TYPE\n\t\t\t: 'default',\n\t>(\n\t\tmessage: MESSAGE,\n\t) => {\n\t\tconst options = messageSchema.parse(message)\n\n\t\tconst doneDeferred = createDeferred<'deleted'>()\n\t\tconst { signal } = options.metadata.abortController\n\n\t\tsignal.addEventListener('abort', () => {\n\t\t\tif (signal.reason !== INTERNAL_ABORT)\n\t\t\t\tdeleteAndAbortToast('abort', options.metadata.id)\n\t\t})\n\n\t\tfifoToasterQueue.push({\n\t\t\tcustom: options.custom,\n\t\t\tdeferred: doneDeferred,\n\t\t\tduration: options.duration,\n\t\t\theader: options.header,\n\t\t\tmetadata: options.metadata,\n\t\t\ttext: options.text,\n\t\t\ttype: options.type,\n\t\t})\n\n\t\tupdateActiveToasts()\n\n\t\treturn {\n\t\t\tabort: () => {\n\t\t\t\tdeleteAndAbortToast('abort', options.metadata.id)\n\t\t\t},\n\t\t\tcustom: options.custom as MESSAGE_TYPES[TYPE],\n\t\t\tdone: doneDeferred.promise,\n\t\t\theader: options.header,\n\t\t\tmetadata: options.metadata,\n\t\t\ttext: options.text,\n\t\t\ttype: options.type as TYPE,\n\t\t}\n\t}\n\n\treturn {\n\t\tabort: (toastId: string) => {\n\t\t\tdeleteAndAbortToast('abort', toastId)\n\t\t},\n\t\tshow,\n\t\twithOptions: (baseOptions) => (options) =>\n\t\t\tshow({\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t...(baseOptions as any),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\t...(options as any),\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t}) as any,\n\t\t/**\n\t\t * The methods in here expose the toasts from `activeToasts` to a single subscriber.\n\t\t * Toasts from `fifoToasterQueue` are kept private.\n\t\t *\n\t\t * The subscriber:\n\t\t * - gets updated whenever `activeToasts` gets mutated\n\t\t * - can delete a specific toast by id\n\t\t */\n\t\t_internal_pls_dont_touch: {\n\t\t\trequestDelete: (deleteId) => {\n\t\t\t\tdeleteAndAbortToast('delete', deleteId)\n\t\t\t\tupdateActiveToasts(true)\n\t\t\t},\n\t\t\tsubscribe: (handler) => {\n\t\t\t\tif (subscriber)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'create-toaster: toaster already has a subscriber, aborting',\n\t\t\t\t\t)\n\n\t\t\t\tsubscriber = handler\n\n\t\t\t\tupdateActiveToasts(true)\n\t\t\t},\n\t\t\tunsubscribe: () => {\n\t\t\t\tif (!subscriber)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'create-toaster: toaster currently has no subscriber, aborting',\n\t\t\t\t\t)\n\n\t\t\t\toptions.animationFrame.stop()\n\n\t\t\t\tsubscriber = null\n\t\t\t},\n\t\t},\n\t}\n}\n","import { MetaDesignType } from '../types/kotti'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtToastVue from './KtToast.vue'\nimport KtToasterVue from './KtToaster.vue'\nimport { KottiToast, KottiToaster } from './types'\n\nexport { createToaster } from './create-toaster'\n\nexport const KtToaster = attachMeta(makeInstallable(KtToasterVue), {\n\taddedVersion: '8.0.0',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/design/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=6671-10835',\n\t},\n\tslots: {\n\t\tdefault: {\n\t\t\tdescription:\n\t\t\t\t'Slots for all message types exist, with default being the fallback',\n\t\t\tscope: {\n\t\t\t\tcustom: { description: 'Custom data object', type: 'object' },\n\t\t\t\tdelete: { description: 'Deletes the toast', type: 'function' },\n\t\t\t\tduration: {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t'Total toasting duration in ms, null for persistent toasts',\n\t\t\t\t\ttype: 'integer',\n\t\t\t\t},\n\t\t\t\theader: { description: 'Optional header text', type: 'string' },\n\t\t\t\tprogress: { description: 'Lifecycle progress (0–1)', type: 'float' },\n\t\t\t\ttext: { description: 'Main text content', type: 'string' },\n\t\t\t\ttype: { description: 'Toast type', type: 'string' },\n\t\t\t},\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'KottiToaster',\n\t\tschema: KottiToaster.propsSchema,\n\t},\n})\n\nexport const KtToast = attachMeta(makeInstallable(KtToastVue), {\n\taddedVersion: '8.0.0',\n\tdeprecated: null,\n\tdesigns: {\n\t\ttype: MetaDesignType.FIGMA,\n\t\turl: 'https://www.figma.com/design/0yFVivSWXgFf2ddEF92zkf/Kotti-Design-System?node-id=6671-10835',\n\t},\n\tslots: {\n\t\tactions: {\n\t\t\tdescription:\n\t\t\t\t'Used to put e.g. buttons or other interactive elements at the bottom of the toast',\n\t\t\tscope: null,\n\t\t},\n\t\theader: {\n\t\t\tdescription: 'Used to replace the optional header text',\n\t\t\tscope: null,\n\t\t},\n\t\ttext: {\n\t\t\tdescription: 'Used to replace the main text',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'KottiToast',\n\t\tschema: KottiToast.propsSchema,\n\t},\n})\n","<template>\n\t<div class=\"kt-user-menu-container\">\n\t\t<div ref=\"userMenuRef\" class=\"kt-user-menu\">\n\t\t\t<div class=\"kt-user-menu__items\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"(section, index) in parsedSections\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"kt-user-menu-item-wrapper\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"section.title\"\n\t\t\t\t\t\tclass=\"kt-user-menu-item-wrapper__title\"\n\t\t\t\t\t\tv-text=\"section.title\"\n\t\t\t\t\t/>\n\t\t\t\t\t<!-- eslint-disable vue/no-v-text-v-html-on-component -->\n\t\t\t\t\t<component\n\t\t\t\t\t\t:is=\"link.component\"\n\t\t\t\t\t\tv-for=\"(link, linkIndex) in section.links\"\n\t\t\t\t\t\t:key=\"linkIndex\"\n\t\t\t\t\t\tv-bind=\"link.props\"\n\t\t\t\t\t\tclass=\"kt-user-menu-item-wrapper__item\"\n\t\t\t\t\t\t:data-test=\"`navbar:footer:element:${link.title\n\t\t\t\t\t\t\t.toLowerCase()\n\t\t\t\t\t\t\t.split(' ')\n\t\t\t\t\t\t\t.join('-')}`\"\n\t\t\t\t\t\t@click=\"$emit('click', link)\"\n\t\t\t\t\t\tv-text=\"link.title\"\n\t\t\t\t\t/>\n\t\t\t\t\t<!-- eslint-enable vue/no-v-text-v-html-on-component -->\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div ref=\"triggerRef\" :class=\"userInfoClass\">\n\t\t\t<KtAvatar class=\"kt-user-menu-info__avatar\" size=\"sm\" :src=\"userAvatar\" />\n\t\t\t<div\n\t\t\t\tv-if=\"!context.isNarrow || isMenuOpen\"\n\t\t\t\tclass=\"kt-user-menu-info__text\"\n\t\t\t>\n\t\t\t\t<div class=\"kt-user-menu-info__name\" v-text=\"userName\" />\n\t\t\t\t<div class=\"kt-user-menu-info__status\" v-text=\"userStatus\" />\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"!context.isNarrow || isMenuOpen\"\n\t\t\t\tclass=\"kt-user-menu-info__chevron\"\n\t\t\t>\n\t\t\t\t<i v-if=\"isMenuOpen\" class=\"yoco\">chevron_down</i>\n\t\t\t\t<i v-else class=\"yoco\">chevron_up</i>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, ref } from 'vue'\n\nimport { useTippy } from '@3yourmind/vue-use-tippy'\n\nimport { KtAvatar } from '../kotti-avatar'\nimport { KT_NAVBAR_CONTEXT } from '../kotti-navbar/constants'\nimport { KottiNavbar } from '../kotti-navbar/types'\nimport { makeProps } from '../make-props'\n\nimport { KottiUserMenu } from './types'\n\nexport default defineComponent({\n\tname: 'KtUserMenu',\n\tcomponents: {\n\t\tKtAvatar,\n\t},\n\tprops: makeProps(KottiUserMenu.propsSchema),\n\temits: ['click'],\n\tsetup(props) {\n\t\tconst triggerRef = ref<HTMLDivElement | null>(null)\n\t\tconst userMenuRef = ref<HTMLDivElement | null>(null)\n\n\t\tconst isMenuOpen = ref(false)\n\t\tconst context = inject(\n\t\t\tKT_NAVBAR_CONTEXT,\n\t\t\tcomputed(() => ({ isNarrow: false, theme: KottiNavbar.Theme.DEFAULT })),\n\t\t)\n\n\t\tuseTippy(\n\t\t\ttriggerRef,\n\t\t\tcomputed(() => ({\n\t\t\t\tappendTo: () =>\n\t\t\t\t\ttriggerRef.value as NonNullable<typeof triggerRef.value>,\n\t\t\t\tarrow: false,\n\t\t\t\tcontent: userMenuRef.value ?? undefined,\n\t\t\t\tinteractive: true,\n\t\t\t\tmaxWidth: 'none',\n\t\t\t\toffset: [0, 0],\n\t\t\t\tonHide: () => {\n\t\t\t\t\tisMenuOpen.value = false\n\t\t\t\t},\n\t\t\t\tonShow: () => {\n\t\t\t\t\tisMenuOpen.value = true\n\t\t\t\t},\n\t\t\t\ttheme: `kt-usermenu-${context.value.theme}`,\n\t\t\t\ttrigger: 'click focusin',\n\t\t\t\tzIndex: 1000,\n\t\t\t})),\n\t\t)\n\n\t\treturn {\n\t\t\tcontext,\n\t\t\tisMenuOpen,\n\t\t\tparsedSections: computed(() =>\n\t\t\t\tKottiUserMenu.propsSchema.shape.sections.parse(props.sections),\n\t\t\t),\n\t\t\ttriggerRef,\n\t\t\tuserInfoClass: computed(() => ({\n\t\t\t\t'kt-user-menu-info': true,\n\t\t\t\t'kt-user-menu-info--is-narrow': context.value.isNarrow,\n\t\t\t\t'kt-user-menu-info--is-narrow-wide':\n\t\t\t\t\tcontext.value.isNarrow && isMenuOpen.value,\n\t\t\t})),\n\t\t\tuserMenuRef,\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\">\n@import '../kotti-style/_variables.scss';\n\n.tippy-box[data-theme^='kt-usermenu'] {\n\twidth: 11.2rem;\n\tcolor: var(--user-menu-color);\n\tbackground-color: var(--user-menu-background);\n\tborder-radius: 0.2rem 0.2rem 0 0;\n\n\t.tippy-content {\n\t\tpadding: 0.8rem 0.8rem 0.2rem;\n\t}\n}\n\n@media (width <= $size-md) {\n\t.tippy-box[data-theme^='kt-usermenu'] {\n\t\twidth: 100vw;\n\t\tborder-radius: 0 0 0.2rem 0.2rem;\n\n\t\t// HACK: tippy box has a 5px offset that I can not get rid of using its props\n\t\ttransform: translateX(-5px);\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-style/_variables.scss';\n\n.kt-user-menu-item-wrapper {\n\tmargin-bottom: 0.4rem;\n\topacity: 1;\n\n\t&__title {\n\t\tpadding: 0.2rem 0.4rem;\n\t\tfont-size: 0.5rem;\n\t\tfont-weight: 600;\n\t\ttext-transform: uppercase;\n\t}\n\n\t&__item {\n\t\tdisplay: block;\n\t\tpadding: 0.2rem 0.4rem;\n\t\tmargin: 0.1rem 0;\n\t\tfont-size: 0.68rem;\n\t\tline-height: 1.2rem;\n\t\tcolor: inherit;\n\t\tborder-radius: 0.2rem;\n\n\t\t&:hover {\n\t\t\tcolor: inherit;\n\t\t\tcursor: pointer;\n\t\t\tbackground: var(--user-menu-background-active);\n\t\t}\n\t}\n}\n\n.kt-user-menu-info {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: space-between;\n\tpadding: 0.4rem;\n\tmargin: -0.4rem;\n\tline-height: 1;\n\tcursor: pointer;\n\tborder-radius: 0 0 0.2rem 0.2rem;\n\n\t&--is-narrow {\n\t\twidth: 2.4rem;\n\t}\n\n\t&--is-narrow-wide {\n\t\tposition: absolute;\n\t\tbottom: 0.8rem;\n\t\tleft: 0.8rem;\n\t\twidth: 11.2rem;\n\t}\n\n\t&[aria-expanded='true'],\n\t&:hover {\n\t\tbackground-color: var(--user-menu-background);\n\t}\n\n\t&__avatar,\n\t&__chevron {\n\t\tflex-grow: 0;\n\t\tflex-shrink: 0;\n\t}\n\n\t&__chevron {\n\t\talign-self: center;\n\t}\n\n\t&__text {\n\t\twidth: 100%;\n\t\tmargin-left: 0.4rem;\n\t\tline-height: 0.8rem;\n\t\tcolor: var(--user-menu-color);\n\t}\n\n\t&__name {\n\t\tfont-size: 0.7rem;\n\t\tfont-weight: 600;\n\t}\n\n\t&__status {\n\t\tfont-size: 0.6rem;\n\t\tfont-weight: 600;\n\t\topacity: 0.65;\n\t}\n}\n\n@media (width <= $size-md) {\n\t.kt-user-menu-container {\n\t\tdisplay: block;\n\t}\n\n\t.kt-user-menu-info {\n\t\tflex-basis: 48px;\n\t\tpadding: 0.3rem;\n\n\t\t&--is-narrow-wide {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t&__text,\n\t\t&__chevron {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","import { attachMeta, makeInstallable } from '../utilities'\n\nimport KtUserMenuVue from './KtUserMenu.vue'\nimport { KottiUserMenu } from './types'\n\nexport const KtUserMenu = attachMeta(makeInstallable(KtUserMenuVue), {\n\taddedVersion: '0.0.1',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.UserMenu',\n\t\tschema: KottiUserMenu.propsSchema,\n\t},\n})\n","<template>\n\t<div :class=\"rootClasses\" :data-test=\"dataTest\">\n\t\t<div v-if=\"showHeader || $slots.helpText\" class=\"kt-value-label__header\">\n\t\t\t<label v-if=\"hasLabel\" class=\"kt-value-label__label\" v-text=\"label\" />\n\t\t\t<div\n\t\t\t\tv-if=\"hasHelpText || $slots.helpText\"\n\t\t\t\tclass=\"kt-value-label__help-text\"\n\t\t\t>\n\t\t\t\t<FieldHelpText :helpText=\"helpText\" :helpTextSlot=\"$slots.helpText\" />\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"helpDescription\"\n\t\t\tclass=\"kt-value-label__help-description\"\n\t\t\tv-text=\"helpDescription\"\n\t\t/>\n\t\t<div v-if=\"isLoading\" class=\"kt-value-label__loading skeleton rectangle\" />\n\t\t<div v-else class=\"kt-value-label__value\">\n\t\t\t<i v-if=\"isUnset\" v-text=\"notSetLabel\" />\n\t\t\t<slot v-else-if=\"$slots.default\" />\n\t\t\t<span v-else v-text=\"valueToRender\" />\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"!isLoading && validationText !== null\"\n\t\t\tclass=\"kt-value-label__validation-text\"\n\t\t>\n\t\t\t<i class=\"yoco\" v-text=\"validationTextIcon\" />\n\t\t\t{{ validationText }}\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { Dashes } from '@metatypes/typography'\nimport { computed, defineComponent } from 'vue'\n\nimport { Yoco } from '@3yourmind/yoco'\n\nimport FieldHelpText from '../kotti-field/components/FieldHelpText.vue'\nimport { useTranslationNamespace } from '../kotti-i18n/hooks'\nimport { makeProps } from '../make-props'\n\nimport { KottiValueLabel } from './types'\n\nexport default defineComponent({\n\tname: 'KtValueLabel',\n\tcomponents: { FieldHelpText },\n\tprops: makeProps(KottiValueLabel.propsSchema),\n\tsetup(props) {\n\t\tconst translations = useTranslationNamespace('KtValueLabel')\n\n\t\tconst hasHelpText = computed(() => props.helpText !== null)\n\t\tconst hasLabel = computed(() => props.label !== null)\n\t\tconst validationType = computed(() => props.validation?.type ?? null)\n\n\t\treturn {\n\t\t\thasHelpText,\n\t\t\thasLabel,\n\t\t\tnotSetLabel: computed(() => translations.value.notSet),\n\t\t\trootClasses: computed(() => {\n\t\t\t\tconst classes = ['kt-value-label']\n\t\t\t\tif (validationType.value !== null)\n\t\t\t\t\tclasses.push(`kt-value-label--is-validation-${validationType.value}`)\n\n\t\t\t\treturn classes\n\t\t\t}),\n\t\t\tshowHeader: computed(() => hasLabel.value || hasHelpText.value),\n\t\t\tvalidationText: computed(() =>\n\t\t\t\tprops.validation !== null ? props.validation.text : null,\n\t\t\t),\n\t\t\tvalidationTextIcon: computed(() =>\n\t\t\t\tvalidationType.value === null\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\terror: Yoco.Icon.CIRCLE_CROSS,\n\t\t\t\t\t\t\tsuccess: Yoco.Icon.CIRCLE_CHECK,\n\t\t\t\t\t\t\twarning: Yoco.Icon.CIRCLE_ATTENTION,\n\t\t\t\t\t\t}[validationType.value],\n\t\t\t),\n\t\t\tvalueToRender: computed(() => props.value ?? Dashes.EmDash),\n\t\t}\n\t},\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../kotti-field/mixins';\n\n.kt-value-label {\n\thyphens: auto;\n\n\t@include validations using ($type) {\n\t\t/* stylelint-disable */\n\t\t.kt-value-label__validation-text {\n\t\t\tcolor: var(--support-#{$type});\n\t\t}\n\t\t/* stylelint-enable */\n\t}\n\n\t> *:not(:last-child) {\n\t\tmargin-bottom: var(--unit-1);\n\t}\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tfont-size: 0.9em;\n\n\t\t> :not(:first-child) {\n\t\t\tmargin-left: 0.2rem;\n\t\t}\n\t}\n\n\t&__help-text {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tfont-size: 1.4em;\n\t\tcolor: var(--icon-02);\n\t\tcursor: pointer;\n\t}\n\n\t&__label {\n\t\tfont-weight: 500;\n\t\tcolor: var(--text-02);\n\t}\n\n\t&__loading {\n\t\theight: 1.1rem;\n\t}\n\n\t&__help-description {\n\t\tcolor: var(--text-03);\n\t}\n\n\t&__validation-text {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tcolor: var(--text-03);\n\n\t\t> i {\n\t\t\tmargin-right: var(--unit-h);\n\t\t}\n\t}\n\n\t&__value {\n\t\tfont-size: var(--font-size-medium);\n\t\tfont-weight: 400;\n\t\tline-height: 1.6;\n\t\tcolor: var(--text-01);\n\n\t\ti,\n\t\tspan {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n@supports not (hyphens: auto) {\n\t.kt-value-label {\n\t\tword-break: break-all;\n\t}\n}\n</style>\n","import { FIELD_META_BASE_SLOTS } from '../kotti-field/meta'\nimport { attachMeta, makeInstallable } from '../utilities'\n\nimport KtValueLabelVue from './KtValueLabel.vue'\nimport { KottiValueLabel } from './types'\n\nexport const KtValueLabel = attachMeta(makeInstallable(KtValueLabelVue), {\n\taddedVersion: '5.3.1',\n\tcomponentFolder: 'kotti-value-label',\n\tdeprecated: null,\n\tdesigns: null,\n\tslots: {\n\t\t...FIELD_META_BASE_SLOTS,\n\t\tdefault: {\n\t\t\tdescription: 'used to render custom content instead of value',\n\t\t\tscope: null,\n\t\t},\n\t},\n\ttypeScript: {\n\t\tnamespace: 'Kotti.ValueLabel',\n\t\tschema: KottiValueLabel.propsSchema,\n\t},\n})\n","// styles\nimport './kotti-style/index.scss'\n\n// components\nimport { KtAccordion } from './kotti-accordion'\nexport * from './kotti-accordion'\nimport { KtActionbar } from './kotti-actionbar'\nexport * from './kotti-actionbar'\nimport { KtAvatar } from './kotti-avatar'\nexport * from './kotti-avatar'\nimport { KtAvatarGroup } from './kotti-avatar-group'\nexport * from './kotti-avatar-group'\nimport { KtBanner } from './kotti-banner'\nexport * from './kotti-banner'\nimport { KtBreadcrumb } from './kotti-breadcrumb'\nexport * from './kotti-breadcrumb'\nimport { KtButton, KtSplitButton } from './kotti-button'\nexport * from './kotti-button'\nimport { KtButtonGroup } from './kotti-button-group'\nexport * from './kotti-button-group'\nimport { KtCard } from './kotti-card'\nexport * from './kotti-card'\nimport { KtCol } from './kotti-col'\nexport * from './kotti-col'\nimport { KtComment, KtCommentInput } from './kotti-comment'\nexport * from './kotti-comment'\nimport { KtDrawer } from './kotti-drawer'\nexport * from './kotti-drawer'\nimport { KtField } from './kotti-field'\nexport * from './kotti-field'\nimport { KtFieldCurrency } from './kotti-field-currency'\nexport * from './kotti-field-currency'\nimport {\n\tKtFieldDate,\n\tKtFieldDateRange,\n\tKtFieldDateTime,\n\tKtFieldDateTimeRange,\n} from './kotti-field-date'\nexport * from './kotti-field-date'\nimport {\n\tKtFieldFileUpload,\n\tKtFieldFileUploadRemote,\n} from './kotti-field-file-upload'\nexport * from './kotti-field-file-upload'\nimport { KtFieldInlineEdit } from './kotti-field-inline-edit'\nexport * from './kotti-field-inline-edit'\nimport { KtFieldNumber } from './kotti-field-number'\nexport * from './kotti-field-number'\nimport { KtFieldPassword } from './kotti-field-password'\nexport * from './kotti-field-password'\nimport { KtFieldRadioGroup } from './kotti-field-radio-group'\nexport * from './kotti-field-radio-group'\nimport {\n\tKtFieldMultiSelect,\n\tKtFieldMultiSelectRemote,\n\tKtFieldSingleSelect,\n\tKtFieldSingleSelectRemote,\n} from './kotti-field-select'\nexport * from './kotti-field-select'\nimport { KtFieldText } from './kotti-field-text'\nexport * from './kotti-field-text'\nimport { KtFieldTextArea } from './kotti-field-text-area'\nexport * from './kotti-field-text-area'\nimport { KtFieldToggle, KtFieldToggleGroup } from './kotti-field-toggle'\nexport * from './kotti-field-toggle'\nimport { KtFileUpload } from './kotti-file-upload'\nexport * from './kotti-file-upload'\nimport { KtFilters } from './kotti-filters'\nexport * from './kotti-filters'\nimport { KtForm } from './kotti-form'\nexport * from './kotti-form'\nimport { KtFormControllerList } from './kotti-form-controller-list'\nexport * from './kotti-form-controller-list'\nimport { KtFormControllerObject } from './kotti-form-controller-object'\nexport * from './kotti-form-controller-object'\nimport { KtFormSubmit } from './kotti-form-submit'\nexport * from './kotti-form-submit'\nimport { KtHeading } from './kotti-heading'\nexport * from './kotti-heading'\nimport { KtI18nContext } from './kotti-i18n'\nexport * from './kotti-i18n'\nimport { KtLine } from './kotti-line'\nexport * from './kotti-line'\nimport { KtModal } from './kotti-modal'\nexport * from './kotti-modal'\nimport { KtNavbar } from './kotti-navbar'\nexport * from './kotti-navbar'\nimport { KtPagination } from './kotti-pagination'\nexport * from './kotti-pagination'\nimport { KtPopover } from './kotti-popover'\nexport * from './kotti-popover'\nimport { KtRow } from './kotti-row'\nexport * from './kotti-row'\nimport { KtStandardTable, KtTable } from './kotti-table'\nexport * from './kotti-table'\nimport {\n\tKtTableLegacy,\n\tKtTableLegacyColumn,\n\tKtTableLegacyConsumer,\n\tKtTableLegacyProvider,\n} from './kotti-table-legacy'\nexport * from './kotti-table-legacy'\nimport { KtTag } from './kotti-tag'\nexport * from './kotti-tag'\nimport { KtToast, KtToaster } from './kotti-toaster'\nexport * from './kotti-toaster'\nimport { KtUserMenu } from './kotti-user-menu'\nexport * from './kotti-user-menu'\nimport type { VueConstructor } from 'vue'\n\nimport { KtValueLabel } from './kotti-value-label'\nexport * from './kotti-value-label'\n\nexport * from './types'\n\nexport default {\n\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\tinstall(Vue: VueConstructor): void {\n\t\tconst components = [\n\t\t\tKtAccordion,\n\t\t\tKtActionbar,\n\t\t\tKtAvatar,\n\t\t\tKtAvatarGroup,\n\t\t\tKtBanner,\n\t\t\tKtBreadcrumb,\n\t\t\tKtButton,\n\t\t\tKtButtonGroup,\n\t\t\tKtCard,\n\t\t\tKtCol,\n\t\t\tKtComment,\n\t\t\tKtCommentInput,\n\t\t\tKtDrawer,\n\t\t\tKtField,\n\t\t\tKtFieldCurrency,\n\t\t\tKtFieldDate,\n\t\t\tKtFieldDateRange,\n\t\t\tKtFieldDateTime,\n\t\t\tKtFieldDateTimeRange,\n\t\t\tKtFieldFileUpload,\n\t\t\tKtFieldFileUploadRemote,\n\t\t\tKtFieldInlineEdit,\n\t\t\tKtFieldMultiSelect,\n\t\t\tKtFieldMultiSelectRemote,\n\t\t\tKtFieldNumber,\n\t\t\tKtFieldPassword,\n\t\t\tKtFieldRadioGroup,\n\t\t\tKtFieldSingleSelect,\n\t\t\tKtFieldSingleSelectRemote,\n\t\t\tKtFieldText,\n\t\t\tKtFieldTextArea,\n\t\t\tKtFieldToggle,\n\t\t\tKtFieldToggleGroup,\n\t\t\tKtFileUpload,\n\t\t\tKtFilters,\n\t\t\tKtForm,\n\t\t\tKtFormControllerList,\n\t\t\tKtFormControllerObject,\n\t\t\tKtFormSubmit,\n\t\t\tKtHeading,\n\t\t\tKtI18nContext,\n\t\t\tKtLine,\n\t\t\tKtModal,\n\t\t\tKtNavbar,\n\t\t\tKtPagination,\n\t\t\tKtPopover,\n\t\t\tKtRow,\n\t\t\tKtStandardTable,\n\t\t\tKtSplitButton,\n\t\t\tKtTable,\n\t\t\tKtTableLegacy,\n\t\t\tKtTableLegacyColumn,\n\t\t\tKtTableLegacyConsumer,\n\t\t\tKtTableLegacyProvider,\n\t\t\tKtTag,\n\t\t\tKtToast,\n\t\t\tKtToaster,\n\t\t\tKtUserMenu,\n\t\t\tKtValueLabel,\n\t\t]\n\t\tfor (const component of components) {\n\t\t\tVue.use(component)\n\t\t}\n\t},\n}\n"],"names":["KottiAccordion","z","yocoIconSchema","KottiActionbar","createLooseZodEnumSchema","someEnum","enumValues","KottiAvatar","Size","refinementNonEmpty","array","KottiAvatarGroup","itemSchema","KottiBanner","KottiBreadcrumb","SeparatorType","Yoco","Shared","IconPosition","KottiButton","ToggleStatus","Type","KottiSplitButton","KottiCard","ImagePosition","defaultParser","message","escape","defaultPostEscapeParser","resizeTextarea","textarea","idSchema","KottiComment","parseFunctionSchema","sharedSchema","Reply","Entry","Actions","Header","InlineEdit","TextArea","KottiCommentInput","KottiDrawer","FORM_KEY_NONE","KottiField","Validation","AutoComplete","KottiFieldCurrency","VALUE_PROP_REGEX","EL_SHARED_INTERNAL_PROPS","EL_DATE_RANGE_PROPS","Dashes","EL_DATE_PROPS","EL_DATE_TIME_PROPS","DATE_FORMAT_REGEX","DATE_TIME_FORMAT_REGEX","KOTTI_FIELD_DATE_SUPPORTS","KottiFieldDate","KottiFieldDateRange","KottiFieldDateTime","KottiFieldDateTimeRange","ActionButton","DropArea","FileItem","TakePhoto","KottiFieldFileUpload","Status","KottiFieldFileUploadRemote","ProgressBar","KottiFieldInlineEdit","ConfirmationValidation","TextStyle","KottiFieldNumber","Align","KottiFieldPassword","KottiFieldRadioGroup","options","value","KottiFieldMultiSelect","KottiFieldMultiSelectRemote","KottiFieldSingleSelect","KottiFieldSingleSelectRemote","KottiFieldTextArea","KottiFieldText","KottiFieldToggle","KottiFieldToggleGroup","key","KottiFileUpload","status","val","KottiFilters","ButtonLinkType","FilterType","Operation","Boolean","Currency","DateRange","Float","Integer","MultiEnum","Search","SingleEnum","String","KottiHeading","KottiLine","Position","KottiModal","KottiNavbar","Theme","KottiPagination","PagingStyle","baseOptionSchema","KottiPopover","Placement","Trigger","IconTextItem","KottiRow","Justify","KottiTableLegacy","Column","DEFAULT_PAGE_SIZE","DEFAULT_PAGE_SIZE_OPTIONS","MIN_PAGE_SIZE","KottiStandardTable","FilterOperation","NumberRange","sharedFilterSchema","booleanFilterSchema","dateRangeFilterSchema","multiSelectFilterSchema","numberRangeFilterSchema","singleSelectFilterSchema","sharedPaginationSchema","entry","entryIndex","KottiTable","KottiTag","KottiToaster","KottiToast","KottiUserMenu","KottiValueLabel","DecimalSeparator","MetaDesignType","attachMeta","component","meta","other","isInFocus","element","blurElement","isOrContainsEventTarget","eventTarget","makeInstallable","Vue","isNumberInRange","maximum","minimum","fitsMinimum","fitsMaximum","DECIMAL_SEPARATORS_CHARACTER_SET","NEVER","setUnion","sets","result","set","item","propValidator","isNever","propName","propSchema","validator","clonedValue","cloneDeep","error","walkSchemaTypes","schema","typeName","innerType","def","x","ignoredZodTypes","zodToVueType","makeProps","propsSchema","zodTypeSet","propDefinition","vuePropTypes","uniq","zodTypeName","getDefaultOptions","useSlideAnimation","isContentOpen","finalOptions","getRawHeight","executeAnimation","willOpen","animatedObject","frames","height","animation","watch","shouldBeShown","wasShown","ANIMATION_DURATION","_sfc_main$1K","defineComponent","props","emit","contentInnerRef","ref","computed","KtAccordion","KtAccordionVue","_sfc_main$1J","_sfc_main$1I","ActionbarMenu","KtActionbar","KtActionbarVue","DEFAULT_DEBOUNCE","ISO8601","ISO8601_SECONDS","ONE_HUNDRED_PERCENT","TIPPY_DISTANCE_OFFSET","_sfc_main$1H","slots","avatarFallback","contentRef","triggerRef","hideTippy","useTippy","onMounted","event","KtAvatar","KtAvatarVue","_sfc_main$1G","_item","index","KtAvatarGroup","KtAvatarGroupVue","_sfc_main$1F","helpTextContentRef","helpTextTriggerRef","hasSlot","isIconButton","showHelpText","isToggle","_sfc_main$1E","itemRef","focusListener","onBeforeUnmount","hasFocus","hadFocus","useActionsTippy","isDisabled","isLoading","isTippyOpen","tippyContentRef","tippyInstanceRef","tippyTriggerRef","setIsTippyOpen","isOpen","instance","tippyEl","containerEl","UNSET_INDEX","_sfc_main$1D","ActionsItem","currentActionIndexInFocus","hasAvailableActions","action","getNextAvailableActionIndex","currentIndex","direction","step","nextIndex","keydownListener","actionIndex","omit","componentFolder","KtButton","KtButtonVue","KtSplitButton","KtSplitButtonVue","_sfc_main$1C","styles","KtBanner","KtBannerVue","_sfc_main$1B","KtBreadcrumb","KtBreadcrumbVue","_sfc_main$1A","KtButtonGroup","KtButtonGroupVue","_sfc_main$1z","hasActions","KtCard","KtCardVue","KT_ROW_CONTEXT","KtCol","context","inject","style","gap","gutter","classes","h","KT_I18N_CONTEXT","Common","deDE","enUS","esES","frFR","jaJP","fixDeepMerge","y","deepmerge","useI18nContext","reactive","useTranslationNamespace","namespace","accessDefaultKey","obj","current","i","useI18nProvide","currencyMap","locale","messages","numberFormat","defaultMessages","newValue","elementUiTranslations","resolvedEsModuleInterop","elementLocale","provide","_sfc_main$1y","_","translations","_sfc_main$1x","useResizeTextarea","textareaRef","_sfc_main$1w","containerRef","showCancelMessage","blurTextarea","focusTextarea","onCancel","onClick","onUnmounted","isNil","_sfc_main$1v","CommentTextArea","localMessage","isEditing","wasEditing","payload","_sfc_main$1u","CommentActions","CommentHeader","CommentInlineEdit","pick","_sfc_main$1t","localIsInternal","isInternal","commentType","_sfc_main$1s","CommentEntry","KtCommentInput","userToReply","rootDataTest","user","META","KtComment","KtCommentVue","KtCommentInputVue","_sfc_main$1r","isExpanded","KtDrawer","KtDrawerVue","_sfc_main$1q","KT_FORM_CONTEXT","KT_FORM_SUBMIT_CONTEXT","createErrorMessage","DisabledSetValueCalledError","ImplicitFormKeyNoneError","InvalidPropOutsideOfContextError","ktFieldErrors","ktFieldId","useDecoration","supports","useInputProps","id","formPath","useTexts","useValue","isEmpty","newFormKey","currentValue","useValidation","hideValidation","isMissingRequiredField","customValidation","useInheritableProperties","useShared","defaultValue","useNotifyContext","field","useField","sharedProperties","values","useInput","fieldId","useForceUpdate","forceUpdateKey","useKtFieldRef","useEmitBlur","fieldTarget","findEventTarget","valueOverride","lastEventTarget","isFieldTargeted","target","ft","onClickOrFocusChange","wasFieldTargetedBefore","onBeforeMount","LABEL_CLICK_DEBOUNCE","_sfc_main$1p","FieldHelpText","inputId","valueVisibility","validationType","showValidation","clickInput","focusInput","debouncedLabelClick","debounce","modifications","modification","KtField","KtFieldVue","FIELD_META_BASE_SLOTS","KOTTI_FIELD_CURRENCY_SUPPORTS","VALID_REGEX","toNumber","truncate","decimalPlaces","Big","replaceDecimalSeparator","string","decimalSeparator","toFixedPrecisionString","number","formatCurrencyUserInput","isNegativeValue","strippedSign","withoutDecimalPoint","relocatedDecimalPoint","shouldClear","oldValue","isOldValueZeroOrNull","isNewValueZero","isDeleting","_sfc_main$1o","i18nContext","ktFieldRef","currencyFormat","inputRef","userCursorPositionFromRight","setCursorPosition","position","nextTick","newPosition","forceUpdate","internalStringValue","newFormat","newNumber","newDecimalPlaces","newDecimalSeparator","newCurrencyFormat","startPosition","isValid","nextString","isTypedNumberValid","emitNull","KtFieldCurrency","KtFieldCurrencyVue","KT_IS_IN_POPOVER","getDateComponent","elDateRef","dateComponent","isPickerVisible","useInputDecoration","icon","prefixIcon","suffixIcon","watchEffect","showClear","useInputSizeFix","elInputs","usePickerDimensionsFix","popperHeight","popperWidth","usePickerInnerInputsFix","input","usePickerMisplacementFix","usePickerNavigationIcons","insertYocoIcon","pickerHeaderIcons","headerYocoIcons","usePickerPlacementFix","inputContainerRef","ktFieldDateInputContainer","useRangePickerHeaderFix","dates","header","fullDate","usePicker","isInvalidDate","date","maximumDate","minimumDate","dayjs","_sfc_main$1n","ElDate","pickerOptions","keepOpen","label","picker","isInPopover","_sfc_main$1m","dateRangeValue","_picker","_sfc_main$1l","_sfc_main$1k","dateTimeRangeValue","dateTime","DESIGN_URL","KtFieldDate","KtFieldDateVue","KtFieldDateRange","KtFieldDateRangeVue","KtFieldDateTime","KtFieldDateTimeVue","KtFieldDateTimeRange","KtFieldDateTimeRangeVue","ErrorCodes","KOTTI_FIELD_FILE_UPLOAD_SUPPORTS","formatExtensions","extensions","collapseExtensionsAfter","extension","formatFileSize","fileSize","round","filesize","buildAcceptString","isSelectingMultipleFilesWhenNotAllowed","allowMultiple","selectionSize","isValidFileSize","maxFileSize","isValidFileExtension","fileName","validFileExtensions","fileExtension","validateFile","isValidValueNonRemote","fileItem","isValidValueRemote","isValidValue","type","_sfc_main$1j","isDragging","isError","isFileExplorerOpen","isHovering","uploadInputRef","informationText","str","emitFiles","files","items","_sfc_main$1i","_sfc_main$1h","_sfc_main$1g","ItemLayout","statusText","_sfc_main$1f","errorMessage","_sfc_main$1e","targetRef","popper","name","shouldOpen","wasOpen","KtModal","KtModalVue","blobToFile","blob","generateImageFileAndUrl","canvasEl","videoEl","videoHeight","videoWidth","resolve","file","photoUrl","isWebRTCSupported","getConnectedCameras","device","requestCamera","cameraId","constraints","stopCameraStream","stream","track","_sfc_main$1d","cameraIndex","cameraList","shouldOpenModal","state","videoRef","findCameras","startCamera","stopCamera","canvas","_sfc_main$1c","errors","_sfc_main$1b","State","_sfc_main$1a","CapturePhoto","Error","ReviewPhoto","reset","err","buildFileItem","shortid","buildFileInfo","isPreUploaded","validation","_sfc_main$19","PreUploadedFileItem","preUploadedFilesIds","setStatus","filesList","fileInfo","showDropArea","_sfc_main$18","_sfc_main$17","progressBarForceRenderKey","shouldTriggerRemoteUpload","newStatus","isUploaded","progress","buildPreUploadedFileInfo","_sfc_main$16","FileItemRemote","newUploadedFiles","preUploadedFiles","setStatuses","newPayload","oldPayload","newStatuses","fileItemStatus","url","KtFieldFileUpload","KtFieldFileUploadVue","KtFieldFileUploadRemote","KtFieldFileUploadRemoteVue","KOTTI_FIELD_INLINE_EDIT_SUPPORTS","_sfc_main$15","_sfc_main$14","resizeField","scrollHeight","useAdjustHeight","_inputRef","usePreventConfirm","fieldValidation","_sfc_main$13","ConfirmButton","EditIcon","inputContainerWrapperRef","updateIsEditing","shouldEdit","modifiedField","toRefs","fieldPlaceholder","setFieldValue","preEditingValue","preventConfirm","onConfirm","onMouseDown","isClickOutside","onFocusChange","wasFieldTriggered","isFieldTriggered","sharedProps","KtFieldInlineEdit","KtFieldInlineEditVue","KOTTI_FIELD_NUMBER_SUPPORTS","STRINGS_THAT_ARE_TREATED_AS_NULL","LEADING_ZEROES_REGEX","TRAILING_ZEROES_REGEX","isStepMultiple","stepFactor","toString","_sfc_main$12","isDecrementEnabled","isIncrementEnabled","lastValidTypedStringValue","forceUpdateDisplayedValue","showMaximum","lastUserSetCursorPosition","canFallbackToZero","decrementValue","incrementValue","valueWithoutLeadingZeroes","nextNumber","valueWithSupportedDecimalSeparator","newCursorPosition","KtFieldNumber","KtFieldNumberVue","KOTTI_FIELD_PASSWORD_SUPPORTS","_sfc_main$11","fieldType","isValueHidden","KtFieldPassword","KtFieldPasswordVue","KOTTI_FIELD_RADIO_GROUP_SUPPORTS","_sfc_main$10","option","KtFieldRadioGroup","KtFieldRadioGroupVue","KOTTI_FIELD_SELECT_SUPPORTS","_sfc_main$$","KtTag","KtTagVue","sameWidth","triggerReferenceWidth","TIPPY_CONTENT_WRAPPER_CLASSES","isTippyContentWrapper","className","useSelectTippy","triggerTargets","tippyRef","isDropdownOpen","isDropdownMounted","tippy","setIsDropdownOpen","showTippy","tippys","castArray","_sfc_main$_","_sfc_main$Z","optionRef","isHovered","wasHovered","distanceFromParentTop","mod","divisor","_sfc_main$Y","FieldSelectOptionsItem","optionsRef","modifiedActions","camelCase","modifiedOptions","isLimitReached","isSelected","collator","a","b","hoveredIndex","resetHoveredIndex","itemCount","selectOption","v","onAction","listener","optionsLength","optionsCount","optionDistanceToOptionsTop","UPDATE_QUERY","_sfc_main$X","ActionIcon","FieldSelectOptions","rawEmit","isFieldFocused","isFieldHovered","localQuery","selectTippy","deleteQuery","isMounted","queryValue","seenValueLabelMap","isInputVisible","o","_sfc_main$W","GenericSelectField","_sfc_main$V","_sfc_main$U","_sfc_main$T","KtFieldSingleSelect","KtFieldSingleSelectVue","KtFieldSingleSelectRemote","KtFieldSingleSelectRemoteVue","KtFieldMultiSelect","KtFieldMultiSelectVue","KtFieldMultiSelectRemote","KtFieldMultiSelectRemoteVue","KOTTI_FIELD_TEXT_SUPPORTS","_sfc_main$S","KtFieldText","KtFieldTextVue","KOTTI_FIELD_TEXT_AREA_SUPPORTS","HEIGHT_OFFSET","autoSize","maxHeight","_sfc_main$R","KtFieldTextArea","KtFieldTextAreaVue","KOTTI_FIELD_TOGGLE_SUPPORTS","_sfc_main$Q","_sfc_main$P","_sfc_main$O","ToggleBox","ToggleSwitch","isBox","_sfc_main$N","ToggleInner","helpText","showHelpTextAsInnerSuffix","_sfc_main$M","designs","KtFieldToggle","KtFieldToggleVue","KtFieldToggleGroup","KtFieldToggleGroupVue","_sfc_main$L","isDeletable","size","eventName","s","ktFileUploadId","_sfc_main$K","UploadedFileItem","interceptedFiles","preUploadedFileIds","uploadedFilesList","fileId","interceptedFileIndex","KtFileUpload","KtFileUploadVue","_sfc_main$J","isYocoIcon","mainClasses","_sfc_main$I","ButtonLink","getFilterEmptyValue","getFilterInitialOperation","operations","defaultOperation","getFilterInitialState","columnKey","columns","column","columnItem","getOperationOptions","operation","getSearchFilterInitialState","searchColumn","getValueComponent","filterType","isEmptyOperation","filterOperation","createOnSubmitErrorMessage","UnexpectedValidationStateError","_props","ValidationError","validations","ktFormErrors","getValidationSummary","accumulator","_sfc_main$H","currentFieldsWrapper","toAdd","toRemove","valueIsValid","validationSummary","onSubmitData","KtForm","KtFormVue","_sfc_main$G","operationOptions","newFilter","_sfc_main$F","FilterRow","currentFiltersKeys","filter","selectedColumnKey","filterKey","updatedFilters","oldFilterKey","updatedFilter","oldFilter","_sfc_main$E","isNonEmptyString","isValueInEnum","enumObject","areValidOperations","isValidColumn","isValidKey","isValidLabel","_sfc_main$D","FilterActions","FilterList","FilterSearch","listContentRef","listTriggerRef","isAddingFilter","isListVisible","filterListColumns","searchValue","filterListValues","isAddDisabled","isClearAllDisabled","filterLabel","filtersCount","clearAll","setFilters","filters","setSearchFilter","searchFilter","KtFilters","KtFiltersVue","_sfc_main$C","formKey","_sfc_main$B","FormControllerListItem","valuesList","newRow","newValuesList","sharedHeaderFooterScope","KtFormControllerList","KtFormControllerListVue","_sfc_main$A","errorText","setValue","newFormValues","KtFormControllerObject","KtFormControllerObjectVue","InvalidSubmitOutsideContextError","ktFormSubmitErrors","_sfc_main$z","warnings","KtFormSubmit","KtFormSubmitVue","_sfc_main$y","KtHeading","KtHeadingVue","KtI18nContext","KtI18nContextVue","_sfc_main$x","KtLine","KtLineVue","_sfc_main$w","_sfc_main$v","NavbarTooltip","_sfc_main$u","_sfc_main","_sfc_main$s","KT_NAVBAR_CONTEXT","NAVBAR_THEME","_sfc_main$r","NavbarLogo","NavbarMenu","NavbarNotification","NavbarQuickLink","mobileMenuRef","navbarRef","newTheme","rootElement","isNarrow","KtNavbar","KtNavbarVue","_sfc_main$q","page","ADJACENT_MULTIPLIER","BASE_NUMBER_WIDTH","BASE_OFFSET","MAX_NUMBER_OF_ELEMENTS","PIXEL_MULTIPLIER","_sfc_main$p","pixelMargin","digitWidth","numberWidth","baseElementsWidth","adjacentPagesOffset","neighborValues","center","start","end","range","showFirstPage","showLastPage","_sfc_main$o","_sfc_main$n","PaginationExpanded","PaginationFlexible","PaginationFractionated","pageAmount","isFlexLogical","KtPagination","KtPaginationVue","_sfc_main$m","TRIGGER_MAP","_sfc_main$l","showPopover","formContext","newRef","childrenArray","child","close","setIsShown","open","KtPopover","KtPopoverVue","KtRow","_sfc_main$k","optionValue","getEmptyValue","getOptionLabel","formatFilterValue","_value","min","max","unit","isEmptyValue","getReorderedRange","_sfc_main$j","getToday","templateFormat","getLast","_sfc_main$i","_sfc_main$h","_sfc_main$g","reOrderAndEmitRangeValue","newRange","isEqual","newMax","newMin","_sfc_main$f","_sfc_main$e","BooleanFilter","DateRangeFilter","MultiSelectFilter","NumberRangeFilter","SingleSelectFilter","updatedValueList","_sfc_main$d","separatorRegex","pluralize","translation","count","cases","_sfc_main$c","_sfc_main$b","_sfc_main$a","_sfc_main$9","internalValue","emitValue","getStandardTableContextKey","useProvideStandardTableContext","standardTableContext","useStandardTableContext","getTableContextKey","useProvideTableContext","tableContext","useTableContext","_sfc_main$8","TableColumns","TableFilters","TableGlobalSelection","TablePageSize","TablePagination","TableSearch","appliedFilters","tablePagination","ordering","pagination","search","formattedValue","row","createTextVNode","text","FlexRender","rendered","useVueTable","resolvedOptions","internalTable","createTable","table","shallowRef","optionsVal","stateVal","prev","updater","useComputedRef","external","EXPANSION_COLUMN_ID","SELECTION_COLUMN_ID","ARRAY_START","paramsSchema","useKottiTable","_params","params","columnHelper","createColumnHelper","columnIdSet","c","rowIdSet","data","getRowBehavior","rowIndex","columnOrder","columnId","selectedRows","expandedRows","rowId","sorting","hiddenColumns","newSet","newVisibilityState","triggerExpand","draggedColumnId","dropTargetColumnIndex","successfullyDroppedColumnId","getMovedColumnOrder","fromColumnId","toIndex","fromIndex","newOrder","getCellClasses","cellType","classNames","info","getCoreRowModel","getExpandedRowModel","columnIndex","DEFAULT_CELL_WRAPPER","getCellWrapComponent","behavior","triggerExpanded","click","TRANSFER_TYPE","SORT_BEHAVIOR_MAP","SORT_ORDER_COUNT","_sfc_main$7","isColumnMoveDataTransfer","wrapComponent","cell","elementWidth","elementX","isLeftHalf","targetIndex","_event","sortBehavior","currentSortIndex","headerRow","headerIndex","simpleHash","strings","maximumLength","acc","next","charIndex","char","simpleHashedValue","serializableStateSchema","DummyStorageAdapter","localStorageSchema","LocalStorageAdapter","#manualVersion","#storageKey","manualVersion","json","#validateVersionHash","version","#getVersionHash","columnIds","correctHash","givenHash","OPERATION_MAP","KottiTableHookParamsSchema","useKottiStandardTable","filterInfo","rowCount","filtersWithDefaultValue","appliedFilter","pageIndex","_pageSize","pageSize","pageSizeOptions","pageFirstRowIndex","sliceStart","sliceEnd","storageAdapter","tableHook","storageOperationContext","rawState","newState","oldState","numberFormatter","getDisplay","param","i18n","color","formatString","getCustomDisplay","createColumnContext","SORT_MAP","getNumericalSorter","mapper","mode","map","valueA","valueB","getDateSorter","getTextSorter","useLocalSort","locallySortedData","rawData","sortingFunctions","sort","clone","TABLE_META","STANDARD_META","KtTable","KtTableVue","KtStandardTable","KtStandardTableVue","IS_ASC","IS_DSC","KT_TABLE","KT_STORE","KT_TABLE_STATE_PROVIDER","COLUMN_TYPE","DEFAULT_DISABLE_ROW","PUBLIC_SORT_PROPS","PUBLIC_COLUMN_PROPS","DEFAULT_RENDER_CELL","_h","DEFAULT_RENDER_HEADER","TableBodyEmptyRow","tableState","colSpan","render","TableBodyExpandRow","tableStore","TableBodyLoadingRow","TableRowCell","property","_tdClasses","_cellClass","_tdStyles","cellClick","$event","TableRow","hasClickListener","isFocusedRow","isExpandable","isInteractive","isSelectable","isSelectedRow","expandToggleIcon","renderActions","tableColumns","_trClasses","handleActionsClick","handleBlur","handleClick","handleExpand","handleFocus","handleKey","handleSelect","TableBody","rows","loading","showEmptyText","getRowKey","TableHeaderCell","_sfc_main$6","dropTargetColumn","draggedColumn","useColumnDragToOrder","isDraggedOver","useQuickSortControl","canSort","isSorted","columnIdSeed","updateColumnsfor","prop","newVal","KtTableLegacyColumn","createColumn","_self","renderCell","renderHeader","getFilteredColumnIndex","defaultState","mutations","store","setColumnsArray","getters","setFilteredColumn","getHiddenColumnIndex","getResolvedHiddenColumns","_deleted","hidden","removeHiddenColumn","setHiddenColumn","hide","byOrder","getOrderedColumns","col","resolveColumnsOrder","_columns","_columnsArray","order","fromColumn","toColumn","getColumnIndex","getColumnRealIndex","getSortedColumnIndex","setSortedColumn","getSortedColumn","getNextSortOrder","length","getSortValue","by","compareArray","sortArray","byProp","aVal","bVal","compare","sortBy","sortMethod","sortOrder","orderBy","sortedColumns","sortData","sortedColumnNotYetSet","isSortingThroughAPICall","columnProp","columnInStore","shapeKeys","oldColumn","emitColumnsChange","didRestoreDestroyedColumns","_destroyedColumns","sum","n","deleted","newColumn","isNewColumnPropDefined","isOldColumnSlotDefined","pickBy","columnsEntry","pickedColumn","emitChange","refreshColumnArray","getDisabledRows","disableRow","getEnabledRows","negate","toggleRowExpansion","expanded","elem","shouldExpand","e","toggleRowSelection","selected","changed","selection","selectedRow","updateAllSelected","cleanSelection","rowKey","initialSelectionLength","rowsSet","clearSelection","enabledRows","isAllRowsDisabled","shouldSelectAll","_data","dataInstanceChanged","TableStore","initialState","column.defaultState","disable.defaultState","expand.defaultState","filter.defaultState","hide.defaultState","order.defaultState","rows.defaultState","select.defaultState","sort.defaultState","column.mutations","disable.mutations","expand.mutations","filter.mutations","hide.mutations","order.mutations","rows.mutations","select.mutations","sort.mutations","column.getters","rows.getters","expand.getters","order.getters","disable.getters","select.getters","hide.getters","sort.getters","filter.getters","args","isUndefined","tableIdSeed","INITIAL_TABLE_STORE_PROPS","_sfc_main$5","TableHeader","localStore","rowData","newId","TableColumnsStateMixin","toggle","KtTableLegacyConsumer","filteredColumns","hideColumn","showAllColumns","orderBeforeColumn","tableProviderIdSeed","KtTableLegacyProvider","KtTableLegacy","KtTableLegacyVue","KtTableLegacyColumnVue","KtTableLegacyProviderVue","KtTableLegacyConsumerVue","TOAST_CONTEXT","_sfc_main$4","_sfc_main$3","_sfc_main$2","KtToast","KtToastProvider","currentToasts","api","activeToasts","toast","createDeferred","reject","promise","res","rej","customSchema","durationSchema","metadataSchema","renderedMessageSchema","messageSchema","nanoid","createToasterOptions","animationFrameId","update","animate","INTERNAL_ABORT","calculateProgress","now","unclamped","createToaster","_options","fifoToasterQueue","subscriber","notifySubscriber","deleteToastFromActiveToasts","toastId","removedToast","deleteToastFromFifoQueue","deleteAndAbortToast","abortController","updateActiveToasts","_dirty","dirty","isRunning","isNowEmpty","show","doneDeferred","signal","baseOptions","deleteId","handler","KtToaster","KtToasterVue","KtToastVue","_sfc_main$1","userMenuRef","isMenuOpen","KtUserMenu","KtUserMenuVue","hasHelpText","hasLabel","KtValueLabel","KtValueLabelVue","components"],"mappings":"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4qCC5Eao7C,GAAex1C,EAAWS,EAAgBg1C,EAAe,EAAG,CACxE,aAAc,QACd,gBAAiB,oBACjB,WAAY,KACZ,QAAS,KACT,MAAO,CACN,GAAG/iC,EACH,QAAS,CACR,YAAa,iDACb,MAAO,IAAA,CAET,EACA,WAAY,CACX,UAAW,mBACX,OAAQ7S,GAAgB,WAAA,CAE1B,CAAC,EC6FcgG,GAAA,CAEd,QAAQnF,EAA2B,CAClC,MAAMg1C,EAAa,CAClBtxC,GACAK,GACAgB,GACAK,GACAgD,GACAG,GACAT,GACAY,GACAI,GACAG,GACA0E,GACAL,GACAU,GACA8D,EACA8C,GACAqD,GACAE,GACAE,GACAE,GACA2H,GACAE,GACA8B,GACA4G,GACAE,GACAvF,GACAM,GACAK,GACAsE,GACAE,GACAQ,GACAO,GACAe,GACAE,GACAe,GACAkF,GACA3C,GACAqD,GACAM,GACAM,GACAG,GACAE,GACAG,GACAhX,GACAoY,GACA6B,GACAa,GACAE,GACAoN,GACA/7B,GACA67B,GACA+M,GACA7I,GACAsI,GACAM,GACAnsB,GACA6sB,GACA+C,GACAM,GACAI,EACD,EACA,UAAWv1C,KAAay1C,EACvBh1C,EAAI,IAAIT,CAAS,CAClB,CAEF"}