Type:{" "}
@@ -91,7 +93,7 @@ export function SourceCard(props: SourceCardProps) {
const sourceLink = () => {
if (props.href) {
return (
-
+
{content()}
);
@@ -99,7 +101,7 @@ export function SourceCard(props: SourceCardProps) {
if (!props.mediaSource.id) {
return (
-
+
{content()}
);
@@ -107,7 +109,7 @@ export function SourceCard(props: SourceCardProps) {
return (
@@ -117,40 +119,45 @@ export function SourceCard(props: SourceCardProps) {
};
return (
-
+
{sourceLink()}
-
- {props.onSync && (
-
- )}
- {props.onEdit && (
-
- )}
- {props.onDelete && (
-
- )}
-
+ {(props.onSync || props.onEdit || props.onDelete) && (
+
+ {props.onSync && (
+
+ )}
+ {props.onEdit && (
+
+ )}
+ {props.onDelete && (
+
+ )}
+
+ )}
);
}
diff --git a/packages/ui/src/source-media-grid.tsx b/packages/ui/src/source-media-grid.tsx
index 3e571b63..774797ed 100644
--- a/packages/ui/src/source-media-grid.tsx
+++ b/packages/ui/src/source-media-grid.tsx
@@ -24,7 +24,7 @@ import type { QueryUiState } from "./query-state";
import { LoadingRegion, MediaGridSkeleton } from "./skeleton";
const VIRTUALIZATION_THRESHOLD = 100;
-const GRID_GAP_PX = 16;
+const GRID_GAP_PX = 12;
const GRID_ITEM_ASPECT_RATIO = 4 / 3;
const VIRTUAL_ROWS_OVERSCAN = 4;
@@ -93,9 +93,9 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
let mediaGridRef: HTMLDivElement | undefined;
const columnCount = createMemo(() => {
- const width = windowWidth();
- if (width >= 1024) return 5;
- if (width >= 768) return 3;
+ const width = mediaGridWidth() || windowWidth();
+ if (width >= 1100) return 5;
+ if (width >= 640) return 3;
return 2;
});
@@ -202,7 +202,7 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
const gridContent = (
{
mediaGridRef = element;
requestAnimationFrame(() => {
@@ -217,7 +217,12 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
>
+
{(media) =>
props.renderItem(media, {
@@ -240,7 +245,7 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
const rowMedia = () => mediaRows()[virtualRow.index] || [];
return (
+
@@ -297,7 +302,7 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
>
{/* Result count */}
0}>
-
+
@@ -305,7 +310,7 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
{/* Grid with optional context menu */}
-
+
{gridContent}
@@ -426,13 +431,21 @@ export function SourceMediaGrid(props: SourceMediaGridProps) {
{/* Load more sentinel */}
-
-
- 読み込み中...
-
+
+ スクロールしてさらに読み込む
+
+ }
+ when={props.isFetchingNextPage}
+ >
+ 読み込み中...
diff --git a/packages/ui/src/source-media-page.tsx b/packages/ui/src/source-media-page.tsx
index 348af6e9..fbd28f14 100644
--- a/packages/ui/src/source-media-page.tsx
+++ b/packages/ui/src/source-media-page.tsx
@@ -58,6 +58,7 @@ export type SourceMediaPageProps = {
onBulkAction?: () => void;
onClearSelection?: () => void;
selectedCount?: () => number;
+ onEnterBulkSelectMode?: () => void;
};
export function SourceMediaPage(props: SourceMediaPageProps): JSX.Element {
@@ -119,13 +120,11 @@ export function SourceMediaPage(props: SourceMediaPageProps): JSX.Element {
isSearchStateRestored,
});
- const renderActions: SourceMediaScreenProps["renderActions"] = () => (
+ const renderActions: SourceMediaScreenProps["renderActions"] = (actions) => (
);
@@ -153,6 +152,7 @@ export function SourceMediaPage(props: SourceMediaPageProps): JSX.Element {
onBulkAction={props.onBulkAction}
onClearSelection={props.onClearSelection}
selectedCount={props.selectedCount}
+ onEnterBulkSelectMode={props.onEnterBulkSelectMode}
/>
);
}