@nexxtmove/ui 0.1.49 → 0.1.50
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/index.d.ts +265 -54
- package/dist/index.js +1200 -1095
- package/dist/nuxt.js +22 -20
- package/package.json +1 -1
- package/src/assets/images/source/bricr.png +0 -0
- package/src/assets/images/source/kolibri.png +0 -0
- package/src/assets/images/source/kolibri_app_exchange.png +0 -0
- package/src/assets/images/source/realworks.png +0 -0
- package/src/assets/images/source/realworks_agenda_api.png +0 -0
- package/src/assets/images/source/realworks_api.png +0 -0
- package/src/assets/images/source/zapier.png +0 -0
- package/src/components/Combobox/Combobox.vue +1 -1
- package/src/components/DropdownButton/DropdownButton.vue +3 -3
- package/src/components/Header/Header.vue +10 -7
- package/src/components/InputField/InputField.vue +5 -4
- package/src/components/PresenceIndicator/PresenceIndicator.vue +32 -0
- package/src/components/Source/Source.vue +91 -0
- package/src/components/TabbedContent/TabbedContent.vue +2 -2
- package/src/components/Tabs/Tabs.vue +45 -11
- package/src/components.json +2 -0
- package/src/index.ts +2 -0
package/dist/nuxt.js
CHANGED
|
@@ -1,34 +1,36 @@
|
|
|
1
|
-
import { defineNuxtModule as
|
|
2
|
-
const i = "components/AnimatedNumber/AnimatedNumber.vue", x = "components/Avatar/Avatar.vue", m = "components/Button/Button.vue", u = "components/Calendar/Calendar.vue", p = "components/Checkbox/Checkbox.vue", l = "components/Chip/Chip.vue",
|
|
1
|
+
import { defineNuxtModule as c, addComponent as s, addTemplate as a } from "@nuxt/kit";
|
|
2
|
+
const i = "components/AnimatedNumber/AnimatedNumber.vue", x = "components/Avatar/Avatar.vue", m = "components/Button/Button.vue", u = "components/Calendar/Calendar.vue", p = "components/Checkbox/Checkbox.vue", l = "components/Chip/Chip.vue", r = "components/Combobox/Combobox.vue", d = "components/CustomerJourneyTile/CustomerJourneyTile.vue", v = "components/DatePicker/DatePicker.vue", N = "components/DropdownButton/DropdownButton.vue", T = "components/Header/Header.vue", b = "components/Icon/Icon.vue", C = "components/InfoBlock/InfoBlock.vue", S = "components/InputField/InputField.vue", P = "components/Modal/Modal.vue", I = "components/Pagination/Pagination.vue", f = "components/PresenceIndicator/PresenceIndicator.vue", h = "components/ProgressBar/ProgressBar.vue", M = "components/SocialIcons/SocialIcons.vue", k = "components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue", B = "components/SocialMediaTemplate/SocialMediaTemplate.vue", g = "components/SocialMediaType/SocialMediaType.vue", y = "components/Source/Source.vue", A = "components/StepperHeader/StepperHeader.vue", D = "components/TabbedContent/TabbedContent.vue", H = "components/Table/Table.vue", w = "components/Tabs/Tabs.vue", E = "components/TimelineEvent/TimelineEvent.vue", F = "components/TimelinePhaseblock/TimelinePhaseblock.vue", J = "components/Tooltip/Tooltip.vue", j = {
|
|
3
3
|
NexxtAnimatedNumber: i,
|
|
4
4
|
NexxtAvatar: x,
|
|
5
5
|
NexxtButton: m,
|
|
6
6
|
NexxtCalendar: u,
|
|
7
7
|
NexxtCheckbox: p,
|
|
8
8
|
NexxtChip: l,
|
|
9
|
-
NexxtCombobox:
|
|
10
|
-
NexxtCustomerJourneyTile:
|
|
9
|
+
NexxtCombobox: r,
|
|
10
|
+
NexxtCustomerJourneyTile: d,
|
|
11
11
|
NexxtDatePicker: v,
|
|
12
12
|
NexxtDropdownButton: N,
|
|
13
13
|
NexxtHeader: T,
|
|
14
14
|
NexxtIcon: b,
|
|
15
15
|
NexxtInfoBlock: C,
|
|
16
16
|
NexxtInputField: S,
|
|
17
|
-
NexxtModal:
|
|
18
|
-
NexxtPagination:
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
NexxtModal: P,
|
|
18
|
+
NexxtPagination: I,
|
|
19
|
+
NexxtPresenceIndicator: f,
|
|
20
|
+
NexxtProgressBar: h,
|
|
21
|
+
NexxtSocialIcons: M,
|
|
21
22
|
NexxtSocialMediaCustomTemplate: k,
|
|
22
23
|
NexxtSocialMediaTemplate: B,
|
|
23
|
-
NexxtSocialMediaType:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
NexxtSocialMediaType: g,
|
|
25
|
+
NexxtSource: y,
|
|
26
|
+
NexxtStepperHeader: A,
|
|
27
|
+
NexxtTabbedContent: D,
|
|
28
|
+
NexxtTable: H,
|
|
29
|
+
NexxtTabs: w,
|
|
30
|
+
NexxtTimelineEvent: E,
|
|
31
|
+
NexxtTimelinePhaseblock: F,
|
|
32
|
+
NexxtTooltip: J
|
|
33
|
+
}, K = c({
|
|
32
34
|
meta: {
|
|
33
35
|
name: "@nexxtmove/ui",
|
|
34
36
|
configKey: "nexxtmoveUi",
|
|
@@ -40,8 +42,8 @@ const i = "components/AnimatedNumber/AnimatedNumber.vue", x = "components/Avatar
|
|
|
40
42
|
addCSS: !0
|
|
41
43
|
},
|
|
42
44
|
setup(e, o) {
|
|
43
|
-
for (const [t, n] of Object.entries(
|
|
44
|
-
|
|
45
|
+
for (const [t, n] of Object.entries(j))
|
|
46
|
+
s({
|
|
45
47
|
name: t,
|
|
46
48
|
export: "default",
|
|
47
49
|
filePath: `@nexxtmove/ui/${n}`
|
|
@@ -59,5 +61,5 @@ const i = "components/AnimatedNumber/AnimatedNumber.vue", x = "components/Avatar
|
|
|
59
61
|
}
|
|
60
62
|
});
|
|
61
63
|
export {
|
|
62
|
-
|
|
64
|
+
K as default
|
|
63
65
|
};
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -113,7 +113,7 @@ const transitionClasses = computed(() => {
|
|
|
113
113
|
<Transition v-bind="transitionClasses">
|
|
114
114
|
<div
|
|
115
115
|
v-if="isOpen"
|
|
116
|
-
class="absolute top-full z-10 mt-2.5 min-w-80 rounded-
|
|
116
|
+
class="absolute top-full z-10 mt-2.5 min-w-80 rounded-lg border border-gray-200 bg-white whitespace-nowrap"
|
|
117
117
|
:class="placement === 'right' ? 'right-0' : 'left-0'"
|
|
118
118
|
>
|
|
119
119
|
<div class="p-2">
|
|
@@ -119,7 +119,7 @@ const componentClasses = computed(() => {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
if (variant === 'secondary') {
|
|
122
|
-
return 'bg-button-bg-secondary-default text-button-text-secondary-default border-button-border-secondary-default border border-solid'
|
|
122
|
+
return 'bg-button-bg-secondary-default text-button-text-secondary-default border-button-border-secondary-default border border-solid hover:border-button-border-secondary-hover'
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
return ''
|
|
@@ -157,7 +157,7 @@ const transitionClasses = computed(() => {
|
|
|
157
157
|
class="relative inline-flex flex-col"
|
|
158
158
|
:class="placement === 'right' ? 'items-end' : 'items-start'"
|
|
159
159
|
>
|
|
160
|
-
<div class="inline-flex items-center overflow-hidden rounded-
|
|
160
|
+
<div class="inline-flex items-center overflow-hidden rounded-lg" :class="componentClasses">
|
|
161
161
|
<template v-if="!iconOnly">
|
|
162
162
|
<button
|
|
163
163
|
class="flex cursor-pointer items-center gap-2 px-4 py-2 transition-colors duration-200"
|
|
@@ -194,7 +194,7 @@ const transitionClasses = computed(() => {
|
|
|
194
194
|
<div
|
|
195
195
|
v-if="isOpen"
|
|
196
196
|
role="menu"
|
|
197
|
-
class="absolute top-full z-10 mt-2.5 min-w-full rounded-
|
|
197
|
+
class="absolute top-full z-10 mt-2.5 min-w-full rounded-lg border border-gray-200 bg-white whitespace-nowrap"
|
|
198
198
|
:class="placement === 'right' ? 'right-0' : 'left-0'"
|
|
199
199
|
>
|
|
200
200
|
<template v-for="(group, groupIndex) in groupedOptions" :key="group.title || groupIndex">
|
|
@@ -24,13 +24,16 @@ const {
|
|
|
24
24
|
<template>
|
|
25
25
|
<div class="header flex items-center" :class="$slots.center ? 'grid grid-cols-3' : ''">
|
|
26
26
|
<div class="flex max-w-full items-center justify-start gap-4">
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
<slot name="back-button">
|
|
28
|
+
<Button
|
|
29
|
+
v-if="backButtonText && backButtonAction && !$slots['back-button']"
|
|
30
|
+
class="shrink-0"
|
|
31
|
+
variant="secondary"
|
|
32
|
+
@click="backButtonAction"
|
|
33
|
+
>
|
|
34
|
+
{{ backButtonText }}
|
|
35
|
+
</Button>
|
|
36
|
+
</slot>
|
|
34
37
|
<span class="block truncate text-sapphire-500" :class="headingType">
|
|
35
38
|
{{ title }}
|
|
36
39
|
</span>
|
|
@@ -8,7 +8,7 @@ defineOptions({
|
|
|
8
8
|
name: 'NexxtInputField',
|
|
9
9
|
})
|
|
10
10
|
|
|
11
|
-
interface NexxtInputFieldProps {
|
|
11
|
+
export interface NexxtInputFieldProps {
|
|
12
12
|
placeholder?: string
|
|
13
13
|
label?: string
|
|
14
14
|
error?: boolean
|
|
@@ -35,8 +35,8 @@ const modelValue = defineModel<string>()
|
|
|
35
35
|
</label>
|
|
36
36
|
|
|
37
37
|
<div
|
|
38
|
-
class="flex items-center gap-2
|
|
39
|
-
:class="error ? 'ring-brick-400' : 'ring-gray-200'"
|
|
38
|
+
class="flex items-center gap-2 overflow-hidden rounded-lg ring transition-colors ease-out focus-within:ring-cornflower-blue-500"
|
|
39
|
+
:class="[error ? 'ring-brick-400' : 'ring-gray-200', { 'px-3': leftIcon }]"
|
|
40
40
|
>
|
|
41
41
|
<span v-if="leftIcon" class="flex items-center">
|
|
42
42
|
<Icon :name="leftIcon" />
|
|
@@ -47,7 +47,8 @@ const modelValue = defineModel<string>()
|
|
|
47
47
|
v-model="modelValue"
|
|
48
48
|
:placeholder="placeholder"
|
|
49
49
|
v-bind="$attrs"
|
|
50
|
-
class="h-10 min-w-60
|
|
50
|
+
class="bg-transparant h-10 w-full min-w-60 text-sm text-gray-900 placeholder-gray-400 focus:outline-none"
|
|
51
|
+
:class="{ 'pl-3': !leftIcon, 'pr-3': !rightIcon }"
|
|
51
52
|
/>
|
|
52
53
|
<slot name="right">
|
|
53
54
|
<span v-if="rightIcon" class="flex items-center">
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
export interface NexxtPresenceIndicatorProps {
|
|
3
|
+
online?: boolean
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
defineOptions({
|
|
7
|
+
name: 'NexxtPresenceIndicator',
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
const { online = false } = defineProps<NexxtPresenceIndicatorProps>()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<span
|
|
15
|
+
class="inline-flex h-6 items-center gap-1.5 rounded-sm px-2.5 extra-small-semibold"
|
|
16
|
+
:class="online ? 'bg-green-100 text-green-600' : 'bg-gray-100 text-gray-700'"
|
|
17
|
+
:aria-label="online ? 'Online' : 'Offline'"
|
|
18
|
+
role="status"
|
|
19
|
+
>
|
|
20
|
+
<span class="relative flex h-1.5 w-1.5">
|
|
21
|
+
<span
|
|
22
|
+
v-if="online"
|
|
23
|
+
class="absolute inline-flex h-full w-full animate-ping rounded-full bg-green-400 opacity-75"
|
|
24
|
+
/>
|
|
25
|
+
<i
|
|
26
|
+
class="relative block h-1.5 w-1.5 rounded-full"
|
|
27
|
+
:class="online ? 'bg-green-500' : 'bg-gray-700'"
|
|
28
|
+
/>
|
|
29
|
+
</span>
|
|
30
|
+
{{ online ? 'Actief' : 'Inactief' }}
|
|
31
|
+
</span>
|
|
32
|
+
</template>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import imgBricr from '../../assets/images/source/bricr.png'
|
|
3
|
+
import imgKolibri from '../../assets/images/source/kolibri.png'
|
|
4
|
+
import imgKolibriAppExchange from '../../assets/images/source/kolibri_app_exchange.png'
|
|
5
|
+
import imgRealworks from '../../assets/images/source/realworks.png'
|
|
6
|
+
import imgRealworksAgendaApi from '../../assets/images/source/realworks_agenda_api.png'
|
|
7
|
+
import imgRealworksApi from '../../assets/images/source/realworks_api.png'
|
|
8
|
+
import imgZapier from '../../assets/images/source/zapier.png'
|
|
9
|
+
|
|
10
|
+
export const SOURCE_MAP = {
|
|
11
|
+
realworks: 'Realworks',
|
|
12
|
+
realworks_agenda_api: 'Realworks Agenda API',
|
|
13
|
+
realworks_api: 'Realworks API',
|
|
14
|
+
kolibri: 'Kolibri',
|
|
15
|
+
kolibri_app_exchange: 'Kolibri App Exchange',
|
|
16
|
+
zapier: 'Zapier',
|
|
17
|
+
bricr: 'Bricr',
|
|
18
|
+
website: 'Website',
|
|
19
|
+
manual: 'Handmatig ingevoerd',
|
|
20
|
+
tracker: 'Tracker',
|
|
21
|
+
read_more: 'Lees Meer',
|
|
22
|
+
planner: 'Planner',
|
|
23
|
+
forms: 'Forms',
|
|
24
|
+
dossier_data: 'Dossier Data',
|
|
25
|
+
} as const
|
|
26
|
+
|
|
27
|
+
interface SourceImage {
|
|
28
|
+
url: string
|
|
29
|
+
height: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const SOURCE_IMAGES: Partial<Record<keyof typeof SOURCE_MAP, SourceImage>> = {
|
|
33
|
+
bricr: { url: imgBricr, height: 'h-5' },
|
|
34
|
+
kolibri: { url: imgKolibri, height: 'h-6' },
|
|
35
|
+
kolibri_app_exchange: { url: imgKolibriAppExchange, height: 'h-6' },
|
|
36
|
+
realworks: { url: imgRealworks, height: 'h-4' },
|
|
37
|
+
realworks_agenda_api: { url: imgRealworksAgendaApi, height: 'h-4' },
|
|
38
|
+
realworks_api: { url: imgRealworksApi, height: 'h-4' },
|
|
39
|
+
zapier: { url: imgZapier, height: 'h-5' },
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface SourceIcon {
|
|
43
|
+
icon: string
|
|
44
|
+
bg: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const SOUCE_ICONS: Partial<Record<keyof typeof SOURCE_MAP, SourceIcon>> = {
|
|
48
|
+
website: { icon: 'earth-europe', bg: 'bg-cornflower-blue-500' },
|
|
49
|
+
manual: { icon: 'money-check-pen', bg: 'bg-orange-500' },
|
|
50
|
+
tracker: { icon: 'eye', bg: 'bg-purple-500' },
|
|
51
|
+
read_more: { icon: 'file-export', bg: 'bg-rose-500' },
|
|
52
|
+
planner: { icon: 'calendar-days', bg: 'bg-rose-500' },
|
|
53
|
+
forms: { icon: 'square-list', bg: 'bg-cornflower-blue-500' },
|
|
54
|
+
dossier_data: { icon: 'file', bg: 'bg-orange-500' },
|
|
55
|
+
}
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
<script lang="ts" setup>
|
|
59
|
+
import { computed } from 'vue'
|
|
60
|
+
import NexxtIcon from '../Icon/Icon.vue'
|
|
61
|
+
|
|
62
|
+
export interface NexxtSourceProps {
|
|
63
|
+
source: keyof typeof SOURCE_MAP
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
defineOptions({ name: 'NexxtSource' })
|
|
67
|
+
|
|
68
|
+
const props = defineProps<NexxtSourceProps>()
|
|
69
|
+
|
|
70
|
+
const image = computed(() => SOURCE_IMAGES[props.source])
|
|
71
|
+
const label = computed(() => SOURCE_MAP[props.source])
|
|
72
|
+
const sourceIcon = computed(() => SOUCE_ICONS[props.source])
|
|
73
|
+
const icon = computed(() => sourceIcon.value?.icon as InstanceType<typeof NexxtIcon>['name'])
|
|
74
|
+
const iconBg = computed(() => sourceIcon.value?.bg)
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<template>
|
|
78
|
+
<div class="flex h-7 items-center gap-2.5">
|
|
79
|
+
<img v-if="image" :src="image.url" :alt="label" class="grow-0" :class="image.height" />
|
|
80
|
+
<template v-else>
|
|
81
|
+
<span
|
|
82
|
+
v-if="icon"
|
|
83
|
+
class="flex aspect-square grow-0 items-center justify-center rounded-full p-1 text-sm text-white"
|
|
84
|
+
:class="iconBg"
|
|
85
|
+
>
|
|
86
|
+
<NexxtIcon :name="icon" />
|
|
87
|
+
</span>
|
|
88
|
+
<span>{{ label }}</span>
|
|
89
|
+
</template>
|
|
90
|
+
</div>
|
|
91
|
+
</template>
|
|
@@ -30,9 +30,9 @@ const transitionProps = computed(() =>
|
|
|
30
30
|
enterActiveClass: 'transition-all duration-300 ease-in-out',
|
|
31
31
|
leaveActiveClass: 'transition-all duration-300 ease-in-out absolute inset-0',
|
|
32
32
|
enterFromClass:
|
|
33
|
-
direction.value === 'forward' ? 'translate-x-
|
|
33
|
+
direction.value === 'forward' ? '-translate-x-10 opacity-0' : 'translate-x-10 opacity-0',
|
|
34
34
|
leaveToClass:
|
|
35
|
-
direction.value === 'forward' ? '
|
|
35
|
+
direction.value === 'forward' ? 'translate-x-10 opacity-0' : '-translate-x-10 opacity-0',
|
|
36
36
|
}
|
|
37
37
|
: { mode: 'out-in' as const },
|
|
38
38
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts" setup>
|
|
2
|
-
import { ref, watch, onMounted } from 'vue'
|
|
2
|
+
import { ref, watch, onMounted, nextTick } from 'vue'
|
|
3
3
|
|
|
4
4
|
interface NexxtTabs {
|
|
5
5
|
tabs: string[]
|
|
@@ -14,19 +14,28 @@ const props = defineProps<NexxtTabs>()
|
|
|
14
14
|
|
|
15
15
|
const selected = defineModel({ type: String, default: '' })
|
|
16
16
|
|
|
17
|
+
const containerRef = ref<HTMLElement | null>(null)
|
|
17
18
|
const buttonRefs = ref<HTMLButtonElement[]>([])
|
|
18
19
|
const sliderStyle = ref({ width: '0px', transform: 'translateX(0px)' })
|
|
20
|
+
const clipPath = ref('inset(0 100% 0 0 round 9999px)')
|
|
21
|
+
const ready = ref(false)
|
|
19
22
|
|
|
20
|
-
const updateSlider = () => {
|
|
23
|
+
const updateSlider = async () => {
|
|
24
|
+
await nextTick()
|
|
21
25
|
const index = props.tabs.indexOf(selected.value)
|
|
22
26
|
const button = buttonRefs.value[index]
|
|
27
|
+
if (!button || !containerRef.value) return
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
const left = button.offsetLeft
|
|
30
|
+
const width = button.offsetWidth
|
|
31
|
+
const right = containerRef.value.offsetWidth - left - width
|
|
25
32
|
|
|
26
33
|
sliderStyle.value = {
|
|
27
|
-
width: `${
|
|
28
|
-
transform: `translateX(${
|
|
34
|
+
width: `${width}px`,
|
|
35
|
+
transform: `translateX(${left}px)`,
|
|
29
36
|
}
|
|
37
|
+
|
|
38
|
+
clipPath.value = `inset(0 ${right}px 0 ${left}px round 9999px)`
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
const onKeydown = (event: KeyboardEvent, index: number) => {
|
|
@@ -42,25 +51,32 @@ const onKeydown = (event: KeyboardEvent, index: number) => {
|
|
|
42
51
|
buttonRefs.value[next]?.focus()
|
|
43
52
|
}
|
|
44
53
|
|
|
45
|
-
watch(selected, () => updateSlider())
|
|
54
|
+
watch(selected, async () => await updateSlider())
|
|
46
55
|
|
|
47
56
|
onMounted(async () => {
|
|
48
57
|
await document.fonts.ready
|
|
49
|
-
updateSlider()
|
|
58
|
+
await updateSlider()
|
|
59
|
+
await nextTick()
|
|
60
|
+
ready.value = true
|
|
50
61
|
})
|
|
51
62
|
</script>
|
|
52
63
|
|
|
53
64
|
<template>
|
|
54
65
|
<div
|
|
66
|
+
ref="containerRef"
|
|
55
67
|
role="tablist"
|
|
56
68
|
:aria-label="tablistLabel"
|
|
57
|
-
class="relative flex rounded-full border-4 border-white bg-white"
|
|
69
|
+
class="relative isolate flex rounded-full border-4 border-white bg-white"
|
|
58
70
|
>
|
|
71
|
+
<!-- slider pill -->
|
|
59
72
|
<div
|
|
60
73
|
aria-hidden="true"
|
|
61
|
-
class="absolute h-9 rounded-full bg-cornflower-blue-500
|
|
74
|
+
class="absolute h-9 rounded-full bg-cornflower-blue-500"
|
|
75
|
+
:class="ready ? 'transition-all duration-500 ease-[cubic-bezier(0.34,1.2,0.64,1)]' : ''"
|
|
62
76
|
:style="sliderStyle"
|
|
63
77
|
/>
|
|
78
|
+
|
|
79
|
+
<!-- dark text buttons -->
|
|
64
80
|
<button
|
|
65
81
|
v-for="(tab, index) in tabs"
|
|
66
82
|
:key="tab"
|
|
@@ -68,12 +84,30 @@ onMounted(async () => {
|
|
|
68
84
|
role="tab"
|
|
69
85
|
:aria-selected="selected === tab"
|
|
70
86
|
:tabindex="selected === tab ? 0 : -1"
|
|
71
|
-
class="relative
|
|
72
|
-
:class="
|
|
87
|
+
class="relative h-9 cursor-pointer rounded-full px-4 text-sm text-gray-950 transition-none"
|
|
88
|
+
:class="selected === tab ? 'z-10' : 'z-30'"
|
|
73
89
|
@click="selected = tab"
|
|
74
90
|
@keydown="onKeydown($event, index)"
|
|
75
91
|
>
|
|
76
92
|
{{ tab }}
|
|
77
93
|
</button>
|
|
94
|
+
|
|
95
|
+
<!-- white text overlay, clipped to slider bounds -->
|
|
96
|
+
<div
|
|
97
|
+
aria-hidden="true"
|
|
98
|
+
class="pointer-events-none absolute inset-0 z-20 flex"
|
|
99
|
+
:class="
|
|
100
|
+
ready ? 'transition-[clip-path] duration-500 ease-[cubic-bezier(0.34,1.2,0.64,1)]' : ''
|
|
101
|
+
"
|
|
102
|
+
:style="{ clipPath }"
|
|
103
|
+
>
|
|
104
|
+
<span
|
|
105
|
+
v-for="tab in tabs"
|
|
106
|
+
:key="tab"
|
|
107
|
+
class="flex h-9 items-center rounded-full px-4 text-sm text-white"
|
|
108
|
+
>
|
|
109
|
+
{{ tab }}
|
|
110
|
+
</span>
|
|
111
|
+
</div>
|
|
78
112
|
</div>
|
|
79
113
|
</template>
|
package/src/components.json
CHANGED
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
"NexxtInputField": "components/InputField/InputField.vue",
|
|
16
16
|
"NexxtModal": "components/Modal/Modal.vue",
|
|
17
17
|
"NexxtPagination": "components/Pagination/Pagination.vue",
|
|
18
|
+
"NexxtPresenceIndicator": "components/PresenceIndicator/PresenceIndicator.vue",
|
|
18
19
|
"NexxtProgressBar": "components/ProgressBar/ProgressBar.vue",
|
|
19
20
|
"NexxtSocialIcons": "components/SocialIcons/SocialIcons.vue",
|
|
20
21
|
"NexxtSocialMediaCustomTemplate": "components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue",
|
|
21
22
|
"NexxtSocialMediaTemplate": "components/SocialMediaTemplate/SocialMediaTemplate.vue",
|
|
22
23
|
"NexxtSocialMediaType": "components/SocialMediaType/SocialMediaType.vue",
|
|
24
|
+
"NexxtSource": "components/Source/Source.vue",
|
|
23
25
|
"NexxtStepperHeader": "components/StepperHeader/StepperHeader.vue",
|
|
24
26
|
"NexxtTabbedContent": "components/TabbedContent/TabbedContent.vue",
|
|
25
27
|
"NexxtTable": "components/Table/Table.vue",
|
package/src/index.ts
CHANGED
|
@@ -15,11 +15,13 @@ export { default as NexxtInfoBlock } from './components/InfoBlock/InfoBlock.vue'
|
|
|
15
15
|
export { default as NexxtInputField } from './components/InputField/InputField.vue'
|
|
16
16
|
export { default as NexxtModal } from './components/Modal/Modal.vue'
|
|
17
17
|
export { default as NexxtPagination } from './components/Pagination/Pagination.vue'
|
|
18
|
+
export { default as NexxtPresenceIndicator } from './components/PresenceIndicator/PresenceIndicator.vue'
|
|
18
19
|
export { default as NexxtProgressBar } from './components/ProgressBar/ProgressBar.vue'
|
|
19
20
|
export { default as NexxtSocialIcons } from './components/SocialIcons/SocialIcons.vue'
|
|
20
21
|
export { default as NexxtSocialMediaCustomTemplate } from './components/SocialMediaCustomTemplate/SocialMediaCustomTemplate.vue'
|
|
21
22
|
export { default as NexxtSocialMediaTemplate } from './components/SocialMediaTemplate/SocialMediaTemplate.vue'
|
|
22
23
|
export { default as NexxtSocialMediaType } from './components/SocialMediaType/SocialMediaType.vue'
|
|
24
|
+
export { default as NexxtSource, SOURCE_MAP } from './components/Source/Source.vue'
|
|
23
25
|
export { default as NexxtStepperHeader } from './components/StepperHeader/StepperHeader.vue'
|
|
24
26
|
export { default as NexxtTabbedContent } from './components/TabbedContent/TabbedContent.vue'
|
|
25
27
|
export { default as NexxtTable } from './components/Table/Table.vue'
|