@nexxtmove/ui 0.1.51 → 0.1.53

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
@@ -1,37 +1,41 @@
1
1
  import { defineNuxtModule as c, addComponent as s, addTemplate as a } from "@nuxt/kit";
2
- const x = "components/AnimatedNumber/AnimatedNumber.vue", i = "components/Avatar/Avatar.vue", m = "components/Button/Button.vue", u = "components/Calendar/Calendar.vue", p = "components/Checkbox/Checkbox.vue", r = "components/Chip/Chip.vue", l = "components/Combobox/Combobox.vue", d = "components/ContactInfoCard/ContactInfoCard.vue", v = "components/CustomerJourneyTile/CustomerJourneyTile.vue", N = "components/DatePicker/DatePicker.vue", C = "components/DropdownButton/DropdownButton.vue", T = "components/Header/Header.vue", b = "components/Icon/Icon.vue", S = "components/InfoBlock/InfoBlock.vue", I = "components/InputField/InputField.vue", f = "components/Modal/Modal.vue", P = "components/Pagination/Pagination.vue", h = "components/PresenceIndicator/PresenceIndicator.vue", M = "components/ProgressBar/ProgressBar.vue", k = "components/SocialIcons/SocialIcons.vue", B = "components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue", g = "components/SocialMediaTemplate/SocialMediaTemplate.vue", y = "components/SocialMediaType/SocialMediaType.vue", A = "components/Source/Source.vue", D = "components/StepperHeader/StepperHeader.vue", H = "components/TabbedContent/TabbedContent.vue", w = "components/Table/Table.vue", E = "components/Tabs/Tabs.vue", F = "components/TimelineEvent/TimelineEvent.vue", J = "components/TimelinePhaseblock/TimelinePhaseblock.vue", j = "components/Tooltip/Tooltip.vue", $ = {
2
+ const x = "components/AnimatedNumber/AnimatedNumber.vue", i = "components/Avatar/Avatar.vue", u = "components/Button/Button.vue", m = "components/Calendar/Calendar.vue", r = "components/Card/Card.vue", p = "components/Checkbox/Checkbox.vue", d = "components/Chip/Chip.vue", l = "components/Combobox/Combobox.vue", v = "components/ContactInfoCard/ContactInfoCard.vue", C = "components/CustomerJourneyTile/CustomerJourneyTile.vue", N = "components/DatePicker/DatePicker.vue", T = "components/DoughnutChart/DoughnutChart.vue", b = "components/DropdownButton/DropdownButton.vue", P = "components/Header/Header.vue", S = "components/Icon/Icon.vue", h = "components/InfoBlock/InfoBlock.vue", I = "components/InputField/InputField.vue", f = "components/Modal/Modal.vue", g = "components/Pagination/Pagination.vue", y = "components/PresenceIndicator/PresenceIndicator.vue", M = "components/ProgressBar/ProgressBar.vue", k = "components/PropertyCard/PropertyCard.vue", B = "components/PropertyListing/PropertyListing.vue", D = "components/SocialIcons/SocialIcons.vue", A = "components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue", H = "components/SocialMediaTemplate/SocialMediaTemplate.vue", w = "components/SocialMediaType/SocialMediaType.vue", E = "components/Source/Source.vue", F = "components/StepperHeader/StepperHeader.vue", J = "components/TabbedContent/TabbedContent.vue", L = "components/Table/Table.vue", j = "components/Tabs/Tabs.vue", $ = "components/TimelineEvent/TimelineEvent.vue", K = "components/TimelinePhaseblock/TimelinePhaseblock.vue", O = "components/Tooltip/Tooltip.vue", U = {
3
3
  NexxtAnimatedNumber: x,
4
4
  NexxtAvatar: i,
5
- NexxtButton: m,
6
- NexxtCalendar: u,
5
+ NexxtButton: u,
6
+ NexxtCalendar: m,
7
+ NexxtCard: r,
7
8
  NexxtCheckbox: p,
8
- NexxtChip: r,
9
+ NexxtChip: d,
9
10
  NexxtCombobox: l,
10
- NexxtContactInfoCard: d,
11
- NexxtCustomerJourneyTile: v,
11
+ NexxtContactInfoCard: v,
12
+ NexxtCustomerJourneyTile: C,
12
13
  NexxtDatePicker: N,
13
- NexxtDropdownButton: C,
14
- NexxtHeader: T,
15
- NexxtIcon: b,
16
- NexxtInfoBlock: S,
14
+ NexxtDoughnutChart: T,
15
+ NexxtDropdownButton: b,
16
+ NexxtHeader: P,
17
+ NexxtIcon: S,
18
+ NexxtInfoBlock: h,
17
19
  NexxtInputField: I,
18
20
  NexxtModal: f,
19
- NexxtPagination: P,
20
- NexxtPresenceIndicator: h,
21
+ NexxtPagination: g,
22
+ NexxtPresenceIndicator: y,
21
23
  NexxtProgressBar: M,
22
- NexxtSocialIcons: k,
23
- NexxtSocialMediaCustomTemplate: B,
24
- NexxtSocialMediaTemplate: g,
25
- NexxtSocialMediaType: y,
26
- NexxtSource: A,
27
- NexxtStepperHeader: D,
28
- NexxtTabbedContent: H,
29
- NexxtTable: w,
30
- NexxtTabs: E,
31
- NexxtTimelineEvent: F,
32
- NexxtTimelinePhaseblock: J,
33
- NexxtTooltip: j
34
- }, O = c({
24
+ NexxtPropertyCard: k,
25
+ NexxtPropertyListing: B,
26
+ NexxtSocialIcons: D,
27
+ NexxtSocialMediaCustomTemplate: A,
28
+ NexxtSocialMediaTemplate: H,
29
+ NexxtSocialMediaType: w,
30
+ NexxtSource: E,
31
+ NexxtStepperHeader: F,
32
+ NexxtTabbedContent: J,
33
+ NexxtTable: L,
34
+ NexxtTabs: j,
35
+ NexxtTimelineEvent: $,
36
+ NexxtTimelinePhaseblock: K,
37
+ NexxtTooltip: O
38
+ }, q = c({
35
39
  meta: {
36
40
  name: "@nexxtmove/ui",
37
41
  configKey: "nexxtmoveUi",
@@ -43,7 +47,7 @@ const x = "components/AnimatedNumber/AnimatedNumber.vue", i = "components/Avatar
43
47
  addCSS: !0
44
48
  },
45
49
  setup(e, o) {
46
- for (const [t, n] of Object.entries($))
50
+ for (const [t, n] of Object.entries(U))
47
51
  s({
48
52
  name: t,
49
53
  export: "default",
@@ -62,5 +66,5 @@ const x = "components/AnimatedNumber/AnimatedNumber.vue", i = "components/Avatar
62
66
  }
63
67
  });
64
68
  export {
65
- O as default
69
+ q as default
66
70
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nexxtmove/ui",
3
3
  "type": "module",
4
- "version": "0.1.51",
4
+ "version": "0.1.53",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ image?: string
4
+ imageAlt?: string
5
+ }
6
+
7
+ defineProps<Props>()
8
+ </script>
9
+
10
+ <template>
11
+ <div
12
+ class="card bg-color-white inline-flex w-80 flex-col items-start justify-start gap-0 rounded-t-lg"
13
+ >
14
+ <slot name="image" v-if="image || $slots.image">
15
+ <img
16
+ v-if="image"
17
+ :src="image"
18
+ :alt="imageAlt ?? 'Card afbeelding'"
19
+ class="block h-40 max-h-40 min-h-40 w-full rounded-tl-lg rounded-tr-lg object-cover"
20
+ />
21
+ </slot>
22
+
23
+ <div
24
+ class="card-content box-border flex w-full flex-col gap-2 rounded-b-lg border border-gray-200 px-4 py-2"
25
+ :class="{ 'rounded-t-lg border-t': !image && !$slots.image }"
26
+ >
27
+ <slot />
28
+ </div>
29
+ </div>
30
+ </template>
@@ -0,0 +1,120 @@
1
+ <script setup lang="ts">
2
+ import { computed, onMounted, ref, type CSSProperties } from 'vue'
3
+
4
+ type ColorScale =
5
+ | 'gray'
6
+ | 'cornflower-blue'
7
+ | 'orange'
8
+ | 'purple'
9
+ | 'rose'
10
+ | 'green'
11
+ | 'sapphire'
12
+ | 'yale-blue'
13
+ | 'brick'
14
+ type ColorShade = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950
15
+ type BrandColor = `brands-${'facebook' | 'instagram' | 'linkedin' | 'x' | 'google' | 'tiktok'}`
16
+ type TailwindColor = `${ColorScale}-${ColorShade}` | 'white' | BrandColor
17
+ type Color = (CSSProperties['color'] & {}) | TailwindColor
18
+
19
+ interface NexxtDoughnutChartProps {
20
+ value: number
21
+ percentage: number
22
+ color?: Color
23
+ backgroundColor?: Color
24
+ size?: number
25
+ thickness?: number
26
+ delay?: number
27
+ duration?: number
28
+ }
29
+
30
+ defineOptions({
31
+ name: 'NexxtDoughnutChart',
32
+ })
33
+
34
+ const {
35
+ value,
36
+ percentage,
37
+ backgroundColor,
38
+ color = 'orange-500',
39
+ size = 160,
40
+ thickness = 20,
41
+ delay = 0,
42
+ duration = 800,
43
+ } = defineProps<NexxtDoughnutChartProps>()
44
+
45
+ const animated = ref(false)
46
+
47
+ onMounted(() => {
48
+ setTimeout(() => {
49
+ animated.value = true
50
+ }, delay)
51
+ })
52
+
53
+ const radius = computed(() => (size - thickness) / 2)
54
+ const circumference = computed(() => 2 * Math.PI * radius.value)
55
+ const center = computed(() => size / 2)
56
+
57
+ const arc = computed(() => {
58
+ const fraction = Math.min(1, Math.max(0, percentage / 100))
59
+ return fraction * circumference.value
60
+ })
61
+
62
+ const resolveColor = (value: Color) => {
63
+ if (/^(#|rgb|hsl|oklch|lch|lab|hwb|var\(|color\()/.test(value)) return value
64
+ if (!value.includes('-')) return value
65
+ return `var(--color-${value})`
66
+ }
67
+
68
+ const resolvedColor = computed(() => resolveColor(color))
69
+ const resolvedBackgroundColor = computed(() =>
70
+ backgroundColor ? resolveColor(backgroundColor) : undefined,
71
+ )
72
+ </script>
73
+
74
+ <template>
75
+ <svg
76
+ :width="size"
77
+ :height="size"
78
+ :viewBox="`0 0 ${size} ${size}`"
79
+ role="img"
80
+ :aria-label="`${value}`"
81
+ >
82
+ <g :transform="`scale(-1, 1) translate(-${size}, 0) rotate(-90, ${center}, ${center})`">
83
+ <circle
84
+ v-if="backgroundColor"
85
+ :cx="center"
86
+ :cy="center"
87
+ :r="radius"
88
+ fill="none"
89
+ :stroke="resolvedBackgroundColor"
90
+ :stroke-width="thickness"
91
+ />
92
+ <circle
93
+ :cx="center"
94
+ :cy="center"
95
+ :r="radius"
96
+ fill="none"
97
+ :stroke="resolvedColor"
98
+ :stroke-width="thickness"
99
+ stroke-linecap="butt"
100
+ :stroke-dasharray="`${animated ? arc : 0} ${circumference}`"
101
+ :style="{ transition: `stroke-dasharray ${duration}ms ease-out` }"
102
+ />
103
+ </g>
104
+ <foreignObject
105
+ :x="thickness"
106
+ :y="thickness"
107
+ :width="size - thickness * 2"
108
+ :height="size - thickness * 2"
109
+ >
110
+ <div
111
+ xmlns="http://www.w3.org/1999/xhtml"
112
+ class="flex h-full w-full items-center justify-center"
113
+ >
114
+ <slot>
115
+ <span class="heading-1 text-sapphire-900">{{ value }}</span>
116
+ </slot>
117
+ </div>
118
+ </foreignObject>
119
+ </svg>
120
+ </template>
@@ -0,0 +1,39 @@
1
+ <script lang="ts" setup>
2
+ import NexxtCard from '../Card/Card.vue'
3
+ import NexxtPropertyListing from '../PropertyListing/PropertyListing.vue'
4
+ import NexxtIcon from '../Icon/Icon.vue'
5
+ import PropertyPlaceholder from '../../assets/images/property_placeholder.jpg'
6
+
7
+ export interface NexxtPropertyCardProps {
8
+ image?: string
9
+ imageAlt?: string
10
+ price?: number
11
+ city: string
12
+ text?: string
13
+ }
14
+
15
+ defineOptions({ name: 'NexxtPropertyCard' })
16
+
17
+ defineProps<NexxtPropertyCardProps>()
18
+ </script>
19
+
20
+ <template>
21
+ <NexxtCard :image="image" :image-alt="imageAlt">
22
+ <template v-if="!image" #image>
23
+ <div class="relative isolate h-40 w-full overflow-hidden rounded-tl-lg rounded-tr-lg">
24
+ <img
25
+ :src="PropertyPlaceholder"
26
+ alt="Woning placeholder"
27
+ loading="lazy"
28
+ class="h-full w-full object-cover"
29
+ />
30
+ <div
31
+ class="absolute inset-0 flex items-center justify-center rounded-tl-lg rounded-tr-lg bg-white/20 backdrop-blur-sm"
32
+ >
33
+ <NexxtIcon name="house" class="text-6xl text-white drop-shadow" />
34
+ </div>
35
+ </div>
36
+ </template>
37
+ <NexxtPropertyListing :price="price" :city="city" :text="text" />
38
+ </NexxtCard>
39
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ price?: number
4
+ city: string
5
+ text?: string
6
+ }
7
+
8
+ defineProps<Props>()
9
+ </script>
10
+
11
+ <template>
12
+ <div class="flex flex-col items-start justify-start gap-2 self-stretch overflow-hidden">
13
+ <div class="inline-flex w-full items-center gap-2 overflow-hidden">
14
+ <div v-if="price" class="text-color-gray-950 shrink-0 body-semibold">
15
+ € {{ price.toLocaleString('nl-NL') }}
16
+ </div>
17
+ <div v-if="price" class="text-color-gray-950 shrink-0 body-normal">|</div>
18
+ <div
19
+ class="text-color-gray-950 min-w-0 truncate"
20
+ :class="price ? 'body-normal' : 'body-semibold'"
21
+ >
22
+ {{ city }}
23
+ </div>
24
+ </div>
25
+
26
+ <div v-if="text" class="text-color-gray-950 wrap-break-words w-full body-normal">
27
+ {{ text }}
28
+ </div>
29
+ </div>
30
+ </template>
@@ -70,7 +70,7 @@ const getPhaseDirection = () => {
70
70
  <template>
71
71
  <div class="relative z-10 flex flex-col gap-16" :data-phase="phase.phase.value">
72
72
  <template v-if="index === 0 && isSplitView">
73
- <div class="relative z-10 bg-white">
73
+ <div class="relative z-10">
74
74
  <div class="flex items-center justify-between px-4 py-2">
75
75
  <span class="flex gap-1">
76
76
  Outbound
@@ -91,15 +91,15 @@ const getPhaseDirection = () => {
91
91
  </template>
92
92
  <!-- Left timeline line (always shown) -->
93
93
  <div
94
- class="absolute top-0 bottom-0 left-5 w-0 border-l"
95
- :class="PHASE_MAP[phase.phase.value].color"
94
+ class="absolute bottom-0 left-5 w-0 border-l"
95
+ :class="[PHASE_MAP[phase.phase.value].color, index === 0 && isSplitView ? 'top-10' : 'top-0']"
96
96
  ></div>
97
97
 
98
98
  <!-- Right timeline line (split view only) -->
99
99
  <div
100
100
  v-if="isSplitView"
101
- class="absolute top-0 right-5 bottom-0 w-0 border-l"
102
- :class="PHASE_MAP[phase.phase.value].color"
101
+ class="absolute right-5 bottom-0 w-0 border-l"
102
+ :class="[PHASE_MAP[phase.phase.value].color, index === 0 ? 'top-10' : 'top-0']"
103
103
  ></div>
104
104
 
105
105
  <!-- Events -->
@@ -113,7 +113,7 @@ const getPhaseDirection = () => {
113
113
  <!-- Phase separator badge (not shown for the very first phase) -->
114
114
  <div
115
115
  v-if="index !== phases.length - 1"
116
- class="relative flex flex-col items-center bg-white pt-8 pb-24 text-center"
116
+ class="relative flex flex-col items-center pt-8 pb-24 text-center"
117
117
  :class="{ 'pl-16': !isSplitView }"
118
118
  >
119
119
  <div
@@ -144,13 +144,13 @@ const getPhaseDirection = () => {
144
144
  <div v-if="!isLast" class="h-1"></div>
145
145
 
146
146
  <div
147
- class="absolute top-0 bottom-0 left-5 w-[1px] bg-linear-to-b"
147
+ class="absolute top-0 bottom-0 left-5 w-px bg-linear-to-b"
148
148
  :class="gradientClasses"
149
149
  ></div>
150
150
 
151
151
  <div
152
152
  v-if="isSplitView"
153
- class="absolute top-0 right-5 bottom-0 w-[1px] bg-linear-to-b"
153
+ class="absolute top-0 right-5 bottom-0 w-px bg-linear-to-b"
154
154
  :class="gradientClasses"
155
155
  ></div>
156
156
  </div>
@@ -3,12 +3,14 @@
3
3
  "NexxtAvatar": "components/Avatar/Avatar.vue",
4
4
  "NexxtButton": "components/Button/Button.vue",
5
5
  "NexxtCalendar": "components/Calendar/Calendar.vue",
6
+ "NexxtCard": "components/Card/Card.vue",
6
7
  "NexxtCheckbox": "components/Checkbox/Checkbox.vue",
7
8
  "NexxtChip": "components/Chip/Chip.vue",
8
9
  "NexxtCombobox": "components/Combobox/Combobox.vue",
9
10
  "NexxtContactInfoCard": "components/ContactInfoCard/ContactInfoCard.vue",
10
11
  "NexxtCustomerJourneyTile": "components/CustomerJourneyTile/CustomerJourneyTile.vue",
11
12
  "NexxtDatePicker": "components/DatePicker/DatePicker.vue",
13
+ "NexxtDoughnutChart": "components/DoughnutChart/DoughnutChart.vue",
12
14
  "NexxtDropdownButton": "components/DropdownButton/DropdownButton.vue",
13
15
  "NexxtHeader": "components/Header/Header.vue",
14
16
  "NexxtIcon": "components/Icon/Icon.vue",
@@ -18,6 +20,8 @@
18
20
  "NexxtPagination": "components/Pagination/Pagination.vue",
19
21
  "NexxtPresenceIndicator": "components/PresenceIndicator/PresenceIndicator.vue",
20
22
  "NexxtProgressBar": "components/ProgressBar/ProgressBar.vue",
23
+ "NexxtPropertyCard": "components/PropertyCard/PropertyCard.vue",
24
+ "NexxtPropertyListing": "components/PropertyListing/PropertyListing.vue",
21
25
  "NexxtSocialIcons": "components/SocialIcons/SocialIcons.vue",
22
26
  "NexxtSocialMediaCustomTemplate": "components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue",
23
27
  "NexxtSocialMediaTemplate": "components/SocialMediaTemplate/SocialMediaTemplate.vue",
package/src/index.ts CHANGED
@@ -3,12 +3,14 @@ export { default as NexxtAnimatedNumber } from './components/AnimatedNumber/Anim
3
3
  export { default as NexxtAvatar } from './components/Avatar/Avatar.vue'
4
4
  export { default as NexxtButton } from './components/Button/Button.vue'
5
5
  export { default as NexxtCalendar } from './components/Calendar/Calendar.vue'
6
+ export { default as NexxtCard } from './components/Card/Card.vue'
6
7
  export { default as NexxtCheckbox } from './components/Checkbox/Checkbox.vue'
7
8
  export { default as NexxtChip } from './components/Chip/Chip.vue'
8
9
  export { default as NexxtCombobox } from './components/Combobox/Combobox.vue'
9
10
  export { default as NexxtContactInfoCard } from './components/ContactInfoCard/ContactInfoCard.vue'
10
11
  export { default as NexxtCustomerJourneyTile } from './components/CustomerJourneyTile/CustomerJourneyTile.vue'
11
12
  export { default as NexxtDatePicker } from './components/DatePicker/DatePicker.vue'
13
+ export { default as NexxtDoughnutChart } from './components/DoughnutChart/DoughnutChart.vue'
12
14
  export { default as NexxtDropdownButton } from './components/DropdownButton/DropdownButton.vue'
13
15
  export { default as NexxtHeader } from './components/Header/Header.vue'
14
16
  export { default as NexxtIcon } from './components/Icon/Icon.vue'
@@ -18,6 +20,8 @@ export { default as NexxtModal } from './components/Modal/Modal.vue'
18
20
  export { default as NexxtPagination } from './components/Pagination/Pagination.vue'
19
21
  export { default as NexxtPresenceIndicator } from './components/PresenceIndicator/PresenceIndicator.vue'
20
22
  export { default as NexxtProgressBar } from './components/ProgressBar/ProgressBar.vue'
23
+ export { default as NexxtPropertyCard } from './components/PropertyCard/PropertyCard.vue'
24
+ export { default as NexxtPropertyListing } from './components/PropertyListing/PropertyListing.vue'
21
25
  export { default as NexxtSocialIcons } from './components/SocialIcons/SocialIcons.vue'
22
26
  export { default as NexxtSocialMediaCustomTemplate } from './components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue'
23
27
  export { default as NexxtSocialMediaTemplate } from './components/SocialMediaTemplate/SocialMediaTemplate.vue'