@salesql/sql_components_vue3 0.3.0 → 1.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.
Files changed (60) hide show
  1. package/dist/constants/events.d.ts +16 -0
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.ts +39 -8
  5. package/dist/index.es.js +1067 -150
  6. package/dist/index.es.js.map +1 -1
  7. package/dist/sql_components_vue3.css +1 -1
  8. package/dist/ui/DsAlert/DsAlert.types.d.ts +13 -0
  9. package/dist/ui/DsAlert/DsAlert.vue.d.ts +75 -0
  10. package/dist/ui/DsAlert/index.d.ts +2 -0
  11. package/dist/ui/DsAvatar/DsAvatar.types.d.ts +8 -0
  12. package/dist/ui/DsAvatar/DsAvatar.vue.d.ts +62 -0
  13. package/dist/ui/DsAvatar/index.d.ts +2 -0
  14. package/dist/ui/DsBadge/DsBadge.types.d.ts +9 -0
  15. package/dist/ui/DsBadge/DsBadge.vue.d.ts +26 -0
  16. package/dist/ui/DsBadge/index.d.ts +2 -0
  17. package/dist/ui/DsButton/DsButton.types.d.ts +21 -0
  18. package/dist/ui/DsButton/DsButton.vue.d.ts +94 -0
  19. package/dist/ui/DsButton/index.d.ts +2 -0
  20. package/dist/ui/DsCheckbox/DsCheckbox.types.d.ts +7 -0
  21. package/dist/ui/DsCheckbox/DsCheckbox.vue.d.ts +49 -0
  22. package/dist/ui/DsCheckbox/index.d.ts +2 -0
  23. package/dist/ui/DsContactValue/DsContactValue.types.d.ts +16 -0
  24. package/dist/ui/DsContactValue/DsContactValue.vue.d.ts +112 -0
  25. package/dist/ui/DsContactValue/index.d.ts +2 -0
  26. package/dist/ui/DsDataCard/DsDataCard.types.d.ts +9 -0
  27. package/dist/ui/DsDataCard/DsDataCard.vue.d.ts +173 -0
  28. package/dist/ui/DsDataCard/index.d.ts +2 -0
  29. package/dist/ui/DsInput/DsInput.types.d.ts +15 -0
  30. package/dist/ui/DsInput/DsInput.vue.d.ts +112 -0
  31. package/dist/ui/DsInput/index.d.ts +2 -0
  32. package/dist/ui/DsModal/DsModal.types.d.ts +8 -0
  33. package/dist/ui/DsModal/DsModal.vue.d.ts +69 -0
  34. package/dist/ui/DsModal/index.d.ts +2 -0
  35. package/dist/ui/DsNotification/DsNotification.types.d.ts +14 -0
  36. package/dist/ui/DsNotification/DsNotification.vue.d.ts +83 -0
  37. package/dist/ui/DsNotification/index.d.ts +2 -0
  38. package/dist/ui/DsSpinner/DsSpinner.types.d.ts +6 -0
  39. package/dist/ui/{SqlSpinner/SqlSpinner.vue.d.ts → DsSpinner/DsSpinner.vue.d.ts} +15 -15
  40. package/dist/ui/DsSpinner/index.d.ts +2 -0
  41. package/dist/ui/DsTable/DsTable.types.d.ts +16 -0
  42. package/dist/ui/{BasicTable/BasicTable.vue.d.ts → DsTable/DsTable.vue.d.ts} +15 -6
  43. package/dist/ui/DsTable/index.d.ts +2 -0
  44. package/dist/ui/DsTag/DsTag.types.d.ts +8 -0
  45. package/dist/ui/DsTag/DsTag.vue.d.ts +45 -0
  46. package/dist/ui/DsTag/index.d.ts +2 -0
  47. package/dist/ui/DsTextarea/DsTextarea.types.d.ts +8 -0
  48. package/dist/ui/DsTextarea/DsTextarea.vue.d.ts +70 -0
  49. package/dist/ui/DsTextarea/index.d.ts +2 -0
  50. package/dist/ui/DsVerificationIcon/DsVerificationIcon.types.d.ts +6 -0
  51. package/dist/ui/DsVerificationIcon/DsVerificationIcon.vue.d.ts +52 -0
  52. package/dist/ui/DsVerificationIcon/index.d.ts +2 -0
  53. package/package.json +6 -6
  54. package/dist/ui/BasicTable/BasicTable.types.d.ts +0 -16
  55. package/dist/ui/BasicTable/index.d.ts +0 -2
  56. package/dist/ui/SqlButton/SqlButton.types.d.ts +0 -31
  57. package/dist/ui/SqlButton/SqlButton.vue.d.ts +0 -75
  58. package/dist/ui/SqlButton/index.d.ts +0 -2
  59. package/dist/ui/SqlSpinner/SqlSpinner.types.d.ts +0 -11
  60. package/dist/ui/SqlSpinner/index.d.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/ui/SqlSpinner/SqlSpinner.types.ts","../src/ui/SqlSpinner/SqlSpinner.vue","../src/ui/SqlButton/SqlButton.types.ts","../src/constants/events.ts","../src/ui/SqlButton/SqlButton.vue","../src/ui/BasicTable/BasicTable.types.ts","../src/ui/BasicTable/BasicTable.vue"],"sourcesContent":["// Tema del spinner (clases: theme-<mode>)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para fondos oscuros: spinner claro\n DARK: 'dark', // para fondos claros: spinner oscuro\n} as const;\nexport type SqlSpinnerThemeMode =\n (typeof SQL_SPINNER_THEME_MODES)[keyof typeof SQL_SPINNER_THEME_MODES];\n\n// Tamaños (clases: sql-spinner--<size>)\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n} from './SqlSpinner.types';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.SMALL,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: '',\n },\n});\n\nconst hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n/* Accesibilidad (solo-lectura visual) */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes sql-spin {\n to {\n transform: rotate(1turn);\n }\n}\n\n.sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* color del anillo por tema (paridad con los PNG de frontend-app) */\n --sql-spinner-color: #{colors.$primary-accent-main};\n\n /* Tamaños (paridad con frontend-app: small=20, medium=36, large=64) */\n &.sql-spinner--small {\n width: 20px;\n height: 20px;\n }\n &.sql-spinner--medium {\n width: 36px;\n height: 36px;\n }\n &.sql-spinner--large {\n width: 64px;\n height: 64px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n\n /* Anillo con gradiente cónico transparente → color (arco que se desvanece) */\n background: conic-gradient(from 90deg, transparent 8%, var(--sql-spinner-color) 100%);\n\n /* Recorta el centro para dejar solo el anillo (grosor ~16% del radio ≈ 8% del diámetro,\n medido sobre los PNG de frontend-app) */\n mask: radial-gradient(farthest-side, transparent calc(100% - 16%), #000 calc(100% - 16%));\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-mask: radial-gradient(\n farthest-side,\n transparent calc(100% - 16%),\n #000 calc(100% - 16%)\n );\n\n animation: sql-spin 1s linear infinite;\n }\n\n /* Temas */\n &.theme-dark {\n --sql-spinner-color: #{colors.$primary-accent-main};\n }\n &.theme-light {\n --sql-spinner-color: #{colors.$white};\n }\n}\n</style>\n","// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n SPECIAL3: 'special3',\n DOTTED: 'dotted',\n DANGER: 'danger',\n GRADIENT: 'gradient',\n} as const;\nexport type SqlButtonType = (typeof SQL_BUTTON_TYPES)[keyof typeof SQL_BUTTON_TYPES];\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const;\nexport type SqlButtonSize = (typeof SQL_BUTTON_SIZES)[keyof typeof SQL_BUTTON_SIZES];\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type SqlButtonNativeType =\n (typeof SQL_BUTTON_NATIVE_TYPES)[keyof typeof SQL_BUTTON_NATIVE_TYPES];\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { SqlSpinner, SQL_SPINNER_THEME_MODES } from '@shared/ui/SqlSpinner';\nimport {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n} from './SqlButton.types';\nimport { CLICK } from '@shared/constants/events';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n});\n\nconst emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n}>();\n\nconst spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY || props.type === SQL_BUTTON_TYPES.DANGER\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n\n/* keyframes a nivel raíz */\n@keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n}\n\n$default-background: colors.$white;\n\n.sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition:\n background 0.2s,\n color 0.2s,\n border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n\n white-space: nowrap;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special3 {\n color: colors.$primary-accent-main;\n font-weight: 400;\n\n background-color: colors.$primary-accent-tint;\n\n &:hover {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n &.sql-button--danger {\n color: colors.$tertiary-accent-main !important;\n\n background-color: colors.$tertiary-accent-tint;\n\n &:hover {\n background-color: colors.$tertiary-accent-mid;\n }\n &.is-disabled {\n color: colors.$tertiary-accent-mid;\n background-color: colors.$tertiary-accent-tint;\n }\n }\n\n &.sql-button--gradient {\n color: colors.$white !important;\n\n background: linear-gradient(\n 106.21deg,\n colors.$ai-gradient-1 22.52%,\n colors.$ai-gradient-2 100%\n );\n\n &:hover {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-hover 22.52%,\n colors.$ai-gradient-2 100%\n ) !important;\n }\n &.is-disabled {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-disabled 22.52%,\n colors.$ai-gradient-2 100%\n );\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n width: s.spacing(3);\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n}\n</style>\n","// Alineación de una columna (clases: basic-table__th--<align> / __td--<align>)\nexport const BASIC_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type BasicTableAlign = (typeof BASIC_TABLE_ALIGN)[keyof typeof BASIC_TABLE_ALIGN];\n\n// Definición de una columna. `key` mapea a la propiedad de la row para el\n// contenido por defecto y da nombre al slot scoped `cell-<key>`.\nexport interface BasicTableColumn {\n key: string;\n label: string;\n align?: BasicTableAlign;\n width?: string;\n}\n\n// Row genérica: sólo se exige un `id` estable para el :key; el resto de las\n// propiedades las consume cada columna vía su `key`.\nexport interface BasicTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { BASIC_TABLE_ALIGN, type BasicTableColumn, type BasicTableRow } from './BasicTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<BasicTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<BasicTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n});\n</script>\n\n<template>\n <div class=\"basic-table\">\n <div class=\"basic-table__wrapper\">\n <table class=\"basic-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__th--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td\n class=\"basic-table__empty\"\n :colspan=\"columns.length\"\n data-testid=\"basic-table-empty\"\n >\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr v-for=\"row in rows\" :key=\"row.id\" data-testid=\"basic-table-row\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__td--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/font-size.scss' as f;\n\n.basic-table {\n &__wrapper {\n border: 1px solid colors.$primary-tint;\n border-radius: 8px;\n\n overflow-x: auto;\n }\n\n &__table {\n width: 100%;\n\n border-collapse: collapse;\n\n // Own every border/height explicitly so the table stays consistent even\n // when embedded in a host app whose global `table td/th` rules would\n // otherwise leak in. The scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$primary-main;\n font-weight: 700;\n font-size: f.font-size('text');\n\n border: 0;\n border-bottom: 1px solid colors.$primary-tint;\n\n background-color: colors.$primary-background;\n }\n\n td {\n height: auto;\n padding: s.spacing(2);\n\n color: colors.$primary-main;\n font-size: f.font-size('text');\n\n border: 0;\n }\n\n tr {\n border: 0;\n }\n\n // Row separator only BETWEEN adjacent body rows: empty/single → none.\n tbody tr + tr {\n border-top: 1px solid colors.$primary-tint;\n }\n }\n\n // Alignment modifiers are always emitted, so each owns its text-align and\n // no base `th` text-align competes on specificity.\n &__th--left,\n &__td--left {\n text-align: left;\n }\n\n &__th--center,\n &__td--center {\n text-align: center;\n }\n\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$primary-secondary-text;\n text-align: center;\n }\n}\n</style>\n"],"names":["SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","_unref","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx","BASIC_TABLE_ALIGN","_hoisted_1","_hoisted_3","_Fragment","_renderList","column","_a","_normalizeStyle","_hoisted_4","row"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/ui/DsSpinner/DsSpinner.types.ts","../src/ui/DsSpinner/DsSpinner.vue","../src/constants/events.ts","../src/ui/DsButton/DsButton.types.ts","../src/ui/DsButton/DsButton.vue","../src/ui/DsTag/DsTag.types.ts","../src/ui/DsTag/DsTag.vue","../src/ui/DsBadge/DsBadge.types.ts","../src/ui/DsBadge/DsBadge.vue","../src/ui/DsAvatar/DsAvatar.vue","../src/ui/DsTable/DsTable.types.ts","../src/ui/DsTable/DsTable.vue","../src/ui/DsInput/DsInput.types.ts","../src/ui/DsInput/DsInput.vue","../src/ui/DsTextarea/DsTextarea.vue","../src/ui/DsCheckbox/DsCheckbox.vue","../src/ui/DsAlert/DsAlert.types.ts","../src/ui/DsAlert/DsAlert.vue","../src/ui/DsNotification/DsNotification.types.ts","../src/ui/DsNotification/DsNotification.vue","../src/ui/DsModal/DsModal.vue","../src/ui/DsVerificationIcon/DsVerificationIcon.types.ts","../src/ui/DsVerificationIcon/DsVerificationIcon.vue","../src/ui/DsContactValue/DsContactValue.vue","../src/ui/DsDataCard/DsDataCard.vue"],"sourcesContent":["// DsSpinner — the DS \"Spinner\": a rotating border-ring. Tones mirror Spinner.jsx.\n\nexport const DS_SPINNER_TONES = {\n DARK: 'dark', // slate ring — for light surfaces (default)\n LIGHT: 'light', // white ring — for dark surfaces / solid buttons\n ACCENT: 'accent', // accent ring\n} as const;\nexport type DsSpinnerTone = (typeof DS_SPINNER_TONES)[keyof typeof DS_SPINNER_TONES];\n","<template>\n <span\n class=\"ds-spinner\"\n :class=\"`ds-spinner--${tone}`\"\n role=\"status\"\n :style=\"{ width: `${size}px`, height: `${size}px` }\"\n :aria-label=\"label || undefined\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <span v-if=\"label\" class=\"ds-spinner__sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_SPINNER_TONES, type DsSpinnerTone } from './DsSpinner.types';\n\ndefineProps({\n size: { type: Number, default: 24 },\n tone: {\n type: String as PropType<DsSpinnerTone>,\n default: DS_SPINNER_TONES.DARK,\n },\n // Optional accessible text; without it the spinner is aria-hidden.\n label: { type: String, default: '' },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/motion.scss' as m;\n\n@keyframes ds-spinner-rot {\n to {\n transform: rotate(360deg);\n }\n}\n\n.ds-spinner {\n display: inline-block;\n\n border: 2px solid;\n border-radius: 50%;\n\n animation: ds-spinner-rot 1s linear infinite;\n\n @include m.reduce-motion {\n animation: none;\n }\n\n &--dark {\n border-color: colors.$slate-tint;\n border-top-color: colors.$slate-main;\n }\n &--light {\n border-color: rgba(255, 255, 255, 0.4);\n border-top-color: colors.$white;\n }\n &--accent {\n border-color: colors.$accent-mid;\n border-top-color: colors.$accent-main;\n }\n\n &__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n</style>\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n\n// Evento de cierre (p. ej. DsTag con × / closable) — mapea a onClose del DS\nexport const CLOSE = 'close' as const;\nexport type CloseEventName = typeof CLOSE;\n\n// Eventos de foco de controles de formulario (DsInput / DsTextarea)\nexport const FOCUS = 'focus' as const;\nexport type FocusEventName = typeof FOCUS;\n\nexport const BLUR = 'blur' as const;\nexport type BlurEventName = typeof BLUR;\n\n// Eventos de la familia data (DsContactValue / DsDataCard).\n// COPY lleva el valor copiado; CORRECT / INCORRECT marcan el rating de un dato.\nexport const COPY = 'copy' as const;\nexport type CopyEventName = typeof COPY;\n\nexport const CORRECT = 'correct' as const;\nexport type CorrectEventName = typeof CORRECT;\n\nexport const INCORRECT = 'incorrect' as const;\nexport type IncorrectEventName = typeof INCORRECT;\n\n// Acciones de cabecera de DsDataCard.\nexport const SORT = 'sort' as const;\nexport type SortEventName = typeof SORT;\n\nexport const EDIT = 'edit' as const;\nexport type EditEventName = typeof EDIT;\n","// DsButton — 1:1 with the SalesQL Design System \"Button\" specimen.\n// Variants/sizes are the ONLY ones the DS defines; more arrive when the DS grows.\n\n// Variants (classes: ds-button--<variant>)\nexport const DS_BUTTON_VARIANTS = {\n PRIMARY: 'primary', // solid accent fill, white text\n SECONDARY: 'secondary', // slate surface fill, dark text\n TERTIARY: 'tertiary', // transparent ghost, dark text\n QUATERNARY: 'quaternary', // accent border + accent text, light fill\n SPECIAL: 'special', // accent text only, no fill/border (link-style)\n} as const;\nexport type DsButtonVariant = (typeof DS_BUTTON_VARIANTS)[keyof typeof DS_BUTTON_VARIANTS];\n\n// Sizes = DS control heights (classes: ds-button--<size>)\nexport const DS_BUTTON_SIZES = {\n SMALL: 'small', // 24px\n MEDIUM: 'medium', // 32px\n LARGE: 'large', // 36px\n XLARGE: 'xlarge', // 48px\n} as const;\nexport type DsButtonSize = (typeof DS_BUTTON_SIZES)[keyof typeof DS_BUTTON_SIZES];\n\n// Native <button> type\nexport const DS_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type DsButtonNativeType =\n (typeof DS_BUTTON_NATIVE_TYPES)[keyof typeof DS_BUTTON_NATIVE_TYPES];\n","<template>\n <button\n class=\"ds-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :class=\"[\n `ds-button--${variant}`,\n `ds-button--${size}`,\n {\n 'is-disabled': disabled || loading,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-dashed': dashed,\n },\n ]\"\n @click=\"handleClick\"\n >\n <DsSpinner v-if=\"loading\" class=\"ds-button__spinner\" :size=\"iconSize\" :tone=\"spinnerTone\" />\n\n <span\n v-if=\"!loading && (leftIcon || $slots.leading)\"\n class=\"ds-button__icon ds-button__icon--leading\"\n >\n <slot name=\"leading\"\n ><i class=\"material-icons\" aria-hidden=\"true\">{{ leftIcon }}</i></slot\n >\n </span>\n\n <span v-if=\"!loading && $slots.default\" class=\"ds-button__label\"><slot /></span>\n\n <span\n v-if=\"!loading && (rightIcon || $slots.trailing)\"\n class=\"ds-button__icon ds-button__icon--trailing\"\n >\n <slot name=\"trailing\"\n ><i class=\"material-icons\" aria-hidden=\"true\">{{ rightIcon }}</i></slot\n >\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { DsSpinner, DS_SPINNER_TONES } from '@shared/ui/DsSpinner';\nimport { CLICK } from '@shared/constants/events';\nimport {\n DS_BUTTON_NATIVE_TYPES,\n DS_BUTTON_SIZES,\n DS_BUTTON_VARIANTS,\n type DsButtonNativeType,\n type DsButtonSize,\n type DsButtonVariant,\n} from './DsButton.types';\n\nconst props = defineProps({\n variant: { type: String as PropType<DsButtonVariant>, default: DS_BUTTON_VARIANTS.PRIMARY },\n size: { type: String as PropType<DsButtonSize>, default: DS_BUTTON_SIZES.MEDIUM },\n nativeType: {\n type: String as PropType<DsButtonNativeType>,\n default: DS_BUTTON_NATIVE_TYPES.BUTTON,\n },\n // Material Icon names (rendered via <i class=\"material-icons\">); a leading/\n // trailing slot overrides. Icon-only buttons need ariaLabel.\n leftIcon: { type: String, default: '' },\n rightIcon: { type: String, default: '' },\n ariaLabel: { type: String, default: '' },\n disabled: Boolean,\n loading: Boolean,\n circle: Boolean,\n dashed: Boolean,\n autofocus: Boolean,\n});\n\n// Runtime array (not the type-only form): the SFC compiler can't resolve\n// `typeof CLICK` to a literal, leaving `emits` empty at runtime. With `click`\n// undeclared, the parent's @click both falls through to the native <button>\n// AND is invoked by emit() → the listener fires twice. Declaring it at runtime\n// (via the CLICK constant, per convention) excludes it from fallthrough.\nconst emit = defineEmits([CLICK]);\n\nconst iconSize = computed(() => (props.size === DS_BUTTON_SIZES.SMALL ? 14 : 20));\nconst spinnerTone = computed(() =>\n props.variant === DS_BUTTON_VARIANTS.PRIMARY ? DS_SPINNER_TONES.LIGHT : DS_SPINNER_TONES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return;\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n\n padding: 0;\n\n font-family: t.$font-family;\n font-weight: t.$weight-medium; // 500 (DS); small overrides to 400\n font-size: t.font-size('body');\n line-height: 20px;\n\n border: 1px solid transparent;\n border-radius: r.$radius-control;\n outline: none;\n\n cursor: pointer;\n transition:\n background-color m.$duration-default m.$easing,\n border-color m.$duration-default m.$easing,\n opacity m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.is-disabled {\n opacity: 0.55;\n cursor: not-allowed;\n }\n\n &__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n // DS icon size: 20px (small → 14px). Sizing the glyph to fill its box also\n // removes the optical \"gap\" a smaller glyph leaves against the button edge.\n .material-icons {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n }\n\n // Material glyphs carry a built-in keyline (~2–3px advance bearing). Absorb it\n // on the edge side so a leading/trailing icon sits at the same optical inset as\n // a text-only button. Not for icon-only (circle) buttons — those stay centered.\n &:not(.is-circle) &__icon--leading {\n margin-left: -3px;\n }\n &:not(.is-circle) &__icon--trailing {\n margin-right: -3px;\n }\n\n &__spinner {\n /* size comes from the :size prop (iconSize) */\n }\n\n /* ---------- Variants ---------- */\n &--primary {\n color: colors.$white;\n background-color: colors.$accent-main;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$accent-shadow;\n }\n }\n &--secondary {\n color: colors.$slate-main;\n background-color: colors.$slate-bg;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$slate-tint;\n }\n }\n &--tertiary {\n color: colors.$slate-main;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$slate-tint;\n }\n }\n &--quaternary {\n color: colors.$accent-main;\n border-color: colors.$accent-mid;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n border-color: colors.$accent-main;\n }\n }\n &--special {\n color: colors.$accent-main;\n background-color: colors.$white;\n\n &:hover:not(.is-disabled) {\n background-color: colors.$accent-bg;\n }\n }\n\n /* ---------- Dashed \"add\" affordance ---------- */\n &.is-dashed {\n color: colors.$slate-mid;\n font-weight: t.$weight-bold;\n\n border: 1px dashed colors.$slate-mid;\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$accent-main;\n border-color: colors.$accent-main;\n background-color: colors.$accent-bg;\n }\n }\n\n /* ---------- Sizes (DS control heights + paddings) ---------- */\n &--small {\n height: s.control-height('small');\n padding: 0 s.control-padding('small');\n gap: 2px;\n\n font-weight: t.$weight-regular; // 400\n font-size: t.font-size('caption');\n\n .ds-button__icon .material-icons {\n font-size: i.icon-size(14);\n }\n }\n &--medium {\n height: s.control-height('medium');\n padding: 0 s.control-padding('medium');\n }\n &--large {\n height: s.control-height('large');\n padding: 0 s.control-padding('large');\n }\n &--xlarge {\n height: s.control-height('xlarge');\n padding: 0 s.control-padding('xlarge');\n }\n\n /* ---------- Circle (icon-only) ---------- */\n &.is-circle {\n padding: 8px;\n border-radius: r.$radius-full;\n aspect-ratio: 1;\n }\n}\n</style>\n","// DsTag — the DS \"Tag\": small bordered chip with optional close (×).\n// ⚠️ NOT the solid pill (that is DsBadge). See DESIGN-SYSTEM.md reconciliation.\n// Tones mirror the DS Tag source (Tag.jsx TONES). `rounded` → semicircular sides.\n\nexport const DS_TAG_TONES = {\n DEFAULT: 'default', // white bg, slate-tint border, muted text\n SUCCESS: 'success', // e.g. Verified\n INFO: 'info', // e.g. Work\n WARNING: 'warning', // e.g. Pending\n ERROR: 'error', // e.g. Bounced\n} as const;\nexport type DsTagTone = (typeof DS_TAG_TONES)[keyof typeof DS_TAG_TONES];\n","<template>\n <span class=\"ds-tag\" :class=\"[`ds-tag--${tone}`, { 'is-rounded': rounded }]\">\n <slot />\n\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ds-tag__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"emit(CLOSE)\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport { DS_TAG_TONES, type DsTagTone } from './DsTag.types';\n\ndefineProps({\n tone: {\n type: String as PropType<DsTagTone>,\n default: DS_TAG_TONES.DEFAULT,\n },\n // Semicircular sides (DS `rounded`): radius-round vs the default radius-control.\n rounded: Boolean,\n // Show a × close control that emits `close`.\n closable: Boolean,\n // Accessible name for the × control (the app owns the wording / i18n).\n closeLabel: {\n type: String,\n default: '',\n },\n});\n\nconst emit = defineEmits<{\n (e: typeof CLOSE): void;\n}>();\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n\n padding: 0 10px;\n\n color: colors.$slate-mid;\n font-family: t.$font-family;\n font-weight: t.$weight-regular;\n font-size: t.font-size('caption');\n line-height: 30px;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-tint;\n border-radius: r.$radius-control;\n\n white-space: nowrap;\n\n &.is-rounded {\n border-radius: r.$radius-round;\n }\n\n &__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(12);\n }\n }\n\n /* ---------- Tones (default: white + tint border + muted text) ---------- */\n &--default {\n color: colors.$slate-mid;\n border-color: colors.$slate-tint;\n background-color: colors.$white;\n }\n &--success {\n color: colors.$success-shadow;\n border-color: colors.$success-mid;\n background-color: colors.$success-tint;\n }\n &--info {\n color: colors.$info-shadow;\n border-color: colors.$info-mid;\n background-color: colors.$info-tint;\n }\n &--warning {\n color: colors.$warning-shadow;\n border-color: colors.$warning-mid;\n background-color: colors.$warning-tint;\n }\n &--error {\n color: colors.$error-shadow;\n border-color: colors.$error-mid;\n background-color: colors.$error-tint;\n }\n}\n</style>\n","// DsBadge — the DS \"Badge\": solid, white-text pill (value types & counts).\n// ⚠️ NOT the tint chip (that is DsTag). See DESIGN-SYSTEM.md reconciliation.\n// Tones mirror the DS Badge source (Badge.jsx TONES).\n\nexport const DS_BADGE_TONES = {\n ACCENT: 'accent', // e.g. Work (purple)\n GREY: 'grey', // e.g. Direct (slate-soft)\n INFO: 'info', // e.g. Mobile (blue)\n SUCCESS: 'success', // e.g. New (green)\n ERROR: 'error', // coral\n WARNING: 'warning', // orange\n} as const;\nexport type DsBadgeTone = (typeof DS_BADGE_TONES)[keyof typeof DS_BADGE_TONES];\n","<template>\n <span class=\"ds-badge\" :class=\"`ds-badge--${tone}`\">\n <slot />\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_BADGE_TONES, type DsBadgeTone } from './DsBadge.types';\n\ndefineProps({\n tone: {\n type: String as PropType<DsBadgeTone>,\n default: DS_BADGE_TONES.ACCENT,\n },\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n\n.ds-badge {\n display: inline-flex;\n align-items: center;\n\n height: 17px;\n padding: 0 8px;\n\n color: colors.$white;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 17px;\n\n border-radius: r.$radius-pill;\n\n white-space: nowrap;\n\n /* ---------- Tones (solid fill, white text) ---------- */\n &--accent {\n background-color: colors.$accent-main;\n }\n &--grey {\n background-color: colors.$slate-soft;\n }\n &--info {\n background-color: colors.$info-main;\n }\n &--success {\n background-color: colors.$success-main;\n }\n &--error {\n background-color: colors.$error-main;\n }\n &--warning {\n background-color: colors.$warning-main;\n }\n}\n</style>\n","<template>\n <img\n v-if=\"image\"\n class=\"ds-avatar\"\n :class=\"{ 'is-circular': circular }\"\n :src=\"image\"\n :alt=\"alt\"\n :style=\"boxStyle\"\n />\n\n <div\n v-else-if=\"initials\"\n class=\"ds-avatar ds-avatar--initials\"\n :class=\"{ 'is-circular': circular }\"\n role=\"img\"\n :aria-label=\"ariaLabel || undefined\"\n :style=\"[\n boxStyle,\n { background: hashed.bg, color: hashed.fg, fontSize: `${Math.round(size * 0.4)}px` },\n ]\"\n >\n {{ initials }}\n </div>\n\n <div\n v-else\n class=\"ds-avatar ds-avatar--placeholder\"\n :class=\"{ 'is-circular': circular }\"\n :style=\"boxStyle\"\n aria-hidden=\"true\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = defineProps({\n image: { type: String, default: '' },\n firstName: { type: String, default: '' },\n lastName: { type: String, default: '' },\n uid: { type: String, default: '' },\n size: { type: Number, default: 40 },\n circular: Boolean,\n // Accessible label (defaults to \"firstName lastName\").\n alt: { type: String, default: '' },\n});\n\nconst initials = computed(() =>\n props.firstName && props.lastName\n ? (props.firstName.charAt(0) + props.lastName.charAt(0)).toUpperCase()\n : ''\n);\n\nconst ariaLabel = computed(() => props.alt || `${props.firstName} ${props.lastName}`.trim());\n\nconst boxStyle = computed(() => ({ width: `${props.size}px`, height: `${props.size}px` }));\n\n// Deterministic color from a uid — exact port of SqlAvatar.getBackgroundColor.\nconst hashed = computed(() => {\n const seed = props.uid || props.firstName + props.lastName;\n let hash = 0;\n for (let i = 0; i < seed.length; i++) {\n hash = seed.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n const rgb = [0, 0, 0];\n for (let i = 0; i < 3; i++) rgb[i] = (hash >> (i * 8)) & 255;\n const light = rgb[0] >= 200 && rgb[1] >= 200 && rgb[2] >= 200;\n return { bg: `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`, fg: light ? '#323f4b' : '#fff' };\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n\n.ds-avatar {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n overflow: hidden;\n object-fit: cover;\n\n border-radius: r.$radius-control;\n\n &.is-circular {\n border-radius: r.$radius-full;\n }\n\n &--initials {\n font-family: t.$font-family;\n font-weight: t.$weight-black;\n line-height: 1;\n user-select: none;\n }\n\n &--placeholder {\n background-color: #c0c4cc; // DS placeholder grey (Avatar.jsx)\n }\n}\n</style>\n","// DsTable — the DS data table (data-dense density). Column/row API with hairline\n// borders, row hover, and an optional highlighted \"most likely\" row.\n\nexport const DS_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type DsTableAlign = (typeof DS_TABLE_ALIGN)[keyof typeof DS_TABLE_ALIGN];\n\n// A column. `key` maps to the row property for default content and names the\n// scoped slot `cell-<key>`.\nexport interface DsTableColumn {\n key: string;\n label: string;\n align?: DsTableAlign;\n width?: string;\n}\n\n// A row: only a stable `id` is required (for :key and highlighting); the rest of\n// the properties are consumed per column via its `key`.\nexport interface DsTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { DS_TABLE_ALIGN, type DsTableColumn, type DsTableRow } from './DsTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<DsTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<DsTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n // id of the row to highlight (the DS \"most likely\" row → accent surface).\n highlightRowId: {\n type: [String, Number] as PropType<string | number | null>,\n default: null,\n },\n});\n</script>\n\n<template>\n <div class=\"ds-table\">\n <div class=\"ds-table__wrapper\">\n <table class=\"ds-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`ds-table__th--${column.align ?? DS_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td class=\"ds-table__empty\" :colspan=\"columns.length\" data-testid=\"ds-table-empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr\n v-for=\"row in rows\"\n :key=\"row.id\"\n :class=\"{ 'is-highlighted': row.id === highlightRowId }\"\n data-testid=\"ds-table-row\"\n >\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`ds-table__td--${column.align ?? DS_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-table {\n &__wrapper {\n overflow-x: auto;\n\n border: 1px solid colors.$slate-tint;\n border-radius: r.$radius-card-lg;\n }\n\n &__table {\n width: 100%;\n border-collapse: collapse;\n\n // Own every border/height explicitly so host-app global table rules can't\n // leak in; scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$slate-main;\n font-weight: t.$weight-bold;\n font-size: t.font-size('body');\n\n border: 0;\n border-bottom: 1px solid colors.$slate-tint;\n\n background-color: colors.$slate-bg;\n }\n\n td {\n height: auto;\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$slate-main;\n font-size: t.font-size('body');\n\n border: 0;\n }\n\n tr {\n border: 0;\n transition: background-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n }\n\n // Row separator only BETWEEN adjacent body rows.\n tbody tr + tr {\n border-top: 1px solid colors.$slate-tint;\n }\n\n // Row hover (data-dense affordance).\n tbody tr:hover {\n background-color: colors.$slate-bg;\n }\n\n // The highlighted \"most likely\" row wins over hover.\n tbody tr.is-highlighted {\n background-color: colors.$accent-bg;\n }\n tbody tr.is-highlighted:hover {\n background-color: colors.$accent-tint;\n }\n }\n\n &__th--left,\n &__td--left {\n text-align: left;\n }\n &__th--center,\n &__td--center {\n text-align: center;\n }\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$slate-soft;\n text-align: center;\n }\n}\n</style>\n","// DsInput — the DS \"Input\": single-line field. Prop vocabulary mirrors Input.jsx.\n// Border: primary-main at rest → accent on focus, coral on error. NO bold-on-focus\n// (the DS source keeps the text at weight 400). Sizes are the DS input heights.\n\nexport const DS_INPUT_TYPES = {\n TEXT: 'text',\n EMAIL: 'email',\n PASSWORD: 'password',\n TEL: 'tel',\n NUMBER: 'number',\n SEARCH: 'search',\n URL: 'url',\n} as const;\nexport type DsInputType = (typeof DS_INPUT_TYPES)[keyof typeof DS_INPUT_TYPES];\n\nexport const DS_INPUT_SIZES = {\n SM: 'sm', // 36px\n MD: 'md', // 48px\n} as const;\nexport type DsInputSize = (typeof DS_INPUT_SIZES)[keyof typeof DS_INPUT_SIZES];\n","<template>\n <div\n class=\"ds-input\"\n :class=\"[`ds-input--${size}`, { 'is-error': error, 'is-disabled': disabled }]\"\n >\n <div class=\"ds-input__wrap\">\n <input\n :id=\"id || undefined\"\n v-model=\"model\"\n class=\"ds-input__control\"\n :class=\"{ 'has-suffix': hasSuffix }\"\n :type=\"resolvedType\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n :autocomplete=\"autocomplete || undefined\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"error && errorMessage && id ? `${id}-error` : undefined\"\n @focus=\"emit(FOCUS, $event)\"\n @blur=\"emit(BLUR, $event)\"\n />\n\n <div v-if=\"hasSuffix\" class=\"ds-input__suffix\">\n <slot name=\"suffix\" />\n\n <i\n v-if=\"error && showErrorIcon\"\n class=\"material-icons ds-input__error-icon\"\n aria-hidden=\"true\"\n >warning</i\n >\n\n <button\n v-else-if=\"isPassword\"\n type=\"button\"\n class=\"ds-input__toggle\"\n :aria-label=\"toggleLabel || undefined\"\n :aria-pressed=\"reveal\"\n @click=\"reveal = !reveal\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">{{\n reveal ? 'visibility' : 'visibility_off'\n }}</i>\n </button>\n </div>\n </div>\n\n <p v-if=\"error && errorMessage\" :id=\"id ? `${id}-error` : undefined\" class=\"ds-input__error\">\n {{ errorMessage }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots, type PropType } from 'vue';\nimport { FOCUS, BLUR } from '@shared/constants/events';\nimport {\n DS_INPUT_TYPES,\n DS_INPUT_SIZES,\n type DsInputType,\n type DsInputSize,\n} from './DsInput.types';\n\nconst model = defineModel<string>({ default: '' });\n\nconst props = defineProps({\n type: { type: String as PropType<DsInputType>, default: DS_INPUT_TYPES.TEXT },\n size: { type: String as PropType<DsInputSize>, default: DS_INPUT_SIZES.SM },\n placeholder: { type: String, default: '' },\n disabled: Boolean,\n error: Boolean,\n errorMessage: { type: String, default: '' },\n showErrorIcon: Boolean,\n name: { type: String, default: '' },\n id: { type: String, default: '' },\n autocomplete: { type: String, default: '' },\n // Accessible name for the password visibility toggle.\n toggleLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([FOCUS, BLUR]);\n\nconst slots = useSlots();\nconst reveal = ref(false);\nconst isPassword = computed(() => props.type === DS_INPUT_TYPES.PASSWORD);\nconst resolvedType = computed(() =>\n isPassword.value && reveal.value ? DS_INPUT_TYPES.TEXT : props.type\n);\nconst hasSuffix = computed(\n () => !!slots.suffix || (props.error && props.showErrorIcon) || isPassword.value\n);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-input {\n display: block;\n width: 100%;\n\n &__wrap {\n position: relative;\n width: 100%;\n }\n\n &__control {\n box-sizing: border-box;\n width: 100%;\n padding: 0 16px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n font-weight: t.$weight-regular;\n line-height: 20px;\n\n background-color: colors.$white;\n\n /* Border: primary-main at rest → accent on focus (see precedence below). */\n border: 1px solid colors.$slate-main;\n border-radius: r.$radius-control;\n outline: none;\n\n transition: border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.has-suffix {\n padding-right: 50px;\n }\n\n &:focus {\n border-color: colors.$accent-main;\n }\n\n &::placeholder {\n color: colors.$slate-soft;\n }\n }\n\n &__suffix {\n position: absolute;\n top: 0;\n right: 0;\n\n display: flex;\n align-items: center;\n gap: 4px;\n\n height: 100%;\n padding: 0 16px;\n\n color: colors.$slate-soft;\n }\n\n &__toggle {\n display: inline-flex;\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n }\n\n &__error-icon {\n color: colors.$error-main;\n }\n\n &__error {\n margin-top: 2px;\n\n color: colors.$error-main;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 18px;\n }\n\n /* ---------- Sizes (DS input heights + icon sizes) ---------- */\n &--sm {\n .ds-input__control {\n height: 36px;\n }\n .material-icons {\n font-size: i.icon-size(20);\n }\n }\n &--md {\n .ds-input__control {\n height: 48px;\n }\n .material-icons {\n font-size: i.icon-size(24);\n }\n }\n\n /* ---------- States (precedence: rest → focus → disabled → error) ---------- */\n &.is-disabled .ds-input__control {\n color: colors.$slate-mid;\n background-color: colors.$slate-bg;\n border-color: colors.$slate-mid;\n cursor: not-allowed;\n }\n &.is-error .ds-input__control,\n &.is-error .ds-input__control:focus {\n border-color: colors.$error-main;\n }\n}\n</style>\n","<template>\n <div class=\"ds-textarea\" :class=\"{ 'is-error': error, 'is-disabled': disabled }\">\n <textarea\n :id=\"id || undefined\"\n v-model=\"model\"\n class=\"ds-textarea__control\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"error && errorMessage && id ? `${id}-error` : undefined\"\n @focus=\"emit(FOCUS, $event)\"\n @blur=\"emit(BLUR, $event)\"\n />\n <p v-if=\"error && errorMessage\" :id=\"id ? `${id}-error` : undefined\" class=\"ds-textarea__error\">\n {{ errorMessage }}\n </p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { FOCUS, BLUR } from '@shared/constants/events';\n\nconst model = defineModel<string>({ default: '' });\n\ndefineProps({\n placeholder: { type: String, default: '' },\n rows: { type: Number, default: 4 },\n disabled: Boolean,\n error: Boolean,\n errorMessage: { type: String, default: '' },\n name: { type: String, default: '' },\n id: { type: String, default: '' },\n});\n\nconst emit = defineEmits([FOCUS, BLUR]);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-textarea {\n display: block;\n width: 100%;\n\n &__control {\n box-sizing: border-box;\n width: 100%;\n padding: 12px 16px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n line-height: 20px;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-main;\n border-radius: r.$radius-control;\n outline: none;\n\n resize: vertical;\n transition: border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &:focus {\n border-color: colors.$accent-main;\n }\n\n &::placeholder {\n color: colors.$slate-soft;\n }\n }\n\n &__error {\n margin-top: 2px;\n\n color: colors.$error-main;\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n line-height: 18px;\n }\n\n &.is-disabled .ds-textarea__control {\n color: colors.$slate-mid;\n background-color: colors.$slate-bg;\n border-color: colors.$slate-mid;\n cursor: not-allowed;\n }\n &.is-error .ds-textarea__control,\n &.is-error .ds-textarea__control:focus {\n border-color: colors.$error-main;\n }\n}\n</style>\n","<template>\n <label class=\"ds-checkbox\" :class=\"{ 'is-disabled': disabled }\">\n <input\n ref=\"inputRef\"\n v-model=\"model\"\n type=\"checkbox\"\n class=\"ds-checkbox__native\"\n :disabled=\"disabled\"\n :name=\"name || undefined\"\n />\n <span\n class=\"ds-checkbox__box\"\n :class=\"{ 'is-active': model || indeterminate }\"\n aria-hidden=\"true\"\n >\n <svg\n v-if=\"indeterminate\"\n class=\"ds-checkbox__mark\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n >\n <line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\" />\n </svg>\n <svg\n v-else-if=\"model\"\n class=\"ds-checkbox__mark\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n >\n <path d=\"M3.5 8.5l3 3 6-6\" />\n </svg>\n </span>\n <span v-if=\"$slots.default || label\" class=\"ds-checkbox__label\"\n ><slot>{{ label }}</slot></span\n >\n </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, watch } from 'vue';\n\nconst model = defineModel<boolean>({ default: false });\n\nconst props = defineProps({\n indeterminate: Boolean,\n disabled: Boolean,\n name: { type: String, default: '' },\n // Label text (DS `label` prop); a default slot overrides it.\n label: { type: String, default: '' },\n});\n\nconst inputRef = ref<HTMLInputElement | null>(null);\n\n// `indeterminate` is a DOM property, not an attribute — keep it in sync for a11y.\nfunction syncIndeterminate() {\n if (inputRef.value) inputRef.value.indeterminate = props.indeterminate;\n}\nonMounted(syncIndeterminate);\nwatch(() => props.indeterminate, syncIndeterminate);\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n\n.ds-checkbox {\n display: inline-flex;\n align-items: center;\n gap: s.spacing(1);\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n\n cursor: pointer;\n\n &.is-disabled {\n color: colors.$slate-soft;\n cursor: not-allowed;\n }\n\n /* Native control drives state + focus, visually replaced by the custom box. */\n &__native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n\n &__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n\n width: 18px;\n height: 18px;\n\n color: colors.$white;\n\n background-color: colors.$white;\n\n border: 1px solid colors.$slate-mid;\n border-radius: r.$radius-control;\n\n transition:\n background-color m.$duration-default m.$easing,\n border-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &.is-active {\n background-color: colors.$accent-main;\n border-color: colors.$accent-main;\n }\n }\n\n /* Focus ring on the box when the (hidden) native input is focused. */\n &__native:focus-visible + &__box {\n outline: 2px solid colors.$accent-mid;\n outline-offset: 1px;\n }\n\n &__mark {\n width: 14px;\n height: 14px;\n }\n\n &__label {\n line-height: 1.3;\n }\n}\n</style>\n","// DsAlert — the DS inline banner (Alert.jsx). type × effect (light tint / dark solid).\n\nexport const DS_ALERT_TYPES = {\n SUCCESS: 'success',\n INFO: 'info',\n WARNING: 'warning',\n ERROR: 'error',\n} as const;\nexport type DsAlertType = (typeof DS_ALERT_TYPES)[keyof typeof DS_ALERT_TYPES];\n\nexport const DS_ALERT_EFFECTS = {\n LIGHT: 'light', // tinted: family tint bg + mid border + shadow text\n DARK: 'dark', // solid: family shadow bg + white text\n} as const;\nexport type DsAlertEffect = (typeof DS_ALERT_EFFECTS)[keyof typeof DS_ALERT_EFFECTS];\n\n// Material Icon per type (leading icon when showIcon).\nexport const DS_ALERT_ICONS: Record<DsAlertType, string> = {\n success: 'check_circle',\n info: 'info',\n warning: 'warning',\n error: 'error',\n};\n","<template>\n <div\n v-if=\"visible\"\n class=\"ds-alert\"\n :class=\"[`ds-alert--${type}`, `ds-alert--${effect}`, { 'is-center': center }]\"\n role=\"alert\"\n >\n <i v-if=\"showIcon\" class=\"material-icons ds-alert__icon\" aria-hidden=\"true\">{{ icon }}</i>\n\n <div class=\"ds-alert__content\">\n <div v-if=\"title\" class=\"ds-alert__title\" :class=\"{ 'has-body': hasBody }\">{{ title }}</div>\n <div v-if=\"hasBody\" class=\"ds-alert__body\">\n <slot>{{ description }}</slot>\n </div>\n </div>\n\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ds-alert__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots, type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport {\n DS_ALERT_TYPES,\n DS_ALERT_EFFECTS,\n DS_ALERT_ICONS,\n type DsAlertType,\n type DsAlertEffect,\n} from './DsAlert.types';\n\nconst props = defineProps({\n type: { type: String as PropType<DsAlertType>, default: DS_ALERT_TYPES.INFO },\n effect: { type: String as PropType<DsAlertEffect>, default: DS_ALERT_EFFECTS.LIGHT },\n title: { type: String, default: '' },\n description: { type: String, default: '' },\n showIcon: Boolean,\n closable: Boolean,\n center: Boolean,\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst slots = useSlots();\nconst visible = ref(true);\nconst icon = computed(() => DS_ALERT_ICONS[props.type]);\nconst hasBody = computed(() => !!slots.default || props.description.length > 0);\n\nfunction onClose() {\n visible.value = false;\n emit(CLOSE);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-alert {\n position: relative;\n\n display: flex;\n align-items: center;\n\n padding: 8px 16px;\n\n font-family: t.$font-family;\n\n border: 1px solid transparent;\n border-radius: r.$radius-control;\n\n &.is-center {\n justify-content: center;\n }\n\n &__icon {\n margin-right: 8px;\n // Status glyph uses the DS default icon size (md-20) for presence next to the\n // 13px title; the close ✕ below stays at 14 (discreet secondary action).\n font-size: i.icon-size(20);\n }\n\n &__content {\n flex: 1;\n padding: 0 8px;\n }\n\n &__title {\n font-size: t.font-size('small');\n font-weight: t.$weight-regular;\n line-height: 18px;\n\n &.has-body {\n font-weight: t.$weight-bold;\n }\n }\n\n &__body {\n margin-top: 5px;\n font-size: t.font-size('caption');\n }\n\n &__title.has-body + .ds-alert__body {\n margin-top: 5px;\n }\n\n &__close {\n display: inline-flex;\n padding: 0;\n\n color: inherit;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(14);\n }\n }\n\n /* ---------- light (tinted) — bg tint + mid border + shadow text ---------- */\n &--light {\n &.ds-alert--success {\n color: colors.$success-shadow;\n border-color: colors.$success-mid;\n background-color: colors.$success-tint;\n }\n &.ds-alert--info {\n color: colors.$info-shadow;\n border-color: colors.$info-mid;\n background-color: colors.$info-tint;\n }\n &.ds-alert--warning {\n color: colors.$warning-shadow;\n border-color: colors.$warning-mid;\n background-color: colors.$warning-tint;\n }\n &.ds-alert--error {\n color: colors.$error-shadow;\n border-color: colors.$error-mid;\n background-color: colors.$error-tint;\n }\n }\n\n /* ---------- dark (solid) — bg shadow + white text ---------- */\n &--dark {\n color: colors.$white;\n border-color: transparent;\n\n &.ds-alert--success {\n background-color: colors.$success-shadow;\n }\n &.ds-alert--info {\n background-color: colors.$info-shadow;\n }\n &.ds-alert--warning {\n background-color: colors.$warning-shadow;\n }\n &.ds-alert--error {\n background-color: colors.$error-shadow;\n }\n }\n}\n</style>\n","// DsNotification — the DS toast card (Notification.jsx). Fixed-position, 3 types.\n\nexport const DS_NOTIFICATION_TYPES = {\n INFO: 'info',\n WARNING: 'warning',\n ERROR: 'error',\n} as const;\nexport type DsNotificationType = (typeof DS_NOTIFICATION_TYPES)[keyof typeof DS_NOTIFICATION_TYPES];\n\nexport const DS_NOTIFICATION_POSITIONS = {\n TOP_LEFT: 'top-left',\n TOP_RIGHT: 'top-right',\n BOTTOM_LEFT: 'bottom-left',\n BOTTOM_RIGHT: 'bottom-right',\n} as const;\nexport type DsNotificationPosition =\n (typeof DS_NOTIFICATION_POSITIONS)[keyof typeof DS_NOTIFICATION_POSITIONS];\n\n// Material Icon per type (Notification.jsx).\nexport const DS_NOTIFICATION_ICONS: Record<DsNotificationType, string> = {\n info: 'mode_edit',\n warning: 'warning',\n error: 'warning',\n};\n","<template>\n <Teleport to=\"body\">\n <div v-if=\"visible\" class=\"ds-notification\" :class=\"`ds-notification--${position}`\">\n <div class=\"ds-notification__card\" :class=\"`ds-notification__card--${type}`\" role=\"alert\">\n <i class=\"material-icons ds-notification__icon\" aria-hidden=\"true\">{{ icon }}</i>\n\n <div class=\"ds-notification__content\">\n <span v-if=\"title\" class=\"ds-notification__title\">{{ title }}</span>\n <p v-if=\"description\" class=\"ds-notification__desc\">{{ description }}</p>\n <a\n v-if=\"linkTitle\"\n class=\"ds-notification__link\"\n :href=\"link || undefined\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >{{ linkTitle }}</a\n >\n </div>\n\n <button\n v-if=\"showClose\"\n type=\"button\"\n class=\"ds-notification__close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, type PropType } from 'vue';\nimport { CLOSE } from '@shared/constants/events';\nimport {\n DS_NOTIFICATION_TYPES,\n DS_NOTIFICATION_POSITIONS,\n DS_NOTIFICATION_ICONS,\n type DsNotificationType,\n type DsNotificationPosition,\n} from './DsNotification.types';\n\nconst props = defineProps({\n type: { type: String as PropType<DsNotificationType>, default: DS_NOTIFICATION_TYPES.INFO },\n position: {\n type: String as PropType<DsNotificationPosition>,\n default: DS_NOTIFICATION_POSITIONS.BOTTOM_LEFT,\n },\n title: { type: String, default: '' },\n description: { type: String, default: '' },\n linkTitle: { type: String, default: '' },\n link: { type: String, default: '' },\n showClose: { type: Boolean, default: true },\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst visible = ref(true);\nconst icon = computed(() => DS_NOTIFICATION_ICONS[props.type]);\n\nfunction onClose() {\n visible.value = false;\n emit(CLOSE);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-notification {\n position: fixed;\n z-index: 2000;\n\n &--top-left {\n top: 0;\n left: 0;\n }\n &--top-right {\n top: 0;\n right: 0;\n }\n &--bottom-left {\n bottom: 0;\n left: 0;\n }\n &--bottom-right {\n bottom: 0;\n right: 0;\n }\n\n &__card {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n\n max-width: 331px;\n margin: 24px;\n padding: 16px;\n\n border: 1px solid transparent;\n border-radius: r.$radius-card-lg;\n\n box-shadow: sh.$shadow-soft;\n\n &--info {\n background-color: colors.$info-tint;\n border-color: rgba(colors.$info-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$info-main;\n }\n }\n &--warning {\n background-color: colors.$warning-tint;\n border-color: rgba(colors.$warning-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$warning-main;\n }\n }\n &--error {\n background-color: colors.$error-tint;\n border-color: rgba(colors.$error-main, 0.7);\n\n .ds-notification__icon {\n color: colors.$error-main;\n }\n }\n }\n\n &__icon {\n font-size: i.icon-size(20);\n }\n\n &__content {\n display: flex;\n flex-direction: column;\n\n color: colors.$slate-shadow;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n line-height: 21px;\n }\n\n &__title {\n font-weight: t.$weight-bold;\n }\n\n &__desc {\n margin: 0;\n padding-top: 8px;\n }\n\n &__link {\n padding-top: 8px;\n\n color: colors.$accent-main;\n text-decoration: underline;\n }\n\n &__close {\n display: inline-flex;\n margin-left: auto;\n padding: 0;\n\n color: colors.$slate-soft;\n\n background: transparent;\n border: 0;\n\n cursor: pointer;\n\n .material-icons {\n font-size: i.icon-size(20);\n }\n }\n}\n</style>\n","<template>\n <Teleport to=\"body\">\n <div v-if=\"open\" class=\"ds-modal\" @click=\"onBackdrop\">\n <div\n ref=\"dialogRef\"\n class=\"ds-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"title || 'dialog'\"\n tabindex=\"-1\"\n :style=\"{ width }\"\n @click.stop\n >\n <div v-if=\"title || showClose\" class=\"ds-modal__header\">\n <span class=\"ds-modal__title\">{{ title }}</span>\n <DsButton\n v-if=\"showClose\"\n variant=\"tertiary\"\n circle\n left-icon=\"close\"\n :aria-label=\"closeLabel || undefined\"\n @click=\"emit(CLOSE)\"\n />\n </div>\n\n <div class=\"ds-modal__body\"><slot /></div>\n\n <div v-if=\"$slots.footer\" class=\"ds-modal__footer\"><slot name=\"footer\" /></div>\n </div>\n </div>\n </Teleport>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, nextTick, onBeforeUnmount } from 'vue';\nimport { DsButton } from '@shared/ui/DsButton';\nimport { CLOSE } from '@shared/constants/events';\n\nconst props = defineProps({\n open: Boolean,\n title: { type: String, default: '' },\n showClose: { type: Boolean, default: true },\n width: { type: String, default: '440px' },\n closeOnBackdrop: { type: Boolean, default: true },\n closeLabel: { type: String, default: '' },\n});\n\nconst emit = defineEmits([CLOSE]);\n\nconst dialogRef = ref<HTMLElement | null>(null);\nlet lastFocused: HTMLElement | null = null;\n\nfunction onBackdrop() {\n if (props.closeOnBackdrop) emit(CLOSE);\n}\n\nfunction focusables(): HTMLElement[] {\n if (!dialogRef.value) return [];\n const sel =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(dialogRef.value.querySelectorAll<HTMLElement>(sel)).filter(\n (el) => el.offsetParent !== null\n );\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n emit(CLOSE);\n return;\n }\n if (e.key !== 'Tab') return;\n const f = focusables();\n if (f.length === 0) {\n e.preventDefault();\n dialogRef.value?.focus();\n return;\n }\n const first = f[0];\n const last = f[f.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n}\n\nwatch(\n () => props.open,\n (open) => {\n if (typeof document === 'undefined') return;\n if (open) {\n lastFocused = document.activeElement as HTMLElement;\n document.addEventListener('keydown', onKeydown);\n document.body.style.overflow = 'hidden';\n nextTick(() => (focusables()[0] ?? dialogRef.value)?.focus());\n } else {\n document.removeEventListener('keydown', onKeydown);\n document.body.style.overflow = '';\n lastFocused?.focus?.();\n }\n },\n { immediate: true }\n);\n\nonBeforeUnmount(() => {\n if (typeof document === 'undefined') return;\n document.removeEventListener('keydown', onKeydown);\n document.body.style.overflow = '';\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n\n.ds-modal {\n position: fixed;\n inset: 0;\n z-index: 2001;\n\n display: flex;\n align-items: flex-start;\n justify-content: center;\n\n padding: 15vh 16px 50px;\n overflow: auto;\n\n background: colors.$backdrop; // grey-10 @ 50%, no blur\n\n &__dialog {\n max-width: 100%;\n\n background: colors.$white;\n\n border-radius: r.$radius-card;\n box-shadow: sh.$shadow-card;\n\n padding: 8px;\n\n outline: none;\n }\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n min-height: 36px;\n padding: 8px 0 8px 12px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n font-weight: t.$weight-bold;\n\n border-bottom: 1px solid colors.$slate-tint;\n }\n\n &__body {\n padding: 20px;\n\n color: colors.$slate-main;\n font-family: t.$font-family;\n font-size: t.font-size('body');\n }\n\n &__footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n\n padding: 8px;\n\n border-top: 1px solid colors.$slate-tint;\n }\n}\n</style>\n","// DsVerificationIcon — status glyph for a contact data point.\n// 1:1 with the DS source (components/data/VerificationIcon.jsx):\n// verified === true -> \"verified\" (info-main, blue)\n// verified === false + email -> \"dangerous\" (error-main, coral)\n// verified === false + phone -> \"error\" (warning-main, orange)\n// verified == null (new) -> \"new_releases\" (slate-soft, grey)\n// `isContactData` flags emails (coral) vs phones (orange) when unverified.\n\nexport const DS_VERIFICATION_STATES = {\n VERIFIED: 'verified',\n UNVERIFIED: 'unverified',\n NEW: 'new',\n} as const;\nexport type DsVerificationState =\n (typeof DS_VERIFICATION_STATES)[keyof typeof DS_VERIFICATION_STATES];\n","<template>\n <i\n class=\"material-icons ds-verification-icon\"\n :class=\"[\n `ds-verification-icon--${status.state}`,\n { 'ds-verification-icon--email': isContactData },\n ]\"\n :style=\"{ fontSize: `${size}px` }\"\n role=\"img\"\n :aria-label=\"label || status.label\"\n :title=\"label || status.label\"\n >\n <slot>{{ status.icon }}</slot>\n </i>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { DS_VERIFICATION_STATES } from './DsVerificationIcon.types';\n\nconst props = defineProps({\n // true = verified · false = not verified · null/undefined = newly found.\n verified: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n // Emails (true) use the coral \"dangerous\" glyph when unverified; phones use orange.\n isContactData: {\n type: Boolean,\n default: false,\n },\n size: {\n type: Number,\n default: 20,\n },\n // Optional override for the accessible label / tooltip (the app owns i18n).\n // Empty → the English default derived from the verification state.\n label: {\n type: String,\n default: '',\n },\n});\n\nconst status = computed(() => {\n if (props.verified === null || props.verified === undefined) {\n return {\n state: DS_VERIFICATION_STATES.NEW,\n icon: 'new_releases',\n label: 'Newly found',\n };\n }\n if (props.verified) {\n return {\n state: DS_VERIFICATION_STATES.VERIFIED,\n icon: 'verified',\n label: 'Verified',\n };\n }\n return {\n state: DS_VERIFICATION_STATES.UNVERIFIED,\n icon: props.isContactData ? 'dangerous' : 'error',\n label: 'Not verified',\n };\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n.ds-verification-icon {\n line-height: 1;\n\n // States map DS colors (VerificationIcon.jsx). isContactData splits the\n // unverified color into coral (email) vs orange (phone).\n &--new {\n color: colors.$slate-soft; // --primary-secondary-text\n }\n &--verified {\n color: colors.$info-main;\n }\n &--unverified {\n color: colors.$warning-main; // phone (orange)\n\n &.ds-verification-icon--email {\n color: colors.$error-main; // email (coral \"dangerous\")\n }\n }\n}\n</style>\n","<template>\n <div class=\"ds-contact-value\" :class=\"{ 'ds-contact-value--main': main }\">\n <DsVerificationIcon :verified=\"verified\" :is-contact-data=\"isContactData\" />\n\n <span class=\"ds-contact-value__value\" :title=\"value\">{{ value }}</span>\n\n <!-- Marquee slot: badge and actions share one grid cell and cross-fade/slide\n on hover (or keyboard focus-within). -->\n <span class=\"ds-contact-value__marquee\">\n <DsBadge\n v-if=\"valueType\"\n class=\"ds-contact-value__badge\"\n :tone=\"main ? DS_BADGE_TONES.ACCENT : DS_BADGE_TONES.GREY\"\n aria-hidden=\"true\"\n >{{ valueType }}</DsBadge\n >\n\n <span class=\"ds-contact-value__actions\">\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-copied': copied }\"\n :aria-label=\"copied ? copiedLabel : copyLabel\"\n :title=\"copied ? copiedLabel : copyLabel\"\n @click=\"handleCopy\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">{{ copied ? 'check' : 'content_copy' }}</i>\n </button>\n\n <template v-if=\"showRate\">\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-active': correct === true }\"\n :aria-label=\"correctLabel\"\n :aria-pressed=\"correct === true\"\n :title=\"correctLabel\"\n @click=\"handleCorrect\"\n >\n <i\n :class=\"correct === true ? 'material-icons' : 'material-icons-outlined'\"\n aria-hidden=\"true\"\n >thumb_up</i\n >\n </button>\n <button\n type=\"button\"\n class=\"ds-contact-value__action\"\n :class=\"{ 'is-active': correct === false }\"\n :aria-label=\"incorrectLabel\"\n :aria-pressed=\"correct === false\"\n :title=\"incorrectLabel\"\n @click=\"handleIncorrect\"\n >\n <i\n :class=\"correct === false ? 'material-icons' : 'material-icons-outlined'\"\n aria-hidden=\"true\"\n >thumb_down</i\n >\n </button>\n </template>\n </span>\n </span>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount, type PropType } from 'vue';\nimport { DsVerificationIcon } from '@shared/ui/DsVerificationIcon';\nimport { DsBadge, DS_BADGE_TONES } from '@shared/ui/DsBadge';\nimport { COPY, CORRECT, INCORRECT } from '@shared/constants/events';\n\nconst props = defineProps({\n value: { type: String, required: true },\n valueType: { type: String, default: '' },\n verified: { type: Boolean as PropType<boolean | null>, default: null },\n main: { type: Boolean, default: false },\n isContactData: { type: Boolean, default: false },\n showRate: { type: Boolean, default: false },\n correct: { type: Boolean as PropType<boolean | null>, default: null },\n // User-facing labels (the app owns i18n); English DS defaults.\n copyLabel: { type: String, default: 'Copy' },\n copiedLabel: { type: String, default: 'Copied!' },\n correctLabel: { type: String, default: 'Correct' },\n incorrectLabel: { type: String, default: 'Incorrect' },\n});\n\n// Runtime array so the emit names are registered at runtime (the type-only\n// form with `typeof CONST` compiles to an empty `emits`, which lets listeners\n// fall through as native attrs). Names come from the shared events constants.\nconst emit = defineEmits([COPY, CORRECT, INCORRECT]);\n\nconst copied = ref(false);\nlet copiedTimer: ReturnType<typeof setTimeout> | undefined;\n\nfunction handleCopy() {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(props.value).catch(() => {});\n }\n copied.value = true;\n clearTimeout(copiedTimer);\n copiedTimer = setTimeout(() => {\n copied.value = false;\n }, 1200);\n emit(COPY, props.value);\n}\n\nfunction handleCorrect() {\n emit(CORRECT);\n}\nfunction handleIncorrect() {\n emit(INCORRECT);\n}\n\nonBeforeUnmount(() => clearTimeout(copiedTimer));\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/motion.scss' as m;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-contact-value {\n display: flex;\n align-items: center;\n\n padding: 6px; // DS ContactValue.jsx\n border-radius: r.$radius-control;\n\n background: transparent;\n transition: background-color m.$duration-default m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n\n &:hover,\n &:focus-within {\n background-color: colors.$slate-bg; // --primary-background\n }\n\n &--main:hover,\n &--main:focus-within {\n background-color: colors.$accent-bg;\n }\n\n // -- value ---------------------------------------------------------------\n &__value {\n flex: 1;\n min-width: 0;\n margin: 0 8px; // DS\n\n color: colors.$slate-main; // --primary-main\n font-family: t.$font-family;\n font-size: t.font-size('body');\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n // -- marquee (badge + actions share one cell) ----------------------------\n &__marquee {\n display: inline-grid;\n align-items: center;\n justify-items: end;\n margin-left: auto;\n }\n\n &__badge,\n &__actions {\n grid-area: 1 / 1;\n transition:\n transform m.$duration-reveal m.$easing,\n opacity m.$duration-reveal m.$easing;\n\n @include m.reduce-motion {\n transition: none;\n }\n }\n\n // At rest: badge in place, actions parked to the right and hidden.\n &__badge {\n transform: translateX(0);\n opacity: 1;\n }\n &__actions {\n display: inline-flex;\n align-items: center;\n gap: 8px; // DS\n\n transform: translateX(8px);\n opacity: 0;\n pointer-events: none;\n }\n\n // On hover / keyboard focus: badge slides out, actions slide in.\n &:hover &__badge,\n &:focus-within &__badge {\n transform: translateX(8px);\n opacity: 0;\n }\n &:hover &__actions,\n &:focus-within &__actions {\n transform: translateX(0);\n opacity: 1;\n pointer-events: auto;\n }\n\n // -- action buttons ------------------------------------------------------\n &__action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n color: colors.$slate-soft; // --primary-secondary-text\n\n .material-icons,\n .material-icons-outlined {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n\n &.is-copied {\n color: colors.$success-shadow;\n }\n }\n}\n</style>\n","<template>\n <section class=\"ds-data-card\" :aria-label=\"title\">\n <!-- header -->\n <div\n class=\"ds-data-card__header\"\n :class=\"{ 'is-collapsed': isCollapsed, 'is-collapsible': collapsible }\"\n @click=\"collapsible && toggle()\"\n >\n <div class=\"ds-data-card__heading\">\n <i class=\"material-icons ds-data-card__icon\" aria-hidden=\"true\">{{ icon }}</i>\n <span class=\"ds-data-card__title\">{{ title }}</span>\n </div>\n\n <div class=\"ds-data-card__actions\" @click.stop>\n <button\n v-if=\"!isCollapsed && showEdit\"\n type=\"button\"\n class=\"ds-data-card__edit\"\n @click=\"onEdit\"\n >\n {{ editLabel }}\n </button>\n\n <DsButton\n v-if=\"!isCollapsed && showSort\"\n variant=\"tertiary\"\n size=\"medium\"\n circle\n left-icon=\"swap_vert\"\n :aria-label=\"sortLabel\"\n @click=\"onSort\"\n />\n\n <DsButton\n v-if=\"collapsible\"\n variant=\"tertiary\"\n size=\"medium\"\n circle\n :left-icon=\"collapsed ? 'keyboard_arrow_down' : 'keyboard_arrow_up'\"\n :aria-label=\"toggleLabel\"\n @click=\"toggle\"\n />\n\n <button\n v-if=\"showClose\"\n type=\"button\"\n class=\"ds-data-card__close\"\n :aria-label=\"closeLabel\"\n @click=\"onClose\"\n >\n <i class=\"material-icons\" aria-hidden=\"true\">close</i>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div v-if=\"!isCollapsed\" class=\"ds-data-card__body\">\n <div v-if=\"empty\" class=\"ds-data-card__empty\">\n <i class=\"material-icons-outlined ds-data-card__empty-icon\" aria-hidden=\"true\">{{\n icon\n }}</i>\n <span>{{ emptyLabel }}</span>\n </div>\n\n <template v-else>\n <div v-if=\"mostLikely\">\n <div v-if=\"showSections\" class=\"ds-data-card__section\">{{ mostLikelyLabel }}</div>\n <DsContactValue\n :value=\"mostLikely.value\"\n :value-type=\"mostLikely.type\"\n :verified=\"mostLikely.verified\"\n :correct=\"mostLikely.correct\"\n main\n :is-contact-data=\"isContactData\"\n :show-rate=\"showRate\"\n @copy=\"onCopy\"\n @correct=\"onCorrect(mostLikely)\"\n @incorrect=\"onIncorrect(mostLikely)\"\n />\n </div>\n\n <div v-if=\"more.length > 0\">\n <div v-if=\"showSections\" class=\"ds-data-card__section\">{{ moreLabel }}</div>\n <div class=\"ds-data-card__more\">\n <DsContactValue\n v-for=\"datum in more\"\n :key=\"datum.value\"\n :value=\"datum.value\"\n :value-type=\"datum.type\"\n :verified=\"datum.verified\"\n :correct=\"datum.correct\"\n :is-contact-data=\"isContactData\"\n :show-rate=\"showRate\"\n @copy=\"onCopy\"\n @correct=\"onCorrect(datum)\"\n @incorrect=\"onIncorrect(datum)\"\n />\n </div>\n </div>\n </template>\n </div>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, type PropType } from 'vue';\nimport { DsButton } from '@shared/ui/DsButton';\nimport { DsContactValue } from '@shared/ui/DsContactValue';\nimport { COPY, SORT, EDIT, CLOSE, CORRECT, INCORRECT } from '@shared/constants/events';\nimport type { DsContactDatum } from './DsDataCard.types';\n\nconst props = defineProps({\n title: { type: String, required: true },\n // Material Icon name for the header (e.g. \"email\", \"call\").\n icon: { type: String, default: 'email' },\n mostLikely: { type: Object as PropType<DsContactDatum | null>, default: null },\n more: { type: Array as PropType<DsContactDatum[]>, default: () => [] },\n collapsible: { type: Boolean, default: false },\n showSort: { type: Boolean, default: true },\n showEdit: { type: Boolean, default: false },\n showClose: { type: Boolean, default: false },\n isContactData: { type: Boolean, default: false },\n showRate: { type: Boolean, default: false },\n // User-facing labels (the app owns i18n); English DS defaults.\n editLabel: { type: String, default: 'Edit' },\n emptyLabel: { type: String, default: 'No data found' },\n mostLikelyLabel: { type: String, default: 'MOST LIKELY' },\n moreLabel: { type: String, default: 'MORE' },\n sortLabel: { type: String, default: 'Sort' },\n toggleLabel: { type: String, default: 'Toggle' },\n closeLabel: { type: String, default: 'Close' },\n});\n\n// Runtime array so the emit names are registered at runtime (the type-only\n// form with `typeof CONST` compiles to an empty `emits`, which lets listeners\n// fall through as native attrs). Names come from the shared events constants.\nconst emit = defineEmits([COPY, SORT, EDIT, CLOSE, CORRECT, INCORRECT]);\n\nconst collapsed = ref(false);\n\nconst total = computed(() => props.more.length + (props.mostLikely ? 1 : 0));\nconst showSections = computed(() => total.value > 3);\nconst empty = computed(() => total.value === 0);\nconst isCollapsed = computed(() => props.collapsible && collapsed.value);\n\nfunction toggle() {\n collapsed.value = !collapsed.value;\n}\nfunction onCopy(value: string) {\n emit(COPY, value);\n}\nfunction onSort() {\n emit(SORT);\n}\nfunction onEdit() {\n emit(EDIT);\n}\nfunction onClose() {\n emit(CLOSE);\n}\nfunction onCorrect(datum: DsContactDatum) {\n emit(CORRECT, datum);\n}\nfunction onIncorrect(datum: DsContactDatum) {\n emit(INCORRECT, datum);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/typography.scss' as t;\n@use '../../assets/css/radius.scss' as r;\n@use '../../assets/css/shadow.scss' as sh;\n@use '../../assets/css/icons.scss' as i;\n\n.ds-data-card {\n display: block;\n\n padding: 8px;\n\n background-color: colors.$white;\n border-radius: r.$radius-card;\n box-shadow: sh.$shadow-card;\n\n // -- header --------------------------------------------------------------\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 6px 6px 14px; // DS DataCard.jsx\n border-bottom: 1px solid colors.$slate-tint; // --primary-tint\n\n &.is-collapsible {\n cursor: pointer;\n }\n &.is-collapsed {\n border-bottom: none;\n }\n }\n\n &__heading {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n\n &__icon {\n font-size: i.icon-size(20);\n line-height: 1;\n color: colors.$slate-main; // --primary-main\n }\n\n &__title {\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('body');\n color: colors.$slate-main;\n\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n &__edit {\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n font-family: t.$font-family;\n font-weight: t.$weight-bold;\n font-size: t.font-size('caption');\n color: colors.$accent-main;\n }\n\n &__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n\n color: colors.$slate-soft; // --primary-secondary-text\n\n .material-icons {\n font-size: i.icon-size(20);\n line-height: 1;\n }\n }\n\n // -- body ----------------------------------------------------------------\n &__body {\n padding-top: 8px;\n }\n\n &__section {\n padding: 6px;\n\n font-family: t.$font-family;\n font-size: t.font-size('micro');\n line-height: 18px;\n letter-spacing: 0.04em;\n color: colors.$slate-main;\n }\n\n &__more {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n max-height: 132px; // DS: ~3 rows before the \"MORE\" list scrolls\n overflow: auto;\n }\n\n &__empty {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px;\n\n font-family: t.$font-family;\n font-size: t.font-size('body');\n color: colors.$slate-main;\n }\n\n &__empty-icon {\n font-size: i.icon-size(20);\n line-height: 1;\n color: colors.$slate-soft;\n }\n}\n</style>\n"],"names":["DS_SPINNER_TONES","_createElementBlock","_normalizeClass","__props","_normalizeStyle","_hoisted_2","_toDisplayString","CLICK","CLOSE","FOCUS","BLUR","COPY","CORRECT","INCORRECT","SORT","EDIT","DS_BUTTON_VARIANTS","DS_BUTTON_SIZES","DS_BUTTON_NATIVE_TYPES","props","emit","__emit","iconSize","computed","spinnerTone","handleClick","event","_createBlock","_unref","DsSpinner","$slots","_openBlock","_renderSlot","_ctx","_createElementVNode","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","DS_TAG_TONES","_cache","$event","DS_BADGE_TONES","initials","ariaLabel","boxStyle","hashed","seed","hash","i","rgb","light","DS_TABLE_ALIGN","_hoisted_1","_Fragment","_renderList","column","_a","row","DS_INPUT_TYPES","DS_INPUT_SIZES","model","_useModel","slots","useSlots","reveal","ref","isPassword","resolvedType","hasSuffix","_hoisted_7","inputRef","syncIndeterminate","onMounted","watch","DS_ALERT_TYPES","DS_ALERT_EFFECTS","DS_ALERT_ICONS","visible","icon","hasBody","onClose","DS_NOTIFICATION_TYPES","DS_NOTIFICATION_POSITIONS","DS_NOTIFICATION_ICONS","_Teleport","dialogRef","lastFocused","onBackdrop","focusables","el","onKeydown","e","first","last","open","nextTick","_b","onBeforeUnmount","DsButton","DS_VERIFICATION_STATES","status","_createTextVNode","copied","copiedTimer","handleCopy","handleCorrect","handleIncorrect","_createVNode","DsVerificationIcon","DsBadge","collapsed","total","showSections","empty","isCollapsed","toggle","onCopy","value","onSort","onEdit","onCorrect","datum","onIncorrect","_hoisted_8","_hoisted_9","_hoisted_10","DsContactValue","_hoisted_11","_hoisted_12","_hoisted_13"],"mappings":"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"}
@@ -1 +1 @@
1
- @charset "UTF-8";*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{height:100%}body{margin:0;color:#414c58;font-size:14px;font-family:Mulish,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#fff}a{text-decoration:none;color:inherit}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font:inherit;line-height:inherit}img,svg{max-width:100%;height:auto;display:block}ul,ol{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left;font-weight:400;vertical-align:middle}q{quotes:none}q:before,q:after{content:"";content:none}input[type=search]{-webkit-appearance:textfield;outline-offset:-2px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top;resize:vertical}[hidden]{display:none!important}.sr-only[data-v-9694500e]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes sql-spin-9694500e{to{transform:rotate(1turn)}}.sql-spinner[data-v-9694500e]{display:inline-flex;align-items:center;justify-content:center;--sql-spinner-color: #6a69ff}.sql-spinner.sql-spinner--small[data-v-9694500e]{width:20px;height:20px}.sql-spinner.sql-spinner--medium[data-v-9694500e]{width:36px;height:36px}.sql-spinner.sql-spinner--large[data-v-9694500e]{width:64px;height:64px}.sql-spinner .ring[data-v-9694500e]{box-sizing:border-box;width:100%;height:100%;border-radius:50%;background:conic-gradient(from 90deg,transparent 8%,var(--sql-spinner-color) 100%);mask:radial-gradient(farthest-side,transparent 84%,#000 84%);-webkit-mask:radial-gradient(farthest-side,transparent 84%,#000 84%);animation:sql-spin-9694500e 1s linear infinite}.sql-spinner.theme-dark[data-v-9694500e]{--sql-spinner-color: #6a69ff}.sql-spinner.theme-light[data-v-9694500e]{--sql-spinner-color: #fff}@keyframes rotating-9eeb1a72{0%{transform:rotate(360deg)}to{transform:rotate(0)}}.sql-button[data-v-9eeb1a72]{padding:0;color:#414c58;font-weight:500;font-size:14px;line-height:20px;border-width:0;border-radius:4px;outline:none;cursor:pointer;transition:background .2s,color .2s,border-color .2s}.sql-button[data-v-9eeb1a72]:active,.sql-button[data-v-9eeb1a72]:hover{outline:none}.sql-button[disabled][data-v-9eeb1a72]{cursor:not-allowed}.sql-button.is-circle[data-v-9eeb1a72]{padding:4px;border-radius:50%}.sql-button .slot-container[data-v-9eeb1a72]{position:relative;display:inline-flex;justify-content:center;align-items:center}.sql-button .slot-container .slotted-content[data-v-9eeb1a72]{display:inline-flex;align-items:center;white-space:nowrap}.sql-button .slot-container.is-loading .slotted-content[data-v-9eeb1a72]{visibility:hidden}.sql-button .slot-container .sql-spinner[data-v-9eeb1a72]{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;width:1em;height:1em;margin:auto;pointer-events:none}.sql-button.sql-button--default[data-v-9eeb1a72]{color:#414c58;background-color:#fff}.sql-button.sql-button--default[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--default.is-disabled[data-v-9eeb1a72]{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--primary[data-v-9eeb1a72]{color:#fff;background-color:#6a69ff}.sql-button.sql-button--primary[data-v-9eeb1a72]:hover{background-color:#504fbf}.sql-button.sql-button--primary.is-disabled[data-v-9eeb1a72]{background-color:#c7c7ff}.sql-button.sql-button--secondary[data-v-9eeb1a72]{color:#414c58;background-color:#f6f6f6}.sql-button.sql-button--secondary[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--secondary.is-disabled[data-v-9eeb1a72]{color:#888f97;background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-9eeb1a72]{color:#414c58;background-color:#fff}.sql-button.sql-button--tertiary[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-9eeb1a72]:active{color:#fff;background-color:#888f97}.sql-button.sql-button--tertiary.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--tertiary.is-disabled[data-v-9eeb1a72]:active{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--tertiary.selectable-button[data-v-9eeb1a72]:active{color:#6a69ff!important;background:#f2f2ff!important}.sql-button.sql-button--tertiary.selectable-button.is-selected[data-v-9eeb1a72]{color:#6a69ff;border:1px solid #6a69ff;background:#f2f2ff}.sql-button.sql-button--special[data-v-9eeb1a72]{color:#6a69ff;border:1px solid #c7c7ff;background-color:#fff}.sql-button.sql-button--special[data-v-9eeb1a72]:hover{border:1px solid #6a69ff}.sql-button.sql-button--special[data-v-9eeb1a72]:active{border:1px solid #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--special.is-disabled[data-v-9eeb1a72]{color:#c7c7ff;border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special.is-disabled[data-v-9eeb1a72]:active{border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special2[data-v-9eeb1a72]{color:#6a69ff;background-color:#fff}.sql-button.sql-button--special2[data-v-9eeb1a72]:hover{background-color:#f2f2ff}.sql-button.sql-button--special2[data-v-9eeb1a72]:active{color:#6a69ff;background-color:#ececff}.sql-button.sql-button--special2.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--special2.is-disabled[data-v-9eeb1a72]:active{color:#c7c7ff;background-color:#f2f2ff}.sql-button.sql-button--special3[data-v-9eeb1a72]{color:#6a69ff;font-weight:400;background-color:#ececff}.sql-button.sql-button--special3[data-v-9eeb1a72]:hover{color:#fff;background-color:#6a69ff}.sql-button.sql-button--special3[data-v-9eeb1a72]:active{color:#6a69ff;background-color:#ececff}.sql-button.sql-button--special3.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--special3.is-disabled[data-v-9eeb1a72]:active{color:#c7c7ff;background-color:#f2f2ff}.sql-button.sql-button--dotted[data-v-9eeb1a72]{color:#b8bcc0;font-weight:700;border:1px dashed #b8bcc0;border-radius:12px;background-color:transparent}.sql-button.sql-button--dotted[data-v-9eeb1a72]:hover:not(.is-disabled){color:#6a69ff;border:1px dashed #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--danger[data-v-9eeb1a72]{color:#ff6a69!important;background-color:#ffecec}.sql-button.sql-button--danger[data-v-9eeb1a72]:hover{background-color:#ffc7c7}.sql-button.sql-button--danger.is-disabled[data-v-9eeb1a72]{color:#ffc7c7;background-color:#ffecec}.sql-button.sql-button--gradient[data-v-9eeb1a72]{color:#fff!important;background:linear-gradient(106.21deg,#ff699f 22.52%,#ffba69)}.sql-button.sql-button--gradient[data-v-9eeb1a72]:hover{background:linear-gradient(106deg,#cc547f 22.52%,#ffba69)!important}.sql-button.sql-button--gradient.is-disabled[data-v-9eeb1a72]{background:linear-gradient(106deg,#ffa6c6 22.52%,#ffba69)}.sql-button.sql-button--small[data-v-9eeb1a72]{height:12px;font-weight:400;font-size:12px;line-height:14px}.sql-button.sql-button--small .slot-container[data-v-9eeb1a72]{padding:0 4px}.sql-button.sql-button--small .slot-container .icon-left[data-v-9eeb1a72]{margin-right:2px}.sql-button.sql-button--small .slot-container .icon-right[data-v-9eeb1a72]{margin-left:2px}.sql-button.sql-button--small .sql-spinner .spinner[data-v-9eeb1a72]{height:8px}.sql-button.sql-button--small-square[data-v-9eeb1a72]{height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square .slot-container[data-v-9eeb1a72]{padding:4px}.sql-button.sql-button--small-square-no-padding[data-v-9eeb1a72]{width:12px;height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square-no-padding .slot-container[data-v-9eeb1a72]{padding:0}.sql-button.sql-button--medium[data-v-9eeb1a72]{height:16px}.sql-button.sql-button--medium .slot-container[data-v-9eeb1a72]{padding:0 12px}.sql-button.sql-button--medium .slot-container .icon-left[data-v-9eeb1a72]{margin-right:2px}.sql-button.sql-button--medium .slot-container .icon-right[data-v-9eeb1a72]{margin-left:2px}.sql-button.sql-button--medium-square[data-v-9eeb1a72]{height:16px}.sql-button.sql-button--medium-square .slot-container[data-v-9eeb1a72]{padding:6px}.sql-button.sql-button--large[data-v-9eeb1a72]{height:36px}.sql-button.sql-button--large .slot-container[data-v-9eeb1a72]{padding:0 8px}.sql-button.sql-button--large .slot-container .icon-left[data-v-9eeb1a72]{margin-right:4px}.sql-button.sql-button--large .slot-container .icon-right[data-v-9eeb1a72]{margin-left:4px}.sql-button.sql-button--large-square[data-v-9eeb1a72]{height:36px}.sql-button.sql-button--large-square .slot-container[data-v-9eeb1a72]{padding:4px}.sql-button.sql-button--xlarge[data-v-9eeb1a72]{height:24px}.sql-button.sql-button--xlarge .slot-container[data-v-9eeb1a72]{padding:0 22px}.sql-button.sql-button--xlarge .slot-container .icon-left[data-v-9eeb1a72]{margin-right:4px}.sql-button.sql-button--xlarge .slot-container .icon-right[data-v-9eeb1a72]{margin-left:4px}.sql-button.sql-button--xlarge-square[data-v-9eeb1a72]{height:24px}.sql-button.sql-button--xlarge-square .slot-container[data-v-9eeb1a72]{padding:8px}.basic-table__wrapper[data-v-8f713759]{border:1px solid #e7e9ea;border-radius:8px;overflow-x:auto}.basic-table__table[data-v-8f713759]{width:100%;border-collapse:collapse}.basic-table__table th[data-v-8f713759]{padding:4px 8px;color:#414c58;font-weight:700;font-size:14px;border:0;border-bottom:1px solid #e7e9ea;background-color:#f6f6f6}.basic-table__table td[data-v-8f713759]{height:auto;padding:8px;color:#414c58;font-size:14px;border:0}.basic-table__table tr[data-v-8f713759]{border:0}.basic-table__table tbody tr+tr[data-v-8f713759]{border-top:1px solid #e7e9ea}.basic-table__th--left[data-v-8f713759],.basic-table__td--left[data-v-8f713759]{text-align:left}.basic-table__th--center[data-v-8f713759],.basic-table__td--center[data-v-8f713759]{text-align:center}.basic-table__th--right[data-v-8f713759],.basic-table__td--right[data-v-8f713759]{text-align:right}.basic-table__empty[data-v-8f713759]{padding:20px 12px;color:#888f97;text-align:center}
1
+ @charset "UTF-8";*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{height:100%}body{margin:0;color:#414c58;font-size:14px;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;background:#fff}a{text-decoration:none;color:inherit}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font:inherit;line-height:inherit}img,svg{max-width:100%;height:auto;display:block}ul,ol{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left;font-weight:400;vertical-align:middle}q{quotes:none}q:before,q:after{content:"";content:none}input[type=search]{-webkit-appearance:textfield;outline-offset:-2px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top;resize:vertical}[hidden]{display:none!important}@keyframes ds-spinner-rot-190a8af4{to{transform:rotate(360deg)}}.ds-spinner[data-v-190a8af4]{display:inline-block;border:2px solid;border-radius:50%;animation:ds-spinner-rot-190a8af4 1s linear infinite}@media(prefers-reduced-motion:reduce){.ds-spinner[data-v-190a8af4]{animation:none}}.ds-spinner--dark[data-v-190a8af4]{border-color:#e7e9ea;border-top-color:#414c58}.ds-spinner--light[data-v-190a8af4]{border-color:#fff6;border-top-color:#fff}.ds-spinner--accent[data-v-190a8af4]{border-color:#c7c7ff;border-top-color:#6a69ff}.ds-spinner__sr-only[data-v-190a8af4]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ds-button[data-v-662e5512]{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:0;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px;border:1px solid transparent;border-radius:4px;outline:none;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,opacity .2s ease}@media(prefers-reduced-motion:reduce){.ds-button[data-v-662e5512]{transition:none}}.ds-button.is-disabled[data-v-662e5512]{opacity:.55;cursor:not-allowed}.ds-button__icon[data-v-662e5512]{display:inline-flex;align-items:center;justify-content:center}.ds-button__icon .material-icons[data-v-662e5512]{font-size:20px;line-height:1}.ds-button:not(.is-circle) .ds-button__icon--leading[data-v-662e5512]{margin-left:-3px}.ds-button:not(.is-circle) .ds-button__icon--trailing[data-v-662e5512]{margin-right:-3px}.ds-button--primary[data-v-662e5512]{color:#fff;background-color:#6a69ff}.ds-button--primary[data-v-662e5512]:hover:not(.is-disabled){background-color:#504fbf}.ds-button--secondary[data-v-662e5512]{color:#414c58;background-color:#f6f6f6}.ds-button--secondary[data-v-662e5512]:hover:not(.is-disabled){background-color:#e7e9ea}.ds-button--tertiary[data-v-662e5512]{color:#414c58;background-color:#fff}.ds-button--tertiary[data-v-662e5512]:hover:not(.is-disabled){background-color:#e7e9ea}.ds-button--quaternary[data-v-662e5512]{color:#6a69ff;border-color:#c7c7ff;background-color:#fff}.ds-button--quaternary[data-v-662e5512]:hover:not(.is-disabled){border-color:#6a69ff}.ds-button--special[data-v-662e5512]{color:#6a69ff;background-color:#fff}.ds-button--special[data-v-662e5512]:hover:not(.is-disabled){background-color:#f2f2ff}.ds-button.is-dashed[data-v-662e5512]{color:#b8bcc0;font-weight:700;border:1px dashed #b8bcc0;background-color:transparent}.ds-button.is-dashed[data-v-662e5512]:hover:not(.is-disabled){color:#6a69ff;border-color:#6a69ff;background-color:#f2f2ff}.ds-button--small[data-v-662e5512]{height:24px;padding:0 8px;gap:2px;font-weight:400;font-size:12px}.ds-button--small .ds-button__icon .material-icons[data-v-662e5512]{font-size:14px}.ds-button--medium[data-v-662e5512]{height:32px;padding:0 12px}.ds-button--large[data-v-662e5512]{height:36px;padding:0 16px}.ds-button--xlarge[data-v-662e5512]{height:48px;padding:0 24px}.ds-button.is-circle[data-v-662e5512]{padding:8px;border-radius:9999px;aspect-ratio:1}.ds-tag[data-v-4507fdca]{display:inline-flex;align-items:center;gap:4px;padding:0 10px;color:#b8bcc0;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:400;font-size:12px;line-height:30px;background-color:#fff;border:1px solid #e7e9ea;border-radius:4px;white-space:nowrap}.ds-tag.is-rounded[data-v-4507fdca]{border-radius:16px}.ds-tag__close[data-v-4507fdca]{display:inline-flex;align-items:center;justify-content:center;padding:0;color:inherit;background:transparent;border:0;cursor:pointer}.ds-tag__close .material-icons[data-v-4507fdca]{font-size:12px}.ds-tag--default[data-v-4507fdca]{color:#b8bcc0;border-color:#e7e9ea;background-color:#fff}.ds-tag--success[data-v-4507fdca]{color:#4ea67a;border-color:#c6f2dd;background-color:#ecfbf4}.ds-tag--info[data-v-4507fdca]{color:#4f86bf;border-color:#c7e2ff;background-color:#ecf5ff}.ds-tag--warning[data-v-4507fdca]{color:#bf884f;border-color:#ffe3c7;background-color:#fff6ec}.ds-tag--error[data-v-4507fdca]{color:#bf504f;border-color:#ffc7c7;background-color:#ffecec}.ds-badge[data-v-f10a17a0]{display:inline-flex;align-items:center;height:17px;padding:0 8px;color:#fff;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:700;font-size:12px;line-height:17px;border-radius:28px;white-space:nowrap}.ds-badge--accent[data-v-f10a17a0]{background-color:#6a69ff}.ds-badge--grey[data-v-f10a17a0]{background-color:#5e666f}.ds-badge--info[data-v-f10a17a0]{background-color:#69b3ff}.ds-badge--success[data-v-f10a17a0]{background-color:#68dda3}.ds-badge--error[data-v-f10a17a0]{background-color:#ff6a69}.ds-badge--warning[data-v-f10a17a0]{background-color:#ffb569}.ds-avatar[data-v-e965ed47]{display:flex;flex:none;align-items:center;justify-content:center;overflow:hidden;object-fit:cover;border-radius:4px}.ds-avatar.is-circular[data-v-e965ed47]{border-radius:9999px}.ds-avatar--initials[data-v-e965ed47]{font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:900;line-height:1;user-select:none}.ds-avatar--placeholder[data-v-e965ed47]{background-color:#c0c4cc}.ds-table__wrapper[data-v-1735ff35]{overflow-x:auto;border:1px solid #e7e9ea;border-radius:8px}.ds-table__table[data-v-1735ff35]{width:100%;border-collapse:collapse}.ds-table__table th[data-v-1735ff35]{padding:8px 16px;color:#414c58;font-weight:700;font-size:14px;border:0;border-bottom:1px solid #e7e9ea;background-color:#f6f6f6}.ds-table__table td[data-v-1735ff35]{height:auto;padding:8px 16px;color:#414c58;font-size:14px;border:0}.ds-table__table tr[data-v-1735ff35]{border:0;transition:background-color .2s ease}@media(prefers-reduced-motion:reduce){.ds-table__table tr[data-v-1735ff35]{transition:none}}.ds-table__table tbody tr+tr[data-v-1735ff35]{border-top:1px solid #e7e9ea}.ds-table__table tbody tr[data-v-1735ff35]:hover{background-color:#f6f6f6}.ds-table__table tbody tr.is-highlighted[data-v-1735ff35]{background-color:#f2f2ff}.ds-table__table tbody tr.is-highlighted[data-v-1735ff35]:hover{background-color:#ececff}.ds-table__th--left[data-v-1735ff35],.ds-table__td--left[data-v-1735ff35]{text-align:left}.ds-table__th--center[data-v-1735ff35],.ds-table__td--center[data-v-1735ff35]{text-align:center}.ds-table__th--right[data-v-1735ff35],.ds-table__td--right[data-v-1735ff35]{text-align:right}.ds-table__empty[data-v-1735ff35]{padding:40px 24px;color:#5e666f;text-align:center}.ds-input[data-v-d4b27b55]{display:block;width:100%}.ds-input__wrap[data-v-d4b27b55]{position:relative;width:100%}.ds-input__control[data-v-d4b27b55]{box-sizing:border-box;width:100%;padding:0 16px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px;background-color:#fff;border:1px solid #414c58;border-radius:4px;outline:none;transition:border-color .2s ease}@media(prefers-reduced-motion:reduce){.ds-input__control[data-v-d4b27b55]{transition:none}}.ds-input__control.has-suffix[data-v-d4b27b55]{padding-right:50px}.ds-input__control[data-v-d4b27b55]:focus{border-color:#6a69ff}.ds-input__control[data-v-d4b27b55]::placeholder{color:#5e666f}.ds-input__suffix[data-v-d4b27b55]{position:absolute;top:0;right:0;display:flex;align-items:center;gap:4px;height:100%;padding:0 16px;color:#5e666f}.ds-input__toggle[data-v-d4b27b55]{display:inline-flex;padding:0;color:inherit;background:transparent;border:0;cursor:pointer}.ds-input__error-icon[data-v-d4b27b55]{color:#ff6a69}.ds-input__error[data-v-d4b27b55]{margin-top:2px;color:#ff6a69;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:700;font-size:12px;line-height:18px}.ds-input--sm .ds-input__control[data-v-d4b27b55]{height:36px}.ds-input--sm .material-icons[data-v-d4b27b55]{font-size:20px}.ds-input--md .ds-input__control[data-v-d4b27b55]{height:48px}.ds-input--md .material-icons[data-v-d4b27b55]{font-size:24px}.ds-input.is-disabled .ds-input__control[data-v-d4b27b55]{color:#b8bcc0;background-color:#f6f6f6;border-color:#b8bcc0;cursor:not-allowed}.ds-input.is-error .ds-input__control[data-v-d4b27b55],.ds-input.is-error .ds-input__control[data-v-d4b27b55]:focus{border-color:#ff6a69}.ds-textarea[data-v-cfa74e3d]{display:block;width:100%}.ds-textarea__control[data-v-cfa74e3d]{box-sizing:border-box;width:100%;padding:12px 16px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;background-color:#fff;border:1px solid #414c58;border-radius:4px;outline:none;resize:vertical;transition:border-color .2s ease}@media(prefers-reduced-motion:reduce){.ds-textarea__control[data-v-cfa74e3d]{transition:none}}.ds-textarea__control[data-v-cfa74e3d]:focus{border-color:#6a69ff}.ds-textarea__control[data-v-cfa74e3d]::placeholder{color:#5e666f}.ds-textarea__error[data-v-cfa74e3d]{margin-top:2px;color:#ff6a69;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:700;font-size:12px;line-height:18px}.ds-textarea.is-disabled .ds-textarea__control[data-v-cfa74e3d]{color:#b8bcc0;background-color:#f6f6f6;border-color:#b8bcc0;cursor:not-allowed}.ds-textarea.is-error .ds-textarea__control[data-v-cfa74e3d],.ds-textarea.is-error .ds-textarea__control[data-v-cfa74e3d]:focus{border-color:#ff6a69}.ds-checkbox[data-v-0c1a3c0a]{display:inline-flex;align-items:center;gap:8px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;cursor:pointer}.ds-checkbox.is-disabled[data-v-0c1a3c0a]{color:#5e666f;cursor:not-allowed}.ds-checkbox__native[data-v-0c1a3c0a]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.ds-checkbox__box[data-v-0c1a3c0a]{display:inline-flex;align-items:center;justify-content:center;flex:none;width:18px;height:18px;color:#fff;background-color:#fff;border:1px solid #b8bcc0;border-radius:4px;transition:background-color .2s ease,border-color .2s ease}@media(prefers-reduced-motion:reduce){.ds-checkbox__box[data-v-0c1a3c0a]{transition:none}}.ds-checkbox__box.is-active[data-v-0c1a3c0a]{background-color:#6a69ff;border-color:#6a69ff}.ds-checkbox__native:focus-visible+.ds-checkbox__box[data-v-0c1a3c0a]{outline:2px solid #c7c7ff;outline-offset:1px}.ds-checkbox__mark[data-v-0c1a3c0a]{width:14px;height:14px}.ds-checkbox__label[data-v-0c1a3c0a]{line-height:1.3}.ds-alert[data-v-58ce7b87]{position:relative;display:flex;align-items:center;padding:8px 16px;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;border:1px solid transparent;border-radius:4px}.ds-alert.is-center[data-v-58ce7b87]{justify-content:center}.ds-alert__icon[data-v-58ce7b87]{margin-right:8px;font-size:20px}.ds-alert__content[data-v-58ce7b87]{flex:1;padding:0 8px}.ds-alert__title[data-v-58ce7b87]{font-size:13px;font-weight:400;line-height:18px}.ds-alert__title.has-body[data-v-58ce7b87]{font-weight:700}.ds-alert__body[data-v-58ce7b87]{margin-top:5px;font-size:12px}.ds-alert__title.has-body+.ds-alert__body[data-v-58ce7b87]{margin-top:5px}.ds-alert__close[data-v-58ce7b87]{display:inline-flex;padding:0;color:inherit;background:transparent;border:0;cursor:pointer}.ds-alert__close .material-icons[data-v-58ce7b87]{font-size:14px}.ds-alert--light.ds-alert--success[data-v-58ce7b87]{color:#4ea67a;border-color:#c6f2dd;background-color:#ecfbf4}.ds-alert--light.ds-alert--info[data-v-58ce7b87]{color:#4f86bf;border-color:#c7e2ff;background-color:#ecf5ff}.ds-alert--light.ds-alert--warning[data-v-58ce7b87]{color:#bf884f;border-color:#ffe3c7;background-color:#fff6ec}.ds-alert--light.ds-alert--error[data-v-58ce7b87]{color:#bf504f;border-color:#ffc7c7;background-color:#ffecec}.ds-alert--dark[data-v-58ce7b87]{color:#fff;border-color:transparent}.ds-alert--dark.ds-alert--success[data-v-58ce7b87]{background-color:#4ea67a}.ds-alert--dark.ds-alert--info[data-v-58ce7b87]{background-color:#4f86bf}.ds-alert--dark.ds-alert--warning[data-v-58ce7b87]{background-color:#bf884f}.ds-alert--dark.ds-alert--error[data-v-58ce7b87]{background-color:#bf504f}.ds-notification[data-v-287d5c06]{position:fixed;z-index:2000}.ds-notification--top-left[data-v-287d5c06]{top:0;left:0}.ds-notification--top-right[data-v-287d5c06]{top:0;right:0}.ds-notification--bottom-left[data-v-287d5c06]{bottom:0;left:0}.ds-notification--bottom-right[data-v-287d5c06]{bottom:0;right:0}.ds-notification__card[data-v-287d5c06]{display:flex;align-items:flex-start;gap:8px;max-width:331px;margin:24px;padding:16px;border:1px solid transparent;border-radius:8px;box-shadow:0 6px 8px #414c5814,0 12px 24px #414c581f}.ds-notification__card--info[data-v-287d5c06]{background-color:#ecf5ff;border-color:#69b3ffb3}.ds-notification__card--info .ds-notification__icon[data-v-287d5c06]{color:#69b3ff}.ds-notification__card--warning[data-v-287d5c06]{background-color:#fff6ec;border-color:#ffb569b3}.ds-notification__card--warning .ds-notification__icon[data-v-287d5c06]{color:#ffb569}.ds-notification__card--error[data-v-287d5c06]{background-color:#ffecec;border-color:#ff6a69b3}.ds-notification__card--error .ds-notification__icon[data-v-287d5c06]{color:#ff6a69}.ds-notification__icon[data-v-287d5c06]{font-size:20px}.ds-notification__content[data-v-287d5c06]{display:flex;flex-direction:column;color:#313942;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;line-height:21px}.ds-notification__title[data-v-287d5c06]{font-weight:700}.ds-notification__desc[data-v-287d5c06]{margin:0;padding-top:8px}.ds-notification__link[data-v-287d5c06]{padding-top:8px;color:#6a69ff;text-decoration:underline}.ds-notification__close[data-v-287d5c06]{display:inline-flex;margin-left:auto;padding:0;color:#5e666f;background:transparent;border:0;cursor:pointer}.ds-notification__close .material-icons[data-v-287d5c06]{font-size:20px}.ds-modal[data-v-6eecaabb]{position:fixed;inset:0;z-index:2001;display:flex;align-items:flex-start;justify-content:center;padding:15vh 16px 50px;overflow:auto;background:#1f293380}.ds-modal__dialog[data-v-6eecaabb]{max-width:100%;background:#fff;border-radius:6px;box-shadow:0 6px 8px #414c581f,0 12px 24px #414c583d;padding:8px;outline:none}.ds-modal__header[data-v-6eecaabb]{display:flex;align-items:center;justify-content:space-between;min-height:36px;padding:8px 0 8px 12px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;font-weight:700;border-bottom:1px solid #e7e9ea}.ds-modal__body[data-v-6eecaabb]{padding:20px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px}.ds-modal__footer[data-v-6eecaabb]{display:flex;justify-content:flex-end;gap:8px;padding:8px;border-top:1px solid #e7e9ea}.ds-verification-icon[data-v-0fd84040]{line-height:1}.ds-verification-icon--new[data-v-0fd84040]{color:#5e666f}.ds-verification-icon--verified[data-v-0fd84040]{color:#69b3ff}.ds-verification-icon--unverified[data-v-0fd84040]{color:#ffb569}.ds-verification-icon--unverified.ds-verification-icon--email[data-v-0fd84040]{color:#ff6a69}.ds-contact-value[data-v-014e772b]{display:flex;align-items:center;padding:6px;border-radius:4px;background:transparent;transition:background-color .2s ease}@media(prefers-reduced-motion:reduce){.ds-contact-value[data-v-014e772b]{transition:none}}.ds-contact-value[data-v-014e772b]:hover,.ds-contact-value[data-v-014e772b]:focus-within{background-color:#f6f6f6}.ds-contact-value--main[data-v-014e772b]:hover,.ds-contact-value--main[data-v-014e772b]:focus-within{background-color:#f2f2ff}.ds-contact-value__value[data-v-014e772b]{flex:1;min-width:0;margin:0 8px;color:#414c58;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-contact-value__marquee[data-v-014e772b]{display:inline-grid;align-items:center;justify-items:end;margin-left:auto}.ds-contact-value__badge[data-v-014e772b],.ds-contact-value__actions[data-v-014e772b]{grid-area:1/1;transition:transform .5s ease,opacity .5s ease}@media(prefers-reduced-motion:reduce){.ds-contact-value__badge[data-v-014e772b],.ds-contact-value__actions[data-v-014e772b]{transition:none}}.ds-contact-value__badge[data-v-014e772b]{transform:translate(0);opacity:1}.ds-contact-value__actions[data-v-014e772b]{display:inline-flex;align-items:center;gap:8px;transform:translate(8px);opacity:0;pointer-events:none}.ds-contact-value:hover .ds-contact-value__badge[data-v-014e772b],.ds-contact-value:focus-within .ds-contact-value__badge[data-v-014e772b]{transform:translate(8px);opacity:0}.ds-contact-value:hover .ds-contact-value__actions[data-v-014e772b],.ds-contact-value:focus-within .ds-contact-value__actions[data-v-014e772b]{transform:translate(0);opacity:1;pointer-events:auto}.ds-contact-value__action[data-v-014e772b]{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer;color:#5e666f}.ds-contact-value__action .material-icons[data-v-014e772b],.ds-contact-value__action .material-icons-outlined[data-v-014e772b]{font-size:20px;line-height:1}.ds-contact-value__action.is-copied[data-v-014e772b]{color:#4ea67a}.ds-data-card[data-v-86467226]{display:block;padding:8px;background-color:#fff;border-radius:6px;box-shadow:0 6px 8px #414c581f,0 12px 24px #414c583d}.ds-data-card__header[data-v-86467226]{display:flex;align-items:center;justify-content:space-between;padding:6px 6px 14px;border-bottom:1px solid #e7e9ea}.ds-data-card__header.is-collapsible[data-v-86467226]{cursor:pointer}.ds-data-card__header.is-collapsed[data-v-86467226]{border-bottom:none}.ds-data-card__heading[data-v-86467226]{display:flex;align-items:center;gap:8px;min-width:0}.ds-data-card__icon[data-v-86467226]{font-size:20px;line-height:1;color:#414c58}.ds-data-card__title[data-v-86467226]{font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:700;font-size:14px;color:#414c58;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-data-card__actions[data-v-86467226]{display:flex;align-items:center;gap:8px}.ds-data-card__edit[data-v-86467226]{padding:0;border:none;background:none;cursor:pointer;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-weight:700;font-size:12px;color:#6a69ff}.ds-data-card__close[data-v-86467226]{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer;color:#5e666f}.ds-data-card__close .material-icons[data-v-86467226]{font-size:20px;line-height:1}.ds-data-card__body[data-v-86467226]{padding-top:8px}.ds-data-card__section[data-v-86467226]{padding:6px;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:10px;line-height:18px;letter-spacing:.04em;color:#414c58}.ds-data-card__more[data-v-86467226]{display:flex;flex-direction:column;gap:8px;max-height:132px;overflow:auto}.ds-data-card__empty[data-v-86467226]{display:flex;align-items:center;gap:8px;padding:6px;font-family:Mulish,Muli,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;font-size:14px;color:#414c58}.ds-data-card__empty-icon[data-v-86467226]{font-size:20px;line-height:1;color:#5e666f}
@@ -0,0 +1,13 @@
1
+ export declare const DS_ALERT_TYPES: {
2
+ readonly SUCCESS: "success";
3
+ readonly INFO: "info";
4
+ readonly WARNING: "warning";
5
+ readonly ERROR: "error";
6
+ };
7
+ export type DsAlertType = (typeof DS_ALERT_TYPES)[keyof typeof DS_ALERT_TYPES];
8
+ export declare const DS_ALERT_EFFECTS: {
9
+ readonly LIGHT: "light";
10
+ readonly DARK: "dark";
11
+ };
12
+ export type DsAlertEffect = (typeof DS_ALERT_EFFECTS)[keyof typeof DS_ALERT_EFFECTS];
13
+ export declare const DS_ALERT_ICONS: Record<DsAlertType, string>;
@@ -0,0 +1,75 @@
1
+ import { type PropType } from 'vue';
2
+ import { type DsAlertType, type DsAlertEffect } from './DsAlert.types';
3
+ declare var __VLS_1: {};
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_1) => any;
6
+ };
7
+ declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ type: {
9
+ type: PropType<DsAlertType>;
10
+ default: "info";
11
+ };
12
+ effect: {
13
+ type: PropType<DsAlertEffect>;
14
+ default: "light";
15
+ };
16
+ title: {
17
+ type: StringConstructor;
18
+ default: string;
19
+ };
20
+ description: {
21
+ type: StringConstructor;
22
+ default: string;
23
+ };
24
+ showIcon: BooleanConstructor;
25
+ closable: BooleanConstructor;
26
+ center: BooleanConstructor;
27
+ closeLabel: {
28
+ type: StringConstructor;
29
+ default: string;
30
+ };
31
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
32
+ close: (...args: any[]) => void;
33
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
34
+ type: {
35
+ type: PropType<DsAlertType>;
36
+ default: "info";
37
+ };
38
+ effect: {
39
+ type: PropType<DsAlertEffect>;
40
+ default: "light";
41
+ };
42
+ title: {
43
+ type: StringConstructor;
44
+ default: string;
45
+ };
46
+ description: {
47
+ type: StringConstructor;
48
+ default: string;
49
+ };
50
+ showIcon: BooleanConstructor;
51
+ closable: BooleanConstructor;
52
+ center: BooleanConstructor;
53
+ closeLabel: {
54
+ type: StringConstructor;
55
+ default: string;
56
+ };
57
+ }>> & Readonly<{
58
+ onClose?: ((...args: any[]) => any) | undefined;
59
+ }>, {
60
+ type: DsAlertType;
61
+ title: string;
62
+ closable: boolean;
63
+ closeLabel: string;
64
+ center: boolean;
65
+ effect: DsAlertEffect;
66
+ description: string;
67
+ showIcon: boolean;
68
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
69
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
70
+ export default _default;
71
+ type __VLS_WithSlots<T, S> = T & {
72
+ new (): {
73
+ $slots: S;
74
+ };
75
+ };
@@ -0,0 +1,2 @@
1
+ export { default as DsAlert } from './DsAlert.vue';
2
+ export * from './DsAlert.types';
@@ -0,0 +1,8 @@
1
+ export interface DsAvatarProps {
2
+ image?: string;
3
+ firstName?: string;
4
+ lastName?: string;
5
+ uid?: string;
6
+ size?: number;
7
+ circular?: boolean;
8
+ }
@@ -0,0 +1,62 @@
1
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
2
+ image: {
3
+ type: StringConstructor;
4
+ default: string;
5
+ };
6
+ firstName: {
7
+ type: StringConstructor;
8
+ default: string;
9
+ };
10
+ lastName: {
11
+ type: StringConstructor;
12
+ default: string;
13
+ };
14
+ uid: {
15
+ type: StringConstructor;
16
+ default: string;
17
+ };
18
+ size: {
19
+ type: NumberConstructor;
20
+ default: number;
21
+ };
22
+ circular: BooleanConstructor;
23
+ alt: {
24
+ type: StringConstructor;
25
+ default: string;
26
+ };
27
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
28
+ image: {
29
+ type: StringConstructor;
30
+ default: string;
31
+ };
32
+ firstName: {
33
+ type: StringConstructor;
34
+ default: string;
35
+ };
36
+ lastName: {
37
+ type: StringConstructor;
38
+ default: string;
39
+ };
40
+ uid: {
41
+ type: StringConstructor;
42
+ default: string;
43
+ };
44
+ size: {
45
+ type: NumberConstructor;
46
+ default: number;
47
+ };
48
+ circular: BooleanConstructor;
49
+ alt: {
50
+ type: StringConstructor;
51
+ default: string;
52
+ };
53
+ }>> & Readonly<{}>, {
54
+ size: number;
55
+ image: string;
56
+ firstName: string;
57
+ lastName: string;
58
+ uid: string;
59
+ circular: boolean;
60
+ alt: string;
61
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
62
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export { default as DsAvatar } from './DsAvatar.vue';
2
+ export * from './DsAvatar.types';
@@ -0,0 +1,9 @@
1
+ export declare const DS_BADGE_TONES: {
2
+ readonly ACCENT: "accent";
3
+ readonly GREY: "grey";
4
+ readonly INFO: "info";
5
+ readonly SUCCESS: "success";
6
+ readonly ERROR: "error";
7
+ readonly WARNING: "warning";
8
+ };
9
+ export type DsBadgeTone = (typeof DS_BADGE_TONES)[keyof typeof DS_BADGE_TONES];
@@ -0,0 +1,26 @@
1
+ import { type PropType } from 'vue';
2
+ import { type DsBadgeTone } from './DsBadge.types';
3
+ declare var __VLS_1: {};
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_1) => any;
6
+ };
7
+ declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ tone: {
9
+ type: PropType<DsBadgeTone>;
10
+ default: "accent";
11
+ };
12
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
13
+ tone: {
14
+ type: PropType<DsBadgeTone>;
15
+ default: "accent";
16
+ };
17
+ }>> & Readonly<{}>, {
18
+ tone: DsBadgeTone;
19
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
20
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
21
+ export default _default;
22
+ type __VLS_WithSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
@@ -0,0 +1,2 @@
1
+ export { default as DsBadge } from './DsBadge.vue';
2
+ export * from './DsBadge.types';
@@ -0,0 +1,21 @@
1
+ export declare const DS_BUTTON_VARIANTS: {
2
+ readonly PRIMARY: "primary";
3
+ readonly SECONDARY: "secondary";
4
+ readonly TERTIARY: "tertiary";
5
+ readonly QUATERNARY: "quaternary";
6
+ readonly SPECIAL: "special";
7
+ };
8
+ export type DsButtonVariant = (typeof DS_BUTTON_VARIANTS)[keyof typeof DS_BUTTON_VARIANTS];
9
+ export declare const DS_BUTTON_SIZES: {
10
+ readonly SMALL: "small";
11
+ readonly MEDIUM: "medium";
12
+ readonly LARGE: "large";
13
+ readonly XLARGE: "xlarge";
14
+ };
15
+ export type DsButtonSize = (typeof DS_BUTTON_SIZES)[keyof typeof DS_BUTTON_SIZES];
16
+ export declare const DS_BUTTON_NATIVE_TYPES: {
17
+ readonly BUTTON: "button";
18
+ readonly SUBMIT: "submit";
19
+ readonly RESET: "reset";
20
+ };
21
+ export type DsButtonNativeType = (typeof DS_BUTTON_NATIVE_TYPES)[keyof typeof DS_BUTTON_NATIVE_TYPES];