Skip to content
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
9b66e0f
chore: partial work for community voice ui
emlimlf Nov 18, 2025
4c2851d
chore: changed the config file
emlimlf Nov 18, 2025
98d673e
chore: fix lint errors
emlimlf Nov 18, 2025
ab7b535
chore: partial work for community voice ui
emlimlf Nov 18, 2025
afb375e
chore: changed the config file
emlimlf Nov 18, 2025
0f0f568
chore: fix lint errors
emlimlf Nov 18, 2025
b514322
Merge branch 'feat/community-voice-ui' of github.com:linuxfoundation/…
emlimlf Nov 19, 2025
64220c5
chore: added sample filter controls
emlimlf Nov 19, 2025
19f7cc8
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 19, 2025
0635570
fix: card header styling and added github card
emlimlf Nov 19, 2025
601abaf
chore: set filter values to data available in the project
emlimlf Nov 19, 2025
0ba22a6
fix: merge conflict and added pagination
emlimlf Nov 20, 2025
c223064
chore: hide filters on mobile view
emlimlf Nov 20, 2025
f6e1458
chore: implemented community filter modal for mobile
emlimlf Nov 20, 2025
f3ac6c8
feat: added filter count display
emlimlf Nov 20, 2025
6a19d1d
feat: card display mobile view
emlimlf Nov 20, 2025
1dd3a8f
fix: tablet to lg size responsive
emlimlf Nov 21, 2025
87cbb17
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 21, 2025
33bb116
chore: add no index meta seo
emlimlf Nov 21, 2025
f821e8d
fix: word break for xl screens
emlimlf Nov 21, 2025
6ab8514
fix: prettier issue
emlimlf Nov 21, 2025
3166b14
fix: card content display for html
emlimlf Nov 21, 2025
3649ec0
chore: add empty state
emlimlf Nov 21, 2025
6e3c1ab
fix: make whole card clickable
emlimlf Nov 21, 2025
40cef38
fix: pr comments
emlimlf Nov 21, 2025
ac10ae5
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 21, 2025
83a1eaa
chore: more UI fixes
emlimlf Nov 21, 2025
d1bb0d8
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 26, 2025
41db42b
chore: added check for user email
emlimlf Nov 26, 2025
ff29d86
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 26, 2025
9858b7a
chore: added powered by octolens text
emlimlf Nov 26, 2025
714bff8
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 27, 2025
9ddf042
chore: make the sentiment line responsive based on the content
emlimlf Nov 27, 2025
a9ddfff
Merge branch 'main' into feat/community-voice-ui
emlimlf Nov 27, 2025
6bcf88c
feat: protect endpoint
gaspergrom Nov 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<!--
Copyright (c) 2025 The Linux Foundation and each contributor.
SPDX-License-Identifier: MIT
-->
<!-- Copyright (c) 2025 The Linux Foundation and each contributor. -->
<!-- SPDX-License-Identifier: MIT -->
<template>
<nuxt-link
:to="mention.url"
target="_blank"
rel="noopener noreferrer"
>
<lfx-card
class="border border-neutral-100 rounded-xl overflow-hidden cursor-pointer hover:shadow-lg transition-shadow duration-300"
>
<div class="flex flex-col md:gap-5 gap-3">
<slot>
<!-- Header Section -->
<lfx-community-card-header :mention="mention" />

<!-- Content Section -->
<lfx-community-card-content :mention="mention" />

<!-- Relevance Comment Section -->
<lfx-community-card-footer :mention="mention" />
</slot>
</div>
</lfx-card>
</nuxt-link>
</template>

<script setup lang="ts">
// Default card display component for community mentions
import LfxCommunityCardHeader from '../fragments/card-header.vue';
import LfxCommunityCardContent from '../fragments/card-content.vue';
import LfxCommunityCardFooter from '../fragments/card-footer.vue';
import type { CommunityMentions } from '~~/types/community/community';
import LfxCard from '~/components/uikit/card/card.vue';

defineProps<{
mention: CommunityMentions;
}>();
</script>

<script lang="ts">
export default {
name: 'LfxCommunityDefaultCard',
};
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<!--
Copyright (c) 2025 The Linux Foundation and each contributor.
SPDX-License-Identifier: MIT
-->
<!-- Copyright (c) 2025 The Linux Foundation and each contributor. -->
<!-- SPDX-License-Identifier: MIT -->
<template>
<lfx-community-default-card :mention="mention">
<div class="flex flex-col gap-5">
<!-- Header Section -->
<lfx-community-card-header :mention="mention">
<template #source-display>
<a
v-if="mention.url"
:href="mention.url"
class="text-xs font-medium text-black hover:underline decoration-dashed"
target="_blank"
rel="noopener noreferrer"
>
{{ githubRepoName }}
</a>
<span
v-else
class="text-xs font-medium text-black"
>
{{ githubRepoName }}
</span>
</template>
</lfx-community-card-header>

<!-- Content Section -->
<lfx-community-card-content :mention="mention" />

<!-- Relevance Comment Section -->
<lfx-community-card-footer :mention="mention" />
</div>
</lfx-community-default-card>
</template>

<script setup lang="ts">
// Default card display component for community mentions
import { computed } from 'vue';
import LfxCommunityCardHeader from '../fragments/card-header.vue';
import LfxCommunityCardContent from '../fragments/card-content.vue';
import LfxCommunityCardFooter from '../fragments/card-footer.vue';
import LfxCommunityDefaultCard from './default-card.vue';
import type { CommunityMentions } from '~~/types/community/community';

const props = defineProps<{
mention: CommunityMentions;
}>();

const githubRepoName = computed(() => {
if (!props.mention.url) {
return 'Github';
}
// Attempt to match GitHub repo URLs, extracting "owner/repo"
// e.g., "https://github.com/org/repo/issues/123..." => "org/repo"
const githubUrlRegex = /^https?:\/\/github\.com\/([^\/]+\/[^\/]+)/i;
const match = props.mention.url.match(githubUrlRegex);
return match ? match[1] : props.mention.url;
});
</script>

<script lang="ts">
export default {
name: 'LfxCommunityGithubCard',
};
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<!--
Copyright (c) 2025 The Linux Foundation and each contributor.
SPDX-License-Identifier: MIT
-->
<!-- Copyright (c) 2025 The Linux Foundation and each contributor. -->
<!-- SPDX-License-Identifier: MIT -->
<template>
<lfx-community-default-card :mention="mention">
<div class="flex flex-col gap-5">
<!-- Header Section -->
<lfx-community-card-header :mention="mention">
<template #source-display>
<a
v-if="mention.url"
:href="mention.url"
class="text-xs font-medium text-black hover:underline decoration-dashed"
target="_blank"
rel="noopener noreferrer"
>
{{ mention.subreddit }}
</a>
<span
v-else
class="text-xs font-medium text-black"
>
{{ mention.subreddit }}
</span>
</template>
</lfx-community-card-header>

<!-- Content Section -->
<lfx-community-card-content :mention="mention" />

<!-- Relevance Comment Section -->
<lfx-community-card-footer :mention="mention" />
</div>
</lfx-community-default-card>
</template>

<script setup lang="ts">
// Default card display component for community mentions
import LfxCommunityCardHeader from '../fragments/card-header.vue';
import LfxCommunityCardContent from '../fragments/card-content.vue';
import LfxCommunityCardFooter from '../fragments/card-footer.vue';
import LfxCommunityDefaultCard from './default-card.vue';
import type { CommunityMentions } from '~~/types/community/community';

defineProps<{
mention: CommunityMentions;
}>();
</script>

<script lang="ts">
export default {
name: 'LfxCommunityRedditCard',
};
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const blueskyConfig: CommunityConfig = {
key: 'bluesky',
label: 'Bluesky',
image: '/images/platforms/bluesky.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const devtoConfig: CommunityConfig = {
key: 'devto',
label: 'Dev.to',
image: '/images/platforms/devto.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import GithubCard from '../card-displays/github-card.vue';
import type { CommunityConfig } from './types/community.types';

export const githubConfig: CommunityConfig = {
key: 'github',
label: 'GitHub',
image: '/images/platforms/github.png',
dataDisplay: GithubCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const hackernewsConfig: CommunityConfig = {
key: 'hackernews',
label: 'Hacker News',
image: '/images/platforms/hackernews.svg',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import type { CommunityConfig } from './types/community.types';
import { blueskyConfig } from './bluesky.config';
import { devtoConfig } from './devto.config';
import { githubConfig } from './github.config';
import { hackernewsConfig } from './hackernews.config';
import { linkedinConfig } from './linkedin.config';
import { newsletterConfig } from './newsletter.config';
import { podcastConfig } from './podcast.config';
import { redditConfig } from './reddit.config';
import { stackoverflowConfig } from './stackoverflow.config';
import { xConfig } from './x.config';
import { youtubeConfig } from './youtube.config';

export const communityConfigs: Record<string, CommunityConfig> = {
bluesky: blueskyConfig,
devto: devtoConfig,
github: githubConfig,
hackernews: hackernewsConfig,
linkedin: linkedinConfig,
newsletter: newsletterConfig,
podcasts: podcastConfig,
reddit: redditConfig,
stackoverflow: stackoverflowConfig,
twitter: xConfig,
youtube: youtubeConfig,
};

export default communityConfigs;
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const linkedinConfig: CommunityConfig = {
key: 'linkedin',
label: 'LinkedIn',
image: '/images/platforms/linkedin.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const newsletterConfig: CommunityConfig = {
key: 'newsletter',
label: 'Newsletter',
image: '/images/platforms/newsletter.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const podcastConfig: CommunityConfig = {
key: 'podcasts',
label: 'Podcasts',
image: '/images/platforms/podcast.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import RedditCard from '../card-displays/reddit-card.vue';
import type { CommunityConfig } from './types/community.types';

export const redditConfig: CommunityConfig = {
key: 'reddit',
label: 'Reddit',
image: '/images/platforms/reddit.svg',
dataDisplay: RedditCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const stackoverflowConfig: CommunityConfig = {
key: 'stackoverflow',
label: 'Stack Overflow',
image: '/images/platforms/stackoverflow.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT
import type { Component } from 'vue';
export interface CommunityConfig {
key: string;
label: string;
image: string;
dataDisplay: Component;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const xConfig: CommunityConfig = {
key: 'twitter',
label: 'X/Twitter',
image: '/images/platforms/x.png',
dataDisplay: DefaultCard,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Copyright (c) 2025 The Linux Foundation and each contributor.
// SPDX-License-Identifier: MIT

import DefaultCard from '../card-displays/default-card.vue';
import type { CommunityConfig } from './types/community.types';

export const youtubeConfig: CommunityConfig = {
key: 'youtube',
label: 'YouTube',
image: '/images/platforms/youtube.png',
dataDisplay: DefaultCard,
};
Loading