@nexxtmove/ui 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/nuxt.js CHANGED
@@ -47522,6 +47522,7 @@ var Yw, Xw, Zw, Qw, $w, eT = d((() => {
47522
47522
  NexxtProgressBar: "components/ProgressBar/ProgressBar.vue",
47523
47523
  NexxtPropertyCard: "components/PropertyCard/PropertyCard.vue",
47524
47524
  NexxtPropertyListing: "components/PropertyListing/PropertyListing.vue",
47525
+ NexxtReferenceCard: "components/ReferenceCard/ReferenceCard.vue",
47525
47526
  NexxtSelect: "components/Select/Select.vue",
47526
47527
  NexxtSidebarMenuItem: "components/SidebarMenuItem/SidebarMenuItem.vue",
47527
47528
  NexxtSkeleton: "components/Skeleton/Skeleton.vue",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nexxtmove/ui",
3
3
  "type": "module",
4
- "version": "1.1.4",
4
+ "version": "1.1.5",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
@@ -0,0 +1,146 @@
1
+ <script lang="ts" setup>
2
+ import { computed } from 'vue'
3
+ import NexxtButton from '../Button/Button.vue'
4
+ import NexxtCheckbox from '../Checkbox/Checkbox.vue'
5
+ import NexxtEnergyLabel, { type EnergyLabelLetter } from '../EnergyLabel/EnergyLabel.vue'
6
+ import NexxtIcon from '../Icon/Icon.vue'
7
+
8
+ export interface ProposalReference {
9
+ index: number
10
+ postalCode: string
11
+ streetName: string
12
+ houseNumber: number
13
+ houseType: string
14
+ city: string
15
+ mainImageUrl: string | null
16
+ latitude: number
17
+ longitude: number
18
+ useSurface: number | null
19
+ parcelSurface: number | null
20
+ buildYear: number | null
21
+ volume: number | null
22
+ energyLabel: string | null
23
+ garage: string | null
24
+ insulation: string | null
25
+ shedStorageType: string | null
26
+ saleDate: string | null
27
+ dateOnOfferSince: string | null
28
+ transportDate: string | null
29
+ salePrice: string | null
30
+ indexedSalePrice: string | null
31
+ pricePerSquareMeter: string | null
32
+ }
33
+
34
+ export interface NexxtReferenceCardProps {
35
+ reference: ProposalReference
36
+ selectedLabel?: string
37
+ unselectedLabel?: string
38
+ detailsLabel?: string
39
+ }
40
+
41
+ defineOptions({ name: 'NexxtReferenceCard' })
42
+
43
+ const {
44
+ reference,
45
+ selectedLabel = 'Meegenomen in advies',
46
+ unselectedLabel = 'Selecteer deze woning',
47
+ detailsLabel = 'Meer details',
48
+ } = defineProps<NexxtReferenceCardProps>()
49
+
50
+ const selected = defineModel<boolean>({ default: false })
51
+
52
+ defineEmits<{ details: [reference: ProposalReference] }>()
53
+
54
+ const address = computed(() => `${reference.streetName} ${reference.houseNumber}`)
55
+
56
+ const location = computed(() => `${reference.postalCode} ${reference.city}`)
57
+
58
+ const energyLabel = computed(() => (reference.energyLabel ?? null) as EnergyLabelLetter | null)
59
+
60
+ const saleDate = computed(() => {
61
+ if (!reference.saleDate) return null
62
+
63
+ const date = new Date(reference.saleDate)
64
+ if (Number.isNaN(date.getTime())) return reference.saleDate
65
+
66
+ return new Intl.DateTimeFormat('nl-NL', {
67
+ day: '2-digit',
68
+ month: '2-digit',
69
+ year: 'numeric',
70
+ }).format(date)
71
+ })
72
+ </script>
73
+
74
+ <template>
75
+ <div
76
+ role="checkbox"
77
+ :aria-checked="selected"
78
+ :aria-label="`${address}, ${location}`"
79
+ tabindex="0"
80
+ :class="[
81
+ '@container flex w-full cursor-pointer flex-col overflow-hidden rounded-lg border transition-colors duration-200',
82
+ 'focus-visible:ring-2 focus-visible:ring-cornflower-blue-400 focus-visible:ring-offset-2 focus-visible:outline-none',
83
+ selected ? 'border-cornflower-blue-500' : 'border-gray-200',
84
+ ]"
85
+ @click="selected = !selected"
86
+ @keydown.space.prevent="selected = !selected"
87
+ @keydown.enter.prevent="selected = !selected"
88
+ >
89
+ <div class="flex flex-col items-stretch bg-white @lg:flex-row">
90
+ <div
91
+ class="relative h-40 w-full self-stretch overflow-hidden bg-gray-100 @lg:h-auto @lg:w-48 @lg:shrink-0"
92
+ >
93
+ <img
94
+ v-if="reference.mainImageUrl"
95
+ :src="reference.mainImageUrl"
96
+ :alt="address"
97
+ loading="lazy"
98
+ class="h-full w-full object-cover"
99
+ />
100
+ <div v-else class="flex h-full min-h-32 w-full items-center justify-center">
101
+ <NexxtIcon name="house" class="text-4xl text-gray-500" />
102
+ </div>
103
+ </div>
104
+
105
+ <div
106
+ class="flex min-w-0 flex-1 flex-col justify-center gap-1 border-t border-gray-200 p-4 @lg:border-t-0 @lg:border-l"
107
+ >
108
+ <p class="truncate heading-4">{{ address }}</p>
109
+ <p class="truncate body-normal text-gray-800">{{ location }}</p>
110
+ <div v-if="energyLabel" class="flex items-center justify-between gap-2">
111
+ <span class="body-normal text-gray-800">Energielabel</span>
112
+ <NexxtEnergyLabel :label="energyLabel" />
113
+ </div>
114
+ </div>
115
+
116
+ <div
117
+ class="flex flex-col justify-center gap-1 border-t border-gray-200 p-4 text-left @lg:min-w-56 @lg:shrink-0 @lg:border-t-0 @lg:border-l"
118
+ >
119
+ <p v-if="reference.salePrice" class="heading-4 whitespace-nowrap">
120
+ {{ reference.salePrice }}
121
+ </p>
122
+ <p v-if="saleDate" class="body-normal text-gray-800">{{ saleDate }}</p>
123
+ </div>
124
+ </div>
125
+
126
+ <div
127
+ :class="[
128
+ 'flex flex-wrap items-center justify-between gap-x-4 gap-y-2 border-t px-4 py-2',
129
+ selected
130
+ ? 'border-cornflower-blue-500 bg-cornflower-blue-50'
131
+ : 'border-gray-200 bg-gray-50',
132
+ ]"
133
+ >
134
+ <div aria-hidden="true" class="pointer-events-none flex min-w-0 items-center gap-3">
135
+ <NexxtCheckbox :model-value="selected" tabindex="-1" />
136
+ <span class="truncate body-normal">
137
+ {{ selected ? selectedLabel : unselectedLabel }}
138
+ </span>
139
+ </div>
140
+
141
+ <NexxtButton variant="secondary" @click.stop="$emit('details', reference)">
142
+ {{ detailsLabel }}
143
+ </NexxtButton>
144
+ </div>
145
+ </div>
146
+ </template>
@@ -29,6 +29,7 @@
29
29
  "NexxtProgressBar": "components/ProgressBar/ProgressBar.vue",
30
30
  "NexxtPropertyCard": "components/PropertyCard/PropertyCard.vue",
31
31
  "NexxtPropertyListing": "components/PropertyListing/PropertyListing.vue",
32
+ "NexxtReferenceCard": "components/ReferenceCard/ReferenceCard.vue",
32
33
  "NexxtSelect": "components/Select/Select.vue",
33
34
  "NexxtSidebarMenuItem": "components/SidebarMenuItem/SidebarMenuItem.vue",
34
35
  "NexxtSkeleton": "components/Skeleton/Skeleton.vue",
package/src/index.ts CHANGED
@@ -32,6 +32,7 @@ export { default as NexxtPresenceIndicator } from './components/PresenceIndicato
32
32
  export { default as NexxtProgressBar } from './components/ProgressBar/ProgressBar.vue'
33
33
  export { default as NexxtPropertyCard } from './components/PropertyCard/PropertyCard.vue'
34
34
  export { default as NexxtPropertyListing } from './components/PropertyListing/PropertyListing.vue'
35
+ export { default as NexxtReferenceCard } from './components/ReferenceCard/ReferenceCard.vue'
35
36
  export { default as NexxtSelect } from './components/Select/Select.vue'
36
37
  export { default as NexxtSidebarMenuItem } from './components/SidebarMenuItem/SidebarMenuItem.vue'
37
38
  export { default as NexxtSkeleton } from './components/Skeleton/Skeleton.vue'