@propelinc/citrus-ui 1.3.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/citrus-ui.cdn.css +1 -1
- package/dist/citrus-ui.css +1 -1
- package/dist/colors/colors.d.ts +12 -0
- package/dist/components/CBadge.vue.d.ts +0 -1
- package/dist/components/CCard.vue.d.ts +0 -5
- package/dist/components/CIconButton.vue.d.ts +0 -6
- package/dist/components/CMaskedTextField.vue.d.ts +23 -60
- package/dist/components/CPhoneField.vue.d.ts +40 -92
- package/dist/components/CProgressRing.vue.d.ts +0 -1
- package/dist/components/CSelect.vue.d.ts +0 -4
- package/dist/components/CSkeleton.vue.d.ts +5 -1
- package/dist/components/CSkeletonLoaderCard.vue.d.ts +3 -0
- package/dist/components/CSplitInput.vue.d.ts +1 -5
- package/dist/components/CSsnField.vue.d.ts +41 -95
- package/dist/components/CSwitchListItem.vue.d.ts +1 -4
- package/dist/components/CTextArea.vue.d.ts +3 -8
- package/dist/components/CTextField.vue.d.ts +6 -14
- package/dist/components/CTextLink.vue.d.ts +0 -3
- package/dist/components/CZipcodeField.vue.d.ts +42 -96
- package/dist/components/index.d.ts +0 -2
- package/dist/composables/colors.d.ts +3 -2
- package/dist/composables/input-mask.d.ts +2 -2
- package/dist/composables/toast.d.ts +1 -0
- package/dist/index.cdn.mjs +4490 -4689
- package/dist/index.cdn.mjs.map +1 -1
- package/dist/index.mjs +1594 -1657
- package/dist/index.mjs.map +1 -1
- package/dist/src/assets/fonts/grenette-regular.woff2 +0 -0
- package/dist/src/assets/fonts/grenette-semibold.woff2 +0 -0
- package/dist/src/assets/fonts/polymath.woff2 +0 -0
- package/dist/styles.css +33 -34
- package/package.json +6 -4
- package/src/colors/colors.ts +44 -0
- package/src/colors/util-classes.ts +4 -0
- package/src/components/CAppBar.vue +3 -3
- package/src/components/CBadge.vue +3 -4
- package/src/components/CBottomSheet.vue +2 -2
- package/src/components/CCard.vue +3 -8
- package/src/components/CIconButton.vue +0 -6
- package/src/components/CLoader.vue +3 -3
- package/src/components/CMaskedTextField.vue +4 -9
- package/src/components/CNotification.vue +1 -0
- package/src/components/CProgressRing.vue +3 -4
- package/src/components/CSelect.vue +0 -4
- package/src/components/CSkeleton.vue +12 -1
- package/src/components/CSkeletonLoaderCard.vue +4 -1
- package/src/components/CSkeletonLoaderText.vue +3 -3
- package/src/components/CSplitInput.vue +1 -5
- package/src/components/CSquaredIcon.vue +2 -2
- package/src/components/CSsnField.vue +1 -3
- package/src/components/CSwitchListItem.vue +1 -4
- package/src/components/CTextArea.vue +3 -8
- package/src/components/CTextField.vue +3 -11
- package/src/components/CTextLink.vue +0 -3
- package/src/components/CToast.vue +3 -3
- package/src/components/CToastsList.vue +1 -0
- package/src/components/CZipcodeField.vue +2 -4
- package/src/components/index.ts +0 -2
- package/src/composables/colors.ts +12 -4
- package/src/composables/input-mask.ts +4 -4
- package/src/composables/toast.ts +1 -0
- package/src/styles/_core.scss +12 -10
- package/src/styles/_typography.scss +4 -0
- package/src/styles/layer-order.css +1 -0
- package/src/styles/tailwind.css +3 -0
- package/src/styles/variables.scss +15 -14
- package/dist/components/CCol.vue.d.ts +0 -30
- package/dist/components/CRow.vue.d.ts +0 -41
- package/src/components/CCol.vue +0 -54
- package/src/components/CRow.vue +0 -64
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/services/injections/accordions.ts","../src/components/CAccordion.vue","../src/composables/animation.ts","../src/composables/binding.ts","../src/components/CAccordionItem.vue","../src/colors/colors.ts","../src/components/CFadeTransition.vue","../src/composables/colors.ts","../src/components/CLoader.vue","../src/services/injections/icon-buttons.ts","../src/components/CAppBar.vue","../src/components/CBadge.vue","../src/services/injections/buttons.ts","../src/components/CButtonStack.vue","../src/services/directives/scroll-into-view.ts","../src/services/directives/tap-animation.ts","../src/components/internal/CCloseButton.vue","../src/composables/elements.ts","../src/composables/gestures.ts","../src/composables/slots.ts","../src/services/animation.ts","../src/components/CBottomSheet.vue","../src/composables/router.ts","../src/components/CButton/CButton.vue","../src/components/CCardHeader.vue","../src/components/CCard.vue","../src/components/CCardFooter.vue","../src/components/CCardSection.vue","../src/components/CValidationMessage.vue","../src/composables/id.ts","../src/services/injections/forms.ts","../src/composables/validations.ts","../src/components/CCheckbox.vue","../src/components/CCol.vue","../src/components/CDivider.vue","../src/components/CFormFieldCounter.vue","../src/composables/accessibility.ts","../src/components/CIconButton.vue","../src/composables/i18n.ts","../src/components/CTextField.vue","../src/composables/input-mask.ts","../src/components/CMaskedTextField.vue","../../shared-utils/src/dates.ts","../../shared-utils/src/validators.ts","../src/components/CDobField.vue","../src/components/CSelect.vue","../src/components/CDobSelect.vue","../src/components/CEmailField.vue","../src/services/injections/animations.ts","../src/components/CExpandTransition.vue","../src/components/CFileInput.vue","../src/components/CFixedPageFooter.vue","../src/components/CForm.vue","../src/components/CLabel.vue","../src/components/CListItemContent.vue","../src/components/CSquaredIcon.vue","../src/components/CListItemIcon.vue","../src/components/CListItem.vue","../src/assets/logos/propel/icon.svg","../src/assets/logos/propel/lockup.svg","../src/components/CLogo.vue","../src/components/CMenu.vue","../src/components/CMenuItem.vue","../src/components/CMenuLabel.vue","../src/components/CModal.vue","../src/components/CModalLoading.vue","../src/components/CNotification.vue","../src/composables/fields.ts","../src/components/CPhoneField.vue","../src/services/injections/pills.ts","../src/components/CPill.vue","../src/components/CPillGroup.vue","../src/components/CPopup.vue","../src/components/CProgressLinear.vue","../src/components/CProgressRing.vue","../src/services/injections/radio.ts","../src/components/CRadio.vue","../src/components/CRadioGroup.vue","../src/components/CRebrand.vue","../src/components/CRow.vue","../src/components/CSafeArea.vue","../src/components/CSectionHeader.vue","../src/components/CSkeleton.vue","../src/components/CSkeletonLoaderCard.vue","../src/components/CSkeletonLoaderCircle.vue","../src/components/CSkeletonLoaderText.vue","../src/components/CSlideFadeTransition.vue","../src/components/CSplitInput.vue","../src/components/CSsnField.vue","../src/components/CStatusDot.vue","../src/components/CSwitch.vue","../src/components/CSwitchListItem.vue","../src/components/CTextArea.vue","../src/components/CTextLink.vue","../src/components/CThirdPartyLogo.vue","../src/components/CTimeago.vue","../src/components/CToast.vue","../src/composables/toast.ts","../src/components/CToastsList.vue","../src/components/CZipcodeField.vue","../src/plugin.ts","../src/colors/theme.ts","../src/theme/icons.ts","../src/types.ts"],"sourcesContent":["import type { InjectionKey, Ref } from 'vue';\n\nexport const FLUID = Symbol('fluid') as InjectionKey<Ref<boolean>>;\nexport const ON_TOGGLE = Symbol('on-toggle') as InjectionKey<() => void>;\n","<template>\n <div ref=\"accordion\" data-test=\"accordion\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type SlDetails from '@shoelace-style/shoelace/dist/components/details/details';\nimport type { VNode } from 'vue';\nimport { nextTick, provide, ref, toRefs } from 'vue';\n\nimport { FLUID, ON_TOGGLE } from '@propelinc/citrus-ui/src/services/injections/accordions';\n\nconst props = withDefaults(\n defineProps<{\n /** Removes horizontal padding for all items inside */\n fluid?: boolean;\n }>(),\n {\n fluid: false,\n }\n);\n\nconst emit = defineEmits<{\n change: [openItems: number[]];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { fluid } = toRefs(props);\nprovide(FLUID, fluid);\n\nconst accordion = ref<HTMLDivElement | null>(null);\nprovide(ON_TOGGLE, async () => {\n await nextTick();\n const accordionItems: SlDetails[] = Array.from(\n accordion.value!.querySelectorAll('[data-accordion-item]')\n );\n const openItems = accordionItems.reduce<number[]>((acc, item, index) => {\n return item.hasAttribute('open') ? [...acc, index] : acc;\n }, []);\n emit('change', openItems);\n});\n</script>\n","import type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport {\n getAnimation,\n setAnimation,\n} from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport type { Ref } from 'vue';\nimport { isRef, onMounted, ref, unref, watch } from 'vue';\n\ntype MaybeRef<T> = T | Ref<T>;\n\nexport function useShoelaceAnimation(\n el: Ref<Element | null>,\n animationName: string,\n animation: MaybeRef<ElementAnimation | 'default' | null>\n): void {\n let defaultAnimation: ElementAnimation | null = null;\n\n onMounted(() => {\n if (el.value) {\n defaultAnimation = getAnimation(el.value, animationName, { dir: 'ltr' });\n\n const animationValue = unref(animation);\n if (animationValue !== 'default') {\n setAnimation(el.value, animationName, animationValue);\n }\n }\n });\n\n if (isRef(animation)) {\n watch(animation, () => {\n if (el.value) {\n const nextAnimation = animation.value === 'default' ? defaultAnimation : animation.value;\n setAnimation(el.value, animationName, nextAnimation);\n }\n });\n }\n}\n\nconst TAP_ANIMATION_DURATION_MS = 100;\n\nexport function useTapAnimation({\n el,\n keyframes,\n}: {\n el: Ref<Element | null>;\n keyframes: { default: Keyframe; pressed: Keyframe };\n}): Record<string, () => void> {\n const downAnimation = ref<Animation | null>(null);\n const upAnimation = ref<Animation | null>(null);\n\n function onPointerDown(): void {\n if (!el.value) {\n return;\n }\n\n upAnimation.value?.cancel();\n upAnimation.value = null;\n\n downAnimation.value?.cancel();\n downAnimation.value = el.value.animate([keyframes.default, keyframes.pressed], {\n duration: TAP_ANIMATION_DURATION_MS,\n fill: 'forwards',\n });\n }\n\n async function onPointerUp(): Promise<void> {\n if (!downAnimation.value || upAnimation.value || !el.value) {\n return;\n }\n\n // NOTE(mohan): Cancelling the animation will cause the finished promise to\n // throw an error.\n await downAnimation.value.finished.catch(() => {});\n if (!el.value) {\n // NOTE(slanden): This can happen if the element is removed from the DOM\n // while the down animation is running.\n return;\n }\n upAnimation.value = el.value.animate([keyframes.pressed, keyframes.default], {\n duration: TAP_ANIMATION_DURATION_MS,\n fill: 'forwards',\n });\n\n await upAnimation.value.finished.catch(() => {});\n upAnimation.value = null;\n downAnimation.value = null;\n }\n\n return {\n pointerdown: onPointerDown,\n pointerup: onPointerUp,\n pointerleave: onPointerUp,\n pointercancel: onPointerUp,\n };\n}\n","import type { Ref } from 'vue';\nimport { ref, watch } from 'vue';\n\n/**\n * A composable that creates a ref that tracks the value of the provided ref.\n *\n * Whenever the provided ref changes, the returned ref updates, but not the\n * other way around. When the returned ref changes, the `onChange` callback is\n * called (if provided).\n *\n * Useful for components that need to respond both to user input and to\n * programmatic changes.\n *\n * @param value - The value to bind to the internal value.\n * @param options.onChange - A callback function that is called when the\n * internal value changes.\n * @returns A ref to the internal value.\n */\nexport function useInternalValue<T>(\n value: Ref<T>,\n options: { onChange?: (value: T) => void } = {}\n): Ref<T> {\n const internalValue = ref(value.value) as Ref<T>;\n watch(value, (value) => {\n internalValue.value = value;\n });\n watch(internalValue, (newInternalValue) => {\n if (newInternalValue !== value.value) {\n options.onChange?.(newInternalValue);\n }\n });\n\n return internalValue;\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-details\n ref=\"details\"\n data-test=\"accordion-item\"\n data-accordion-item\n class=\"c-accordion-item\"\n :class=\"{ 'c-accordion-item--fluid': injectedOrPropFluid }\"\n :open=\"internalValue || undefined\"\n @sl-show=\"onChange(true)\"\n @sl-hide.stop=\"onChange(false)\"\n >\n <FontAwesomeIcon slot=\"expand-icon\" :icon=\"faChevronDown\" />\n <FontAwesomeIcon slot=\"collapse-icon\" :icon=\"faChevronDown\" />\n <div slot=\"summary\" class=\"c-accordion-item__header\" data-test=\"accordion-item-header\">\n <slot name=\"header\" />\n </div>\n <div data-test=\"accordion-item-content\" class=\"c-accordion-item__content\">\n <slot />\n </div>\n </sl-details>\n</template>\n\n<script setup lang=\"ts\">\nimport { faChevronDown } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/details/details';\nimport type SlDetails from '@shoelace-style/shoelace/dist/components/details/details';\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\n\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { FLUID, ON_TOGGLE } from '@propelinc/citrus-ui/src/services/injections/accordions';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether the item is open */\n value?: boolean;\n /** Removes horizontal padding from the content */\n fluid?: boolean | null;\n }>(),\n {\n value: false,\n fluid: null,\n }\n);\n\nconst emit = defineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n header?: () => VNode[];\n}>();\n\nconst details = ref<SlDetails | null>(null);\nuseShoelaceAnimation(details, 'details.show', {\n keyframes: [{ height: '0' }, { height: 'auto' }],\n options: { duration: 200, easing: 'ease' },\n});\nuseShoelaceAnimation(details, 'details.hide', {\n keyframes: [{ height: 'auto' }, { height: '0' }],\n options: { duration: 200, easing: 'ease' },\n});\n\nconst injectedFluid = inject(FLUID, ref(false));\nconst injectedOrPropFluid = computed(() => {\n return props.fluid !== null ? props.fluid : (injectedFluid.value ?? false);\n});\n\nconst valueRef = computed(() => props.value);\nconst internalValue = useInternalValue(valueRef, { onChange: (value) => emit('input', value) });\n\nconst injectedToggleItem = inject(ON_TOGGLE, undefined);\nconst onChange = (value: boolean): void => {\n internalValue.value = value;\n injectedToggleItem?.();\n emit('input', value);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-accordion-item {\n &::part(base) {\n background: transparent;\n border: none;\n }\n\n &::part(header) {\n padding: 16px;\n }\n\n &::part(summary) {\n @include subheadline;\n\n padding-right: 16px;\n }\n\n &::part(summary-icon) {\n rotate: 0;\n transition-duration: 200ms;\n }\n\n &[open]::part(summary-icon) {\n rotate: 180deg;\n }\n\n &::part(content) {\n padding: 0 16px 16px;\n }\n\n & + & {\n border-top: $border;\n }\n}\n\n.c-accordion-item--fluid {\n &::part(content) {\n padding: 0;\n }\n}\n\n.c-accordion-item__header {\n width: 100%;\n}\n\n.c-accordion-item__content {\n box-sizing: border-box;\n}\n</style>\n","// NOTE(ej): This file is a manual copy of /styles/colors.scss\n// These files should be kept in sync.\n// NOTE(cshdllr): The navy colors are still here for backwards compatibility.\n\nexport type HexColor = `#${string}`;\nexport type RgbaColor = `rgba(${number}, ${number}, ${number}, ${number})`;\n\n/**\n * CSS color value from the palette (hex or rgba). Use this type when a value\n * may be either format, e.g. gray colors are rgba, others are hex.\n */\nexport type CssColor = HexColor | RgbaColor;\n\nconst BLACK = '#000000';\nconst GRAY_100 = 'rgba(0, 0, 0, 0.04)';\nconst GRAY_200 = 'rgba(0, 0, 0, 0.1)';\nconst GRAY_300 = 'rgba(0, 0, 0, 0.31)';\nconst GRAY_400 = 'rgba(0, 0, 0, 0.48)';\nconst GRAY_500 = 'rgba(0, 0, 0, 0.69)';\nconst GREEN_500 = '#1f7400';\nconst GOLD_500 = '#f47500';\nconst RED_500 = '#cd000c';\n\n/**\n * Maps a color name to its corresponding CSS color (hex or rgba).\n * Gray neutrals use rgba for transparency; other colors use hex.\n *\n * NOTE: Please write hex codes in lowercase letters\n */\nconst Colors: Record<string, CssColor> = {\n ACCENT_BLUE: '#5560cb',\n ACCENT_BLUE_SHADE_1: '#404898',\n ACCENT_BLUE_SHADE_2: '#2f3570',\n ACCENT_GREEN: '#49a24c',\n ACCENT_GREEN_SHADE_1: '#3a823d',\n ACCENT_GREEN_SHADE_2: '#17551a',\n ACCENT_ORANGE: '#ffa895',\n ACCENT_ORANGE_SHADE_1: '#e15c1b',\n ACCENT_ORANGE_SHADE_2: '#a9440b',\n ACCENT_PINK: '#d75fae',\n ACCENT_PINK_SHADE_1: '#7c3872',\n ACCENT_PINK_SHADE_2: '#56204e',\n ACCENT_RED_SHADE_1: '#981d31',\n ACCENT_RED_SHADE_2: '#701323',\n ALERT_RED: '#c34459',\n BACKGROUND: GRAY_100,\n BLACK,\n GRAY_100,\n GRAY_200,\n GRAY_300,\n GRAY_400,\n GRAY_500,\n // NOTE(slanden, Seth): Transparency does not work or make sense in all contexts, (e.g. the in-app\n // browser cannot handle transparency in rgba colors). These provide hex the equivalent of each\n // gray over a white background.\n GRAY_100_HEX: '#f5f5f5',\n GRAY_200_HEX: '#e6e6e6',\n GRAY_300_HEX: '#b0b0b0',\n GRAY_400_HEX: '#858585',\n GRAY_500_HEX: '#4f4f4f',\n NAVY: BLACK,\n NAVY_TINT_1: GRAY_500,\n NAVY_TINT_2: GRAY_400,\n NAVY_TINT_3: GRAY_300,\n NAVY_TINT_4: GRAY_200,\n NAVY_TINT_5: GRAY_100,\n NEUTRAL: GRAY_100,\n NEUTRAL_SHADE: GRAY_200,\n NEUTRAL_SHADE_2: '#707070',\n ORANGE: '#ffa895',\n ORANGE_TINT_1: '#fdcab7',\n ORANGE_TINT_2: '#ffdbce',\n PINK: '#f6a0d1',\n PINK_TINT_1: '#fdc3e4',\n PINK_TINT_2: '#ffdef1',\n PROVIDERS_BLUE: '#a3b0f9',\n PROVIDERS_BLUE_TINT_1: '#d1d7fc',\n PROVIDERS_BLUE_TINT_2: '#e8ebfd',\n PROVIDERS_GREEN: '#49a24c',\n PROVIDERS_GREEN_TINT_1: '#b3f6a2',\n PROVIDERS_GREEN_TINT_2: '#d1fac7',\n TEXT_PRIMARY: BLACK,\n TEXT_SECONDARY: GRAY_500,\n TEXT_PLACEHOLDER: GRAY_400,\n TEXT_DISABLED: GRAY_300,\n WHITE: '#ffffff',\n YELLOW: '#ffc200',\n YELLOW_100: '#ffdc6b',\n YELLOW_TINT_1: '#ffdc6b',\n YELLOW_TINT_2: '#fee69a',\n BLUE_100: '#e0edff',\n BLUE_200: '#b2cffa',\n BLUE_300: '#7a95f8',\n BLUE_400: '#496ae0',\n BLUE_500: '#1a43d7',\n BORDER: GRAY_200,\n BUTTON_BACKGROUND: BLACK,\n GOLD_500,\n GOLD_400: '#f99500',\n GOLD_300: '#ffc120',\n GOLD_200: '#fcde74',\n GOLD_100: '#fff0ba',\n GREEN_500,\n GREEN_400: '#3fa41c',\n GREEN_300: '#8bc95a',\n GREEN_200: '#b8da96',\n GREEN_100: '#dcf2cb',\n PURPLE_500: '#6431d0',\n PURPLE_400: '#804fe8',\n PURPLE_300: '#ac8eff',\n PURPLE_200: '#cdbcff',\n PURPLE_100: '#ebe4ff',\n RED_500,\n RED_400: '#f52323',\n RED_300: '#ff6969',\n RED_200: '#ffaaa5',\n RED_100: '#ffe5dd',\n STATUS_SUCCESS: GREEN_500,\n STATUS_WARNING: GOLD_500,\n STATUS_ERROR: RED_500,\n};\n\nexport default Colors;\n\n/**\n * This is a type predicate that will allow TypeScript to know that the string tested is a\n * HexColor within the scope of the narrowing.\n */\nexport function isHexColor(color?: string): color is HexColor {\n if (!color) {\n return false;\n }\n\n return /^#([0-9A-Fa-f]{3}){1,2}$/i.test(color);\n}\n\nexport function isRgbaColor(color?: string): color is RgbaColor {\n if (!color) {\n return false;\n }\n\n // Alpha may be integer 0–255 or decimal 0–1 (e.g. 0.04, 0.69)\n return /^rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\)$/i.test(color);\n}\n\nexport function isCssColor(color?: string): color is CssColor {\n return isHexColor(color) || isRgbaColor(color);\n}\n\n/**\n * This is a type predicate that will allow TypeScript to know that the string tested is a\n * key of the Colors object.\n */\nexport function isColorKey(color?: string): color is keyof typeof Colors {\n if (!color) {\n return false;\n }\n\n return Object.keys(Colors).includes(color);\n}\n\n/**\n * Validates a string as either a hex color or a color key.\n */\nexport function isValidColor(value: string): boolean {\n if (value === 'default') {\n return true;\n }\n\n if (isHexColor(value)) {\n return true;\n }\n\n // Normalize any strings to SCREAMING_CASE\n const normalizedKey = value.toUpperCase().replace(/-/g, '_');\n\n return isColorKey(normalizedKey);\n}\n","<template>\n <Transition mode=\"out-in\" name=\"fade\">\n <slot />\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\ndefineSlots<{ default: () => VNode[] }>();\n</script>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 300ms ease-out;\n}\n\n.fade-enter,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","import type { MaybeRefOrGetter, Ref } from 'vue';\nimport { computed, toValue } from 'vue';\n\nimport Colors, {\n type CssColor,\n isColorKey,\n isCssColor,\n} from '@propelinc/citrus-ui/src/colors/colors';\n\n/**\n * Maps from a color name or hex code to its corresponding CSS color value.\n * Gray neutrals resolve to rgba(); other palette colors are hex.\n *\n * @param name - The color to resolve. Can be in kebab case, SCREAMING_SNAKE_CASE, or a hex code from the palette.\n * @returns The CSS color value (hex or rgba) and whether the color is valid.\n */\nexport function useCssColor(name: MaybeRefOrGetter<string | undefined>): {\n cssColor: Ref<CssColor | undefined>;\n isValidColor: Ref<boolean>;\n} {\n const normalizedColor = computed(() =>\n isCssColor(toValue(name)) ? (toValue(name)?.toLowerCase() as CssColor) : undefined\n );\n const normalizedName = computed(() => {\n if (!toValue(name)) {\n return undefined;\n }\n\n // If it is a CSS color already, we don't need to know its name\n if (isCssColor(toValue(name))) {\n return undefined;\n }\n\n return toValue(name)?.replace(/-/g, '_').toUpperCase();\n });\n\n const cssColor = computed(() => {\n // If we're given a color key, return the palette value (hex or rgba)\n if (normalizedName.value && isColorKey(normalizedName.value)) {\n return Colors[normalizedName.value];\n }\n\n // If we're given a CSS color AND it's in the palette, return it\n if (\n isCssColor(normalizedColor.value) &&\n Object.values(Colors).includes(normalizedColor.value)\n ) {\n return normalizedColor.value;\n }\n\n return undefined;\n });\n\n const isValidColor = computed(() => {\n return cssColor.value !== undefined;\n });\n\n return { cssColor, isValidColor };\n}\n","<template>\n <span\n :aria-label=\"accessibleText || $t('Loading...')\"\n class=\"c-loader\"\n :data-size=\"computedSize\"\n data-test=\"loader\"\n role=\"progressbar\"\n :style=\"{\n '--indicator-color': indicatorColorCode,\n '--loader-size': SIZE_TO_FONT_SIZE[computedSize],\n '--track-color': trackColorCode,\n '--track-width': SIZE_TO_TRACK_WIDTH[computedSize],\n }\"\n >\n <svg class=\"c-loader__svg\">\n <circle class=\"c-loader__track\" />\n <circle class=\"c-loader__indicator\" />\n </svg>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport Colors from '@propelinc/citrus-ui/src/colors/colors';\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\n\ntype Size = 'sm' | 'md' | 'lg';\n\nconst SIZE_TO_FONT_SIZE: Record<Size, `${number}px`> = {\n sm: '20px',\n md: '26px',\n lg: '32px',\n};\n\nconst SIZE_TO_TRACK_WIDTH: Record<Size, `${number}px`> = {\n sm: '2.5px',\n md: '3px',\n lg: '3px',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Sets the color of the indicator of the loader */\n color?: HexColor | keyof typeof Colors;\n /** @deprecated Shows a smaller version of the loading icon */\n small?: boolean;\n /** Sets the size of the loader */\n size?: Size;\n /** Sets the color of the track of the loader */\n trackColor?: HexColor | keyof typeof Colors;\n }>(),\n {\n accessibleText: undefined,\n color: 'default',\n small: false,\n size: 'lg',\n trackColor: 'default',\n }\n);\n\nconst computedColor = computed(() => {\n return props.color === 'default' ? 'black' : props.color;\n});\n\nconst computedTrackColor = computed(() => {\n // If _any_ trackColor is provided, use that\n if (props.trackColor !== 'default') {\n return props.trackColor;\n }\n\n // trackColor is 'default', determine which default color it should use\n if (props.color === 'white' || props.color === Colors.WHITE) {\n return 'gray-500';\n }\n\n return 'gray-200';\n});\n\nconst computedSize = computed((): Size => {\n if (props.small) {\n return 'sm';\n }\n return props.size;\n});\n\nconst { cssColor: indicatorColorCode } = useCssColor(computedColor);\nconst { cssColor: trackColorCode } = useCssColor(computedTrackColor);\n</script>\n\n<style lang=\"scss\" scoped>\n.c-loader {\n display: inline-flex;\n font-size: var(--loader-size);\n height: 1em;\n width: 1em;\n\n &__svg {\n flex: 1 1 auto;\n height: 100%;\n overflow: visible;\n width: 100%;\n }\n\n &__indicator,\n &__track {\n cx: 0.5em;\n cy: 0.5em;\n fill: none;\n r: calc(0.5em - var(--track-width) / 2);\n stroke-width: var(--track-width);\n }\n\n &__indicator {\n animation: spin 2000ms linear infinite;\n stroke: var(--indicator-color);\n stroke-dasharray: 150% 75%;\n stroke-linecap: round;\n transform-origin: 50% 50%;\n }\n\n &__track {\n stroke: var(--track-color);\n transform-origin: 0% 0%;\n }\n\n @keyframes spin {\n 0% {\n stroke-dasharray: 0.05em 3em;\n transform: rotate(0deg);\n }\n\n 50% {\n stroke-dasharray: 1.375em 1.375em;\n transform: rotate(450deg);\n }\n\n 100% {\n stroke-dasharray: 0.05em 3em;\n transform: rotate(1080deg);\n }\n }\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const TERTIARY = Symbol('tertiary') as InjectionKey<Ref<boolean>>;\nexport const INHERIT_COLOR = Symbol('inherit-color') as InjectionKey<Ref<boolean>>;\n","<template>\n <header\n data-test=\"app-bar\"\n class=\"c-app-bar\"\n :class=\"{\n 'c-app-bar--fixed': fixed,\n 'c-app-bar--border': border,\n }\"\n :style=\"{\n '--c-app-bar-background-color': bgCssColor,\n '--c-app-bar-color': textCssColor,\n }\"\n :data-background-color=\"bgCssColor\"\n :data-color=\"textCssColor\"\n >\n <div class=\"c-app-bar__left\" data-test=\"app-bar-left\">\n <slot name=\"left\" />\n </div>\n\n <div data-test=\"app-bar-title\" class=\"c-app-bar__title\">\n <CFadeTransition>\n <CLoader\n v-if=\"loading\"\n key=\"loader\"\n data-test=\"app-bar-loader\"\n class=\"c-app-bar__loader\"\n small\n :color=\"textCssColor\"\n :accessible-text=\"loaderAccessibleText\"\n />\n <h1\n v-else-if=\"!loading && title\"\n key=\"title\"\n class=\"c-app-bar__title-content\"\n data-test=\"app-bar-title-text\"\n >\n {{ title }}\n </h1>\n <div v-else key=\"slot\" class=\"c-app-bar__title-content\">\n <slot name=\"title\" />\n </div>\n </CFadeTransition>\n </div>\n\n <div class=\"c-app-bar__right\" data-test=\"app-bar-right\">\n <slot name=\"right\" />\n </div>\n </header>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref } from 'vue';\n\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport Colors, { isHexColor, isRgbaColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport CFadeTransition from '@propelinc/citrus-ui/src/components/CFadeTransition.vue';\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport {\n INHERIT_COLOR as INHERIT_COLOR_ICON_BUTTON,\n TERTIARY as TERTIARY_ICON_BUTTON,\n} from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Used to set the background color of the app bar. Needs to accept either a hex code or a\n * a valid color key from the Colors object.\n */\n backgroundColor?: HexColor | keyof typeof Colors;\n /** If true, the app bar will have a bottom border. */\n border?: boolean;\n /**\n * Used to set the text color of the app bar. Needs to accept either a hex code or a\n * a valid color key from the Colors object.\n * If unset, defaults to either white or black based on the background color's luminance.\n */\n color?: HexColor | keyof typeof Colors;\n /** If true, the app bar will be fixed to the top of the viewport. */\n fixed?: boolean;\n /** Adds screen reader only text alternative to loading icon, text should be translated */\n loaderAccessibleText?: string;\n /** Shows a loading spinner. Overrides the title slot. */\n loading?: boolean;\n /**\n * Shows text in the center of the component. Typically used for page names.\n * Overrides the title slot.\n */\n title?: string;\n }>(),\n {\n backgroundColor: 'default',\n border: false,\n color: undefined,\n fixed: false,\n loaderAccessibleText: '',\n loading: false,\n title: '',\n }\n);\n\ndefineSlots<{\n left?: () => VNode[];\n title?: () => VNode[];\n right?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\nprovide(INHERIT_COLOR_ICON_BUTTON, ref(true));\n\nconst initialBackgroundColor = computed(() => {\n if (props.backgroundColor === 'default') {\n return Colors.WHITE;\n }\n\n return props.backgroundColor;\n});\n\nconst { cssColor: bgCssColor } = useCssColor(initialBackgroundColor);\n\n/**\n * This text color is computed based on the background color's luminance.\n * Dark backgrounds get white text, light backgrounds get black text.\n * Supports both hex and rgba (e.g. gray palette); rgba is composited over white for luminance.\n *\n * This is overridden by the `color` prop.\n */\nconst calculatedTextColor = computed(() => {\n const color = bgCssColor.value;\n if (!color) {\n return Colors.BLACK;\n }\n\n let r: number;\n let g: number;\n let b: number;\n\n if (isHexColor(color)) {\n const hex = color.substring(1);\n const fullHex = hex.length === 3 ? hex.replace(/(.)/g, '$1$1') : hex;\n r = parseInt(fullHex.substring(0, 2), 16) / 255;\n g = parseInt(fullHex.substring(2, 4), 16) / 255;\n b = parseInt(fullHex.substring(4, 6), 16) / 255;\n } else if (isRgbaColor(color)) {\n const match = color.match(\n /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*([\\d.]+)\\s*\\)$/i\n );\n if (!match) {\n return Colors.BLACK;\n }\n const ra = Number(match[1]) / 255;\n const ga = Number(match[2]) / 255;\n const ba = Number(match[3]) / 255;\n const a = Number(match[4]);\n // Composite over white to get effective RGB for luminance\n r = ra * a + (1 - a);\n g = ga * a + (1 - a);\n b = ba * a + (1 - a);\n } else {\n return Colors.BLACK;\n }\n\n // Calculate relative luminance using sRGB coefficients\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n // Use white text if background is dark enough (luminance < 0.5)\n return luminance < 0.5 ? Colors.WHITE : Colors.BLACK;\n});\n\nconst { cssColor: userTextCssColor } = useCssColor(() => props.color);\n\nconst textCssColor = computed(() => {\n if (userTextCssColor.value) {\n return userTextCssColor.value;\n }\n\n return calculatedTextColor.value;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/typography';\n\n@mixin app-bar-button-container {\n align-items: center;\n display: flex;\n flex: none;\n min-width: $button-size-medium;\n}\n\n.c-app-bar {\n align-items: center;\n background-color: var(--c-app-bar-background-color);\n color: var(--c-app-bar-color);\n display: flex;\n gap: 8px;\n height: $app-bar-height;\n padding: 0 8px;\n}\n\n.c-app-bar--fixed {\n left: 0;\n position: fixed;\n right: 0;\n top: env(safe-area-inset-top);\n z-index: 5;\n}\n\n.c-app-bar--border {\n border-bottom: $border;\n}\n\n.c-app-bar__left {\n @include app-bar-button-container;\n\n justify-content: flex-start;\n}\n\n.c-app-bar__right {\n @include app-bar-button-container;\n\n justify-content: flex-end;\n}\n\n.c-app-bar__title {\n @include subheadline;\n\n flex: auto;\n overflow: hidden;\n text-align: center;\n}\n\n.c-app-bar__loader {\n // Vertically center the loader\n transform: translateY(3px);\n}\n\n.c-app-bar__title-content {\n @include subheadline;\n @include text-overflow-ellipsis;\n}\n</style>\n","<template>\n <span\n class=\"c-badge\"\n :data-test=\"dataTest\"\n :data-color=\"color\"\n :data-text-color=\"textColor\"\n :style=\"computedStyle\"\n >\n <slot>\n {{ text }}\n </slot>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\n\nconst props = withDefaults(\n defineProps<{\n /** Adds a unique data-test attribute for testing to the container */\n dataTest?: string;\n /** Sets the background color */\n color?: string;\n /** Sets the text of the badge, can also use default slot */\n text?: string;\n /** Sets the text color */\n textColor?: string;\n }>(),\n {\n color: 'purple-200',\n dataTest: 'badge',\n text: undefined,\n textColor: 'text-primary',\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { cssColor: backgroundCssColor } = useCssColor(() => props.color);\nconst { cssColor: textCssColor } = useCssColor(() => props.textColor);\n\nconst computedStyle = computed(() => {\n const style: Record<string, string> = {};\n\n if (backgroundCssColor.value) {\n style['--c-badge-background-color'] = backgroundCssColor.value;\n }\n\n if (textCssColor.value) {\n style['--c-badge-text-color'] = textCssColor.value;\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-badge {\n --height: 24px;\n\n @include eyebrow;\n\n background-color: var(--c-badge-background-color);\n border: none;\n border-radius: 4px;\n color: var(--c-badge-text-color);\n display: inline-block;\n height: var(--height);\n\n // Override the line-height of the eyebrow mixin so the text is vertically centered\n line-height: var(--height);\n padding-inline: 12px;\n white-space: nowrap;\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const BLOCK = Symbol('block') as InjectionKey<Ref<boolean>>;\nexport const LARGE = Symbol('large') as InjectionKey<Ref<boolean | null>>;\nexport const BOUNCE_AMOUNT = Symbol('bounce-amount') as InjectionKey<number>;\n","<template>\n <component :is=\"tag\" class=\"c-button-stack\" data-test=\"c-button-stack\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { provide, ref, toRef } from 'vue';\n\nimport { BLOCK, LARGE } from '@propelinc/citrus-ui/src/services/injections/buttons';\n\nconst props = withDefaults(\n defineProps<{\n tag?: string;\n large?: boolean | null;\n }>(),\n {\n tag: 'div',\n large: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst large = toRef(props, 'large') as Ref<boolean | null>;\n\nprovide(BLOCK, ref(true));\nprovide(LARGE, large);\n</script>\n\n<style scoped>\n/**\n * FIXME: https://linear.app/slanden/issue/FE-37/remove-exported-margins\n * These are exported margins, would be preferable to use a Flex column with gap instead\n */\n:deep() {\n .c-button + .c-button {\n margin-top: 8px;\n }\n}\n</style>\n","import type { DebouncedFunc } from 'lodash';\nimport { debounce } from 'lodash';\nimport type { Directive } from 'vue';\n\ninterface ScrollIntoViewElement extends HTMLElement {\n scrollDirective?: {\n focusable: HTMLInputElement | HTMLTextAreaElement;\n scrollIfNeeded: DebouncedFunc<() => void>;\n focusListener: () => void;\n blurListener: () => void;\n };\n}\n\n// NOTE(mohan): This is to support browsers without visualViewport.\nconst getViewport = (): Window | VisualViewport => window.visualViewport ?? window;\n\nconst scrollToElement = (element: Element): void => {\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n\n // Check if element is obscured by header or footer\n const appHeight = document.getElementById('app')?.clientHeight;\n const estimatedHeaderHeight =\n document.getElementsByClassName('app-bar c-app-bar')[0]?.clientHeight || 64;\n const estimatedFooterHeight =\n document.getElementsByClassName('c-fixed-page-footer')[0]?.clientHeight ||\n document.getElementsByClassName('scrollable-footer')[0]?.clientHeight ||\n 0;\n const contentStartY = appHeight\n ? windowHeight - (appHeight - estimatedHeaderHeight)\n : estimatedHeaderHeight;\n const contentEndY = windowHeight - estimatedFooterHeight;\n\n const isObscuredByHeader = rect.top < contentStartY;\n const isObscuredByFooter = rect.bottom > contentEndY;\n\n if (isObscuredByHeader || isObscuredByFooter) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n};\n\n/**\n * This directive scrolls the element into view when the input inside it is focused.\n *\n * It also listens for viewport size changes, so it can scroll again if the keyboard pops up.\n */\nexport const scrollIntoView: Directive = {\n beforeMount(el: ScrollIntoViewElement): void {\n const inputEl = el.querySelector('input,textarea');\n if (!inputEl) {\n return;\n }\n\n el.scrollDirective = {\n focusable: inputEl as HTMLInputElement | HTMLTextAreaElement,\n scrollIfNeeded: debounce((): void => {\n scrollToElement(el);\n }, 300),\n focusListener: (): void => {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded();\n // When focused, we track the viewport size, so we can scroll again if the keyboard pops up.\n getViewport().addEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n blurListener: (): void => {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded.cancel();\n getViewport().removeEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n };\n\n inputEl.addEventListener('focus', el.scrollDirective!.focusListener);\n inputEl.addEventListener('blur', el.scrollDirective!.blurListener);\n },\n\n unmounted(el: ScrollIntoViewElement): void {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded.cancel();\n el.scrollDirective.focusable.removeEventListener('focus', el.scrollDirective.focusListener);\n el.scrollDirective.focusable.removeEventListener('blur', el.scrollDirective.blurListener);\n getViewport().removeEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n};\n","import { ref } from 'vue';\nimport type { Directive, DirectiveBinding } from 'vue';\n\nimport { useTapAnimation } from '../../composables/animation';\n\ninterface TapAnimationValue {\n bounceAmount?: number;\n}\n\ninterface TapAnimationElement extends HTMLElement {\n __tapAnimationCleanup?: () => void;\n}\n\nconst DEFAULT_BOUNCE_AMOUNT = 0.94;\n\nfunction setupTapAnimation(el: HTMLElement, bounceAmount: number): void {\n const animationListeners = useTapAnimation({\n el: ref(el),\n keyframes: {\n default: { transform: 'scale(1)' },\n pressed: { transform: `scale(${bounceAmount})` },\n },\n });\n\n // Add event listeners\n Object.entries(animationListeners).forEach(([event, handler]) => {\n el.addEventListener(event, handler);\n });\n\n // The cleanup function is essential here to ensure that all event listeners added by the directive are removed\n // when the directive is unbound. Without this cleanup, the event listeners would remain attached to the element,\n // potentially causing memory leaks and unexpected behavior. This function is called in the 'unbind' hook to properly\n // clean up the element.\n (el as TapAnimationElement).__tapAnimationCleanup = (): void => {\n Object.entries(animationListeners).forEach(([event, handler]) => {\n el.removeEventListener(event, handler);\n });\n };\n}\n\nexport const tapAnimation: Directive<HTMLElement, TapAnimationValue> = {\n beforeMount(el: HTMLElement, binding: DirectiveBinding<TapAnimationValue>): void {\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n return;\n }\n\n const bounceAmount = binding.value?.bounceAmount ?? DEFAULT_BOUNCE_AMOUNT;\n setupTapAnimation(el, bounceAmount);\n },\n\n updated(el: HTMLElement, binding: DirectiveBinding<TapAnimationValue>): void {\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n return;\n }\n\n // If bounce amount changes, we need to re-mount the directive\n if (binding.value?.bounceAmount !== binding.oldValue?.bounceAmount) {\n (el as TapAnimationElement).__tapAnimationCleanup?.();\n const bounceAmount = binding.value?.bounceAmount ?? DEFAULT_BOUNCE_AMOUNT;\n setupTapAnimation(el, bounceAmount);\n }\n },\n\n unmounted(el: HTMLElement): void {\n (el as TapAnimationElement).__tapAnimationCleanup?.();\n },\n};\n","<template>\n <button\n v-tap-animation\n class=\"c-close-button\"\n data-test=\"c-close-button\"\n :aria-label=\"$t('Close')\"\n :disabled=\"disabled\"\n @click=\"onClick\"\n >\n <font-awesome-icon :icon=\"faXmark\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { faXmark } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nimport { tapAnimation as vTapAnimation } from '@propelinc/citrus-ui/src/services/directives';\n\ndefineProps<{\n disabled?: boolean;\n}>();\n\nconst emit = defineEmits(['click', 'focus', 'blur']);\n\nconst onClick = (): void => {\n emit('click');\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-close-button {\n align-items: center;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n font-size: $font-size-icon-medium;\n height: 36px;\n justify-content: center;\n padding: 8px;\n width: 36px;\n\n @include button-theme-close;\n\n &:focus {\n /**\n * This is a workaround to get the focus ring to work with the button. Since we're not using Shoelace,\n * we need to use the focus ring styles from Shoelace. Long term, we should create a custom focus ring styles.\n */\n outline: var(--sl-focus-ring-width) solid var(--sl-focus-ring-color);\n outline-offset: var(--sl-focus-ring-offset);\n }\n}\n</style>\n","import type { Ref } from 'vue';\nimport { onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\n// NOTE(mohan): A simplified port of vueuse/core's useResizeObserver.\n// vueuse has type errors because our version of vue is so old.\nexport function useResizeObserver(\n element: Ref<HTMLElement | null | undefined>,\n callback: (entries: ResizeObserverEntry[]) => void\n): void {\n if (!('ResizeObserver' in window)) {\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n watch(\n element,\n (value) => {\n if (value) {\n observer = new ResizeObserver(callback);\n observer.observe(value);\n }\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n });\n}\n\nexport function useShoelaceShadowParts<T extends string>(\n shoelaceComponent: Ref<HTMLElement | null>,\n parts: T[]\n): Record<T, Ref<HTMLElement | null>> {\n const shadowParts = parts.reduce<Record<T, Ref<HTMLElement | null>>>(\n (acc, part) => {\n return { ...acc, [part]: ref<HTMLElement | null>(null) };\n },\n {} as Record<T, Ref<HTMLElement | null>>\n );\n\n onMounted(async () => {\n if (!shoelaceComponent.value) {\n return;\n }\n\n try {\n await customElements.whenDefined(shoelaceComponent.value.tagName.toLowerCase());\n } catch {\n // TODO: (kyleshevlin) we had to stub out Shoelace component in tests, which causes this to fail\n // because there is no tagName for the stubbed component\n // Silently handle error\n return;\n }\n\n // Make sure the component hasn't been destroyed at this point.\n const shadowRoot = shoelaceComponent.value?.shadowRoot;\n if (!shadowRoot) {\n return;\n }\n\n for (const part of parts) {\n shadowParts[part].value = shadowRoot.querySelector(`[part=\"${part}\"]`);\n }\n });\n\n return shadowParts;\n}\n","import type { Ref } from 'vue';\nimport { computed, onMounted, ref, watch } from 'vue';\n\nexport interface Coordinate {\n x: number;\n y: number;\n}\n\ninterface SimplifiedPointerEvent {\n position: Coordinate;\n timestamp: number;\n}\n\ntype DragCallback = (dragDetails: {\n /** How far the user has dragged in pixels */\n distance: Coordinate;\n /** Velocity of drag in pixels/ms */\n velocity: Coordinate;\n}) => void;\n\n/**\n * Listens for drag events on the provided element and tracks the distance and\n * velocity of the drag.\n *\n * @param element - The element to listen for drag events on.\n * @param options.onDragEnd - A callback that is called when the drag ends.\n * @returns An object containing the drag distance and velocity.\n */\nexport const useDragListener = (\n element: Ref<HTMLElement | null>,\n options?: {\n onDragEnd?: DragCallback;\n }\n): {\n dragDistance: Ref<Coordinate | null>;\n dragVelocity: Ref<Coordinate | null>;\n} => {\n const startDragTouch = ref<SimplifiedPointerEvent | null>(null);\n const lastDragTouch = ref<SimplifiedPointerEvent | null>(null);\n\n const dragVelocity = ref<Coordinate | null>(null);\n const dragDistance = computed(() => {\n if (!startDragTouch.value || !lastDragTouch.value) {\n return { x: 0, y: 0 };\n }\n return {\n x: lastDragTouch.value.position.x - startDragTouch.value.position.x,\n y: lastDragTouch.value.position.y - startDragTouch.value.position.y,\n };\n });\n\n const simplifyEvent = (event: TouchEvent): SimplifiedPointerEvent => {\n const { clientX: x, clientY: y } = event.touches[0];\n return { position: { x, y }, timestamp: event.timeStamp };\n };\n\n const touchStartListener = (event: TouchEvent): void => {\n startDragTouch.value = simplifyEvent(event);\n lastDragTouch.value = startDragTouch.value;\n };\n\n const touchMoveListener = (event: TouchEvent): void => {\n const newEvent = simplifyEvent(event);\n if (lastDragTouch.value) {\n const timeDelta = newEvent.timestamp - lastDragTouch.value.timestamp;\n dragVelocity.value = {\n x: (newEvent.position.x - lastDragTouch.value.position.x) / timeDelta,\n y: (newEvent.position.y - lastDragTouch.value.position.y) / timeDelta,\n };\n }\n lastDragTouch.value = newEvent;\n };\n\n const touchEndListener = (): void => {\n options?.onDragEnd?.({\n distance: dragDistance.value,\n velocity: dragVelocity.value ?? { x: 0, y: 0 },\n });\n startDragTouch.value = null;\n lastDragTouch.value = null;\n dragVelocity.value = null;\n };\n\n const addListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.addEventListener('touchstart', touchStartListener);\n element.addEventListener('touchmove', touchMoveListener);\n element.addEventListener('touchend', touchEndListener);\n }\n };\n\n const removeListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.removeEventListener('touchstart', touchStartListener);\n element.removeEventListener('touchmove', touchMoveListener);\n element.removeEventListener('touchend', touchEndListener);\n }\n };\n\n onMounted(async () => {\n addListeners(element.value);\n });\n\n watch(element, (newElement, oldElement) => {\n removeListeners(oldElement);\n addListeners(newElement);\n });\n\n return { dragDistance, dragVelocity };\n};\n\n/**\n * Adds listeners to the provided element to prevent it from emitting touch\n * events when it is scrolling.\n *\n * @param element - A scrollable element inside a draggable component.\n */\nexport const useScrollBoundary = (element: Ref<HTMLElement | null>): void => {\n const isScrolling = ref(false);\n const onScroll = (): void => {\n isScrolling.value = true;\n };\n\n const onTouchEvent = (event: TouchEvent): void => {\n if (isScrolling.value) {\n event.stopPropagation();\n }\n };\n const onTouchEnd = (event: TouchEvent): void => {\n onTouchEvent(event);\n isScrolling.value = false;\n };\n\n const addListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.addEventListener('scroll', onScroll);\n element.addEventListener('touchstart', onTouchEvent);\n element.addEventListener('touchmove', onTouchEvent);\n element.addEventListener('touchend', onTouchEnd);\n }\n };\n\n const removeListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.removeEventListener('scroll', onScroll);\n element.removeEventListener('touchstart', onTouchEvent);\n element.removeEventListener('touchmove', onTouchEvent);\n element.removeEventListener('touchend', onTouchEnd);\n }\n };\n\n onMounted(() => {\n addListeners(element.value);\n });\n\n watch(element, (newElement, oldElement) => {\n removeListeners(oldElement);\n addListeners(newElement);\n });\n};\n\n/**\n * Clamps a value in between the provided min and max values. As the value\n * increases above 0, it will approach the max, but will never reach it (and\n * vice versa for the min).\n *\n * This can be used to create a \"springy\" effect where as a user pulls further\n * on an element, it will move less and less.\n *\n * @param value - The value to clamp.\n * @param options.min - The minimum value to keep the value above.\n * @param options.max - The maximum value to keep the value below.\n * @param options.resistance - The resistance value which determines how quickly\n * the value approaches the min or max.\n * @returns The clamped value.\n */\nexport const useElasticClamp = (\n value: Ref<number | null>,\n options?: Ref<{ min?: number; max?: number; resistance?: number }>\n): Ref<number> => {\n return computed(() => {\n if (value.value === null) {\n return 0;\n }\n\n const resistance = options?.value?.resistance ?? 7;\n const { min, max } = options?.value ?? {};\n const absValue = Math.abs(value.value);\n if (min && value.value < 0) {\n return (min * absValue) / (absValue - min * resistance);\n } else if (max && value.value > 0) {\n return (max * absValue) / (absValue + max * resistance);\n } else {\n return value.value;\n }\n });\n};\n","import type { Ref, VNode } from 'vue';\nimport { Comment, Fragment, computed, useSlots } from 'vue';\n\n/**\n * Recursively checks if a VNode or its children are visible.\n */\nfunction isVisible(vnode: VNode): boolean {\n if (vnode.type === Comment) {\n return false;\n }\n\n // Handle fragments and templates recursively\n if (vnode.type === Fragment || vnode.type === 'template') {\n const children = vnode.children;\n\n // Empty fragment is not visible\n if (!children || (Array.isArray(children) && children.length === 0)) {\n return false;\n }\n\n // If fragment has children, check if any child is visible\n if (Array.isArray(children)) {\n return children.some((child) => {\n // Only check VNode children (filter out strings, numbers, etc.)\n if (typeof child === 'object' && child !== null && 'type' in child) {\n return isVisible(child as VNode);\n }\n // Non-VNode children (like strings) are considered visible\n return true;\n });\n }\n }\n\n // All other vnodes are visible\n return true;\n}\n\nexport function useSlotHasContent(key: string): Ref<boolean> {\n const slots = useSlots();\n\n return computed(() => {\n const slot = slots[key];\n\n if (!slot) {\n return false;\n }\n\n const slotContent = slot();\n\n // NOTE(slanden): In Vue 3, nodes which are rendered conditionally with v-if\n // are rendered as a comment like `<!--v-if--/>` when the condition is false.\n // We need to filter these out to get only actually rendered content.\n const visibleContent = slotContent.filter(isVisible);\n\n return visibleContent.length > 0;\n });\n}\n","import type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\n\nexport interface AnimationOptions {\n /** The starting progress through the animation from 0 to 1 */\n start?: number;\n /** The duration of the animation in milliseconds */\n duration?: number;\n /** The easing function to use for the animation */\n easing?: string;\n /** The endimum distance to slide */\n end?: number;\n}\n\nconst DEFAULT_DURATION = 300;\nconst DEFAULT_EASING = 'ease';\n\nexport function fadeIn({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { opacity: start, offset: 0 },\n { opacity: 1, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function fadeOut({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { opacity: 1 - start, offset: 0 },\n { opacity: 0, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideUp({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `0 ${(1 - start) * 100}%`, offset: 0 },\n { translate: '0 0', offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideDown({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `0 ${start * 100}%`, offset: 0 },\n { translate: '0 100%', offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideRight({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n end = 1,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `${start * 100}% 0`, offset: 0 },\n { translate: `${end * 100}% 0`, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideLeft({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n end = 1,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `${-start * 100}% 0`, offset: 0 },\n { translate: `${-end * 100}% 0`, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <!--\n For no-header prop below:\n See https://vuejs.org/guide/extras/web-components#passing-dom-properties\n Shoelace does not seem to properly specify the no-header prop; otherwise\n a false value resolves to no-header=\"false\" which is actually truthy\n -->\n <sl-drawer\n ref=\"sheet\"\n class=\"c-bottom-sheet\"\n :class=\"{\n 'c-bottom-sheet--hide-overlay': !overlay,\n 'c-bottom-sheet--hide-title': hideTitle,\n 'c-bottom-sheet--with-footer': footerHasContent,\n 'c-bottom-sheet--with-dismiss': isDismissVisible,\n }\"\n :style=\"{\n '--panel-transform': panelTransform,\n '--background-color-hex-code': backgroundCssColor,\n '--overlay-opacity': overlayOpacity,\n '--size': fixedSize || undefined,\n }\"\n :data-test=\"getDataTestAttr()\"\n :open=\"animatedValue || undefined\"\n :no-header=\"hideTitle || undefined\"\n :label=\"ariaLabel\"\n placement=\"bottom\"\n :contained=\"contained || undefined\"\n :divided=\"divided || undefined\"\n @sl-request-close=\"onRequestClose\"\n @sl-hide=\"handleDismiss\"\n @sl-after-hide=\"onAfterClose\"\n @sl-after-show=\"$emit('opened')\"\n >\n <div slot=\"label\" :data-test=\"value ? `${dataTest}-title` : null\">\n <slot name=\"header\">{{ title }}</slot>\n </div>\n\n <slot name=\"image\" />\n\n <div class=\"c-bottom-sheet__body\" :data-test=\"getDataTestAttr('body')\">\n <slot name=\"body\" />\n </div>\n\n <!-- NOTE(andrew): This renders in the body when the title is hidden because the header-actions\n slot is not rendered when the title is hidden. Previously this only rendered in the body but\n this caused issues on iOS where a scrollable body renders in a separate layer and the button\n got rendered invisibly underneath the header. This is intentionally placed after the body so\n it renders on top. -->\n <div\n v-if=\"isDismissVisible\"\n :slot=\"hideTitle ? undefined : 'header-actions'\"\n class=\"c-bottom-sheet__actions\"\n >\n <c-close-button\n :data-test=\"getDataTestAttr('dismiss')\"\n :disabled=\"disableDismiss\"\n @click=\"internalValue = false\"\n />\n </div>\n\n <CButtonStack v-if=\"footerHasContent\" slot=\"footer\" :data-test=\"getDataTestAttr('footer')\">\n <slot name=\"footer\" />\n </CButtonStack>\n </sl-drawer>\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/drawer/drawer.js';\nimport type SlDrawer from '@shoelace-style/shoelace/dist/components/drawer/drawer.js';\nimport type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport { setAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport type { Ref, VNode } from 'vue';\nimport { computed, nextTick, onMounted, ref, toRef } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport CCloseButton from '@propelinc/citrus-ui/src/components/internal/CCloseButton.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport { useShoelaceShadowParts } from '@propelinc/citrus-ui/src/composables/elements';\nimport {\n useDragListener,\n useElasticClamp,\n useScrollBoundary,\n} from '@propelinc/citrus-ui/src/composables/gestures';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport { fadeIn, fadeOut, slideDown, slideUp } from '@propelinc/citrus-ui/src/services/animation';\n\n/** Minimum distance, in pixels, the user has to drag for it to be considered a\n * successful swipe. */\nconst MIN_SWIPE_DISTANCE = 100;\n/** The minimum speed, in pixels per millisecond, the user has to drag down for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_VELOCITY = 0.75;\n/** The minimum speed, in pixels per millisecond, to animate the sheet sliding\n * down after a successful swipe. */\nconst MIN_DISMISS_VELOCITY = 1.5;\n/** Minimum duration, in milliseconds, for the slide down animation after a\n * successful drag. */\nconst MIN_DISMISS_DURATION = 100;\n/** Maximum distance the sheet can move in a direction it can't be dragged. */\nconst DRAG_CLAMP_DISTANCE = 240;\n/** Fallback height for the sheet if the actual height is unknown. */\nconst SHEET_HEIGHT_FALLBACK = 300;\n\n/**\n * Was having issues with the useShoelaceAnimation composable not updating the animation quickly\n * enough using the `watch` or `watchEffect` hooks, so we're just going to set the animations\n * directly whenever we need to change the animation.\n */\nfunction setCustomAnimation(\n el: Ref<Element | null>,\n name: string,\n animation: ElementAnimation\n): void {\n if (!el.value) {\n return;\n }\n\n setAnimation(el.value, name, animation);\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Aria label for the bottom sheet. This is required if title is hidden */\n ariaLabel?: string;\n /** Background color of the bottom sheet */\n backgroundColor?: string;\n /** If true, the bottom sheet will be contained within the viewport. */\n contained?: boolean;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Disables the dismiss button */\n disableDismiss?: boolean;\n /** Divided into header, body, and footer slots */\n divided?: boolean;\n /** Fixed size, in CSS units. By default the drawer sizes itself to its contents. */\n fixedSize?: string;\n /** Hides the dismiss 'x' button */\n hideDismiss?: boolean;\n /** Allows for hiding the entire title bar, both the title and the dismiss 'x' button */\n hideTitle?: boolean;\n /**\n * Toggles the background behind the sheet. If there's no overlay, the sheet\n * stays open as the user interacts with background content.\n */\n overlay?: boolean;\n /**\n * Prevents the sheet from being dismissed when tapping on the overlay. If\n * there is no overlay then this property is ignored, as the sheet always\n * stays open.\n */\n persistent?: boolean;\n /** Do not animate in the bottom sheet if it starts open. */\n skipInitialAnimation?: boolean;\n /** The title of the bottom sheet */\n title?: string;\n /** Controls whether or not the bottom sheet is showing */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n backgroundColor: '',\n dataTest: 'bottom-sheet',\n disableDismiss: false,\n divided: false,\n fixedSize: '',\n hideDismiss: false,\n hideTitle: false,\n overlay: true,\n persistent: false,\n contained: false,\n skipInitialAnimation: false,\n title: '',\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n input: [value: boolean];\n opened: [];\n closed: [];\n}>();\n\ndefineSlots<{\n header?: () => VNode[];\n image?: () => VNode[];\n body?: () => VNode[];\n footer?: () => VNode[];\n}>();\n\n// NOTE(slanden): Temporarily disabling because it's causing a lot of errors\n// in the console - uses from CMS aren't specifying aria-label.\n// watchEffect(() => {\n// if (props.hideTitle && !props.ariaLabel) {\n// console.error('CBottomSheet: aria-label is required when title is hidden');\n// }\n// });\n\n// value: Value provided using props which can open/close the bottom sheet.\n// internalValue: Tracks the open/closed state and lets the bottom sheet open and close even if\n// the external value doesn't change.\n// animatedValue: Same as internalValue but starts at false so the bottom sheet animates if it\n// starts in an open state.\nconst valueRef = toRef(props, 'value');\nconst internalValue = useInternalValue(valueRef, { onChange: (value) => emit('input', value) });\nconst mounted = ref(false);\nconst animatedValue = computed(() => {\n // To animate in the bottom sheet we mount the component with the sheet closed.\n if (!props.skipInitialAnimation && !mounted.value) {\n return false;\n }\n return internalValue.value;\n});\nconst { cssColor: backgroundCssColor } = useCssColor(() => props.backgroundColor);\nonMounted(async () => {\n // The bottom sheet does not animate unless we wait a tick. We don't know exactly why this\n // is necessary.\n await nextTick();\n mounted.value = true;\n});\n\nconst sheet = ref<SlDrawer | null>(null);\nconst {\n panel,\n overlay: overlayPart,\n body: bodyPart,\n} = useShoelaceShadowParts(sheet, ['panel', 'overlay', 'body']);\nuseScrollBoundary(bodyPart);\n\n// NOTE(mohan): There are three parts to the bottom sheet animation:\n// 1. CSS variables. These are used when we want to set the exact height and\n// opacity, i.e. when the user is actively moving the sheet.\n// 2. The built-in Shoelace show and hide animations. If a user has swiped\n// the sheet away, we calculate the exact animation that will smoothly\n// continue the swipe and then dismiss the shoelace drawer.\n// 3. Manually-called web animations. These are used when the sheet is being\n// restored to its original position after a drag that was not fast or\n// long enough to count as a swipe.\nsetCustomAnimation(sheet, 'drawer.showBottom', slideUp());\nsetCustomAnimation(sheet, 'drawer.overlay.show', fadeIn());\nsetCustomAnimation(sheet, 'drawer.hideBottom', slideDown());\nsetCustomAnimation(sheet, 'drawer.overlay.hide', fadeOut());\n\nconst handleDismiss = (): void => {\n internalValue.value = false;\n};\n\nconst onRequestClose = (event: Event): void => {\n if (props.persistent) {\n event.preventDefault();\n }\n};\n\nconst onAfterClose = (): void => {\n // Reset the exit animations in case they were changed in a drag event\n setCustomAnimation(sheet, 'drawer.hideBottom', slideDown());\n setCustomAnimation(sheet, 'drawer.overlay.hide', fadeOut());\n emit('closed');\n};\n\n/**\n * Helper function to calculate the distance ratio of the sheet's transform.\n */\nconst getTransformDistanceRatio = (distance: number): number => {\n return distance / (panel.value?.clientHeight ?? SHEET_HEIGHT_FALLBACK);\n};\n\nconst { dragDistance } = useDragListener(panel, {\n onDragEnd: async ({ distance, velocity }) => {\n const shouldDismiss =\n !props.persistent && (distance.y > MIN_SWIPE_DISTANCE || velocity.y > MIN_SWIPE_VELOCITY);\n\n if (shouldDismiss) {\n const remainingDismissDistance = panel.value!.clientHeight - dragDistance.value!.y;\n const dismissDuration = Math.max(\n remainingDismissDistance / Math.max(velocity.y, MIN_DISMISS_VELOCITY),\n MIN_DISMISS_DURATION\n );\n const dismissStart = getTransformDistanceRatio(distance.y);\n\n // Here we set the custom animations to complete the dismissal animation smoothly\n // from the point where the user ended their drag event.\n setCustomAnimation(\n sheet,\n 'drawer.hideBottom',\n slideDown({ start: dismissStart, duration: dismissDuration })\n );\n setCustomAnimation(\n sheet,\n 'drawer.overlay.hide',\n fadeOut({ start: dismissStart, duration: dismissDuration })\n );\n handleDismiss();\n } else {\n /**\n * This is when the user's drag event fails to trigger a dismissal\n * We need to restore the sheet to its original position\n */\n const start = 1 - getTransformDistanceRatio(dragDistance.value!.y);\n const slideUpAnimation = slideUp({ start });\n const fadeInAnimation = fadeIn({ start });\n\n // Here we imperatively animate the sheet and overlay back to their original positions\n panel.value?.animate(slideUpAnimation.keyframes, slideUpAnimation.options);\n overlayPart.value?.animate(fadeInAnimation.keyframes, fadeInAnimation.options);\n }\n },\n});\n\n/**\n * The distance that the sheet has been currently dragged\n */\nconst transformDistance = useElasticClamp(\n computed(() => dragDistance.value?.y ?? 0),\n computed(() => ({\n min: -DRAG_CLAMP_DISTANCE,\n max: props.persistent ? DRAG_CLAMP_DISTANCE : undefined,\n }))\n);\n\nconst transformDistanceRatio = computed(() => getTransformDistanceRatio(transformDistance.value));\n\nconst panelTransform = computed(() => `translateY(${transformDistance.value}px)`);\n\nconst overlayOpacity = computed(() => {\n const result = 1 - transformDistanceRatio.value;\n\n if (isNaN(result)) {\n return 1;\n }\n\n return result;\n});\n\n// NOTE(mohan): We show data-test attributes only when the sheet is open.\n// This helps simplify testing assertions.\nconst getDataTestAttr = (suffix?: string): string | null => {\n const dataTest = suffix ? `${props.dataTest}-${suffix}` : props.dataTest;\n return internalValue.value ? dataTest : null;\n};\n\nconst footerHasContent = useSlotHasContent('footer');\n\nconst isDismissVisible = computed(\n () => (!props.persistent && !props.hideDismiss) || props.disableDismiss\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-bottom-sheet {\n --size: auto;\n --header-spacing: 24px;\n --body-spacing: 0;\n --bottom-padding: max(env(safe-area-inset-bottom, 0px), 16px);\n --footer-spacing: 12px 24px var(--bottom-padding);\n\n &::part(header-actions) {\n padding: 0;\n }\n\n &::part(close-button) {\n @include sr-only;\n }\n\n &::part(panel) {\n background: var(--background-color-hex-code, $color-white);\n border-radius: 12px 12px 0 0;\n max-height: 90%;\n overflow: visible;\n transform: var(--panel-transform, none);\n\n &::after {\n background: var(--background-color-hex-code, $color-white);\n bottom: -100px;\n content: '';\n height: 101px;\n left: 0;\n position: absolute;\n right: 0;\n }\n }\n\n &::part(body) {\n border-radius: 12px 12px 0 0;\n\n /**\n * NOTE (kyleshevlin) adding position: relative here fixed an issue where certain actions (like\n * clicking a checkbox) would hijack the bottom sheet body up and off the screen.\n */\n position: relative;\n }\n\n &::part(title) {\n @include large-headline;\n\n padding-bottom: 16px;\n }\n\n // Note(kayliegh): Add space to prevent long titles from colliding with dismiss button\n &--with-dismiss::part(title) {\n margin-right: 28px;\n }\n\n &::part(overlay) {\n opacity: var(--overlay-opacity, 1);\n }\n}\n\n.c-bottom-sheet__actions {\n position: absolute;\n right: 16px;\n top: 16px;\n}\n\n.c-bottom-sheet__body {\n padding: 0 24px var(--bottom-padding);\n\n // NOTE(andrew): When there is a footer the bottom inset is handled by the footer and we just add\n // spacing above the footer.\n .c-bottom-sheet--with-footer & {\n padding-bottom: 12px;\n }\n}\n\n.c-bottom-sheet--hide-title {\n // NOTE(mohan): When there is no title, we need to add some spacing to the top\n // of the body so it doesn't touch the top of the panel.\n .c-bottom-sheet__body {\n padding-top: 16px;\n }\n}\n\n.c-bottom-sheet--hide-overlay {\n &::part(overlay) {\n display: none;\n }\n}\n</style>\n","import { type ComputedRef, type MaybeRefOrGetter, type Ref, computed, toValue } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\nimport { useLink } from 'vue-router';\n\ninterface RouterComposableHelpers {\n /**\n * V-bind this to an element to make it accessible as a link.\n */\n linkAttrs: Ref<{\n role?: string;\n tabindex?: string;\n href?: string;\n }>;\n /**\n * The href to link to.\n */\n href: Ref<string | undefined>;\n /**\n * Navigates to the given route or href. If you're not using an `<a>` tag,\n * you'll need to call this on `@click` and on `@keydown.enter`\n */\n navigate: (event: MouseEvent) => Promise<void>;\n}\n\nfunction useLinkAttrs(href: Ref<string | undefined>): ComputedRef<{\n role?: string;\n tabindex?: string;\n href?: string;\n}> {\n return computed(() => (href.value ? { role: 'link', tabindex: '0', href: href.value } : {}));\n}\n\n/**\n * Adds router-link functionality to any component. Accepts an `undefined`\n * route, which disables routing.\n *\n * @param to - The route to link to.\n * @returns A few helpers can be used to link to the given route.\n */\nexport function useRouterLink(\n to: MaybeRefOrGetter<RouteLocationRaw | undefined>\n): RouterComposableHelpers {\n // NOTE(mohan): We need to provide a default here or else `useLink` will throw\n // an error.\n const toWithDefault = computed(() => toValue(to) ?? '');\n const useLinkResult = useLink({ to: toWithDefault });\n const { navigate: _navigate, href: _href } = useLinkResult;\n const isRouterLink = computed(() => !!toValue(to));\n const href = computed(() => (isRouterLink.value ? _href.value : undefined));\n const linkAttrs = useLinkAttrs(href);\n const navigate = async (event: MouseEvent): Promise<void> => {\n if (isRouterLink.value) {\n try {\n await _navigate(event);\n } catch (error) {\n // NOTE(mohan): This matches RouterLink's behavior, which doesn't throw\n // on navigation errors.\n // eslint-disable-next-line no-console\n console.debug(error);\n }\n }\n };\n\n return { linkAttrs, href, navigate };\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-button\n v-bind=\"$attrs\"\n ref=\"button\"\n class=\"c-button\"\n :class=\"{\n 'c-button--block': injectedOrPropBlock,\n 'c-button--has-prefix-icon': hasIcon && iconPosition === 'prefix',\n 'c-button--has-suffix-icon': hasIcon && iconPosition === 'suffix',\n [`c-button-level--${level}`]: level,\n [`c-button-variant--${computedVariant}`]: computedVariant,\n [`c-button-size--${computedSize}`]: computedSize,\n }\"\n :data-block=\"dataBlock\"\n :data-href=\"routerDestinationOrHref\"\n :data-level=\"level\"\n :data-loading=\"dataLoading\"\n :data-size=\"computedSize\"\n data-test=\"button\"\n :data-variant=\"computedVariant\"\n :disabled=\"disabled\"\n :href=\"routerDestinationOrHref\"\n :loading=\"loading || undefined\"\n :size=\"computedSize\"\n :target=\"target\"\n :variant=\"shoelaceVariant\"\n v-on=\"animationListeners\"\n @click=\"onClick\"\n @sl-focus=\"$emit('focus', $event)\"\n @sl-blur=\"$emit('blur', $event)\"\n >\n <span v-if=\"hasIcon\" :slot=\"iconPosition\" data-test=\"button-icon-slot\">\n <slot name=\"icon\">\n <font-awesome-icon v-if=\"icon\" :icon=\"icon\" />\n </slot>\n </span>\n <slot data-test=\"button-default-slot\" />\n </sl-button>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/button/button.js';\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport type {\n ButtonIconPosition,\n ButtonLevel,\n ButtonShoelaceVariant,\n ButtonSize,\n ButtonVariant,\n} from '@propelinc/citrus-ui/src/components/CButton/types';\nimport { useTapAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport { BLOCK, BOUNCE_AMOUNT, LARGE } from '@propelinc/citrus-ui/src/services/injections/buttons';\n\n/**\n * Shoelace has a set of variants that don't match the variant names we would like to use.\n * This mapping is used to translate the variant names to the correct Shoelace variant names\n * and apply it to the underlying Shoelace button component.\n */\nconst VARIANT_TO_SHOELACE_VARIANT: Record<ButtonVariant, ButtonShoelaceVariant> = {\n primary: 'primary',\n // Shoelace `default` is an outline style\n secondary: 'default',\n tertiary: 'text',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether button appears as full-width */\n block?: boolean;\n /** Controls whether button is disabled */\n disabled?: boolean;\n /** Designates the button as an anchor and applies the href attribute */\n href?: string;\n /** Chooses an icon to render next to the button text */\n icon?: string | string[] | IconDefinition;\n /** Chooses whether to place the icon before or after the button text */\n iconPosition?: ButtonIconPosition;\n /**\n * @deprecated use `size` prop instead\n * Controls whether button uses the large variant\n */\n large?: boolean;\n /** Controls the level of the button */\n level?: ButtonLevel;\n /** Controls whether button is loading */\n loading?: boolean;\n /**\n * @deprecated use `variant` prop instead\n * Controls whether button uses the secondary variant\n */\n secondary?: boolean;\n /**\n * Controls the size of the button\n * @default 'medium'\n */\n size?: ButtonSize;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /**\n * @deprecated use `variant` prop instead\n * Controls whether button uses the tertiary variant\n */\n tertiary?: boolean;\n /** Controls whether button functions as a router-link */\n to?: RouteLocationRaw;\n /**\n * Controls the styling of the button\n * @default 'primary'\n */\n variant?: ButtonVariant;\n }>(),\n {\n block: false,\n disabled: false,\n href: undefined,\n icon: undefined,\n iconPosition: 'prefix',\n large: false,\n level: 'normal',\n loading: false,\n secondary: false,\n size: 'medium',\n target: undefined,\n tertiary: false,\n to: undefined,\n variant: 'primary',\n }\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n focus: [event: Event];\n blur: [event: Event];\n}>();\n\ndefineSlots<{\n icon?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst BLOCK_BOUNCE_AMOUNT = 0.96;\nconst BASE_BOUNCE_AMOUNT = 0.94;\n\nconst { href: routerDestination, navigate } = useRouterLink(() => props.to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst dataLoading = computed<true | undefined>(() => props.loading || undefined);\n\nconst injectedBlock = inject(BLOCK, undefined);\nconst injectedOrPropBlock = computed(() => injectedBlock?.value ?? props.block);\nconst dataBlock = computed<true | undefined>(() => injectedOrPropBlock.value || undefined);\n\nconst iconSlotHasContent = useSlotHasContent('icon');\nconst hasIcon = computed(() => iconSlotHasContent.value || !!props.icon);\n\n/**\n * Handle the deprecated `secondary` and `tertiary` props.\n */\nconst computedVariant = computed((): ButtonVariant => {\n if (props.secondary) {\n return 'secondary';\n }\n\n if (props.tertiary) {\n return 'tertiary';\n }\n\n return props.variant;\n});\n\n/**\n * Map the computed variant to the Shoelace variant\n */\nconst shoelaceVariant = computed(() => VARIANT_TO_SHOELACE_VARIANT[computedVariant.value]);\n\n/**\n * The deprecated `large` prop can be injected through a provider.\n */\nconst injectedLarge = inject(LARGE, undefined);\nconst injectedOrPropsLarge = computed(() => injectedLarge?.value ?? props.large);\n/**\n * Because we want the `size` prop to have a default, it's always supplied.\n * Thus, our only option to respect the deprecated `large` prop is to give it priority.\n */\nconst computedSize = computed(() => {\n if (injectedOrPropsLarge.value) {\n return 'large';\n }\n\n return props.size;\n});\n\nfunction onClick(event: MouseEvent): void {\n /**\n * If the button is disabled or loading, do not take action.\n * This prevents double/extra clicks when an async operation is in progress.\n */\n if (props.disabled || props.loading) {\n return;\n }\n\n navigate(event);\n emit('click', event);\n}\n\nconst button = ref<HTMLElement | null>(null);\nconst injectedBounceAmount = inject(BOUNCE_AMOUNT, null);\nconst bounceAmount = computed(() => {\n /**\n * If the button is disabled or loading, do not animate the button.\n */\n if (props.disabled || props.loading) {\n return 1;\n }\n\n if (injectedBounceAmount) {\n return injectedBounceAmount;\n }\n\n if (props.block) {\n return BLOCK_BOUNCE_AMOUNT;\n }\n\n return BASE_BOUNCE_AMOUNT;\n});\nconst animationListeners = useTapAnimation({\n el: button,\n keyframes: {\n default: { transform: 'scale(1)' },\n pressed: { transform: `scale(${bounceAmount.value})` },\n },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-button {\n // Prevents the iOS tap highlight color from showing up on buttons\n -webkit-tap-highlight-color: transparent;\n\n &::part(base) {\n // Included in all buttons so that they line up in rows, even buttons with transparent borders\n border-width: $border-width;\n transition: background-color 0.2s ease-in-out;\n }\n\n &::part(label) {\n padding: 0 16px;\n }\n}\n\n.c-button-size--medium::part(base) {\n --sl-input-height-medium: #{$button-size-medium};\n}\n\n.c-button-size--large::part(base) {\n --sl-input-height-large: #{$button-size-large};\n}\n\n.c-button--has-prefix-icon {\n &::part(base) {\n padding-inline-start: 16px;\n }\n\n &::part(label) {\n padding-inline-start: 8px;\n }\n}\n\n.c-button--has-suffix-icon {\n &::part(base) {\n padding-inline-end: 16px;\n }\n\n &::part(label) {\n padding-inline-end: 8px;\n }\n}\n\n.c-button--block {\n min-width: 100%;\n}\n\n.c-button-variant--primary::part(base) {\n @include button-theme-primary;\n}\n\n.c-button-variant--primary.c-button-level--danger::part(base) {\n @include button-theme-primary-danger;\n}\n\n.c-button-variant--secondary::part(base) {\n @include button-theme-secondary;\n}\n\n.c-button-variant--secondary.c-button-level--danger::part(base) {\n @include button-theme-secondary-danger;\n}\n\n.c-button-variant--tertiary::part(base) {\n @include button-theme-tertiary;\n}\n\n.c-button-variant--tertiary.c-button-level--danger::part(base) {\n @include button-theme-tertiary-danger;\n}\n\n/**\n * Override Shoelace's default disabled styles\n * (The danger styles seem fine)\n */\n:not(.c-button-level--danger) {\n &.c-button-variant--primary[disabled]::part(base) {\n @include button-theme($color-gray-500, $color-gray-200, $color-gray-200);\n }\n\n &.c-button-variant--secondary[disabled]::part(base) {\n @include button-theme($color-gray-500, $color-gray-500, transparent);\n }\n\n &.c-button-variant--tertiary[disabled]::part(base) {\n @include button-theme($color-gray-500, transparent, transparent);\n }\n}\n</style>\n","<template>\n <div v-bind=\"$attrs\" class=\"c-card-header\" data-test=\"card-header\">\n <div data-test=\"card-title\" class=\"c-card-header__title\">\n <slot />\n </div>\n\n <div class=\"c-card-header__append\">\n <slot name=\"append\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { provide, ref } from 'vue';\n\nimport { TERTIARY as TERTIARY_ICON_BUTTON } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\ndefineSlots<{\n default?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-header {\n @include subheadline;\n\n display: flex;\n}\n\n.c-card-header__title {\n flex: 1 1 auto;\n padding: 16px 16px 8px;\n}\n\n.c-card-header__append {\n align-items: center;\n display: flex;\n flex: none;\n\n .c-icon-button {\n margin-right: 8px;\n }\n\n .c-badge {\n margin-right: 8px;\n }\n}\n</style>\n","<template>\n <component\n :is=\"config.element\"\n v-bind=\"config.attrs\"\n data-test=\"card\"\n class=\"c-card\"\n :class=\"{\n 'c-card--tile': tile,\n 'c-card--borderless': borderless,\n 'c-card--link': config.isLink,\n 'c-card--stretch': stretch,\n }\"\n :href=\"href\"\n :style=\"{\n '--background-color': backgroundCssColor,\n '--border-color': borderCssColor,\n }\"\n :to=\"to\"\n >\n <CCardHeader v-if=\"title\">\n {{ title }}\n </CCardHeader>\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, useAttrs } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CCardHeader from '@propelinc/citrus-ui/src/components/CCardHeader.vue';\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\n\ntype RoutingVariant = 'none' | 'internal' | 'external';\n\nexport interface InternalCardConfig {\n attrs: Record<string, unknown>;\n element: string;\n isLink: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Sets the border color of the card */\n borderColor?: string;\n /** Removes the border of the card */\n borderless?: boolean;\n /** Sets the background color of the entire card */\n color?: string;\n /** Navigates externally on click */\n href?: string;\n /** Stretches the card vertically to fill the height of the parent container */\n stretch?: boolean;\n /** Toggles a squared-off card style intended to fill the width of the page */\n tile?: boolean;\n /** Sets the title of the card */\n title?: string;\n /** Navigates within the app on click */\n to?: RouteLocationRaw;\n }>(),\n {\n borderColor: undefined,\n borderless: false,\n color: undefined,\n href: undefined,\n stretch: false,\n tile: false,\n title: undefined,\n to: undefined,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst attrs = useAttrs();\n\nconst { cssColor: backgroundCssColor } = useCssColor(() => props.color);\nconst { cssColor: borderCssColor } = useCssColor(() => props.borderColor);\n\nconst routingVariant = computed<RoutingVariant>(() => {\n if (props.to) {\n return 'internal';\n }\n\n if (props.href) {\n return 'external';\n }\n\n return 'none';\n});\n\nconst config = computed<InternalCardConfig>(() => {\n switch (routingVariant.value) {\n case 'internal':\n return {\n attrs,\n element: 'router-link',\n isLink: true,\n };\n\n case 'external':\n return {\n attrs: {\n ...attrs,\n role: 'link',\n tabindex: '0',\n target: '_blank',\n },\n element: 'a',\n isLink: true,\n };\n\n case 'none':\n default:\n return { attrs, element: 'div', isLink: false };\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card {\n --background-color: #{$color-background};\n --border-color: #{$color-border};\n --border-radius: #{$border-radius-next};\n --text-color: #{$color-text-primary};\n\n background-color: var(--background-color);\n border-color: var(--border-color);\n border-radius: var(--border-radius);\n border-style: solid;\n border-width: $border-width;\n color: var(--text-color);\n display: block;\n max-width: 100%;\n overflow: hidden;\n\n /**\n * FIXME: (kyleshevlin - https://linear.app/slanden/issue/FE-37/remove-exported-margins):\n * This is an \"exported margin\" and we should try to remove it. They make composition difficult.\n * Read more here: https://kyleshevlin.com/no-outer-margin\n *\n * For example, imagine we want to have multiple cards in a row. This selector will add a\n * margin-top to every card except the first. That would not be desired.\n *\n * Ideally, layout of sibling cards is always handled by a parent element.\n */\n & + & {\n margin-top: 8px;\n }\n}\n\n.c-card--tile {\n --border-radius: 0;\n\n border-left: none;\n border-right: none;\n}\n\n.c-card--borderless {\n --border-color: transparent;\n}\n\n.c-card--link {\n cursor: pointer;\n}\n\n.c-card--stretch {\n height: 100%;\n}\n</style>\n","<template>\n <CButtonStack v-bind=\"$attrs\" data-test=\"card-footer\" class=\"c-card-footer\">\n <slot />\n </CButtonStack>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-footer {\n padding: 0 16px 16px;\n}\n</style>\n","<template>\n <div\n v-bind=\"$attrs\"\n data-test=\"card-section\"\n class=\"c-card-section\"\n :class=\"{ 'c-card-section--fluid': fluid }\"\n >\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nwithDefaults(\n defineProps<{\n /** Removes the padding from the content */\n fluid?: boolean;\n }>(),\n {\n fluid: false,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-section {\n padding: 0 16px 16px;\n\n &:first-child:not(.c-card-section--fluid) {\n padding-top: 16px;\n }\n}\n\n.c-card-section--fluid {\n padding: 0;\n}\n</style>\n","<template>\n <div\n v-if=\"!isHidden\"\n :data-test=\"dataTest\"\n class=\"c-validation-message\"\n :class=\"{ 'c-validation-message--invalid': !!validationMessage }\"\n >\n <CFadeTransition aria-live=\"polite\">\n <span v-if=\"validationMessage\" key=\"message\" role=\"alert\" :data-test=\"`${dataTest}-text`\">\n {{ validationMessage }}\n </span>\n <!-- NOTE(mohan): Always keep an empty span to make sure the flex layout is stable. -->\n <span v-else key=\"empty\">\n <slot />\n </span>\n </CFadeTransition>\n\n <slot name=\"append\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CFadeTransition from '@propelinc/citrus-ui/src/components/CFadeTransition.vue';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** Test selector for the component */\n dataTest?: string;\n /**\n * Whether to hide the component. If \"auto\", the component will automatically\n * hide itself if it has no content.\n */\n hide?: boolean | 'auto';\n /** Validation message to display */\n validationMessage?: string | null;\n }>(),\n {\n dataTest: 'validation-message',\n hide: false,\n validationMessage: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nconst appendSlotHasContent = useSlotHasContent('append');\nconst isHidden = computed(() => {\n if (props.hide === 'auto') {\n return !props.validationMessage && !appendSlotHasContent.value;\n } else {\n return props.hide;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-validation-message {\n @include caption;\n\n display: flex;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.c-validation-message--invalid {\n color: $color-status-error;\n}\n</style>\n","import type { Ref } from 'vue';\nimport { computed } from 'vue';\n\nlet idCounter = 0;\n\n/**\n * Generates a unique ID for a component.\n *\n * This is a very rudimentary backport of Vue 3.5's `useId` composable that is\n * _not_ stable across server and client.\n *\n * @param id - The ID to use. If not provided, a unique ID will be generated.\n * @returns A computed value that returns the provided ID or a unique ID.\n */\nexport function useId(id: Ref<string | null | undefined>): Ref<string> {\n return computed(() => {\n if (id.value) {\n return id.value;\n } else {\n return `c-${idCounter++}`;\n }\n });\n}\n","import type { InjectionKey } from 'vue';\n\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\nexport const VALIDATIONS = Symbol('validations') as InjectionKey<{\n register: (input: ValidationState) => void;\n unregister: (id: string) => void;\n}>;\n","import type { Ref } from 'vue';\nimport { computed, inject, onBeforeUnmount, ref, unref, watch } from 'vue';\n\nimport { VALIDATIONS } from '@propelinc/citrus-ui/src/services/injections/forms';\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\nexport type Rule<Value extends string | boolean> = (value: Value) => string | boolean;\nexport type Rules<Value extends string | boolean> = Rule<Value>[];\n\nexport type ValidationEvent = 'blur' | 'input' | 'change';\n\nexport interface UseValidationRuleCheckOptions<Value extends string | boolean> {\n value: Ref<Value>;\n rules: Ref<Rules<Value>>;\n required?: Ref<boolean>;\n onValidationResultChange?: ({\n message,\n valid,\n }: {\n message: string | null;\n valid: boolean;\n }) => void;\n}\n\ninterface UseValidationRuleCheckReturn {\n /** The validation error message, if any. */\n message: Ref<string | null>;\n /** Whether the input element is valid. This is only set after\n * `startValidating` is called. */\n valid: Ref<boolean>;\n /** Whether the input element is valid regardless of whether `startValidating`\n * has been called. */\n passesRules: Ref<boolean>;\n /** Starts the validation process. */\n startValidating: () => boolean;\n /** Clears the validation results. */\n clearValidations: () => void;\n}\n\n/**\n * A composable that provides manual control of validation rules for a form\n * control. For full validation support, please see the `useValidations`\n * composable.\n *\n * @see {@link useValidations}\n *\n * @param options - The options for the composable.\n */\nexport function useValidationRuleCheck<Value extends string | boolean>(\n options: UseValidationRuleCheckOptions<Value>\n): UseValidationRuleCheckReturn {\n const { value, rules, required } = options;\n const active = ref(false);\n\n const message = ref<string | null>(null);\n const valid = ref(true);\n\n const isEmpty = (v: Value): boolean =>\n v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n const requiredRule: Rule<Value> = (val: Value): boolean => {\n return required?.value ? !isEmpty(val) : true;\n };\n\n const rulesResult = computed(() => {\n const allRules: Rules<Value> = [...rules.value, requiredRule];\n for (const rule of allRules) {\n const result = rule(value.value);\n if (result === false || typeof result === 'string') {\n return result;\n }\n }\n return true;\n });\n\n const passesRules = computed(() => rulesResult.value === true);\n\n const validate = (): boolean => {\n if (active.value) {\n valid.value = passesRules.value;\n message.value = typeof rulesResult.value === 'string' ? rulesResult.value : null;\n options.onValidationResultChange?.({ message: message.value, valid: valid.value });\n }\n\n return valid.value;\n };\n\n watch(value, () => validate(), { immediate: true });\n watch(rules, () => validate());\n\n if (required) {\n watch(required, () => validate());\n }\n\n const startValidating = (): boolean => {\n active.value = true;\n return validate();\n };\n\n const clearValidations = (): void => {\n message.value = null;\n valid.value = true;\n active.value = false;\n };\n\n return { message, valid, startValidating, clearValidations, passesRules };\n}\n\nexport interface UseValidationsOptions<Value extends string | boolean> {\n id?: Ref<string>;\n /** The input element. The `aria-invalid` attribute will be set on this\n * element. */\n field?: Ref<HTMLElement | null>;\n /** The value of the input element. */\n value: Ref<Value>;\n /** The validation rules to apply to the input element. */\n rules: Ref<Rules<Value>>;\n /** Value of the required attribute. */\n required?: Ref<boolean>;\n /** Which event to wait for before starting validation. */\n validateOn?: ValidationEvent | Ref<ValidationEvent>;\n}\n\ninterface UseValidationsReturn {\n /** The validation error message, if any. */\n message: Ref<string | null>;\n /** Whether the input element is valid. */\n valid: Ref<boolean | null>;\n /** The event listeners to bind to the component using `v-on`. */\n listeners: Record<string, (event: Event) => void>;\n /** Triggers validation. */\n startValidating: () => boolean;\n /** Clears the validation results. */\n clearValidations: () => void;\n}\n\n/** Registers this field with a parent form to enable form-wide validation. */\nexport type ValidationStateWithOptionalId = Omit<ValidationState, 'id'> & { id?: string };\nexport function useFormValidationSupport(state: ValidationStateWithOptionalId): void {\n const formValidations = inject(VALIDATIONS, null);\n if (formValidations) {\n if (!state.id) {\n throw new Error('id is required to support form validations');\n }\n\n formValidations.register(state as ValidationState);\n }\n\n onBeforeUnmount(() => {\n if (formValidations && state.id) {\n formValidations.unregister(state.id);\n }\n });\n}\n\n/**\n * A composable that provides validation support for form controls. Please make sure to\n * `v-bind` the returned `attrs` and `v-on` the returned `listeners` to the component.\n *\n * @param options - The options for the composable.\n */\nexport function useValidations<Value extends string | boolean>(\n options: UseValidationsOptions<Value>\n): UseValidationsReturn {\n const validateOn = computed(() => unref(options.validateOn) ?? 'blur');\n\n const onValidationResultChange = ({ valid }: { valid: boolean }): void => {\n if (options.field?.value) {\n options.field.value.setAttribute('aria-invalid', valid ? 'false' : 'true');\n }\n };\n\n const { message, valid, startValidating, passesRules, clearValidations } = useValidationRuleCheck(\n {\n value: options.value,\n rules: options.rules,\n required: options.required,\n onValidationResultChange,\n }\n );\n\n useFormValidationSupport({\n id: options.id?.value,\n valid: passesRules,\n validate: startValidating,\n field: options.field,\n });\n\n const onInput = (): void => {\n if (validateOn.value === 'input') {\n startValidating();\n }\n };\n\n const onBlur = (): void => {\n // NOTE(slanden): We always validate on blur, regardless of the validateOn setting.\n startValidating();\n };\n\n const onChange = (): void => {\n if (validateOn.value === 'change') {\n startValidating();\n }\n };\n\n watch(validateOn, (newValue, oldValue): void => {\n if (['input', 'change'].includes(newValue) && newValue !== oldValue) {\n startValidating();\n }\n });\n\n const listeners = { input: onInput, blur: onBlur, change: onChange };\n return { message, valid, listeners, startValidating, clearValidations };\n}\n","<template>\n <div class=\"c-checkbox__container\">\n <label\n class=\"c-checkbox\"\n :class=\"{\n 'c-checkbox--checked': internalValue,\n 'c-checkbox--invalid': !isValidationValid,\n 'c-checkbox--contained': variant === 'contained',\n }\"\n :data-test=\"dataTest\"\n >\n <input\n :id=\"idWithFallback\"\n type=\"checkbox\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-checkbox__input\"\n :aria-checked=\"internalValue\"\n :aria-describedby=\"`${idWithFallback}-message`\"\n :aria-invalid=\"!isValidationValid\"\n :checked=\"internalValue || undefined\"\n @change=\"onChange\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n v-on=\"validationListeners\"\n />\n <span class=\"c-checkbox__control\" :data-test=\"`${dataTest}-control`\">\n <FontAwesomeIcon v-if=\"internalValue\" :icon=\"faCheck\" />\n </span>\n <slot name=\"label\">{{ label }}</slot>\n </label>\n\n <CValidationMessage\n class=\"c-checkbox__message\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faCheck } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { ref, toRefs } from 'vue';\n\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test selector */\n dataTest?: string;\n /** Hides the validation message area. */\n hideDetails?: boolean | 'auto';\n /** Assigns the checkbox's id */\n id?: string | null;\n /** The label text for the checkbox */\n label?: string;\n /**\n * An array of functions that either return either true / false or a string\n * containing an error message. The component passes the input value as an\n * argument. The input field will enter an error state if a function does\n * not return true.\n */\n rules?: ((value: boolean) => string | boolean)[];\n /** Whether the checkbox is checked */\n value?: boolean;\n /**\n * Controls the appearance of the checkbox.\n * @default 'contained'\n */\n variant?: 'contained' | 'minimal';\n }>(),\n {\n dataTest: 'checkbox',\n hideDetails: false,\n id: null,\n label: undefined,\n rules: () => [],\n value: false,\n variant: 'contained',\n }\n);\n\nconst emit = defineEmits<{\n (e: 'change', value: boolean): void;\n (e: 'focus'): void;\n (e: 'blur'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst internalValue = useInternalValue(value, {\n onChange: (value) => emit('change', value),\n});\n\nconst checkbox = ref<HTMLInputElement | null>(null);\n\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n validateOn: 'change',\n field: checkbox,\n});\n\nconst onChange = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n internalValue.value = !!target.checked;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-checkbox {\n align-items: flex-start;\n cursor: pointer;\n display: flex;\n gap: 8px;\n transition: border-color $citrus-field-transition-duration ease;\n\n --padding: 12px;\n\n &--contained {\n background-color: $color-background;\n border: $border;\n border-radius: $border-radius-next;\n padding: var(--padding);\n width: 100%;\n\n &.c-checkbox--checked {\n border-color: $color-black;\n border-width: $border-width;\n }\n\n &.c-checkbox--invalid {\n border-color: $color-status-error;\n }\n }\n\n &--invalid {\n color: $color-status-error;\n }\n}\n\n.c-checkbox__input {\n @include sr-only;\n}\n\n.c-checkbox__control {\n align-items: center;\n border: $color-gray-300 solid $border-width;\n border-radius: 4px;\n color: $color-white;\n display: flex;\n flex-shrink: 0;\n height: 22px;\n justify-content: center;\n width: 22px;\n\n .c-checkbox--checked & {\n background-color: $color-black;\n border-color: $color-black;\n }\n\n .c-checkbox--invalid & {\n border-color: $color-status-error;\n }\n}\n\n.c-checkbox__input:focus-visible ~ .c-checkbox__control {\n @include focus-ring;\n}\n\n.c-checkbox__message {\n margin-top: 4px;\n}\n</style>\n","<template>\n <div class=\"c-col\" :class=\"{ [`c-col-${cols}`]: cols }\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\ntype Cols = 'auto' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12';\n\nwithDefaults(\n defineProps<{\n /**\n * Sets the default number of columns the component extends.\n * Available options are: 1 -> 12 and auto.\n */\n cols?: Cols | null;\n }>(),\n {\n cols: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n.c-col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n\n &:not(.c-col-auto) {\n padding: 12px;\n width: 100%;\n }\n}\n\n.c-col-auto {\n flex: 0 0 auto;\n max-width: 100%;\n width: auto;\n}\n\n@for $i from 1 through 12 {\n .c-col-#{$i} {\n flex: 0 0 calc(#{$i} / 12 * 100%);\n max-width: calc(#{$i} / 12 * 100%);\n }\n}\n</style>\n","<template>\n <hr\n class=\"c-divider\"\n :class=\"{ 'c-divider--vertical': vertical }\"\n :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\"\n />\n</template>\n\n<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** Displays dividers vertically. */\n vertical?: boolean;\n }>(),\n {\n vertical: false,\n }\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-divider {\n border: solid $color-gray-200;\n border-width: thin 0 0;\n display: block;\n flex: 1 1 0px;\n height: 0;\n max-height: 0;\n max-width: 100%;\n transition: inherit;\n}\n\n.c-divider--vertical {\n align-self: stretch;\n border-width: 0 thin 0 0;\n display: inline-flex;\n height: inherit;\n margin: 0 -1px;\n max-height: 100%;\n max-width: 0;\n min-height: 100%;\n vertical-align: text-bottom;\n width: 0;\n}\n</style>\n","<template>\n <div>{{ displayText }}</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n /** Sets the denominator of the counter. */\n counter?: number | null;\n /** Function or number that determines the numerator of the counter. */\n counterValue?: number | (() => number | null) | null;\n /** Input value of the parent form field */\n value?: string;\n }>(),\n {\n counter: null,\n counterValue: null,\n value: '',\n }\n);\n\nconst numerator = computed(() => {\n if (typeof props.counterValue === 'function') {\n return props.counterValue();\n } else if (typeof props.counterValue === 'number') {\n return props.counterValue;\n } else {\n return props.value.length;\n }\n});\n\nconst displayText = computed(() => {\n return `${numerator.value}/${props.counter}`;\n});\n</script>\n","import { onMounted, useAttrs } from 'vue';\n\nexport function useA11yLabelCheck(componentName: string, props?: Record<string, unknown>): void {\n const attrs = useAttrs();\n\n onMounted(() => {\n const enableCheck = process.env.VUE_APP_DEBUG === 'yes' || process.env.NODE_ENV === 'test';\n if (!enableCheck) {\n return;\n }\n\n if (\n attrs.title ||\n props?.title ||\n attrs['aria-label'] ||\n props?.ariaLabel ||\n attrs['aria-labelledby'] ||\n props?.ariaLabelledby ||\n attrs['aria-hidden'] ||\n props?.ariaHidden\n ) {\n return;\n }\n\n console.error(\n `Missing ${componentName} label. This component won't be intelligible to screen readers. Typically, this is resolved by providing an aria-label.`\n );\n });\n}\n","<template>\n <CButton\n v-bind=\"$attrs\"\n class=\"c-icon-button\"\n :class=\"{\n 'c-icon-button--inherit': inheritColor,\n [`c-icon-button-size--${computedSize}`]: computedSize,\n }\"\n :data-inherit-color=\"inheritColor\"\n :data-size=\"computedSize\"\n data-test=\"icon-button\"\n :disabled=\"disabled\"\n :href=\"href\"\n :level=\"level\"\n :loading=\"loading\"\n :size=\"computedSize\"\n :target=\"target\"\n :to=\"to\"\n :variant=\"computedVariant\"\n @blur=\"$emit('blur', $event)\"\n @click=\"$emit('click', $event)\"\n @focus=\"$emit('focus', $event)\"\n >\n <div\n role=\"img\"\n data-test=\"icon-button-a11y\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n >\n <slot>\n <font-awesome-icon\n v-if=\"icon\"\n class=\"c-icon-button__icon\"\n :class=\"{ 'c-icon-button__icon--spin': spinIcon }\"\n data-test=\"icon-button-icon\"\n :icon=\"icon\"\n />\n </slot>\n </div>\n </CButton>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/pro-light-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { computed, inject, provide } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CButton from '@propelinc/citrus-ui/src/components/CButton/CButton.vue';\nimport type {\n ButtonLevel,\n ButtonSize,\n ButtonVariant,\n} from '@propelinc/citrus-ui/src/components/CButton/types';\nimport { useA11yLabelCheck } from '@propelinc/citrus-ui/src/composables/accessibility';\nimport { BOUNCE_AMOUNT } from '@propelinc/citrus-ui/src/services/injections/buttons';\nimport { INHERIT_COLOR, TERTIARY } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nconst props = withDefaults(\n defineProps<{\n /** ARIA label for the button. You must use either this or ariaLabelledby. */\n ariaLabel?: string;\n /** ARIA labelledby for the button. You must use either this or ariaLabel. */\n ariaLabelledby?: string;\n /** Controls whether button is disabled */\n disabled?: boolean;\n /** Designates the button as an anchor and applies the href attribute */\n href?: string;\n /** Specifies a Font Awesome icon */\n icon?: string | string[] | IconDefinition;\n /**\n * Controls whether button uses the large variant\n * @deprecated Use `size=\"large\"` instead\n */\n large?: boolean;\n /**\n * Controls the level of the button\n * @default 'normal'\n */\n level?: ButtonLevel;\n /** Controls whether button is loading */\n loading?: boolean;\n /**\n * Controls whether button uses the secondary variant\n * @deprecated Use `variant=\"secondary\"` instead\n */\n secondary?: boolean;\n /**\n * Controls the size of the button\n * @default 'medium'\n */\n size?: ButtonSize;\n /** Spins the icon for loading states */\n spinIcon?: boolean;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /**\n * Controls whether button uses the tertiary variant\n * @deprecated Use `variant=\"tertiary\"` instead\n */\n tertiary?: boolean;\n /** Controls whether button functions as a router-link */\n to?: RouteLocationRaw;\n /**\n * Controls the variant of the button\n * @default 'primary'\n */\n variant?: ButtonVariant;\n }>(),\n {\n ariaLabel: undefined,\n ariaLabelledby: undefined,\n disabled: false,\n href: undefined,\n icon: undefined,\n large: false,\n level: 'normal',\n loading: false,\n secondary: false,\n size: 'medium',\n spinIcon: false,\n target: undefined,\n tertiary: false,\n to: undefined,\n variant: 'primary',\n }\n);\n\ndefineEmits<{\n blur: [event: Event];\n click: [event: MouseEvent];\n focus: [event: Event];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nuseA11yLabelCheck('CIconButton', props);\n\nconst injectedTertiary = inject(TERTIARY, undefined);\nconst injectedOrPropTertiary = computed(() => injectedTertiary?.value ?? props.tertiary);\n/**\n * Handle the `variant` prop. `secondary` and `tertiary` are deprecated, but because we set a\n * default `variant`, we need to give them precedence.\n *\n * This is slightly different than the implementation of `computedVariant` in CButton, as\n * `CButton` does not make use of an injected `TERTIARY` value.\n */\nconst computedVariant = computed((): ButtonVariant => {\n if (props.secondary) {\n return 'secondary';\n }\n\n if (injectedOrPropTertiary.value) {\n return 'tertiary';\n }\n\n return props.variant;\n});\n\n/**\n * Handle the `size` prop. `large` is deprecated, but because we set a default `size`, we need\n * to give it precedence.\n */\nconst computedSize = computed((): ButtonSize => {\n if (props.large) {\n return 'large';\n }\n\n return props.size;\n});\n\nconst inheritColor = inject(INHERIT_COLOR, undefined);\n\nprovide(BOUNCE_AMOUNT, 0.9);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-icon-button::part(base) {\n font-size: $font-size-icon-medium;\n line-height: 0;\n padding: 0;\n width: $button-size-medium;\n}\n\n.c-icon-button--inherit::part(base) {\n color: inherit;\n}\n\n.c-icon-button::part(label) {\n align-items: center;\n display: flex;\n justify-content: center;\n padding: 0;\n}\n\n.c-icon-button-size--large::part(base) {\n width: $button-size-large;\n}\n\n.c-icon-button__icon--spin {\n animation: $loader-spin-animation;\n}\n</style>\n","import { getCurrentInstance } from 'vue';\n\nexport function useTranslation(): {\n t: (key: string, interpolations?: Record<string, string | number>) => string;\n} {\n const currentInstance = getCurrentInstance();\n\n if (!currentInstance || !currentInstance.proxy) {\n throw new Error('useTranslation must be called within a Vue component');\n }\n\n return { t: currentInstance.proxy.$t };\n}\n","<template>\n <div\n class=\"c-text-field\"\n :class=\"[\n {\n 'c-text-field--disabled': disabled,\n 'c-text-field--invalid': isInvalid,\n 'c-text-field--hide-label': hideLabel,\n 'c-text-field--focused': isFocused,\n 'c-text-field--medium': size === 'medium',\n 'c-text-field--large': size === 'large',\n },\n $attrs.class,\n ]\"\n :data-test=\"dataTest\"\n :style=\"rootStyles\"\n >\n <label class=\"c-text-field__label\" :for=\"idWithFallback\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </label>\n\n <div class=\"c-text-field__container\">\n <div\n v-if=\"prefixSlotHasContent\"\n class=\"c-text-field__prefix\"\n :data-test=\"`${dataTest}-prefix`\"\n >\n <slot name=\"prepend-inner\" />\n </div>\n\n <input\n v-bind=\"fallthroughAttrs\"\n :id=\"idWithFallback\"\n ref=\"input\"\n class=\"c-text-field__input\"\n :class=\"{\n 'c-text-field__input--has-prefix': prefixSlotHasContent,\n 'c-text-field__input--has-suffix': suffixSlotHasContent,\n 'c-text-field__input--clearable': clearable && value,\n 'c-text-field__input--hideable': hideable,\n }\"\n :data-test=\"`${dataTest}-input`\"\n :aria-label=\"ariaLabel || label || undefined\"\n :aria-describedby=\"`${idWithFallback}-validation-message ${idWithFallback}-message`\"\n :aria-invalid=\"isInvalid ? 'true' : 'false'\"\n :type=\"inputType\"\n :placeholder=\"placeholder\"\n :minlength=\"minlength\"\n :maxlength=\"maxlength\"\n :disabled=\"disabled\"\n :value=\"inputValue\"\n :inputmode=\"inputmode\"\n :required=\"required\"\n @keyup=\"$emit('keyup', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n @keypress=\"$emit('keypress', $event)\"\n @click=\"$emit('click', $event)\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <CIconButton\n v-if=\"clearable && value\"\n :aria-label=\"$t('Clear')\"\n :data-test=\"`${dataTest}-clear`\"\n class=\"c-text-field__clear-btn c-text-field__suffix-btn\"\n type=\"button\"\n tertiary\n :icon=\"faXmark\"\n @click=\"clearInput\"\n />\n\n <CIconButton\n v-if=\"hideable\"\n :aria-label=\"hideToggleAriaLabel\"\n :data-test=\"`${dataTest}-hide-toggle`\"\n :data-hidden=\"inputHidden || undefined\"\n class=\"c-text-field__suffix-btn\"\n type=\"button\"\n tertiary\n :icon=\"inputHidden ? faEye : faEyeSlash\"\n @click=\"toggleHidden\"\n />\n\n <div\n v-if=\"suffixSlotHasContent\"\n class=\"c-text-field__suffix\"\n :data-test=\"`${dataTest}-suffix`\"\n >\n <slot name=\"append\" />\n </div>\n </div>\n\n <CValidationMessage\n :id=\"`${idWithFallback}-validation-message`\"\n class=\"c-text-field__validation-message\"\n :data-test=\"`${dataTest}-validation-message`\"\n :validation-message=\"errorMessage || validationMessage\"\n :hide=\"hideDetails\"\n >\n <template #append>\n <CFormFieldCounter\n v-if=\"counter\"\n :data-test=\"`${dataTest}-counter`\"\n :counter=\"counter\"\n :counter-value=\"counterValue !== null ? counterValue : undefined\"\n :value=\"inputValue\"\n />\n </template>\n </CValidationMessage>\n\n <div\n v-if=\"messageSlotHasContent\"\n :id=\"`${idWithFallback}-message`\"\n class=\"c-text-field__message\"\n :data-test=\"`${dataTest}-message`\"\n >\n <slot name=\"message\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n// NOTE(slanden): These rules do not properly handle multiple script tags in Vue\n// eslint-disable-next-line import/order, import/no-duplicates\nimport type { Ref } from 'vue';\n\nexport interface CTextFieldExposed {\n input: Ref<HTMLInputElement | null>;\n focus: () => void;\n blur: () => void;\n startValidating: () => void;\n}\n</script>\n\n<script setup lang=\"ts\">\n// eslint-disable-next-line import/order\nimport { faEye, faEyeSlash, faXmark } from '@fortawesome/pro-regular-svg-icons';\n// eslint-disable-next-line import/no-duplicates\nimport type { StyleValue, VNode } from 'vue';\nimport { computed, onMounted, ref, toRefs, useAttrs, useSlots } from 'vue';\n\nimport CFormFieldCounter from '@propelinc/citrus-ui/src/components/CFormFieldCounter.vue';\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n id?: string | null;\n label?: string | null;\n ariaLabel?: string | null;\n placeholder?: string;\n type?:\n | 'text'\n | 'password'\n | 'email'\n | 'tel'\n | 'url'\n | 'search'\n | 'number'\n | 'decimal'\n | 'numeric';\n clearable?: boolean;\n size?: 'medium' | 'large';\n inputmode?: 'text' | 'search' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal';\n minlength?: number | string;\n maxlength?: number | string;\n disabled?: boolean;\n hideable?: boolean;\n hideLabel?: boolean;\n hideDetails?: boolean | 'auto';\n value?: string;\n dataTest?: string;\n counter?: number | null;\n counterValue?: number | (() => number | null) | null;\n rules?: Rules<string>;\n validateOnBlur?: boolean;\n required?: boolean;\n /**\n * Overrides the default validation message. If provided, this error message will always\n * be shown, regardless of any other failing validation rules.\n */\n errorMessage?: string;\n }>(),\n {\n id: null,\n label: null,\n ariaLabel: null,\n placeholder: '',\n type: 'text',\n clearable: false,\n size: 'medium',\n inputmode: undefined,\n minlength: undefined,\n maxlength: undefined,\n disabled: false,\n hideable: false,\n hideLabel: false,\n hideDetails: false,\n value: '',\n dataTest: 'text-field',\n counter: null,\n counterValue: null,\n rules: () => [],\n validateOnBlur: true,\n required: false,\n errorMessage: undefined,\n }\n);\n\nconst emit = defineEmits<{\n 'keyup': [event: KeyboardEvent];\n 'keydown': [event: KeyboardEvent];\n 'keypress': [event: KeyboardEvent];\n 'input': [value: string];\n 'focus': [event: Event];\n 'blur': [event: Event];\n 'change': [value: string];\n 'click': [event: MouseEvent];\n 'click:hide': [hidden: boolean];\n}>();\n\ndefineSlots<{\n 'label'?: () => VNode[];\n 'prepend-inner'?: () => VNode[];\n 'append'?: () => VNode[];\n 'message'?: () => VNode[];\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst { t } = useTranslation();\n\nconst isFocused = ref(false);\nconst inputHidden = ref(true);\nconst inputType = computed(() => (props.hideable && inputHidden.value ? 'password' : props.type));\nconst hideToggleAriaLabel = computed(() => {\n return props.hideable && inputHidden.value ? t('Show input value') : t('Hide input value');\n});\n\nconst { id, value, rules, required } = toRefs(props);\n\nconst idWithFallback = useId(id);\n\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('input', newValue);\n },\n});\n\nconst input = ref<HTMLInputElement | null>(null);\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n startValidating,\n} = useValidations({\n id: idWithFallback,\n value: inputValue,\n rules,\n required,\n validateOn: computed(() => (props.validateOnBlur ? 'blur' : 'input')),\n field: input,\n});\n\nconst isInvalid = computed(() => !isValidationValid.value || !!props.errorMessage);\n\nconst prefixSlotHasContent = useSlotHasContent('prepend-inner');\nconst suffixSlotHasContent = useSlotHasContent('append');\nconst messageSlotHasContent = useSlotHasContent('message');\n\nconst toggleHidden = (): void => {\n inputHidden.value = !inputHidden.value;\n emit('click:hide', inputHidden.value);\n};\n\nconst onInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n if (target.value !== inputValue.value) {\n inputValue.value = target.value;\n validationListeners.input(event);\n }\n};\n\nconst onChange = (event: Event): void => {\n validationListeners.change(event);\n const target = event.target as HTMLInputElement;\n emit('change', target.value);\n};\n\nconst onFocus = (event: Event): void => {\n isFocused.value = true;\n emit('focus', event);\n};\n\nconst onBlur = (event: Event): void => {\n isFocused.value = false;\n validationListeners.blur(event);\n emit('blur', event);\n};\n\nconst clearInput = (): void => {\n emit('input', '');\n};\n\nconst focus = (): void => {\n input.value?.focus();\n};\n\nconst blur = (): void => {\n input.value?.blur();\n};\n\nonMounted(() => {\n if (!props.label && !slots.label && !props.ariaLabel) {\n console.error(\n 'Missing CTextField label. Please provide a label prop, an ariaLabel prop or pass a label via the label slot.'\n );\n }\n});\n\nconst exposedAPI: CTextFieldExposed = { input, focus, blur, startValidating };\ndefineExpose(exposedAPI);\n\nconst fallthroughAttrs = computed(() => {\n const { class: _, style: __, ...rest } = attrs;\n return rest;\n});\n\nconst rootStyles = computed(() => attrs.style as StyleValue);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-text-field__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 8px;\n transition: color $citrus-field-transition-duration ease;\n}\n\n.c-text-field__container {\n align-items: center;\n background-color: $color-background;\n border: $border-width solid $color-gray-200;\n border-radius: $border-radius-next;\n display: flex;\n transition: border-color $citrus-field-transition-duration ease;\n}\n\n.c-text-field--focused .c-text-field__container {\n border-color: $color-black;\n}\n\n.c-text-field--invalid .c-text-field__label {\n color: $color-status-error;\n}\n\n.c-text-field--invalid .c-text-field__container {\n border-color: $color-status-error;\n color: $color-status-error;\n}\n\n.c-text-field--hide-label .c-text-field__label {\n @include sr-only;\n}\n\n.c-text-field--disabled .c-text-field__label {\n color: $color-text-disabled;\n}\n\n.c-text-field--disabled .c-text-field__container {\n background-color: $color-gray-100;\n color: $color-text-disabled;\n}\n\n.c-text-field__input {\n background-color: transparent;\n border: none;\n border-radius: $border-radius-next;\n flex: 1 1 0%;\n outline: none;\n width: 100%;\n\n &--has-prefix {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n }\n\n &--has-suffix {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n.c-text-field__suffix-btn {\n margin-right: 4px;\n}\n\n.c-text-field__clear-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1rem;\n margin-left: 0.5rem;\n}\n\n/* Size Variants */\n.c-text-field--medium .c-text-field__input {\n padding: 12px 16px;\n\n &--clearable,\n &--hideable {\n padding-right: 0;\n }\n\n &--has-suffix {\n padding-right: 8px;\n }\n}\n\n.c-text-field--large .c-text-field__input {\n padding: 24px;\n\n &--clearable,\n &--hideable {\n padding-right: 0;\n }\n\n &--has-suffix {\n padding-right: 8px;\n }\n}\n\n.c-text-field__prefix {\n flex: 0 0 auto;\n margin-left: 16px;\n}\n\n.c-text-field__suffix {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n gap: 12px;\n margin-right: 16px;\n}\n\n.c-text-field__validation-message {\n margin-top: 4px;\n}\n\n.c-text-field__message {\n @include caption;\n\n color: $color-gray-500;\n margin-bottom: 16px;\n}\n</style>\n","import { Mask, MaskInput, type MaskInputOptions, type MaskOptions, type MaskaDetail } from 'maska';\nimport { type Ref, computed, watch } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\n\nconst toNumber = (value: number | string | null): number | null => {\n if (value === null || value === '') {\n return null;\n } else if (typeof value === 'number') {\n return value;\n } else {\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? null : parsed;\n }\n};\n\nexport function useInputMask(\n /** Element to be masked */\n input: Ref<HTMLInputElement | null>,\n /** Value passed into the input */\n value: Ref<string>,\n /**\n * Options for the mask.\n * @see https://beholdr.github.io/maska/v2/#/?id=mask-options\n */\n options: Ref<MaskInputOptions>\n): {\n mask: Ref<Mask>;\n maskedValue: Ref<string>;\n unmaskedValue: Ref<string>;\n} {\n const internalValue = useInternalValue(value);\n\n const maskOptions = computed<MaskInputOptions>((): MaskInputOptions => {\n const onMaska = options.value.onMaska;\n const onMaskaArray = Array.isArray(onMaska) ? onMaska : onMaska ? [onMaska] : [];\n return {\n ...options.value,\n onMaska: [\n (detail: MaskaDetail): void => {\n internalValue.value = detail.unmasked;\n },\n ...onMaskaArray,\n ],\n };\n });\n\n let maskInput: MaskInput | null = null;\n watch(input, (newInput) => {\n if (newInput) {\n maskInput = new MaskInput(newInput, maskOptions.value);\n } else {\n maskInput?.destroy();\n maskInput = null;\n }\n });\n\n const mask = computed(() => new Mask(maskOptions.value));\n const maskedValue = computed(() => {\n return mask.value ? mask.value.masked(internalValue.value) : value.value;\n });\n\n return {\n mask,\n maskedValue,\n unmaskedValue: internalValue,\n };\n}\n\nexport function useMaskedMinLength(\n minlength: Ref<number | string | null>,\n value: Ref<string>,\n options: Ref<MaskOptions>\n): Ref<number | null> {\n const maskTokens = computed(() => {\n // NOTE(mohan): '#', '@', '*' are the default tokens used by maska.\n return ['#', '@', '*', ...Object.keys(options.value.tokens ?? {})];\n });\n\n // NOTE(mohan): We want `minlength` to only include token characters\n // (e.g. '#' or '@') and ignore symbols like '-'. So, we iterate through\n // the mask to see how many characters are required to hit minlength tokens.\n const findMaskedMinLength = (mask: string, minlength: number): number => {\n const maskArray = mask.split('');\n const index = maskArray.findIndex((_, index) => {\n const tokensInSlice = maskArray\n .slice(0, index + 1)\n .filter((char) => maskTokens.value.includes(char));\n return tokensInSlice.length === minlength;\n });\n\n if (index === -1) {\n return mask.length;\n } else {\n // Convert index to length\n return index + 1;\n }\n };\n\n const maskedMinLength = computed(() => {\n const mask = options.value.mask;\n const minlengthValue = toNumber(minlength.value);\n\n if (!minlengthValue) {\n return null;\n } else if (!mask) {\n return minlengthValue;\n } else {\n if (typeof mask === 'function') {\n return findMaskedMinLength(mask(value.value), minlengthValue);\n } else if (typeof mask === 'string') {\n return findMaskedMinLength(mask, minlengthValue);\n } else if (Array.isArray(mask)) {\n return Math.min(...mask.map((m) => findMaskedMinLength(m, minlengthValue!)));\n } else {\n return minlengthValue;\n }\n }\n });\n\n return maskedMinLength;\n}\n\nexport function useMaskedMaxLength(\n maxlength: Ref<number | string | null>,\n options: Ref<MaskOptions>\n): Ref<number | null> {\n return computed(() => {\n const mask = options.value.mask;\n const maxlengthValue = toNumber(maxlength.value);\n if (!maxlengthValue) {\n return null;\n } else if (!mask) {\n return maxlengthValue;\n } else {\n return Math.max(maxlengthValue, mask.length);\n }\n });\n}\n","<template>\n <CTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"textField\"\n :data-test=\"dataTest\"\n :data-mask=\"mask\"\n :value=\"maskedValue\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :minlength=\"maskedMinLength !== null ? maskedMinLength : undefined\"\n :maxlength=\"maskedMaxLength !== null ? maskedMaxLength : undefined\"\n :rules=\"unmaskRules ? unmaskedRules : rules\"\n :counter=\"counter\"\n :counter-value=\"counterValue\"\n @keyup=\"$emit('keyup', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n @keypress=\"$emit('keypress', $event)\"\n @blur=\"$emit('blur', $event)\"\n @focus=\"$emit('focus', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #prepend-inner>\n <slot name=\"prepend-inner\" />\n </template>\n <template #append>\n <slot name=\"append\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { MaskInputOptions, MaskOptions, MaskTokens, MaskaDetail } from 'maska';\nimport type { VNode } from 'vue';\nimport { computed, ref, toRefs } from 'vue';\n\nimport CTextField from '@propelinc/citrus-ui/src/components/CTextField.vue';\nimport {\n useInputMask,\n useMaskedMaxLength,\n useMaskedMinLength,\n} from '@propelinc/citrus-ui/src/composables/input-mask';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n counter?: number | null;\n dataTest?: string;\n id?: string;\n label?: string | null;\n mask: MaskOptions['mask'] | null;\n minlength?: number | string | null;\n maxlength?: number | string | null;\n placeholder?: string;\n rules?: Rules<string>;\n tokens?: MaskTokens | null;\n unmaskRules?: boolean;\n value?: string;\n }>(),\n {\n counter: null,\n dataTest: 'masked-text-field',\n id: undefined,\n label: null,\n minlength: null,\n maxlength: null,\n placeholder: undefined,\n rules: () => [],\n tokens: null,\n unmaskRules: true,\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n 'keyup': [event: KeyboardEvent];\n 'keydown': [event: KeyboardEvent];\n 'keypress': [event: KeyboardEvent];\n 'input': [value: string];\n 'focus': [event: Event];\n 'blur': [event: Event];\n 'change': [value: string];\n 'input:masked': [value: string];\n}>();\n\ndefineSlots<{\n 'label'?: () => VNode[];\n 'prepend-inner'?: () => VNode[];\n 'append'?: () => VNode[];\n 'message'?: () => VNode[];\n}>();\n\nconst { minlength, maxlength, value } = toRefs(props);\n\nconst textField = ref<InstanceType<typeof CTextField> | null>(null);\nconst input = computed(() => textField.value?.input ?? null);\nconst maskOptions = computed<MaskInputOptions>(() => {\n return {\n mask: props.mask,\n tokens: {\n // NOTE (ej): For the EBT Card Number we accept a mask 'N' from the server\n // to hide all but the last 4 digits. e.g. XXXXXXXXXXXXXXX2114\n N: { pattern: /[0-9X]/ },\n ...props.tokens,\n },\n onMaska: (detail: MaskaDetail): void => {\n emit('input', detail.unmasked);\n emit('input:masked', detail.masked);\n },\n };\n});\n\nconst { maskedValue, mask: inputMask, unmaskedValue } = useInputMask(input, value, maskOptions);\nconst maskedMinLength = useMaskedMinLength(minlength, value, maskOptions);\nconst maskedMaxLength = useMaskedMaxLength(maxlength, maskOptions);\nconst counterValue = computed<number>(() => unmaskedValue.value.length);\n\nconst unmaskedRules = computed<Rules<string>>(() => {\n return props.rules.map((rule) => {\n return (value): string | boolean => {\n const unmaskedValue = inputMask.value?.unmasked(value) ?? value;\n return rule(unmaskedValue);\n };\n });\n});\n\ndefineExpose({ input });\n</script>\n","export function parseDateFromString(dateString: string): Date | null {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n}\n\nexport function calculateAge(dob: Date): number {\n // https://stackoverflow.com/a/7091965/814589\n const today = new Date();\n let age = today.getFullYear() - dob.getFullYear();\n const monthDiff = today.getMonth() - dob.getMonth();\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < dob.getDate())) {\n age--;\n }\n return age;\n}\n","import { calculateAge, parseDateFromString } from './dates';\n\nexport type validator = (v: string) => boolean;\nexport type rule = (v: string) => boolean | string;\n\n// https://gist.github.com/ShirtlessKirk/2134376\nconst makeLuhnChecker = (arr: number[]): ((s: string) => boolean) => {\n return (ccNum: string): boolean => {\n let len = ccNum.length;\n let bit = 1;\n let sum = 0;\n let val = 0;\n while (len) {\n val = parseInt(ccNum.charAt(--len), 10);\n bit ^= 1;\n sum += bit ? arr[val] : val;\n }\n return sum > 0 && sum % 10 === 0;\n };\n};\n\nexport const isLuhnValid = makeLuhnChecker([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]);\n\nexport function createMinLengthValidator(minLength: number): validator {\n return (value: string): boolean => {\n return value.length >= minLength;\n };\n}\n\nexport function createMaxLengthValidator(maxLength: number): validator {\n return (value: string): boolean => {\n return value.length <= maxLength;\n };\n}\n\nexport function ruleFromValidator(validator: validator, errorMessage: string): rule {\n return (v): string | boolean => (v && validator(v) ? true : errorMessage);\n}\n\nexport function minLengthRule(minLength: number, errorMessage: string): rule {\n return ruleFromValidator(createMinLengthValidator(minLength), errorMessage);\n}\n\nexport function maxLengthRule(maxLength: number, errorMessage: string): rule {\n return ruleFromValidator(createMaxLengthValidator(maxLength), errorMessage);\n}\n\nexport function isValidDateInAgeRange(\n minAge?: number | null | undefined,\n maxAge?: number | null | undefined\n): rule {\n return (v: string): boolean | string => {\n const dobDate = parseDateFromString(v);\n const age = dobDate ? calculateAge(dobDate) : null;\n const maxAgeTruthy = maxAge !== null && maxAge !== undefined;\n const minAgeTruthy = minAge !== null && minAge !== undefined;\n if (age === null || (maxAgeTruthy && age > maxAge) || (minAgeTruthy && age < minAge)) {\n return false;\n }\n\n return true;\n };\n}\n\n// Uses the same logic that is enforced by providers-identity.\nexport function isValidEmail(email: string): boolean {\n return /^[A-Z0-9]+([-.+_]+[A-Z0-9]+)*@([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])?\\.)+([A-Z]{2,6}|[A-Z0-9-]{2,})$/i.test(\n email\n );\n}\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n :data-test=\"dataTest\"\n :value=\"formattedDate\"\n inputmode=\"numeric\"\n name=\"dob\"\n :label=\"computedLabel\"\n :placeholder=\"computedPlaceholder\"\n :mask=\"mask\"\n :minlength=\"dateLength\"\n :maxlength=\"dateLength\"\n :unmask-rules=\"false\"\n :rules=\"computedRules\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n @blur=\"$emit('blur', $event)\"\n @focus=\"$emit('focus', $event)\"\n @input=\"emitIsoDate($event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from 'dayjs';\nimport type { VNode } from 'vue';\nimport { computed, ref, watch } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport {\n isValidDateInAgeRange,\n minLengthRule as createMinLengthRule,\n} from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test attribute for the input. */\n dataTest?: string;\n /** A unique id for the input. */\n id?: string;\n /** The input's label text. */\n label?: string | null;\n /** The input's placeholder. */\n placeholder?: string;\n /** Additional validation rules. */\n rules?: Rules<string>;\n /** The value of the input, must have the format YYYY-MM-DD or YYYY. */\n value?: string;\n /**\n * Toggles the field's year only variant. Changes default label, placeholder,\n * mask and validation behavior\n */\n yearOnly?: boolean;\n }>(),\n {\n dataTest: 'dob-field',\n id: undefined,\n label: null,\n placeholder: '',\n rules: () => [],\n value: '',\n yearOnly: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'blur', event: Event): void;\n (e: 'focus', event: Event): void;\n (e: 'change', event: Event): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst parseDate = (value: string): string => {\n if (props.yearOnly) {\n return value;\n }\n\n if (!value) {\n return '';\n }\n\n const [year, month, day] = value.split('-');\n if (!year || !month || !day) {\n console.warn(`Invalid date format. Expected YYYY-MM-DD, received: ${value}.`);\n return '';\n }\n\n return `${month}${day}${year}`;\n};\n\nconst formattedDate = ref<string>(parseDate(props.value));\n\nlet lastEmittedValue = props.value;\n\nwatch(\n () => props.value,\n (newValue: string) => {\n if (newValue !== lastEmittedValue) {\n formattedDate.value = props.yearOnly ? newValue : parseDate(newValue);\n }\n }\n);\n\nconst emitIsoDate = (value: string): void => {\n if (props.yearOnly) {\n emit('input', value);\n } else {\n const month = value.substring(0, 2);\n const day = value.substring(2, 4);\n const year = value.substring(4, 8);\n lastEmittedValue = year && month && day ? `${year}-${month}-${day}` : '';\n emit('input', lastEmittedValue);\n }\n};\n\nconst defaultLabel = computed(() => {\n return props.yearOnly ? t('Year of birth') : t('Date of birth');\n});\n\nconst defaultPlaceholder = computed(() => {\n return props.yearOnly ? t('YYYY') : t('MM/DD/YYYY');\n});\n\nconst validationMessage = computed(() => {\n const inputLabel = props.yearOnly ? t('year of birth') : t('date of birth');\n return t('Please enter a valid {inputLabel}', { inputLabel });\n});\n\nconst defaultRules = computed(() => {\n const minLengthRule = createMinLengthRule(props.yearOnly ? 4 : 10, validationMessage.value);\n const maxAgeRule = (v: string): boolean | string =>\n isValidDateInAgeRange(0, 125)(v) || validationMessage.value;\n const validDateRule = (v: string): boolean | string =>\n dayjs(v, 'MM/DD/YYYY', true).isValid() || validationMessage.value;\n\n return [minLengthRule, maxAgeRule, !props.yearOnly ? validDateRule : undefined].filter(\n Boolean\n ) as Rules<string>;\n});\n\nconst computedLabel = computed(() => props.label || defaultLabel.value);\nconst computedPlaceholder = computed(() => props.placeholder || defaultPlaceholder.value);\nconst computedRules = computed(() => [...defaultRules.value, ...props.rules]);\nconst dateLength = computed(() => (props.yearOnly ? 4 : 8));\nconst mask = computed(() => (props.yearOnly ? '####' : '##/##/####'));\n</script>\n","<template>\n <div\n class=\"c-select\"\n :class=\"{\n 'c-select--disabled': disabled,\n 'c-select--invalid': !isValidationValid,\n }\"\n :data-test=\"dataTest\"\n >\n <label\n :for=\"id\"\n class=\"c-select__label\"\n :class=\"{ 'c-select__label--hidden': hideLabel }\"\n :data-test=\"`${dataTest}-label`\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </label>\n <div class=\"c-select__input-container\">\n <select\n :id=\"id\"\n ref=\"select\"\n class=\"c-select__input\"\n :class=\"{\n 'c-select__input--has-value': inputValue && !disabled,\n 'c-select__input--invalid': !isValidationValid,\n 'c-select__input--loading': loading,\n 'c-select__input--disabled': disabled,\n }\"\n :aria-label=\"ariaLabel || label\"\n :data-test=\"`${dataTest}-select`\"\n :value=\"inputValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n @input=\"onInput\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n v-on=\"validationListeners\"\n >\n <option v-if=\"placeholder\" value disabled selected>{{ placeholder }}</option>\n <option\n v-for=\"item in items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n data-test=\"option\"\n >\n {{ item.label }}\n </option>\n </select>\n <CLoader v-if=\"loading\" small class=\"c-select__icon\" data-test=\"select-icon-loading\" />\n <FontAwesomeIcon v-else class=\"c-select__icon\" :icon=\"faChevronDown\" />\n </div>\n <CValidationMessage\n class=\"c-select__message\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faChevronDown } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { ref, toRefs } from 'vue';\n\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\ninterface SelectItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Overrides label for screenreader-only */\n ariaLabel?: string;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Controls whether the select is disabled */\n disabled?: boolean;\n /**\n * Hides the validation message area. Defaults to `false` (show message area even\n * when valid), so validations transition in gracefully.\n *\n * If set to 'auto', the validation message area will only display if there is a message.\n */\n hideDetails?: boolean | 'auto';\n /** Hides the label and instead labels the field with `aria-label` */\n hideLabel?: boolean;\n /** Assigns the select input's id */\n id?: string;\n /** List of options like `{ label: 'Yes', value: 'yes' }` */\n items?: SelectItem[];\n /** The select's label, both visual and screenreader-only */\n label?: string;\n /** Controls whether the select is loading */\n loading?: boolean;\n /** Set the select's placeholder text */\n placeholder?: string;\n /** If true, the select will be required */\n required?: boolean;\n /**\n * An array of functions that either return either true / false or a string\n * containing an error message. The component passes the input value as an\n * argument. The input field will enter an error state if a function does\n * not return true.\n */\n rules?: ((value: string) => string | boolean)[];\n /** Controls the value of the select */\n value?: string;\n }>(),\n {\n ariaLabel: undefined,\n dataTest: 'select',\n disabled: false,\n hideDetails: false,\n hideLabel: false,\n id: undefined,\n items: () => [],\n label: undefined,\n loading: false,\n placeholder: undefined,\n required: false,\n rules: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'focus', event: FocusEvent): void;\n (e: 'blur', event: FocusEvent): void;\n (e: 'keydown', event: KeyboardEvent): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { id, value, rules, required } = toRefs(props);\nconst idWithFallback = useId(id);\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => emit('input', newValue),\n});\nconst select = ref<HTMLSelectElement | null>(null);\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n startValidating,\n clearValidations,\n} = useValidations({\n id: idWithFallback,\n field: select,\n value: inputValue,\n rules,\n required,\n validateOn: 'blur',\n});\n\nfunction onInput(event: Event): void {\n const target = event.target as HTMLSelectElement;\n inputValue.value = target.value;\n}\n\ndefineExpose({ startValidating, clearValidations });\n</script>\n\n<style scoped lang=\"scss\">\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-select {\n display: flex;\n flex-direction: column;\n\n &--disabled {\n color: $color-text-disabled;\n }\n}\n\n.c-select__label {\n @include body-emphasized;\n\n margin-bottom: 8px;\n transition: color $sl-field-transition-duration ease;\n\n &--hidden {\n @include sr-only;\n }\n}\n\n.c-select__input-container {\n align-items: center;\n display: flex;\n position: relative;\n}\n\n.c-select__icon {\n pointer-events: none;\n position: absolute;\n right: 16px;\n}\n\n.c-select__input {\n appearance: none;\n background-color: $color-white;\n border: $border-width solid $color-border;\n border-radius: $border-radius-next;\n color: $color-placeholder-text;\n cursor: pointer;\n flex-grow: 1;\n letter-spacing: $letter-spacing-extend-small;\n max-width: 100%;\n min-height: $button-size-large;\n outline: 0.5px solid transparent;\n padding: 0 36px 0 16px;\n text-overflow: ellipsis;\n transition:\n border-color ease 0.2s,\n outline-color ease 0.2s;\n\n &:focus {\n border-color: $color-black;\n }\n\n &--has-value {\n color: $color-black;\n }\n\n &--invalid {\n border-color: $color-black;\n outline-color: $color-black;\n }\n\n &[disabled] {\n background-color: $color-gray-100;\n }\n}\n\n.c-select__message {\n margin-top: 4px;\n}\n</style>\n","<template>\n <div :id=\"id\" class=\"c-dob-select\" :data-test=\"dataTest\">\n <slot name=\"label\">\n <label\n v-if=\"!hideLabel\"\n class=\"c-dob-select__label\"\n :for=\"`${id}-month`\"\n :data-test=\"`${dataTest}-label`\"\n >{{ computedLabel }}</label\n >\n </slot>\n <div class=\"c-dob-select__container\">\n <c-select\n :id=\"`${id}-month`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localMonth\"\n :data-test=\"`${dataTest}-month`\"\n :aria-label=\"$t('Month')\"\n :placeholder=\"$t('Month')\"\n :items=\"monthOptions\"\n :rules=\"monthRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localMonth = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n <c-select\n :id=\"`${id}-day`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localDay\"\n :aria-label=\"$t('Day')\"\n :placeholder=\"$t('Day')\"\n :data-test=\"`${dataTest}-day`\"\n :items=\"dayOptions\"\n :rules=\"dayRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localDay = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n <c-select\n :id=\"`${id}-year`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localYear\"\n :aria-label=\"$t('Year')\"\n :placeholder=\"$t('Year')\"\n :data-test=\"`${dataTest}-year`\"\n :items=\"yearOptions\"\n :rules=\"yearRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localYear = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n </div>\n <CValidationMessage\n class=\"c-dob-select__messages\"\n :data-test=\"`${dataTest}-messages`\"\n :validation-message=\"message\"\n :hide=\"hideDetails\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from 'dayjs';\nimport type { VNode } from 'vue';\nimport { computed, ref, watch } from 'vue';\n\nimport CSelect from '@propelinc/citrus-ui/src/components/CSelect.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport {\n type Rules,\n useFormValidationSupport,\n} from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n required?: boolean;\n rules?: Rules<string>;\n hideLabel?: boolean;\n hideDetails?: boolean;\n value?: string;\n disabled?: boolean;\n }>(),\n {\n dataTest: 'dob-select',\n id: undefined,\n label: null,\n required: false,\n rules: () => [],\n hideLabel: false,\n hideDetails: false,\n value: '',\n disabled: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'focus'): void;\n (e: 'blur'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst computedLabel = computed(() => props.label ?? t('Date of birth'));\n\nconst localMonth = ref('');\nconst localDay = ref('');\nconst localYear = ref('');\n\nconst hasError = ref(props.required && props.value === '');\nconst messages = ref<string[]>([]);\n\nconst localValue = computed(() => {\n if (localDay.value && localMonth.value && localYear.value) {\n return `${localYear.value}-${localMonth.value}-${localDay.value}`;\n }\n return '';\n});\n\nconst monthRules = computed(() => {\n if (!props.required && !localMonth.value) {\n return [];\n }\n return [(): boolean => localMonth.value !== ''];\n});\nconst dayRules = computed(() => {\n if (!props.required && !localDay.value) {\n return [];\n }\n return [(): boolean => localDay.value !== ''];\n});\nconst yearRules = computed(() => {\n if (!props.required && !localYear.value) {\n return [];\n }\n return [(): boolean => localYear.value !== ''];\n});\nconst message = computed(() => messages.value[0] ?? '');\n\nconst monthOptions = Array.from({ length: 12 }, (_, i) => ({\n value: (i + 1).toString().padStart(2, '0'),\n label: dayjs().set('month', i).format('MMM'),\n}));\n\nconst dayOptions = computed(() => {\n const year = Number(localYear.value) || 2000;\n const month = Number(localMonth.value) - 1 || 0;\n const daysInMonth = dayjs().year(year).month(month).daysInMonth();\n return Array.from({ length: daysInMonth }, (_, i) => {\n const day = (i + 1).toString();\n return { value: day.padStart(2, '0'), label: day };\n });\n});\n\nconst currentYear = dayjs().year();\nconst yearOptions = Array.from({ length: 120 }, (_, age) => {\n const year = (currentYear - age).toString();\n return { value: year, label: year };\n});\n\nconst validationMessage = t('Please enter a valid {inputLabel}', {\n inputLabel: t('date of birth'),\n});\n\nconst localRules = computed(() => {\n if (!props.required && !localValue.value) {\n return [];\n }\n const validDateRule = (v: string): boolean | string =>\n dayjs(v, 'YYYY-MM-DD', true).isValid() || validationMessage;\n return [validDateRule, ...props.rules];\n});\n\nconst valid = computed(() => !hasError.value);\n\nconst validate = (): boolean => {\n messages.value = localRules.value\n .map((validation) => {\n const validationResult = validation(localValue.value);\n return typeof validationResult === 'string' ? validationResult : '';\n })\n .filter((message) => message !== '');\n\n hasError.value = (props.required && localValue.value === '') || messages.value.length > 0;\n return !hasError.value;\n};\n\nconst emitDate = (): void => {\n if (!localValue.value) {\n return;\n }\n\n if (!validate()) {\n // NOTE(ram): An invalid date can only be caused by the day being invalid.\n localDay.value = '';\n emit('input', '');\n return;\n }\n\n emit('input', localValue.value);\n};\n\nwatch(\n () => props.value,\n (value) => {\n if (!value || value === localValue.value) {\n return;\n }\n\n const date = dayjs(value, 'YYYY-MM-DD', true);\n if (!date.isValid()) {\n console.error('Invalid date in CDobSelect', value);\n return;\n }\n\n localMonth.value = date.format('MM');\n localDay.value = date.format('DD');\n localYear.value = date.format('YYYY');\n },\n { immediate: true }\n);\n\nuseFormValidationSupport({\n id: props.id,\n valid,\n validate,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-dob-select__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 4px;\n}\n\n.c-dob-select__container {\n display: flex;\n gap: 12px;\n}\n\n.c-dob-select__field {\n flex: auto;\n}\n\n.c-dob-select__messages {\n margin-top: 4px;\n}\n</style>\n","<template>\n <CTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n :value=\"value\"\n :data-test=\"dataTest\"\n type=\"email\"\n name=\"email\"\n :rules=\"[...defaultRules, ...rules]\"\n :label=\"label || $t('Email')\"\n :placeholder=\"placeholder || $t('example@email.com')\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CTextField from '@propelinc/citrus-ui/src/components/CTextField.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { isValidEmail } from '@propelinc/shared-utils';\n\nwithDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n placeholder?: string | null;\n rules?: Rules<string>;\n value?: string;\n }>(),\n {\n dataTest: 'email-field',\n id: undefined,\n label: null,\n placeholder: null,\n rules: (): Rules<string> => [],\n value: '',\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = [\n (v: string): string | boolean =>\n !v || isValidEmail(v)\n ? true\n : t('Please enter a valid {inputLabel}', { inputLabel: t('email') }),\n];\n</script>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const ANIMATIONS_DISABLED = Symbol('animations-disabled') as InjectionKey<Ref<boolean>>;\n","<template>\n <div\n data-test=\"expand-transition\"\n class=\"c-expand-transition\"\n :class=\"{ 'c-expand-transition--disabled': isDisabled }\"\n :style=\"{ height: isDisabled ? undefined : height }\"\n >\n <div ref=\"content\" class=\"c-expand-transition__content\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\n\nimport { useResizeObserver } from '@propelinc/citrus-ui/src/composables/elements';\nimport { ANIMATIONS_DISABLED } from '@propelinc/citrus-ui/src/services/injections/animations';\n\ndefineSlots<{ default: () => VNode[] }>();\n\nconst props = withDefaults(defineProps<{ disabled?: boolean }>(), { disabled: false });\n\nconst injectedDisabled = inject(ANIMATIONS_DISABLED, ref(false));\nconst isDisabled = computed(() => props.disabled || injectedDisabled.value);\nconst content = ref<HTMLElement | null>(null);\nconst height = ref<string>('auto');\n\nuseResizeObserver(content, ([entry]) => {\n height.value = `${entry.contentRect.height}px`;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-expand-transition {\n overflow: hidden;\n transition: height 300ms ease;\n}\n\n.c-expand-transition__content {\n // Create a new block formatting context that includes outer margins of children so\n // CExpandTransition measures the height correctly.\n overflow: hidden;\n}\n\n.c-expand-transition--disabled {\n transition: none;\n}\n</style>\n","<template>\n <label class=\"c-file-input\" :class=\"{ 'c-file-input--disabled': disabled }\">\n <p :id=\"`${idWithFallback}-label`\" class=\"c-file-input__label\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </p>\n <span :for=\"idWithFallback\" class=\"c-file-input__prompt\" :data-test=\"`${dataTest}-prompt`\">\n <slot name=\"prompt\">\n {{ prompt }}\n </slot>\n </span>\n <input\n :id=\"idWithFallback\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-file-input__input\"\n type=\"file\"\n :aria-describedby=\"`${idWithFallback}-files`\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :required=\"required\"\n @change=\"onFileChange\"\n />\n\n <div v-if=\"hasValue\" :id=\"`${idWithFallback}-files`\" class=\"c-file-input__files\">\n <span v-if=\"!Array.isArray(inputValue) && inputValue\" class=\"c-file-input__file\">{{\n inputValue.name\n }}</span>\n <template v-if=\"Array.isArray(inputValue)\">\n <span v-for=\"file in inputValue\" :key=\"file.name\" class=\"c-file-input__file\">\n {{ file.name }}\n </span></template\n >\n </div>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, toRefs } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test string applied to the form field, text field and hide icon */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /** A unique id for the input */\n id: string;\n /** The input's label, both visual and screenreader-only */\n label: string;\n /** Allow the user to upload multiple files */\n multiple?: boolean;\n /** Placholder text to display before a user has selected any files */\n prompt: string;\n /** Controls whether the input is required */\n required?: boolean;\n /** The input's value. Either one file or an array of files */\n value?: File[] | File | null;\n }>(),\n {\n dataTest: 'file-input',\n disabled: false,\n multiple: false,\n required: false,\n value: null,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: File[] | File | null): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n prompt?: () => VNode[];\n}>();\n\nconst { id, value } = toRefs(props);\nconst idWithFallback = useId(id);\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('input', newValue);\n },\n});\nconst hasValue = computed(() => {\n if (Array.isArray(inputValue.value)) {\n return inputValue.value.length > 0;\n }\n return !!inputValue.value;\n});\n\nfunction onFileChange(event: Event): void {\n const files = (event.target as HTMLInputElement).files;\n if (!files) {\n inputValue.value = null;\n } else {\n inputValue.value = props.multiple ? Array.from(files) : files[0];\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-file-input {\n align-items: flex-start;\n display: flex;\n flex-direction: column;\n position: relative;\n\n &:focus-within {\n .c-file-input__prompt {\n outline: var(--sl-focus-ring);\n outline-offset: var(--sl-focus-ring-offset);\n }\n }\n}\n\n.c-file-input--disabled {\n &:hover {\n .c-file-input__prompt {\n @include button-theme($color-gray-300, $color-gray-300, transparent);\n }\n }\n\n .c-file-input__label {\n color: $color-text-disabled;\n }\n\n .c-file-input__prompt {\n @include button-theme($color-gray-300, $color-gray-300, transparent);\n }\n\n .c-file-input__input {\n cursor: not-allowed;\n }\n}\n\n.c-file-input__label {\n @include body-emphasized;\n\n margin-bottom: var(--sl-spacing-3x-small);\n}\n\n.c-file-input__prompt {\n // NOTE(slanden): these styles are largely copied from sl-button defaults.\n @include button-theme-secondary;\n\n align-items: center;\n border-radius: var(--sl-input-border-radius-medium);\n border-style: solid;\n border-width: $border-width;\n display: inline-flex;\n font-family: var(--sl-input-font-family);\n font-weight: var(--sl-font-weight-semibold);\n height: $button-size-medium;\n justify-content: center;\n padding: 0 20px;\n transition: background-color 0.2s ease-in-out;\n}\n\n.c-file-input__input {\n cursor: pointer;\n height: 100%;\n inset: 0;\n opacity: 0;\n\n // NOTE(slanden): Rather than using the sr-only utility, we actually want to have\n // the file input take up the full space of the label. This allows us to support\n // default file input behavior, like drag-and-drop upload.\n position: absolute;\n width: 100%;\n}\n\n.c-file-input__files {\n display: flex;\n flex-direction: column;\n gap: var(--sl-spacing-3x-small);\n margin-top: var(--sl-spacing-2x-small);\n}\n\n.c-file-input__file {\n @include caption;\n\n word-break: break-word;\n}\n</style>\n","<template>\n <CButtonStack\n ref=\"footer\"\n data-test=\"fixed-page-footer\"\n :tag=\"tag\"\n large\n class=\"c-fixed-page-footer\"\n >\n <div class=\"c-fixed-page-footer__content\">\n <slot />\n </div>\n </CButtonStack>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, onBeforeUnmount, ref } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport { useResizeObserver } from '@propelinc/citrus-ui/src/composables/elements';\n\nwithDefaults(\n defineProps<{\n /** The HTML tag to render as. Avoid changing this if possible. */\n tag?: string;\n }>(),\n {\n tag: 'footer',\n }\n);\n\nconst emit = defineEmits<{\n 'change:height': [height: number];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst footer = ref<InstanceType<typeof CButtonStack> | null>(null);\nconst footerElement = computed(() => (footer.value?.$el as HTMLElement) ?? null);\nuseResizeObserver(footerElement, ([entry]) => emit('change:height', entry.contentRect.height));\nonBeforeUnmount(() => emit('change:height', 0));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$gradient-height: 32px;\n\n.c-fixed-page-footer {\n bottom: 0;\n left: 0;\n position: fixed;\n right: 0;\n\n // This places the footer above any Swiper components in the body which have z-index 1.\n z-index: 1;\n\n &::before {\n // NOTE(mohan): We use rgba instead of `transparent` to avoid a bug in\n // Safari where the gradient starts as tranparent black and fades into a\n // gray.\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 0) 0,\n var(--fixed-page-footer-color, white) $gradient-height\n );\n content: '';\n inset: -$gradient-height 0 0;\n pointer-events: none;\n position: absolute;\n z-index: -1;\n }\n}\n\n// NOTE(mohan): ResizeObservers don't measure padding (at least not in all\n// browsers), so we have to add it to a child element.\n.c-fixed-page-footer__content {\n padding: 0 16px max(env(safe-area-inset-bottom, 0), 8px);\n}\n</style>\n","<template>\n <form ref=\"form\" :data-test=\"dataTest\" novalidate @submit.prevent=\"$emit('submit', $event)\">\n <slot />\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport scrollIntoViewIfNeeded from 'scroll-into-view-if-needed';\nimport type { VNode } from 'vue';\nimport { computed, onMounted, provide, ref, watch } from 'vue';\n\nimport { VALIDATIONS } from '@propelinc/citrus-ui/src/services/injections/forms';\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\ninterface FormValidation {\n id: string;\n validate: () => boolean;\n valid: boolean;\n field?: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n}\n\nwithDefaults(\n defineProps<{\n dataTest?: string;\n }>(),\n {\n dataTest: 'form',\n }\n);\n\nconst emit = defineEmits<{\n submit: [event: Event];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst form = ref<HTMLFormElement | null>(null);\nconst inputs = ref<Record<string, FormValidation>>({});\n\nprovide(VALIDATIONS, {\n register: (input: ValidationState) => {\n // NOTE(ram): Vue collapses the ref to input.field automatically so we need to adjust types.\n inputs.value = { ...inputs.value, [input.id]: input as unknown as FormValidation };\n },\n unregister: (id: string) => {\n const filteredInputs = { ...inputs.value };\n delete filteredInputs[id];\n inputs.value = filteredInputs;\n },\n});\n\nconst inputArray = computed(() => Object.values(inputs.value));\nconst getInvalidInputs = (startValidating?: boolean): FormValidation[] => {\n return inputArray.value.filter((input) => {\n return startValidating ? !input.validate() : !input.valid;\n });\n};\n\n// NOTE(mohan): I would love for this to be a computed property, but Vue 2's\n// the reactivity system can't seem to track refs inside of refs, though it\n// should work in Vue 3.\nwatch(getInvalidInputs, (newInvalidInputs, oldInvalidInputs) => {\n const newValid = newInvalidInputs.length === 0;\n const oldValid = oldInvalidInputs?.length === 0;\n if (newValid !== oldValid) {\n emit('input', newValid);\n }\n});\nonMounted(() => emit('input', getInvalidInputs().length === 0));\n\nconst validate = (): boolean => {\n if (!form.value) {\n return false;\n }\n\n const invalidInputs = getInvalidInputs(true);\n const firstInvalidField = invalidInputs.find((input) => input.field)?.field;\n if (firstInvalidField) {\n scrollIntoViewIfNeeded(firstInvalidField, {\n behavior: 'smooth',\n block: 'center',\n scrollMode: 'if-needed',\n });\n }\n\n return invalidInputs.length === 0;\n};\n\ndefineExpose({ validate, inputs: inputArray });\n</script>\n","<template>\n <div class=\"c-label\" :data-test=\"dataTest\">\n <slot name=\"icon\">\n <FontAwesomeIcon v-if=\"icon\" data-test=\"label-icon\" :icon=\"icon\" size=\"xs\" />\n </slot>\n <div class=\"c-label__text\" data-test=\"label-text\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\n\nwithDefaults(\n defineProps<{\n /** Specifies the label's icon, overwritten if icon slot is used */\n icon?: string | string[] | IconDefinition | null;\n /** A custom data test string */\n dataTest?: string;\n }>(),\n {\n icon: null,\n dataTest: 'label',\n }\n);\n\ndefineSlots<{\n /** Icon slot, overrides icon prop */\n icon?: () => VNode[];\n /** Default content */\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-label {\n align-items: center;\n background-color: $color-gray-100;\n border-radius: 4px;\n color: $color-text-secondary;\n display: inline-flex;\n font-size: $font-size-small;\n font-weight: $font-weight-semibold;\n gap: 4px;\n height: 24px;\n margin-bottom: 6px;\n padding: 0 12px;\n}\n\n.c-label:not(:last-child) {\n margin-right: 8px;\n}\n</style>\n","<template>\n <div class=\"c-list-item-content\" data-test=\"list-item-content\">\n <slot>\n <div\n v-if=\"title || titleSlotHasContent\"\n class=\"c-list-item-content__title\"\n data-test=\"list-item-title\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div\n v-if=\"label || labelSlotHasContent\"\n class=\"c-list-item-content__label\"\n data-test=\"list-item-label\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nwithDefaults(\n defineProps<{\n title?: string;\n label?: string;\n }>(),\n {\n title: '',\n label: '',\n }\n);\n\nconst titleSlotHasContent = useSlotHasContent('title');\nconst labelSlotHasContent = useSlotHasContent('label');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-list-item-content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.c-list-item-content__title {\n @include subheadline;\n\n align-items: center;\n display: flex;\n\n & + .c-list-item-content__label {\n margin-top: 2px;\n }\n}\n</style>\n","<template>\n <div\n data-test=\"squared-icon\"\n :data-icon=\"icon\"\n :data-color=\"cssColor\"\n class=\"c-squared-icon\"\n :class=\"{ 'c-squared-icon--white-icon': useWhiteIcon, 'c-squared-icon--large': large }\"\n :style=\"{ backgroundColor: cssColor }\"\n >\n <slot>\n <FontAwesomeIcon v-if=\"icon\" data-test=\"squared-icon-icon\" :icon=\"icon\" />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed, onMounted } from 'vue';\n\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport type { FaIconArray } from '@propelinc/citrus-ui/src/types/font-awesome';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\nconst props = withDefaults(\n defineProps<{\n /** The background color */\n color?: string;\n /** The Font Awesome icon to display */\n icon?: string | string[] | IconDefinition | null;\n /** Makes the icon and background larger */\n large?: boolean;\n }>(),\n {\n color: 'gray-100',\n icon: null,\n large: false,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nonMounted(() => {\n const enableCheck = process.env.VUE_APP_DEBUG === 'yes' || process.env.NODE_ENV === 'test';\n if (enableCheck && Array.isArray(props.icon)) {\n const [prefix, iconName] = props.icon as FaIconArray;\n if (prefix === 'fal') {\n console.error(\n `We no longer use light Font Awesome icons. Please change ['${prefix}', '${iconName}'] to ['far', '${iconName}'].`\n );\n }\n }\n});\n\nconst { cssColor } = useCssColor(() => props.color);\n\nconst useWhiteIcon = computed(() => props.color === 'black');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$squared-icon-size: 40px;\n$squared-icon-large-size: 56px;\n\n.c-squared-icon {\n align-items: center;\n border-radius: $border-radius;\n color: $color-text-primary;\n display: flex;\n font-size: $font-size-icon-medium;\n height: $squared-icon-size;\n justify-content: center;\n position: relative;\n width: $squared-icon-size;\n}\n\n.c-squared-icon--white-icon {\n color: $color-white;\n}\n\n.c-squared-icon--large {\n border-radius: $border-radius-next;\n font-size: $font-size-icon-large;\n height: $squared-icon-large-size;\n width: $squared-icon-large-size;\n}\n</style>\n","<template>\n <CSquaredIcon\n v-if=\"icon || iconSlotHasContent\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"c-list-item-icon\"\n >\n <slot name=\"icon\" />\n </CSquaredIcon>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport type { VNode } from 'vue';\n\nimport CSquaredIcon from '@propelinc/citrus-ui/src/components/CSquaredIcon.vue';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nwithDefaults(\n defineProps<{\n icon?: string | string[] | IconDefinition | null;\n iconColor?: string;\n }>(),\n {\n icon: null,\n iconColor: 'gray-100',\n }\n);\n\ndefineSlots<{\n icon?: () => VNode[];\n}>();\n\nconst iconSlotHasContent = useSlotHasContent('icon');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-list-item-icon {\n flex: none;\n}\n</style>\n","<template>\n <component\n :is=\"tag\"\n v-bind=\"allAttrs\"\n class=\"c-list-item d-flex flex-col justify-center w-full\"\n :class=\"{ 'c-list-item--is-tappable': isTappable }\"\n :href=\"routerDestinationOrHref\"\n :target=\"target\"\n @click=\"navigate\"\n >\n <div\n class=\"d-flex flex-row gap-3 justify-between w-full p-4\"\n :class=\"{\n 'align-start': align === 'top',\n 'align-center': align !== 'top',\n }\"\n >\n <slot name=\"prepend\">\n <CListItemIcon v-if=\"icon || iconSlotHasContent\" :icon=\"icon\" :icon-color=\"iconColor\">\n <template #icon>\n <slot name=\"icon\" />\n </template>\n </CListItemIcon>\n </slot>\n\n <div class=\"flex-1 d-flex flex-row gap-3 justify-between align-center\">\n <CListItemContent :title=\"title\" :label=\"label\">\n <template v-for=\"slotName in ['title', 'label', 'default']\" #[slotName]>\n <slot :name=\"slotName\" />\n </template>\n </CListItemContent>\n\n <slot name=\"append\">\n <div\n v-if=\"renderActionSlot\"\n data-test=\"list-item-action\"\n class=\"c-list-item__append__action flex-shrink-0\"\n >\n <slot name=\"action\">\n <FontAwesomeIcon\n data-test=\"list-item-action-icon\"\n class=\"c-list-item__append__action-icon\"\n fixed-width\n :icon=\"actionIcon ? actionIcon : faChevronRight\"\n />\n </slot>\n </div>\n </slot>\n </div>\n </div>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { faChevronRight } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { computed, mergeProps, toRefs, useAttrs } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CListItemContent from '@propelinc/citrus-ui/src/components/CListItemContent.vue';\nimport CListItemIcon from '@propelinc/citrus-ui/src/components/CListItemIcon.vue';\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** The Font Awesome icon to display */\n icon?: string | string[] | IconDefinition | null;\n /** The icon to display on the right side for clickable items, defaulting to right arrow */\n actionIcon?: string | string[] | IconDefinition | null;\n /** Color of the icon background */\n iconColor?: string;\n /** Emphasized text above body text. Overridden by the default slot. */\n title?: string;\n /** Plain body copy. Overridden by the default slot. */\n label?: string;\n /** Router location for links within the app */\n to?: RouteLocationRaw;\n /** HTML target attribute for links to outside the app */\n target?: string;\n /** Location for links to outside the app */\n href?: string;\n /** Changes alignment of icon and action icon */\n align?: 'top' | 'center';\n /** Overrides default behavior to display a chevron in the action slot */\n hideAction?: boolean;\n }>(),\n {\n icon: null,\n actionIcon: null,\n iconColor: 'gray-100',\n title: undefined,\n label: undefined,\n to: undefined,\n target: undefined,\n href: undefined,\n align: 'center',\n hideAction: false,\n }\n);\n\nconst attrs = useAttrs();\n\nconst { to } = toRefs(props);\nconst { href: routerDestination, navigate } = useRouterLink(to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst isLink = computed(() => !!routerDestinationOrHref.value);\nconst isButton = computed(() => !!attrs.onClick);\nconst isTappable = computed(() => isLink.value || isButton.value);\n\nconst tag = computed(() => {\n if (isLink.value) {\n return 'a';\n } else if (isButton.value) {\n return 'button';\n } else {\n return 'div';\n }\n});\nconst tagAttrs = computed(() => {\n if (isButton.value) {\n return { type: 'button' };\n }\n return {};\n});\n\nconst actionSlotHasContent = useSlotHasContent('action');\n\nconst renderActionSlot = computed(() => {\n if (props.hideAction) {\n return false;\n }\n\n return isTappable.value || actionSlotHasContent.value;\n});\nconst iconSlotHasContent = useSlotHasContent('icon');\n\nconst allAttrs = computed(() => mergeProps(attrs, tagAttrs.value));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-list-item {\n background: transparent;\n color: $color-text-primary;\n min-height: 64px;\n outline: none;\n text-align: left;\n text-decoration: none;\n\n & + & {\n border-top: $border;\n }\n\n &:focus-visible {\n @include focus-ring;\n }\n}\n\n.c-list-item--is-tappable {\n appearance: none; // Needed to avoid browser default styles for buttons\n border: none; // Needed to avoid browser default styles for buttons\n cursor: pointer;\n}\n\n.c-list-item__append__action-icon {\n color: $color-text-secondary;\n font-size: $font-size-medium;\n}\n</style>\n","export default \"data:image/svg+xml,%3csvg%20width='30'%20height='37'%20viewBox='0%200%2030%2037'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_911_9050)'%3e%3cpath%20d='M7.39438%200.692966C7.39438%200.692966%206.35052%201.4649%205.56982%202.23683C5.3242%202.44735%205.35052%202.66665%205.36806%202.98244C5.44701%204.04384%205.64876%206.40349%207.25403%208.14033C8.85052%209.87718%2010.9119%209.64033%2010.9119%209.64033L15.2979%208.67542L7.39438%200.692966Z'%20fill='black'%20stroke='black'%20stroke-width='0.964912'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M0.482422%2022.6316C0.482422%2029.6754%206.42979%2035.386%2013.7719%2035.386C21.114%2035.386%2027.0614%2029.6754%2027.0614%2022.6316C27.0614%2015.5877%2021.114%209.8772%2013.7719%209.8772C6.42979%209.8772%200.482422%2015.5877%200.482422%2022.6316ZM7.8947%2022.6316C7.8947%2025.9123%2010.6666%2028.5702%2014.0877%2028.5702C17.5087%2028.5702%2020.2807%2025.9123%2020.2807%2022.6316C20.2807%2019.3509%2017.5087%2016.693%2014.0877%2016.693C10.6666%2016.693%207.8947%2019.3509%207.8947%2022.6316Z'%20fill='black'%20stroke='black'%20stroke-width='0.964912'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.73633%2022.0965C2.73633%2029.4912%208.72755%2035.4824%2016.1223%2035.4824C23.517%2035.4824%2029.5083%2029.4912%2029.5083%2022.0965C29.5083%2014.7017%2023.517%208.71051%2016.1223%208.71051C8.72755%208.71051%202.73633%2014.7017%202.73633%2022.0965ZM9.88545%2022.0965C9.88545%2025.5438%2012.6749%2028.3333%2016.1223%2028.3333C19.5697%2028.3333%2022.3591%2025.5438%2022.3591%2022.0965C22.3591%2018.6491%2019.5697%2015.8596%2016.1223%2015.8596C12.6749%2015.8596%209.88545%2018.6491%209.88545%2022.0965Z'%20fill='%23FFC120'%20stroke='black'%20stroke-width='0.978516'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4.88672%2013.1491C7.41303%2010.9912%209.76391%209.74562%2013.3078%209.00001'%20stroke='black'%20stroke-width='0.973684'%20stroke-miterlimit='10'%20stroke-linecap='round'/%3e%3cpath%20d='M9.53516%2034.7193C12.7808%2035.7193%2015.7281%2035.8597%2018.9211%2035.193'%20stroke='black'%20stroke-width='0.973684'%20stroke-miterlimit='10'%20stroke-linecap='round'/%3e%3cpath%20d='M15.2988%208.67545C15.4742%208.64036%2015.6321%208.54387%2015.7286%208.38598C16.4567%207.21054%2016.1672%204.71054%2014.6146%203.28948C12.869%201.7544%2011.5707%202.0965%208.44792%200.614046C7.6409%200.228081%206.99178%200.736853%207.11459%201.71054C7.23739%202.68422%208.04441%206.3772%2010.3339%207.91229C11.9655%209.00001%2014.4655%208.85966%2015.2988%208.68422V8.67545Z'%20fill='%238BC95A'%20stroke='black'%20stroke-width='0.978516'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_911_9050'%3e%3crect%20width='30'%20height='36.0877'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='120'%20height='38'%20viewBox='0%200%20120%2038'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M40.3101%2022.5039H36.5387C36.383%2022.5039%2036.2563%2022.6306%2036.2563%2022.7863V29.808C36.2563%2030.018%2036.0862%2030.1881%2035.8763%2030.1881H32.2206C32.0107%2030.1881%2031.8406%2030.018%2031.8406%2029.808V8.18892C31.8406%207.98261%2032.0107%207.8125%2032.2206%207.8125H40.3101C44.5847%207.8125%2048.0594%2010.5488%2048.0594%2015.1419C48.0594%2019.735%2044.5847%2022.5039%2040.3101%2022.5039ZM36.2563%2018.2764C36.2563%2018.432%2036.383%2018.5587%2036.5387%2018.5587H40.1364C42.4275%2018.5587%2043.6437%2017.1109%2043.6437%2015.1383C43.6437%2013.1657%2042.4275%2011.7505%2040.1364%2011.7505H36.5387C36.383%2011.7505%2036.2563%2011.8772%2036.2563%2012.0328V18.2728V18.2764Z'%20fill='black'/%3e%3cpath%20d='M53.7021%2014.5594V15.3919C53.7021%2015.533%2053.8723%2015.5945%2053.9664%2015.4932C54.7771%2014.6064%2056.2937%2014.0454%2057.9116%2014.0454H58.9214C59.1313%2014.0454%2059.3015%2014.2155%2059.3015%2014.4255V17.7119C59.3015%2017.9219%2059.1313%2018.092%2058.9214%2018.092H57.879C55.1499%2018.092%2053.7021%2019.8438%2053.7021%2022.4064V29.8118C53.7021%2030.0218%2053.532%2030.1919%2053.3221%2030.1919H49.8329C49.623%2030.1919%2049.4529%2030.0218%2049.4529%2029.8118V14.5594C49.4529%2014.3495%2049.623%2014.1793%2049.8329%2014.1793H53.3221C53.532%2014.1793%2053.7021%2014.3495%2053.7021%2014.5594Z'%20fill='black'/%3e%3cpath%20d='M76.9102%2022.1999C76.9102%2027.0174%2073.1713%2030.6224%2068.2162%2030.6224C63.2611%2030.6224%2059.5222%2027.0174%2059.5222%2022.1999C59.5222%2017.3824%2063.2611%2013.7412%2068.2162%2013.7412C73.1713%2013.7412%2076.9102%2017.3462%2076.9102%2022.1999ZM63.7715%2022.1999C63.7715%2024.8639%2065.6898%2026.7134%2068.2198%2026.7134C70.7498%2026.7134%2072.6681%2024.8602%2072.6681%2022.1999C72.6681%2019.5396%2070.7462%2017.6502%2068.2198%2017.6502C65.6934%2017.6502%2063.7715%2019.5034%2063.7715%2022.1999Z'%20fill='black'/%3e%3cpath%20d='M87.5261%2030.6224C85.9046%2030.6224%2084.2505%2030.1193%2083.1538%2029.2181C83.0307%2029.1167%2082.8425%2029.2%2082.8425%2029.3629V36.6814C82.8425%2036.8914%2082.6724%2037.0615%2082.4625%2037.0615H78.9733C78.7634%2037.0615%2078.5933%2036.8914%2078.5933%2036.6814V14.5556C78.5933%2014.3457%2078.7634%2014.1756%2078.9733%2014.1756H82.4625C82.6724%2014.1756%2082.8425%2014.3457%2082.8425%2014.5556V15.0478C82.8425%2015.1781%2082.9909%2015.2469%2083.0886%2015.1637C84.1853%2014.2335%2085.8684%2013.7412%2087.5261%2013.7412C92.6803%2013.7412%2095.7134%2017.7842%2095.7134%2022.1637C95.7134%2026.5433%2092.6803%2030.6224%2087.5261%2030.6224ZM87.1895%2017.6502C84.931%2017.6502%2082.676%2019.1342%2082.676%2022.1637C82.676%2025.1932%2084.9346%2026.7134%2087.1895%2026.7134C89.7159%2026.7134%2091.4677%2024.625%2091.4677%2022.1637C91.4677%2019.7025%2089.7159%2017.6502%2087.1895%2017.6502Z'%20fill='black'/%3e%3cpath%20d='M112.989%2025.3344C113.264%2025.3344%20113.449%2025.6167%20113.337%2025.8664C111.983%2028.791%20108.917%2030.6224%20105.674%2030.6224C100.686%2030.6224%2097.0127%2027.0174%2097.0127%2022.1637C97.0127%2017.31%20100.549%2013.7412%20105.504%2013.7412C110.459%2013.7412%20113.829%2017.3824%20113.829%2022.0986C113.829%2022.5184%20113.829%2022.855%20113.796%2023.2351C113.778%2023.4305%20113.615%2023.5826%20113.42%2023.5826H101.801C101.609%2023.5826%20101.468%2023.7708%20101.53%2023.9518C102.091%2025.6601%20103.72%2026.717%20105.674%2026.717C106.955%2026.717%20108.114%2026.3515%20108.863%2025.4755C108.939%2025.3887%20109.044%2025.3344%20109.156%2025.3344H112.989ZM108.968%2020.4119C109.149%2020.4119%20109.286%2020.2418%20109.243%2020.0644C108.838%2018.4103%20107.332%2017.3788%20105.504%2017.3788C103.676%2017.3788%20102.033%2018.4393%20101.602%2020.0608C101.555%2020.2382%20101.696%2020.4119%20101.877%2020.4119H108.968Z'%20fill='black'/%3e%3cpath%20d='M120%208.18912V29.8082C120%2030.0182%20119.83%2030.1883%20119.62%2030.1883H116.131C115.921%2030.1883%20115.751%2030.0182%20115.751%2029.8082V8.18912C115.751%207.97919%20115.921%207.80908%20116.131%207.80908H119.62C119.83%207.80908%20120%207.97919%20120%208.18912Z'%20fill='black'/%3e%3cpath%20d='M13.725%207.37832C14.1268%206.19475%2013.7757%204.37054%2012.556%203.25212C11.6909%202.49203%2010.9561%202.26762%2010.0259%201.98531C9.3672%201.78623%208.6252%201.56182%207.61899%201.08405C7.17018%200.8705%206.71774%200.892218%206.37751%201.14196C6.34132%201.1673%206.30512%201.19988%206.27255%201.22884C6.08795%201.37%205.40025%201.89481%204.85009%202.43412C4.50262%202.74539%204.52796%203.1001%204.54606%203.3607V3.3969C4.61483%204.24023%204.77046%206.22008%206.14224%207.7113C6.5802%208.18545%207.05435%208.49312%207.50317%208.69219C6.46438%209.15186%205.49436%209.73821%204.49539%2010.4947C4.29993%2010.6395%204.10448%2010.7915%203.91989%2010.9507C3.86922%2010.9905%203.81854%2011.0304%203.76787%2011.0738C3.74615%2011.0919%203.72806%2011.11%203.71358%2011.1281C1.43693%2013.1441%200%2016.0904%200%2019.3696C0%2024.3102%203.26476%2028.5016%207.74929%2029.8987C7.77463%2029.9095%207.79634%2029.9204%207.8253%2029.9276C9.39615%2030.3873%2010.8946%2030.6153%2012.3967%2030.6153C13.5332%2030.6153%2014.6697%2030.485%2015.8352%2030.2244C15.8388%2030.2244%2015.8461%2030.2208%2015.8497%2030.2208C21.0581%2029.1024%2024.9707%2024.4622%2024.9707%2018.9244C24.9707%2012.6555%2019.9505%207.53757%2013.7214%207.37469L13.725%207.37832ZM12.7333%2023.5827C11.738%2023.4379%2010.815%2022.9782%2010.0911%2022.2544C9.2007%2021.364%208.71207%2020.184%208.71207%2018.9244C8.71207%2017.2341%209.60608%2015.7502%2010.9489%2014.9213C11.0539%2014.9141%2011.1625%2014.9068%2011.271%2014.9068C13.7323%2014.9068%2015.7338%2016.9084%2015.7338%2019.3696C15.7338%2021.3169%2014.4779%2022.9746%2012.7369%2023.5827H12.7333Z'%20fill='black'/%3e%3cpath%20d='M11.9405%203.93626C11.2347%203.31371%2010.6447%203.13636%209.75796%202.86852C9.10284%202.66945%208.28846%202.42332%207.22433%201.91659C7.14832%201.8804%207.07231%201.8623%207.0144%201.8623C6.97459%201.8623%206.94201%201.86954%206.9203%201.88763C6.86238%201.93107%206.80447%202.06499%206.83705%202.30026C6.95649%203.20875%207.60438%205.79666%209.15713%206.83183C10.2502%207.56297%2012.0418%207.50506%2012.6897%207.36752C12.7151%207.36028%2012.7295%207.34942%2012.7368%207.33856C13.3449%206.34682%2012.6861%204.62034%2011.9405%203.93626Z'%20fill='%238BC95A'/%3e%3cpath%20d='M13.4209%208.29395C7.55737%208.29395%202.79053%2013.0644%202.79053%2018.9243C2.79053%2021.7656%203.89809%2024.4332%205.90327%2026.442C7.91208%2028.4508%2010.5796%2029.5547%2013.4209%2029.5547C19.2845%2029.5547%2024.0513%2024.7843%2024.0513%2018.9243C24.0513%2013.0644%2019.2808%208.29395%2013.4209%208.29395ZM17.4023%2022.9058C16.3382%2023.9699%2014.9266%2024.5526%2013.4209%2024.5526C11.9188%2024.5526%2010.5036%2023.9663%209.4395%2022.9058C8.37537%2021.8453%207.79264%2020.43%207.79264%2018.9243C7.79264%2015.8224%2010.319%2013.2961%2013.4209%2013.2961C16.5228%2013.2961%2019.0492%2015.8224%2019.0492%2018.9243C19.0492%2020.4264%2018.4628%2021.8416%2017.4023%2022.9058Z'%20fill='%23FFC120'/%3e%3c/svg%3e\"","<template>\n <img :src=\"src\" :alt=\"$t('{appName}')\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport propelIcon from '@propelinc/citrus-ui/src/assets/logos/propel/icon.svg';\nimport propelLockup from '@propelinc/citrus-ui/src/assets/logos/propel/lockup.svg';\n\nconst props = withDefaults(\n defineProps<{\n /** Show just the orange icon */\n icon?: boolean;\n }>(),\n {\n icon: false,\n }\n);\n\nconst src = computed(() => {\n return props.icon ? propelIcon : propelLockup;\n});\n</script>\n","<template>\n <sl-menu class=\"c-menu pa-0 elevation-4\" @sl-select=\"$emit('select', $event.detail.item)\">\n <slot />\n </sl-menu>\n</template>\n\n<script lang=\"ts\">\nexport type { default as SlMenuItem } from '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';\n</script>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu/menu.js';\n\ndefineEmits<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select: [item: any];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-menu {\n --sl-panel-border-width: $border-width;\n}\n</style>\n","<template>\n <sl-menu-item\n :type=\"checkable ? 'checkbox' : 'normal'\"\n :checked=\"checked\"\n class=\"menu-item\"\n :class=\"{ selectable }\"\n @click=\"onClick\"\n >\n <div slot=\"prefix\">\n <slot name=\"prepend-inner\">\n <template v-if=\"checkable\">\n <CCheckbox\n v-if=\"checkType === 'checkbox'\"\n :value=\"checked\"\n variant=\"minimal\"\n hide-details\n aria-hidden=\"true\"\n class=\"checkbox mr-3\"\n />\n <div v-else class=\"check-icon mr-3\">\n <FontAwesomeIcon v-if=\"checked\" :icon=\"faCheck\" />\n </div>\n </template>\n </slot>\n </div>\n <slot />\n </sl-menu-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { faCheck } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';\nimport CCheckbox from '@propelinc/citrus-ui/src/components/CCheckbox.vue';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether to enable and display a checked state */\n checkable?: boolean;\n /** Reflects the item's checked state */\n checked?: boolean;\n /** Controls what style of checking to apply, either a checkbox, or just a check icon */\n checkType?: 'checkbox' | 'icon';\n /** Controls whether the item has hover-state styles and responds to click events */\n selectable?: boolean;\n }>(),\n {\n checkable: false,\n checked: false,\n checkType: 'checkbox',\n selectable: true,\n }\n);\n\ndefineSlots<{\n 'prepend-inner'?: () => VNode[];\n 'default'?: () => VNode[];\n}>();\n\nconst onClick = (e: Event): void => {\n if (!props.selectable) {\n e.preventDefault();\n e.stopPropagation();\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.menu-item {\n &::part(base) {\n @include body-emphasized;\n\n --sl-spacing-x-small: 12px;\n\n align-items: center;\n background-color: $color-white;\n color: $color-black;\n cursor: initial;\n padding: 12px 16px;\n }\n\n &.selectable::part(base):hover {\n background-color: var(--sl-color-neutral-100);\n color: var(--sl-color-neutral-1000);\n cursor: pointer;\n }\n\n &::part(checked-icon) {\n // Hide Shoelace's built-in checkmark, as it is not customizable and does not match our standard\n // checkmark icon.\n display: none;\n }\n\n &::part(submenu-icon) {\n display: none;\n }\n\n .checkbox {\n // We're using CCheckbox exclusively as a visual reflection of sl-menu-item's internal checked\n // state, so it should not capture any mouse events.\n pointer-events: none;\n }\n\n .check-icon {\n width: 14px;\n }\n}\n</style>\n","<template>\n <sl-menu-label class=\"menu-label pt-3 px-4\">\n <slot />\n </sl-menu-label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu-label/menu-label.js';\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.menu-label {\n &::part(base) {\n @include eyebrow;\n\n padding: 0;\n }\n}\n</style>\n","<template>\n <sl-dialog\n ref=\"modal\"\n :label=\"dialogLabel\"\n no-header\n :open=\"value\"\n class=\"c-modal\"\n :class=\"{ 'c-modal--fullscreen': fullscreen }\"\n :data-loading=\"loading || undefined\"\n :data-state=\"value ? 'open' : 'closed'\"\n :data-test=\"getDataTestAttr()\"\n @sl-hide=\"$emit('input', false)\"\n @sl-request-close=\"onRequestClose\"\n @sl-after-show=\"isVisible = true\"\n @sl-after-hide=\"isVisible = false\"\n >\n <CExpandTransition class=\"c-modal__wrapper\" :disabled=\"!enableExpandTransition\">\n <div v-if=\"!loading\" class=\"c-modal__body\">\n <div :data-test=\"getDataTestAttr('content')\" class=\"c-modal__content\">\n <h2 v-if=\"title\" class=\"c-modal__title\" :data-test=\"getDataTestAttr('title')\">\n {{ title }}\n </h2>\n <button\n v-if=\"dismissible\"\n class=\"c-modal__dismiss\"\n :data-test=\"getDataTestAttr('dismiss')\"\n @click=\"$emit('input', false)\"\n >\n {{ $t('Dismiss') }}\n </button>\n <slot />\n </div>\n <CButtonStack\n v-if=\"footerHasContent\"\n tag=\"footer\"\n class=\"c-modal__footer\"\n :large=\"fullscreen || undefined\"\n :data-test=\"getDataTestAttr('footer')\"\n >\n <slot name=\"footer\" />\n </CButtonStack>\n </div>\n <div v-else class=\"c-modal__loading\" :data-test=\"value ? `${dataTest}-loading` : null\">\n <div class=\"c-modal__loading__loader\"><CLoader /></div>\n <slot name=\"loading\">\n <div v-if=\"loadingMessage\" :data-test=\"value ? `${dataTest}-loading-message` : null\">\n {{ loadingMessage }}\n </div>\n </slot>\n </div>\n </CExpandTransition>\n </sl-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type SlDialog from '@shoelace-style/shoelace/dist/components/dialog/dialog.js';\nimport '@shoelace-style/shoelace/dist/components/dialog/dialog.js';\nimport type { VNode } from 'vue';\nimport { computed, ref } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport CExpandTransition from '@propelinc/citrus-ui/src/components/CExpandTransition.vue';\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** Aria label for the modal. This is required if title is hidden */\n ariaLabel?: string;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Allows modal to be dismissed */\n dismissible?: boolean;\n /** Controls whether the modal displays fullscreen */\n fullscreen?: boolean;\n /** Shows loading state and sets loading message if string */\n loading?: string | boolean;\n /** The title of the modal */\n title?: string | null;\n /** Toggles the open/close animation */\n transition?: boolean;\n /** Controls whether or not the modal is showing */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n dataTest: 'modal',\n dismissible: true,\n fullscreen: false,\n loading: false,\n title: null,\n transition: true,\n value: false,\n }\n);\n\ndefineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n footer?: () => VNode[];\n loading?: () => VNode[];\n}>();\n\nconst onRequestClose = (event: Event): void => {\n if (!props.dismissible) {\n event.preventDefault();\n }\n};\n\nconst modal = ref<SlDialog | null>(null);\nconst animation = computed<'default' | null>(() => (props.transition ? 'default' : null));\nuseShoelaceAnimation(modal, 'dialog.show', animation);\nuseShoelaceAnimation(modal, 'dialog.hide', animation);\nuseShoelaceAnimation(modal, 'dialog.overlay.show', animation);\nuseShoelaceAnimation(modal, 'dialog.overlay.hide', animation);\n\nconst isVisible = ref(false);\n// NOTE(mohan): Don't do any expand transitions until the modal is fully\n// open.\nconst enableExpandTransition = computed(() => !props.fullscreen && isVisible.value);\n\nconst getDataTestAttr = (suffix?: string): string => {\n return suffix ? `${props.dataTest}-${suffix}` : props.dataTest;\n};\n\nconst loadingMessage = computed(() => {\n return typeof props.loading === 'string' ? props.loading : null;\n});\n\nconst dialogLabel = computed(() => {\n if (loadingMessage.value) {\n return loadingMessage.value;\n }\n\n return props.title || props.ariaLabel;\n});\n\nconst footerHasContent = useSlotHasContent('footer');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-modal {\n &::part(body) {\n padding: 24px 24px 16px;\n }\n\n :deep() {\n .c-card-section {\n padding: 0 !important;\n }\n\n .c-card-footer {\n padding: 24px 0 0;\n }\n\n // NOTE(slanden): This is a bit of a hack to ensure that the content of the modal\n // stays within the bounds of the page and scrolls rather than continuing on past\n // the bottom of the page and getting lost.\n .c-expand-transition--disabled .c-expand-transition__content {\n height: 100%;\n }\n }\n}\n\n.c-modal__title {\n @include large-headline;\n\n padding: 0 0 8px;\n}\n\n.c-modal__dismiss {\n @include sr-only;\n}\n\n.c-modal__body {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.c-modal__content {\n display: flex;\n flex: auto;\n flex-direction: column;\n max-height: 100%;\n}\n\n.c-modal__footer {\n flex: none;\n padding: 24px 0 0;\n}\n\n.c-modal__loading {\n padding: 32px 0 24px;\n text-align: center;\n}\n\n.c-modal__loading__loader {\n line-height: 1;\n margin-bottom: 8px;\n}\n\n.c-modal--fullscreen {\n &::part(panel) {\n border-radius: 0;\n height: 100%;\n max-height: none;\n max-width: none;\n width: 100%;\n }\n\n &::part(body) {\n padding: calc(env(safe-area-inset-top, 0) + 12px) 16px max(env(safe-area-inset-bottom, 0), 12px);\n }\n\n .c-modal__wrapper {\n height: 100%;\n }\n}\n</style>\n","<template>\n <CModal\n :value=\"value\"\n :loading=\"message || true\"\n :data-test=\"dataTest\"\n :dismissible=\"false\"\n @input=\"$emit('input', $event)\"\n >\n <template #loading>\n <slot name=\"loading\" />\n </template>\n </CModal>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CModal from '@propelinc/citrus-ui/src/components/CModal.vue';\n\nwithDefaults(\n defineProps<{\n /** Prefix for test selectors */\n dataTest?: string;\n /** Controls the message shown below the Modal Loading icon */\n message?: string | null;\n /** Controls whether or not the modal is showing */\n value?: boolean;\n }>(),\n {\n dataTest: 'loading-modal',\n message: null,\n value: false,\n }\n);\n\ndefineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n loading?: () => VNode[];\n}>();\n</script>\n","<template>\n <div\n data-test=\"notification\"\n class=\"c-notification\"\n :class=\"`c-notification--${computedVariant}`\"\n >\n <CIconButton\n v-if=\"dismissible\"\n data-test=\"notification-dismiss\"\n variant=\"tertiary\"\n class=\"c-notification__close-button\"\n :icon=\"farXmark\"\n :aria-label=\"$t('Dismiss')\"\n @click=\"$emit('dismiss')\"\n />\n <slot name=\"title\">\n <div v-if=\"title || titleIcon\" class=\"c-notification__title\" data-test=\"notification-title\">\n <font-awesome-icon\n v-if=\"titleIcon\"\n class=\"c-notification__title-icon\"\n data-test=\"notification-title-icon\"\n :icon=\"titleIcon\"\n />\n <div data-test=\"notification-title-text\" class=\"c-notification__title-text\">\n <strong>{{ title }}</strong>\n </div>\n </div>\n </slot>\n\n <div data-test=\"notification-body\" class=\"c-notification__text\">\n <slot />\n </div>\n\n <CButton\n v-if=\"hasButton\"\n data-test=\"notification-button\"\n class=\"c-notification__button\"\n :loading=\"buttonLoading\"\n :to=\"buttonTo\"\n :href=\"buttonHref\"\n :target=\"buttonTarget\"\n @click=\"$emit('click:button')\"\n >\n {{ buttonText }}\n </CButton>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faXmark as farXmark } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CButton from '@propelinc/citrus-ui/src/components/CButton/CButton.vue';\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\n\nimport type { NotificationVariant } from '../types';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\nconst props = withDefaults(\n defineProps<{\n /**\n * @deprecated use `variant` prop instead\n * Renders the error state\n */\n // TODO(mohan): Make alert prop accessible.\n alert?: boolean;\n /**\n * @deprecated use `variant` prop instead\n * Renders the warning state\n */\n warning?: boolean;\n /** The variant of the notification */\n variant?: NotificationVariant;\n dismissible?: boolean;\n title?: string;\n titleIcon?: object;\n buttonText?: string;\n buttonTo?: RouteLocationRaw;\n buttonHref?: string;\n buttonTarget?: string;\n buttonLoading?: boolean;\n }>(),\n {\n alert: false,\n warning: false,\n variant: 'info',\n dismissible: false,\n title: '',\n titleIcon: undefined,\n buttonText: undefined,\n buttonTo: undefined,\n buttonHref: undefined,\n buttonTarget: undefined,\n buttonLoading: false,\n }\n);\n\ndefineEmits<{\n 'click:button': [];\n 'dismiss': [];\n}>();\n\ndefineSlots<{\n title?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst hasButton = computed(() => !!props.buttonText);\n\n/**\n * Handle merging the deprecated `alert` and `warning` props\n * with the `variant` prop.\n */\nconst computedVariant = computed(() => {\n if (props.alert) {\n return 'alert';\n } else if (props.warning) {\n return 'warning';\n }\n return props.variant;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-notification {\n background-color: $color-blue-100;\n border-radius: $border-radius-next;\n padding: 16px;\n position: relative;\n}\n\n.c-notification--success {\n background-color: $color-green-100;\n}\n\n.c-notification--alert {\n background-color: $color-red-100;\n}\n\n.c-notification--warning {\n background-color: $color-gold-100;\n}\n\n.c-notification__close-button {\n float: right;\n font-size: 14px;\n margin-right: -8px;\n margin-top: -8px;\n}\n\n.c-notification__title {\n align-items: center;\n display: flex;\n margin-bottom: 8px;\n}\n\n.c-notification__title-icon {\n margin-right: 8px;\n}\n\n.c-notification__title-text {\n flex: 1;\n}\n\n.c-notification__button {\n margin-top: 12px;\n}\n</style>\n","import { type Ref, computed, ref } from 'vue';\n\nexport interface Field {\n input: HTMLInputElement | null;\n}\n\ninterface FocusableField {\n field: Ref<Field | null>;\n focus: () => void;\n}\n\nexport function useFocusableField(): FocusableField {\n const field = ref<Field | null>(null);\n const input = computed(() => field.value?.input as HTMLInputElement);\n function focus(): void {\n input?.value.focus();\n }\n return { field, focus };\n}\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :value=\"value\"\n type=\"tel\"\n :label=\"label || $t('Phone number')\"\n mask=\"(###) ###-####\"\n :minlength=\"10\"\n :maxlength=\"10\"\n :placeholder=\"placeholder || '(555) 555-5555'\"\n :data-test=\"dataTest\"\n :rules=\"[...defaultRules, ...rules]\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nwithDefaults(\n defineProps<{\n /** A custom data-test attribute for the input. */\n dataTest?: string;\n /** A unique id for the input. */\n id?: string;\n /** The input's label. */\n label?: string | null;\n /** The input's placeholder. */\n placeholder?: string;\n /** Additional validation rules. */\n rules?: Rules<string>;\n /** The value of the input. */\n value?: string;\n }>(),\n {\n dataTest: 'phone-field',\n id: undefined,\n label: null,\n placeholder: '',\n rules: () => [],\n value: '',\n }\n);\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = computed(() => {\n const errorMessage = t('Please enter a valid {inputLabel}', {\n inputLabel: t('phone number'),\n });\n return [minLengthRule(10, errorMessage)];\n});\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const SELECTED_VALUE = Symbol('selected-value') as InjectionKey<Ref<string>>;\nexport const TOGGLE_VALUE = Symbol('toggle-value') as InjectionKey<\n (value: string | undefined) => void\n>;\nexport const ROLE = Symbol('role') as InjectionKey<Ref<string>>;\n","<template>\n <span\n v-bind=\"$attrs\"\n :aria-checked=\"ariaChecked\"\n :class=\"{ 'c-pill--active': isSelected }\"\n class=\"c-pill\"\n data-test=\"pill\"\n :role=\"role\"\n @click=\"onClick\"\n >\n <span class=\"c-pill-body\" data-test=\"pill-body\">\n <span v-if=\"icon || $slots.icon\" class=\"c-pill-icon\">\n <slot name=\"icon\">\n <FontAwesomeIcon v-if=\"icon\" data-test=\"pill-icon\" fixed-width :icon=\"icon\" />\n </slot>\n </span>\n\n <span class=\"c-pill-text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed, inject } from 'vue';\n\nimport {\n ROLE,\n SELECTED_VALUE,\n TOGGLE_VALUE,\n} from '@propelinc/citrus-ui/src/services/injections/pills';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\ntype ToggleVariant = 'standalone' | 'group' | 'none';\n\nconst props = withDefaults(\n defineProps<{\n /** The icon to display. */\n icon?: string | string[] | IconDefinition;\n /**\n * By default, this is a boolean that determines if the pill is selected or\n * not. If in a pill group, this is a string that identifies this pill.\n */\n value?: boolean | string;\n }>(),\n {\n icon: undefined,\n value: undefined,\n }\n);\n\nconst emit = defineEmits<{\n click: [];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n icon?: () => VNode[];\n}>();\n\nconst injectedRole = inject(ROLE, undefined);\nconst injectedSelectedValue = inject(SELECTED_VALUE, undefined);\nconst toggleValue = inject(TOGGLE_VALUE, undefined);\n\nconst toggleVariant = computed<ToggleVariant>(() => {\n if (toggleValue) {\n return 'group';\n }\n\n if (props.value !== undefined) {\n return 'standalone';\n }\n\n return 'none';\n});\n\nconst isSelected = computed(() => {\n if (toggleVariant.value === 'standalone') {\n return props.value;\n }\n\n if (injectedSelectedValue?.value) {\n return injectedSelectedValue.value === props.value;\n }\n\n return undefined;\n});\n\nconst ariaChecked = computed((): 'true' | 'false' | undefined => {\n if (isSelected.value === undefined) {\n return undefined;\n }\n\n return isSelected.value ? 'true' : 'false';\n});\n\nconst role = computed(() => {\n if (toggleVariant.value === 'standalone') {\n return 'radio';\n }\n\n if (toggleVariant.value === 'group') {\n return injectedRole?.value ?? undefined;\n }\n\n return undefined;\n});\n\nconst onClick = (): void => {\n if (toggleVariant.value === 'standalone') {\n emit('input', !props.value);\n }\n\n if (toggleVariant.value === 'group' && toggleValue) {\n const nextValue = isSelected.value ? undefined : (props.value as string);\n toggleValue(nextValue);\n }\n\n emit('click');\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-pill {\n background-color: $color-white;\n border: $border-width solid $color-border;\n border-radius: $border-radius-next;\n color: $color-text-primary;\n display: inline-block;\n font-family: $font-family-polymath;\n height: $button-size-medium;\n padding-inline: 12px;\n}\n\n.c-pill--active {\n background-color: $color-black;\n border-color: $color-black;\n color: $color-white;\n}\n\n.c-pill-body {\n align-items: center;\n display: flex;\n gap: 8px;\n height: 100%;\n\n /**\n * Improves icon alignment\n */\n line-height: 1;\n white-space: nowrap;\n}\n\n.c-pill-icon {\n width: 16px;\n}\n</style>\n","<template>\n <div class=\"c-pill-group\" data-test=\"pill-group\">\n <fieldset class=\"c-pill-group__track\">\n <slot>\n <CPill\n v-for=\"option in options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :icon=\"option.icon\"\n >\n {{ option.label }}\n </CPill>\n </slot>\n </fieldset>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref } from 'vue';\n\nimport CPill from '@propelinc/citrus-ui/src/components/CPill.vue';\nimport {\n ROLE,\n SELECTED_VALUE,\n TOGGLE_VALUE,\n} from '@propelinc/citrus-ui/src/services/injections/pills';\nimport type { FaIcon } from '@propelinc/citrus-ui/src/types/font-awesome';\n\ninterface PillConfig {\n label: string;\n value: string;\n icon?: FaIcon;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** A list of pills to display. This is overwritten by the default slot. */\n options?: PillConfig[];\n /** Specifies which pill is selected. */\n value?: string;\n }>(),\n {\n options: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n input: [value: string | undefined];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nprovide(ROLE, ref('radio'));\nprovide(\n SELECTED_VALUE,\n computed(() => props.value)\n);\nprovide(TOGGLE_VALUE, (value) => {\n emit('input', value);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-pill-group {\n overflow: scroll hidden;\n padding: 0 16px;\n}\n\n.c-pill-group__track {\n border: none;\n display: block;\n display: flex;\n flex-wrap: nowrap;\n gap: 8px;\n}\n</style>\n","<template>\n <sl-popup ref=\"popup\" :active=\"value\" distance=\"8\" class=\"c-popup\">\n <span slot=\"anchor\" class=\"anchor\">\n <slot />\n </span>\n <slot name=\"content\" />\n </sl-popup>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SlPopup } from '@shoelace-style/shoelace';\nimport '@shoelace-style/shoelace/dist/components/popup/popup.js';\nimport type { VNode } from 'vue';\nimport { onMounted, onUnmounted, ref, watchEffect } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n value?: boolean;\n }>(),\n {\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n 'mouseleave': [];\n 'outside-click': [];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n content?: () => VNode[];\n}>();\n\nconst popup = ref<SlPopup | null>(null);\n\nconst handleMouseLeave = (): void => {\n if (props.value) {\n emit('mouseleave');\n }\n};\n\nconst handleOutsideClick = ({ target }: MouseEvent): void => {\n if (target instanceof HTMLElement && !popup.value?.contains(target)) {\n emit('outside-click');\n }\n};\n\nwatchEffect(async () => {\n if (props.value) {\n document.addEventListener('click', handleOutsideClick);\n } else {\n document.removeEventListener('click', handleOutsideClick);\n }\n});\n\nonMounted(() => {\n popup.value?.addEventListener('mouseleave', handleMouseLeave);\n});\n\nonUnmounted(() => {\n document.removeEventListener('click', handleOutsideClick);\n popup.value?.removeEventListener('mouseleave', handleMouseLeave);\n});\n</script>\n\n<style scoped>\n.c-popup::part(popup) {\n z-index: 1;\n}\n\n.anchor {\n height: fit-content;\n}\n</style>\n","<template>\n <sl-progress-bar\n class=\"c-progress-linear\"\n :class=\"{ 'c-progress-linear--rounded': rounded }\"\n :data-test=\"dataTest\"\n :value=\"value\"\n :indeterminate=\"indeterminate || undefined\"\n :label=\"accessibleText || $t('Loading...')\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/progress-bar/progress-bar.js';\n\nwithDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Selector for testing */\n dataTest?: string;\n /** Renders an indefinite loading state */\n indeterminate?: boolean;\n /** Rounds the progress bar */\n rounded?: boolean;\n /** The current progress from 0 to 100 */\n value?: number | string;\n }>(),\n {\n accessibleText: undefined,\n dataTest: 'c-progress-linear',\n indeterminate: false,\n rounded: true,\n value: 0,\n }\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$progress-linear-height: 4px;\n\n.c-progress-linear {\n --height: #{$progress-linear-height};\n --indicator-color: #{$color-black};\n --track-color: #{$color-gray-200};\n\n &::part(base) {\n border-radius: 0;\n }\n}\n\n.c-progress-linear--rounded {\n &::part(base) {\n border-radius: calc(#{$progress-linear-height} / 2);\n }\n}\n</style>\n","<template>\n <span\n class=\"c-progress-ring\"\n :data-test=\"dataTest\"\n :aria-label=\"accessibleText || $t('Loading...')\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n :aria-valuemax=\"String(valueMax)\"\n :aria-valuenow=\"String(value)\"\n :style=\"{\n '--size': `${size}px`,\n '--indicator-color': cssColor,\n '--track-color': trackCssColor,\n '--track-width': `${trackWidth}px`,\n '--indicator-length': `${percentage}`,\n }\"\n >\n <svg class=\"c-progress-ring__svg\">\n <circle class=\"c-progress-ring__track\" />\n <circle class=\"c-progress-ring__indicator\" pathLength=\"100\" />\n </svg>\n <span class=\"c-progress-ring__label\">\n <slot />\n </span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { VNode } from 'vue';\n\nimport type Colors from '@propelinc/citrus-ui/src/colors/colors';\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport { useCssColor } from '@propelinc/citrus-ui/src/composables/colors';\n\nconst props = withDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Selector for testing */\n dataTest?: string;\n /** The current progress, from 0 to valueMax */\n value?: number | string;\n /** Total progress */\n valueMax?: number | string;\n /** The outer diameter of the progress ring, in px */\n size?: number | string;\n /** The width of the progress ring, in px */\n trackWidth?: number | string;\n /** Sets the indicator color */\n color?: HexColor | keyof typeof Colors;\n /** Sets the track color underneath the indicator */\n trackColor?: HexColor | keyof typeof Colors;\n }>(),\n {\n accessibleText: undefined,\n dataTest: 'c-progress-ring',\n value: 0,\n valueMax: 100,\n size: 44,\n trackWidth: 4,\n color: 'blue-500',\n trackColor: 'gray-200',\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { cssColor } = useCssColor(() => props.color);\nconst { cssColor: trackCssColor } = useCssColor(() => props.trackColor);\n\nconst percentage = computed(() => (100 * Number(props.value)) / Number(props.valueMax));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-progress-ring {\n align-items: center;\n display: inline-flex;\n flex-shrink: 0;\n font-size: var(--size);\n height: 1em;\n justify-content: center;\n position: relative;\n width: 1em;\n\n &__label {\n color: var(--indicator-color);\n font-size: $font-size-small;\n font-weight: $font-weight-bold;\n }\n\n &__svg {\n height: 100%;\n position: absolute;\n width: 100%;\n }\n\n &__indicator,\n &__track {\n cx: 0.5em;\n cy: 0.5em;\n fill: none;\n r: calc(0.5em - var(--track-width) / 2);\n stroke-width: var(--track-width);\n }\n\n &__indicator {\n stroke: var(--indicator-color);\n\n /* The empty gap equal to the path length 100 to make the rest of the circle empty. */\n stroke-dasharray: var(--indicator-length) 100;\n stroke-linecap: round;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n transition: stroke-dasharray 0.2s;\n }\n\n &__track {\n stroke: var(--track-color);\n }\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport interface RadioState {\n value: unknown;\n invalid: boolean;\n name: string;\n update: (value: unknown) => void;\n register: (value: unknown) => void;\n unregister: (value: unknown) => void;\n}\n\nexport const RADIO_STATE = Symbol('radio-state') as InjectionKey<Ref<RadioState>>;\n","<template>\n <label\n :id=\"idWithFallback\"\n :for=\"`${idWithFallback}-input`\"\n :data-test=\"dataTest\"\n :data-selected=\"parentState.value === value || undefined\"\n class=\"c-radio\"\n :class=\"{\n 'c-radio--invalid': parentState.invalid,\n 'c-radio--checked': parentState.value === value,\n }\"\n >\n <input\n :id=\"`${idWithFallback}-input`\"\n type=\"radio\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-radio__input\"\n :class=\"{ 'sr-only': hideRadio }\"\n :name=\"parentState.name\"\n :value=\"value\"\n :checked=\"parentState.value === value || undefined\"\n @change=\"onChange($event)\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n />\n <slot name=\"label\">{{ label }} </slot>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { inject, onBeforeUnmount, onMounted, ref, toRefs } from 'vue';\n\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport type { RadioState } from '@propelinc/citrus-ui/src/services/injections/radio';\nimport { RADIO_STATE } from '@propelinc/citrus-ui/src/services/injections/radio';\n\nconst props = withDefaults(\n defineProps<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n id?: string | null;\n label?: string | null;\n dataTest?: string;\n hideRadio?: boolean;\n }>(),\n {\n id: null,\n label: null,\n dataTest: 'radio-group-option',\n hideRadio: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'change', event: Event): void;\n (e: 'blur'): void;\n (e: 'focus'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n}>();\n\nconst { id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst parentState = inject(\n RADIO_STATE,\n ref<RadioState>({\n value: null,\n name: idWithFallback.value,\n invalid: false,\n update: () => {},\n register: () => {},\n unregister: () => {},\n })\n);\n\nconst onChange = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n parentState.value.update(target.checked ? props.value : null);\n emit('change', event);\n};\n\nonMounted((): void => {\n parentState.value.register(props.value);\n});\n\nonBeforeUnmount((): void => {\n parentState.value.unregister(props.value);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-radio {\n align-items: center;\n background-color: $color-background;\n border: $border;\n border-radius: $border-radius-next;\n cursor: pointer;\n display: flex;\n gap: 12px;\n padding: 12px;\n transition: border-color $citrus-field-transition-duration ease;\n width: 100%;\n}\n\n.c-radio__input {\n accent-color: $color-black;\n background-color: $color-black;\n border: $color-gray-300 solid $border-width;\n border-color: $color-black;\n margin-top: 1px;\n transform: scale(1.5);\n}\n\n.c-radio__label {\n padding: 0 12px;\n width: 100%;\n}\n\n.c-radio--checked {\n border-color: $color-black;\n}\n\n.c-radio--invalid {\n border-color: $color-status-error;\n}\n\n.c-radio--invalid .c-radio__input {\n accent-color: $color-status-error;\n border-color: $color-status-error;\n}\n</style>\n","<template>\n <fieldset\n :id=\"idWithFallback\"\n ref=\"radioGroup\"\n :data-test=\"dataTest\"\n role=\"radiogroup\"\n class=\"c-radio-group\"\n :class=\"{\n 'c-radio-group--column': column,\n 'c-radio-group--row': !column,\n 'c-radio-group--invalid': !isValidationValid,\n }\"\n :aria-invalid=\"isValidationValid ? 'false' : 'true'\"\n :aria-labelledby=\"`${idWithFallback}-label`\"\n :aria-errormessage=\"`${idWithFallback}-message`\"\n >\n <span :id=\"`${idWithFallback}-label`\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n\n <slot />\n\n <CValidationMessage\n :id=\"`${idWithFallback}-message`\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </fieldset>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref, toRefs, watch } from 'vue';\n\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\nimport { RADIO_STATE } from '@propelinc/citrus-ui/src/services/injections/radio';\n\nconst props = withDefaults(\n defineProps<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n id?: string | null;\n dataTest?: string;\n label?: string | null;\n column?: boolean;\n mandatory?: boolean;\n rules?: Rules<string>;\n hideDetails?: boolean | 'auto';\n }>(),\n {\n value: null,\n id: null,\n dataTest: 'radio-group',\n label: null,\n column: true,\n mandatory: false,\n rules: () => [],\n hideDetails: false,\n }\n);\n\nconst emit = defineEmits<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: 'change', value: any): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: 'input', value: any): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n default?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, id, mandatory } = toRefs(props);\nconst idWithFallback = useId(id);\nconst radioGroup = ref<HTMLElement | null>(null);\n\nconst internalValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('change', newValue);\n emit('input', newValue);\n },\n});\n\nconst {\n startValidating,\n message: validationMessage,\n valid: isValidationValid,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n required: mandatory,\n validateOn: 'change',\n});\n\nprovide(\n RADIO_STATE,\n computed(() => ({\n invalid: !isValidationValid.value,\n value: internalValue.value,\n name: idWithFallback.value,\n update: (newValue: unknown): void => {\n internalValue.value = newValue;\n },\n register: (value: unknown): void => {\n if (props.mandatory && internalValue.value === null) {\n internalValue.value = value;\n }\n },\n unregister: (value: unknown): void => {\n if (internalValue.value === value) {\n internalValue.value = null;\n }\n },\n }))\n);\n\nwatch(internalValue, () => {\n startValidating();\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-radio-group {\n border: none;\n display: flex;\n flex-direction: row;\n gap: 8px;\n width: 100%;\n\n &.c-radio-group--column {\n flex-direction: column;\n }\n\n &--row {\n align-items: center;\n\n :deep(.c-radio) {\n width: auto;\n }\n }\n}\n</style>\n","<template>\n <div :class=\"{ 'w-100': fullWidth }\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * NOTE(slanden): This component is no longer used. We are keeping it around for now\n * because it is used in the CMS, but other than applying the w-100 class, it has\n * no effect. We will remove this component in a future PR.\n */\n\nwithDefaults(\n defineProps<{\n fullWidth?: boolean;\n }>(),\n {\n fullWidth: false,\n }\n);\n</script>\n\n<style scoped>\n.w-100 {\n width: 100%;\n}\n</style>\n","<template>\n <div\n class=\"c-row\"\n :class=\"{\n 'c-row--dense': dense,\n 'c-row--no-gutters': noGutters,\n [`align-${align}`]: align,\n [`align-content-${alignContent}`]: alignContent,\n [`justify-${justify}`]: justify,\n }\"\n >\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nwithDefaults(\n defineProps<{\n /** Applies the align-items css property.\n * Available options are: start, center, end and stretch. */\n align?: 'center' | 'start' | 'end' | 'stretch' | null;\n /** Applies the align-content css property.\n * Available options are: start, center, end, and stretch. */\n alignContent?: 'center' | 'start' | 'end' | 'stretch' | null;\n /** Reduces the gutter between c-cols. */\n dense?: boolean;\n /** Removes the gutter between c-cols. */\n noGutters?: boolean;\n /** Applies the justify-content css property.\n * Available options are: start, center, end, space-between and space-around. */\n justify?: 'center' | 'start' | 'end' | 'space-between' | 'space-around' | null;\n }>(),\n {\n align: null,\n alignContent: null,\n dense: false,\n noGutters: false,\n justify: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n.c-row {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n margin: 0 -12px;\n}\n\n.c-row--dense {\n margin: 0 -4px;\n}\n\n.c-row--no-gutters {\n margin: 0;\n}\n</style>\n","<template>\n <div class=\"c-safe-area\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.c-safe-area {\n --full-height: 100vh;\n\n display: flex;\n flex-direction: column;\n height: calc(var(--full-height) - env(safe-area-inset-top) - env(safe-area-inset-bottom));\n max-width: 100%;\n overflow: scroll;\n}\n\n@supports (height: 100dvh) {\n .c-safe-area {\n --full-height: 100dvh;\n }\n}\n</style>\n","<template>\n <div class=\"c-section-header\" data-test=\"section-header\">\n <component :is=\"tag\" class=\"c-section-header__title\" data-test=\"section-header-title\">\n {{ title }}\n </component>\n <slot name=\"append\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { provide, ref } from 'vue';\n\nimport { TERTIARY as TERTIARY_ICON_BUTTON } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nwithDefaults(\n defineProps<{\n /** The tag used for the title text. */\n tag?: string;\n /** The title text to display. */\n title?: string;\n }>(),\n {\n tag: 'h2',\n title: '',\n }\n);\n\ndefineSlots<{\n append?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/typography';\n\n.c-section-header {\n align-items: center;\n display: flex;\n gap: 12px;\n height: 48px;\n justify-content: space-between;\n}\n\n.c-section-header__title {\n @include headline;\n @include text-overflow-ellipsis;\n\n flex: 1 1 auto;\n}\n\n.c-card + .c-section-header {\n margin-top: 16px;\n}\n</style>\n","<!--\n This Skeleton component is the foundation for all of our skeleton loader components.\n\n In most cases, you will use a more specific version of this component, such as\n CSkeletonLoaderCard, CSkeletonLoaderText, CSkeletonLoaderCircle, etc.\n\n However, you can create custom skeleton loaders ad-hoc through composition. For example, a custom\n loader text component could be created like this:\n\n ```vue\n <div v-for=\"x in 3\" :key=\"x\">\n <div class=\"d-flex w-full\" style=\"font-size: 42px; line-height: 130%;\">\n <div style=\"height: 16px;\">\n <CSkeleton />\n </div>\n <span> </span>\n </div>\n </div>\n ```\n-->\n\n<template>\n <div class=\"c-skeleton\" data-test=\"skeleton\">\n <div class=\"c-skeleton__indicator\" />\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-skeleton {\n display: flex;\n height: 100%;\n min-height: 1rem;\n position: relative;\n width: 100%;\n}\n\n.c-skeleton__indicator {\n --color: #{$color-gray-100};\n --sheen-color: #{$color-gray-200};\n\n animation: sheen 8s ease-in-out infinite;\n background: linear-gradient(\n 270deg,\n var(--sheen-color),\n var(--color),\n var(--color),\n var(--sheen-color)\n );\n background-size: 400% 100%;\n border-radius: $border-radius-next;\n flex: 1 1 auto;\n}\n\n@keyframes sheen {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -200% 0;\n }\n}\n</style>\n","<template>\n <div\n class=\"c-skeleton-loader-card\"\n data-test=\"skeleton-loader-card\"\n :style=\"{ height: `${height}px` }\"\n >\n <CSkeleton />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n\nwithDefaults(\n defineProps<{\n /** Controls the height of the skeleton loader card */\n height?: number | string;\n }>(),\n {\n height: 100,\n }\n);\n</script>\n","<template>\n <div class=\"c-skeleton-loader-circle\" data-test=\"skeleton-loader-circle\">\n <CSkeleton />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n</script>\n\n<style scoped>\n.c-skeleton-loader-circle {\n --size: 36px;\n\n border-radius: calc(var(--size) / 2);\n height: var(--size);\n overflow: hidden;\n width: var(--size);\n}\n</style>\n","<template>\n <div\n data-test=\"skeleton-loader-text\"\n class=\"c-skeleton-loader-text\"\n :class=\"{ [`align-${align}`]: align }\"\n >\n <div\n v-for=\"x in rows\"\n :key=\"x\"\n :class=\"lineTypeClass\"\n class=\"c-skeleton-loader-text__line\"\n data-test=\"skeleton-loader-text-line\"\n >\n <CSkeleton class=\"c-skeleton-loader-text__line__skeleton\" />\n <!-- This invisible text ensures the line height matches the real text. -->\n \n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n\ntype SkeletonLoaderType =\n | 'balance'\n | 'body'\n | 'caption'\n | 'caption-small'\n | 'eyebrow'\n | 'headline'\n | 'large-headline'\n // @deprecated use 'eyebrow' instead\n | 'overline'\n | 'statement'\n | 'subheadline'\n | 'wallet-caption'\n | 'x-large-headline';\n\nconst LINE_TYPE_TO_CLASS: Record<SkeletonLoaderType, string> = {\n 'balance': 'c-skeleton-loader-text__line--balance',\n 'body': 'c-skeleton-loader-text__line--body',\n 'caption': 'c-skeleton-loader-text__line--caption',\n 'caption-small': 'c-skeleton-loader-text__line--caption-small',\n 'eyebrow': 'c-skeleton-loader-text__line--eyebrow',\n 'headline': 'c-skeleton-loader-text__line--headline',\n 'large-headline': 'c-skeleton-loader-text__line--large-headline',\n // @deprecated use 'eyebrow' instead\n 'overline': 'c-skeleton-loader-text__line--eyebrow',\n 'statement': 'c-skeleton-loader-text__line--statement',\n 'subheadline': 'c-skeleton-loader-text__line--subheadline',\n 'wallet-caption': 'c-skeleton-loader-text__line--wallet-caption',\n 'x-large-headline': 'c-skeleton-loader-text__line--x-large-headline',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Applies the align-items css property. */\n align?: 'center' | 'start' | 'end';\n /** Controls how many rows of loading text are shown */\n rows?: number;\n /** Controls the appearance of the loading text */\n type?: SkeletonLoaderType;\n }>(),\n {\n align: 'start',\n rows: 2,\n type: 'body',\n }\n);\n\nconst lineTypeClass = computed(() => {\n return LINE_TYPE_TO_CLASS[props.type];\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n// NOTE(mohan): This ensures that the skeleton loader text is exactly the same size as the text it\n// is replacing including the extra space around the text itself added by the line height.\n@mixin skeleton-loader-text-sizing($font-style) {\n font-size: map-get($font-style, 'size');\n line-height: map-get($font-style, 'line-height');\n\n // By applying a height equal to the font size, the skeleton takes up the space of the text,\n // leaving whitespace between each row\n .c-skeleton-loader-text__line__skeleton {\n height: map-get($font-style, 'size');\n }\n}\n\n.c-skeleton-loader-text {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.c-skeleton-loader-text__line {\n @include skeleton-loader-text-sizing($body);\n\n align-items: center;\n display: flex;\n width: 100%;\n\n &:last-child {\n width: calc(100% - 32px);\n }\n}\n\n.c-skeleton-loader-text__line--balance {\n @include skeleton-loader-text-sizing($balance);\n\n max-width: 120px;\n}\n\n.c-skeleton-loader-text__line--caption {\n @include skeleton-loader-text-sizing($caption);\n}\n\n.c-skeleton-loader-text__line--caption-small {\n @include skeleton-loader-text-sizing($caption-small);\n}\n\n.c-skeleton-loader-text__line--eyebrow {\n @include skeleton-loader-text-sizing($eyebrow);\n}\n\n.c-skeleton-loader-text__line--headline {\n @include skeleton-loader-text-sizing($headline);\n}\n\n.c-skeleton-loader-text__line--large-headline {\n @include skeleton-loader-text-sizing($large-headline);\n}\n\n.c-skeleton-loader-text__line--statement {\n @include skeleton-loader-text-sizing($statement);\n}\n\n.c-skeleton-loader-text__line--subheadline {\n @include skeleton-loader-text-sizing($subheadline);\n}\n\n.c-skeleton-loader-text__line--wallet-caption {\n @include skeleton-loader-text-sizing($wallet-caption);\n}\n\n.c-skeleton-loader-text__line--x-large-headline {\n @include skeleton-loader-text-sizing($x-large-headline);\n}\n</style>\n","<template>\n <div :class=\"direction\" :style=\"{ '--slide-fade-amount': `${amount}px` }\">\n <Transition name=\"slide-fade\" mode=\"out-in\">\n <slot />\n </Transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\ntype Direction = 'to-left' | 'to-right' | 'to-top' | 'to-bottom';\n\ndefineSlots<{ default: () => VNode[] }>();\n\nwithDefaults(\n defineProps<{\n /**\n * The amount of pixels to slide the elements in or out. Should be >= 0\n * @default 20\n */\n amount?: number;\n /**\n * Changes the direction of the slide fade transition\n * @default 'to-left'\n */\n direction?: Direction;\n }>(),\n { amount: 20, direction: 'to-left' }\n);\n</script>\n\n<style scoped>\n.slide-fade-enter-active,\n.slide-fade-leave-active {\n transition: all 0.3s ease-out;\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.slide-fade-enter-from,\n.slide-fade-leave-to {\n opacity: 0;\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-left .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-left .slide-fade-enter-from,\n.to-left .slide-fade-leave-to {\n transform: translateX(calc(-1 * var(--slide-fade-amount)));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-right .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-right .slide-fade-enter-from,\n.to-right .slide-fade-leave-to {\n transform: translateX(var(--slide-fade-amount));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-top .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-top .slide-fade-enter-from,\n.to-top .slide-fade-leave-to {\n transform: translateY(calc(-1 * var(--slide-fade-amount)));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-bottom .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-bottom .slide-fade-enter-from,\n.to-bottom .slide-fade-leave-to {\n transform: translateY(var(--slide-fade-amount));\n}\n</style>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :data-test=\"dataTest\"\n class=\"c-split-input\"\n :type=\"type\"\n :label=\"label\"\n :name=\"name\"\n :inputmode=\"inputmode\"\n :value=\"value\"\n :rules=\"rules\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :autocomplete=\"autocomplete\"\n size=\"large\"\n :mask=\"mask\"\n @input:masked=\"maskedValue = $event\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { HTMLAttributes, VNode } from 'vue';\nimport { computed, ref } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport type { SplitInputField } from '@propelinc/citrus-ui/src/types';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls the underlying input's autocomplete attribute */\n autocomplete?: string;\n /** Custom data-test selector */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /** The fields for each of the split inputs of type SplitInputField */\n fields: SplitInputField[];\n /** A hint to show the appropriate virtual keyboard, e.g. \"numeric\". */\n inputmode?: HTMLAttributes['inputmode'];\n /** The input's label */\n label?: string | null;\n /** The input's name */\n name?: string;\n /** Validation rules */\n rules?: Rules<string>;\n /** The input's type, either text or tel */\n type?: 'text' | 'tel';\n /** The input's value */\n value?: string;\n }>(),\n {\n autocomplete: undefined,\n dataTest: 'split-input',\n disabled: false,\n inputmode: undefined,\n label: null,\n name: undefined,\n rules: () => [],\n type: 'text',\n value: '',\n }\n);\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst maskedValue = ref('');\n\nconst placeholder = computed(() => {\n return props.fields.map((field) => `${field.placeholder ?? ''}${field.separator ?? ''}`).join('');\n});\n\nconst mask = computed(() => {\n return props.fields\n .map((field) => `${Array(field.characters).fill('*').join('')}${field.separator ?? ''}`)\n .join('');\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n@mixin split-input-text {\n @include headline;\n\n letter-spacing: 12px;\n line-height: 1;\n text-align: center;\n}\n\n.c-split-input {\n &::part(input) {\n @include split-input-text;\n }\n\n &::part(input)::placeholder {\n @include split-input-text;\n\n font-weight: $font-weight-normal;\n }\n}\n</style>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :data-test=\"dataTest\"\n :value=\"value\"\n :label=\"label || defaultLabel\"\n :placeholder=\"fourDigitSsn ? 'XXXX' : 'XXX-XX-XXXX'\"\n inputmode=\"numeric\"\n :mask=\"fourDigitSsn ? '####' : '###-##-####'\"\n :minlength=\"fourDigitSsn ? 4 : 9\"\n :maxlength=\"fourDigitSsn ? 4 : 9\"\n :hideable=\"!fourDigitSsn\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n :rules=\"computedRules\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n <template #append>\n <!-- NOTE(mohan): When requesting the full SSN, we have to leave space for\n the hide/show icon. -->\n <FontAwesomeIcon v-if=\"fourDigitSsn\" :icon=\"faLock\" fixed-width />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport { faLock } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n rules?: Rules<string>;\n value?: string;\n fourDigitSsn?: boolean;\n }>(),\n {\n dataTest: 'ssn-field',\n id: undefined,\n label: null,\n rules: (): Rules<string> => [],\n value: '',\n fourDigitSsn: false,\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\nconst defaultLabel = computed(() => {\n return props.fourDigitSsn ? t('Last 4 digits of SSN') : t('Social Security number');\n});\nconst defaultRules = computed(() => {\n const fourDigitRule = minLengthRule(4, t('Please enter the last four digits of your SSN'));\n const fullSsnRule = minLengthRule(\n 9,\n t('Please enter a valid {inputLabel}', { inputLabel: t('Social Security number') })\n );\n return [props.fourDigitSsn ? fourDigitRule : fullSsnRule];\n});\n\nconst computedRules = computed(() => [...defaultRules.value, ...props.rules]);\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","<template>\n <div\n class=\"c-status-dot\"\n :class=\"{\n 'c-status-dot--count': hasCount,\n 'c-status-dot--bordered': bordered,\n }\"\n data-test=\"status-dot\"\n role=\"img\"\n >\n {{ displayCount }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { useA11yLabelCheck } from '@propelinc/citrus-ui/src/composables/accessibility';\n\nconst props = withDefaults(\n defineProps<{\n count?: number | null;\n bordered?: boolean;\n }>(),\n {\n count: null,\n bordered: false,\n }\n);\n\nuseA11yLabelCheck('CStatusDot');\n\nconst hasCount = computed(() => props.count !== null);\nconst displayCount = computed(() => {\n return props.count && props.count > 9 ? '9+' : props.count;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-status-dot {\n background-color: $color-status-error;\n border-radius: 9999px;\n display: inline-block;\n height: 8px;\n width: 8px;\n}\n\n.c-status-dot--bordered {\n box-shadow: 0 0 0 1.5px $color-white;\n}\n\n/**\n * For users that may increase their font size for legibility,\n * we use rems so the circle grows if the font size increases.\n */\n.c-status-dot--count {\n align-items: center;\n color: $color-white;\n display: flex;\n font-size: 0.625rem;\n font-weight: $font-weight-bold;\n height: 1rem;\n justify-content: center;\n line-height: 1;\n text-align: center;\n width: 1rem;\n}\n</style>\n","<template>\n <sl-switch\n class=\"c-switch\"\n :class=\"{\n 'c-switch--label-first': labelFirst,\n 'c-switch--disabled': disabled,\n 'c-switch--checked': internalValue,\n 'c-switch--aria-labelled': ariaLabel,\n }\"\n :checked=\"internalValue || undefined\"\n :disabled=\"disabled || undefined\"\n @sl-change=\"internalValue = !internalValue\"\n >\n <slot />\n <span v-if=\"ariaLabel\" class=\"c-switch__sr-label\">\n {{ ariaLabel }}\n </span>\n </sl-switch>\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/switch/switch.js';\nimport type { VNode } from 'vue';\nimport { toRefs } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\n\nconst props = withDefaults(\n defineProps<{\n /** Label for screen-readers. This hides and overrides the normal label. */\n ariaLabel?: string;\n /** Prevents the user from interacting with the switch */\n disabled?: boolean;\n /** When true, the slot label is visually rendered before the control (label left, switch right) */\n labelFirst?: boolean;\n /** Whether the switch is in an \"on\" or \"off\" state */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n disabled: false,\n labelFirst: false,\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: boolean): void;\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { value } = toRefs(props);\nconst internalValue = useInternalValue(value, {\n onChange: (newValue) => emit('input', newValue),\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n@mixin switch-theme($control-color, $thumb-color, $thumb-indicator-color) {\n &::part(control) {\n background-color: $control-color;\n }\n\n &::part(thumb) {\n background-color: $thumb-color;\n }\n\n &::part(thumb)::after {\n background-color: $thumb-indicator-color;\n }\n}\n\n.c-switch {\n --width: 44px;\n --height: 24px;\n --thumb-size: 20px;\n\n &::part(control) {\n border: none;\n }\n\n &::part(thumb) {\n align-items: center;\n border: none;\n display: flex;\n justify-content: center;\n }\n\n &::part(thumb)::after {\n border-radius: 1px;\n content: '';\n height: 8px;\n transition: background-color var(--sl-transition-fast) ease-in-out;\n width: 2px;\n }\n\n @include switch-theme($color-gray-400, $color-white, transparent);\n}\n\n.c-switch--label-first {\n &::part(base) {\n flex-direction: row-reverse;\n gap: 12px;\n width: 100%;\n }\n\n &::part(label) {\n flex: 1;\n margin: 0;\n }\n}\n\n.c-switch--checked {\n @include switch-theme($color-green-400, $color-white, $color-green-400);\n}\n\n.c-switch--disabled {\n @include switch-theme($color-gray-200, $color-gray-200, transparent);\n\n // Override Shoelace's default `opacity: 0.5` on disabled switches.\n // Use explicit color tokens instead, consistent with CTextField/CTextArea/CSelect.\n &::part(base) {\n cursor: not-allowed;\n opacity: 1;\n }\n\n &::part(label) {\n color: $color-text-disabled;\n }\n}\n\n.c-switch--disabled.c-switch--checked {\n @include switch-theme($color-gray-200, $color-gray-200, $color-gray-300);\n}\n\n.c-switch__sr-label {\n @include sr-only;\n}\n</style>\n","<template>\n <CListItem>\n <CSwitch\n data-test=\"list-item-switch\"\n class=\"c-switch-list-item__switch\"\n :value=\"value\"\n :disabled=\"disabled\"\n @input=\"$emit('input', $event)\"\n >\n <div\n class=\"d-flex flex-row gap-3\"\n :class=\"{\n 'align-start': align === 'top',\n 'align-center': align !== 'top',\n }\"\n >\n <slot name=\"prepend\">\n <CListItemIcon v-if=\"icon || iconSlotHasContent\" :icon=\"icon\" :icon-color=\"iconColor\">\n <template #icon>\n <slot name=\"icon\" />\n </template>\n </CListItemIcon>\n </slot>\n\n <CListItemContent :title=\"title\" :label=\"label\">\n <template v-for=\"slotName of ['title', 'label', 'default']\" #[slotName]>\n <slot :name=\"slotName\" />\n </template>\n </CListItemContent>\n </div>\n </CSwitch>\n </CListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\nimport CListItem from '@propelinc/citrus-ui/src/components/CListItem.vue';\nimport CListItemContent from '@propelinc/citrus-ui/src/components/CListItemContent.vue';\nimport CListItemIcon from '@propelinc/citrus-ui/src/components/CListItemIcon.vue';\nimport CSwitch from '@propelinc/citrus-ui/src/components/CSwitch.vue';\n\nimport { useSlotHasContent } from '../composables/slots';\n\nwithDefaults(\n defineProps<{\n /** Alignment of the content */\n align?: 'top' | 'center';\n /** Prevents the user from interacting with the switch */\n disabled?: boolean;\n /** Font Awesome icon to render on the left side of the component */\n icon?: string | string[] | IconDefinition | null;\n /** Color of the icon background */\n iconColor?: string;\n /** Plain body copy. Overridden by the default slot. */\n label?: string;\n /** Emphasized text above body text. Overridden by the default slot. */\n title?: string;\n /** Whether the switch is in an \"on\" or \"off\" state */\n value?: boolean;\n }>(),\n {\n align: 'center',\n disabled: false,\n icon: null,\n iconColor: 'gray-100',\n label: undefined,\n title: undefined,\n value: false,\n }\n);\n\ndefineEmits<{\n (e: 'input', value: boolean): void;\n}>();\n\nconst iconSlotHasContent = useSlotHasContent('icon');\n</script>\n\n<style lang=\"scss\" scoped>\n.c-switch-list-item__switch {\n width: 100%;\n\n &::part(base) {\n align-items: center;\n display: inline-flex;\n\n // Using row-reverse allows us to move the slot content to the left\n // and the switch to the right\n flex-direction: row-reverse;\n gap: 12px;\n\n // The padding from CListItem is sufficient\n padding: 0;\n width: 100%;\n }\n\n &::part(label) {\n align-items: center;\n display: flex;\n flex: 1;\n gap: 12px;\n justify-content: space-between;\n\n // Removes the margin-inline-start supplied by the Shoelace styles\n margin: 0;\n }\n}\n</style>\n","<template>\n <div\n class=\"d-flex flex-column gap-1\"\n :class=\"{\n 'c-text-area--disabled': disabled,\n 'c-text-area--invalid': isInvalid,\n 'c-text-area--hide-label': hideLabel,\n }\"\n :data-test=\"dataTest\"\n >\n <label class=\"c-text-area__label\" :for=\"idWithFallback\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </label>\n\n <textarea\n :id=\"idWithFallback\"\n ref=\"textarea\"\n class=\"c-text-area__input\"\n rows=\"4\"\n :aria-label=\"label || undefined\"\n :aria-describedby=\"`${idWithFallback}-message ${idWithFallback}-validation-message`\"\n :aria-invalid=\"isInvalid ? 'true' : 'false'\"\n :data-test=\"`${dataTest}-textarea`\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxlength\"\n :required=\"required\"\n :value=\"internalValue\"\n @input=\"onInput\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n @change=\"$emit('change', internalValue)\"\n v-on=\"validationListeners\"\n />\n\n <CValidationMessage\n :data-test=\"`${dataTest}-validation-message`\"\n :validation-message=\"errorMessage || validationMessage\"\n :hide=\"hideDetails\"\n >\n <template #append>\n <CFormFieldCounter\n v-if=\"counter\"\n :data-test=\"`${dataTest}-counter`\"\n :counter=\"counter\"\n :counter-value=\"counterValue\"\n :value=\"internalValue\"\n />\n </template>\n </CValidationMessage>\n\n <div\n v-if=\"messageSlotHasContent\"\n :id=\"`${idWithFallback}-message`\"\n class=\"c-text-area__message\"\n :data-test=\"`${dataTest}-message`\"\n >\n <slot name=\"message\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, ref, toRefs } from 'vue';\n\nimport CFormFieldCounter from '@propelinc/citrus-ui/src/components/CFormFieldCounter.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n /** Shows a character counter and sets its denominator. */\n counter?: number | null;\n /**\n * Function or number that determines the numerator of the counter. If not\n * set, the counter will be the length of the input value.\n */\n counterValue?: number | (() => number | null) | null;\n /** Adds a custom data test string to the form field and textarea elements */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /**\n * Overrides the default validation message. If provided, this error message will always\n * be shown, regardless of any other failing validation rules.\n */\n errorMessage?: string | null;\n /** Hides the label and instead labels the field with `aria-label` */\n hideLabel?: boolean;\n /**\n * Hides the validation message area. Defaults to `false` (show message area even when valid),\n * so validations transition in gracefully.\n */\n hideDetails?: boolean | 'auto';\n /** The textarea element's id */\n id?: string | null;\n /** The textarea's label, both visual and screenreader-only */\n label?: string | null;\n /** Sets the maxlength attribute of the textarea */\n maxlength?: number;\n /** The textarea's placeholder */\n placeholder?: string;\n /** If true, the field is required */\n required?: boolean;\n /**\n * Accepts a mixed array of types function, boolean and string.\n * Functions pass an input value as an argument and must return either true / false or\n * a string containing an error message. The input field will enter an error state if a\n * function returns (or any value in the array contains) false or is a string\n */\n rules?: Rules<string>;\n /** The textarea's value */\n value?: string;\n }>(),\n {\n counter: null,\n counterValue: null,\n dataTest: 'text-area',\n disabled: false,\n errorMessage: null,\n hideDetails: false,\n hideLabel: false,\n id: null,\n label: null,\n maxlength: undefined,\n placeholder: '',\n required: false,\n rules: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n input: [value: string];\n change: [value: string];\n blur: [];\n focus: [];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, required, id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst internalValue = useInternalValue(value, {\n onChange: (value) => emit('input', value),\n});\n\nconst messageSlotHasContent = useSlotHasContent('message');\n\nconst textarea = ref<HTMLTextAreaElement | null>(null);\n\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n required,\n field: textarea,\n});\n\nconst isInvalid = computed(() => !isValidationValid.value || !!props.errorMessage);\n\nconst onInput = (event: Event): void => {\n const target = event.target as HTMLTextAreaElement;\n internalValue.value = target.value;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-text-area__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 4px;\n transition: color $citrus-field-transition-duration ease;\n\n .c-text-area--invalid & {\n color: $color-status-error;\n }\n\n .c-text-area--disabled & {\n color: $color-text-disabled;\n }\n\n .c-text-area--hide-label & {\n @include sr-only;\n }\n}\n\n.c-text-area__input {\n background-color: $color-white;\n border: $border-width solid $color-gray-200;\n border-radius: $border-radius-next;\n padding: 16px;\n resize: vertical;\n transition: border-color $citrus-field-transition-duration ease;\n\n &:focus,\n &:focus-within {\n border-color: $color-black;\n outline: none;\n }\n\n .c-text-area--invalid & {\n border-color: $color-status-error;\n color: $color-status-error;\n outline: none;\n }\n\n &:disabled {\n background-color: $color-gray-100;\n color: $color-text-disabled;\n }\n}\n\n.c-text-area__message {\n @include caption;\n\n color: $color-gray-500;\n margin-bottom: 16px;\n}\n</style>\n","<template>\n <a\n v-bind=\"$attrs\"\n :target=\"target\"\n :href=\"routerDestinationOrHref\"\n :tabindex=\"isRoleButton ? 0 : undefined\"\n :role=\"isRoleButton ? 'button' : undefined\"\n class=\"c-text-link\"\n :class=\"{ 'c-text-link--underline': underline }\"\n @click=\"navigate\"\n >\n <slot />\n </a>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether the text link functions as a router-link */\n to?: RouteLocationRaw;\n /** Designates the text link as an anchor and applies the href attribute */\n href?: string;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /** Toggles whether the link should have an underline */\n underline?: boolean;\n }>(),\n {\n to: undefined,\n href: undefined,\n target: undefined,\n underline: true,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst to = computed(() => props.to);\nconst { href: routerDestination, navigate } = useRouterLink(to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst isRoleButton = computed(() => {\n return !props.to && !props.href;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-text-link {\n color: $color-black;\n font-weight: $font-weight-semibold;\n\n &--underline {\n @include link-underline;\n }\n}\n</style>\n","<template>\n <div class=\"c-third-party-logo\" :style=\"{ '--size': SIZE_TO_VALUE[size] }\">\n <img\n v-if=\"imageState === 'loaded' || imageState === 'loading'\"\n class=\"c-third-party-logo__img transition-opacity\"\n :class=\"{ 'opacity-0': imageState === 'loading' }\"\n :src=\"src\"\n :alt=\"alt\"\n @error=\"handleImageError\"\n @load=\"handleImageLoad\"\n />\n <c-squared-icon\n class=\"transition-opacity\"\n :class=\"{ 'opacity-0': imageState === 'loaded' }\"\n :icon=\"icon\"\n :color=\"color\"\n :large=\"size === 'large'\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { ref } from 'vue';\n\nimport CSquaredIcon from '@propelinc/citrus-ui/src/components/CSquaredIcon.vue';\n\ntype Size = 'medium' | 'large';\n\ntype ImageState = 'loading' | 'loaded' | 'failed';\n\nconst SIZE_TO_VALUE: Record<Size, `${number}px`> = {\n medium: '40px',\n large: '56px',\n};\n\nwithDefaults(\n defineProps<{\n /** The alt text for the logo. */\n alt: string;\n /** The color of the fallback icon logo */\n color?: string;\n /** The Font Awesome icon to display as a fallback */\n icon?: string | string[] | IconDefinition | null;\n /** The size of the logo. Defaults to `medium`. */\n size?: Size;\n /** The URL of the logo image */\n src?: string;\n }>(),\n {\n color: 'gray-100',\n icon: null,\n size: 'medium',\n src: '',\n }\n);\n\nconst imageState = ref<ImageState>('loading');\n\nconst handleImageError = (): void => {\n imageState.value = 'failed';\n};\n\nconst handleImageLoad = (): void => {\n imageState.value = 'loaded';\n};\n</script>\n\n<style scoped>\n.c-third-party-logo {\n border-radius: 8px;\n height: var(--size);\n isolation: isolate;\n object-fit: contain;\n overflow: hidden;\n position: relative;\n width: var(--size);\n}\n\n.c-third-party-logo__img {\n display: block;\n height: 100%;\n left: 0;\n object-fit: contain;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 1;\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.transition-opacity {\n transition: opacity 0.1s ease-in-out;\n}\n</style>\n","<template>\n <time v-bind=\"$attrs\" :datetime=\"isoString\">{{ timeago }}</time>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n datetime: string | number | Date;\n converter: (datetime: string | number | Date, locale: string, count?: number) => string;\n locale?: string;\n autoUpdate?: number | false;\n }>(),\n {\n locale: 'en',\n autoUpdate: 60,\n }\n);\n\n// NOTE(ram): Used to trigger reactivity in the computed property for auto updates.\nconst counter = ref(0);\nlet timer: number | null = null;\n\nconst isoString = computed((): string => new Date(props.datetime).toISOString());\nconst timeago = computed((): string =>\n props.converter(props.datetime, props.locale, counter.value)\n);\n\nconst startAutoUpdate = (): void => {\n if (props.autoUpdate) {\n // TODO(ram): This is a workaround to make sure the timer is of type number.\n // The type of setInterval is NodeJS.Timeout in Node.js and number in the browser.\n // This is causing issues in apps/healthcare-app.\n timer = setInterval(() => counter.value++, props.autoUpdate * 1000) as unknown as number;\n }\n};\n\nconst stopAutoUpdate = (): void => {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n};\n\nwatch(\n () => props.autoUpdate,\n (value: number | false) => {\n stopAutoUpdate();\n if (value) {\n startAutoUpdate();\n }\n }\n);\n\nonMounted(() => {\n startAutoUpdate();\n});\n\nonBeforeUnmount(() => {\n stopAutoUpdate();\n});\n</script>\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-alert\n ref=\"alert\"\n class=\"c-toast\"\n :data-test=\"dataTest\"\n :data-open=\"isOpen || undefined\"\n :data-variant=\"computedVariant\"\n :class=\"`c-toast--${computedVariant}`\"\n :duration=\"duration\"\n :style=\"{ '--toast-base-transform': transform }\"\n @sl-hide=\"onHide\"\n @sl-after-hide=\"resetAnimation\"\n >\n <div class=\"flex-grow-1 d-flex flex-row align-center gap-4\">\n <slot name=\"icon\">\n <FontAwesomeIcon data-test=\"toast-icon\" fixed-width class=\"c-toast__icon\" :icon=\"icon\" />\n </slot>\n\n <div class=\"c-toast__message flex-grow-1\" data-test=\"toast-message\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <CIconButton\n data-test=\"toast-dismiss\"\n variant=\"tertiary\"\n :aria-label=\"$t('Close')\"\n :icon=\"faXmark\"\n @click=\"close\"\n />\n </sl-alert>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n faCircleCheck,\n faCircleExclamation,\n faInfoCircle,\n faXmark,\n} from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/alert/alert.js';\nimport type SlAlert from '@shoelace-style/shoelace/dist/components/alert/alert.js';\nimport type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry';\nimport type { VNode } from 'vue';\nimport { computed, onBeforeUnmount, ref, watchEffect } from 'vue';\n\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useShoelaceShadowParts } from '@propelinc/citrus-ui/src/composables/elements';\nimport { useDragListener } from '@propelinc/citrus-ui/src/composables/gestures';\nimport { slideLeft, slideRight } from '@propelinc/citrus-ui/src/services/animation';\nimport type { ToastVariant } from '@propelinc/citrus-ui/src/types';\n\n/** Default duration for the toast to be visible. */\nconst DEFAULT_DURATION = 5000;\n/** The minimum distance, in pixels, the user has to drag left or right for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_DISTANCE = 150;\n/** The minimum speed, in pixels per millisecond, the user has to swipe for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_VELOCITY = 0.75;\n\nconst props = withDefaults(\n defineProps<{\n /** The data-test attribute for the toast. */\n dataTest?: string;\n /** Controls (overrides) whether the toast is dismissible. */\n dismissible?: boolean | undefined;\n /**\n * @deprecated use `variant` prop instead\n * Renders the error state\n */\n error?: boolean;\n /** The message rendered in the toast, using the default slot overrides this value */\n message?: string;\n /**\n * @deprecated use `variant` prop instead\n * Renders the success state\n */\n success?: boolean;\n /** Show/hides the toast */\n value?: boolean;\n /** The variant of the toast */\n variant?: ToastVariant;\n /**\n * @deprecated use `variant` prop instead\n * Renders the warning state\n */\n warning?: boolean;\n }>(),\n {\n dataTest: 'toast',\n dismissible: undefined,\n error: false,\n message: '',\n success: false,\n variant: 'info',\n value: false,\n warning: false,\n }\n);\n\nconst emit = defineEmits<{\n hide: [];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n icon?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst alert = ref<SlAlert | null>(null);\nconst isOpen = ref(props.value);\n\n/**\n * Handle merging the deprecated `error`, `success`, and `warning` props\n * with the `variant` prop.\n */\nconst computedVariant = computed(() => {\n if (props.error) {\n return 'error';\n } else if (props.success) {\n return 'success';\n } else if (props.warning) {\n return 'warning';\n }\n return props.variant;\n});\n\nconst show = async (): Promise<void> => {\n isOpen.value = true;\n alert.value?.toast();\n};\n\nconst onHide = (): void => {\n isOpen.value = false;\n emit('input', false);\n emit('hide');\n};\n\nconst close = async (): Promise<void> => {\n alert.value?.hide();\n};\n\n// If our value changes, show or hide the toast respectively\nwatchEffect(() => (props.value ? show() : close()));\n\n// Close the toast when the component is unmounted\nonBeforeUnmount(() => close());\n\nconst shouldAutoDismiss = computed(() => {\n if (props.dismissible !== undefined) {\n return !props.dismissible;\n }\n return computedVariant.value === 'success';\n});\n\nconst duration = computed(() => {\n return shouldAutoDismiss.value ? DEFAULT_DURATION : Infinity;\n});\n\nconst icon = computed(() => {\n if (computedVariant.value === 'error') {\n return faCircleExclamation;\n } else if (computedVariant.value === 'success') {\n return faCircleCheck;\n } else {\n return faInfoCircle;\n }\n});\n\nconst alertHideAnimation = ref<ElementAnimation | 'default'>('default');\nuseShoelaceAnimation(alert, 'alert.hide', alertHideAnimation);\n\nconst resetAnimation = (): void => {\n alertHideAnimation.value = 'default';\n};\n\nconst { base } = useShoelaceShadowParts(alert, ['base']);\nconst { dragDistance } = useDragListener(base, {\n onDragEnd: async ({ distance, velocity }) => {\n const absoluteDistance = Math.abs(distance.x);\n const absoluteVelocity = Math.abs(velocity.x);\n const shouldDismiss =\n absoluteDistance > MIN_SWIPE_DISTANCE || absoluteVelocity > MIN_SWIPE_VELOCITY;\n const dismissStart = absoluteDistance / base.value!.clientWidth;\n if (shouldDismiss) {\n const remainingDismissDistance = Math.max(base.value!.clientWidth - absoluteDistance, 0);\n const dismissDuration =\n remainingDismissDistance / Math.max(absoluteVelocity, MIN_SWIPE_VELOCITY);\n const slideDirection = velocity.x > 0 ? slideRight : slideLeft;\n alertHideAnimation.value = slideDirection({\n start: dismissStart,\n duration: dismissDuration,\n end: 1.1,\n });\n close();\n } else {\n const slideDirection = velocity.x > 0 ? slideRight : slideLeft;\n const slideBack = slideDirection({ start: dismissStart, end: 0 });\n base.value?.animate(slideBack.keyframes, slideBack.options);\n }\n },\n});\n\nconst transform = computed(() => {\n return `translateX(${dragDistance.value?.x ?? 0}px)`;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-toast {\n margin: 16px;\n\n &::part(base) {\n background-color: $color-blue-200;\n border: none;\n border-radius: $border-radius-next;\n box-shadow: $box-shadow-toast;\n color: $color-black;\n transform: var(--toast-base-transform);\n }\n\n &::part(message) {\n @include body;\n\n align-items: center;\n display: flex;\n padding: 16px 0 16px 16px;\n }\n\n &::part(icon) {\n padding-left: 12px;\n }\n}\n\n.c-toast--error::part(base) {\n background-color: $color-red-200;\n}\n\n.c-toast--success::part(base) {\n background-color: $color-green-200;\n}\n\n.c-toast--warning::part(base) {\n background-color: $color-gold-200;\n}\n\n.c-toast__message {\n flex: auto;\n}\n\n.c-toast__icon {\n color: $color-black;\n font-size: $font-size-icon-medium;\n}\n</style>\n","import { type Ref, inject, provide, ref } from 'vue';\n\nimport type { ToastVariant } from '../types';\n\n// NOTE(slanden): Cannot use a symbol here because it may break the inject/provide chain across MFEs\nconst GlobalToast = 'GLOBAL_TOAST';\n\nexport interface Toast {\n id: number;\n dataTest?: string;\n message: string;\n variant: ToastVariant;\n}\n\ninterface ToastInjection {\n dismissToast: (id: Toast['id']) => void;\n showToast: (toast: Omit<Toast, 'id'>) => void;\n toasts: Ref<Toast[]>;\n}\n\nlet id = 0;\n\nfunction getNextIdDefault(): number {\n return id++;\n}\n\n/**\n * Custom provider for our toasts. Enables us to declaratively manage toasts in event handlers.\n *\n * NOTE: injecting `getNextId` allows us to test the composable without worry of side effects\n */\nexport function useToastProvider(getNextId: () => number = getNextIdDefault): ToastInjection {\n const toasts = ref<Toast[]>([]);\n\n function showToast(newToast: Omit<Toast, 'id'>): Toast['id'] {\n const toastId = getNextId();\n\n toasts.value.push({ ...newToast, id: toastId });\n\n return toastId;\n }\n\n function dismissToast(id: Toast['id']): void {\n toasts.value = toasts.value.filter((toast) => toast.id !== id);\n }\n\n const context: ToastInjection = {\n dismissToast,\n showToast,\n toasts,\n };\n\n provide(GlobalToast, context);\n\n return context;\n}\n\nexport function useToast(): ToastInjection {\n return inject<ToastInjection>(GlobalToast, {\n dismissToast: () => {},\n showToast: () => {},\n toasts: ref<Toast[]>([]),\n });\n}\n","<template>\n <CToast\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :value=\"true\"\n :data-test=\"toast.dataTest || 'c-toast'\"\n :message=\"toast.message\"\n :variant=\"toast.variant\"\n @hide=\"dismissToast(toast.id)\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport CToast from '@propelinc/citrus-ui/src/components/CToast.vue';\n\nimport { useToast } from '../composables/toast';\n\nconst { toasts, dismissToast } = useToast();\n</script>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :data-test=\"dataTest\"\n :value=\"value\"\n name=\"zip\"\n :label=\"label || $t('ZIP Code')\"\n mask=\"#####\"\n :placeholder=\"placeholder || '12345'\"\n :minlength=\"5\"\n :maxlength=\"5\"\n type=\"tel\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n :rules=\"computedRules\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n placeholder?: string | null;\n rules?: Rules<string>;\n value?: string;\n }>(),\n {\n dataTest: 'zipcode-field',\n id: undefined,\n label: null,\n placeholder: null,\n rules: (): Rules<string> => [],\n value: '',\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = [\n minLengthRule(5, t('Please enter a valid {inputLabel}', { inputLabel: t('ZIP Code') })),\n];\nconst computedRules = computed(() => [...defaultRules, ...props.rules]);\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","import type { App, DefineComponent, Plugin } from 'vue';\n\nimport * as Components from '@propelinc/citrus-ui/src/components';\nimport { scrollIntoView, tapAnimation } from '@propelinc/citrus-ui/src/services/directives';\n\nconst plugin: Plugin = {\n install(app: App): void {\n Object.entries(Components).forEach(([name, component]): void => {\n app.component(name, component as DefineComponent);\n });\n\n // TODO: this has to be passed to the vue() plugin for Vite instead\n app.config.compilerOptions.isCustomElement = (tag): boolean => tag.startsWith('sl-');\n\n app.directive('scroll-into-view', scrollIntoView);\n app.directive('tap-animation', tapAnimation);\n },\n};\n\nexport default plugin;\n","import Colors from '@propelinc/citrus-ui/src/colors/colors';\n\ntype Theme = Record<string, string>;\n\nconst CitrusTheme = Object.entries(Colors).reduce<Theme>((theme, [colorName, hex]) => {\n const kebabCaseName = colorName.toLowerCase().replace(/_/g, '-');\n theme[kebabCaseName] = hex;\n return theme;\n}, {});\n\nexport default CitrusTheme;\n","import { faCircle, faSquare, faXmark } from '@fortawesome/pro-light-svg-icons';\nimport { faCircleDot, faSquareCheck } from '@fortawesome/pro-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nconst Icons = {\n citrusCheckboxOn: {\n component: FontAwesomeIcon,\n props: { icon: faSquareCheck },\n },\n citrusCheckboxOff: {\n component: FontAwesomeIcon,\n props: { icon: faSquare },\n },\n citrusRadioOn: {\n component: FontAwesomeIcon,\n props: { icon: faCircleDot },\n },\n citrusRadioOff: {\n component: FontAwesomeIcon,\n props: { icon: faCircle },\n },\n citrusClear: {\n component: FontAwesomeIcon,\n props: { icon: faXmark },\n },\n} as const;\n\nexport default Icons;\n","export interface SplitInputField {\n characters: number;\n placeholder?: string;\n separator?: string;\n}\n\nexport type SplitInputRule = (v: string) => string | boolean;\n\nexport enum InputVariants {\n DEFAULT = 'default',\n CONTAINED = 'contained',\n SEGMENTED = 'segmented',\n}\n\nexport type NotificationVariant = 'info' | 'success' | 'error' | 'warning';\n\nexport type ToastVariant = 'info' | 'success' | 'error' | 'warning';\n"],"names":["FLUID","ON_TOGGLE","props","__props","emit","__emit","fluid","toRefs","provide","accordion","ref","nextTick","openItems","acc","item","index","_createElementBlock","_renderSlot","_ctx","useShoelaceAnimation","el","animationName","animation","defaultAnimation","onMounted","getAnimation","animationValue","unref","setAnimation","isRef","watch","nextAnimation","TAP_ANIMATION_DURATION_MS","useTapAnimation","keyframes","downAnimation","upAnimation","onPointerDown","_a","_b","onPointerUp","useInternalValue","value","options","internalValue","newInternalValue","details","injectedFluid","inject","injectedOrPropFluid","computed","valueRef","injectedToggleItem","onChange","_normalizeClass","_unref","_createVNode","FontAwesomeIcon","faChevronDown","_createElementVNode","_hoisted_2","_hoisted_3","BLACK","GRAY_100","GRAY_200","GRAY_300","GRAY_400","GRAY_500","GREEN_500","GOLD_500","RED_500","Colors","isHexColor","color","isRgbaColor","isCssColor","isColorKey","_createBlock","_Transition","useCssColor","name","normalizedColor","toValue","normalizedName","cssColor","isValidColor","SIZE_TO_FONT_SIZE","SIZE_TO_TRACK_WIDTH","computedColor","computedTrackColor","computedSize","indicatorColorCode","trackColorCode","accessibleText","$t","_normalizeStyle","TERTIARY","INHERIT_COLOR","TERTIARY_ICON_BUTTON","INHERIT_COLOR_ICON_BUTTON","initialBackgroundColor","bgCssColor","calculatedTextColor","g","b","hex","fullHex","match","ra","ga","ba","a","userTextCssColor","textCssColor","fixed","border","CFadeTransition","loading","CLoader","loaderAccessibleText","title","_hoisted_4","_toDisplayString","_openBlock","_hoisted_5","_hoisted_6","backgroundCssColor","computedStyle","style","dataTest","textColor","text","BLOCK","LARGE","BOUNCE_AMOUNT","large","toRef","_resolveDynamicComponent","tag","getViewport","scrollToElement","element","rect","windowHeight","appHeight","estimatedHeaderHeight","estimatedFooterHeight","_c","_d","contentStartY","contentEndY","isObscuredByHeader","isObscuredByFooter","scrollIntoView","inputEl","debounce","DEFAULT_BOUNCE_AMOUNT","setupTapAnimation","bounceAmount","animationListeners","event","handler","tapAnimation","binding","onClick","disabled","faXmark","useResizeObserver","callback","observer","onBeforeUnmount","useShoelaceShadowParts","shoelaceComponent","parts","shadowParts","part","shadowRoot","useDragListener","startDragTouch","lastDragTouch","dragVelocity","dragDistance","simplifyEvent","x","y","touchStartListener","touchMoveListener","newEvent","timeDelta","touchEndListener","addListeners","removeListeners","newElement","oldElement","useScrollBoundary","isScrolling","onScroll","onTouchEvent","onTouchEnd","useElasticClamp","resistance","min","max","absValue","isVisible","vnode","Comment","Fragment","children","child","useSlotHasContent","key","slots","useSlots","slot","DEFAULT_DURATION","DEFAULT_EASING","fadeIn","start","duration","easing","fadeOut","slideUp","slideDown","slideRight","end","slideLeft","MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","MIN_DISMISS_VELOCITY","MIN_DISMISS_DURATION","DRAG_CLAMP_DISTANCE","SHEET_HEIGHT_FALLBACK","setCustomAnimation","mounted","animatedValue","sheet","panel","overlayPart","bodyPart","handleDismiss","onRequestClose","onAfterClose","getTransformDistanceRatio","distance","velocity","remainingDismissDistance","dismissDuration","dismissStart","slideUpAnimation","fadeInAnimation","transformDistance","transformDistanceRatio","panelTransform","overlayOpacity","result","getDataTestAttr","suffix","footerHasContent","isDismissVisible","overlay","hideTitle","fixedSize","ariaLabel","contained","divided","$emit","CCloseButton","disableDismiss","CButtonStack","useLinkAttrs","href","useRouterLink","to","toWithDefault","useLinkResult","useLink","_navigate","_href","isRouterLink","error","BLOCK_BOUNCE_AMOUNT","BASE_BOUNCE_AMOUNT","VARIANT_TO_SHOELACE_VARIANT","routerDestination","navigate","routerDestinationOrHref","dataLoading","injectedBlock","injectedOrPropBlock","dataBlock","iconSlotHasContent","hasIcon","computedVariant","shoelaceVariant","injectedLarge","injectedOrPropsLarge","button","injectedBounceAmount","_mergeProps","iconPosition","level","target","_toHandlers","_cache","$event","icon","_hoisted_1","attrs","useAttrs","borderCssColor","routingVariant","config","tile","borderless","stretch","CCardHeader","appendSlotHasContent","isHidden","validationMessage","idCounter","useId","id","VALIDATIONS","useValidationRuleCheck","rules","required","active","message","valid","isEmpty","v","requiredRule","val","rulesResult","allRules","rule","passesRules","validate","useFormValidationSupport","state","formValidations","useValidations","validateOn","onValidationResultChange","startValidating","clearValidations","onInput","onBlur","newValue","oldValue","idWithFallback","checkbox","isValidationValid","validationListeners","variant","faCheck","label","CValidationMessage","hideDetails","cols","vertical","numerator","displayText","useA11yLabelCheck","componentName","injectedTertiary","injectedOrPropTertiary","inheritColor","CButton","ariaLabelledby","spinIcon","useTranslation","currentInstance","getCurrentInstance","t","isFocused","inputHidden","inputType","hideToggleAriaLabel","inputValue","input","isInvalid","prefixSlotHasContent","suffixSlotHasContent","messageSlotHasContent","toggleHidden","onFocus","clearInput","focus","blur","__expose","fallthroughAttrs","_","__","rest","rootStyles","hideLabel","size","$attrs","clearable","hideable","placeholder","minlength","maxlength","inputmode","CIconButton","faEye","faEyeSlash","errorMessage","counter","CFormFieldCounter","counterValue","toNumber","parsed","useInputMask","maskOptions","onMaska","onMaskaArray","detail","maskInput","newInput","MaskInput","mask","Mask","maskedValue","useMaskedMinLength","maskTokens","findMaskedMinLength","maskArray","char","minlengthValue","m","useMaskedMaxLength","maxlengthValue","textField","inputMask","unmaskedValue","maskedMinLength","maskedMaxLength","unmaskedRules","CTextField","unmaskRules","parseDateFromString","dateString","date","calculateAge","dob","today","age","monthDiff","createMinLengthValidator","minLength","ruleFromValidator","validator","minLengthRule","isValidDateInAgeRange","minAge","maxAge","dobDate","isValidEmail","email","parseDate","year","month","day","formattedDate","lastEmittedValue","emitIsoDate","defaultLabel","defaultPlaceholder","inputLabel","defaultRules","createMinLengthRule","maxAgeRule","validDateRule","dayjs","computedLabel","computedPlaceholder","computedRules","dateLength","CMaskedTextField","select","_Fragment","_renderList","items","localMonth","localDay","localYear","hasError","messages","localValue","monthRules","dayRules","yearRules","monthOptions","i","dayOptions","daysInMonth","currentYear","yearOptions","localRules","validation","validationResult","emitDate","CSelect","ANIMATIONS_DISABLED","injectedDisabled","isDisabled","content","height","entry","hasValue","onFileChange","files","prompt","multiple","file","footer","footerElement","form","inputs","filteredInputs","inputArray","getInvalidInputs","newInvalidInputs","oldInvalidInputs","newValid","oldValid","invalidInputs","firstInvalidField","scrollIntoViewIfNeeded","_withModifiers","titleSlotHasContent","labelSlotHasContent","FontAwesomeIconComponent","useWhiteIcon","CSquaredIcon","iconColor","isLink","isButton","isTappable","tagAttrs","actionSlotHasContent","renderActionSlot","allAttrs","mergeProps","align","CListItemIcon","CListItemContent","slotName","actionIcon","faChevronRight","propelIcon","propelLockup","src","e","checkable","checked","selectable","checkType","CCheckbox","modal","enableExpandTransition","loadingMessage","dialogLabel","fullscreen","CExpandTransition","_hoisted_7","_hoisted_8","dismissible","CModal","hasButton","farXmark","titleIcon","buttonLoading","buttonTo","buttonHref","buttonTarget","buttonText","useFocusableField","field","SELECTED_VALUE","TOGGLE_VALUE","ROLE","injectedRole","injectedSelectedValue","toggleValue","toggleVariant","isSelected","ariaChecked","role","nextValue","$slots","option","CPill","_createTextVNode","popup","handleMouseLeave","handleOutsideClick","watchEffect","onUnmounted","rounded","indeterminate","trackCssColor","percentage","valueMax","trackWidth","RADIO_STATE","parentState","hideRadio","mandatory","radioGroup","column","fullWidth","dense","noGutters","alignContent","justify","CSkeleton","LINE_TYPE_TO_CLASS","lineTypeClass","rows","direction","amount","type","autocomplete","fourDigitRule","fullSsnRule","fourDigitSsn","faLock","hasCount","displayCount","bordered","labelFirst","CListItem","CSwitch","textarea","isRoleButton","underline","args","SIZE_TO_VALUE","imageState","handleImageError","handleImageLoad","alt","timer","isoString","timeago","startAutoUpdate","stopAutoUpdate","alert","isOpen","show","onHide","close","shouldAutoDismiss","faCircleExclamation","faCircleCheck","faInfoCircle","alertHideAnimation","resetAnimation","base","absoluteDistance","absoluteVelocity","shouldDismiss","slideDirection","slideBack","transform","GlobalToast","useToast","toasts","dismissToast","toast","CToast","plugin","app","Components","component","CitrusTheme","theme","colorName","kebabCaseName","Icons","faSquareCheck","faSquare","faCircleDot","faCircle","InputVariants"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/services/injections/accordions.ts","../src/components/CAccordion.vue","../src/composables/animation.ts","../src/composables/binding.ts","../src/components/CAccordionItem.vue","../src/colors/colors.ts","../src/components/CFadeTransition.vue","../src/composables/colors.ts","../src/components/CLoader.vue","../src/services/injections/icon-buttons.ts","../src/components/CAppBar.vue","../src/components/CBadge.vue","../src/services/injections/buttons.ts","../src/components/CButtonStack.vue","../src/services/directives/scroll-into-view.ts","../src/services/directives/tap-animation.ts","../src/components/internal/CCloseButton.vue","../src/composables/elements.ts","../src/composables/gestures.ts","../src/composables/slots.ts","../src/services/animation.ts","../src/components/CBottomSheet.vue","../src/composables/router.ts","../src/components/CButton/CButton.vue","../src/components/CCardHeader.vue","../src/components/CCard.vue","../src/components/CCardFooter.vue","../src/components/CCardSection.vue","../src/components/CValidationMessage.vue","../src/composables/id.ts","../src/services/injections/forms.ts","../src/composables/validations.ts","../src/components/CCheckbox.vue","../src/components/CDivider.vue","../src/components/CFormFieldCounter.vue","../src/composables/accessibility.ts","../src/components/CIconButton.vue","../src/composables/i18n.ts","../src/components/CTextField.vue","../src/composables/input-mask.ts","../src/components/CMaskedTextField.vue","../../shared-utils/src/dates.ts","../../shared-utils/src/validators.ts","../src/components/CDobField.vue","../src/components/CSelect.vue","../src/components/CDobSelect.vue","../src/components/CEmailField.vue","../src/services/injections/animations.ts","../src/components/CExpandTransition.vue","../src/components/CFileInput.vue","../src/components/CFixedPageFooter.vue","../src/components/CForm.vue","../src/components/CLabel.vue","../src/components/CListItemContent.vue","../src/components/CSquaredIcon.vue","../src/components/CListItemIcon.vue","../src/components/CListItem.vue","../src/assets/logos/propel/icon.svg","../src/assets/logos/propel/lockup.svg","../src/components/CLogo.vue","../src/components/CMenu.vue","../src/components/CMenuItem.vue","../src/components/CMenuLabel.vue","../src/components/CModal.vue","../src/components/CModalLoading.vue","../src/components/CNotification.vue","../src/composables/fields.ts","../src/components/CPhoneField.vue","../src/services/injections/pills.ts","../src/components/CPill.vue","../src/components/CPillGroup.vue","../src/components/CPopup.vue","../src/components/CProgressLinear.vue","../src/components/CProgressRing.vue","../src/services/injections/radio.ts","../src/components/CRadio.vue","../src/components/CRadioGroup.vue","../src/components/CRebrand.vue","../src/components/CSafeArea.vue","../src/components/CSectionHeader.vue","../src/components/CSkeleton.vue","../src/components/CSkeletonLoaderCard.vue","../src/components/CSkeletonLoaderCircle.vue","../src/components/CSkeletonLoaderText.vue","../src/components/CSlideFadeTransition.vue","../src/components/CSplitInput.vue","../src/components/CSsnField.vue","../src/components/CStatusDot.vue","../src/components/CSwitch.vue","../src/components/CSwitchListItem.vue","../src/components/CTextArea.vue","../src/components/CTextLink.vue","../src/components/CThirdPartyLogo.vue","../src/components/CTimeago.vue","../src/components/CToast.vue","../src/composables/toast.ts","../src/components/CToastsList.vue","../src/components/CZipcodeField.vue","../src/plugin.ts","../src/colors/theme.ts","../src/theme/icons.ts","../src/types.ts"],"sourcesContent":["import type { InjectionKey, Ref } from 'vue';\n\nexport const FLUID = Symbol('fluid') as InjectionKey<Ref<boolean>>;\nexport const ON_TOGGLE = Symbol('on-toggle') as InjectionKey<() => void>;\n","<template>\n <div ref=\"accordion\" data-test=\"accordion\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type SlDetails from '@shoelace-style/shoelace/dist/components/details/details';\nimport type { VNode } from 'vue';\nimport { nextTick, provide, ref, toRefs } from 'vue';\n\nimport { FLUID, ON_TOGGLE } from '@propelinc/citrus-ui/src/services/injections/accordions';\n\nconst props = withDefaults(\n defineProps<{\n /** Removes horizontal padding for all items inside */\n fluid?: boolean;\n }>(),\n {\n fluid: false,\n }\n);\n\nconst emit = defineEmits<{\n change: [openItems: number[]];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { fluid } = toRefs(props);\nprovide(FLUID, fluid);\n\nconst accordion = ref<HTMLDivElement | null>(null);\nprovide(ON_TOGGLE, async () => {\n await nextTick();\n const accordionItems: SlDetails[] = Array.from(\n accordion.value!.querySelectorAll('[data-accordion-item]')\n );\n const openItems = accordionItems.reduce<number[]>((acc, item, index) => {\n return item.hasAttribute('open') ? [...acc, index] : acc;\n }, []);\n emit('change', openItems);\n});\n</script>\n","import type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport {\n getAnimation,\n setAnimation,\n} from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport type { Ref } from 'vue';\nimport { isRef, onMounted, ref, unref, watch } from 'vue';\n\ntype MaybeRef<T> = T | Ref<T>;\n\nexport function useShoelaceAnimation(\n el: Ref<Element | null>,\n animationName: string,\n animation: MaybeRef<ElementAnimation | 'default' | null>\n): void {\n let defaultAnimation: ElementAnimation | null = null;\n\n onMounted(() => {\n if (el.value) {\n defaultAnimation = getAnimation(el.value, animationName, { dir: 'ltr' });\n\n const animationValue = unref(animation);\n if (animationValue !== 'default') {\n setAnimation(el.value, animationName, animationValue);\n }\n }\n });\n\n if (isRef(animation)) {\n watch(animation, () => {\n if (el.value) {\n const nextAnimation = animation.value === 'default' ? defaultAnimation : animation.value;\n setAnimation(el.value, animationName, nextAnimation);\n }\n });\n }\n}\n\nconst TAP_ANIMATION_DURATION_MS = 100;\n\nexport function useTapAnimation({\n el,\n keyframes,\n}: {\n el: Ref<Element | null>;\n keyframes: { default: Keyframe; pressed: Keyframe };\n}): Record<string, () => void> {\n const downAnimation = ref<Animation | null>(null);\n const upAnimation = ref<Animation | null>(null);\n\n function onPointerDown(): void {\n if (!el.value) {\n return;\n }\n\n upAnimation.value?.cancel();\n upAnimation.value = null;\n\n downAnimation.value?.cancel();\n downAnimation.value = el.value.animate([keyframes.default, keyframes.pressed], {\n duration: TAP_ANIMATION_DURATION_MS,\n fill: 'forwards',\n });\n }\n\n async function onPointerUp(): Promise<void> {\n if (!downAnimation.value || upAnimation.value || !el.value) {\n return;\n }\n\n // NOTE(mohan): Cancelling the animation will cause the finished promise to\n // throw an error.\n await downAnimation.value.finished.catch(() => {});\n if (!el.value) {\n // NOTE(slanden): This can happen if the element is removed from the DOM\n // while the down animation is running.\n return;\n }\n upAnimation.value = el.value.animate([keyframes.pressed, keyframes.default], {\n duration: TAP_ANIMATION_DURATION_MS,\n fill: 'forwards',\n });\n\n await upAnimation.value.finished.catch(() => {});\n upAnimation.value = null;\n downAnimation.value = null;\n }\n\n return {\n pointerdown: onPointerDown,\n pointerup: onPointerUp,\n pointerleave: onPointerUp,\n pointercancel: onPointerUp,\n };\n}\n","import type { Ref } from 'vue';\nimport { ref, watch } from 'vue';\n\n/**\n * A composable that creates a ref that tracks the value of the provided ref.\n *\n * Whenever the provided ref changes, the returned ref updates, but not the\n * other way around. When the returned ref changes, the `onChange` callback is\n * called (if provided).\n *\n * Useful for components that need to respond both to user input and to\n * programmatic changes.\n *\n * @param value - The value to bind to the internal value.\n * @param options.onChange - A callback function that is called when the\n * internal value changes.\n * @returns A ref to the internal value.\n */\nexport function useInternalValue<T>(\n value: Ref<T>,\n options: { onChange?: (value: T) => void } = {}\n): Ref<T> {\n const internalValue = ref(value.value) as Ref<T>;\n watch(value, (value) => {\n internalValue.value = value;\n });\n watch(internalValue, (newInternalValue) => {\n if (newInternalValue !== value.value) {\n options.onChange?.(newInternalValue);\n }\n });\n\n return internalValue;\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-details\n ref=\"details\"\n data-test=\"accordion-item\"\n data-accordion-item\n class=\"c-accordion-item\"\n :class=\"{ 'c-accordion-item--fluid': injectedOrPropFluid }\"\n :open=\"internalValue || undefined\"\n @sl-show=\"onChange(true)\"\n @sl-hide.stop=\"onChange(false)\"\n >\n <FontAwesomeIcon slot=\"expand-icon\" :icon=\"faChevronDown\" />\n <FontAwesomeIcon slot=\"collapse-icon\" :icon=\"faChevronDown\" />\n <div slot=\"summary\" class=\"c-accordion-item__header\" data-test=\"accordion-item-header\">\n <slot name=\"header\" />\n </div>\n <div data-test=\"accordion-item-content\" class=\"c-accordion-item__content\">\n <slot />\n </div>\n </sl-details>\n</template>\n\n<script setup lang=\"ts\">\nimport { faChevronDown } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/details/details';\nimport type SlDetails from '@shoelace-style/shoelace/dist/components/details/details';\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\n\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { FLUID, ON_TOGGLE } from '@propelinc/citrus-ui/src/services/injections/accordions';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether the item is open */\n value?: boolean;\n /** Removes horizontal padding from the content */\n fluid?: boolean | null;\n }>(),\n {\n value: false,\n fluid: null,\n }\n);\n\nconst emit = defineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n header?: () => VNode[];\n}>();\n\nconst details = ref<SlDetails | null>(null);\nuseShoelaceAnimation(details, 'details.show', {\n keyframes: [{ height: '0' }, { height: 'auto' }],\n options: { duration: 200, easing: 'ease' },\n});\nuseShoelaceAnimation(details, 'details.hide', {\n keyframes: [{ height: 'auto' }, { height: '0' }],\n options: { duration: 200, easing: 'ease' },\n});\n\nconst injectedFluid = inject(FLUID, ref(false));\nconst injectedOrPropFluid = computed(() => {\n return props.fluid !== null ? props.fluid : (injectedFluid.value ?? false);\n});\n\nconst valueRef = computed(() => props.value);\nconst internalValue = useInternalValue(valueRef, { onChange: (value) => emit('input', value) });\n\nconst injectedToggleItem = inject(ON_TOGGLE, undefined);\nconst onChange = (value: boolean): void => {\n internalValue.value = value;\n injectedToggleItem?.();\n emit('input', value);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-accordion-item {\n &::part(base) {\n background: transparent;\n border: none;\n }\n\n &::part(header) {\n padding: 16px;\n }\n\n &::part(summary) {\n @include subheadline;\n\n padding-right: 16px;\n }\n\n &::part(summary-icon) {\n rotate: 0;\n transition-duration: 200ms;\n }\n\n &[open]::part(summary-icon) {\n rotate: 180deg;\n }\n\n &::part(content) {\n padding: 0 16px 16px;\n }\n\n & + & {\n border-top: $border;\n }\n}\n\n.c-accordion-item--fluid {\n &::part(content) {\n padding: 0;\n }\n}\n\n.c-accordion-item__header {\n width: 100%;\n}\n\n.c-accordion-item__content {\n box-sizing: border-box;\n}\n</style>\n","// NOTE(ej): This file is a manual copy of /styles/colors.scss\n// These files should be kept in sync.\n// NOTE(cshdllr): The navy colors are still here for backwards compatibility.\n\nexport type HexColor = `#${string}`;\nexport type RgbaColor = `rgba(${number}, ${number}, ${number}, ${number})`;\n\n/**\n * CSS color value from the palette (hex or rgba). Use this type when a value\n * may be either format, e.g. gray colors are rgba, others are hex.\n */\nexport type CssColor = HexColor | RgbaColor;\n\nconst BLACK = '#000000';\nconst GRAY_100 = 'rgba(0, 0, 0, 0.04)';\nconst GRAY_200 = 'rgba(0, 0, 0, 0.1)';\nconst GRAY_300 = 'rgba(0, 0, 0, 0.31)';\nconst GRAY_400 = 'rgba(0, 0, 0, 0.48)';\nconst GRAY_500 = 'rgba(0, 0, 0, 0.69)';\nconst GREEN_500 = '#1f7400';\nconst GOLD_500 = '#f47500';\nconst RED_500 = '#cd000c';\n\n/**\n * Maps a color name to its corresponding CSS color (hex or rgba).\n * Gray neutrals use rgba for transparency; other colors use hex.\n *\n * NOTE: Please write hex codes in lowercase letters\n */\nconst Colors: Record<string, CssColor> = {\n ACCENT_BLUE: '#5560cb',\n ACCENT_BLUE_SHADE_1: '#404898',\n ACCENT_BLUE_SHADE_2: '#2f3570',\n ACCENT_GREEN: '#49a24c',\n ACCENT_GREEN_SHADE_1: '#3a823d',\n ACCENT_GREEN_SHADE_2: '#17551a',\n ACCENT_ORANGE: '#ffa895',\n ACCENT_ORANGE_SHADE_1: '#e15c1b',\n ACCENT_ORANGE_SHADE_2: '#a9440b',\n ACCENT_PINK: '#d75fae',\n ACCENT_PINK_SHADE_1: '#7c3872',\n ACCENT_PINK_SHADE_2: '#56204e',\n ACCENT_RED_SHADE_1: '#981d31',\n ACCENT_RED_SHADE_2: '#701323',\n ALERT_RED: '#c34459',\n BACKGROUND: GRAY_100,\n BLACK,\n GRAY_100,\n GRAY_200,\n GRAY_300,\n GRAY_400,\n GRAY_500,\n // NOTE(slanden, Seth): Transparency does not work or make sense in all contexts, (e.g. the in-app\n // browser cannot handle transparency in rgba colors). These provide hex the equivalent of each\n // gray over a white background.\n GRAY_100_HEX: '#f5f5f5',\n GRAY_200_HEX: '#e6e6e6',\n GRAY_300_HEX: '#b0b0b0',\n GRAY_400_HEX: '#858585',\n GRAY_500_HEX: '#4f4f4f',\n NAVY: BLACK,\n NAVY_TINT_1: GRAY_500,\n NAVY_TINT_2: GRAY_400,\n NAVY_TINT_3: GRAY_300,\n NAVY_TINT_4: GRAY_200,\n NAVY_TINT_5: GRAY_100,\n NEUTRAL: GRAY_100,\n NEUTRAL_SHADE: GRAY_200,\n NEUTRAL_SHADE_2: '#707070',\n ORANGE: '#ffa895',\n ORANGE_TINT_1: '#fdcab7',\n ORANGE_TINT_2: '#ffdbce',\n PINK: '#f6a0d1',\n PINK_TINT_1: '#fdc3e4',\n PINK_TINT_2: '#ffdef1',\n PROVIDERS_BLUE: '#a3b0f9',\n PROVIDERS_BLUE_TINT_1: '#d1d7fc',\n PROVIDERS_BLUE_TINT_2: '#e8ebfd',\n PROVIDERS_GREEN: '#49a24c',\n PROVIDERS_GREEN_TINT_1: '#b3f6a2',\n PROVIDERS_GREEN_TINT_2: '#d1fac7',\n TEXT_PRIMARY: BLACK,\n TEXT_SECONDARY: GRAY_500,\n TEXT_PLACEHOLDER: GRAY_400,\n TEXT_DISABLED: GRAY_300,\n WHITE: '#ffffff',\n YELLOW: '#ffc200',\n YELLOW_100: '#ffdc6b',\n YELLOW_TINT_1: '#ffdc6b',\n YELLOW_TINT_2: '#fee69a',\n BLUE_50: '#f0f6ff',\n BLUE_100: '#e0edff',\n BLUE_200: '#b2cffa',\n BLUE_300: '#7a95f8',\n BLUE_400: '#496ae0',\n BLUE_500: '#1a43d7',\n BORDER: GRAY_200,\n BUTTON_BACKGROUND: BLACK,\n GOLD_500,\n GOLD_400: '#f99500',\n GOLD_300: '#ffc120',\n GOLD_200: '#fcde74',\n GOLD_100: '#fff0ba',\n GREEN_500,\n GREEN_400: '#3fa41c',\n GREEN_300: '#8bc95a',\n GREEN_200: '#b8da96',\n GREEN_100: '#dcf2cb',\n PURPLE_500: '#6431d0',\n PURPLE_400: '#804fe8',\n PURPLE_300: '#ac8eff',\n PURPLE_200: '#cdbcff',\n PURPLE_100: '#ebe4ff',\n RED_500,\n RED_400: '#f52323',\n RED_300: '#ff6969',\n RED_200: '#ffaaa5',\n RED_100: '#ffe5dd',\n STATUS_SUCCESS: GREEN_500,\n STATUS_WARNING: GOLD_500,\n STATUS_ERROR: RED_500,\n};\n\nexport default Colors;\n\n/**\n * This is a type predicate that will allow TypeScript to know that the string tested is a\n * HexColor within the scope of the narrowing.\n */\nexport function isHexColor(color?: string): color is HexColor {\n if (!color) {\n return false;\n }\n\n return /^#([0-9A-Fa-f]{3}){1,2}$/i.test(color);\n}\n\nexport function isRgbaColor(color?: string): color is RgbaColor {\n if (!color) {\n return false;\n }\n\n // Alpha may be integer 0–255 or decimal 0–1 (e.g. 0.04, 0.69)\n return /^rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\)$/i.test(color);\n}\n\nexport function isCssColor(color?: string): color is CssColor {\n return isHexColor(color) || isRgbaColor(color);\n}\n\n/**\n * This is a type predicate that will allow TypeScript to know that the string tested is a\n * key of the Colors object.\n */\nexport function isColorKey(color?: string): color is keyof typeof Colors {\n if (!color) {\n return false;\n }\n\n return Object.keys(Colors).includes(color);\n}\n\n/**\n * Converts a palette hex color to an rgba string with the given alpha (0–1).\n *\n * Usage: `withAlpha(Colors.BLUE_200, 0.5)` → `'rgba(178, 207, 250, 0.5)'`\n */\nexport function withAlpha(color: CssColor, alpha: number): RgbaColor {\n if (isRgbaColor(color)) {\n return color;\n }\n const hex = color.substring(1);\n const fullHex = hex.length === 3 ? hex.replace(/(.)/g, '$1$1') : hex;\n const r = parseInt(fullHex.substring(0, 2), 16);\n const g = parseInt(fullHex.substring(2, 4), 16);\n const b = parseInt(fullHex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/**\n * Returns true if the color is an rgba string whose RGB components correspond\n * to a palette hex entry. Use this to validate transparent variants of palette\n * colors produced by `withAlpha`.\n */\nexport function isPaletteRgba(color?: string): color is RgbaColor {\n if (!isRgbaColor(color)) {\n return false;\n }\n const match = color.match(\n /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*[\\d.]+\\s*\\)$/i\n );\n if (!match) {\n return false;\n }\n const hex = ('#' +\n [match[1], match[2], match[3]]\n .map((n) => parseInt(n).toString(16).padStart(2, '0'))\n .join('')) as HexColor;\n return Object.values(Colors).includes(hex);\n}\n\n/**\n * Validates a string as either a hex color or a color key.\n */\nexport function isValidColor(value: string): boolean {\n if (value === 'default') {\n return true;\n }\n\n if (isHexColor(value)) {\n return true;\n }\n\n if (isPaletteRgba(value)) {\n return true;\n }\n\n // Normalize any strings to SCREAMING_CASE\n const normalizedKey = value.toUpperCase().replace(/-/g, '_');\n\n return isColorKey(normalizedKey);\n}\n","<template>\n <Transition mode=\"out-in\" name=\"fade\">\n <slot />\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\ndefineSlots<{ default: () => VNode[] }>();\n</script>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 300ms ease-out;\n}\n\n.fade-enter,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","import type { MaybeRefOrGetter, Ref } from 'vue';\nimport { computed, toValue } from 'vue';\n\nimport Colors, {\n type CssColor,\n type RgbaColor,\n isColorKey,\n isCssColor,\n isPaletteRgba,\n} from '@propelinc/citrus-ui/src/colors/colors';\n\n/**\n * Maps from a color name or hex code to its corresponding CSS color value.\n * Gray neutrals resolve to rgba(); other palette colors are hex.\n * Can also accept a palette color converted to rgba for transparency via `withAlpha`.\n *\n * @param name - The color to resolve. Can be in kebab case, SCREAMING_SNAKE_CASE, or a hex code from the palette.\n * @returns The CSS color value (hex or rgba) and whether the color is valid.\n */\nexport function usePaletteColor(name: MaybeRefOrGetter<string | undefined>): {\n cssColor: Ref<CssColor | undefined>;\n isPaletteColor: Ref<boolean>;\n} {\n const normalizedColor = computed(() =>\n isCssColor(toValue(name)) ? (toValue(name)?.toLowerCase() as CssColor) : undefined\n );\n const normalizedName = computed(() => {\n if (!toValue(name)) {\n return undefined;\n }\n\n // If it is a CSS color already, we don't need to know its name\n if (isCssColor(toValue(name))) {\n return undefined;\n }\n\n return toValue(name)?.replace(/-/g, '_').toUpperCase();\n });\n\n const cssColor = computed(() => {\n // If we're given a color key, return the palette value (hex or rgba)\n if (normalizedName.value && isColorKey(normalizedName.value)) {\n return Colors[normalizedName.value];\n }\n\n // If we're given a CSS color AND it's in the palette, return it\n if (\n isCssColor(normalizedColor.value) &&\n Object.values(Colors).includes(normalizedColor.value)\n ) {\n return normalizedColor.value;\n }\n\n // If we're given a palette rgba (transparent variant via withAlpha), return it as-is\n if (isPaletteRgba(toValue(name))) {\n return toValue(name) as RgbaColor;\n }\n\n return undefined;\n });\n\n const isPaletteColor = computed(() => {\n return cssColor.value !== undefined;\n });\n\n return { cssColor, isPaletteColor };\n}\n","<template>\n <span\n :aria-label=\"accessibleText || $t('Loading...')\"\n class=\"c-loader\"\n :data-size=\"computedSize\"\n data-test=\"loader\"\n role=\"progressbar\"\n :style=\"{\n '--indicator-color': indicatorColorCode,\n '--loader-size': SIZE_TO_FONT_SIZE[computedSize],\n '--track-color': trackColorCode,\n '--track-width': SIZE_TO_TRACK_WIDTH[computedSize],\n }\"\n >\n <svg class=\"c-loader__svg\">\n <circle class=\"c-loader__track\" />\n <circle class=\"c-loader__indicator\" />\n </svg>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport Colors from '@propelinc/citrus-ui/src/colors/colors';\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\n\ntype Size = 'sm' | 'md' | 'lg';\n\nconst SIZE_TO_FONT_SIZE: Record<Size, `${number}px`> = {\n sm: '20px',\n md: '26px',\n lg: '32px',\n};\n\nconst SIZE_TO_TRACK_WIDTH: Record<Size, `${number}px`> = {\n sm: '2.5px',\n md: '3px',\n lg: '3px',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Sets the color of the indicator of the loader */\n color?: HexColor | keyof typeof Colors;\n /** @deprecated Shows a smaller version of the loading icon */\n small?: boolean;\n /** Sets the size of the loader */\n size?: Size;\n /** Sets the color of the track of the loader */\n trackColor?: HexColor | keyof typeof Colors;\n }>(),\n {\n accessibleText: undefined,\n color: 'default',\n small: false,\n size: 'lg',\n trackColor: 'default',\n }\n);\n\nconst computedColor = computed(() => {\n return props.color === 'default' ? 'black' : props.color;\n});\n\nconst computedTrackColor = computed(() => {\n // If _any_ trackColor is provided, use that\n if (props.trackColor !== 'default') {\n return props.trackColor;\n }\n\n // trackColor is 'default', determine which default color it should use\n if (props.color === 'white' || props.color === Colors.WHITE) {\n return 'gray-500';\n }\n\n return 'gray-200';\n});\n\nconst computedSize = computed((): Size => {\n if (props.small) {\n return 'sm';\n }\n return props.size;\n});\n\nconst { cssColor: indicatorColorCode } = usePaletteColor(computedColor);\nconst { cssColor: trackColorCode } = usePaletteColor(computedTrackColor);\n</script>\n\n<style lang=\"scss\" scoped>\n.c-loader {\n display: inline-flex;\n font-size: var(--loader-size);\n height: 1em;\n width: 1em;\n\n &__svg {\n flex: 1 1 auto;\n height: 100%;\n overflow: visible;\n width: 100%;\n }\n\n &__indicator,\n &__track {\n cx: 0.5em;\n cy: 0.5em;\n fill: none;\n r: calc(0.5em - var(--track-width) / 2);\n stroke-width: var(--track-width);\n }\n\n &__indicator {\n animation: spin 2000ms linear infinite;\n stroke: var(--indicator-color);\n stroke-dasharray: 150% 75%;\n stroke-linecap: round;\n transform-origin: 50% 50%;\n }\n\n &__track {\n stroke: var(--track-color);\n transform-origin: 0% 0%;\n }\n\n @keyframes spin {\n 0% {\n stroke-dasharray: 0.05em 3em;\n transform: rotate(0deg);\n }\n\n 50% {\n stroke-dasharray: 1.375em 1.375em;\n transform: rotate(450deg);\n }\n\n 100% {\n stroke-dasharray: 0.05em 3em;\n transform: rotate(1080deg);\n }\n }\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const TERTIARY = Symbol('tertiary') as InjectionKey<Ref<boolean>>;\nexport const INHERIT_COLOR = Symbol('inherit-color') as InjectionKey<Ref<boolean>>;\n","<template>\n <header\n data-test=\"app-bar\"\n class=\"c-app-bar\"\n :class=\"{\n 'c-app-bar--fixed': fixed,\n 'c-app-bar--border': border,\n }\"\n :style=\"{\n '--c-app-bar-background-color': bgCssColor,\n '--c-app-bar-color': textCssColor,\n }\"\n :data-background-color=\"bgCssColor\"\n :data-color=\"textCssColor\"\n >\n <div class=\"c-app-bar__left\" data-test=\"app-bar-left\">\n <slot name=\"left\" />\n </div>\n\n <div data-test=\"app-bar-title\" class=\"c-app-bar__title\">\n <CFadeTransition>\n <CLoader\n v-if=\"loading\"\n key=\"loader\"\n data-test=\"app-bar-loader\"\n class=\"c-app-bar__loader\"\n small\n :color=\"textCssColor\"\n :accessible-text=\"loaderAccessibleText\"\n />\n <h1\n v-else-if=\"!loading && title\"\n key=\"title\"\n class=\"c-app-bar__title-content\"\n data-test=\"app-bar-title-text\"\n >\n {{ title }}\n </h1>\n <div v-else key=\"slot\" class=\"c-app-bar__title-content\">\n <slot name=\"title\" />\n </div>\n </CFadeTransition>\n </div>\n\n <div class=\"c-app-bar__right\" data-test=\"app-bar-right\">\n <slot name=\"right\" />\n </div>\n </header>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref } from 'vue';\n\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport Colors, { isHexColor, isRgbaColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport CFadeTransition from '@propelinc/citrus-ui/src/components/CFadeTransition.vue';\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport {\n INHERIT_COLOR as INHERIT_COLOR_ICON_BUTTON,\n TERTIARY as TERTIARY_ICON_BUTTON,\n} from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Used to set the background color of the app bar. Needs to accept either a hex code or a\n * a valid color key from the Colors object.\n */\n backgroundColor?: HexColor | keyof typeof Colors;\n /** If true, the app bar will have a bottom border. */\n border?: boolean;\n /**\n * Used to set the text color of the app bar. Needs to accept either a hex code or a\n * a valid color key from the Colors object.\n * If unset, defaults to either white or black based on the background color's luminance.\n */\n color?: HexColor | keyof typeof Colors;\n /** If true, the app bar will be fixed to the top of the viewport. */\n fixed?: boolean;\n /** Adds screen reader only text alternative to loading icon, text should be translated */\n loaderAccessibleText?: string;\n /** Shows a loading spinner. Overrides the title slot. */\n loading?: boolean;\n /**\n * Shows text in the center of the component. Typically used for page names.\n * Overrides the title slot.\n */\n title?: string;\n }>(),\n {\n backgroundColor: 'default',\n border: false,\n color: undefined,\n fixed: false,\n loaderAccessibleText: '',\n loading: false,\n title: '',\n }\n);\n\ndefineSlots<{\n left?: () => VNode[];\n title?: () => VNode[];\n right?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\nprovide(INHERIT_COLOR_ICON_BUTTON, ref(true));\n\nconst initialBackgroundColor = computed(() => {\n if (props.backgroundColor === 'default') {\n return Colors.WHITE;\n }\n\n return props.backgroundColor;\n});\n\nconst { cssColor: bgCssColor } = usePaletteColor(initialBackgroundColor);\n\n/**\n * This text color is computed based on the background color's luminance.\n * Dark backgrounds get white text, light backgrounds get black text.\n * Supports both hex and rgba (e.g. gray palette); rgba is composited over white for luminance.\n *\n * This is overridden by the `color` prop.\n */\nconst calculatedTextColor = computed(() => {\n const color = bgCssColor.value;\n if (!color) {\n return Colors.BLACK;\n }\n\n let r: number;\n let g: number;\n let b: number;\n\n if (isHexColor(color)) {\n const hex = color.substring(1);\n const fullHex = hex.length === 3 ? hex.replace(/(.)/g, '$1$1') : hex;\n r = parseInt(fullHex.substring(0, 2), 16) / 255;\n g = parseInt(fullHex.substring(2, 4), 16) / 255;\n b = parseInt(fullHex.substring(4, 6), 16) / 255;\n } else if (isRgbaColor(color)) {\n const match = color.match(\n /^rgba\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*([\\d.]+)\\s*\\)$/i\n );\n if (!match) {\n return Colors.BLACK;\n }\n const ra = Number(match[1]) / 255;\n const ga = Number(match[2]) / 255;\n const ba = Number(match[3]) / 255;\n const a = Number(match[4]);\n // Composite over white to get effective RGB for luminance\n r = ra * a + (1 - a);\n g = ga * a + (1 - a);\n b = ba * a + (1 - a);\n } else {\n return Colors.BLACK;\n }\n\n // Calculate relative luminance using sRGB coefficients\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n // Use white text if background is dark enough (luminance < 0.5)\n return luminance < 0.5 ? Colors.WHITE : Colors.BLACK;\n});\n\nconst { cssColor: userTextCssColor } = usePaletteColor(() => props.color);\n\nconst textCssColor = computed(() => {\n if (userTextCssColor.value) {\n return userTextCssColor.value;\n }\n\n return calculatedTextColor.value;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/typography';\n\n@mixin app-bar-button-container {\n align-items: center;\n display: flex;\n flex: none;\n min-width: $button-size-medium;\n}\n\n.c-app-bar {\n align-items: center;\n background-color: var(--c-app-bar-background-color);\n color: var(--c-app-bar-color);\n display: flex;\n gap: 8px;\n height: $app-bar-height;\n padding: 0 8px;\n}\n\n.c-app-bar--fixed {\n left: 0;\n position: fixed;\n right: 0;\n top: env(safe-area-inset-top);\n z-index: 5;\n}\n\n.c-app-bar--border {\n border-bottom: $border;\n}\n\n.c-app-bar__left {\n @include app-bar-button-container;\n\n justify-content: flex-start;\n}\n\n.c-app-bar__right {\n @include app-bar-button-container;\n\n justify-content: flex-end;\n}\n\n.c-app-bar__title {\n @include subheadline;\n\n flex: auto;\n overflow: hidden;\n text-align: center;\n}\n\n.c-app-bar__loader {\n // Vertically center the loader\n transform: translateY(3px);\n}\n\n.c-app-bar__title-content {\n @include subheadline;\n @include text-overflow-ellipsis;\n}\n</style>\n","<template>\n <span\n class=\"c-badge\"\n :data-test=\"dataTest\"\n :data-color=\"color\"\n :data-text-color=\"textColor\"\n :style=\"computedStyle\"\n >\n <slot>\n {{ text }}\n </slot>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\n\nconst props = withDefaults(\n defineProps<{\n /** Adds a unique data-test attribute for testing to the container */\n dataTest?: string;\n /** Sets the background color */\n color?: string;\n /** Sets the text of the badge, can also use default slot */\n text?: string;\n /** Sets the text color */\n textColor?: string;\n }>(),\n {\n color: 'purple-200',\n dataTest: 'badge',\n textColor: 'text-primary',\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { cssColor: backgroundCssColor } = usePaletteColor(() => props.color);\nconst { cssColor: textCssColor } = usePaletteColor(() => props.textColor);\n\nconst computedStyle = computed(() => {\n const style: Record<string, string> = {};\n\n if (backgroundCssColor.value) {\n style['--c-badge-background-color'] = backgroundCssColor.value;\n }\n\n if (textCssColor.value) {\n style['--c-badge-text-color'] = textCssColor.value;\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-badge {\n --height: 24px;\n\n @include eyebrow;\n\n background-color: var(--c-badge-background-color);\n border: none;\n border-radius: 4px;\n color: var(--c-badge-text-color);\n display: inline-block;\n height: var(--height);\n\n // Override the line-height of the eyebrow mixin so the text is vertically centered\n line-height: var(--height);\n padding-inline: 12px;\n white-space: nowrap;\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const BLOCK = Symbol('block') as InjectionKey<Ref<boolean>>;\nexport const LARGE = Symbol('large') as InjectionKey<Ref<boolean | null>>;\nexport const BOUNCE_AMOUNT = Symbol('bounce-amount') as InjectionKey<number>;\n","<template>\n <component :is=\"tag\" class=\"c-button-stack\" data-test=\"c-button-stack\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { Ref, VNode } from 'vue';\nimport { provide, ref, toRef } from 'vue';\n\nimport { BLOCK, LARGE } from '@propelinc/citrus-ui/src/services/injections/buttons';\n\nconst props = withDefaults(\n defineProps<{\n tag?: string;\n large?: boolean | null;\n }>(),\n {\n tag: 'div',\n large: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst large = toRef(props, 'large') as Ref<boolean | null>;\n\nprovide(BLOCK, ref(true));\nprovide(LARGE, large);\n</script>\n\n<style scoped>\n/**\n * FIXME: https://linear.app/slanden/issue/FE-37/remove-exported-margins\n * These are exported margins, would be preferable to use a Flex column with gap instead\n */\n:deep() {\n .c-button + .c-button {\n margin-top: 8px;\n }\n}\n</style>\n","import type { DebouncedFunc } from 'lodash';\nimport { debounce } from 'lodash';\nimport type { Directive } from 'vue';\n\ninterface ScrollIntoViewElement extends HTMLElement {\n scrollDirective?: {\n focusable: HTMLInputElement | HTMLTextAreaElement;\n scrollIfNeeded: DebouncedFunc<() => void>;\n focusListener: () => void;\n blurListener: () => void;\n };\n}\n\n// NOTE(mohan): This is to support browsers without visualViewport.\nconst getViewport = (): Window | VisualViewport => window.visualViewport ?? window;\n\nconst scrollToElement = (element: Element): void => {\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n\n // Check if element is obscured by header or footer\n const appHeight = document.getElementById('app')?.clientHeight;\n const estimatedHeaderHeight =\n document.getElementsByClassName('app-bar c-app-bar')[0]?.clientHeight || 64;\n const estimatedFooterHeight =\n document.getElementsByClassName('c-fixed-page-footer')[0]?.clientHeight ||\n document.getElementsByClassName('scrollable-footer')[0]?.clientHeight ||\n 0;\n const contentStartY = appHeight\n ? windowHeight - (appHeight - estimatedHeaderHeight)\n : estimatedHeaderHeight;\n const contentEndY = windowHeight - estimatedFooterHeight;\n\n const isObscuredByHeader = rect.top < contentStartY;\n const isObscuredByFooter = rect.bottom > contentEndY;\n\n if (isObscuredByHeader || isObscuredByFooter) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n};\n\n/**\n * This directive scrolls the element into view when the input inside it is focused.\n *\n * It also listens for viewport size changes, so it can scroll again if the keyboard pops up.\n */\nexport const scrollIntoView: Directive = {\n beforeMount(el: ScrollIntoViewElement): void {\n const inputEl = el.querySelector('input,textarea');\n if (!inputEl) {\n return;\n }\n\n el.scrollDirective = {\n focusable: inputEl as HTMLInputElement | HTMLTextAreaElement,\n scrollIfNeeded: debounce((): void => {\n scrollToElement(el);\n }, 300),\n focusListener: (): void => {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded();\n // When focused, we track the viewport size, so we can scroll again if the keyboard pops up.\n getViewport().addEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n blurListener: (): void => {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded.cancel();\n getViewport().removeEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n };\n\n inputEl.addEventListener('focus', el.scrollDirective!.focusListener);\n inputEl.addEventListener('blur', el.scrollDirective!.blurListener);\n },\n\n unmounted(el: ScrollIntoViewElement): void {\n if (el.scrollDirective) {\n el.scrollDirective.scrollIfNeeded.cancel();\n el.scrollDirective.focusable.removeEventListener('focus', el.scrollDirective.focusListener);\n el.scrollDirective.focusable.removeEventListener('blur', el.scrollDirective.blurListener);\n getViewport().removeEventListener('resize', el.scrollDirective.scrollIfNeeded);\n }\n },\n};\n","import { ref } from 'vue';\nimport type { Directive, DirectiveBinding } from 'vue';\n\nimport { useTapAnimation } from '../../composables/animation';\n\ninterface TapAnimationValue {\n bounceAmount?: number;\n}\n\ninterface TapAnimationElement extends HTMLElement {\n __tapAnimationCleanup?: () => void;\n}\n\nconst DEFAULT_BOUNCE_AMOUNT = 0.94;\n\nfunction setupTapAnimation(el: HTMLElement, bounceAmount: number): void {\n const animationListeners = useTapAnimation({\n el: ref(el),\n keyframes: {\n default: { transform: 'scale(1)' },\n pressed: { transform: `scale(${bounceAmount})` },\n },\n });\n\n // Add event listeners\n Object.entries(animationListeners).forEach(([event, handler]) => {\n el.addEventListener(event, handler);\n });\n\n // The cleanup function is essential here to ensure that all event listeners added by the directive are removed\n // when the directive is unbound. Without this cleanup, the event listeners would remain attached to the element,\n // potentially causing memory leaks and unexpected behavior. This function is called in the 'unbind' hook to properly\n // clean up the element.\n (el as TapAnimationElement).__tapAnimationCleanup = (): void => {\n Object.entries(animationListeners).forEach(([event, handler]) => {\n el.removeEventListener(event, handler);\n });\n };\n}\n\nexport const tapAnimation: Directive<HTMLElement, TapAnimationValue> = {\n beforeMount(el: HTMLElement, binding: DirectiveBinding<TapAnimationValue>): void {\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n return;\n }\n\n const bounceAmount = binding.value?.bounceAmount ?? DEFAULT_BOUNCE_AMOUNT;\n setupTapAnimation(el, bounceAmount);\n },\n\n updated(el: HTMLElement, binding: DirectiveBinding<TapAnimationValue>): void {\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n return;\n }\n\n // If bounce amount changes, we need to re-mount the directive\n if (binding.value?.bounceAmount !== binding.oldValue?.bounceAmount) {\n (el as TapAnimationElement).__tapAnimationCleanup?.();\n const bounceAmount = binding.value?.bounceAmount ?? DEFAULT_BOUNCE_AMOUNT;\n setupTapAnimation(el, bounceAmount);\n }\n },\n\n unmounted(el: HTMLElement): void {\n (el as TapAnimationElement).__tapAnimationCleanup?.();\n },\n};\n","<template>\n <button\n v-tap-animation\n class=\"c-close-button\"\n data-test=\"c-close-button\"\n :aria-label=\"$t('Close')\"\n :disabled=\"disabled\"\n @click=\"onClick\"\n >\n <font-awesome-icon :icon=\"faXmark\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { faXmark } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nimport { tapAnimation as vTapAnimation } from '@propelinc/citrus-ui/src/services/directives';\n\ndefineProps<{\n disabled?: boolean;\n}>();\n\nconst emit = defineEmits(['click', 'focus', 'blur']);\n\nconst onClick = (): void => {\n emit('click');\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-close-button {\n align-items: center;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n font-size: $font-size-icon-medium;\n height: 36px;\n justify-content: center;\n padding: 8px;\n width: 36px;\n\n @include button-theme-close;\n\n &:focus {\n /**\n * This is a workaround to get the focus ring to work with the button. Since we're not using Shoelace,\n * we need to use the focus ring styles from Shoelace. Long term, we should create a custom focus ring styles.\n */\n outline: var(--sl-focus-ring-width) solid var(--sl-focus-ring-color);\n outline-offset: var(--sl-focus-ring-offset);\n }\n}\n</style>\n","import type { Ref } from 'vue';\nimport { onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\n// NOTE(mohan): A simplified port of vueuse/core's useResizeObserver.\n// vueuse has type errors because our version of vue is so old.\nexport function useResizeObserver(\n element: Ref<HTMLElement | null | undefined>,\n callback: (entries: ResizeObserverEntry[]) => void\n): void {\n if (!('ResizeObserver' in window)) {\n return;\n }\n\n let observer: ResizeObserver | null = null;\n\n watch(\n element,\n (value) => {\n if (value) {\n observer = new ResizeObserver(callback);\n observer.observe(value);\n }\n },\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n });\n}\n\nexport function useShoelaceShadowParts<T extends string>(\n shoelaceComponent: Ref<HTMLElement | null>,\n parts: T[]\n): Record<T, Ref<HTMLElement | null>> {\n const shadowParts = parts.reduce<Record<T, Ref<HTMLElement | null>>>(\n (acc, part) => {\n return { ...acc, [part]: ref<HTMLElement | null>(null) };\n },\n {} as Record<T, Ref<HTMLElement | null>>\n );\n\n onMounted(async () => {\n if (!shoelaceComponent.value) {\n return;\n }\n\n try {\n await customElements.whenDefined(shoelaceComponent.value.tagName.toLowerCase());\n } catch {\n // TODO: (kyleshevlin) we had to stub out Shoelace component in tests, which causes this to fail\n // because there is no tagName for the stubbed component\n // Silently handle error\n return;\n }\n\n // Make sure the component hasn't been destroyed at this point.\n const shadowRoot = shoelaceComponent.value?.shadowRoot;\n if (!shadowRoot) {\n return;\n }\n\n for (const part of parts) {\n shadowParts[part].value = shadowRoot.querySelector(`[part=\"${part}\"]`);\n }\n });\n\n return shadowParts;\n}\n","import type { Ref } from 'vue';\nimport { computed, onMounted, ref, watch } from 'vue';\n\nexport interface Coordinate {\n x: number;\n y: number;\n}\n\ninterface SimplifiedPointerEvent {\n position: Coordinate;\n timestamp: number;\n}\n\ntype DragCallback = (dragDetails: {\n /** How far the user has dragged in pixels */\n distance: Coordinate;\n /** Velocity of drag in pixels/ms */\n velocity: Coordinate;\n}) => void;\n\n/**\n * Listens for drag events on the provided element and tracks the distance and\n * velocity of the drag.\n *\n * @param element - The element to listen for drag events on.\n * @param options.onDragEnd - A callback that is called when the drag ends.\n * @returns An object containing the drag distance and velocity.\n */\nexport const useDragListener = (\n element: Ref<HTMLElement | null>,\n options?: {\n onDragEnd?: DragCallback;\n }\n): {\n dragDistance: Ref<Coordinate | null>;\n dragVelocity: Ref<Coordinate | null>;\n} => {\n const startDragTouch = ref<SimplifiedPointerEvent | null>(null);\n const lastDragTouch = ref<SimplifiedPointerEvent | null>(null);\n\n const dragVelocity = ref<Coordinate | null>(null);\n const dragDistance = computed(() => {\n if (!startDragTouch.value || !lastDragTouch.value) {\n return { x: 0, y: 0 };\n }\n return {\n x: lastDragTouch.value.position.x - startDragTouch.value.position.x,\n y: lastDragTouch.value.position.y - startDragTouch.value.position.y,\n };\n });\n\n const simplifyEvent = (event: TouchEvent): SimplifiedPointerEvent => {\n const { clientX: x, clientY: y } = event.touches[0];\n return { position: { x, y }, timestamp: event.timeStamp };\n };\n\n const touchStartListener = (event: TouchEvent): void => {\n startDragTouch.value = simplifyEvent(event);\n lastDragTouch.value = startDragTouch.value;\n };\n\n const touchMoveListener = (event: TouchEvent): void => {\n const newEvent = simplifyEvent(event);\n if (lastDragTouch.value) {\n const timeDelta = newEvent.timestamp - lastDragTouch.value.timestamp;\n dragVelocity.value = {\n x: (newEvent.position.x - lastDragTouch.value.position.x) / timeDelta,\n y: (newEvent.position.y - lastDragTouch.value.position.y) / timeDelta,\n };\n }\n lastDragTouch.value = newEvent;\n };\n\n const touchEndListener = (): void => {\n options?.onDragEnd?.({\n distance: dragDistance.value,\n velocity: dragVelocity.value ?? { x: 0, y: 0 },\n });\n startDragTouch.value = null;\n lastDragTouch.value = null;\n dragVelocity.value = null;\n };\n\n const addListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.addEventListener('touchstart', touchStartListener);\n element.addEventListener('touchmove', touchMoveListener);\n element.addEventListener('touchend', touchEndListener);\n }\n };\n\n const removeListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.removeEventListener('touchstart', touchStartListener);\n element.removeEventListener('touchmove', touchMoveListener);\n element.removeEventListener('touchend', touchEndListener);\n }\n };\n\n onMounted(async () => {\n addListeners(element.value);\n });\n\n watch(element, (newElement, oldElement) => {\n removeListeners(oldElement);\n addListeners(newElement);\n });\n\n return { dragDistance, dragVelocity };\n};\n\n/**\n * Adds listeners to the provided element to prevent it from emitting touch\n * events when it is scrolling.\n *\n * @param element - A scrollable element inside a draggable component.\n */\nexport const useScrollBoundary = (element: Ref<HTMLElement | null>): void => {\n const isScrolling = ref(false);\n const onScroll = (): void => {\n isScrolling.value = true;\n };\n\n const onTouchEvent = (event: TouchEvent): void => {\n if (isScrolling.value) {\n event.stopPropagation();\n }\n };\n const onTouchEnd = (event: TouchEvent): void => {\n onTouchEvent(event);\n isScrolling.value = false;\n };\n\n const addListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.addEventListener('scroll', onScroll);\n element.addEventListener('touchstart', onTouchEvent);\n element.addEventListener('touchmove', onTouchEvent);\n element.addEventListener('touchend', onTouchEnd);\n }\n };\n\n const removeListeners = (element: HTMLElement | null): void => {\n if (element) {\n element.removeEventListener('scroll', onScroll);\n element.removeEventListener('touchstart', onTouchEvent);\n element.removeEventListener('touchmove', onTouchEvent);\n element.removeEventListener('touchend', onTouchEnd);\n }\n };\n\n onMounted(() => {\n addListeners(element.value);\n });\n\n watch(element, (newElement, oldElement) => {\n removeListeners(oldElement);\n addListeners(newElement);\n });\n};\n\n/**\n * Clamps a value in between the provided min and max values. As the value\n * increases above 0, it will approach the max, but will never reach it (and\n * vice versa for the min).\n *\n * This can be used to create a \"springy\" effect where as a user pulls further\n * on an element, it will move less and less.\n *\n * @param value - The value to clamp.\n * @param options.min - The minimum value to keep the value above.\n * @param options.max - The maximum value to keep the value below.\n * @param options.resistance - The resistance value which determines how quickly\n * the value approaches the min or max.\n * @returns The clamped value.\n */\nexport const useElasticClamp = (\n value: Ref<number | null>,\n options?: Ref<{ min?: number; max?: number; resistance?: number }>\n): Ref<number> => {\n return computed(() => {\n if (value.value === null) {\n return 0;\n }\n\n const resistance = options?.value?.resistance ?? 7;\n const { min, max } = options?.value ?? {};\n const absValue = Math.abs(value.value);\n if (min && value.value < 0) {\n return (min * absValue) / (absValue - min * resistance);\n } else if (max && value.value > 0) {\n return (max * absValue) / (absValue + max * resistance);\n } else {\n return value.value;\n }\n });\n};\n","import type { Ref, VNode } from 'vue';\nimport { Comment, Fragment, computed, useSlots } from 'vue';\n\n/**\n * Recursively checks if a VNode or its children are visible.\n */\nfunction isVisible(vnode: VNode): boolean {\n if (vnode.type === Comment) {\n return false;\n }\n\n // Handle fragments and templates recursively\n if (vnode.type === Fragment || vnode.type === 'template') {\n const children = vnode.children;\n\n // Empty fragment is not visible\n if (!children || (Array.isArray(children) && children.length === 0)) {\n return false;\n }\n\n // If fragment has children, check if any child is visible\n if (Array.isArray(children)) {\n return children.some((child) => {\n // Only check VNode children (filter out strings, numbers, etc.)\n if (typeof child === 'object' && child !== null && 'type' in child) {\n return isVisible(child as VNode);\n }\n // Non-VNode children (like strings) are considered visible\n return true;\n });\n }\n }\n\n // All other vnodes are visible\n return true;\n}\n\nexport function useSlotHasContent(key: string): Ref<boolean> {\n const slots = useSlots();\n\n return computed(() => {\n const slot = slots[key];\n\n if (!slot) {\n return false;\n }\n\n const slotContent = slot();\n\n // NOTE(slanden): In Vue 3, nodes which are rendered conditionally with v-if\n // are rendered as a comment like `<!--v-if--/>` when the condition is false.\n // We need to filter these out to get only actually rendered content.\n const visibleContent = slotContent.filter(isVisible);\n\n return visibleContent.length > 0;\n });\n}\n","import type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\n\nexport interface AnimationOptions {\n /** The starting progress through the animation from 0 to 1 */\n start?: number;\n /** The duration of the animation in milliseconds */\n duration?: number;\n /** The easing function to use for the animation */\n easing?: string;\n /** The endimum distance to slide */\n end?: number;\n}\n\nconst DEFAULT_DURATION = 300;\nconst DEFAULT_EASING = 'ease';\n\nexport function fadeIn({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { opacity: start, offset: 0 },\n { opacity: 1, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function fadeOut({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { opacity: 1 - start, offset: 0 },\n { opacity: 0, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideUp({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `0 ${(1 - start) * 100}%`, offset: 0 },\n { translate: '0 0', offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideDown({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `0 ${start * 100}%`, offset: 0 },\n { translate: '0 100%', offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideRight({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n end = 1,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `${start * 100}% 0`, offset: 0 },\n { translate: `${end * 100}% 0`, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n\nexport function slideLeft({\n start = 0,\n duration = DEFAULT_DURATION,\n easing = DEFAULT_EASING,\n end = 1,\n}: AnimationOptions = {}): ElementAnimation {\n return {\n keyframes: [\n { translate: `${-start * 100}% 0`, offset: 0 },\n { translate: `${-end * 100}% 0`, offset: 1 },\n ],\n options: { duration, easing },\n };\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <!--\n For no-header prop below:\n See https://vuejs.org/guide/extras/web-components#passing-dom-properties\n Shoelace does not seem to properly specify the no-header prop; otherwise\n a false value resolves to no-header=\"false\" which is actually truthy\n -->\n <sl-drawer\n ref=\"sheet\"\n class=\"c-bottom-sheet\"\n :class=\"{\n 'c-bottom-sheet--hide-overlay': !overlay,\n 'c-bottom-sheet--hide-title': hideTitle,\n 'c-bottom-sheet--with-footer': footerHasContent,\n 'c-bottom-sheet--with-dismiss': isDismissVisible,\n }\"\n :style=\"{\n '--panel-transform': panelTransform,\n '--background-color-hex-code': backgroundCssColor,\n '--overlay-opacity': overlayOpacity,\n '--size': fixedSize || undefined,\n }\"\n :data-test=\"getDataTestAttr()\"\n :open=\"animatedValue || undefined\"\n :no-header=\"hideTitle || undefined\"\n :label=\"ariaLabel\"\n placement=\"bottom\"\n :contained=\"contained || undefined\"\n :divided=\"divided || undefined\"\n @sl-request-close=\"onRequestClose\"\n @sl-hide=\"handleDismiss\"\n @sl-after-hide=\"onAfterClose\"\n @sl-after-show=\"$emit('opened')\"\n >\n <div slot=\"label\" :data-test=\"value ? `${dataTest}-title` : null\">\n <slot name=\"header\">{{ title }}</slot>\n </div>\n\n <slot name=\"image\" />\n\n <div class=\"c-bottom-sheet__body\" :data-test=\"getDataTestAttr('body')\">\n <slot name=\"body\" />\n </div>\n\n <!-- NOTE(andrew): This renders in the body when the title is hidden because the header-actions\n slot is not rendered when the title is hidden. Previously this only rendered in the body but\n this caused issues on iOS where a scrollable body renders in a separate layer and the button\n got rendered invisibly underneath the header. This is intentionally placed after the body so\n it renders on top. -->\n <div\n v-if=\"isDismissVisible\"\n :slot=\"hideTitle ? undefined : 'header-actions'\"\n class=\"c-bottom-sheet__actions\"\n >\n <c-close-button\n :data-test=\"getDataTestAttr('dismiss')\"\n :disabled=\"disableDismiss\"\n @click=\"internalValue = false\"\n />\n </div>\n\n <CButtonStack v-if=\"footerHasContent\" slot=\"footer\" :data-test=\"getDataTestAttr('footer')\">\n <slot name=\"footer\" />\n </CButtonStack>\n </sl-drawer>\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/drawer/drawer.js';\nimport type SlDrawer from '@shoelace-style/shoelace/dist/components/drawer/drawer.js';\nimport type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport { setAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry.js';\nimport type { Ref, VNode } from 'vue';\nimport { computed, nextTick, onMounted, ref, toRef } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport CCloseButton from '@propelinc/citrus-ui/src/components/internal/CCloseButton.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport { useShoelaceShadowParts } from '@propelinc/citrus-ui/src/composables/elements';\nimport {\n useDragListener,\n useElasticClamp,\n useScrollBoundary,\n} from '@propelinc/citrus-ui/src/composables/gestures';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport { fadeIn, fadeOut, slideDown, slideUp } from '@propelinc/citrus-ui/src/services/animation';\n\n/** Minimum distance, in pixels, the user has to drag for it to be considered a\n * successful swipe. */\nconst MIN_SWIPE_DISTANCE = 100;\n/** The minimum speed, in pixels per millisecond, the user has to drag down for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_VELOCITY = 0.75;\n/** The minimum speed, in pixels per millisecond, to animate the sheet sliding\n * down after a successful swipe. */\nconst MIN_DISMISS_VELOCITY = 1.5;\n/** Minimum duration, in milliseconds, for the slide down animation after a\n * successful drag. */\nconst MIN_DISMISS_DURATION = 100;\n/** Maximum distance the sheet can move in a direction it can't be dragged. */\nconst DRAG_CLAMP_DISTANCE = 240;\n/** Fallback height for the sheet if the actual height is unknown. */\nconst SHEET_HEIGHT_FALLBACK = 300;\n\n/**\n * Was having issues with the useShoelaceAnimation composable not updating the animation quickly\n * enough using the `watch` or `watchEffect` hooks, so we're just going to set the animations\n * directly whenever we need to change the animation.\n */\nfunction setCustomAnimation(\n el: Ref<Element | null>,\n name: string,\n animation: ElementAnimation\n): void {\n if (!el.value) {\n return;\n }\n\n setAnimation(el.value, name, animation);\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Aria label for the bottom sheet. This is required if title is hidden */\n ariaLabel?: string;\n /** Background color of the bottom sheet */\n backgroundColor?: string;\n /** If true, the bottom sheet will be contained within the viewport. */\n contained?: boolean;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Disables the dismiss button */\n disableDismiss?: boolean;\n /** Divided into header, body, and footer slots */\n divided?: boolean;\n /** Fixed size, in CSS units. By default the drawer sizes itself to its contents. */\n fixedSize?: string;\n /** Hides the dismiss 'x' button */\n hideDismiss?: boolean;\n /** Allows for hiding the entire title bar, both the title and the dismiss 'x' button */\n hideTitle?: boolean;\n /**\n * Toggles the background behind the sheet. If there's no overlay, the sheet\n * stays open as the user interacts with background content.\n */\n overlay?: boolean;\n /**\n * Prevents the sheet from being dismissed when tapping on the overlay. If\n * there is no overlay then this property is ignored, as the sheet always\n * stays open.\n */\n persistent?: boolean;\n /** Do not animate in the bottom sheet if it starts open. */\n skipInitialAnimation?: boolean;\n /** The title of the bottom sheet */\n title?: string;\n /** Controls whether or not the bottom sheet is showing */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n backgroundColor: '',\n dataTest: 'bottom-sheet',\n disableDismiss: false,\n divided: false,\n fixedSize: '',\n hideDismiss: false,\n hideTitle: false,\n overlay: true,\n persistent: false,\n contained: false,\n skipInitialAnimation: false,\n title: '',\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n input: [value: boolean];\n opened: [];\n closed: [];\n}>();\n\ndefineSlots<{\n header?: () => VNode[];\n image?: () => VNode[];\n body?: () => VNode[];\n footer?: () => VNode[];\n}>();\n\n// NOTE(slanden): Temporarily disabling because it's causing a lot of errors\n// in the console - uses from CMS aren't specifying aria-label.\n// watchEffect(() => {\n// if (props.hideTitle && !props.ariaLabel) {\n// console.error('CBottomSheet: aria-label is required when title is hidden');\n// }\n// });\n\n// value: Value provided using props which can open/close the bottom sheet.\n// internalValue: Tracks the open/closed state and lets the bottom sheet open and close even if\n// the external value doesn't change.\n// animatedValue: Same as internalValue but starts at false so the bottom sheet animates if it\n// starts in an open state.\nconst valueRef = toRef(props, 'value');\nconst internalValue = useInternalValue(valueRef, { onChange: (value) => emit('input', value) });\nconst mounted = ref(false);\nconst animatedValue = computed(() => {\n // To animate in the bottom sheet we mount the component with the sheet closed.\n if (!props.skipInitialAnimation && !mounted.value) {\n return false;\n }\n return internalValue.value;\n});\nconst { cssColor: backgroundCssColor } = usePaletteColor(() => props.backgroundColor);\nonMounted(async () => {\n // The bottom sheet does not animate unless we wait a tick. We don't know exactly why this\n // is necessary.\n await nextTick();\n mounted.value = true;\n});\n\nconst sheet = ref<SlDrawer | null>(null);\nconst {\n panel,\n overlay: overlayPart,\n body: bodyPart,\n} = useShoelaceShadowParts(sheet, ['panel', 'overlay', 'body']);\nuseScrollBoundary(bodyPart);\n\n// NOTE(mohan): There are three parts to the bottom sheet animation:\n// 1. CSS variables. These are used when we want to set the exact height and\n// opacity, i.e. when the user is actively moving the sheet.\n// 2. The built-in Shoelace show and hide animations. If a user has swiped\n// the sheet away, we calculate the exact animation that will smoothly\n// continue the swipe and then dismiss the shoelace drawer.\n// 3. Manually-called web animations. These are used when the sheet is being\n// restored to its original position after a drag that was not fast or\n// long enough to count as a swipe.\nsetCustomAnimation(sheet, 'drawer.showBottom', slideUp());\nsetCustomAnimation(sheet, 'drawer.overlay.show', fadeIn());\nsetCustomAnimation(sheet, 'drawer.hideBottom', slideDown());\nsetCustomAnimation(sheet, 'drawer.overlay.hide', fadeOut());\n\nconst handleDismiss = (): void => {\n internalValue.value = false;\n};\n\nconst onRequestClose = (event: Event): void => {\n if (props.persistent) {\n event.preventDefault();\n }\n};\n\nconst onAfterClose = (): void => {\n // Reset the exit animations in case they were changed in a drag event\n setCustomAnimation(sheet, 'drawer.hideBottom', slideDown());\n setCustomAnimation(sheet, 'drawer.overlay.hide', fadeOut());\n emit('closed');\n};\n\n/**\n * Helper function to calculate the distance ratio of the sheet's transform.\n */\nconst getTransformDistanceRatio = (distance: number): number => {\n return distance / (panel.value?.clientHeight ?? SHEET_HEIGHT_FALLBACK);\n};\n\nconst { dragDistance } = useDragListener(panel, {\n onDragEnd: async ({ distance, velocity }) => {\n const shouldDismiss =\n !props.persistent && (distance.y > MIN_SWIPE_DISTANCE || velocity.y > MIN_SWIPE_VELOCITY);\n\n if (shouldDismiss) {\n const remainingDismissDistance = panel.value!.clientHeight - dragDistance.value!.y;\n const dismissDuration = Math.max(\n remainingDismissDistance / Math.max(velocity.y, MIN_DISMISS_VELOCITY),\n MIN_DISMISS_DURATION\n );\n const dismissStart = getTransformDistanceRatio(distance.y);\n\n // Here we set the custom animations to complete the dismissal animation smoothly\n // from the point where the user ended their drag event.\n setCustomAnimation(\n sheet,\n 'drawer.hideBottom',\n slideDown({ start: dismissStart, duration: dismissDuration })\n );\n setCustomAnimation(\n sheet,\n 'drawer.overlay.hide',\n fadeOut({ start: dismissStart, duration: dismissDuration })\n );\n handleDismiss();\n } else {\n /**\n * This is when the user's drag event fails to trigger a dismissal\n * We need to restore the sheet to its original position\n */\n const start = 1 - getTransformDistanceRatio(dragDistance.value!.y);\n const slideUpAnimation = slideUp({ start });\n const fadeInAnimation = fadeIn({ start });\n\n // Here we imperatively animate the sheet and overlay back to their original positions\n panel.value?.animate(slideUpAnimation.keyframes, slideUpAnimation.options);\n overlayPart.value?.animate(fadeInAnimation.keyframes, fadeInAnimation.options);\n }\n },\n});\n\n/**\n * The distance that the sheet has been currently dragged\n */\nconst transformDistance = useElasticClamp(\n computed(() => dragDistance.value?.y ?? 0),\n computed(() => ({\n min: -DRAG_CLAMP_DISTANCE,\n max: props.persistent ? DRAG_CLAMP_DISTANCE : undefined,\n }))\n);\n\nconst transformDistanceRatio = computed(() => getTransformDistanceRatio(transformDistance.value));\n\nconst panelTransform = computed(() => `translateY(${transformDistance.value}px)`);\n\nconst overlayOpacity = computed(() => {\n const result = 1 - transformDistanceRatio.value;\n\n if (isNaN(result)) {\n return 1;\n }\n\n return result;\n});\n\n// NOTE(mohan): We show data-test attributes only when the sheet is open.\n// This helps simplify testing assertions.\nconst getDataTestAttr = (suffix?: string): string | null => {\n const dataTest = suffix ? `${props.dataTest}-${suffix}` : props.dataTest;\n return internalValue.value ? dataTest : null;\n};\n\nconst footerHasContent = useSlotHasContent('footer');\n\nconst isDismissVisible = computed(\n () => (!props.persistent && !props.hideDismiss) || props.disableDismiss\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-bottom-sheet {\n --size: auto;\n --header-spacing: 24px;\n --body-spacing: 0;\n --bottom-padding: max(env(safe-area-inset-bottom, 0px), 16px);\n --footer-spacing: 12px 24px var(--bottom-padding);\n\n &::part(header-actions) {\n padding: 0;\n }\n\n &::part(close-button) {\n @include sr-only;\n }\n\n &::part(panel) {\n background: var(--background-color-hex-code, $color-white);\n border-radius: 12px 12px 0 0;\n max-height: 90%;\n overflow: visible;\n transform: var(--panel-transform, none);\n\n &::after {\n background: var(--background-color-hex-code, $color-white);\n bottom: -100px;\n content: '';\n height: 101px;\n left: 0;\n position: absolute;\n right: 0;\n }\n }\n\n &::part(body) {\n border-radius: 12px 12px 0 0;\n\n /**\n * NOTE (kyleshevlin) adding position: relative here fixed an issue where certain actions (like\n * clicking a checkbox) would hijack the bottom sheet body up and off the screen.\n */\n position: relative;\n }\n\n &::part(title) {\n @include large-headline;\n\n padding-bottom: 16px;\n }\n\n // Note(kayliegh): Add space to prevent long titles from colliding with dismiss button\n &--with-dismiss::part(title) {\n margin-right: 28px;\n }\n\n &::part(overlay) {\n opacity: var(--overlay-opacity, 1);\n }\n}\n\n.c-bottom-sheet__actions {\n position: absolute;\n right: 16px;\n top: 16px;\n}\n\n.c-bottom-sheet__body {\n padding: 0 24px var(--bottom-padding);\n\n // NOTE(andrew): When there is a footer the bottom inset is handled by the footer and we just add\n // spacing above the footer.\n .c-bottom-sheet--with-footer & {\n padding-bottom: 12px;\n }\n}\n\n.c-bottom-sheet--hide-title {\n // NOTE(mohan): When there is no title, we need to add some spacing to the top\n // of the body so it doesn't touch the top of the panel.\n .c-bottom-sheet__body {\n padding-top: 16px;\n }\n}\n\n.c-bottom-sheet--hide-overlay {\n &::part(overlay) {\n display: none;\n }\n}\n</style>\n","import { type ComputedRef, type MaybeRefOrGetter, type Ref, computed, toValue } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\nimport { useLink } from 'vue-router';\n\ninterface RouterComposableHelpers {\n /**\n * V-bind this to an element to make it accessible as a link.\n */\n linkAttrs: Ref<{\n role?: string;\n tabindex?: string;\n href?: string;\n }>;\n /**\n * The href to link to.\n */\n href: Ref<string | undefined>;\n /**\n * Navigates to the given route or href. If you're not using an `<a>` tag,\n * you'll need to call this on `@click` and on `@keydown.enter`\n */\n navigate: (event: MouseEvent) => Promise<void>;\n}\n\nfunction useLinkAttrs(href: Ref<string | undefined>): ComputedRef<{\n role?: string;\n tabindex?: string;\n href?: string;\n}> {\n return computed(() => (href.value ? { role: 'link', tabindex: '0', href: href.value } : {}));\n}\n\n/**\n * Adds router-link functionality to any component. Accepts an `undefined`\n * route, which disables routing.\n *\n * @param to - The route to link to.\n * @returns A few helpers can be used to link to the given route.\n */\nexport function useRouterLink(\n to: MaybeRefOrGetter<RouteLocationRaw | undefined>\n): RouterComposableHelpers {\n // NOTE(mohan): We need to provide a default here or else `useLink` will throw\n // an error.\n const toWithDefault = computed(() => toValue(to) ?? '');\n const useLinkResult = useLink({ to: toWithDefault });\n const { navigate: _navigate, href: _href } = useLinkResult;\n const isRouterLink = computed(() => !!toValue(to));\n const href = computed(() => (isRouterLink.value ? _href.value : undefined));\n const linkAttrs = useLinkAttrs(href);\n const navigate = async (event: MouseEvent): Promise<void> => {\n if (isRouterLink.value) {\n try {\n await _navigate(event);\n } catch (error) {\n // NOTE(mohan): This matches RouterLink's behavior, which doesn't throw\n // on navigation errors.\n // eslint-disable-next-line no-console\n console.debug(error);\n }\n }\n };\n\n return { linkAttrs, href, navigate };\n}\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-button\n v-bind=\"$attrs\"\n ref=\"button\"\n class=\"c-button\"\n :class=\"{\n 'c-button--block': injectedOrPropBlock,\n 'c-button--has-prefix-icon': hasIcon && iconPosition === 'prefix',\n 'c-button--has-suffix-icon': hasIcon && iconPosition === 'suffix',\n [`c-button-level--${level}`]: level,\n [`c-button-variant--${computedVariant}`]: computedVariant,\n [`c-button-size--${computedSize}`]: computedSize,\n }\"\n :data-block=\"dataBlock\"\n :data-href=\"routerDestinationOrHref\"\n :data-level=\"level\"\n :data-loading=\"dataLoading\"\n :data-size=\"computedSize\"\n data-test=\"button\"\n :data-variant=\"computedVariant\"\n :disabled=\"disabled\"\n :href=\"routerDestinationOrHref\"\n :loading=\"loading || undefined\"\n :size=\"computedSize\"\n :target=\"target\"\n :variant=\"shoelaceVariant\"\n v-on=\"animationListeners\"\n @click=\"onClick\"\n @sl-focus=\"$emit('focus', $event)\"\n @sl-blur=\"$emit('blur', $event)\"\n >\n <span v-if=\"hasIcon\" :slot=\"iconPosition\" data-test=\"button-icon-slot\">\n <slot name=\"icon\">\n <font-awesome-icon v-if=\"icon\" :icon=\"icon\" />\n </slot>\n </span>\n <slot data-test=\"button-default-slot\" />\n </sl-button>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/button/button.js';\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport type {\n ButtonIconPosition,\n ButtonLevel,\n ButtonShoelaceVariant,\n ButtonSize,\n ButtonVariant,\n} from '@propelinc/citrus-ui/src/components/CButton/types';\nimport { useTapAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport { BLOCK, BOUNCE_AMOUNT, LARGE } from '@propelinc/citrus-ui/src/services/injections/buttons';\n\n/**\n * Shoelace has a set of variants that don't match the variant names we would like to use.\n * This mapping is used to translate the variant names to the correct Shoelace variant names\n * and apply it to the underlying Shoelace button component.\n */\nconst VARIANT_TO_SHOELACE_VARIANT: Record<ButtonVariant, ButtonShoelaceVariant> = {\n primary: 'primary',\n // Shoelace `default` is an outline style\n secondary: 'default',\n tertiary: 'text',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether button appears as full-width */\n block?: boolean;\n /** Controls whether button is disabled */\n disabled?: boolean;\n /** Designates the button as an anchor and applies the href attribute */\n href?: string;\n /** Chooses an icon to render next to the button text */\n icon?: string | string[] | IconDefinition;\n /** Chooses whether to place the icon before or after the button text */\n iconPosition?: ButtonIconPosition;\n /**\n * @deprecated use `size` prop instead\n * Controls whether button uses the large variant\n */\n large?: boolean;\n /** Controls the level of the button */\n level?: ButtonLevel;\n /** Controls whether button is loading */\n loading?: boolean;\n /**\n * @deprecated use `variant` prop instead\n * Controls whether button uses the secondary variant\n */\n secondary?: boolean;\n /**\n * Controls the size of the button\n * @default 'medium'\n */\n size?: ButtonSize;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /**\n * @deprecated use `variant` prop instead\n * Controls whether button uses the tertiary variant\n */\n tertiary?: boolean;\n /** Controls whether button functions as a router-link */\n to?: RouteLocationRaw;\n /**\n * Controls the styling of the button\n * @default 'primary'\n */\n variant?: ButtonVariant;\n }>(),\n {\n block: false,\n disabled: false,\n href: undefined,\n icon: undefined,\n iconPosition: 'prefix',\n large: false,\n level: 'normal',\n loading: false,\n secondary: false,\n size: 'medium',\n target: undefined,\n tertiary: false,\n to: undefined,\n variant: 'primary',\n }\n);\n\nconst emit = defineEmits<{\n click: [event: MouseEvent];\n focus: [event: Event];\n blur: [event: Event];\n}>();\n\ndefineSlots<{\n icon?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst BLOCK_BOUNCE_AMOUNT = 0.96;\nconst BASE_BOUNCE_AMOUNT = 0.94;\n\nconst { href: routerDestination, navigate } = useRouterLink(() => props.to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst dataLoading = computed<true | undefined>(() => props.loading || undefined);\n\nconst injectedBlock = inject(BLOCK, undefined);\nconst injectedOrPropBlock = computed(() => injectedBlock?.value ?? props.block);\nconst dataBlock = computed<true | undefined>(() => injectedOrPropBlock.value || undefined);\n\nconst iconSlotHasContent = useSlotHasContent('icon');\nconst hasIcon = computed(() => iconSlotHasContent.value || !!props.icon);\n\n/**\n * Handle the deprecated `secondary` and `tertiary` props.\n */\nconst computedVariant = computed((): ButtonVariant => {\n if (props.secondary) {\n return 'secondary';\n }\n\n if (props.tertiary) {\n return 'tertiary';\n }\n\n return props.variant;\n});\n\n/**\n * Map the computed variant to the Shoelace variant\n */\nconst shoelaceVariant = computed(() => VARIANT_TO_SHOELACE_VARIANT[computedVariant.value]);\n\n/**\n * The deprecated `large` prop can be injected through a provider.\n */\nconst injectedLarge = inject(LARGE, undefined);\nconst injectedOrPropsLarge = computed(() => injectedLarge?.value ?? props.large);\n/**\n * Because we want the `size` prop to have a default, it's always supplied.\n * Thus, our only option to respect the deprecated `large` prop is to give it priority.\n */\nconst computedSize = computed(() => {\n if (injectedOrPropsLarge.value) {\n return 'large';\n }\n\n return props.size;\n});\n\nfunction onClick(event: MouseEvent): void {\n /**\n * If the button is disabled or loading, do not take action.\n * This prevents double/extra clicks when an async operation is in progress.\n */\n if (props.disabled || props.loading) {\n return;\n }\n\n navigate(event);\n emit('click', event);\n}\n\nconst button = ref<HTMLElement | null>(null);\nconst injectedBounceAmount = inject(BOUNCE_AMOUNT, null);\nconst bounceAmount = computed(() => {\n /**\n * If the button is disabled or loading, do not animate the button.\n */\n if (props.disabled || props.loading) {\n return 1;\n }\n\n if (injectedBounceAmount) {\n return injectedBounceAmount;\n }\n\n if (props.block) {\n return BLOCK_BOUNCE_AMOUNT;\n }\n\n return BASE_BOUNCE_AMOUNT;\n});\nconst animationListeners = useTapAnimation({\n el: button,\n keyframes: {\n default: { transform: 'scale(1)' },\n pressed: { transform: `scale(${bounceAmount.value})` },\n },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-button {\n // Prevents the iOS tap highlight color from showing up on buttons\n -webkit-tap-highlight-color: transparent;\n\n &::part(base) {\n // Included in all buttons so that they line up in rows, even buttons with transparent borders\n border-width: $border-width;\n transition: background-color 0.2s ease-in-out;\n }\n\n &::part(label) {\n padding: 0 16px;\n }\n}\n\n.c-button-size--medium::part(base) {\n --sl-input-height-medium: #{$button-size-medium};\n}\n\n.c-button-size--large::part(base) {\n --sl-input-height-large: #{$button-size-large};\n}\n\n.c-button--has-prefix-icon {\n &::part(base) {\n padding-inline-start: 16px;\n }\n\n &::part(label) {\n padding-inline-start: 8px;\n }\n}\n\n.c-button--has-suffix-icon {\n &::part(base) {\n padding-inline-end: 16px;\n }\n\n &::part(label) {\n padding-inline-end: 8px;\n }\n}\n\n.c-button--block {\n min-width: 100%;\n}\n\n.c-button-variant--primary::part(base) {\n @include button-theme-primary;\n}\n\n.c-button-variant--primary.c-button-level--danger::part(base) {\n @include button-theme-primary-danger;\n}\n\n.c-button-variant--secondary::part(base) {\n @include button-theme-secondary;\n}\n\n.c-button-variant--secondary.c-button-level--danger::part(base) {\n @include button-theme-secondary-danger;\n}\n\n.c-button-variant--tertiary::part(base) {\n @include button-theme-tertiary;\n}\n\n.c-button-variant--tertiary.c-button-level--danger::part(base) {\n @include button-theme-tertiary-danger;\n}\n\n/**\n * Override Shoelace's default disabled styles\n * (The danger styles seem fine)\n */\n:not(.c-button-level--danger) {\n &.c-button-variant--primary[disabled]::part(base) {\n @include button-theme($color-gray-500, $color-gray-200, $color-gray-200);\n }\n\n &.c-button-variant--secondary[disabled]::part(base) {\n @include button-theme($color-gray-500, $color-gray-500, transparent);\n }\n\n &.c-button-variant--tertiary[disabled]::part(base) {\n @include button-theme($color-gray-500, transparent, transparent);\n }\n}\n</style>\n","<template>\n <div v-bind=\"$attrs\" class=\"c-card-header\" data-test=\"card-header\">\n <div data-test=\"card-title\" class=\"c-card-header__title\">\n <slot />\n </div>\n\n <div class=\"c-card-header__append\">\n <slot name=\"append\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { provide, ref } from 'vue';\n\nimport { TERTIARY as TERTIARY_ICON_BUTTON } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\ndefineSlots<{\n default?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-header {\n @include subheadline;\n\n display: flex;\n}\n\n.c-card-header__title {\n flex: 1 1 auto;\n padding: 16px 16px 8px;\n}\n\n.c-card-header__append {\n align-items: center;\n display: flex;\n flex: none;\n\n .c-icon-button {\n margin-right: 8px;\n }\n\n .c-badge {\n margin-right: 8px;\n }\n}\n</style>\n","<template>\n <component\n :is=\"config.element\"\n v-bind=\"config.attrs\"\n data-test=\"card\"\n class=\"c-card\"\n :class=\"{\n 'c-card--tile': tile,\n 'c-card--borderless': borderless,\n 'c-card--link': config.isLink,\n 'c-card--stretch': stretch,\n }\"\n :href=\"href\"\n :style=\"{\n '--background-color': backgroundCssColor,\n '--border-color': borderCssColor,\n }\"\n :to=\"to\"\n >\n <CCardHeader v-if=\"title\">\n {{ title }}\n </CCardHeader>\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, useAttrs } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CCardHeader from '@propelinc/citrus-ui/src/components/CCardHeader.vue';\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\n\ntype RoutingVariant = 'none' | 'internal' | 'external';\n\nexport interface InternalCardConfig {\n attrs: Record<string, unknown>;\n element: string;\n isLink: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Sets the border color of the card */\n borderColor?: string;\n /** Removes the border of the card */\n borderless?: boolean;\n /** Sets the background color of the entire card */\n color?: string;\n /** Navigates externally on click */\n href?: string;\n /** Stretches the card vertically to fill the height of the parent container */\n stretch?: boolean;\n /** Toggles a squared-off card style intended to fill the width of the page */\n tile?: boolean;\n /** Sets the title of the card */\n title?: string;\n /** Navigates within the app on click */\n to?: RouteLocationRaw;\n }>(),\n {\n borderless: false,\n stretch: false,\n tile: false,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst attrs = useAttrs();\n\nconst { cssColor: backgroundCssColor } = usePaletteColor(() => props.color);\nconst { cssColor: borderCssColor } = usePaletteColor(() => props.borderColor);\n\nconst routingVariant = computed<RoutingVariant>(() => {\n if (props.to) {\n return 'internal';\n }\n\n if (props.href) {\n return 'external';\n }\n\n return 'none';\n});\n\nconst config = computed<InternalCardConfig>(() => {\n switch (routingVariant.value) {\n case 'internal':\n return {\n attrs,\n element: 'router-link',\n isLink: true,\n };\n\n case 'external':\n return {\n attrs: {\n ...attrs,\n role: 'link',\n tabindex: '0',\n target: '_blank',\n },\n element: 'a',\n isLink: true,\n };\n\n case 'none':\n default:\n return { attrs, element: 'div', isLink: false };\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card {\n --background-color: #{$color-background};\n --border-color: #{$color-border};\n --border-radius: #{$border-radius-next};\n --text-color: #{$color-text-primary};\n\n background-color: var(--background-color);\n border-color: var(--border-color);\n border-radius: var(--border-radius);\n border-style: solid;\n border-width: $border-width;\n color: var(--text-color);\n display: block;\n max-width: 100%;\n overflow: hidden;\n\n /**\n * FIXME: (kyleshevlin - https://linear.app/slanden/issue/FE-37/remove-exported-margins):\n * This is an \"exported margin\" and we should try to remove it. They make composition difficult.\n * Read more here: https://kyleshevlin.com/no-outer-margin\n *\n * For example, imagine we want to have multiple cards in a row. This selector will add a\n * margin-top to every card except the first. That would not be desired.\n *\n * Ideally, layout of sibling cards is always handled by a parent element.\n */\n & + & {\n margin-top: 8px;\n }\n}\n\n.c-card--tile {\n --border-radius: 0;\n\n border-left: none;\n border-right: none;\n}\n\n.c-card--borderless {\n --border-color: transparent;\n}\n\n.c-card--link {\n cursor: pointer;\n}\n\n.c-card--stretch {\n height: 100%;\n}\n</style>\n","<template>\n <CButtonStack v-bind=\"$attrs\" data-test=\"card-footer\" class=\"c-card-footer\">\n <slot />\n </CButtonStack>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-footer {\n padding: 0 16px 16px;\n}\n</style>\n","<template>\n <div\n v-bind=\"$attrs\"\n data-test=\"card-section\"\n class=\"c-card-section\"\n :class=\"{ 'c-card-section--fluid': fluid }\"\n >\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nwithDefaults(\n defineProps<{\n /** Removes the padding from the content */\n fluid?: boolean;\n }>(),\n {\n fluid: false,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-card-section {\n padding: 0 16px 16px;\n\n &:first-child:not(.c-card-section--fluid) {\n padding-top: 16px;\n }\n}\n\n.c-card-section--fluid {\n padding: 0;\n}\n</style>\n","<template>\n <div\n v-if=\"!isHidden\"\n :data-test=\"dataTest\"\n class=\"c-validation-message\"\n :class=\"{ 'c-validation-message--invalid': !!validationMessage }\"\n >\n <CFadeTransition aria-live=\"polite\">\n <span v-if=\"validationMessage\" key=\"message\" role=\"alert\" :data-test=\"`${dataTest}-text`\">\n {{ validationMessage }}\n </span>\n <!-- NOTE(mohan): Always keep an empty span to make sure the flex layout is stable. -->\n <span v-else key=\"empty\">\n <slot />\n </span>\n </CFadeTransition>\n\n <slot name=\"append\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CFadeTransition from '@propelinc/citrus-ui/src/components/CFadeTransition.vue';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** Test selector for the component */\n dataTest?: string;\n /**\n * Whether to hide the component. If \"auto\", the component will automatically\n * hide itself if it has no content.\n */\n hide?: boolean | 'auto';\n /** Validation message to display */\n validationMessage?: string | null;\n }>(),\n {\n dataTest: 'validation-message',\n hide: false,\n validationMessage: null,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nconst appendSlotHasContent = useSlotHasContent('append');\nconst isHidden = computed(() => {\n if (props.hide === 'auto') {\n return !props.validationMessage && !appendSlotHasContent.value;\n } else {\n return props.hide;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-validation-message {\n @include caption;\n\n display: flex;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.c-validation-message--invalid {\n color: $color-status-error;\n}\n</style>\n","import type { Ref } from 'vue';\nimport { computed } from 'vue';\n\nlet idCounter = 0;\n\n/**\n * Generates a unique ID for a component.\n *\n * This is a very rudimentary backport of Vue 3.5's `useId` composable that is\n * _not_ stable across server and client.\n *\n * @param id - The ID to use. If not provided, a unique ID will be generated.\n * @returns A computed value that returns the provided ID or a unique ID.\n */\nexport function useId(id: Ref<string | null | undefined>): Ref<string> {\n return computed(() => {\n if (id.value) {\n return id.value;\n } else {\n return `c-${idCounter++}`;\n }\n });\n}\n","import type { InjectionKey } from 'vue';\n\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\nexport const VALIDATIONS = Symbol('validations') as InjectionKey<{\n register: (input: ValidationState) => void;\n unregister: (id: string) => void;\n}>;\n","import type { Ref } from 'vue';\nimport { computed, inject, onBeforeUnmount, ref, unref, watch } from 'vue';\n\nimport { VALIDATIONS } from '@propelinc/citrus-ui/src/services/injections/forms';\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\nexport type Rule<Value extends string | boolean> = (value: Value) => string | boolean;\nexport type Rules<Value extends string | boolean> = Rule<Value>[];\n\nexport type ValidationEvent = 'blur' | 'input' | 'change';\n\nexport interface UseValidationRuleCheckOptions<Value extends string | boolean> {\n value: Ref<Value>;\n rules: Ref<Rules<Value>>;\n required?: Ref<boolean>;\n onValidationResultChange?: ({\n message,\n valid,\n }: {\n message: string | null;\n valid: boolean;\n }) => void;\n}\n\ninterface UseValidationRuleCheckReturn {\n /** The validation error message, if any. */\n message: Ref<string | null>;\n /** Whether the input element is valid. This is only set after\n * `startValidating` is called. */\n valid: Ref<boolean>;\n /** Whether the input element is valid regardless of whether `startValidating`\n * has been called. */\n passesRules: Ref<boolean>;\n /** Starts the validation process. */\n startValidating: () => boolean;\n /** Clears the validation results. */\n clearValidations: () => void;\n}\n\n/**\n * A composable that provides manual control of validation rules for a form\n * control. For full validation support, please see the `useValidations`\n * composable.\n *\n * @see {@link useValidations}\n *\n * @param options - The options for the composable.\n */\nexport function useValidationRuleCheck<Value extends string | boolean>(\n options: UseValidationRuleCheckOptions<Value>\n): UseValidationRuleCheckReturn {\n const { value, rules, required } = options;\n const active = ref(false);\n\n const message = ref<string | null>(null);\n const valid = ref(true);\n\n const isEmpty = (v: Value): boolean =>\n v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n const requiredRule: Rule<Value> = (val: Value): boolean => {\n return required?.value ? !isEmpty(val) : true;\n };\n\n const rulesResult = computed(() => {\n const allRules: Rules<Value> = [...rules.value, requiredRule];\n for (const rule of allRules) {\n const result = rule(value.value);\n if (result === false || typeof result === 'string') {\n return result;\n }\n }\n return true;\n });\n\n const passesRules = computed(() => rulesResult.value === true);\n\n const validate = (): boolean => {\n if (active.value) {\n valid.value = passesRules.value;\n message.value = typeof rulesResult.value === 'string' ? rulesResult.value : null;\n options.onValidationResultChange?.({ message: message.value, valid: valid.value });\n }\n\n return valid.value;\n };\n\n watch(value, () => validate(), { immediate: true });\n watch(rules, () => validate());\n\n if (required) {\n watch(required, () => validate());\n }\n\n const startValidating = (): boolean => {\n active.value = true;\n return validate();\n };\n\n const clearValidations = (): void => {\n message.value = null;\n valid.value = true;\n active.value = false;\n };\n\n return { message, valid, startValidating, clearValidations, passesRules };\n}\n\nexport interface UseValidationsOptions<Value extends string | boolean> {\n id?: Ref<string>;\n /** The input element. The `aria-invalid` attribute will be set on this\n * element. */\n field?: Ref<HTMLElement | null>;\n /** The value of the input element. */\n value: Ref<Value>;\n /** The validation rules to apply to the input element. */\n rules: Ref<Rules<Value>>;\n /** Value of the required attribute. */\n required?: Ref<boolean>;\n /** Which event to wait for before starting validation. */\n validateOn?: ValidationEvent | Ref<ValidationEvent>;\n}\n\ninterface UseValidationsReturn {\n /** The validation error message, if any. */\n message: Ref<string | null>;\n /** Whether the input element is valid. */\n valid: Ref<boolean | null>;\n /** The event listeners to bind to the component using `v-on`. */\n listeners: Record<string, (event: Event) => void>;\n /** Triggers validation. */\n startValidating: () => boolean;\n /** Clears the validation results. */\n clearValidations: () => void;\n}\n\n/** Registers this field with a parent form to enable form-wide validation. */\nexport type ValidationStateWithOptionalId = Omit<ValidationState, 'id'> & { id?: string };\nexport function useFormValidationSupport(state: ValidationStateWithOptionalId): void {\n const formValidations = inject(VALIDATIONS, null);\n if (formValidations) {\n if (!state.id) {\n throw new Error('id is required to support form validations');\n }\n\n formValidations.register(state as ValidationState);\n }\n\n onBeforeUnmount(() => {\n if (formValidations && state.id) {\n formValidations.unregister(state.id);\n }\n });\n}\n\n/**\n * A composable that provides validation support for form controls. Please make sure to\n * `v-bind` the returned `attrs` and `v-on` the returned `listeners` to the component.\n *\n * @param options - The options for the composable.\n */\nexport function useValidations<Value extends string | boolean>(\n options: UseValidationsOptions<Value>\n): UseValidationsReturn {\n const validateOn = computed(() => unref(options.validateOn) ?? 'blur');\n\n const onValidationResultChange = ({ valid }: { valid: boolean }): void => {\n if (options.field?.value) {\n options.field.value.setAttribute('aria-invalid', valid ? 'false' : 'true');\n }\n };\n\n const { message, valid, startValidating, passesRules, clearValidations } = useValidationRuleCheck(\n {\n value: options.value,\n rules: options.rules,\n required: options.required,\n onValidationResultChange,\n }\n );\n\n useFormValidationSupport({\n id: options.id?.value,\n valid: passesRules,\n validate: startValidating,\n field: options.field,\n });\n\n const onInput = (): void => {\n if (validateOn.value === 'input') {\n startValidating();\n }\n };\n\n const onBlur = (): void => {\n // NOTE(slanden): We always validate on blur, regardless of the validateOn setting.\n startValidating();\n };\n\n const onChange = (): void => {\n if (validateOn.value === 'change') {\n startValidating();\n }\n };\n\n watch(validateOn, (newValue, oldValue): void => {\n if (['input', 'change'].includes(newValue) && newValue !== oldValue) {\n startValidating();\n }\n });\n\n const listeners = { input: onInput, blur: onBlur, change: onChange };\n return { message, valid, listeners, startValidating, clearValidations };\n}\n","<template>\n <div class=\"c-checkbox__container\">\n <label\n class=\"c-checkbox\"\n :class=\"{\n 'c-checkbox--checked': internalValue,\n 'c-checkbox--invalid': !isValidationValid,\n 'c-checkbox--contained': variant === 'contained',\n }\"\n :data-test=\"dataTest\"\n >\n <input\n :id=\"idWithFallback\"\n type=\"checkbox\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-checkbox__input\"\n :aria-checked=\"internalValue\"\n :aria-describedby=\"`${idWithFallback}-message`\"\n :aria-invalid=\"!isValidationValid\"\n :checked=\"internalValue || undefined\"\n @change=\"onChange\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n v-on=\"validationListeners\"\n />\n <span class=\"c-checkbox__control\" :data-test=\"`${dataTest}-control`\">\n <FontAwesomeIcon v-if=\"internalValue\" :icon=\"faCheck\" />\n </span>\n <slot name=\"label\">{{ label }}</slot>\n </label>\n\n <CValidationMessage\n class=\"c-checkbox__message\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faCheck } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { ref, toRefs } from 'vue';\n\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test selector */\n dataTest?: string;\n /** Hides the validation message area. */\n hideDetails?: boolean | 'auto';\n /** Assigns the checkbox's id */\n id?: string | null;\n /** The label text for the checkbox */\n label?: string;\n /**\n * An array of functions that either return either true / false or a string\n * containing an error message. The component passes the input value as an\n * argument. The input field will enter an error state if a function does\n * not return true.\n */\n rules?: ((value: boolean) => string | boolean)[];\n /** Whether the checkbox is checked */\n value?: boolean;\n /**\n * Controls the appearance of the checkbox.\n * @default 'contained'\n */\n variant?: 'contained' | 'minimal';\n }>(),\n {\n dataTest: 'checkbox',\n hideDetails: false,\n id: null,\n label: undefined,\n rules: () => [],\n value: false,\n variant: 'contained',\n }\n);\n\nconst emit = defineEmits<{\n (e: 'change', value: boolean): void;\n (e: 'focus'): void;\n (e: 'blur'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst internalValue = useInternalValue(value, {\n onChange: (value) => emit('change', value),\n});\n\nconst checkbox = ref<HTMLInputElement | null>(null);\n\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n validateOn: 'change',\n field: checkbox,\n});\n\nconst onChange = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n internalValue.value = !!target.checked;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-checkbox {\n align-items: flex-start;\n cursor: pointer;\n display: flex;\n gap: 8px;\n transition: border-color $citrus-field-transition-duration ease;\n\n --padding: 12px;\n\n &--contained {\n background-color: $color-background;\n border: $border;\n border-radius: $border-radius-next;\n padding: var(--padding);\n width: 100%;\n\n &.c-checkbox--checked {\n border-color: $color-black;\n border-width: $border-width;\n }\n\n &.c-checkbox--invalid {\n border-color: $color-status-error;\n }\n }\n\n &--invalid {\n color: $color-status-error;\n }\n}\n\n.c-checkbox__input {\n @include sr-only;\n}\n\n.c-checkbox__control {\n align-items: center;\n border: $color-gray-300 solid $border-width;\n border-radius: 4px;\n color: $color-white;\n display: flex;\n flex-shrink: 0;\n height: 22px;\n justify-content: center;\n width: 22px;\n\n .c-checkbox--checked & {\n background-color: $color-black;\n border-color: $color-black;\n }\n\n .c-checkbox--invalid & {\n border-color: $color-status-error;\n }\n}\n\n.c-checkbox__input:focus-visible ~ .c-checkbox__control {\n @include focus-ring;\n}\n\n.c-checkbox__message {\n margin-top: 4px;\n}\n</style>\n","<template>\n <hr\n class=\"c-divider\"\n :class=\"{ 'c-divider--vertical': vertical }\"\n :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\"\n />\n</template>\n\n<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** Displays dividers vertically. */\n vertical?: boolean;\n }>(),\n {\n vertical: false,\n }\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-divider {\n border: solid $color-gray-200;\n border-width: thin 0 0;\n display: block;\n flex: 1 1 0px;\n height: 0;\n max-height: 0;\n max-width: 100%;\n transition: inherit;\n}\n\n.c-divider--vertical {\n align-self: stretch;\n border-width: 0 thin 0 0;\n display: inline-flex;\n height: inherit;\n margin: 0 -1px;\n max-height: 100%;\n max-width: 0;\n min-height: 100%;\n vertical-align: text-bottom;\n width: 0;\n}\n</style>\n","<template>\n <div>{{ displayText }}</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n /** Sets the denominator of the counter. */\n counter?: number | null;\n /** Function or number that determines the numerator of the counter. */\n counterValue?: number | (() => number | null) | null;\n /** Input value of the parent form field */\n value?: string;\n }>(),\n {\n counter: null,\n counterValue: null,\n value: '',\n }\n);\n\nconst numerator = computed(() => {\n if (typeof props.counterValue === 'function') {\n return props.counterValue();\n } else if (typeof props.counterValue === 'number') {\n return props.counterValue;\n } else {\n return props.value.length;\n }\n});\n\nconst displayText = computed(() => {\n return `${numerator.value}/${props.counter}`;\n});\n</script>\n","import { onMounted, useAttrs } from 'vue';\n\nexport function useA11yLabelCheck(componentName: string, props?: Record<string, unknown>): void {\n const attrs = useAttrs();\n\n onMounted(() => {\n const enableCheck = process.env.VUE_APP_DEBUG === 'yes' || process.env.NODE_ENV === 'test';\n if (!enableCheck) {\n return;\n }\n\n if (\n attrs.title ||\n props?.title ||\n attrs['aria-label'] ||\n props?.ariaLabel ||\n attrs['aria-labelledby'] ||\n props?.ariaLabelledby ||\n attrs['aria-hidden'] ||\n props?.ariaHidden\n ) {\n return;\n }\n\n console.error(\n `Missing ${componentName} label. This component won't be intelligible to screen readers. Typically, this is resolved by providing an aria-label.`\n );\n });\n}\n","<template>\n <CButton\n v-bind=\"$attrs\"\n class=\"c-icon-button\"\n :class=\"{\n 'c-icon-button--inherit': inheritColor,\n [`c-icon-button-size--${computedSize}`]: computedSize,\n }\"\n :data-inherit-color=\"inheritColor\"\n :data-size=\"computedSize\"\n data-test=\"icon-button\"\n :disabled=\"disabled\"\n :href=\"href\"\n :level=\"level\"\n :loading=\"loading\"\n :size=\"computedSize\"\n :target=\"target\"\n :to=\"to\"\n :variant=\"computedVariant\"\n @blur=\"$emit('blur', $event)\"\n @click=\"$emit('click', $event)\"\n @focus=\"$emit('focus', $event)\"\n >\n <div\n role=\"img\"\n data-test=\"icon-button-a11y\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n >\n <slot>\n <font-awesome-icon\n v-if=\"icon\"\n class=\"c-icon-button__icon\"\n :class=\"{ 'c-icon-button__icon--spin': spinIcon }\"\n data-test=\"icon-button-icon\"\n :icon=\"icon\"\n />\n </slot>\n </div>\n </CButton>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/pro-light-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { computed, inject, provide } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CButton from '@propelinc/citrus-ui/src/components/CButton/CButton.vue';\nimport type {\n ButtonLevel,\n ButtonSize,\n ButtonVariant,\n} from '@propelinc/citrus-ui/src/components/CButton/types';\nimport { useA11yLabelCheck } from '@propelinc/citrus-ui/src/composables/accessibility';\nimport { BOUNCE_AMOUNT } from '@propelinc/citrus-ui/src/services/injections/buttons';\nimport { INHERIT_COLOR, TERTIARY } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nconst props = withDefaults(\n defineProps<{\n /** ARIA label for the button. You must use either this or ariaLabelledby. */\n ariaLabel?: string;\n /** ARIA labelledby for the button. You must use either this or ariaLabel. */\n ariaLabelledby?: string;\n /** Controls whether button is disabled */\n disabled?: boolean;\n /** Designates the button as an anchor and applies the href attribute */\n href?: string;\n /** Specifies a Font Awesome icon */\n icon?: string | string[] | IconDefinition;\n /**\n * Controls whether button uses the large variant\n * @deprecated Use `size=\"large\"` instead\n */\n large?: boolean;\n /**\n * Controls the level of the button\n * @default 'normal'\n */\n level?: ButtonLevel;\n /** Controls whether button is loading */\n loading?: boolean;\n /**\n * Controls whether button uses the secondary variant\n * @deprecated Use `variant=\"secondary\"` instead\n */\n secondary?: boolean;\n /**\n * Controls the size of the button\n * @default 'medium'\n */\n size?: ButtonSize;\n /** Spins the icon for loading states */\n spinIcon?: boolean;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /**\n * Controls whether button uses the tertiary variant\n * @deprecated Use `variant=\"tertiary\"` instead\n */\n tertiary?: boolean;\n /** Controls whether button functions as a router-link */\n to?: RouteLocationRaw;\n /**\n * Controls the variant of the button\n * @default 'primary'\n */\n variant?: ButtonVariant;\n }>(),\n {\n disabled: false,\n large: false,\n level: 'normal',\n loading: false,\n secondary: false,\n size: 'medium',\n spinIcon: false,\n tertiary: false,\n variant: 'primary',\n }\n);\n\ndefineEmits<{\n blur: [event: Event];\n click: [event: MouseEvent];\n focus: [event: Event];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nuseA11yLabelCheck('CIconButton', props);\n\nconst injectedTertiary = inject(TERTIARY, undefined);\nconst injectedOrPropTertiary = computed(() => injectedTertiary?.value ?? props.tertiary);\n/**\n * Handle the `variant` prop. `secondary` and `tertiary` are deprecated, but because we set a\n * default `variant`, we need to give them precedence.\n *\n * This is slightly different than the implementation of `computedVariant` in CButton, as\n * `CButton` does not make use of an injected `TERTIARY` value.\n */\nconst computedVariant = computed((): ButtonVariant => {\n if (props.secondary) {\n return 'secondary';\n }\n\n if (injectedOrPropTertiary.value) {\n return 'tertiary';\n }\n\n return props.variant;\n});\n\n/**\n * Handle the `size` prop. `large` is deprecated, but because we set a default `size`, we need\n * to give it precedence.\n */\nconst computedSize = computed((): ButtonSize => {\n if (props.large) {\n return 'large';\n }\n\n return props.size;\n});\n\nconst inheritColor = inject(INHERIT_COLOR, undefined);\n\nprovide(BOUNCE_AMOUNT, 0.9);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-icon-button::part(base) {\n font-size: $font-size-icon-medium;\n line-height: 0;\n padding: 0;\n width: $button-size-medium;\n}\n\n.c-icon-button--inherit::part(base) {\n color: inherit;\n}\n\n.c-icon-button::part(label) {\n align-items: center;\n display: flex;\n justify-content: center;\n padding: 0;\n}\n\n.c-icon-button-size--large::part(base) {\n width: $button-size-large;\n}\n\n.c-icon-button__icon--spin {\n animation: $loader-spin-animation;\n}\n</style>\n","import { getCurrentInstance } from 'vue';\n\nexport function useTranslation(): {\n t: (key: string, interpolations?: Record<string, string | number>) => string;\n} {\n const currentInstance = getCurrentInstance();\n\n if (!currentInstance || !currentInstance.proxy) {\n throw new Error('useTranslation must be called within a Vue component');\n }\n\n return { t: currentInstance.proxy.$t };\n}\n","<template>\n <div\n class=\"c-text-field\"\n :class=\"[\n {\n 'c-text-field--disabled': disabled,\n 'c-text-field--invalid': isInvalid,\n 'c-text-field--hide-label': hideLabel,\n 'c-text-field--focused': isFocused,\n 'c-text-field--medium': size === 'medium',\n 'c-text-field--large': size === 'large',\n },\n $attrs.class,\n ]\"\n :data-test=\"dataTest\"\n :style=\"rootStyles\"\n >\n <label class=\"c-text-field__label\" :for=\"idWithFallback\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </label>\n\n <div class=\"c-text-field__container\">\n <div\n v-if=\"prefixSlotHasContent\"\n class=\"c-text-field__prefix\"\n :data-test=\"`${dataTest}-prefix`\"\n >\n <slot name=\"prepend-inner\" />\n </div>\n\n <input\n v-bind=\"fallthroughAttrs\"\n :id=\"idWithFallback\"\n ref=\"input\"\n class=\"c-text-field__input\"\n :class=\"{\n 'c-text-field__input--has-prefix': prefixSlotHasContent,\n 'c-text-field__input--has-suffix': suffixSlotHasContent,\n 'c-text-field__input--clearable': clearable && value,\n 'c-text-field__input--hideable': hideable,\n }\"\n :data-test=\"`${dataTest}-input`\"\n :aria-label=\"ariaLabel || label || undefined\"\n :aria-describedby=\"`${idWithFallback}-validation-message ${idWithFallback}-message`\"\n :aria-invalid=\"isInvalid ? 'true' : 'false'\"\n :type=\"inputType\"\n :placeholder=\"placeholder\"\n :minlength=\"minlength\"\n :maxlength=\"maxlength\"\n :disabled=\"disabled\"\n :value=\"inputValue\"\n :inputmode=\"inputmode\"\n :required=\"required\"\n @keyup=\"$emit('keyup', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n @keypress=\"$emit('keypress', $event)\"\n @click=\"$emit('click', $event)\"\n @input=\"onInput\"\n @change=\"onChange\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n\n <CIconButton\n v-if=\"clearable && value\"\n :aria-label=\"$t('Clear')\"\n :data-test=\"`${dataTest}-clear`\"\n class=\"c-text-field__clear-btn c-text-field__suffix-btn\"\n type=\"button\"\n tertiary\n :icon=\"faXmark\"\n @click=\"clearInput\"\n />\n\n <CIconButton\n v-if=\"hideable\"\n :aria-label=\"hideToggleAriaLabel\"\n :data-test=\"`${dataTest}-hide-toggle`\"\n :data-hidden=\"inputHidden || undefined\"\n class=\"c-text-field__suffix-btn\"\n type=\"button\"\n tertiary\n :icon=\"inputHidden ? faEye : faEyeSlash\"\n @click=\"toggleHidden\"\n />\n\n <div\n v-if=\"suffixSlotHasContent\"\n class=\"c-text-field__suffix\"\n :data-test=\"`${dataTest}-suffix`\"\n >\n <slot name=\"append\" />\n </div>\n </div>\n\n <CValidationMessage\n :id=\"`${idWithFallback}-validation-message`\"\n class=\"c-text-field__validation-message\"\n :data-test=\"`${dataTest}-validation-message`\"\n :validation-message=\"errorMessage || validationMessage\"\n :hide=\"hideDetails\"\n >\n <template #append>\n <CFormFieldCounter\n v-if=\"counter\"\n :data-test=\"`${dataTest}-counter`\"\n :counter=\"counter\"\n :counter-value=\"counterValue !== null ? counterValue : undefined\"\n :value=\"inputValue\"\n />\n </template>\n </CValidationMessage>\n\n <div\n v-if=\"messageSlotHasContent\"\n :id=\"`${idWithFallback}-message`\"\n class=\"c-text-field__message\"\n :data-test=\"`${dataTest}-message`\"\n >\n <slot name=\"message\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\n// NOTE(slanden): These rules do not properly handle multiple script tags in Vue\n// eslint-disable-next-line import/order, import/no-duplicates\nimport type { Ref } from 'vue';\n\nexport interface CTextFieldExposed {\n input: Ref<HTMLInputElement | null>;\n focus: () => void;\n blur: () => void;\n startValidating: () => void;\n}\n</script>\n\n<script setup lang=\"ts\">\n// eslint-disable-next-line import/order\nimport { faEye, faEyeSlash, faXmark } from '@fortawesome/pro-regular-svg-icons';\n// eslint-disable-next-line import/no-duplicates\nimport type { StyleValue, VNode } from 'vue';\nimport { computed, onMounted, ref, toRefs, useAttrs, useSlots } from 'vue';\n\nimport CFormFieldCounter from '@propelinc/citrus-ui/src/components/CFormFieldCounter.vue';\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n id?: string;\n label?: string;\n ariaLabel?: string;\n placeholder?: string;\n type?:\n | 'text'\n | 'password'\n | 'email'\n | 'tel'\n | 'url'\n | 'search'\n | 'number'\n | 'decimal'\n | 'numeric';\n clearable?: boolean;\n size?: 'medium' | 'large';\n inputmode?: 'text' | 'search' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal';\n minlength?: number | string;\n maxlength?: number | string;\n disabled?: boolean;\n hideable?: boolean;\n hideLabel?: boolean;\n hideDetails?: boolean | 'auto';\n value?: string;\n dataTest?: string;\n counter?: number | null;\n counterValue?: number | (() => number | null) | null;\n rules?: Rules<string>;\n validateOnBlur?: boolean;\n required?: boolean;\n /**\n * Overrides the default validation message. If provided, this error message will always\n * be shown, regardless of any other failing validation rules.\n */\n errorMessage?: string;\n }>(),\n {\n type: 'text',\n clearable: false,\n size: 'medium',\n disabled: false,\n hideable: false,\n hideLabel: false,\n hideDetails: false,\n value: '',\n dataTest: 'text-field',\n counter: null,\n counterValue: null,\n rules: () => [],\n validateOnBlur: true,\n required: false,\n }\n);\n\nconst emit = defineEmits<{\n 'keyup': [event: KeyboardEvent];\n 'keydown': [event: KeyboardEvent];\n 'keypress': [event: KeyboardEvent];\n 'input': [value: string];\n 'focus': [event: Event];\n 'blur': [event: Event];\n 'change': [value: string];\n 'click': [event: MouseEvent];\n 'click:hide': [hidden: boolean];\n}>();\n\ndefineSlots<{\n 'label'?: () => VNode[];\n 'prepend-inner'?: () => VNode[];\n 'append'?: () => VNode[];\n 'message'?: () => VNode[];\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst { t } = useTranslation();\n\nconst isFocused = ref(false);\nconst inputHidden = ref(true);\nconst inputType = computed(() => (props.hideable && inputHidden.value ? 'password' : props.type));\nconst hideToggleAriaLabel = computed(() => {\n return props.hideable && inputHidden.value ? t('Show input value') : t('Hide input value');\n});\n\nconst { id, value, rules, required } = toRefs(props);\n\nconst idWithFallback = useId(id);\n\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('input', newValue);\n },\n});\n\nconst input = ref<HTMLInputElement | null>(null);\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n startValidating,\n} = useValidations({\n id: idWithFallback,\n value: inputValue,\n rules,\n required,\n validateOn: computed(() => (props.validateOnBlur ? 'blur' : 'input')),\n field: input,\n});\n\nconst isInvalid = computed(() => !isValidationValid.value || !!props.errorMessage);\n\nconst prefixSlotHasContent = useSlotHasContent('prepend-inner');\nconst suffixSlotHasContent = useSlotHasContent('append');\nconst messageSlotHasContent = useSlotHasContent('message');\n\nconst toggleHidden = (): void => {\n inputHidden.value = !inputHidden.value;\n emit('click:hide', inputHidden.value);\n};\n\nconst onInput = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n if (target.value !== inputValue.value) {\n inputValue.value = target.value;\n validationListeners.input(event);\n }\n};\n\nconst onChange = (event: Event): void => {\n validationListeners.change(event);\n const target = event.target as HTMLInputElement;\n emit('change', target.value);\n};\n\nconst onFocus = (event: Event): void => {\n isFocused.value = true;\n emit('focus', event);\n};\n\nconst onBlur = (event: Event): void => {\n isFocused.value = false;\n validationListeners.blur(event);\n emit('blur', event);\n};\n\nconst clearInput = (): void => {\n emit('input', '');\n};\n\nconst focus = (): void => {\n input.value?.focus();\n};\n\nconst blur = (): void => {\n input.value?.blur();\n};\n\nonMounted(() => {\n if (!props.label && !slots.label && !props.ariaLabel) {\n console.error(\n 'Missing CTextField label. Please provide a label prop, an ariaLabel prop or pass a label via the label slot.'\n );\n }\n});\n\nconst exposedAPI: CTextFieldExposed = { input, focus, blur, startValidating };\ndefineExpose(exposedAPI);\n\nconst fallthroughAttrs = computed(() => {\n const { class: _, style: __, ...rest } = attrs;\n return rest;\n});\n\nconst rootStyles = computed(() => attrs.style as StyleValue);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-text-field__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 8px;\n transition: color $citrus-field-transition-duration ease;\n}\n\n.c-text-field__container {\n align-items: center;\n background-color: $color-background;\n border: $border-width solid $color-gray-200;\n border-radius: $border-radius-next;\n display: flex;\n transition: border-color $citrus-field-transition-duration ease;\n}\n\n.c-text-field--focused .c-text-field__container {\n border-color: $color-black;\n}\n\n.c-text-field--invalid .c-text-field__label {\n color: $color-status-error;\n}\n\n.c-text-field--invalid .c-text-field__container {\n border-color: $color-status-error;\n color: $color-status-error;\n}\n\n.c-text-field--hide-label .c-text-field__label {\n @include sr-only;\n}\n\n.c-text-field--disabled .c-text-field__label {\n color: $color-text-disabled;\n}\n\n.c-text-field--disabled .c-text-field__container {\n background-color: $color-gray-100;\n color: $color-text-disabled;\n}\n\n.c-text-field__input {\n background-color: transparent;\n border: none;\n border-radius: $border-radius-next;\n flex: 1 1 0%;\n outline: none;\n width: 100%;\n\n &--has-prefix {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n }\n\n &--has-suffix {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n.c-text-field__suffix-btn {\n margin-right: 4px;\n}\n\n.c-text-field__clear-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1rem;\n margin-left: 0.5rem;\n}\n\n/* Size Variants */\n.c-text-field--medium .c-text-field__input {\n padding: 12px 16px;\n\n &--clearable,\n &--hideable {\n padding-right: 0;\n }\n\n &--has-suffix {\n padding-right: 8px;\n }\n}\n\n.c-text-field--large .c-text-field__input {\n padding: 24px;\n\n &--clearable,\n &--hideable {\n padding-right: 0;\n }\n\n &--has-suffix {\n padding-right: 8px;\n }\n}\n\n.c-text-field__prefix {\n flex: 0 0 auto;\n margin-left: 16px;\n}\n\n.c-text-field__suffix {\n align-items: center;\n display: flex;\n flex: 0 0 auto;\n gap: 12px;\n margin-right: 16px;\n}\n\n.c-text-field__validation-message {\n margin-top: 4px;\n}\n\n.c-text-field__message {\n @include caption;\n\n color: $color-gray-500;\n margin-bottom: 16px;\n}\n</style>\n","import { Mask, MaskInput, type MaskInputOptions, type MaskOptions, type MaskaDetail } from 'maska';\nimport { type Ref, computed, watch } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\n\nconst toNumber = (value: number | string | null | undefined): number | null => {\n if (value === null || value === undefined || value === '') {\n return null;\n } else if (typeof value === 'number') {\n return value;\n } else {\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? null : parsed;\n }\n};\n\nexport function useInputMask(\n /** Element to be masked */\n input: Ref<HTMLInputElement | null>,\n /** Value passed into the input */\n value: Ref<string>,\n /**\n * Options for the mask.\n * @see https://beholdr.github.io/maska/v2/#/?id=mask-options\n */\n options: Ref<MaskInputOptions>\n): {\n mask: Ref<Mask>;\n maskedValue: Ref<string>;\n unmaskedValue: Ref<string>;\n} {\n const internalValue = useInternalValue(value);\n\n const maskOptions = computed<MaskInputOptions>((): MaskInputOptions => {\n const onMaska = options.value.onMaska;\n const onMaskaArray = Array.isArray(onMaska) ? onMaska : onMaska ? [onMaska] : [];\n return {\n ...options.value,\n onMaska: [\n (detail: MaskaDetail): void => {\n internalValue.value = detail.unmasked;\n },\n ...onMaskaArray,\n ],\n };\n });\n\n let maskInput: MaskInput | null = null;\n watch(input, (newInput) => {\n if (newInput) {\n maskInput = new MaskInput(newInput, maskOptions.value);\n } else {\n maskInput?.destroy();\n maskInput = null;\n }\n });\n\n const mask = computed(() => new Mask(maskOptions.value));\n const maskedValue = computed(() => {\n return mask.value ? mask.value.masked(internalValue.value) : value.value;\n });\n\n return {\n mask,\n maskedValue,\n unmaskedValue: internalValue,\n };\n}\n\nexport function useMaskedMinLength(\n minlength: Ref<number | string | undefined>,\n value: Ref<string>,\n options: Ref<MaskOptions>\n): Ref<number | null> {\n const maskTokens = computed(() => {\n // NOTE(mohan): '#', '@', '*' are the default tokens used by maska.\n return ['#', '@', '*', ...Object.keys(options.value.tokens ?? {})];\n });\n\n // NOTE(mohan): We want `minlength` to only include token characters\n // (e.g. '#' or '@') and ignore symbols like '-'. So, we iterate through\n // the mask to see how many characters are required to hit minlength tokens.\n const findMaskedMinLength = (mask: string, minlength: number): number => {\n const maskArray = mask.split('');\n const index = maskArray.findIndex((_, index) => {\n const tokensInSlice = maskArray\n .slice(0, index + 1)\n .filter((char) => maskTokens.value.includes(char));\n return tokensInSlice.length === minlength;\n });\n\n if (index === -1) {\n return mask.length;\n } else {\n // Convert index to length\n return index + 1;\n }\n };\n\n const maskedMinLength = computed(() => {\n const mask = options.value.mask;\n const minlengthValue = toNumber(minlength.value);\n\n if (!minlengthValue) {\n return null;\n } else if (!mask) {\n return minlengthValue;\n } else {\n if (typeof mask === 'function') {\n return findMaskedMinLength(mask(value.value), minlengthValue);\n } else if (typeof mask === 'string') {\n return findMaskedMinLength(mask, minlengthValue);\n } else if (Array.isArray(mask)) {\n return Math.min(...mask.map((m) => findMaskedMinLength(m, minlengthValue!)));\n } else {\n return minlengthValue;\n }\n }\n });\n\n return maskedMinLength;\n}\n\nexport function useMaskedMaxLength(\n maxlength: Ref<number | string | undefined>,\n options: Ref<MaskOptions>\n): Ref<number | null> {\n return computed(() => {\n const mask = options.value.mask;\n const maxlengthValue = toNumber(maxlength.value);\n if (!maxlengthValue) {\n return null;\n } else if (!mask) {\n return maxlengthValue;\n } else {\n return Math.max(maxlengthValue, mask.length);\n }\n });\n}\n","<template>\n <CTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"textField\"\n :data-test=\"dataTest\"\n :data-mask=\"mask\"\n :value=\"maskedValue\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :minlength=\"maskedMinLength !== null ? maskedMinLength : undefined\"\n :maxlength=\"maskedMaxLength !== null ? maskedMaxLength : undefined\"\n :rules=\"unmaskRules ? unmaskedRules : rules\"\n :counter=\"counter\"\n :counter-value=\"counterValue\"\n @keyup=\"$emit('keyup', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n @keypress=\"$emit('keypress', $event)\"\n @blur=\"$emit('blur', $event)\"\n @focus=\"$emit('focus', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #prepend-inner>\n <slot name=\"prepend-inner\" />\n </template>\n <template #append>\n <slot name=\"append\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { MaskInputOptions, MaskOptions, MaskTokens, MaskaDetail } from 'maska';\nimport type { VNode } from 'vue';\nimport { computed, ref, toRefs } from 'vue';\n\nimport CTextField from '@propelinc/citrus-ui/src/components/CTextField.vue';\nimport {\n useInputMask,\n useMaskedMaxLength,\n useMaskedMinLength,\n} from '@propelinc/citrus-ui/src/composables/input-mask';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n counter?: number | null;\n dataTest?: string;\n id?: string;\n label?: string;\n mask: MaskOptions['mask'] | null;\n minlength?: number | string;\n maxlength?: number | string;\n placeholder?: string;\n rules?: Rules<string>;\n tokens?: MaskTokens | null;\n unmaskRules?: boolean;\n value?: string;\n }>(),\n {\n counter: null,\n dataTest: 'masked-text-field',\n rules: () => [],\n tokens: null,\n unmaskRules: true,\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n 'keyup': [event: KeyboardEvent];\n 'keydown': [event: KeyboardEvent];\n 'keypress': [event: KeyboardEvent];\n 'input': [value: string];\n 'focus': [event: Event];\n 'blur': [event: Event];\n 'change': [value: string];\n 'input:masked': [value: string];\n}>();\n\ndefineSlots<{\n 'label'?: () => VNode[];\n 'prepend-inner'?: () => VNode[];\n 'append'?: () => VNode[];\n 'message'?: () => VNode[];\n}>();\n\nconst { maxlength, minlength, value } = toRefs(props);\n\nconst textField = ref<InstanceType<typeof CTextField> | null>(null);\nconst input = computed(() => textField.value?.input ?? null);\nconst maskOptions = computed<MaskInputOptions>(() => {\n return {\n mask: props.mask,\n tokens: {\n // NOTE (ej): For the EBT Card Number we accept a mask 'N' from the server\n // to hide all but the last 4 digits. e.g. XXXXXXXXXXXXXXX2114\n N: { pattern: /[0-9X]/ },\n ...props.tokens,\n },\n onMaska: (detail: MaskaDetail): void => {\n emit('input', detail.unmasked);\n emit('input:masked', detail.masked);\n },\n };\n});\n\nconst { maskedValue, mask: inputMask, unmaskedValue } = useInputMask(input, value, maskOptions);\nconst maskedMinLength = useMaskedMinLength(minlength, value, maskOptions);\nconst maskedMaxLength = useMaskedMaxLength(maxlength, maskOptions);\nconst counterValue = computed<number>(() => unmaskedValue.value.length);\n\nconst unmaskedRules = computed<Rules<string>>(() => {\n return props.rules.map((rule) => {\n return (value): string | boolean => {\n const unmaskedValue = inputMask.value?.unmasked(value) ?? value;\n return rule(unmaskedValue);\n };\n });\n});\n\ndefineExpose({ input });\n</script>\n","export function parseDateFromString(dateString: string): Date | null {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n}\n\nexport function calculateAge(dob: Date): number {\n // https://stackoverflow.com/a/7091965/814589\n const today = new Date();\n let age = today.getFullYear() - dob.getFullYear();\n const monthDiff = today.getMonth() - dob.getMonth();\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < dob.getDate())) {\n age--;\n }\n return age;\n}\n","import { calculateAge, parseDateFromString } from './dates';\n\nexport type validator = (v: string) => boolean;\nexport type rule = (v: string) => boolean | string;\n\n// https://gist.github.com/ShirtlessKirk/2134376\nconst makeLuhnChecker = (arr: number[]): ((s: string) => boolean) => {\n return (ccNum: string): boolean => {\n let len = ccNum.length;\n let bit = 1;\n let sum = 0;\n let val = 0;\n while (len) {\n val = parseInt(ccNum.charAt(--len), 10);\n bit ^= 1;\n sum += bit ? arr[val] : val;\n }\n return sum > 0 && sum % 10 === 0;\n };\n};\n\nexport const isLuhnValid = makeLuhnChecker([0, 2, 4, 6, 8, 1, 3, 5, 7, 9]);\n\nexport function createMinLengthValidator(minLength: number): validator {\n return (value: string): boolean => {\n return value.length >= minLength;\n };\n}\n\nexport function createMaxLengthValidator(maxLength: number): validator {\n return (value: string): boolean => {\n return value.length <= maxLength;\n };\n}\n\nexport function ruleFromValidator(validator: validator, errorMessage: string): rule {\n return (v): string | boolean => (v && validator(v) ? true : errorMessage);\n}\n\nexport function minLengthRule(minLength: number, errorMessage: string): rule {\n return ruleFromValidator(createMinLengthValidator(minLength), errorMessage);\n}\n\nexport function maxLengthRule(maxLength: number, errorMessage: string): rule {\n return ruleFromValidator(createMaxLengthValidator(maxLength), errorMessage);\n}\n\nexport function isValidDateInAgeRange(\n minAge?: number | null | undefined,\n maxAge?: number | null | undefined\n): rule {\n return (v: string): boolean | string => {\n const dobDate = parseDateFromString(v);\n const age = dobDate ? calculateAge(dobDate) : null;\n const maxAgeTruthy = maxAge !== null && maxAge !== undefined;\n const minAgeTruthy = minAge !== null && minAge !== undefined;\n if (age === null || (maxAgeTruthy && age > maxAge) || (minAgeTruthy && age < minAge)) {\n return false;\n }\n\n return true;\n };\n}\n\n// Uses the same logic that is enforced by providers-identity.\nexport function isValidEmail(email: string): boolean {\n return /^[A-Z0-9]+([-.+_]+[A-Z0-9]+)*@([A-Z0-9]([A-Z0-9-]{0,61}[A-Z0-9])?\\.)+([A-Z]{2,6}|[A-Z0-9-]{2,})$/i.test(\n email\n );\n}\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n :data-test=\"dataTest\"\n :value=\"formattedDate\"\n inputmode=\"numeric\"\n name=\"dob\"\n :label=\"computedLabel\"\n :placeholder=\"computedPlaceholder\"\n :mask=\"mask\"\n :minlength=\"dateLength\"\n :maxlength=\"dateLength\"\n :unmask-rules=\"false\"\n :rules=\"computedRules\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n @blur=\"$emit('blur', $event)\"\n @focus=\"$emit('focus', $event)\"\n @input=\"emitIsoDate($event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from 'dayjs';\nimport type { VNode } from 'vue';\nimport { computed, ref, watch } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport {\n isValidDateInAgeRange,\n minLengthRule as createMinLengthRule,\n} from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test attribute for the input. */\n dataTest?: string;\n /** A unique id for the input. */\n id?: string;\n /** The input's label text. */\n label?: string | null;\n /** The input's placeholder. */\n placeholder?: string;\n /** Additional validation rules. */\n rules?: Rules<string>;\n /** The value of the input, must have the format YYYY-MM-DD or YYYY. */\n value?: string;\n /**\n * Toggles the field's year only variant. Changes default label, placeholder,\n * mask and validation behavior\n */\n yearOnly?: boolean;\n }>(),\n {\n dataTest: 'dob-field',\n id: undefined,\n label: null,\n placeholder: '',\n rules: () => [],\n value: '',\n yearOnly: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'blur', event: Event): void;\n (e: 'focus', event: Event): void;\n (e: 'change', event: Event): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst parseDate = (value: string): string => {\n if (props.yearOnly) {\n return value;\n }\n\n if (!value) {\n return '';\n }\n\n const [year, month, day] = value.split('-');\n if (!year || !month || !day) {\n console.warn(`Invalid date format. Expected YYYY-MM-DD, received: ${value}.`);\n return '';\n }\n\n return `${month}${day}${year}`;\n};\n\nconst formattedDate = ref<string>(parseDate(props.value));\n\nlet lastEmittedValue = props.value;\n\nwatch(\n () => props.value,\n (newValue: string) => {\n if (newValue !== lastEmittedValue) {\n formattedDate.value = props.yearOnly ? newValue : parseDate(newValue);\n }\n }\n);\n\nconst emitIsoDate = (value: string): void => {\n if (props.yearOnly) {\n emit('input', value);\n } else {\n const month = value.substring(0, 2);\n const day = value.substring(2, 4);\n const year = value.substring(4, 8);\n lastEmittedValue = year && month && day ? `${year}-${month}-${day}` : '';\n emit('input', lastEmittedValue);\n }\n};\n\nconst defaultLabel = computed(() => {\n return props.yearOnly ? t('Year of birth') : t('Date of birth');\n});\n\nconst defaultPlaceholder = computed(() => {\n return props.yearOnly ? t('YYYY') : t('MM/DD/YYYY');\n});\n\nconst validationMessage = computed(() => {\n const inputLabel = props.yearOnly ? t('year of birth') : t('date of birth');\n return t('Please enter a valid {inputLabel}', { inputLabel });\n});\n\nconst defaultRules = computed(() => {\n const minLengthRule = createMinLengthRule(props.yearOnly ? 4 : 10, validationMessage.value);\n const maxAgeRule = (v: string): boolean | string =>\n isValidDateInAgeRange(0, 125)(v) || validationMessage.value;\n const validDateRule = (v: string): boolean | string =>\n dayjs(v, 'MM/DD/YYYY', true).isValid() || validationMessage.value;\n\n return [minLengthRule, maxAgeRule, !props.yearOnly ? validDateRule : undefined].filter(\n Boolean\n ) as Rules<string>;\n});\n\nconst computedLabel = computed(() => props.label || defaultLabel.value);\nconst computedPlaceholder = computed(() => props.placeholder || defaultPlaceholder.value);\nconst computedRules = computed(() => [...defaultRules.value, ...props.rules]);\nconst dateLength = computed(() => (props.yearOnly ? 4 : 8));\nconst mask = computed(() => (props.yearOnly ? '####' : '##/##/####'));\n</script>\n","<template>\n <div\n class=\"c-select\"\n :class=\"{\n 'c-select--disabled': disabled,\n 'c-select--invalid': !isValidationValid,\n }\"\n :data-test=\"dataTest\"\n >\n <label\n :for=\"id\"\n class=\"c-select__label\"\n :class=\"{ 'c-select__label--hidden': hideLabel }\"\n :data-test=\"`${dataTest}-label`\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </label>\n <div class=\"c-select__input-container\">\n <select\n :id=\"id\"\n ref=\"select\"\n class=\"c-select__input\"\n :class=\"{\n 'c-select__input--has-value': inputValue && !disabled,\n 'c-select__input--invalid': !isValidationValid,\n 'c-select__input--loading': loading,\n 'c-select__input--disabled': disabled,\n }\"\n :aria-label=\"ariaLabel || label\"\n :data-test=\"`${dataTest}-select`\"\n :value=\"inputValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n @input=\"onInput\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @keydown=\"$emit('keydown', $event)\"\n v-on=\"validationListeners\"\n >\n <option v-if=\"placeholder\" value disabled selected>{{ placeholder }}</option>\n <option\n v-for=\"item in items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n data-test=\"option\"\n >\n {{ item.label }}\n </option>\n </select>\n <CLoader v-if=\"loading\" small class=\"c-select__icon\" data-test=\"select-icon-loading\" />\n <FontAwesomeIcon v-else class=\"c-select__icon\" :icon=\"faChevronDown\" />\n </div>\n <CValidationMessage\n class=\"c-select__message\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faChevronDown } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { ref, toRefs } from 'vue';\n\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\ninterface SelectItem {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Overrides label for screenreader-only */\n ariaLabel?: string;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Controls whether the select is disabled */\n disabled?: boolean;\n /**\n * Hides the validation message area. Defaults to `false` (show message area even\n * when valid), so validations transition in gracefully.\n *\n * If set to 'auto', the validation message area will only display if there is a message.\n */\n hideDetails?: boolean | 'auto';\n /** Hides the label and instead labels the field with `aria-label` */\n hideLabel?: boolean;\n /** Assigns the select input's id */\n id?: string;\n /** List of options like `{ label: 'Yes', value: 'yes' }` */\n items?: SelectItem[];\n /** The select's label, both visual and screenreader-only */\n label?: string;\n /** Controls whether the select is loading */\n loading?: boolean;\n /** Set the select's placeholder text */\n placeholder?: string;\n /** If true, the select will be required */\n required?: boolean;\n /**\n * An array of functions that either return either true / false or a string\n * containing an error message. The component passes the input value as an\n * argument. The input field will enter an error state if a function does\n * not return true.\n */\n rules?: ((value: string) => string | boolean)[];\n /** Controls the value of the select */\n value?: string;\n }>(),\n {\n dataTest: 'select',\n disabled: false,\n hideDetails: false,\n hideLabel: false,\n items: () => [],\n loading: false,\n required: false,\n rules: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'focus', event: FocusEvent): void;\n (e: 'blur', event: FocusEvent): void;\n (e: 'keydown', event: KeyboardEvent): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { id, value, rules, required } = toRefs(props);\nconst idWithFallback = useId(id);\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => emit('input', newValue),\n});\nconst select = ref<HTMLSelectElement | null>(null);\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n startValidating,\n clearValidations,\n} = useValidations({\n id: idWithFallback,\n field: select,\n value: inputValue,\n rules,\n required,\n validateOn: 'blur',\n});\n\nfunction onInput(event: Event): void {\n const target = event.target as HTMLSelectElement;\n inputValue.value = target.value;\n}\n\ndefineExpose({ startValidating, clearValidations });\n</script>\n\n<style scoped lang=\"scss\">\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-select {\n display: flex;\n flex-direction: column;\n\n &--disabled {\n color: $color-text-disabled;\n }\n}\n\n.c-select__label {\n @include body-emphasized;\n\n margin-bottom: 8px;\n transition: color $sl-field-transition-duration ease;\n\n &--hidden {\n @include sr-only;\n }\n}\n\n.c-select__input-container {\n align-items: center;\n display: flex;\n position: relative;\n}\n\n.c-select__icon {\n pointer-events: none;\n position: absolute;\n right: 16px;\n}\n\n.c-select__input {\n appearance: none;\n background-color: $color-white;\n border: $border-width solid $color-border;\n border-radius: $border-radius-next;\n color: $color-placeholder-text;\n cursor: pointer;\n flex-grow: 1;\n letter-spacing: $letter-spacing-extend-small;\n max-width: 100%;\n min-height: $button-size-large;\n outline: 0.5px solid transparent;\n padding: 0 36px 0 16px;\n text-overflow: ellipsis;\n transition:\n border-color ease 0.2s,\n outline-color ease 0.2s;\n\n &:focus {\n border-color: $color-black;\n }\n\n &--has-value {\n color: $color-black;\n }\n\n &--invalid {\n border-color: $color-black;\n outline-color: $color-black;\n }\n\n &[disabled] {\n background-color: $color-gray-100;\n }\n}\n\n.c-select__message {\n margin-top: 4px;\n}\n</style>\n","<template>\n <div :id=\"id\" class=\"c-dob-select\" :data-test=\"dataTest\">\n <slot name=\"label\">\n <label\n v-if=\"!hideLabel\"\n class=\"c-dob-select__label\"\n :for=\"`${id}-month`\"\n :data-test=\"`${dataTest}-label`\"\n >{{ computedLabel }}</label\n >\n </slot>\n <div class=\"c-dob-select__container\">\n <c-select\n :id=\"`${id}-month`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localMonth\"\n :data-test=\"`${dataTest}-month`\"\n :aria-label=\"$t('Month')\"\n :placeholder=\"$t('Month')\"\n :items=\"monthOptions\"\n :rules=\"monthRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localMonth = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n <c-select\n :id=\"`${id}-day`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localDay\"\n :aria-label=\"$t('Day')\"\n :placeholder=\"$t('Day')\"\n :data-test=\"`${dataTest}-day`\"\n :items=\"dayOptions\"\n :rules=\"dayRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localDay = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n <c-select\n :id=\"`${id}-year`\"\n class=\"c-dob-select__field\"\n hide-label\n hide-details\n :value=\"localYear\"\n :aria-label=\"$t('Year')\"\n :placeholder=\"$t('Year')\"\n :data-test=\"`${dataTest}-year`\"\n :items=\"yearOptions\"\n :rules=\"yearRules\"\n :required=\"required\"\n :disabled=\"disabled\"\n @input=\"(localYear = $event) && emitDate()\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n />\n </div>\n <CValidationMessage\n class=\"c-dob-select__messages\"\n :data-test=\"`${dataTest}-messages`\"\n :validation-message=\"message\"\n :hide=\"hideDetails\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport dayjs from 'dayjs';\nimport type { VNode } from 'vue';\nimport { computed, ref, watch } from 'vue';\n\nimport CSelect from '@propelinc/citrus-ui/src/components/CSelect.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport {\n type Rules,\n useFormValidationSupport,\n} from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n required?: boolean;\n rules?: Rules<string>;\n hideLabel?: boolean;\n hideDetails?: boolean;\n value?: string;\n disabled?: boolean;\n }>(),\n {\n dataTest: 'dob-select',\n id: undefined,\n label: null,\n required: false,\n rules: () => [],\n hideLabel: false,\n hideDetails: false,\n value: '',\n disabled: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: string): void;\n (e: 'focus'): void;\n (e: 'blur'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst computedLabel = computed(() => props.label ?? t('Date of birth'));\n\nconst localMonth = ref('');\nconst localDay = ref('');\nconst localYear = ref('');\n\nconst hasError = ref(props.required && props.value === '');\nconst messages = ref<string[]>([]);\n\nconst localValue = computed(() => {\n if (localDay.value && localMonth.value && localYear.value) {\n return `${localYear.value}-${localMonth.value}-${localDay.value}`;\n }\n return '';\n});\n\nconst monthRules = computed(() => {\n if (!props.required && !localMonth.value) {\n return [];\n }\n return [(): boolean => localMonth.value !== ''];\n});\nconst dayRules = computed(() => {\n if (!props.required && !localDay.value) {\n return [];\n }\n return [(): boolean => localDay.value !== ''];\n});\nconst yearRules = computed(() => {\n if (!props.required && !localYear.value) {\n return [];\n }\n return [(): boolean => localYear.value !== ''];\n});\nconst message = computed(() => messages.value[0] ?? '');\n\nconst monthOptions = Array.from({ length: 12 }, (_, i) => ({\n value: (i + 1).toString().padStart(2, '0'),\n label: dayjs().set('month', i).format('MMM'),\n}));\n\nconst dayOptions = computed(() => {\n const year = Number(localYear.value) || 2000;\n const month = Number(localMonth.value) - 1 || 0;\n const daysInMonth = dayjs().year(year).month(month).daysInMonth();\n return Array.from({ length: daysInMonth }, (_, i) => {\n const day = (i + 1).toString();\n return { value: day.padStart(2, '0'), label: day };\n });\n});\n\nconst currentYear = dayjs().year();\nconst yearOptions = Array.from({ length: 120 }, (_, age) => {\n const year = (currentYear - age).toString();\n return { value: year, label: year };\n});\n\nconst validationMessage = t('Please enter a valid {inputLabel}', {\n inputLabel: t('date of birth'),\n});\n\nconst localRules = computed(() => {\n if (!props.required && !localValue.value) {\n return [];\n }\n const validDateRule = (v: string): boolean | string =>\n dayjs(v, 'YYYY-MM-DD', true).isValid() || validationMessage;\n return [validDateRule, ...props.rules];\n});\n\nconst valid = computed(() => !hasError.value);\n\nconst validate = (): boolean => {\n messages.value = localRules.value\n .map((validation) => {\n const validationResult = validation(localValue.value);\n return typeof validationResult === 'string' ? validationResult : '';\n })\n .filter((message) => message !== '');\n\n hasError.value = (props.required && localValue.value === '') || messages.value.length > 0;\n return !hasError.value;\n};\n\nconst emitDate = (): void => {\n if (!localValue.value) {\n return;\n }\n\n if (!validate()) {\n // NOTE(ram): An invalid date can only be caused by the day being invalid.\n localDay.value = '';\n emit('input', '');\n return;\n }\n\n emit('input', localValue.value);\n};\n\nwatch(\n () => props.value,\n (value) => {\n if (!value || value === localValue.value) {\n return;\n }\n\n const date = dayjs(value, 'YYYY-MM-DD', true);\n if (!date.isValid()) {\n console.error('Invalid date in CDobSelect', value);\n return;\n }\n\n localMonth.value = date.format('MM');\n localDay.value = date.format('DD');\n localYear.value = date.format('YYYY');\n },\n { immediate: true }\n);\n\nuseFormValidationSupport({\n id: props.id,\n valid,\n validate,\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-dob-select__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 4px;\n}\n\n.c-dob-select__container {\n display: flex;\n gap: 12px;\n}\n\n.c-dob-select__field {\n flex: auto;\n}\n\n.c-dob-select__messages {\n margin-top: 4px;\n}\n</style>\n","<template>\n <CTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n :value=\"value\"\n :data-test=\"dataTest\"\n type=\"email\"\n name=\"email\"\n :rules=\"[...defaultRules, ...rules]\"\n :label=\"label || $t('Email')\"\n :placeholder=\"placeholder || $t('example@email.com')\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CTextField from '@propelinc/citrus-ui/src/components/CTextField.vue';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { isValidEmail } from '@propelinc/shared-utils';\n\nwithDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string | null;\n placeholder?: string | null;\n rules?: Rules<string>;\n value?: string;\n }>(),\n {\n dataTest: 'email-field',\n id: undefined,\n label: null,\n placeholder: null,\n rules: (): Rules<string> => [],\n value: '',\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = [\n (v: string): string | boolean =>\n !v || isValidEmail(v)\n ? true\n : t('Please enter a valid {inputLabel}', { inputLabel: t('email') }),\n];\n</script>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const ANIMATIONS_DISABLED = Symbol('animations-disabled') as InjectionKey<Ref<boolean>>;\n","<template>\n <div\n data-test=\"expand-transition\"\n class=\"c-expand-transition\"\n :class=\"{ 'c-expand-transition--disabled': isDisabled }\"\n :style=\"{ height: isDisabled ? undefined : height }\"\n >\n <div ref=\"content\" class=\"c-expand-transition__content\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, inject, ref } from 'vue';\n\nimport { useResizeObserver } from '@propelinc/citrus-ui/src/composables/elements';\nimport { ANIMATIONS_DISABLED } from '@propelinc/citrus-ui/src/services/injections/animations';\n\ndefineSlots<{ default: () => VNode[] }>();\n\nconst props = withDefaults(defineProps<{ disabled?: boolean }>(), { disabled: false });\n\nconst injectedDisabled = inject(ANIMATIONS_DISABLED, ref(false));\nconst isDisabled = computed(() => props.disabled || injectedDisabled.value);\nconst content = ref<HTMLElement | null>(null);\nconst height = ref<string>('auto');\n\nuseResizeObserver(content, ([entry]) => {\n height.value = `${entry.contentRect.height}px`;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-expand-transition {\n overflow: hidden;\n transition: height 300ms ease;\n}\n\n.c-expand-transition__content {\n // Create a new block formatting context that includes outer margins of children so\n // CExpandTransition measures the height correctly.\n overflow: hidden;\n}\n\n.c-expand-transition--disabled {\n transition: none;\n}\n</style>\n","<template>\n <label class=\"c-file-input\" :class=\"{ 'c-file-input--disabled': disabled }\">\n <p :id=\"`${idWithFallback}-label`\" class=\"c-file-input__label\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </p>\n <span :for=\"idWithFallback\" class=\"c-file-input__prompt\" :data-test=\"`${dataTest}-prompt`\">\n <slot name=\"prompt\">\n {{ prompt }}\n </slot>\n </span>\n <input\n :id=\"idWithFallback\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-file-input__input\"\n type=\"file\"\n :aria-describedby=\"`${idWithFallback}-files`\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :required=\"required\"\n @change=\"onFileChange\"\n />\n\n <div v-if=\"hasValue\" :id=\"`${idWithFallback}-files`\" class=\"c-file-input__files\">\n <span v-if=\"!Array.isArray(inputValue) && inputValue\" class=\"c-file-input__file\">{{\n inputValue.name\n }}</span>\n <template v-if=\"Array.isArray(inputValue)\">\n <span v-for=\"file in inputValue\" :key=\"file.name\" class=\"c-file-input__file\">\n {{ file.name }}\n </span></template\n >\n </div>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, toRefs } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\n\nconst props = withDefaults(\n defineProps<{\n /** A custom data-test string applied to the form field, text field and hide icon */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /** A unique id for the input */\n id: string;\n /** The input's label, both visual and screenreader-only */\n label: string;\n /** Allow the user to upload multiple files */\n multiple?: boolean;\n /** Placholder text to display before a user has selected any files */\n prompt: string;\n /** Controls whether the input is required */\n required?: boolean;\n /** The input's value. Either one file or an array of files */\n value?: File[] | File | null;\n }>(),\n {\n dataTest: 'file-input',\n disabled: false,\n multiple: false,\n required: false,\n value: null,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: File[] | File | null): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n prompt?: () => VNode[];\n}>();\n\nconst { id, value } = toRefs(props);\nconst idWithFallback = useId(id);\nconst inputValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('input', newValue);\n },\n});\nconst hasValue = computed(() => {\n if (Array.isArray(inputValue.value)) {\n return inputValue.value.length > 0;\n }\n return !!inputValue.value;\n});\n\nfunction onFileChange(event: Event): void {\n const files = (event.target as HTMLInputElement).files;\n if (!files) {\n inputValue.value = null;\n } else {\n inputValue.value = props.multiple ? Array.from(files) : files[0];\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/button';\n\n.c-file-input {\n align-items: flex-start;\n display: flex;\n flex-direction: column;\n position: relative;\n\n &:focus-within {\n .c-file-input__prompt {\n outline: var(--sl-focus-ring);\n outline-offset: var(--sl-focus-ring-offset);\n }\n }\n}\n\n.c-file-input--disabled {\n &:hover {\n .c-file-input__prompt {\n @include button-theme($color-gray-300, $color-gray-300, transparent);\n }\n }\n\n .c-file-input__label {\n color: $color-text-disabled;\n }\n\n .c-file-input__prompt {\n @include button-theme($color-gray-300, $color-gray-300, transparent);\n }\n\n .c-file-input__input {\n cursor: not-allowed;\n }\n}\n\n.c-file-input__label {\n @include body-emphasized;\n\n margin-bottom: var(--sl-spacing-3x-small);\n}\n\n.c-file-input__prompt {\n // NOTE(slanden): these styles are largely copied from sl-button defaults.\n @include button-theme-secondary;\n\n align-items: center;\n border-radius: var(--sl-input-border-radius-medium);\n border-style: solid;\n border-width: $border-width;\n display: inline-flex;\n font-family: var(--sl-input-font-family);\n font-weight: var(--sl-font-weight-semibold);\n height: $button-size-medium;\n justify-content: center;\n padding: 0 20px;\n transition: background-color 0.2s ease-in-out;\n}\n\n.c-file-input__input {\n cursor: pointer;\n height: 100%;\n inset: 0;\n opacity: 0;\n\n // NOTE(slanden): Rather than using the sr-only utility, we actually want to have\n // the file input take up the full space of the label. This allows us to support\n // default file input behavior, like drag-and-drop upload.\n position: absolute;\n width: 100%;\n}\n\n.c-file-input__files {\n display: flex;\n flex-direction: column;\n gap: var(--sl-spacing-3x-small);\n margin-top: var(--sl-spacing-2x-small);\n}\n\n.c-file-input__file {\n @include caption;\n\n word-break: break-word;\n}\n</style>\n","<template>\n <CButtonStack\n ref=\"footer\"\n data-test=\"fixed-page-footer\"\n :tag=\"tag\"\n large\n class=\"c-fixed-page-footer\"\n >\n <div class=\"c-fixed-page-footer__content\">\n <slot />\n </div>\n </CButtonStack>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, onBeforeUnmount, ref } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport { useResizeObserver } from '@propelinc/citrus-ui/src/composables/elements';\n\nwithDefaults(\n defineProps<{\n /** The HTML tag to render as. Avoid changing this if possible. */\n tag?: string;\n }>(),\n {\n tag: 'footer',\n }\n);\n\nconst emit = defineEmits<{\n 'change:height': [height: number];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst footer = ref<InstanceType<typeof CButtonStack> | null>(null);\nconst footerElement = computed(() => (footer.value?.$el as HTMLElement) ?? null);\nuseResizeObserver(footerElement, ([entry]) => emit('change:height', entry.contentRect.height));\nonBeforeUnmount(() => emit('change:height', 0));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$gradient-height: 32px;\n\n.c-fixed-page-footer {\n bottom: 0;\n left: 0;\n position: fixed;\n right: 0;\n\n // This places the footer above any Swiper components in the body which have z-index 1.\n z-index: 1;\n\n &::before {\n // NOTE(mohan): We use rgba instead of `transparent` to avoid a bug in\n // Safari where the gradient starts as tranparent black and fades into a\n // gray.\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 0) 0,\n var(--fixed-page-footer-color, white) $gradient-height\n );\n content: '';\n inset: -$gradient-height 0 0;\n pointer-events: none;\n position: absolute;\n z-index: -1;\n }\n}\n\n// NOTE(mohan): ResizeObservers don't measure padding (at least not in all\n// browsers), so we have to add it to a child element.\n.c-fixed-page-footer__content {\n padding: 0 16px max(env(safe-area-inset-bottom, 0), 8px);\n}\n</style>\n","<template>\n <form ref=\"form\" :data-test=\"dataTest\" novalidate @submit.prevent=\"$emit('submit', $event)\">\n <slot />\n </form>\n</template>\n\n<script setup lang=\"ts\">\nimport scrollIntoViewIfNeeded from 'scroll-into-view-if-needed';\nimport type { VNode } from 'vue';\nimport { computed, onMounted, provide, ref, watch } from 'vue';\n\nimport { VALIDATIONS } from '@propelinc/citrus-ui/src/services/injections/forms';\nimport type { ValidationState } from '@propelinc/citrus-ui/src/types/CForm';\n\ninterface FormValidation {\n id: string;\n validate: () => boolean;\n valid: boolean;\n field?: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n}\n\nwithDefaults(\n defineProps<{\n dataTest?: string;\n }>(),\n {\n dataTest: 'form',\n }\n);\n\nconst emit = defineEmits<{\n submit: [event: Event];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst form = ref<HTMLFormElement | null>(null);\nconst inputs = ref<Record<string, FormValidation>>({});\n\nprovide(VALIDATIONS, {\n register: (input: ValidationState) => {\n // NOTE(ram): Vue collapses the ref to input.field automatically so we need to adjust types.\n inputs.value = { ...inputs.value, [input.id]: input as unknown as FormValidation };\n },\n unregister: (id: string) => {\n const filteredInputs = { ...inputs.value };\n delete filteredInputs[id];\n inputs.value = filteredInputs;\n },\n});\n\nconst inputArray = computed(() => Object.values(inputs.value));\nconst getInvalidInputs = (startValidating?: boolean): FormValidation[] => {\n return inputArray.value.filter((input) => {\n return startValidating ? !input.validate() : !input.valid;\n });\n};\n\n// NOTE(mohan): I would love for this to be a computed property, but Vue 2's\n// the reactivity system can't seem to track refs inside of refs, though it\n// should work in Vue 3.\nwatch(getInvalidInputs, (newInvalidInputs, oldInvalidInputs) => {\n const newValid = newInvalidInputs.length === 0;\n const oldValid = oldInvalidInputs?.length === 0;\n if (newValid !== oldValid) {\n emit('input', newValid);\n }\n});\nonMounted(() => emit('input', getInvalidInputs().length === 0));\n\nconst validate = (): boolean => {\n if (!form.value) {\n return false;\n }\n\n const invalidInputs = getInvalidInputs(true);\n const firstInvalidField = invalidInputs.find((input) => input.field)?.field;\n if (firstInvalidField) {\n scrollIntoViewIfNeeded(firstInvalidField, {\n behavior: 'smooth',\n block: 'center',\n scrollMode: 'if-needed',\n });\n }\n\n return invalidInputs.length === 0;\n};\n\ndefineExpose({ validate, inputs: inputArray });\n</script>\n","<template>\n <div class=\"c-label\" :data-test=\"dataTest\">\n <slot name=\"icon\">\n <FontAwesomeIcon v-if=\"icon\" data-test=\"label-icon\" :icon=\"icon\" size=\"xs\" />\n </slot>\n <div class=\"c-label__text\" data-test=\"label-text\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\n\nwithDefaults(\n defineProps<{\n /** Specifies the label's icon, overwritten if icon slot is used */\n icon?: string | string[] | IconDefinition | null;\n /** A custom data test string */\n dataTest?: string;\n }>(),\n {\n icon: null,\n dataTest: 'label',\n }\n);\n\ndefineSlots<{\n /** Icon slot, overrides icon prop */\n icon?: () => VNode[];\n /** Default content */\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-label {\n align-items: center;\n background-color: $color-gray-100;\n border-radius: 4px;\n color: $color-text-secondary;\n display: inline-flex;\n font-size: $font-size-small;\n font-weight: $font-weight-semibold;\n gap: 4px;\n height: 24px;\n margin-bottom: 6px;\n padding: 0 12px;\n}\n\n.c-label:not(:last-child) {\n margin-right: 8px;\n}\n</style>\n","<template>\n <div class=\"c-list-item-content\" data-test=\"list-item-content\">\n <slot>\n <div\n v-if=\"title || titleSlotHasContent\"\n class=\"c-list-item-content__title\"\n data-test=\"list-item-title\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </div>\n <div\n v-if=\"label || labelSlotHasContent\"\n class=\"c-list-item-content__label\"\n data-test=\"list-item-label\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nwithDefaults(\n defineProps<{\n title?: string;\n label?: string;\n }>(),\n {\n title: '',\n label: '',\n }\n);\n\nconst titleSlotHasContent = useSlotHasContent('title');\nconst labelSlotHasContent = useSlotHasContent('label');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-list-item-content {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.c-list-item-content__title {\n @include subheadline;\n\n align-items: center;\n display: flex;\n\n & + .c-list-item-content__label {\n margin-top: 2px;\n }\n}\n</style>\n","<template>\n <div\n data-test=\"squared-icon\"\n :data-icon=\"icon\"\n :data-color=\"cssColor\"\n class=\"c-squared-icon\"\n :class=\"{ 'c-squared-icon--white-icon': useWhiteIcon, 'c-squared-icon--large': large }\"\n :style=\"{ backgroundColor: cssColor }\"\n >\n <slot>\n <FontAwesomeIcon v-if=\"icon\" data-test=\"squared-icon-icon\" :icon=\"icon\" />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed, onMounted } from 'vue';\n\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\nimport type { FaIconArray } from '@propelinc/citrus-ui/src/types/font-awesome';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\nconst props = withDefaults(\n defineProps<{\n /** The background color */\n color?: string;\n /** The Font Awesome icon to display */\n icon?: string | string[] | IconDefinition | null;\n /** Makes the icon and background larger */\n large?: boolean;\n }>(),\n {\n color: 'gray-100',\n icon: null,\n large: false,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nonMounted(() => {\n const enableCheck = process.env.VUE_APP_DEBUG === 'yes' || process.env.NODE_ENV === 'test';\n if (enableCheck && Array.isArray(props.icon)) {\n const [prefix, iconName] = props.icon as FaIconArray;\n if (prefix === 'fal') {\n console.error(\n `We no longer use light Font Awesome icons. Please change ['${prefix}', '${iconName}'] to ['far', '${iconName}'].`\n );\n }\n }\n});\n\nconst { cssColor } = usePaletteColor(() => props.color);\n\nconst useWhiteIcon = computed(() => props.color === 'black');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$squared-icon-size: 40px;\n$squared-icon-large-size: 56px;\n\n.c-squared-icon {\n align-items: center;\n border-radius: $border-radius;\n color: $color-text-primary;\n display: flex;\n font-size: $font-size-icon-medium;\n height: $squared-icon-size;\n justify-content: center;\n position: relative;\n width: $squared-icon-size;\n}\n\n.c-squared-icon--white-icon {\n color: $color-white;\n}\n\n.c-squared-icon--large {\n border-radius: $border-radius-next;\n font-size: $font-size-icon-large;\n height: $squared-icon-large-size;\n width: $squared-icon-large-size;\n}\n</style>\n","<template>\n <CSquaredIcon\n v-if=\"icon || iconSlotHasContent\"\n :icon=\"icon\"\n :color=\"iconColor\"\n class=\"c-list-item-icon\"\n >\n <slot name=\"icon\" />\n </CSquaredIcon>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport type { VNode } from 'vue';\n\nimport CSquaredIcon from '@propelinc/citrus-ui/src/components/CSquaredIcon.vue';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nwithDefaults(\n defineProps<{\n icon?: string | string[] | IconDefinition | null;\n iconColor?: string;\n }>(),\n {\n icon: null,\n iconColor: 'gray-100',\n }\n);\n\ndefineSlots<{\n icon?: () => VNode[];\n}>();\n\nconst iconSlotHasContent = useSlotHasContent('icon');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-list-item-icon {\n flex: none;\n}\n</style>\n","<template>\n <component\n :is=\"tag\"\n v-bind=\"allAttrs\"\n class=\"c-list-item d-flex flex-col justify-center w-full\"\n :class=\"{ 'c-list-item--is-tappable': isTappable }\"\n :href=\"routerDestinationOrHref\"\n :target=\"target\"\n @click=\"navigate\"\n >\n <div\n class=\"d-flex flex-row gap-3 justify-between w-full p-4\"\n :class=\"{\n 'align-start': align === 'top',\n 'align-center': align !== 'top',\n }\"\n >\n <slot name=\"prepend\">\n <CListItemIcon v-if=\"icon || iconSlotHasContent\" :icon=\"icon\" :icon-color=\"iconColor\">\n <template #icon>\n <slot name=\"icon\" />\n </template>\n </CListItemIcon>\n </slot>\n\n <div class=\"flex-1 d-flex flex-row gap-3 justify-between align-center\">\n <CListItemContent :title=\"title\" :label=\"label\">\n <template v-for=\"slotName in ['title', 'label', 'default']\" #[slotName]>\n <slot :name=\"slotName\" />\n </template>\n </CListItemContent>\n\n <slot name=\"append\">\n <div\n v-if=\"renderActionSlot\"\n data-test=\"list-item-action\"\n class=\"c-list-item__append__action flex-shrink-0\"\n >\n <slot name=\"action\">\n <FontAwesomeIcon\n data-test=\"list-item-action-icon\"\n class=\"c-list-item__append__action-icon\"\n fixed-width\n :icon=\"actionIcon ? actionIcon : faChevronRight\"\n />\n </slot>\n </div>\n </slot>\n </div>\n </div>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { faChevronRight } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { computed, mergeProps, toRefs, useAttrs } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CListItemContent from '@propelinc/citrus-ui/src/components/CListItemContent.vue';\nimport CListItemIcon from '@propelinc/citrus-ui/src/components/CListItemIcon.vue';\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** The Font Awesome icon to display */\n icon?: string | string[] | IconDefinition | null;\n /** The icon to display on the right side for clickable items, defaulting to right arrow */\n actionIcon?: string | string[] | IconDefinition | null;\n /** Color of the icon background */\n iconColor?: string;\n /** Emphasized text above body text. Overridden by the default slot. */\n title?: string;\n /** Plain body copy. Overridden by the default slot. */\n label?: string;\n /** Router location for links within the app */\n to?: RouteLocationRaw;\n /** HTML target attribute for links to outside the app */\n target?: string;\n /** Location for links to outside the app */\n href?: string;\n /** Changes alignment of icon and action icon */\n align?: 'top' | 'center';\n /** Overrides default behavior to display a chevron in the action slot */\n hideAction?: boolean;\n }>(),\n {\n icon: null,\n actionIcon: null,\n iconColor: 'gray-100',\n title: undefined,\n label: undefined,\n to: undefined,\n target: undefined,\n href: undefined,\n align: 'center',\n hideAction: false,\n }\n);\n\nconst attrs = useAttrs();\n\nconst { to } = toRefs(props);\nconst { href: routerDestination, navigate } = useRouterLink(to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst isLink = computed(() => !!routerDestinationOrHref.value);\nconst isButton = computed(() => !!attrs.onClick);\nconst isTappable = computed(() => isLink.value || isButton.value);\n\nconst tag = computed(() => {\n if (isLink.value) {\n return 'a';\n } else if (isButton.value) {\n return 'button';\n } else {\n return 'div';\n }\n});\nconst tagAttrs = computed(() => {\n if (isButton.value) {\n return { type: 'button' };\n }\n return {};\n});\n\nconst actionSlotHasContent = useSlotHasContent('action');\n\nconst renderActionSlot = computed(() => {\n if (props.hideAction) {\n return false;\n }\n\n return isTappable.value || actionSlotHasContent.value;\n});\nconst iconSlotHasContent = useSlotHasContent('icon');\n\nconst allAttrs = computed(() => mergeProps(attrs, tagAttrs.value));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-list-item {\n background: transparent;\n color: $color-text-primary;\n min-height: 64px;\n outline: none;\n text-align: left;\n text-decoration: none;\n\n & + & {\n border-top: $border;\n }\n\n &:focus-visible {\n @include focus-ring;\n }\n}\n\n.c-list-item--is-tappable {\n appearance: none; // Needed to avoid browser default styles for buttons\n border: none; // Needed to avoid browser default styles for buttons\n cursor: pointer;\n}\n\n.c-list-item__append__action-icon {\n color: $color-text-secondary;\n font-size: $font-size-medium;\n}\n</style>\n","export default \"data:image/svg+xml,%3csvg%20width='30'%20height='37'%20viewBox='0%200%2030%2037'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_911_9050)'%3e%3cpath%20d='M7.39438%200.692966C7.39438%200.692966%206.35052%201.4649%205.56982%202.23683C5.3242%202.44735%205.35052%202.66665%205.36806%202.98244C5.44701%204.04384%205.64876%206.40349%207.25403%208.14033C8.85052%209.87718%2010.9119%209.64033%2010.9119%209.64033L15.2979%208.67542L7.39438%200.692966Z'%20fill='black'%20stroke='black'%20stroke-width='0.964912'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M0.482422%2022.6316C0.482422%2029.6754%206.42979%2035.386%2013.7719%2035.386C21.114%2035.386%2027.0614%2029.6754%2027.0614%2022.6316C27.0614%2015.5877%2021.114%209.8772%2013.7719%209.8772C6.42979%209.8772%200.482422%2015.5877%200.482422%2022.6316ZM7.8947%2022.6316C7.8947%2025.9123%2010.6666%2028.5702%2014.0877%2028.5702C17.5087%2028.5702%2020.2807%2025.9123%2020.2807%2022.6316C20.2807%2019.3509%2017.5087%2016.693%2014.0877%2016.693C10.6666%2016.693%207.8947%2019.3509%207.8947%2022.6316Z'%20fill='black'%20stroke='black'%20stroke-width='0.964912'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M2.73633%2022.0965C2.73633%2029.4912%208.72755%2035.4824%2016.1223%2035.4824C23.517%2035.4824%2029.5083%2029.4912%2029.5083%2022.0965C29.5083%2014.7017%2023.517%208.71051%2016.1223%208.71051C8.72755%208.71051%202.73633%2014.7017%202.73633%2022.0965ZM9.88545%2022.0965C9.88545%2025.5438%2012.6749%2028.3333%2016.1223%2028.3333C19.5697%2028.3333%2022.3591%2025.5438%2022.3591%2022.0965C22.3591%2018.6491%2019.5697%2015.8596%2016.1223%2015.8596C12.6749%2015.8596%209.88545%2018.6491%209.88545%2022.0965Z'%20fill='%23FFC120'%20stroke='black'%20stroke-width='0.978516'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M4.88672%2013.1491C7.41303%2010.9912%209.76391%209.74562%2013.3078%209.00001'%20stroke='black'%20stroke-width='0.973684'%20stroke-miterlimit='10'%20stroke-linecap='round'/%3e%3cpath%20d='M9.53516%2034.7193C12.7808%2035.7193%2015.7281%2035.8597%2018.9211%2035.193'%20stroke='black'%20stroke-width='0.973684'%20stroke-miterlimit='10'%20stroke-linecap='round'/%3e%3cpath%20d='M15.2988%208.67545C15.4742%208.64036%2015.6321%208.54387%2015.7286%208.38598C16.4567%207.21054%2016.1672%204.71054%2014.6146%203.28948C12.869%201.7544%2011.5707%202.0965%208.44792%200.614046C7.6409%200.228081%206.99178%200.736853%207.11459%201.71054C7.23739%202.68422%208.04441%206.3772%2010.3339%207.91229C11.9655%209.00001%2014.4655%208.85966%2015.2988%208.68422V8.67545Z'%20fill='%238BC95A'%20stroke='black'%20stroke-width='0.978516'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_911_9050'%3e%3crect%20width='30'%20height='36.0877'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='120'%20height='38'%20viewBox='0%200%20120%2038'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M40.3101%2022.5039H36.5387C36.383%2022.5039%2036.2563%2022.6306%2036.2563%2022.7863V29.808C36.2563%2030.018%2036.0862%2030.1881%2035.8763%2030.1881H32.2206C32.0107%2030.1881%2031.8406%2030.018%2031.8406%2029.808V8.18892C31.8406%207.98261%2032.0107%207.8125%2032.2206%207.8125H40.3101C44.5847%207.8125%2048.0594%2010.5488%2048.0594%2015.1419C48.0594%2019.735%2044.5847%2022.5039%2040.3101%2022.5039ZM36.2563%2018.2764C36.2563%2018.432%2036.383%2018.5587%2036.5387%2018.5587H40.1364C42.4275%2018.5587%2043.6437%2017.1109%2043.6437%2015.1383C43.6437%2013.1657%2042.4275%2011.7505%2040.1364%2011.7505H36.5387C36.383%2011.7505%2036.2563%2011.8772%2036.2563%2012.0328V18.2728V18.2764Z'%20fill='black'/%3e%3cpath%20d='M53.7021%2014.5594V15.3919C53.7021%2015.533%2053.8723%2015.5945%2053.9664%2015.4932C54.7771%2014.6064%2056.2937%2014.0454%2057.9116%2014.0454H58.9214C59.1313%2014.0454%2059.3015%2014.2155%2059.3015%2014.4255V17.7119C59.3015%2017.9219%2059.1313%2018.092%2058.9214%2018.092H57.879C55.1499%2018.092%2053.7021%2019.8438%2053.7021%2022.4064V29.8118C53.7021%2030.0218%2053.532%2030.1919%2053.3221%2030.1919H49.8329C49.623%2030.1919%2049.4529%2030.0218%2049.4529%2029.8118V14.5594C49.4529%2014.3495%2049.623%2014.1793%2049.8329%2014.1793H53.3221C53.532%2014.1793%2053.7021%2014.3495%2053.7021%2014.5594Z'%20fill='black'/%3e%3cpath%20d='M76.9102%2022.1999C76.9102%2027.0174%2073.1713%2030.6224%2068.2162%2030.6224C63.2611%2030.6224%2059.5222%2027.0174%2059.5222%2022.1999C59.5222%2017.3824%2063.2611%2013.7412%2068.2162%2013.7412C73.1713%2013.7412%2076.9102%2017.3462%2076.9102%2022.1999ZM63.7715%2022.1999C63.7715%2024.8639%2065.6898%2026.7134%2068.2198%2026.7134C70.7498%2026.7134%2072.6681%2024.8602%2072.6681%2022.1999C72.6681%2019.5396%2070.7462%2017.6502%2068.2198%2017.6502C65.6934%2017.6502%2063.7715%2019.5034%2063.7715%2022.1999Z'%20fill='black'/%3e%3cpath%20d='M87.5261%2030.6224C85.9046%2030.6224%2084.2505%2030.1193%2083.1538%2029.2181C83.0307%2029.1167%2082.8425%2029.2%2082.8425%2029.3629V36.6814C82.8425%2036.8914%2082.6724%2037.0615%2082.4625%2037.0615H78.9733C78.7634%2037.0615%2078.5933%2036.8914%2078.5933%2036.6814V14.5556C78.5933%2014.3457%2078.7634%2014.1756%2078.9733%2014.1756H82.4625C82.6724%2014.1756%2082.8425%2014.3457%2082.8425%2014.5556V15.0478C82.8425%2015.1781%2082.9909%2015.2469%2083.0886%2015.1637C84.1853%2014.2335%2085.8684%2013.7412%2087.5261%2013.7412C92.6803%2013.7412%2095.7134%2017.7842%2095.7134%2022.1637C95.7134%2026.5433%2092.6803%2030.6224%2087.5261%2030.6224ZM87.1895%2017.6502C84.931%2017.6502%2082.676%2019.1342%2082.676%2022.1637C82.676%2025.1932%2084.9346%2026.7134%2087.1895%2026.7134C89.7159%2026.7134%2091.4677%2024.625%2091.4677%2022.1637C91.4677%2019.7025%2089.7159%2017.6502%2087.1895%2017.6502Z'%20fill='black'/%3e%3cpath%20d='M112.989%2025.3344C113.264%2025.3344%20113.449%2025.6167%20113.337%2025.8664C111.983%2028.791%20108.917%2030.6224%20105.674%2030.6224C100.686%2030.6224%2097.0127%2027.0174%2097.0127%2022.1637C97.0127%2017.31%20100.549%2013.7412%20105.504%2013.7412C110.459%2013.7412%20113.829%2017.3824%20113.829%2022.0986C113.829%2022.5184%20113.829%2022.855%20113.796%2023.2351C113.778%2023.4305%20113.615%2023.5826%20113.42%2023.5826H101.801C101.609%2023.5826%20101.468%2023.7708%20101.53%2023.9518C102.091%2025.6601%20103.72%2026.717%20105.674%2026.717C106.955%2026.717%20108.114%2026.3515%20108.863%2025.4755C108.939%2025.3887%20109.044%2025.3344%20109.156%2025.3344H112.989ZM108.968%2020.4119C109.149%2020.4119%20109.286%2020.2418%20109.243%2020.0644C108.838%2018.4103%20107.332%2017.3788%20105.504%2017.3788C103.676%2017.3788%20102.033%2018.4393%20101.602%2020.0608C101.555%2020.2382%20101.696%2020.4119%20101.877%2020.4119H108.968Z'%20fill='black'/%3e%3cpath%20d='M120%208.18912V29.8082C120%2030.0182%20119.83%2030.1883%20119.62%2030.1883H116.131C115.921%2030.1883%20115.751%2030.0182%20115.751%2029.8082V8.18912C115.751%207.97919%20115.921%207.80908%20116.131%207.80908H119.62C119.83%207.80908%20120%207.97919%20120%208.18912Z'%20fill='black'/%3e%3cpath%20d='M13.725%207.37832C14.1268%206.19475%2013.7757%204.37054%2012.556%203.25212C11.6909%202.49203%2010.9561%202.26762%2010.0259%201.98531C9.3672%201.78623%208.6252%201.56182%207.61899%201.08405C7.17018%200.8705%206.71774%200.892218%206.37751%201.14196C6.34132%201.1673%206.30512%201.19988%206.27255%201.22884C6.08795%201.37%205.40025%201.89481%204.85009%202.43412C4.50262%202.74539%204.52796%203.1001%204.54606%203.3607V3.3969C4.61483%204.24023%204.77046%206.22008%206.14224%207.7113C6.5802%208.18545%207.05435%208.49312%207.50317%208.69219C6.46438%209.15186%205.49436%209.73821%204.49539%2010.4947C4.29993%2010.6395%204.10448%2010.7915%203.91989%2010.9507C3.86922%2010.9905%203.81854%2011.0304%203.76787%2011.0738C3.74615%2011.0919%203.72806%2011.11%203.71358%2011.1281C1.43693%2013.1441%200%2016.0904%200%2019.3696C0%2024.3102%203.26476%2028.5016%207.74929%2029.8987C7.77463%2029.9095%207.79634%2029.9204%207.8253%2029.9276C9.39615%2030.3873%2010.8946%2030.6153%2012.3967%2030.6153C13.5332%2030.6153%2014.6697%2030.485%2015.8352%2030.2244C15.8388%2030.2244%2015.8461%2030.2208%2015.8497%2030.2208C21.0581%2029.1024%2024.9707%2024.4622%2024.9707%2018.9244C24.9707%2012.6555%2019.9505%207.53757%2013.7214%207.37469L13.725%207.37832ZM12.7333%2023.5827C11.738%2023.4379%2010.815%2022.9782%2010.0911%2022.2544C9.2007%2021.364%208.71207%2020.184%208.71207%2018.9244C8.71207%2017.2341%209.60608%2015.7502%2010.9489%2014.9213C11.0539%2014.9141%2011.1625%2014.9068%2011.271%2014.9068C13.7323%2014.9068%2015.7338%2016.9084%2015.7338%2019.3696C15.7338%2021.3169%2014.4779%2022.9746%2012.7369%2023.5827H12.7333Z'%20fill='black'/%3e%3cpath%20d='M11.9405%203.93626C11.2347%203.31371%2010.6447%203.13636%209.75796%202.86852C9.10284%202.66945%208.28846%202.42332%207.22433%201.91659C7.14832%201.8804%207.07231%201.8623%207.0144%201.8623C6.97459%201.8623%206.94201%201.86954%206.9203%201.88763C6.86238%201.93107%206.80447%202.06499%206.83705%202.30026C6.95649%203.20875%207.60438%205.79666%209.15713%206.83183C10.2502%207.56297%2012.0418%207.50506%2012.6897%207.36752C12.7151%207.36028%2012.7295%207.34942%2012.7368%207.33856C13.3449%206.34682%2012.6861%204.62034%2011.9405%203.93626Z'%20fill='%238BC95A'/%3e%3cpath%20d='M13.4209%208.29395C7.55737%208.29395%202.79053%2013.0644%202.79053%2018.9243C2.79053%2021.7656%203.89809%2024.4332%205.90327%2026.442C7.91208%2028.4508%2010.5796%2029.5547%2013.4209%2029.5547C19.2845%2029.5547%2024.0513%2024.7843%2024.0513%2018.9243C24.0513%2013.0644%2019.2808%208.29395%2013.4209%208.29395ZM17.4023%2022.9058C16.3382%2023.9699%2014.9266%2024.5526%2013.4209%2024.5526C11.9188%2024.5526%2010.5036%2023.9663%209.4395%2022.9058C8.37537%2021.8453%207.79264%2020.43%207.79264%2018.9243C7.79264%2015.8224%2010.319%2013.2961%2013.4209%2013.2961C16.5228%2013.2961%2019.0492%2015.8224%2019.0492%2018.9243C19.0492%2020.4264%2018.4628%2021.8416%2017.4023%2022.9058Z'%20fill='%23FFC120'/%3e%3c/svg%3e\"","<template>\n <img :src=\"src\" :alt=\"$t('{appName}')\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport propelIcon from '@propelinc/citrus-ui/src/assets/logos/propel/icon.svg';\nimport propelLockup from '@propelinc/citrus-ui/src/assets/logos/propel/lockup.svg';\n\nconst props = withDefaults(\n defineProps<{\n /** Show just the orange icon */\n icon?: boolean;\n }>(),\n {\n icon: false,\n }\n);\n\nconst src = computed(() => {\n return props.icon ? propelIcon : propelLockup;\n});\n</script>\n","<template>\n <sl-menu class=\"c-menu pa-0 elevation-4\" @sl-select=\"$emit('select', $event.detail.item)\">\n <slot />\n </sl-menu>\n</template>\n\n<script lang=\"ts\">\nexport type { default as SlMenuItem } from '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';\n</script>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu/menu.js';\n\ndefineEmits<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select: [item: any];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-menu {\n --sl-panel-border-width: $border-width;\n}\n</style>\n","<template>\n <sl-menu-item\n :type=\"checkable ? 'checkbox' : 'normal'\"\n :checked=\"checked\"\n class=\"menu-item\"\n :class=\"{ selectable }\"\n @click=\"onClick\"\n >\n <div slot=\"prefix\">\n <slot name=\"prepend-inner\">\n <template v-if=\"checkable\">\n <CCheckbox\n v-if=\"checkType === 'checkbox'\"\n :value=\"checked\"\n variant=\"minimal\"\n hide-details\n aria-hidden=\"true\"\n class=\"checkbox mr-3\"\n />\n <div v-else class=\"check-icon mr-3\">\n <FontAwesomeIcon v-if=\"checked\" :icon=\"faCheck\" />\n </div>\n </template>\n </slot>\n </div>\n <slot />\n </sl-menu-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { faCheck } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu-item/menu-item.js';\nimport CCheckbox from '@propelinc/citrus-ui/src/components/CCheckbox.vue';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether to enable and display a checked state */\n checkable?: boolean;\n /** Reflects the item's checked state */\n checked?: boolean;\n /** Controls what style of checking to apply, either a checkbox, or just a check icon */\n checkType?: 'checkbox' | 'icon';\n /** Controls whether the item has hover-state styles and responds to click events */\n selectable?: boolean;\n }>(),\n {\n checkable: false,\n checked: false,\n checkType: 'checkbox',\n selectable: true,\n }\n);\n\ndefineSlots<{\n 'prepend-inner'?: () => VNode[];\n 'default'?: () => VNode[];\n}>();\n\nconst onClick = (e: Event): void => {\n if (!props.selectable) {\n e.preventDefault();\n e.stopPropagation();\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.menu-item {\n &::part(base) {\n @include body-emphasized;\n\n --sl-spacing-x-small: 12px;\n\n align-items: center;\n background-color: $color-white;\n color: $color-black;\n cursor: initial;\n padding: 12px 16px;\n }\n\n &.selectable::part(base):hover {\n background-color: var(--sl-color-neutral-100);\n color: var(--sl-color-neutral-1000);\n cursor: pointer;\n }\n\n &::part(checked-icon) {\n // Hide Shoelace's built-in checkmark, as it is not customizable and does not match our standard\n // checkmark icon.\n display: none;\n }\n\n &::part(submenu-icon) {\n display: none;\n }\n\n .checkbox {\n // We're using CCheckbox exclusively as a visual reflection of sl-menu-item's internal checked\n // state, so it should not capture any mouse events.\n pointer-events: none;\n }\n\n .check-icon {\n width: 14px;\n }\n}\n</style>\n","<template>\n <sl-menu-label class=\"menu-label pt-3 px-4\">\n <slot />\n </sl-menu-label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport '@shoelace-style/shoelace/dist/components/menu-label/menu-label.js';\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.menu-label {\n &::part(base) {\n @include eyebrow;\n\n padding: 0;\n }\n}\n</style>\n","<template>\n <sl-dialog\n ref=\"modal\"\n :label=\"dialogLabel\"\n no-header\n :open=\"value\"\n class=\"c-modal\"\n :class=\"{ 'c-modal--fullscreen': fullscreen }\"\n :data-loading=\"loading || undefined\"\n :data-state=\"value ? 'open' : 'closed'\"\n :data-test=\"getDataTestAttr()\"\n @sl-hide=\"$emit('input', false)\"\n @sl-request-close=\"onRequestClose\"\n @sl-after-show=\"isVisible = true\"\n @sl-after-hide=\"isVisible = false\"\n >\n <CExpandTransition class=\"c-modal__wrapper\" :disabled=\"!enableExpandTransition\">\n <div v-if=\"!loading\" class=\"c-modal__body\">\n <div :data-test=\"getDataTestAttr('content')\" class=\"c-modal__content\">\n <h2 v-if=\"title\" class=\"c-modal__title\" :data-test=\"getDataTestAttr('title')\">\n {{ title }}\n </h2>\n <button\n v-if=\"dismissible\"\n class=\"c-modal__dismiss\"\n :data-test=\"getDataTestAttr('dismiss')\"\n @click=\"$emit('input', false)\"\n >\n {{ $t('Dismiss') }}\n </button>\n <slot />\n </div>\n <CButtonStack\n v-if=\"footerHasContent\"\n tag=\"footer\"\n class=\"c-modal__footer\"\n :large=\"fullscreen || undefined\"\n :data-test=\"getDataTestAttr('footer')\"\n >\n <slot name=\"footer\" />\n </CButtonStack>\n </div>\n <div v-else class=\"c-modal__loading\" :data-test=\"value ? `${dataTest}-loading` : null\">\n <div class=\"c-modal__loading__loader\"><CLoader /></div>\n <slot name=\"loading\">\n <div v-if=\"loadingMessage\" :data-test=\"value ? `${dataTest}-loading-message` : null\">\n {{ loadingMessage }}\n </div>\n </slot>\n </div>\n </CExpandTransition>\n </sl-dialog>\n</template>\n\n<script setup lang=\"ts\">\nimport type SlDialog from '@shoelace-style/shoelace/dist/components/dialog/dialog.js';\nimport '@shoelace-style/shoelace/dist/components/dialog/dialog.js';\nimport type { VNode } from 'vue';\nimport { computed, ref } from 'vue';\n\nimport CButtonStack from '@propelinc/citrus-ui/src/components/CButtonStack.vue';\nimport CExpandTransition from '@propelinc/citrus-ui/src/components/CExpandTransition.vue';\nimport CLoader from '@propelinc/citrus-ui/src/components/CLoader.vue';\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\n\nconst props = withDefaults(\n defineProps<{\n /** Aria label for the modal. This is required if title is hidden */\n ariaLabel?: string;\n /** Prefix for test selectors */\n dataTest?: string;\n /** Allows modal to be dismissed */\n dismissible?: boolean;\n /** Controls whether the modal displays fullscreen */\n fullscreen?: boolean;\n /** Shows loading state and sets loading message if string */\n loading?: string | boolean;\n /** The title of the modal */\n title?: string | null;\n /** Toggles the open/close animation */\n transition?: boolean;\n /** Controls whether or not the modal is showing */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n dataTest: 'modal',\n dismissible: true,\n fullscreen: false,\n loading: false,\n title: null,\n transition: true,\n value: false,\n }\n);\n\ndefineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n footer?: () => VNode[];\n loading?: () => VNode[];\n}>();\n\nconst onRequestClose = (event: Event): void => {\n if (!props.dismissible) {\n event.preventDefault();\n }\n};\n\nconst modal = ref<SlDialog | null>(null);\nconst animation = computed<'default' | null>(() => (props.transition ? 'default' : null));\nuseShoelaceAnimation(modal, 'dialog.show', animation);\nuseShoelaceAnimation(modal, 'dialog.hide', animation);\nuseShoelaceAnimation(modal, 'dialog.overlay.show', animation);\nuseShoelaceAnimation(modal, 'dialog.overlay.hide', animation);\n\nconst isVisible = ref(false);\n// NOTE(mohan): Don't do any expand transitions until the modal is fully\n// open.\nconst enableExpandTransition = computed(() => !props.fullscreen && isVisible.value);\n\nconst getDataTestAttr = (suffix?: string): string => {\n return suffix ? `${props.dataTest}-${suffix}` : props.dataTest;\n};\n\nconst loadingMessage = computed(() => {\n return typeof props.loading === 'string' ? props.loading : null;\n});\n\nconst dialogLabel = computed(() => {\n if (loadingMessage.value) {\n return loadingMessage.value;\n }\n\n return props.title || props.ariaLabel;\n});\n\nconst footerHasContent = useSlotHasContent('footer');\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n.c-modal {\n &::part(body) {\n padding: 24px 24px 16px;\n }\n\n :deep() {\n .c-card-section {\n padding: 0 !important;\n }\n\n .c-card-footer {\n padding: 24px 0 0;\n }\n\n // NOTE(slanden): This is a bit of a hack to ensure that the content of the modal\n // stays within the bounds of the page and scrolls rather than continuing on past\n // the bottom of the page and getting lost.\n .c-expand-transition--disabled .c-expand-transition__content {\n height: 100%;\n }\n }\n}\n\n.c-modal__title {\n @include large-headline;\n\n padding: 0 0 8px;\n}\n\n.c-modal__dismiss {\n @include sr-only;\n}\n\n.c-modal__body {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.c-modal__content {\n display: flex;\n flex: auto;\n flex-direction: column;\n max-height: 100%;\n}\n\n.c-modal__footer {\n flex: none;\n padding: 24px 0 0;\n}\n\n.c-modal__loading {\n padding: 32px 0 24px;\n text-align: center;\n}\n\n.c-modal__loading__loader {\n line-height: 1;\n margin-bottom: 8px;\n}\n\n.c-modal--fullscreen {\n &::part(panel) {\n border-radius: 0;\n height: 100%;\n max-height: none;\n max-width: none;\n width: 100%;\n }\n\n &::part(body) {\n padding: calc(env(safe-area-inset-top, 0) + 12px) 16px max(env(safe-area-inset-bottom, 0), 12px);\n }\n\n .c-modal__wrapper {\n height: 100%;\n }\n}\n</style>\n","<template>\n <CModal\n :value=\"value\"\n :loading=\"message || true\"\n :data-test=\"dataTest\"\n :dismissible=\"false\"\n @input=\"$emit('input', $event)\"\n >\n <template #loading>\n <slot name=\"loading\" />\n </template>\n </CModal>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\nimport CModal from '@propelinc/citrus-ui/src/components/CModal.vue';\n\nwithDefaults(\n defineProps<{\n /** Prefix for test selectors */\n dataTest?: string;\n /** Controls the message shown below the Modal Loading icon */\n message?: string | null;\n /** Controls whether or not the modal is showing */\n value?: boolean;\n }>(),\n {\n dataTest: 'loading-modal',\n message: null,\n value: false,\n }\n);\n\ndefineEmits<{\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n loading?: () => VNode[];\n}>();\n</script>\n","<template>\n <div\n data-test=\"notification\"\n class=\"c-notification\"\n :class=\"`c-notification--${computedVariant}`\"\n >\n <CIconButton\n v-if=\"dismissible\"\n data-test=\"notification-dismiss\"\n variant=\"tertiary\"\n class=\"c-notification__close-button\"\n :icon=\"farXmark\"\n :aria-label=\"$t('Dismiss')\"\n @click=\"$emit('dismiss')\"\n />\n <slot name=\"title\">\n <div v-if=\"title || titleIcon\" class=\"c-notification__title\" data-test=\"notification-title\">\n <font-awesome-icon\n v-if=\"titleIcon\"\n class=\"c-notification__title-icon\"\n data-test=\"notification-title-icon\"\n :icon=\"titleIcon\"\n />\n <div data-test=\"notification-title-text\" class=\"c-notification__title-text\">\n <strong>{{ title }}</strong>\n </div>\n </div>\n </slot>\n\n <div data-test=\"notification-body\" class=\"c-notification__text\">\n <slot />\n </div>\n\n <CButton\n v-if=\"hasButton\"\n block\n data-test=\"notification-button\"\n class=\"c-notification__button\"\n :loading=\"buttonLoading\"\n :to=\"buttonTo\"\n :href=\"buttonHref\"\n :target=\"buttonTarget\"\n @click=\"$emit('click:button')\"\n >\n {{ buttonText }}\n </CButton>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { faXmark as farXmark } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport CButton from '@propelinc/citrus-ui/src/components/CButton/CButton.vue';\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\n\nimport type { NotificationVariant } from '../types';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\nconst props = withDefaults(\n defineProps<{\n /**\n * @deprecated use `variant` prop instead\n * Renders the error state\n */\n // TODO(mohan): Make alert prop accessible.\n alert?: boolean;\n /**\n * @deprecated use `variant` prop instead\n * Renders the warning state\n */\n warning?: boolean;\n /** The variant of the notification */\n variant?: NotificationVariant;\n dismissible?: boolean;\n title?: string;\n titleIcon?: object;\n buttonText?: string;\n buttonTo?: RouteLocationRaw;\n buttonHref?: string;\n buttonTarget?: string;\n buttonLoading?: boolean;\n }>(),\n {\n alert: false,\n warning: false,\n variant: 'info',\n dismissible: false,\n title: '',\n titleIcon: undefined,\n buttonText: undefined,\n buttonTo: undefined,\n buttonHref: undefined,\n buttonTarget: undefined,\n buttonLoading: false,\n }\n);\n\ndefineEmits<{\n 'click:button': [];\n 'dismiss': [];\n}>();\n\ndefineSlots<{\n title?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst hasButton = computed(() => !!props.buttonText);\n\n/**\n * Handle merging the deprecated `alert` and `warning` props\n * with the `variant` prop.\n */\nconst computedVariant = computed(() => {\n if (props.alert) {\n return 'alert';\n } else if (props.warning) {\n return 'warning';\n }\n return props.variant;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-notification {\n background-color: $color-blue-100;\n border-radius: $border-radius-next;\n padding: 16px;\n position: relative;\n}\n\n.c-notification--success {\n background-color: $color-green-100;\n}\n\n.c-notification--alert {\n background-color: $color-red-100;\n}\n\n.c-notification--warning {\n background-color: $color-gold-100;\n}\n\n.c-notification__close-button {\n float: right;\n font-size: 14px;\n margin-right: -8px;\n margin-top: -8px;\n}\n\n.c-notification__title {\n align-items: center;\n display: flex;\n margin-bottom: 8px;\n}\n\n.c-notification__title-icon {\n margin-right: 8px;\n}\n\n.c-notification__title-text {\n flex: 1;\n}\n\n.c-notification__button {\n margin-top: 12px;\n}\n</style>\n","import { type Ref, computed, ref } from 'vue';\n\nexport interface Field {\n input: HTMLInputElement | null;\n}\n\ninterface FocusableField {\n field: Ref<Field | null>;\n focus: () => void;\n}\n\nexport function useFocusableField(): FocusableField {\n const field = ref<Field | null>(null);\n const input = computed(() => field.value?.input as HTMLInputElement);\n function focus(): void {\n input?.value.focus();\n }\n return { field, focus };\n}\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :value=\"value\"\n type=\"tel\"\n :label=\"label || $t('Phone number')\"\n mask=\"(###) ###-####\"\n :minlength=\"10\"\n :maxlength=\"10\"\n :placeholder=\"placeholder || '(555) 555-5555'\"\n :data-test=\"dataTest\"\n :rules=\"[...defaultRules, ...rules]\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nwithDefaults(\n defineProps<{\n /** A custom data-test attribute for the input. */\n dataTest?: string;\n /** A unique id for the input. */\n id?: string;\n /** The input's label. */\n label?: string | null;\n /** The input's placeholder. */\n placeholder?: string;\n /** Additional validation rules. */\n rules?: Rules<string>;\n /** The value of the input. */\n value?: string;\n }>(),\n {\n dataTest: 'phone-field',\n id: undefined,\n label: null,\n placeholder: '',\n rules: () => [],\n value: '',\n }\n);\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = computed(() => {\n const errorMessage = t('Please enter a valid {inputLabel}', {\n inputLabel: t('phone number'),\n });\n return [minLengthRule(10, errorMessage)];\n});\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport const SELECTED_VALUE = Symbol('selected-value') as InjectionKey<Ref<string>>;\nexport const TOGGLE_VALUE = Symbol('toggle-value') as InjectionKey<\n (value: string | undefined) => void\n>;\nexport const ROLE = Symbol('role') as InjectionKey<Ref<string>>;\n","<template>\n <span\n v-bind=\"$attrs\"\n :aria-checked=\"ariaChecked\"\n :class=\"{ 'c-pill--active': isSelected }\"\n class=\"c-pill\"\n data-test=\"pill\"\n :role=\"role\"\n @click=\"onClick\"\n >\n <span class=\"c-pill-body\" data-test=\"pill-body\">\n <span v-if=\"icon || $slots.icon\" class=\"c-pill-icon\">\n <slot name=\"icon\">\n <FontAwesomeIcon v-if=\"icon\" data-test=\"pill-icon\" fixed-width :icon=\"icon\" />\n </slot>\n </span>\n\n <span class=\"c-pill-text\">\n <slot />\n </span>\n </span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { FontAwesomeIcon as FontAwesomeIconComponent } from '@fortawesome/vue-fontawesome';\nimport type { Component, VNode } from 'vue';\nimport { computed, inject } from 'vue';\n\nimport {\n ROLE,\n SELECTED_VALUE,\n TOGGLE_VALUE,\n} from '@propelinc/citrus-ui/src/services/injections/pills';\n\n// FontAwesomeIcon's prop types produce a union too complex for TypeScript to resolve\nconst FontAwesomeIcon = FontAwesomeIconComponent as unknown as Component;\n\ntype ToggleVariant = 'standalone' | 'group' | 'none';\n\nconst props = withDefaults(\n defineProps<{\n /** The icon to display. */\n icon?: string | string[] | IconDefinition;\n /**\n * By default, this is a boolean that determines if the pill is selected or\n * not. If in a pill group, this is a string that identifies this pill.\n */\n value?: boolean | string;\n }>(),\n {\n icon: undefined,\n value: undefined,\n }\n);\n\nconst emit = defineEmits<{\n click: [];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n icon?: () => VNode[];\n}>();\n\nconst injectedRole = inject(ROLE, undefined);\nconst injectedSelectedValue = inject(SELECTED_VALUE, undefined);\nconst toggleValue = inject(TOGGLE_VALUE, undefined);\n\nconst toggleVariant = computed<ToggleVariant>(() => {\n if (toggleValue) {\n return 'group';\n }\n\n if (props.value !== undefined) {\n return 'standalone';\n }\n\n return 'none';\n});\n\nconst isSelected = computed(() => {\n if (toggleVariant.value === 'standalone') {\n return props.value;\n }\n\n if (injectedSelectedValue?.value) {\n return injectedSelectedValue.value === props.value;\n }\n\n return undefined;\n});\n\nconst ariaChecked = computed((): 'true' | 'false' | undefined => {\n if (isSelected.value === undefined) {\n return undefined;\n }\n\n return isSelected.value ? 'true' : 'false';\n});\n\nconst role = computed(() => {\n if (toggleVariant.value === 'standalone') {\n return 'radio';\n }\n\n if (toggleVariant.value === 'group') {\n return injectedRole?.value ?? undefined;\n }\n\n return undefined;\n});\n\nconst onClick = (): void => {\n if (toggleVariant.value === 'standalone') {\n emit('input', !props.value);\n }\n\n if (toggleVariant.value === 'group' && toggleValue) {\n const nextValue = isSelected.value ? undefined : (props.value as string);\n toggleValue(nextValue);\n }\n\n emit('click');\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-pill {\n background-color: $color-white;\n border: $border-width solid $color-border;\n border-radius: $border-radius-next;\n color: $color-text-primary;\n display: inline-block;\n font-family: $font-family-polymath;\n height: $button-size-medium;\n padding-inline: 12px;\n}\n\n.c-pill--active {\n background-color: $color-black;\n border-color: $color-black;\n color: $color-white;\n}\n\n.c-pill-body {\n align-items: center;\n display: flex;\n gap: 8px;\n height: 100%;\n\n /**\n * Improves icon alignment\n */\n line-height: 1;\n white-space: nowrap;\n}\n\n.c-pill-icon {\n width: 16px;\n}\n</style>\n","<template>\n <div class=\"c-pill-group\" data-test=\"pill-group\">\n <fieldset class=\"c-pill-group__track\">\n <slot>\n <CPill\n v-for=\"option in options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :icon=\"option.icon\"\n >\n {{ option.label }}\n </CPill>\n </slot>\n </fieldset>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref } from 'vue';\n\nimport CPill from '@propelinc/citrus-ui/src/components/CPill.vue';\nimport {\n ROLE,\n SELECTED_VALUE,\n TOGGLE_VALUE,\n} from '@propelinc/citrus-ui/src/services/injections/pills';\nimport type { FaIcon } from '@propelinc/citrus-ui/src/types/font-awesome';\n\ninterface PillConfig {\n label: string;\n value: string;\n icon?: FaIcon;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** A list of pills to display. This is overwritten by the default slot. */\n options?: PillConfig[];\n /** Specifies which pill is selected. */\n value?: string;\n }>(),\n {\n options: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n input: [value: string | undefined];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nprovide(ROLE, ref('radio'));\nprovide(\n SELECTED_VALUE,\n computed(() => props.value)\n);\nprovide(TOGGLE_VALUE, (value) => {\n emit('input', value);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-pill-group {\n overflow: scroll hidden;\n padding: 0 16px;\n}\n\n.c-pill-group__track {\n border: none;\n display: block;\n display: flex;\n flex-wrap: nowrap;\n gap: 8px;\n}\n</style>\n","<template>\n <sl-popup ref=\"popup\" :active=\"value\" distance=\"8\" class=\"c-popup\">\n <span slot=\"anchor\" class=\"anchor\">\n <slot />\n </span>\n <slot name=\"content\" />\n </sl-popup>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SlPopup } from '@shoelace-style/shoelace';\nimport '@shoelace-style/shoelace/dist/components/popup/popup.js';\nimport type { VNode } from 'vue';\nimport { onMounted, onUnmounted, ref, watchEffect } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n value?: boolean;\n }>(),\n {\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n 'mouseleave': [];\n 'outside-click': [];\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n content?: () => VNode[];\n}>();\n\nconst popup = ref<SlPopup | null>(null);\n\nconst handleMouseLeave = (): void => {\n if (props.value) {\n emit('mouseleave');\n }\n};\n\nconst handleOutsideClick = ({ target }: MouseEvent): void => {\n if (target instanceof HTMLElement && !popup.value?.contains(target)) {\n emit('outside-click');\n }\n};\n\nwatchEffect(async () => {\n if (props.value) {\n document.addEventListener('click', handleOutsideClick);\n } else {\n document.removeEventListener('click', handleOutsideClick);\n }\n});\n\nonMounted(() => {\n popup.value?.addEventListener('mouseleave', handleMouseLeave);\n});\n\nonUnmounted(() => {\n document.removeEventListener('click', handleOutsideClick);\n popup.value?.removeEventListener('mouseleave', handleMouseLeave);\n});\n</script>\n\n<style scoped>\n.c-popup::part(popup) {\n z-index: 1;\n}\n\n.anchor {\n height: fit-content;\n}\n</style>\n","<template>\n <sl-progress-bar\n class=\"c-progress-linear\"\n :class=\"{ 'c-progress-linear--rounded': rounded }\"\n :data-test=\"dataTest\"\n :value=\"value\"\n :indeterminate=\"indeterminate || undefined\"\n :label=\"accessibleText || $t('Loading...')\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/progress-bar/progress-bar.js';\n\nwithDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Selector for testing */\n dataTest?: string;\n /** Renders an indefinite loading state */\n indeterminate?: boolean;\n /** Rounds the progress bar */\n rounded?: boolean;\n /** The current progress from 0 to 100 */\n value?: number | string;\n }>(),\n {\n accessibleText: undefined,\n dataTest: 'c-progress-linear',\n indeterminate: false,\n rounded: true,\n value: 0,\n }\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n$progress-linear-height: 4px;\n\n.c-progress-linear {\n --height: #{$progress-linear-height};\n --indicator-color: #{$color-black};\n --track-color: #{$color-gray-200};\n\n &::part(base) {\n border-radius: 0;\n }\n}\n\n.c-progress-linear--rounded {\n &::part(base) {\n border-radius: calc(#{$progress-linear-height} / 2);\n }\n}\n</style>\n","<template>\n <span\n class=\"c-progress-ring\"\n :data-test=\"dataTest\"\n :aria-label=\"accessibleText || $t('Loading...')\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n :aria-valuemax=\"String(valueMax)\"\n :aria-valuenow=\"String(value)\"\n :style=\"{\n '--size': `${size}px`,\n '--indicator-color': cssColor,\n '--track-color': trackCssColor,\n '--track-width': `${trackWidth}px`,\n '--indicator-length': `${percentage}`,\n }\"\n >\n <svg class=\"c-progress-ring__svg\">\n <circle class=\"c-progress-ring__track\" />\n <circle class=\"c-progress-ring__indicator\" pathLength=\"100\" />\n </svg>\n <span class=\"c-progress-ring__label\">\n <slot />\n </span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { VNode } from 'vue';\n\nimport type Colors from '@propelinc/citrus-ui/src/colors/colors';\nimport type { HexColor } from '@propelinc/citrus-ui/src/colors/colors';\nimport { usePaletteColor } from '@propelinc/citrus-ui/src/composables/colors';\n\nconst props = withDefaults(\n defineProps<{\n /** Customizes screen reader only text alternative, should be translated */\n accessibleText?: string;\n /** Selector for testing */\n dataTest?: string;\n /** The current progress, from 0 to valueMax */\n value?: number | string;\n /** Total progress */\n valueMax?: number | string;\n /** The outer diameter of the progress ring, in px */\n size?: number | string;\n /** The width of the progress ring, in px */\n trackWidth?: number | string;\n /** Sets the indicator color */\n color?: HexColor | keyof typeof Colors;\n /** Sets the track color underneath the indicator */\n trackColor?: HexColor | keyof typeof Colors;\n }>(),\n {\n dataTest: 'c-progress-ring',\n value: 0,\n valueMax: 100,\n size: 44,\n trackWidth: 4,\n color: 'blue-500',\n trackColor: 'gray-200',\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { cssColor } = usePaletteColor(() => props.color);\nconst { cssColor: trackCssColor } = usePaletteColor(() => props.trackColor);\n\nconst percentage = computed(() => (100 * Number(props.value)) / Number(props.valueMax));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-progress-ring {\n align-items: center;\n display: inline-flex;\n flex-shrink: 0;\n font-size: var(--size);\n height: 1em;\n justify-content: center;\n position: relative;\n width: 1em;\n\n &__label {\n color: var(--indicator-color);\n font-size: $font-size-small;\n font-weight: $font-weight-bold;\n }\n\n &__svg {\n height: 100%;\n position: absolute;\n width: 100%;\n }\n\n &__indicator,\n &__track {\n cx: 0.5em;\n cy: 0.5em;\n fill: none;\n r: calc(0.5em - var(--track-width) / 2);\n stroke-width: var(--track-width);\n }\n\n &__indicator {\n stroke: var(--indicator-color);\n\n /* The empty gap equal to the path length 100 to make the rest of the circle empty. */\n stroke-dasharray: var(--indicator-length) 100;\n stroke-linecap: round;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n transition: stroke-dasharray 0.2s;\n }\n\n &__track {\n stroke: var(--track-color);\n }\n}\n</style>\n","import type { InjectionKey, Ref } from 'vue';\n\nexport interface RadioState {\n value: unknown;\n invalid: boolean;\n name: string;\n update: (value: unknown) => void;\n register: (value: unknown) => void;\n unregister: (value: unknown) => void;\n}\n\nexport const RADIO_STATE = Symbol('radio-state') as InjectionKey<Ref<RadioState>>;\n","<template>\n <label\n :id=\"idWithFallback\"\n :for=\"`${idWithFallback}-input`\"\n :data-test=\"dataTest\"\n :data-selected=\"parentState.value === value || undefined\"\n class=\"c-radio\"\n :class=\"{\n 'c-radio--invalid': parentState.invalid,\n 'c-radio--checked': parentState.value === value,\n }\"\n >\n <input\n :id=\"`${idWithFallback}-input`\"\n type=\"radio\"\n :data-test=\"`${dataTest}-input`\"\n class=\"c-radio__input\"\n :class=\"{ 'sr-only': hideRadio }\"\n :name=\"parentState.name\"\n :value=\"value\"\n :checked=\"parentState.value === value || undefined\"\n @change=\"onChange($event)\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n />\n <slot name=\"label\">{{ label }} </slot>\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { inject, onBeforeUnmount, onMounted, ref, toRefs } from 'vue';\n\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport type { RadioState } from '@propelinc/citrus-ui/src/services/injections/radio';\nimport { RADIO_STATE } from '@propelinc/citrus-ui/src/services/injections/radio';\n\nconst props = withDefaults(\n defineProps<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n id?: string | null;\n label?: string | null;\n dataTest?: string;\n hideRadio?: boolean;\n }>(),\n {\n id: null,\n label: null,\n dataTest: 'radio-group-option',\n hideRadio: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'change', event: Event): void;\n (e: 'blur'): void;\n (e: 'focus'): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n}>();\n\nconst { id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst parentState = inject(\n RADIO_STATE,\n ref<RadioState>({\n value: null,\n name: idWithFallback.value,\n invalid: false,\n update: () => {},\n register: () => {},\n unregister: () => {},\n })\n);\n\nconst onChange = (event: Event): void => {\n const target = event.target as HTMLInputElement;\n parentState.value.update(target.checked ? props.value : null);\n emit('change', event);\n};\n\nonMounted((): void => {\n parentState.value.register(props.value);\n});\n\nonBeforeUnmount((): void => {\n parentState.value.unregister(props.value);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-radio {\n align-items: center;\n background-color: $color-background;\n border: $border;\n border-radius: $border-radius-next;\n cursor: pointer;\n display: flex;\n gap: 12px;\n padding: 12px;\n transition: border-color $citrus-field-transition-duration ease;\n width: 100%;\n}\n\n.c-radio__input {\n accent-color: $color-black;\n background-color: $color-black;\n border: $color-gray-300 solid $border-width;\n border-color: $color-black;\n margin-top: 1px;\n transform: scale(1.5);\n}\n\n.c-radio__label {\n padding: 0 12px;\n width: 100%;\n}\n\n.c-radio--checked {\n border-color: $color-black;\n}\n\n.c-radio--invalid {\n border-color: $color-status-error;\n}\n\n.c-radio--invalid .c-radio__input {\n accent-color: $color-status-error;\n border-color: $color-status-error;\n}\n</style>\n","<template>\n <fieldset\n :id=\"idWithFallback\"\n ref=\"radioGroup\"\n :data-test=\"dataTest\"\n role=\"radiogroup\"\n class=\"c-radio-group\"\n :class=\"{\n 'c-radio-group--column': column,\n 'c-radio-group--row': !column,\n 'c-radio-group--invalid': !isValidationValid,\n }\"\n :aria-invalid=\"isValidationValid ? 'false' : 'true'\"\n :aria-labelledby=\"`${idWithFallback}-label`\"\n :aria-errormessage=\"`${idWithFallback}-message`\"\n >\n <span :id=\"`${idWithFallback}-label`\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n\n <slot />\n\n <CValidationMessage\n :id=\"`${idWithFallback}-message`\"\n :data-test=\"`${dataTest}-message`\"\n :validation-message=\"validationMessage\"\n :hide=\"hideDetails\"\n >\n <slot name=\"message\" />\n </CValidationMessage>\n </fieldset>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, provide, ref, toRefs, watch } from 'vue';\n\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\nimport { RADIO_STATE } from '@propelinc/citrus-ui/src/services/injections/radio';\n\nconst props = withDefaults(\n defineProps<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n id?: string | null;\n dataTest?: string;\n label?: string | null;\n column?: boolean;\n mandatory?: boolean;\n rules?: Rules<string>;\n hideDetails?: boolean | 'auto';\n }>(),\n {\n value: null,\n id: null,\n dataTest: 'radio-group',\n label: null,\n column: true,\n mandatory: false,\n rules: () => [],\n hideDetails: false,\n }\n);\n\nconst emit = defineEmits<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: 'change', value: any): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: 'input', value: any): void;\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n default?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, id, mandatory } = toRefs(props);\nconst idWithFallback = useId(id);\nconst radioGroup = ref<HTMLElement | null>(null);\n\nconst internalValue = useInternalValue(value, {\n onChange: (newValue) => {\n emit('change', newValue);\n emit('input', newValue);\n },\n});\n\nconst {\n startValidating,\n message: validationMessage,\n valid: isValidationValid,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n required: mandatory,\n validateOn: 'change',\n});\n\nprovide(\n RADIO_STATE,\n computed(() => ({\n invalid: !isValidationValid.value,\n value: internalValue.value,\n name: idWithFallback.value,\n update: (newValue: unknown): void => {\n internalValue.value = newValue;\n },\n register: (value: unknown): void => {\n if (props.mandatory && internalValue.value === null) {\n internalValue.value = value;\n }\n },\n unregister: (value: unknown): void => {\n if (internalValue.value === value) {\n internalValue.value = null;\n }\n },\n }))\n);\n\nwatch(internalValue, () => {\n startValidating();\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-radio-group {\n border: none;\n display: flex;\n flex-direction: row;\n gap: 8px;\n width: 100%;\n\n &.c-radio-group--column {\n flex-direction: column;\n }\n\n &--row {\n align-items: center;\n\n :deep(.c-radio) {\n width: auto;\n }\n }\n}\n</style>\n","<template>\n <div :class=\"{ 'w-100': fullWidth }\">\n <slot />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * NOTE(slanden): This component is no longer used. We are keeping it around for now\n * because it is used in the CMS, but other than applying the w-100 class, it has\n * no effect. We will remove this component in a future PR.\n */\n\nwithDefaults(\n defineProps<{\n fullWidth?: boolean;\n }>(),\n {\n fullWidth: false,\n }\n);\n</script>\n\n<style scoped>\n.w-100 {\n width: 100%;\n}\n</style>\n","<template>\n <div class=\"c-safe-area\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.c-safe-area {\n --full-height: 100vh;\n\n display: flex;\n flex-direction: column;\n height: calc(var(--full-height) - env(safe-area-inset-top) - env(safe-area-inset-bottom));\n max-width: 100%;\n overflow: scroll;\n}\n\n@supports (height: 100dvh) {\n .c-safe-area {\n --full-height: 100dvh;\n }\n}\n</style>\n","<template>\n <div class=\"c-section-header\" data-test=\"section-header\">\n <component :is=\"tag\" class=\"c-section-header__title\" data-test=\"section-header-title\">\n {{ title }}\n </component>\n <slot name=\"append\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { provide, ref } from 'vue';\n\nimport { TERTIARY as TERTIARY_ICON_BUTTON } from '@propelinc/citrus-ui/src/services/injections/icon-buttons';\n\nwithDefaults(\n defineProps<{\n /** The tag used for the title text. */\n tag?: string;\n /** The title text to display. */\n title?: string;\n }>(),\n {\n tag: 'h2',\n title: '',\n }\n);\n\ndefineSlots<{\n append?: () => VNode[];\n}>();\n\nprovide(TERTIARY_ICON_BUTTON, ref(true));\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/typography';\n\n.c-section-header {\n align-items: center;\n display: flex;\n gap: 12px;\n height: 48px;\n justify-content: space-between;\n}\n\n.c-section-header__title {\n @include headline;\n @include text-overflow-ellipsis;\n\n flex: 1 1 auto;\n}\n\n.c-card + .c-section-header {\n margin-top: 16px;\n}\n</style>\n","<!--\n This Skeleton component is the foundation for all of our skeleton loader components.\n\n In most cases, you will use a more specific version of this component, such as\n CSkeletonLoaderCard, CSkeletonLoaderText, CSkeletonLoaderCircle, etc.\n\n However, you can create custom skeleton loaders ad-hoc through composition. For example, a custom\n loader text component could be created like this:\n\n ```vue\n <div v-for=\"x in 3\" :key=\"x\">\n <div class=\"d-flex w-full\" style=\"font-size: 42px; line-height: 130%;\">\n <div style=\"height: 16px;\">\n <CSkeleton />\n </div>\n <span> </span>\n </div>\n </div>\n ```\n-->\n\n<template>\n <div class=\"c-skeleton\" data-test=\"skeleton\">\n <div class=\"c-skeleton__indicator\" :class=\"{ 'c-skeleton__indicator--squared': squared }\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\ndefineProps<{\n /** Toggles a squared-off card style intended to fill the width of the page */\n squared?: boolean;\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-skeleton {\n display: flex;\n height: 100%;\n min-height: 1rem;\n position: relative;\n width: 100%;\n}\n\n.c-skeleton__indicator {\n --color: #{$color-gray-100};\n --sheen-color: #{$color-gray-200};\n\n animation: sheen 8s ease-in-out infinite;\n background: linear-gradient(\n 270deg,\n var(--sheen-color),\n var(--color),\n var(--color),\n var(--sheen-color)\n );\n background-size: 400% 100%;\n border-radius: $border-radius-next;\n flex: 1 1 auto;\n\n &--squared {\n border-radius: 0;\n }\n}\n\n@keyframes sheen {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -200% 0;\n }\n}\n</style>\n","<template>\n <div\n class=\"c-skeleton-loader-card\"\n data-test=\"skeleton-loader-card\"\n :style=\"{ height: `${height}px` }\"\n >\n <CSkeleton :squared=\"tile\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n\nwithDefaults(\n defineProps<{\n /** Controls the height of the skeleton loader card */\n height?: number | string;\n /** Toggles a squared-off card style intended to fill the width of the page */\n tile?: boolean;\n }>(),\n {\n height: 100,\n tile: false,\n }\n);\n</script>\n","<template>\n <div class=\"c-skeleton-loader-circle\" data-test=\"skeleton-loader-circle\">\n <CSkeleton />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n</script>\n\n<style scoped>\n.c-skeleton-loader-circle {\n --size: 36px;\n\n border-radius: calc(var(--size) / 2);\n height: var(--size);\n overflow: hidden;\n width: var(--size);\n}\n</style>\n","<template>\n <div\n data-test=\"skeleton-loader-text\"\n class=\"c-skeleton-loader-text\"\n :class=\"{ [`align-${align}`]: align }\"\n >\n <div\n v-for=\"x in rows\"\n :key=\"x\"\n :class=\"lineTypeClass\"\n class=\"c-skeleton-loader-text__line\"\n data-test=\"skeleton-loader-text-line\"\n >\n <CSkeleton class=\"c-skeleton-loader-text__line__skeleton\" />\n <!-- This invisible text ensures the line height matches the real text. -->\n \n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport CSkeleton from '@propelinc/citrus-ui/src/components/CSkeleton.vue';\n\ntype SkeletonLoaderType =\n | 'balance'\n | 'body'\n | 'caption'\n | 'caption-small'\n | 'eyebrow'\n | 'headline'\n | 'large-headline'\n // @deprecated use 'eyebrow' instead\n | 'overline'\n | 'statement'\n | 'subheadline'\n | 'wallet-caption'\n | 'x-large-headline';\n\nconst LINE_TYPE_TO_CLASS: Record<SkeletonLoaderType, string> = {\n 'balance': 'c-skeleton-loader-text__line--balance',\n 'body': 'c-skeleton-loader-text__line--body',\n 'caption': 'c-skeleton-loader-text__line--caption',\n 'caption-small': 'c-skeleton-loader-text__line--caption-small',\n 'eyebrow': 'c-skeleton-loader-text__line--eyebrow',\n 'headline': 'c-skeleton-loader-text__line--headline',\n 'large-headline': 'c-skeleton-loader-text__line--large-headline',\n // @deprecated use 'eyebrow' instead\n 'overline': 'c-skeleton-loader-text__line--eyebrow',\n 'statement': 'c-skeleton-loader-text__line--statement',\n 'subheadline': 'c-skeleton-loader-text__line--subheadline',\n 'wallet-caption': 'c-skeleton-loader-text__line--wallet-caption',\n 'x-large-headline': 'c-skeleton-loader-text__line--x-large-headline',\n};\n\nconst props = withDefaults(\n defineProps<{\n /** Applies the align-items css property. */\n align?: 'center' | 'start' | 'end';\n /** Controls how many rows of loading text are shown */\n rows?: number;\n /** Controls the appearance of the loading text */\n type?: SkeletonLoaderType;\n }>(),\n {\n align: 'start',\n rows: 2,\n type: 'body',\n }\n);\n\nconst lineTypeClass = computed(() => {\n return LINE_TYPE_TO_CLASS[props.type];\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n// NOTE(mohan): This ensures that the skeleton loader text is exactly the same size as the text it\n// is replacing including the extra space around the text itself added by the line height.\n@mixin skeleton-loader-text-sizing($font-style) {\n font-size: map.get($font-style, 'size');\n line-height: map.get($font-style, 'line-height');\n\n // By applying a height equal to the font size, the skeleton takes up the space of the text,\n // leaving whitespace between each row\n .c-skeleton-loader-text__line__skeleton {\n height: map.get($font-style, 'size');\n }\n}\n\n.c-skeleton-loader-text {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.c-skeleton-loader-text__line {\n @include skeleton-loader-text-sizing($body);\n\n align-items: center;\n display: flex;\n width: 100%;\n\n &:last-child {\n width: calc(100% - 32px);\n }\n}\n\n.c-skeleton-loader-text__line--balance {\n @include skeleton-loader-text-sizing($balance);\n\n max-width: 120px;\n}\n\n.c-skeleton-loader-text__line--caption {\n @include skeleton-loader-text-sizing($caption);\n}\n\n.c-skeleton-loader-text__line--caption-small {\n @include skeleton-loader-text-sizing($caption-small);\n}\n\n.c-skeleton-loader-text__line--eyebrow {\n @include skeleton-loader-text-sizing($eyebrow);\n}\n\n.c-skeleton-loader-text__line--headline {\n @include skeleton-loader-text-sizing($headline);\n}\n\n.c-skeleton-loader-text__line--large-headline {\n @include skeleton-loader-text-sizing($large-headline);\n}\n\n.c-skeleton-loader-text__line--statement {\n @include skeleton-loader-text-sizing($statement);\n}\n\n.c-skeleton-loader-text__line--subheadline {\n @include skeleton-loader-text-sizing($subheadline);\n}\n\n.c-skeleton-loader-text__line--wallet-caption {\n @include skeleton-loader-text-sizing($wallet-caption);\n}\n\n.c-skeleton-loader-text__line--x-large-headline {\n @include skeleton-loader-text-sizing($x-large-headline);\n}\n</style>\n","<template>\n <div :class=\"direction\" :style=\"{ '--slide-fade-amount': `${amount}px` }\">\n <Transition name=\"slide-fade\" mode=\"out-in\">\n <slot />\n </Transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\n\ntype Direction = 'to-left' | 'to-right' | 'to-top' | 'to-bottom';\n\ndefineSlots<{ default: () => VNode[] }>();\n\nwithDefaults(\n defineProps<{\n /**\n * The amount of pixels to slide the elements in or out. Should be >= 0\n * @default 20\n */\n amount?: number;\n /**\n * Changes the direction of the slide fade transition\n * @default 'to-left'\n */\n direction?: Direction;\n }>(),\n { amount: 20, direction: 'to-left' }\n);\n</script>\n\n<style scoped>\n.slide-fade-enter-active,\n.slide-fade-leave-active {\n transition: all 0.3s ease-out;\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.slide-fade-enter-from,\n.slide-fade-leave-to {\n opacity: 0;\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-left .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-left .slide-fade-enter-from,\n.to-left .slide-fade-leave-to {\n transform: translateX(calc(-1 * var(--slide-fade-amount)));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-right .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-right .slide-fade-enter-from,\n.to-right .slide-fade-leave-to {\n transform: translateX(var(--slide-fade-amount));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-top .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-top .slide-fade-enter-from,\n.to-top .slide-fade-leave-to {\n transform: translateY(calc(-1 * var(--slide-fade-amount)));\n}\n\n/* TODO: Can remove `*-enter` classes when we upgrade to Vue 3 */\n.to-bottom .slide-fade-enter,\n/* Preemptively adding Vue 3 classes */\n.to-bottom .slide-fade-enter-from,\n.to-bottom .slide-fade-leave-to {\n transform: translateY(var(--slide-fade-amount));\n}\n</style>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :data-test=\"dataTest\"\n class=\"c-split-input\"\n :type=\"type\"\n :label=\"label\"\n :name=\"name\"\n :inputmode=\"inputmode\"\n :value=\"value\"\n :rules=\"rules\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :autocomplete=\"autocomplete\"\n size=\"large\"\n :mask=\"mask\"\n @input:masked=\"maskedValue = $event\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { HTMLAttributes, VNode } from 'vue';\nimport { computed, ref } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport type { SplitInputField } from '@propelinc/citrus-ui/src/types';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls the underlying input's autocomplete attribute */\n autocomplete?: string;\n /** Custom data-test selector */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /** The fields for each of the split inputs of type SplitInputField */\n fields: SplitInputField[];\n /** A hint to show the appropriate virtual keyboard, e.g. \"numeric\". */\n inputmode?: HTMLAttributes['inputmode'];\n /** The input's label */\n label?: string;\n /** The input's name */\n name?: string;\n /** Validation rules */\n rules?: Rules<string>;\n /** The input's type, either text or tel */\n type?: 'text' | 'tel';\n /** The input's value */\n value?: string;\n }>(),\n {\n dataTest: 'split-input',\n disabled: false,\n rules: () => [],\n type: 'text',\n value: '',\n }\n);\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst maskedValue = ref('');\n\nconst placeholder = computed(() => {\n return props.fields.map((field) => `${field.placeholder ?? ''}${field.separator ?? ''}`).join('');\n});\n\nconst mask = computed(() => {\n return props.fields\n .map((field) => `${Array(field.characters).fill('*').join('')}${field.separator ?? ''}`)\n .join('');\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n@mixin split-input-text {\n @include headline;\n\n letter-spacing: 12px;\n line-height: 1;\n text-align: center;\n}\n\n.c-split-input {\n &::part(input) {\n @include split-input-text;\n }\n\n &::part(input)::placeholder {\n @include split-input-text;\n\n font-weight: $font-weight-normal;\n }\n}\n</style>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :data-test=\"dataTest\"\n :value=\"value\"\n :label=\"label || defaultLabel\"\n :placeholder=\"fourDigitSsn ? 'XXXX' : 'XXX-XX-XXXX'\"\n inputmode=\"numeric\"\n :mask=\"fourDigitSsn ? '####' : '###-##-####'\"\n :minlength=\"fourDigitSsn ? 4 : 9\"\n :maxlength=\"fourDigitSsn ? 4 : 9\"\n :hideable=\"!fourDigitSsn\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n :rules=\"computedRules\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n <template #append>\n <!-- NOTE(mohan): When requesting the full SSN, we have to leave space for\n the hide/show icon. -->\n <FontAwesomeIcon v-if=\"fourDigitSsn\" :icon=\"faLock\" fixed-width />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport { faLock } from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string;\n rules?: Rules<string>;\n value?: string;\n fourDigitSsn?: boolean;\n }>(),\n {\n dataTest: 'ssn-field',\n rules: (): Rules<string> => [],\n value: '',\n fourDigitSsn: false,\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n append?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\nconst defaultLabel = computed(() => {\n return props.fourDigitSsn ? t('Last 4 digits of SSN') : t('Social Security number');\n});\nconst defaultRules = computed(() => {\n const fourDigitRule = minLengthRule(4, t('Please enter the last four digits of your SSN'));\n const fullSsnRule = minLengthRule(\n 9,\n t('Please enter a valid {inputLabel}', { inputLabel: t('Social Security number') })\n );\n return [props.fourDigitSsn ? fourDigitRule : fullSsnRule];\n});\n\nconst computedRules = computed(() => [...defaultRules.value, ...props.rules]);\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","<template>\n <div\n class=\"c-status-dot\"\n :class=\"{\n 'c-status-dot--count': hasCount,\n 'c-status-dot--bordered': bordered,\n }\"\n data-test=\"status-dot\"\n role=\"img\"\n >\n {{ displayCount }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nimport { useA11yLabelCheck } from '@propelinc/citrus-ui/src/composables/accessibility';\n\nconst props = withDefaults(\n defineProps<{\n count?: number | null;\n bordered?: boolean;\n }>(),\n {\n count: null,\n bordered: false,\n }\n);\n\nuseA11yLabelCheck('CStatusDot');\n\nconst hasCount = computed(() => props.count !== null);\nconst displayCount = computed(() => {\n return props.count && props.count > 9 ? '9+' : props.count;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-status-dot {\n background-color: $color-status-error;\n border-radius: 9999px;\n display: inline-block;\n height: 8px;\n width: 8px;\n}\n\n.c-status-dot--bordered {\n box-shadow: 0 0 0 1.5px $color-white;\n}\n\n/**\n * For users that may increase their font size for legibility,\n * we use rems so the circle grows if the font size increases.\n */\n.c-status-dot--count {\n align-items: center;\n color: $color-white;\n display: flex;\n font-size: 0.625rem;\n font-weight: $font-weight-bold;\n height: 1rem;\n justify-content: center;\n line-height: 1;\n text-align: center;\n width: 1rem;\n}\n</style>\n","<template>\n <sl-switch\n class=\"c-switch\"\n :class=\"{\n 'c-switch--label-first': labelFirst,\n 'c-switch--disabled': disabled,\n 'c-switch--checked': internalValue,\n 'c-switch--aria-labelled': ariaLabel,\n }\"\n :checked=\"internalValue || undefined\"\n :disabled=\"disabled || undefined\"\n @sl-change=\"internalValue = !internalValue\"\n >\n <slot />\n <span v-if=\"ariaLabel\" class=\"c-switch__sr-label\">\n {{ ariaLabel }}\n </span>\n </sl-switch>\n</template>\n\n<script setup lang=\"ts\">\nimport '@shoelace-style/shoelace/dist/components/switch/switch.js';\nimport type { VNode } from 'vue';\nimport { toRefs } from 'vue';\n\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\n\nconst props = withDefaults(\n defineProps<{\n /** Label for screen-readers. This hides and overrides the normal label. */\n ariaLabel?: string;\n /** Prevents the user from interacting with the switch */\n disabled?: boolean;\n /** When true, the slot label is visually rendered before the control (label left, switch right) */\n labelFirst?: boolean;\n /** Whether the switch is in an \"on\" or \"off\" state */\n value?: boolean;\n }>(),\n {\n ariaLabel: '',\n disabled: false,\n labelFirst: false,\n value: false,\n }\n);\n\nconst emit = defineEmits<{\n (e: 'input', value: boolean): void;\n}>();\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst { value } = toRefs(props);\nconst internalValue = useInternalValue(value, {\n onChange: (newValue) => emit('input', newValue),\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n\n@mixin switch-theme($control-color, $thumb-color, $thumb-indicator-color) {\n &::part(control) {\n background-color: $control-color;\n }\n\n &::part(thumb) {\n background-color: $thumb-color;\n }\n\n &::part(thumb)::after {\n background-color: $thumb-indicator-color;\n }\n}\n\n.c-switch {\n --width: 44px;\n --height: 24px;\n --thumb-size: 20px;\n\n &::part(control) {\n border: none;\n }\n\n &::part(thumb) {\n align-items: center;\n border: none;\n display: flex;\n justify-content: center;\n }\n\n &::part(thumb)::after {\n border-radius: 1px;\n content: '';\n height: 8px;\n transition: background-color var(--sl-transition-fast) ease-in-out;\n width: 2px;\n }\n\n @include switch-theme($color-gray-400, $color-white, transparent);\n}\n\n.c-switch--label-first {\n &::part(base) {\n flex-direction: row-reverse;\n gap: 12px;\n width: 100%;\n }\n\n &::part(label) {\n flex: 1;\n margin: 0;\n }\n}\n\n.c-switch--checked {\n @include switch-theme($color-green-400, $color-white, $color-green-400);\n}\n\n.c-switch--disabled {\n @include switch-theme($color-gray-200, $color-gray-200, transparent);\n\n // Override Shoelace's default `opacity: 0.5` on disabled switches.\n // Use explicit color tokens instead, consistent with CTextField/CTextArea/CSelect.\n &::part(base) {\n cursor: not-allowed;\n opacity: 1;\n }\n\n &::part(label) {\n color: $color-text-disabled;\n }\n}\n\n.c-switch--disabled.c-switch--checked {\n @include switch-theme($color-gray-200, $color-gray-200, $color-gray-300);\n}\n\n.c-switch__sr-label {\n @include sr-only;\n}\n</style>\n","<template>\n <CListItem>\n <CSwitch\n data-test=\"list-item-switch\"\n class=\"c-switch-list-item__switch\"\n :value=\"value\"\n :disabled=\"disabled\"\n @input=\"$emit('input', $event)\"\n >\n <div\n class=\"d-flex flex-row gap-3\"\n :class=\"{\n 'align-start': align === 'top',\n 'align-center': align !== 'top',\n }\"\n >\n <slot name=\"prepend\">\n <CListItemIcon v-if=\"icon || iconSlotHasContent\" :icon=\"icon\" :icon-color=\"iconColor\">\n <template #icon>\n <slot name=\"icon\" />\n </template>\n </CListItemIcon>\n </slot>\n\n <CListItemContent :title=\"title\" :label=\"label\">\n <template v-for=\"slotName of ['title', 'label', 'default']\" #[slotName]>\n <slot :name=\"slotName\" />\n </template>\n </CListItemContent>\n </div>\n </CSwitch>\n </CListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\nimport CListItem from '@propelinc/citrus-ui/src/components/CListItem.vue';\nimport CListItemContent from '@propelinc/citrus-ui/src/components/CListItemContent.vue';\nimport CListItemIcon from '@propelinc/citrus-ui/src/components/CListItemIcon.vue';\nimport CSwitch from '@propelinc/citrus-ui/src/components/CSwitch.vue';\n\nimport { useSlotHasContent } from '../composables/slots';\n\nwithDefaults(\n defineProps<{\n /** Alignment of the content */\n align?: 'top' | 'center';\n /** Prevents the user from interacting with the switch */\n disabled?: boolean;\n /** Font Awesome icon to render on the left side of the component */\n icon?: string | string[] | IconDefinition;\n /** Color of the icon background */\n iconColor?: string;\n /** Plain body copy. Overridden by the default slot. */\n label?: string;\n /** Emphasized text above body text. Overridden by the default slot. */\n title?: string;\n /** Whether the switch is in an \"on\" or \"off\" state */\n value?: boolean;\n }>(),\n {\n align: 'center',\n disabled: false,\n iconColor: 'gray-100',\n value: false,\n }\n);\n\ndefineEmits<{\n (e: 'input', value: boolean): void;\n}>();\n\nconst iconSlotHasContent = useSlotHasContent('icon');\n</script>\n\n<style lang=\"scss\" scoped>\n.c-switch-list-item__switch {\n width: 100%;\n\n &::part(base) {\n align-items: center;\n display: inline-flex;\n\n // Using row-reverse allows us to move the slot content to the left\n // and the switch to the right\n flex-direction: row-reverse;\n gap: 12px;\n\n // The padding from CListItem is sufficient\n padding: 0;\n width: 100%;\n }\n\n &::part(label) {\n align-items: center;\n display: flex;\n flex: 1;\n gap: 12px;\n justify-content: space-between;\n\n // Removes the margin-inline-start supplied by the Shoelace styles\n margin: 0;\n }\n}\n</style>\n","<template>\n <div\n class=\"d-flex flex-column gap-1\"\n :class=\"{\n 'c-text-area--disabled': disabled,\n 'c-text-area--invalid': isInvalid,\n 'c-text-area--hide-label': hideLabel,\n }\"\n :data-test=\"dataTest\"\n >\n <label class=\"c-text-area__label\" :for=\"idWithFallback\" :data-test=\"`${dataTest}-label`\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </label>\n\n <textarea\n :id=\"idWithFallback\"\n ref=\"textarea\"\n class=\"c-text-area__input\"\n rows=\"4\"\n :aria-label=\"label || undefined\"\n :aria-describedby=\"`${idWithFallback}-message ${idWithFallback}-validation-message`\"\n :aria-invalid=\"isInvalid ? 'true' : 'false'\"\n :data-test=\"`${dataTest}-textarea`\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxlength\"\n :required=\"required\"\n :value=\"internalValue\"\n @input=\"onInput\"\n @blur=\"$emit('blur')\"\n @focus=\"$emit('focus')\"\n @change=\"$emit('change', internalValue)\"\n v-on=\"validationListeners\"\n />\n\n <CValidationMessage\n :data-test=\"`${dataTest}-validation-message`\"\n :validation-message=\"errorMessage || validationMessage\"\n :hide=\"hideDetails\"\n >\n <template #append>\n <CFormFieldCounter\n v-if=\"counter\"\n :data-test=\"`${dataTest}-counter`\"\n :counter=\"counter\"\n :counter-value=\"counterValue\"\n :value=\"internalValue\"\n />\n </template>\n </CValidationMessage>\n\n <div\n v-if=\"messageSlotHasContent\"\n :id=\"`${idWithFallback}-message`\"\n class=\"c-text-area__message\"\n :data-test=\"`${dataTest}-message`\"\n >\n <slot name=\"message\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed, ref, toRefs } from 'vue';\n\nimport CFormFieldCounter from '@propelinc/citrus-ui/src/components/CFormFieldCounter.vue';\nimport CValidationMessage from '@propelinc/citrus-ui/src/components/CValidationMessage.vue';\nimport { useInternalValue } from '@propelinc/citrus-ui/src/composables/binding';\nimport { useId } from '@propelinc/citrus-ui/src/composables/id';\nimport { useSlotHasContent } from '@propelinc/citrus-ui/src/composables/slots';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { useValidations } from '@propelinc/citrus-ui/src/composables/validations';\n\nconst props = withDefaults(\n defineProps<{\n /** Shows a character counter and sets its denominator. */\n counter?: number | null;\n /**\n * Function or number that determines the numerator of the counter. If not\n * set, the counter will be the length of the input value.\n */\n counterValue?: number | (() => number | null) | null;\n /** Adds a custom data test string to the form field and textarea elements */\n dataTest?: string;\n /** Controls whether the input is disabled */\n disabled?: boolean;\n /**\n * Overrides the default validation message. If provided, this error message will always\n * be shown, regardless of any other failing validation rules.\n */\n errorMessage?: string;\n /** Hides the label and instead labels the field with `aria-label` */\n hideLabel?: boolean;\n /**\n * Hides the validation message area. Defaults to `false` (show message area even when valid),\n * so validations transition in gracefully.\n */\n hideDetails?: boolean | 'auto';\n /** The textarea element's id */\n id?: string;\n /** The textarea's label, both visual and screenreader-only */\n label?: string;\n /** Sets the maxlength attribute of the textarea */\n maxlength?: number;\n /** The textarea's placeholder */\n placeholder?: string;\n /** If true, the field is required */\n required?: boolean;\n /**\n * Accepts a mixed array of types function, boolean and string.\n * Functions pass an input value as an argument and must return either true / false or\n * a string containing an error message. The input field will enter an error state if a\n * function returns (or any value in the array contains) false or is a string\n */\n rules?: Rules<string>;\n /** The textarea's value */\n value?: string;\n }>(),\n {\n counter: null,\n counterValue: null,\n dataTest: 'text-area',\n disabled: false,\n hideDetails: false,\n hideLabel: false,\n required: false,\n rules: () => [],\n value: '',\n }\n);\n\nconst emit = defineEmits<{\n input: [value: string];\n change: [value: string];\n blur: [];\n focus: [];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { value, rules, required, id } = toRefs(props);\nconst idWithFallback = useId(id);\n\nconst internalValue = useInternalValue(value, {\n onChange: (value) => emit('input', value),\n});\n\nconst messageSlotHasContent = useSlotHasContent('message');\n\nconst textarea = ref<HTMLTextAreaElement | null>(null);\n\nconst {\n message: validationMessage,\n valid: isValidationValid,\n listeners: validationListeners,\n} = useValidations({\n id: idWithFallback,\n value: internalValue,\n rules,\n required,\n field: textarea,\n});\n\nconst isInvalid = computed(() => !isValidationValid.value || !!props.errorMessage);\n\nconst onInput = (event: Event): void => {\n const target = event.target as HTMLTextAreaElement;\n internalValue.value = target.value;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n@import '@propelinc/citrus-ui/src/styles/utils/a11y';\n@import '@propelinc/citrus-ui/src/styles/form-fields';\n\n.c-text-area__label {\n @include body-emphasized;\n\n display: inline-block;\n margin-bottom: 4px;\n transition: color $citrus-field-transition-duration ease;\n\n .c-text-area--invalid & {\n color: $color-status-error;\n }\n\n .c-text-area--disabled & {\n color: $color-text-disabled;\n }\n\n .c-text-area--hide-label & {\n @include sr-only;\n }\n}\n\n.c-text-area__input {\n background-color: $color-white;\n border: $border-width solid $color-gray-200;\n border-radius: $border-radius-next;\n padding: 16px;\n resize: vertical;\n transition: border-color $citrus-field-transition-duration ease;\n\n &:focus,\n &:focus-within {\n border-color: $color-black;\n outline: none;\n }\n\n .c-text-area--invalid & {\n border-color: $color-status-error;\n color: $color-status-error;\n outline: none;\n }\n\n &:disabled {\n background-color: $color-gray-100;\n color: $color-text-disabled;\n }\n}\n\n.c-text-area__message {\n @include caption;\n\n color: $color-gray-500;\n margin-bottom: 16px;\n}\n</style>\n","<template>\n <a\n v-bind=\"$attrs\"\n :target=\"target\"\n :href=\"routerDestinationOrHref\"\n :tabindex=\"isRoleButton ? 0 : undefined\"\n :role=\"isRoleButton ? 'button' : undefined\"\n class=\"c-text-link\"\n :class=\"{ 'c-text-link--underline': underline }\"\n @click=\"navigate\"\n >\n <slot />\n </a>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\nimport type { RouteLocationRaw } from 'vue-router';\n\nimport { useRouterLink } from '@propelinc/citrus-ui/src/composables/router';\n\nconst props = withDefaults(\n defineProps<{\n /** Controls whether the text link functions as a router-link */\n to?: RouteLocationRaw;\n /** Designates the text link as an anchor and applies the href attribute */\n href?: string;\n /** Designates the target attribute. Only use with the href prop. */\n target?: string;\n /** Toggles whether the link should have an underline */\n underline?: boolean;\n }>(),\n {\n underline: true,\n }\n);\n\ndefineSlots<{\n default?: () => VNode[];\n}>();\n\nconst to = computed(() => props.to);\nconst { href: routerDestination, navigate } = useRouterLink(to);\nconst routerDestinationOrHref = computed(() => routerDestination.value ?? props.href);\n\nconst isRoleButton = computed(() => {\n return !props.to && !props.href;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-text-link {\n color: $color-black;\n font-weight: $font-weight-semibold;\n\n &--underline {\n @include link-underline;\n }\n}\n</style>\n","<template>\n <div class=\"c-third-party-logo\" :style=\"{ '--size': SIZE_TO_VALUE[size] }\">\n <img\n v-if=\"imageState === 'loaded' || imageState === 'loading'\"\n class=\"c-third-party-logo__img transition-opacity\"\n :class=\"{ 'opacity-0': imageState === 'loading' }\"\n :src=\"src\"\n :alt=\"alt\"\n @error=\"handleImageError\"\n @load=\"handleImageLoad\"\n />\n <c-squared-icon\n class=\"transition-opacity\"\n :class=\"{ 'opacity-0': imageState === 'loaded' }\"\n :icon=\"icon\"\n :color=\"color\"\n :large=\"size === 'large'\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { ref } from 'vue';\n\nimport CSquaredIcon from '@propelinc/citrus-ui/src/components/CSquaredIcon.vue';\n\ntype Size = 'medium' | 'large';\n\ntype ImageState = 'loading' | 'loaded' | 'failed';\n\nconst SIZE_TO_VALUE: Record<Size, `${number}px`> = {\n medium: '40px',\n large: '56px',\n};\n\nwithDefaults(\n defineProps<{\n /** The alt text for the logo. */\n alt: string;\n /** The color of the fallback icon logo */\n color?: string;\n /** The Font Awesome icon to display as a fallback */\n icon?: string | string[] | IconDefinition | null;\n /** The size of the logo. Defaults to `medium`. */\n size?: Size;\n /** The URL of the logo image */\n src?: string;\n }>(),\n {\n color: 'gray-100',\n icon: null,\n size: 'medium',\n src: '',\n }\n);\n\nconst imageState = ref<ImageState>('loading');\n\nconst handleImageError = (): void => {\n imageState.value = 'failed';\n};\n\nconst handleImageLoad = (): void => {\n imageState.value = 'loaded';\n};\n</script>\n\n<style scoped>\n.c-third-party-logo {\n border-radius: 8px;\n height: var(--size);\n isolation: isolate;\n object-fit: contain;\n overflow: hidden;\n position: relative;\n width: var(--size);\n}\n\n.c-third-party-logo__img {\n display: block;\n height: 100%;\n left: 0;\n object-fit: contain;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 1;\n}\n\n.opacity-0 {\n opacity: 0;\n}\n\n.transition-opacity {\n transition: opacity 0.1s ease-in-out;\n}\n</style>\n","<template>\n <time v-bind=\"$attrs\" :datetime=\"isoString\">{{ timeago }}</time>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n datetime: string | number | Date;\n converter: (datetime: string | number | Date, locale: string, count?: number) => string;\n locale?: string;\n autoUpdate?: number | false;\n }>(),\n {\n locale: 'en',\n autoUpdate: 60,\n }\n);\n\n// NOTE(ram): Used to trigger reactivity in the computed property for auto updates.\nconst counter = ref(0);\nlet timer: number | null = null;\n\nconst isoString = computed((): string => new Date(props.datetime).toISOString());\nconst timeago = computed((): string =>\n props.converter(props.datetime, props.locale, counter.value)\n);\n\nconst startAutoUpdate = (): void => {\n if (props.autoUpdate) {\n // TODO(ram): This is a workaround to make sure the timer is of type number.\n // The type of setInterval is NodeJS.Timeout in Node.js and number in the browser.\n // This is causing issues in apps/healthcare-app.\n timer = setInterval(() => counter.value++, props.autoUpdate * 1000) as unknown as number;\n }\n};\n\nconst stopAutoUpdate = (): void => {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n};\n\nwatch(\n () => props.autoUpdate,\n (value: number | false) => {\n stopAutoUpdate();\n if (value) {\n startAutoUpdate();\n }\n }\n);\n\nonMounted(() => {\n startAutoUpdate();\n});\n\nonBeforeUnmount(() => {\n stopAutoUpdate();\n});\n</script>\n","<!-- eslint-disable vue/no-deprecated-slot-attribute -->\n<template>\n <sl-alert\n ref=\"alert\"\n class=\"c-toast\"\n :data-test=\"dataTest\"\n :data-open=\"isOpen || undefined\"\n :data-variant=\"computedVariant\"\n :class=\"`c-toast--${computedVariant}`\"\n :duration=\"duration\"\n :style=\"{ '--toast-base-transform': transform }\"\n @sl-hide=\"onHide\"\n @sl-after-hide=\"onAfterHide\"\n >\n <div class=\"flex-grow-1 d-flex flex-row align-center gap-4\">\n <slot name=\"icon\">\n <FontAwesomeIcon data-test=\"toast-icon\" fixed-width class=\"c-toast__icon\" :icon=\"icon\" />\n </slot>\n\n <div class=\"c-toast__message flex-grow-1\" data-test=\"toast-message\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <CIconButton\n data-test=\"toast-dismiss\"\n variant=\"tertiary\"\n :aria-label=\"$t('Close')\"\n :icon=\"faXmark\"\n @click=\"close\"\n />\n </sl-alert>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n faCircleCheck,\n faCircleExclamation,\n faInfoCircle,\n faXmark,\n} from '@fortawesome/pro-regular-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport '@shoelace-style/shoelace/dist/components/alert/alert.js';\nimport type SlAlert from '@shoelace-style/shoelace/dist/components/alert/alert.js';\nimport type { ElementAnimation } from '@shoelace-style/shoelace/dist/utilities/animation-registry';\nimport type { VNode } from 'vue';\nimport { computed, onBeforeUnmount, ref, watchEffect } from 'vue';\n\nimport CIconButton from '@propelinc/citrus-ui/src/components/CIconButton.vue';\nimport { useShoelaceAnimation } from '@propelinc/citrus-ui/src/composables/animation';\nimport { useShoelaceShadowParts } from '@propelinc/citrus-ui/src/composables/elements';\nimport { useDragListener } from '@propelinc/citrus-ui/src/composables/gestures';\nimport { slideLeft, slideRight } from '@propelinc/citrus-ui/src/services/animation';\nimport type { ToastVariant } from '@propelinc/citrus-ui/src/types';\n\n/** Default duration for the toast to be visible. */\nconst DEFAULT_DURATION = 5000;\n/** The minimum distance, in pixels, the user has to drag left or right for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_DISTANCE = 150;\n/** The minimum speed, in pixels per millisecond, the user has to swipe for\n * it to be considered a successful swipe. */\nconst MIN_SWIPE_VELOCITY = 0.75;\n\nconst props = withDefaults(\n defineProps<{\n /** The data-test attribute for the toast. */\n dataTest?: string;\n /** Controls (overrides) whether the toast is dismissible. */\n dismissible?: boolean | undefined;\n /**\n * @deprecated use `variant` prop instead\n * Renders the error state\n */\n error?: boolean;\n /** The message rendered in the toast, using the default slot overrides this value */\n message?: string;\n /**\n * @deprecated use `variant` prop instead\n * Renders the success state\n */\n success?: boolean;\n /** Show/hides the toast */\n value?: boolean;\n /** The variant of the toast */\n variant?: ToastVariant;\n /**\n * @deprecated use `variant` prop instead\n * Renders the warning state\n */\n warning?: boolean;\n }>(),\n {\n dataTest: 'toast',\n dismissible: undefined,\n error: false,\n message: '',\n success: false,\n variant: 'info',\n value: false,\n warning: false,\n }\n);\n\nconst emit = defineEmits<{\n hide: [];\n input: [value: boolean];\n}>();\n\ndefineSlots<{\n icon?: () => VNode[];\n default?: () => VNode[];\n}>();\n\nconst alert = ref<SlAlert | null>(null);\nconst isOpen = ref(props.value);\n\n/**\n * Handle merging the deprecated `error`, `success`, and `warning` props\n * with the `variant` prop.\n */\nconst computedVariant = computed(() => {\n if (props.error) {\n return 'error';\n } else if (props.success) {\n return 'success';\n } else if (props.warning) {\n return 'warning';\n }\n return props.variant;\n});\n\nconst show = async (): Promise<void> => {\n isOpen.value = true;\n alert.value?.toast();\n};\n\nconst onHide = (): void => {\n isOpen.value = false;\n emit('input', false);\n};\n\nconst close = async (): Promise<void> => {\n alert.value?.hide();\n};\n\n// If our value changes, show or hide the toast respectively\nwatchEffect(() => (props.value ? show() : close()));\n\n// Close the toast when the component is unmounted\nonBeforeUnmount(() => close());\n\nconst shouldAutoDismiss = computed(() => {\n if (props.dismissible !== undefined) {\n return !props.dismissible;\n }\n return computedVariant.value === 'success';\n});\n\nconst duration = computed(() => {\n return shouldAutoDismiss.value ? DEFAULT_DURATION : Infinity;\n});\n\nconst icon = computed(() => {\n if (computedVariant.value === 'error') {\n return faCircleExclamation;\n } else if (computedVariant.value === 'success') {\n return faCircleCheck;\n } else {\n return faInfoCircle;\n }\n});\n\nconst alertHideAnimation = ref<ElementAnimation | 'default'>('default');\nuseShoelaceAnimation(alert, 'alert.hide', alertHideAnimation);\n\nconst onAfterHide = (): void => {\n alertHideAnimation.value = 'default';\n emit('hide');\n};\n\nconst { base } = useShoelaceShadowParts(alert, ['base']);\nconst { dragDistance } = useDragListener(base, {\n onDragEnd: async ({ distance, velocity }) => {\n const absoluteDistance = Math.abs(distance.x);\n const absoluteVelocity = Math.abs(velocity.x);\n const shouldDismiss =\n absoluteDistance > MIN_SWIPE_DISTANCE || absoluteVelocity > MIN_SWIPE_VELOCITY;\n const dismissStart = absoluteDistance / base.value!.clientWidth;\n if (shouldDismiss) {\n const remainingDismissDistance = Math.max(base.value!.clientWidth - absoluteDistance, 0);\n const dismissDuration =\n remainingDismissDistance / Math.max(absoluteVelocity, MIN_SWIPE_VELOCITY);\n const slideDirection = velocity.x > 0 ? slideRight : slideLeft;\n alertHideAnimation.value = slideDirection({\n start: dismissStart,\n duration: dismissDuration,\n end: 1.1,\n });\n close();\n } else {\n const slideDirection = velocity.x > 0 ? slideRight : slideLeft;\n const slideBack = slideDirection({ start: dismissStart, end: 0 });\n base.value?.animate(slideBack.keyframes, slideBack.options);\n }\n },\n});\n\nconst transform = computed(() => {\n return `translateX(${dragDistance.value?.x ?? 0}px)`;\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@propelinc/citrus-ui/src/styles/core';\n\n.c-toast {\n margin: 16px;\n\n &::part(base) {\n background-color: $color-blue-200;\n border: none;\n border-radius: $border-radius-next;\n box-shadow: $box-shadow-toast;\n color: $color-black;\n transform: var(--toast-base-transform);\n }\n\n &::part(message) {\n @include body;\n\n align-items: center;\n display: flex;\n padding: 16px 0 16px 16px;\n }\n\n &::part(icon) {\n padding-left: 12px;\n }\n}\n\n.c-toast--error::part(base) {\n background-color: $color-red-200;\n}\n\n.c-toast--success::part(base) {\n background-color: $color-green-200;\n}\n\n.c-toast--warning::part(base) {\n background-color: $color-gold-200;\n}\n\n.c-toast__message {\n flex: auto;\n}\n\n.c-toast__icon {\n color: $color-black;\n font-size: $font-size-icon-medium;\n}\n</style>\n","import { type Ref, inject, provide, ref } from 'vue';\n\nimport type { ToastVariant } from '../types';\n\n// NOTE(slanden): Cannot use a symbol here because it may break the inject/provide chain across MFEs\nconst GlobalToast = 'GLOBAL_TOAST';\n\nexport interface Toast {\n id: number;\n dataTest?: string;\n message: string;\n variant: ToastVariant;\n dismissible?: boolean;\n}\n\ninterface ToastInjection {\n dismissToast: (id: Toast['id']) => void;\n showToast: (toast: Omit<Toast, 'id'>) => void;\n toasts: Ref<Toast[]>;\n}\n\nlet id = 0;\n\nfunction getNextIdDefault(): number {\n return id++;\n}\n\n/**\n * Custom provider for our toasts. Enables us to declaratively manage toasts in event handlers.\n *\n * NOTE: injecting `getNextId` allows us to test the composable without worry of side effects\n */\nexport function useToastProvider(getNextId: () => number = getNextIdDefault): ToastInjection {\n const toasts = ref<Toast[]>([]);\n\n function showToast(newToast: Omit<Toast, 'id'>): Toast['id'] {\n const toastId = getNextId();\n\n toasts.value.push({ ...newToast, id: toastId });\n\n return toastId;\n }\n\n function dismissToast(id: Toast['id']): void {\n toasts.value = toasts.value.filter((toast) => toast.id !== id);\n }\n\n const context: ToastInjection = {\n dismissToast,\n showToast,\n toasts,\n };\n\n provide(GlobalToast, context);\n\n return context;\n}\n\nexport function useToast(): ToastInjection {\n return inject<ToastInjection>(GlobalToast, {\n dismissToast: () => {},\n showToast: () => {},\n toasts: ref<Toast[]>([]),\n });\n}\n","<template>\n <CToast\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :value=\"true\"\n :data-test=\"toast.dataTest || 'c-toast'\"\n :message=\"toast.message\"\n :variant=\"toast.variant\"\n :dismissible=\"toast.dismissible\"\n @hide=\"dismissToast(toast.id)\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport CToast from '@propelinc/citrus-ui/src/components/CToast.vue';\n\nimport { useToast } from '../composables/toast';\n\nconst { toasts, dismissToast } = useToast();\n</script>\n","<template>\n <CMaskedTextField\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"field\"\n :data-test=\"dataTest\"\n :value=\"value\"\n name=\"zip\"\n :label=\"label || $t('ZIP Code')\"\n mask=\"#####\"\n :placeholder=\"placeholder || '12345'\"\n :minlength=\"5\"\n :maxlength=\"5\"\n type=\"tel\"\n autocorrect=\"off\"\n autocapitalize=\"none\"\n :rules=\"computedRules\"\n @input=\"$emit('input', $event)\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @change=\"$emit('change', $event)\"\n >\n <template #label>\n <slot name=\"label\" />\n </template>\n <template #message>\n <slot name=\"message\" />\n </template>\n </CMaskedTextField>\n</template>\n\n<script setup lang=\"ts\">\nimport type { VNode } from 'vue';\nimport { computed } from 'vue';\n\nimport CMaskedTextField from '@propelinc/citrus-ui/src/components/CMaskedTextField.vue';\nimport { useFocusableField } from '@propelinc/citrus-ui/src/composables/fields';\nimport { useTranslation } from '@propelinc/citrus-ui/src/composables/i18n';\nimport type { Rules } from '@propelinc/citrus-ui/src/composables/validations';\nimport { minLengthRule } from '@propelinc/shared-utils';\n\nconst props = withDefaults(\n defineProps<{\n dataTest?: string;\n id?: string;\n label?: string;\n placeholder?: string;\n rules?: Rules<string>;\n value?: string;\n }>(),\n {\n dataTest: 'zipcode-field',\n id: undefined,\n rules: (): Rules<string> => [],\n value: '',\n }\n);\n\ndefineEmits<{\n input: [value: string];\n focus: [event: Event];\n blur: [event: Event];\n change: [value: string];\n}>();\n\ndefineSlots<{\n label?: () => VNode[];\n message?: () => VNode[];\n}>();\n\nconst { t } = useTranslation();\n\nconst defaultRules = [\n minLengthRule(5, t('Please enter a valid {inputLabel}', { inputLabel: t('ZIP Code') })),\n];\nconst computedRules = computed(() => [...defaultRules, ...props.rules]);\n\nconst { field, focus } = useFocusableField();\ndefineExpose({ focus });\n</script>\n","import type { App, DefineComponent, Plugin } from 'vue';\n\nimport * as Components from '@propelinc/citrus-ui/src/components';\nimport { scrollIntoView, tapAnimation } from '@propelinc/citrus-ui/src/services/directives';\n\nconst plugin: Plugin = {\n install(app: App): void {\n Object.entries(Components).forEach(([name, component]): void => {\n app.component(name, component as DefineComponent);\n });\n\n // TODO: this has to be passed to the vue() plugin for Vite instead\n app.config.compilerOptions.isCustomElement = (tag): boolean => tag.startsWith('sl-');\n\n app.directive('scroll-into-view', scrollIntoView);\n app.directive('tap-animation', tapAnimation);\n },\n};\n\nexport default plugin;\n","import Colors from '@propelinc/citrus-ui/src/colors/colors';\n\ntype Theme = Record<string, string>;\n\nconst CitrusTheme = Object.entries(Colors).reduce<Theme>((theme, [colorName, hex]) => {\n const kebabCaseName = colorName.toLowerCase().replace(/_/g, '-');\n theme[kebabCaseName] = hex;\n return theme;\n}, {});\n\nexport default CitrusTheme;\n","import { faCircle, faSquare, faXmark } from '@fortawesome/pro-light-svg-icons';\nimport { faCircleDot, faSquareCheck } from '@fortawesome/pro-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nconst Icons = {\n citrusCheckboxOn: {\n component: FontAwesomeIcon,\n props: { icon: faSquareCheck },\n },\n citrusCheckboxOff: {\n component: FontAwesomeIcon,\n props: { icon: faSquare },\n },\n citrusRadioOn: {\n component: FontAwesomeIcon,\n props: { icon: faCircleDot },\n },\n citrusRadioOff: {\n component: FontAwesomeIcon,\n props: { icon: faCircle },\n },\n citrusClear: {\n component: FontAwesomeIcon,\n props: { icon: faXmark },\n },\n} as const;\n\nexport default Icons;\n","export interface SplitInputField {\n characters: number;\n placeholder?: string;\n separator?: string;\n}\n\nexport type SplitInputRule = (v: string) => string | boolean;\n\nexport enum InputVariants {\n DEFAULT = 'default',\n CONTAINED = 'contained',\n SEGMENTED = 'segmented',\n}\n\nexport type NotificationVariant = 'info' | 'success' | 'error' | 'warning';\n\nexport type ToastVariant = 'info' | 'success' | 'error' | 'warning';\n"],"names":["FLUID","ON_TOGGLE","props","__props","emit","__emit","fluid","toRefs","provide","accordion","ref","nextTick","openItems","acc","item","index","_createElementBlock","_renderSlot","_ctx","useShoelaceAnimation","el","animationName","animation","defaultAnimation","onMounted","getAnimation","animationValue","unref","setAnimation","isRef","watch","nextAnimation","TAP_ANIMATION_DURATION_MS","useTapAnimation","keyframes","downAnimation","upAnimation","onPointerDown","onPointerUp","useInternalValue","value","options","internalValue","newInternalValue","details","injectedFluid","inject","injectedOrPropFluid","computed","valueRef","injectedToggleItem","onChange","_normalizeClass","_unref","_createVNode","FontAwesomeIcon","faChevronDown","_createElementVNode","_hoisted_2","_hoisted_3","BLACK","GRAY_100","GRAY_200","GRAY_300","GRAY_400","GRAY_500","GREEN_500","GOLD_500","RED_500","Colors","isHexColor","color","isRgbaColor","isCssColor","isColorKey","isPaletteRgba","match","hex","n","_createBlock","_Transition","usePaletteColor","name","normalizedColor","toValue","normalizedName","cssColor","isPaletteColor","SIZE_TO_FONT_SIZE","SIZE_TO_TRACK_WIDTH","computedColor","computedTrackColor","computedSize","indicatorColorCode","trackColorCode","accessibleText","$t","_normalizeStyle","TERTIARY","INHERIT_COLOR","TERTIARY_ICON_BUTTON","INHERIT_COLOR_ICON_BUTTON","initialBackgroundColor","bgCssColor","calculatedTextColor","g","b","fullHex","ra","ga","ba","a","userTextCssColor","textCssColor","fixed","border","CFadeTransition","loading","CLoader","loaderAccessibleText","title","_hoisted_4","_toDisplayString","_openBlock","_hoisted_5","_hoisted_6","backgroundCssColor","computedStyle","style","dataTest","textColor","text","BLOCK","LARGE","BOUNCE_AMOUNT","large","toRef","_resolveDynamicComponent","tag","getViewport","scrollToElement","element","rect","windowHeight","appHeight","estimatedHeaderHeight","estimatedFooterHeight","contentStartY","contentEndY","isObscuredByHeader","isObscuredByFooter","scrollIntoView","inputEl","debounce","DEFAULT_BOUNCE_AMOUNT","setupTapAnimation","bounceAmount","animationListeners","event","handler","tapAnimation","binding","onClick","disabled","faXmark","useResizeObserver","callback","observer","onBeforeUnmount","useShoelaceShadowParts","shoelaceComponent","parts","shadowParts","part","shadowRoot","useDragListener","startDragTouch","lastDragTouch","dragVelocity","dragDistance","simplifyEvent","x","y","touchStartListener","touchMoveListener","newEvent","timeDelta","touchEndListener","addListeners","removeListeners","newElement","oldElement","useScrollBoundary","isScrolling","onScroll","onTouchEvent","onTouchEnd","useElasticClamp","resistance","min","max","absValue","isVisible","vnode","Comment","Fragment","children","child","useSlotHasContent","key","slots","useSlots","slot","DEFAULT_DURATION","DEFAULT_EASING","fadeIn","start","duration","easing","fadeOut","slideUp","slideDown","slideRight","end","slideLeft","MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","MIN_DISMISS_VELOCITY","MIN_DISMISS_DURATION","DRAG_CLAMP_DISTANCE","SHEET_HEIGHT_FALLBACK","setCustomAnimation","mounted","animatedValue","sheet","panel","overlayPart","bodyPart","handleDismiss","onRequestClose","onAfterClose","getTransformDistanceRatio","distance","velocity","remainingDismissDistance","dismissDuration","dismissStart","slideUpAnimation","fadeInAnimation","transformDistance","transformDistanceRatio","panelTransform","overlayOpacity","result","getDataTestAttr","suffix","footerHasContent","isDismissVisible","overlay","hideTitle","fixedSize","ariaLabel","contained","divided","$emit","CCloseButton","disableDismiss","CButtonStack","useLinkAttrs","href","useRouterLink","to","toWithDefault","useLinkResult","useLink","_navigate","_href","isRouterLink","error","BLOCK_BOUNCE_AMOUNT","BASE_BOUNCE_AMOUNT","VARIANT_TO_SHOELACE_VARIANT","routerDestination","navigate","routerDestinationOrHref","dataLoading","injectedBlock","injectedOrPropBlock","dataBlock","iconSlotHasContent","hasIcon","computedVariant","shoelaceVariant","injectedLarge","injectedOrPropsLarge","button","injectedBounceAmount","_mergeProps","iconPosition","level","target","_toHandlers","_cache","$event","icon","_hoisted_1","attrs","useAttrs","borderCssColor","routingVariant","config","tile","borderless","stretch","CCardHeader","appendSlotHasContent","isHidden","validationMessage","idCounter","useId","id","VALIDATIONS","useValidationRuleCheck","rules","required","active","message","valid","isEmpty","v","requiredRule","val","rulesResult","allRules","rule","passesRules","validate","useFormValidationSupport","state","formValidations","useValidations","validateOn","onValidationResultChange","startValidating","clearValidations","onInput","onBlur","newValue","oldValue","idWithFallback","checkbox","isValidationValid","validationListeners","variant","faCheck","label","CValidationMessage","hideDetails","vertical","numerator","displayText","useA11yLabelCheck","componentName","injectedTertiary","injectedOrPropTertiary","inheritColor","CButton","ariaLabelledby","spinIcon","useTranslation","currentInstance","getCurrentInstance","t","isFocused","inputHidden","inputType","hideToggleAriaLabel","inputValue","input","isInvalid","prefixSlotHasContent","suffixSlotHasContent","messageSlotHasContent","toggleHidden","onFocus","clearInput","focus","blur","__expose","fallthroughAttrs","_","__","rest","rootStyles","hideLabel","size","$attrs","clearable","hideable","placeholder","minlength","maxlength","inputmode","CIconButton","faEye","faEyeSlash","errorMessage","counter","CFormFieldCounter","counterValue","toNumber","parsed","useInputMask","maskOptions","onMaska","onMaskaArray","detail","maskInput","newInput","MaskInput","mask","Mask","maskedValue","useMaskedMinLength","maskTokens","findMaskedMinLength","maskArray","char","minlengthValue","m","useMaskedMaxLength","maxlengthValue","textField","inputMask","unmaskedValue","maskedMinLength","maskedMaxLength","unmaskedRules","CTextField","unmaskRules","parseDateFromString","dateString","date","calculateAge","dob","today","age","monthDiff","createMinLengthValidator","minLength","ruleFromValidator","validator","minLengthRule","isValidDateInAgeRange","minAge","maxAge","dobDate","isValidEmail","email","parseDate","year","month","day","formattedDate","lastEmittedValue","emitIsoDate","defaultLabel","defaultPlaceholder","inputLabel","defaultRules","createMinLengthRule","maxAgeRule","validDateRule","dayjs","computedLabel","computedPlaceholder","computedRules","dateLength","CMaskedTextField","select","_Fragment","_renderList","items","localMonth","localDay","localYear","hasError","messages","localValue","monthRules","dayRules","yearRules","monthOptions","i","dayOptions","daysInMonth","currentYear","yearOptions","localRules","validation","validationResult","emitDate","CSelect","ANIMATIONS_DISABLED","injectedDisabled","isDisabled","content","height","entry","hasValue","onFileChange","files","prompt","multiple","file","footer","footerElement","form","inputs","filteredInputs","inputArray","getInvalidInputs","newInvalidInputs","oldInvalidInputs","newValid","oldValid","invalidInputs","firstInvalidField","scrollIntoViewIfNeeded","_withModifiers","titleSlotHasContent","labelSlotHasContent","FontAwesomeIconComponent","useWhiteIcon","CSquaredIcon","iconColor","isLink","isButton","isTappable","tagAttrs","actionSlotHasContent","renderActionSlot","allAttrs","mergeProps","align","CListItemIcon","CListItemContent","slotName","actionIcon","faChevronRight","propelIcon","propelLockup","src","e","checkable","checked","selectable","checkType","CCheckbox","modal","enableExpandTransition","loadingMessage","dialogLabel","fullscreen","CExpandTransition","_hoisted_7","_hoisted_8","dismissible","CModal","hasButton","farXmark","titleIcon","buttonLoading","buttonTo","buttonHref","buttonTarget","buttonText","useFocusableField","field","SELECTED_VALUE","TOGGLE_VALUE","ROLE","injectedRole","injectedSelectedValue","toggleValue","toggleVariant","isSelected","ariaChecked","role","nextValue","$slots","option","CPill","_createTextVNode","popup","handleMouseLeave","handleOutsideClick","watchEffect","onUnmounted","rounded","indeterminate","trackCssColor","percentage","valueMax","trackWidth","RADIO_STATE","parentState","hideRadio","mandatory","radioGroup","column","fullWidth","squared","CSkeleton","LINE_TYPE_TO_CLASS","lineTypeClass","rows","direction","amount","type","autocomplete","fourDigitRule","fullSsnRule","fourDigitSsn","faLock","hasCount","displayCount","bordered","labelFirst","CListItem","CSwitch","textarea","isRoleButton","underline","args","SIZE_TO_VALUE","imageState","handleImageError","handleImageLoad","alt","timer","isoString","timeago","startAutoUpdate","stopAutoUpdate","alert","isOpen","show","onHide","close","shouldAutoDismiss","faCircleExclamation","faCircleCheck","faInfoCircle","alertHideAnimation","onAfterHide","base","absoluteDistance","absoluteVelocity","shouldDismiss","slideDirection","slideBack","transform","GlobalToast","useToast","toasts","dismissToast","toast","CToast","plugin","app","Components","component","CitrusTheme","theme","colorName","kebabCaseName","Icons","faSquareCheck","faSquare","faCircleDot","faCircle","InputVariants"],"mappings":"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"}
|