diff --git a/src/main.ts b/src/main.ts
index d3428ca..47c7f89 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -38,6 +38,7 @@ export { default as NeHeading } from './components/NeHeading.vue'
export { default as NeListbox } from './components/NeListbox.vue'
export { default as NeDropdownFilter } from './components/NeDropdownFilter.vue'
export { default as NeSortDropdown } from './components/NeSortDropdown.vue'
+export { default as NeAvatar } from './components/NeAvatar.vue'
// types export
export type { NeComboboxOption } from './components/NeCombobox.vue'
@@ -49,6 +50,7 @@ export type { FilterOption, FilterKind } from './components/NeDropdownFilter.vue
export type { RadioOption } from './components/NeRadioSelection.vue'
export type { SortEvent } from './components/NeTableHeadCell.vue'
export type { ModalKind, PrimaryButtonKind, ModalSize } from './components/NeModal.vue'
+export type { AvatarSize } from './components/NeAvatar.vue'
// library functions export
export {
diff --git a/stories/NeAvatar.stories.ts b/stories/NeAvatar.stories.ts
new file mode 100644
index 0000000..9a4917f
--- /dev/null
+++ b/stories/NeAvatar.stories.ts
@@ -0,0 +1,92 @@
+// Copyright (C) 2025 Nethesis S.r.l.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import type { Meta, StoryObj } from '@storybook/vue3-vite'
+import { NeAvatar } from '../src/main'
+import AvatarImage from '../src/assets/avatar.png'
+import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
+import { faUserSecret } from '@fortawesome/free-solid-svg-icons'
+
+const meta = {
+ title: 'NeAvatar',
+ component: NeAvatar,
+ tags: ['autodocs'],
+ argTypes: {
+ size: { control: 'inline-radio', options: ['xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl', '4xl'] }
+ },
+ args: {
+ size: 'md',
+ img: '',
+ initials: '',
+ squared: false,
+ alt: 'Avatar'
+ } // default values
+} satisfies Meta
+
+export default meta
+type Story = StoryObj
+
+const defaultTemplate = ``
+
+export const Default: Story = {
+ render: (args) => ({
+ components: { NeAvatar },
+ setup() {
+ return { args }
+ },
+ template: defaultTemplate
+ }),
+ args: {}
+}
+
+export const Squared: Story = {
+ render: (args) => ({
+ components: { NeAvatar },
+ setup() {
+ return { args }
+ },
+ template: defaultTemplate
+ }),
+ args: { squared: true }
+}
+
+export const Image: Story = {
+ render: (args) => ({
+ components: { NeAvatar },
+ setup() {
+ return { args }
+ },
+ template: defaultTemplate
+ }),
+ args: { img: AvatarImage, alt: 'User avatar' }
+}
+
+export const Initials: Story = {
+ render: (args) => ({
+ components: { NeAvatar },
+ setup() {
+ return { args }
+ },
+ template: defaultTemplate
+ }),
+ args: { initials: 'JD' }
+}
+
+const placeholderSlotTemplate = `
+
+
+
+
+
+`
+
+export const PlaceholderSlot: Story = {
+ render: (args) => ({
+ components: { NeAvatar, FontAwesomeIcon },
+ setup() {
+ return { args, faUserSecret }
+ },
+ template: placeholderSlotTemplate
+ }),
+ args: {}
+}
diff --git a/stories/NeCard.stories.ts b/stories/NeCard.stories.ts
index e7923d2..bf6b371 100644
--- a/stories/NeCard.stories.ts
+++ b/stories/NeCard.stories.ts
@@ -220,3 +220,17 @@ export const AlternateBackground: Story = {
alternateBackground: true
}
}
+
+const withoutTitleTemplate =
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
+
+export const WithoutTitle: Story = {
+ render: (args) => ({
+ components: { NeCard },
+ setup() {
+ return { args }
+ },
+ template: withoutTitleTemplate
+ }),
+ args: { title: '' }
+}
diff --git a/stories/NeDropdown.stories.ts b/stories/NeDropdown.stories.ts
index 9b3f07e..9630c95 100644
--- a/stories/NeDropdown.stories.ts
+++ b/stories/NeDropdown.stories.ts
@@ -82,7 +82,7 @@ export const AlignToRight: Story = {
args: { alignToRight: true }
}
-const withSlotTemplate =
+const buttonSlotTemplate =
'\
\
\
@@ -94,13 +94,13 @@ const withSlotTemplate =
\
'
-export const WithSlot: Story = {
+export const ButtonSlot: Story = {
render: (args) => ({
components: { NeDropdown, NeButton, FontAwesomeIcon },
setup() {
return { args, faChevronDown }
},
- template: withSlotTemplate
+ template: buttonSlotTemplate
}),
args: {}
}
@@ -117,3 +117,29 @@ export const MenuClasses: Story = {
menuClasses: 'bg-fuchsia-200! dark:bg-fuchsia-900!'
}
}
+
+const menuHeaderSlotTemplate = `
+
+
+
+ Adam Reynolds
+
+
+ adamreynolds@example.com
+
+
+
+
+`
+
+export const MenuHeaderSlot: Story = {
+ render: (args) => ({
+ components: { NeDropdown },
+ setup() {
+ return { args }
+ },
+ template: menuHeaderSlotTemplate
+ }),
+ args: {}
+}