mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-31 05:24:13 +00:00 
			
		
		
		
	remove idea section
				
					
				
			This commit is contained in:
		
							parent
							
								
									1c181df086
								
							
						
					
					
						commit
						a15e5c52f4
					
				
					 3 changed files with 0 additions and 281 deletions
				
			
		|  | @ -1,88 +0,0 @@ | ||||||
| <!-- |  | ||||||
| SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors |  | ||||||
| SPDX-License-Identifier: AGPL-3.0-only |  | ||||||
| --> |  | ||||||
| 
 |  | ||||||
| <!-- |  | ||||||
| 	Important note: this is a generic component. |  | ||||||
| 	Some operations require Vue helpers to satisfy typescript. |  | ||||||
| 	See this page for more information: https://vuejs.org/api/sfc-script-setup.html#generics |  | ||||||
| --> |  | ||||||
| 
 |  | ||||||
| <template> |  | ||||||
| <MkPagination ref="mkPagination" :pagination="pagination" :disableAutoload="disableAutoLoad" :displayLimit="computedDisplayLimit"> |  | ||||||
| 	<template #empty> |  | ||||||
| 		<slot name="empty"> |  | ||||||
| 			<div class="_fullinfo"> |  | ||||||
| 				<img :src="noContentImage ?? infoImageUrl" class="_ghost" :alt="noContentText" aria-hidden="true"/> |  | ||||||
| 				<div>{{ noContentText }}</div> |  | ||||||
| 			</div> |  | ||||||
| 		</slot> |  | ||||||
| 	</template> |  | ||||||
| 
 |  | ||||||
| 	<template #default="{ items }"> |  | ||||||
| 		<slot :items="items as Response"></slot> |  | ||||||
| 	</template> |  | ||||||
| </MkPagination> |  | ||||||
| </template> |  | ||||||
| 
 |  | ||||||
| <script lang="ts"> |  | ||||||
| export type { Paging } from '@/components/MkPagination.vue'; |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <script setup lang="ts" generic="Endpoint extends keyof Endpoints"> |  | ||||||
| import { computed, shallowRef } from 'vue'; |  | ||||||
| import type { Endpoints } from 'misskey-js'; |  | ||||||
| import type { SwitchCaseResponseType } from 'misskey-js/built/api.types.js'; |  | ||||||
| import type { ComponentExposed } from 'vue-component-type-helpers'; |  | ||||||
| import { infoImageUrl } from '@/instance.js'; |  | ||||||
| import { i18n } from '@/i18n.js'; |  | ||||||
| import MkPagination, { Paging } from '@/components/MkPagination.vue'; |  | ||||||
| import { MisskeyEntity } from '@/types/date-separated-list.js'; |  | ||||||
| 
 |  | ||||||
| type Response = SwitchCaseResponseType<Endpoint, Endpoints[Endpoint]['req']> & MisskeyEntity[]; |  | ||||||
| type Entity = Response[number]; |  | ||||||
| 
 |  | ||||||
| const mkPagination = shallowRef<InstanceType<typeof MkPagination>>(); |  | ||||||
| 
 |  | ||||||
| const props = withDefaults(defineProps<{ |  | ||||||
| 	pagination: Paging<Endpoint>; |  | ||||||
| 	disableAutoLoad?: boolean; |  | ||||||
| 	displayLimit?: number | null; |  | ||||||
| 	noContentText?: string; |  | ||||||
| 	noContentImage?: string; |  | ||||||
| }>(), { |  | ||||||
| 	disableAutoLoad: false, |  | ||||||
| 	displayLimit: undefined, |  | ||||||
| 	noContentText: i18n.ts.noNotes, |  | ||||||
| 	noContentImage: undefined, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| // Value of displayLimit with default value applied. |  | ||||||
| const computedDisplayLimit = computed(() => { |  | ||||||
| 	// undefined (default) means to use the value from paging. |  | ||||||
| 	if (props.displayLimit === undefined) { |  | ||||||
| 		return props.pagination.limit; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// number means to use that value. |  | ||||||
| 	// null means to use the default from MkPagination. |  | ||||||
| 	return props.displayLimit ?? undefined; |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| /* eslint-disable @typescript-eslint/no-non-null-assertion */ |  | ||||||
| defineExpose({ |  | ||||||
| 	// Expose all the same properties... |  | ||||||
| 	...mkPagination.value!, |  | ||||||
| 
 |  | ||||||
| 	// But override these to have a narrower type. |  | ||||||
| 	items: mkPagination.value!.items as Map<string, Entity> | undefined, |  | ||||||
| 	queue: mkPagination.value!.queue as Map<string, Entity> | undefined, |  | ||||||
| 	prepend: (item: Entity) => mkPagination.value!.prepend(item), |  | ||||||
| 	append: (item: Entity) => mkPagination.value!.append(item), |  | ||||||
| 	updateItem: (id: Entity['id'], replacer: (old: Entity) => Entity) => { |  | ||||||
| 		return mkPagination.value!.updateItem(id, old => replacer(old as Entity)); |  | ||||||
| 	}, |  | ||||||
| }); |  | ||||||
| /* eslint-enable @typescript-eslint/no-non-null-assertion */ |  | ||||||
| </script> |  | ||||||
|  | @ -1,84 +0,0 @@ | ||||||
| <!-- |  | ||||||
| SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors |  | ||||||
| SPDX-License-Identifier: AGPL-3.0-only |  | ||||||
| --> |  | ||||||
| 
 |  | ||||||
| <template> |  | ||||||
| <div :class="$style.tabstrip"> |  | ||||||
| 	<button |  | ||||||
| 		v-for="tab of tabs" |  | ||||||
| 		:key="tab.key" |  | ||||||
| 		:disabled="modelValue === tab.key" |  | ||||||
| 		:class="{ [$style.button]: true, [$style.active]: modelValue === tab.key }" |  | ||||||
| 		class="_button" |  | ||||||
| 		click-anime |  | ||||||
| 		@click="emit('update:modelValue', tab.key)" |  | ||||||
| 	> |  | ||||||
| 		{{ tab.label ?? tab.key }} |  | ||||||
| 	</button> |  | ||||||
| </div> |  | ||||||
| </template> |  | ||||||
| 
 |  | ||||||
| <script lang="ts"> |  | ||||||
| export interface Tab { |  | ||||||
| 	key: string; |  | ||||||
| 	label?: string; |  | ||||||
| } |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <script setup lang="ts"> |  | ||||||
| defineProps<{ |  | ||||||
| 		modelValue: string; |  | ||||||
| 		tabs: Tab[]; |  | ||||||
| 	}>(); |  | ||||||
| const emit = defineEmits<{ |  | ||||||
| 		(ev: 'update:modelValue', v: string): void; |  | ||||||
| 	}>(); |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <style module lang="scss"> |  | ||||||
| .tabstrip { |  | ||||||
| 	display: flex; |  | ||||||
| 	font-size: 90%; |  | ||||||
| 
 |  | ||||||
| 	padding: calc(var(--margin) / 2) 0; |  | ||||||
| 	background: color-mix(in srgb, var(--bg) 65%, transparent); |  | ||||||
| 	backdrop-filter: var(--blur, blur(15px)); |  | ||||||
| 	border-radius: var(--radius-sm); |  | ||||||
| 
 |  | ||||||
| 	> * { |  | ||||||
| 		flex: 1; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .button { |  | ||||||
| 	padding: 10px 8px; |  | ||||||
| 	margin-left: 0.4rem; |  | ||||||
| 	margin-right: 0.4rem; |  | ||||||
| 	border-radius: var(--radius-sm); |  | ||||||
| 
 |  | ||||||
| 	&:disabled { |  | ||||||
| 		cursor: default; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	&.active { |  | ||||||
| 		color: var(--accent); |  | ||||||
| 		background: var(--accentedBg); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	&:not(.active):hover { |  | ||||||
| 		color: var(--fgHighlighted); |  | ||||||
| 		background: var(--panelHighlight); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	&:not(:first-child) { |  | ||||||
| 		margin-left: 8px; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @container (max-width: 500px) { |  | ||||||
| 	.tabstrip { |  | ||||||
| 		font-size: 80%; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| </style> |  | ||||||
|  | @ -1,109 +0,0 @@ | ||||||
| <!-- |  | ||||||
| SPDX-FileCopyrightText: syuilo and misskey-project |  | ||||||
| SPDX-License-Identifier: AGPL-3.0-only |  | ||||||
| --> |  | ||||||
| 
 |  | ||||||
| <template> |  | ||||||
| <MkStickyContainer> |  | ||||||
| 	<template #header> |  | ||||||
| 		<SkTab v-model="tab" :tabs="tabs"/> |  | ||||||
| 	</template> |  | ||||||
| 	<MkLazy> |  | ||||||
| 		<div v-if="tab === 'pinned'" class="_gaps"> |  | ||||||
| 			<div v-if="user.pinnedNotes.length < 1" class="_fullinfo"> |  | ||||||
| 				<img :src="infoImageUrl" class="_ghost" aria-hidden="true" :alt="i18n.ts.noNotes"/> |  | ||||||
| 				<div>{{ i18n.ts.noNotes }}</div> |  | ||||||
| 			</div> |  | ||||||
| 			<div v-else class="_panel"> |  | ||||||
| 				<MkNote v-for="note of user.pinnedNotes" :key="note.id" class="note" :class="$style.pinnedNote" :note="note" :pinned="true"/> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 		<MkNotes v-else :class="$style.tl" :noGap="true" :pagination="pagination"/> |  | ||||||
| 	</MkLazy> |  | ||||||
| </MkStickyContainer> |  | ||||||
| </template> |  | ||||||
| 
 |  | ||||||
| <script setup lang="ts"> |  | ||||||
| import { ref, computed, defineAsyncComponent } from 'vue'; |  | ||||||
| import * as Misskey from 'misskey-js'; |  | ||||||
| import MkNotes from '@/components/MkNotes.vue'; |  | ||||||
| import SkTab from '@/components/SkTab.vue'; |  | ||||||
| import { i18n } from '@/i18n.js'; |  | ||||||
| import { infoImageUrl } from '@/instance.js'; |  | ||||||
| import { Paging } from '@/components/MkPagination.vue'; |  | ||||||
| import { Tab } from '@/components/SkTab.vue'; |  | ||||||
| import { defaultStore } from '@/store.js'; |  | ||||||
| 
 |  | ||||||
| const MkNote = defineAsyncComponent(() => defaultStore.state.noteDesign === 'sharkey' ? import('@/components/SkNote.vue') : import('@/components/MkNote.vue')); |  | ||||||
| 
 |  | ||||||
| const props = withDefaults(defineProps<{ |  | ||||||
| 	user: Misskey.entities.UserDetailed; |  | ||||||
| 	includeFeatured: boolean; |  | ||||||
| 	includePinned: boolean; |  | ||||||
| }>(), { |  | ||||||
| 	includeFeatured: true, |  | ||||||
| 	includePinned: true, |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const tab = ref<string | null>('notes'); |  | ||||||
| 
 |  | ||||||
| const tabs = computed(() => { |  | ||||||
| 	const t: Tab[] = [ |  | ||||||
| 		{ key: 'notes', label: i18n.ts.notes }, |  | ||||||
| 		{ key: 'all', label: i18n.ts.all }, |  | ||||||
| 		{ key: 'files', label: i18n.ts.withFiles }, |  | ||||||
| 	]; |  | ||||||
| 
 |  | ||||||
| 	if (props.includeFeatured) { |  | ||||||
| 		t.unshift({ |  | ||||||
| 			key: 'featured', |  | ||||||
| 			label: i18n.ts.featured, |  | ||||||
| 		}); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (props.includePinned) { |  | ||||||
| 		t.unshift({ |  | ||||||
| 			key: 'pinned', |  | ||||||
| 			label: i18n.ts.pinnedOnly, |  | ||||||
| 		}); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return t; |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const pagination = computed(() => { |  | ||||||
| 	if (tab.value === 'featured') { |  | ||||||
| 		return { |  | ||||||
| 			endpoint: 'users/featured-notes' as const, |  | ||||||
| 			limit: 10, |  | ||||||
| 			params: { |  | ||||||
| 				userId: props.user.id, |  | ||||||
| 			}, |  | ||||||
| 		} satisfies Paging<'users/featured-notes'>; |  | ||||||
| 	} else { |  | ||||||
| 		return { |  | ||||||
| 			endpoint: 'users/notes' as const, |  | ||||||
| 			limit: 10, |  | ||||||
| 			params: { |  | ||||||
| 				userId: props.user.id, |  | ||||||
| 				withRenotes: tab.value === 'all', |  | ||||||
| 				withReplies: tab.value === 'all', |  | ||||||
| 				withChannelNotes: tab.value === 'all', |  | ||||||
| 				withFiles: tab.value === 'files', |  | ||||||
| 			}, |  | ||||||
| 		} satisfies Paging<'users/notes'>; |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
| </script> |  | ||||||
| 
 |  | ||||||
| <style module lang="scss"> |  | ||||||
| .tl { |  | ||||||
| 	background: var(--bg); |  | ||||||
| 	border-radius: var(--radius); |  | ||||||
| 	overflow: clip; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .pinnedNote:not(:last-child) { |  | ||||||
| 	border-bottom: solid 0.5px var(--divider); |  | ||||||
| } |  | ||||||
| </style> |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue