feat: implement responsive column-based styling for all thumbnail cards #9

Merged
pkartch merged 11 commits from feature/cookbook-pagination into main 2026-01-20 04:05:03 +00:00
7 changed files with 341 additions and 84 deletions
Showing only changes of commit 0e611c379e - Show all commits

View File

@@ -324,3 +324,100 @@ The current version is displayed in:
- API: `GET /api/version` endpoint returns `{ version: '2026.01.002' }` - API: `GET /api/version` endpoint returns `{ version: '2026.01.002' }`
- Web: Footer or about section shows current version - Web: Footer or about section shows current version
- Both packages export `APP_VERSION` constant for internal use - Both packages export `APP_VERSION` constant for internal use
## UI Design System - Thumbnail Cards
### Responsive Column Layout System
All recipe and cookbook thumbnail displays support a responsive column system (3, 5, 7, or 9 columns) with column-specific styling for optimal readability at different densities.
**Column-Responsive Font Sizes:**
- **Column 3** (Largest cards): Title 0.95rem, Description 0.8rem (2 lines), Meta 0.75rem
- **Column 5** (Medium cards): Title 0.85rem, Description 0.75rem (2 lines), Meta 0.7rem
- **Column 7** (Compact): Title 0.75rem, Description hidden, Meta 0.6rem
- **Column 9** (Most compact): Title 0.75rem, Description hidden, Meta 0.6rem
**Implementation Pattern:**
1. Add `gridClassName = \`recipes-grid columns-${columnCount}\`` or `\`cookbooks-grid columns-${columnCount}\``
2. Apply className to grid container: `<div className={gridClassName} style={gridStyle}>`
3. Use column-specific CSS selectors: `.columns-3 .recipe-info h3 { font-size: 0.95rem; }`
### Recipe Thumbnail Display Locations
All locations use square aspect ratio (1:1) cards with 60% image height.
1. **Recipe List Page** (`packages/web/src/pages/RecipeList.tsx`)
- Class: `recipe-grid-enhanced columns-{3|5|7|9}`
- CSS: `packages/web/src/styles/RecipeList.css`
- Features: Main recipe browsing with pagination, search, filtering
- Displays: Image, title, description, time, rating
- Status: ✅ Responsive column styling applied
2. **Cookbooks Page - Recent Recipes** (`packages/web/src/pages/Cookbooks.tsx`)
- Class: `recipes-grid columns-{3|5|7|9}`
- CSS: `packages/web/src/styles/Cookbooks.css`
- Features: Shows 6 most recent recipes below cookbook list
- Displays: Image, title, description, time, rating
- Status: ✅ Responsive column styling applied
3. **Cookbook Detail - Recipes Section** (`packages/web/src/pages/CookbookDetail.tsx`)
- Class: `recipes-grid columns-{3|5|7|9}`
- CSS: `packages/web/src/styles/CookbookDetail.css`
- Features: Paginated recipes within a cookbook, with remove button
- Displays: Image, title, description, time, rating, remove button
- Status: ✅ Responsive column styling applied
4. **Add Meal Modal - Recipe Selection** (`packages/web/src/components/meal-planner/AddMealModal.tsx`)
- Class: `recipe-list` with `recipe-item`
- CSS: `packages/web/src/styles/AddMealModal.css`
- Features: Selectable recipe list for adding to meal plan
- Displays: Small thumbnail, title, description
- Status: ⚠️ Needs responsive column styling review
5. **Meal Card Component** (`packages/web/src/components/meal-planner/MealCard.tsx`)
- Class: `meal-card` with `meal-card-image`
- CSS: `packages/web/src/styles/MealCard.css`
- Features: Recipe thumbnail in meal planner (compact & full views)
- Displays: Recipe image as part of meal display
- Status: ⚠️ Different use case - calendar/list view, not grid-based
### Cookbook Thumbnail Display Locations
All locations use square aspect ratio (1:1) cards with 50% image height.
1. **Cookbooks Page - Main Grid** (`packages/web/src/pages/Cookbooks.tsx`)
- Class: `cookbooks-grid`
- CSS: `packages/web/src/styles/Cookbooks.css`
- Features: Main cookbook browsing with pagination
- Displays: Cover image, name, recipe count, cookbook count
- Status: ✅ Already has compact styling (description/tags hidden)
- Note: Could benefit from column-responsive font sizes
2. **Cookbook Detail - Nested Cookbooks** (`packages/web/src/pages/CookbookDetail.tsx`)
- Class: `cookbooks-grid` with `cookbook-card nested`
- CSS: `packages/web/src/styles/CookbookDetail.css`
- Features: Child cookbooks within parent cookbook
- Displays: Cover image, name, recipe count, cookbook count
- Status: ✅ Already has compact styling (description/tags hidden)
- Note: Could benefit from column-responsive font sizes
### Key CSS Classes
- `recipe-card` - Individual recipe card
- `recipe-grid-enhanced` or `recipes-grid` - Recipe grid container
- `cookbook-card` - Individual cookbook card
- `cookbooks-grid` - Cookbook grid container
- `columns-{3|5|7|9}` - Dynamic column count modifier class
### Styling Consistency Rules
1. **Image Heights**: Recipes 60%, Cookbooks 50%
2. **Aspect Ratio**: All cards are square (1:1)
3. **Border**: 1px solid #e0e0e0 (not box-shadow)
4. **Border Radius**: 8px
5. **Hover Effect**: `translateY(-2px)` with `box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)`
6. **Description Display**:
- Columns 3 & 5: Show 2 lines
- Columns 7 & 9: Hide completely
7. **Font Scaling**: Larger fonts for fewer columns, smaller for more columns
8. **Text Truncation**: Use `-webkit-line-clamp` with `text-overflow: ellipsis`

View File

@@ -227,6 +227,9 @@ function CookbookDetail() {
gridTemplateColumns: `repeat(${columnCount}, 1fr)`, gridTemplateColumns: `repeat(${columnCount}, 1fr)`,
}; };
const recipesGridClassName = `recipes-grid columns-${columnCount}`;
const cookbooksGridClassName = `cookbooks-grid columns-${columnCount}`;
return ( return (
<div className="cookbook-detail-page"> <div className="cookbook-detail-page">
<header className="cookbook-header"> <header className="cookbook-header">
@@ -362,7 +365,7 @@ function CookbookDetail() {
{cookbook.cookbooks && cookbook.cookbooks.length > 0 && ( {cookbook.cookbooks && cookbook.cookbooks.length > 0 && (
<section className="included-cookbooks-section"> <section className="included-cookbooks-section">
<h2>Included Cookbooks ({cookbook.cookbooks.length})</h2> <h2>Included Cookbooks ({cookbook.cookbooks.length})</h2>
<div className="cookbooks-grid" style={gridStyle}> <div className={cookbooksGridClassName} style={gridStyle}>
{cookbook.cookbooks.map((childCookbook) => ( {cookbook.cookbooks.map((childCookbook) => (
<div <div
key={childCookbook.id} key={childCookbook.id}
@@ -420,7 +423,7 @@ function CookbookDetail() {
)} )}
</div> </div>
) : ( ) : (
<div className="recipes-grid" style={gridStyle}> <div className={recipesGridClassName} style={gridStyle}>
{paginatedRecipes.map(recipe => ( {paginatedRecipes.map(recipe => (
<div key={recipe.id} className="recipe-card"> <div key={recipe.id} className="recipe-card">
<div onClick={() => navigate(`/recipes/${recipe.id}`)}> <div onClick={() => navigate(`/recipes/${recipe.id}`)}>

View File

@@ -189,6 +189,9 @@ function Cookbooks() {
gridTemplateColumns: `repeat(${columnCount}, 1fr)`, gridTemplateColumns: `repeat(${columnCount}, 1fr)`,
}; };
const recipesGridClassName = `recipes-grid columns-${columnCount}`;
const cookbooksGridClassName = `cookbooks-grid columns-${columnCount}`;
if (loading) { if (loading) {
return ( return (
<div className="cookbooks-page"> <div className="cookbooks-page">
@@ -222,21 +225,8 @@ function Cookbooks() {
</div> </div>
</header> </header>
{/* Cookbooks Grid */} {/* Page-level Controls */}
<section className="cookbooks-section"> <div className="page-toolbar">
<h2>Cookbooks</h2>
{cookbooks.length === 0 ? (
<div className="empty-state">
<p>No cookbooks yet. Create your first cookbook to organize your recipes!</p>
<button onClick={() => setShowCreateModal(true)} className="btn-primary">
Create Cookbook
</button>
</div>
) : (
<>
{/* Display and Pagination Controls */}
<div className="cookbooks-toolbar">
<div className="display-controls"> <div className="display-controls">
<div className="control-group"> <div className="control-group">
<label>Columns:</label> <label>Columns:</label>
@@ -253,7 +243,23 @@ function Cookbooks() {
</div> </div>
</div> </div>
</div> </div>
</div>
{/* Cookbooks Grid */}
<section className="cookbooks-section">
<h2>Cookbooks</h2>
{cookbooks.length === 0 ? (
<div className="empty-state">
<p>No cookbooks yet. Create your first cookbook to organize your recipes!</p>
<button onClick={() => setShowCreateModal(true)} className="btn-primary">
Create Cookbook
</button>
</div>
) : (
<>
{/* Pagination Controls */}
<div className="pagination-toolbar">
<div className="pagination-controls"> <div className="pagination-controls">
<div className="control-group"> <div className="control-group">
<label>Per page:</label> <label>Per page:</label>
@@ -299,7 +305,7 @@ function Cookbooks() {
)} )}
</p> </p>
<div className="cookbooks-grid" style={gridStyle}> <div className={cookbooksGridClassName} style={gridStyle}>
{paginatedCookbooks.map((cookbook) => ( {paginatedCookbooks.map((cookbook) => (
<div <div
key={cookbook.id} key={cookbook.id}
@@ -339,7 +345,7 @@ function Cookbooks() {
{/* Recent Recipes */} {/* Recent Recipes */}
<section className="recent-recipes-section"> <section className="recent-recipes-section">
<div className="section-header"> <div className="section-title-row">
<h2>Recent Recipes</h2> <h2>Recent Recipes</h2>
<button onClick={() => navigate('/recipes')} className="btn-link"> <button onClick={() => navigate('/recipes')} className="btn-link">
View all View all
@@ -348,7 +354,7 @@ function Cookbooks() {
{recentRecipes.length === 0 ? ( {recentRecipes.length === 0 ? (
<p className="empty-state">No recipes yet.</p> <p className="empty-state">No recipes yet.</p>
) : ( ) : (
<div className="recipes-grid"> <div className={recipesGridClassName} style={gridStyle}>
{recentRecipes.map((recipe) => ( {recentRecipes.map((recipe) => (
<div <div
key={recipe.id} key={recipe.id}

View File

@@ -132,6 +132,8 @@ function RecipeList() {
gridTemplateColumns: `repeat(${columnCount}, 1fr)`, gridTemplateColumns: `repeat(${columnCount}, 1fr)`,
}; };
const gridClassName = `recipe-grid-enhanced columns-${columnCount}`;
const handlePageChange = (newPage: number) => { const handlePageChange = (newPage: number) => {
setCurrentPage(newPage); setCurrentPage(newPage);
window.scrollTo({ top: 0, behavior: 'smooth' }); window.scrollTo({ top: 0, behavior: 'smooth' });
@@ -243,7 +245,7 @@ function RecipeList() {
)} )}
</div> </div>
) : ( ) : (
<div className="recipe-grid-enhanced" style={gridStyle}> <div className={gridClassName} style={gridStyle}>
{recipes.map((recipe) => ( {recipes.map((recipe) => (
<div <div
key={recipe.id} key={recipe.id}

View File

@@ -391,10 +391,11 @@
} }
.recipe-card { .recipe-card {
background: white; cursor: pointer;
border-radius: 12px; border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden; overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); background: white;
position: relative; position: relative;
transition: transform 0.2s, box-shadow 0.2s; transition: transform 0.2s, box-shadow 0.2s;
display: flex; display: flex;
@@ -403,8 +404,8 @@
} }
.recipe-card:hover { .recipe-card:hover {
transform: translateY(-4px); transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
} }
.recipe-card > div:first-child { .recipe-card > div:first-child {
@@ -415,10 +416,11 @@
min-height: 0; min-height: 0;
} }
.recipe-image { .recipe-card img.recipe-image {
width: 100%; width: 100%;
height: 60%; height: 60%;
object-fit: cover; object-fit: cover;
display: block;
flex-shrink: 0; flex-shrink: 0;
} }
@@ -435,17 +437,17 @@
.recipe-info { .recipe-info {
padding: 0.5rem; padding: 0.5rem;
flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex: 1; justify-content: space-between;
min-height: 0;
overflow: hidden; overflow: hidden;
min-height: 0;
} }
.recipe-info h3 { .recipe-info h3 {
font-size: 0.75rem;
color: #212121;
margin: 0 0 0.25rem 0; margin: 0 0 0.25rem 0;
font-size: 0.75rem;
line-height: 1.2; line-height: 1.2;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@@ -456,14 +458,13 @@
} }
.recipe-info .description { .recipe-info .description {
margin: 0;
font-size: 0.65rem; font-size: 0.65rem;
color: #666; color: #666;
margin: 0;
line-height: 1.2;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 1; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
flex-shrink: 1; flex-shrink: 1;
} }
@@ -472,25 +473,45 @@
display: flex; display: flex;
gap: 0.4rem; gap: 0.4rem;
font-size: 0.6rem; font-size: 0.6rem;
color: #757575; color: #888;
flex-shrink: 0; flex-shrink: 0;
margin-top: auto; margin-top: auto;
} }
.recipe-tags { .recipe-tags {
display: flex; display: none;
flex-wrap: wrap;
gap: 0.25rem;
margin-top: 0.25rem;
} }
.recipe-tags .tag { /* Column-specific styles for recipes */
padding: 0.1rem 0.4rem; .columns-3 .recipe-info h3 {
background-color: #e8f5e9; font-size: 0.95rem;
color: #2e7d32; }
border-radius: 8px;
font-size: 0.55rem; .columns-3 .recipe-info .description {
font-weight: 500; font-size: 0.8rem;
-webkit-line-clamp: 2;
}
.columns-3 .recipe-meta {
font-size: 0.75rem;
}
.columns-5 .recipe-info h3 {
font-size: 0.85rem;
}
.columns-5 .recipe-info .description {
font-size: 0.75rem;
-webkit-line-clamp: 2;
}
.columns-5 .recipe-meta {
font-size: 0.7rem;
}
.columns-7 .recipe-info .description,
.columns-9 .recipe-info .description {
display: none;
} }
.remove-recipe-btn { .remove-recipe-btn {
@@ -632,11 +653,16 @@
.cookbook-card.nested .cookbook-info { .cookbook-card.nested .cookbook-info {
padding: 0.5rem; padding: 0.5rem;
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
overflow: hidden; overflow: hidden;
} }
.cookbook-card.nested .cookbook-info h3 { .cookbook-card.nested .cookbook-info h3 {
font-size: 0.75rem; font-size: 0.75rem;
color: #212121;
margin: 0 0 0.25rem 0; margin: 0 0 0.25rem 0;
line-height: 1.2; line-height: 1.2;
overflow: hidden; overflow: hidden;
@@ -653,11 +679,40 @@
.cookbook-card.nested .cookbook-stats { .cookbook-card.nested .cookbook-stats {
margin-top: auto; margin-top: auto;
display: flex;
flex-direction: column;
gap: 0.1rem; gap: 0.1rem;
} }
.cookbook-card.nested .recipe-count, .cookbook-card.nested .recipe-count,
.cookbook-card.nested .cookbook-count { .cookbook-card.nested .cookbook-count {
font-size: 0.6rem; font-size: 0.6rem;
color: #2e7d32;
font-weight: 600;
margin: 0;
line-height: 1.2; line-height: 1.2;
white-space: nowrap;
}
.cookbook-card.nested .cookbook-tags {
display: none;
}
/* Column-specific styles for nested cookbooks */
.cookbooks-grid.columns-3 .cookbook-card.nested .cookbook-info h3 {
font-size: 0.95rem;
}
.cookbooks-grid.columns-3 .cookbook-card.nested .recipe-count,
.cookbooks-grid.columns-3 .cookbook-card.nested .cookbook-count {
font-size: 0.75rem;
}
.cookbooks-grid.columns-5 .cookbook-card.nested .cookbook-info h3 {
font-size: 0.85rem;
}
.cookbooks-grid.columns-5 .cookbook-card.nested .recipe-count,
.cookbooks-grid.columns-5 .cookbook-card.nested .cookbook-count {
font-size: 0.7rem;
} }

View File

@@ -26,6 +26,18 @@
gap: 1rem; gap: 1rem;
} }
/* Page-level Controls */
.page-toolbar {
display: flex;
justify-content: flex-start;
background: white;
padding: 0.75rem 1rem;
border-radius: 8px;
margin-bottom: 2rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
border: 1px solid #e0e0e0;
}
/* Cookbooks Section */ /* Cookbooks Section */
.cookbooks-section { .cookbooks-section {
margin-bottom: 3rem; margin-bottom: 3rem;
@@ -37,13 +49,12 @@
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
} }
/* Toolbar and Pagination Controls */ /* Pagination Controls */
.cookbooks-toolbar { .pagination-toolbar {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 1.5rem;
align-items: center; align-items: center;
justify-content: space-between; justify-content: flex-end;
background: white; background: white;
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
border-radius: 8px; border-radius: 8px;
@@ -241,51 +252,70 @@
display: none; display: none;
} }
/* Column-specific styles for Cookbooks */
.cookbooks-grid.columns-3 .cookbook-info h3 {
font-size: 0.95rem;
}
.cookbooks-grid.columns-3 .recipe-count,
.cookbooks-grid.columns-3 .cookbook-count {
font-size: 0.75rem;
}
.cookbooks-grid.columns-5 .cookbook-info h3 {
font-size: 0.85rem;
}
.cookbooks-grid.columns-5 .recipe-count,
.cookbooks-grid.columns-5 .cookbook-count {
font-size: 0.7rem;
}
/* Recent Recipes Section */ /* Recent Recipes Section */
.recent-recipes-section { .recent-recipes-section {
margin-top: 3rem; margin-top: 3rem;
} }
.section-header { .recent-recipes-section h2 {
font-size: 1.8rem;
color: #1b5e20;
margin: 0;
}
.section-title-row {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
} }
.section-header h2 {
font-size: 1.8rem;
color: #1b5e20;
margin: 0;
}
.recipes-grid { .recipes-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem; gap: 1.5rem;
} }
.recipe-card { .recent-recipes-section .recipe-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
cursor: pointer; cursor: pointer;
border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden;
background: white;
transition: transform 0.2s, box-shadow 0.2s; transition: transform 0.2s, box-shadow 0.2s;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
aspect-ratio: 1 / 1; aspect-ratio: 1 / 1;
} }
.recipe-card:hover { .recent-recipes-section .recipe-card:hover {
transform: translateY(-4px); transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
} }
.recipe-image { .recent-recipes-section .recipe-card img {
width: 100%; width: 100%;
height: 60%; height: 60%;
object-fit: cover; object-fit: cover;
display: block;
flex-shrink: 0; flex-shrink: 0;
} }
@@ -300,19 +330,19 @@
flex-shrink: 0; flex-shrink: 0;
} }
.recipe-info { .recent-recipes-section .recipe-info {
padding: 0.5rem; padding: 0.5rem;
flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex: 1; justify-content: space-between;
min-height: 0;
overflow: hidden; overflow: hidden;
min-height: 0;
} }
.recipe-info h3 { .recent-recipes-section .recipe-info h3 {
font-size: 0.75rem;
color: #212121;
margin: 0 0 0.25rem 0; margin: 0 0 0.25rem 0;
font-size: 0.75rem;
line-height: 1.2; line-height: 1.2;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@@ -322,28 +352,59 @@
flex-shrink: 0; flex-shrink: 0;
} }
.recipe-info .description { .recent-recipes-section .recipe-info .description {
margin: 0;
font-size: 0.65rem; font-size: 0.65rem;
color: #666; color: #666;
margin: 0;
line-height: 1.2;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 1; -webkit-line-clamp: 2;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
flex-shrink: 1; flex-shrink: 1;
} }
.recipe-meta { .recent-recipes-section .recipe-meta {
display: flex; display: flex;
gap: 0.4rem; gap: 0.4rem;
font-size: 0.6rem; font-size: 0.6rem;
color: #757575; color: #888;
flex-shrink: 0; flex-shrink: 0;
margin-top: auto; margin-top: auto;
} }
/* Column-specific styles for Recent Recipes */
.recent-recipes-section .columns-3 .recipe-info h3 {
font-size: 0.95rem;
}
.recent-recipes-section .columns-3 .recipe-info .description {
font-size: 0.8rem;
-webkit-line-clamp: 2;
}
.recent-recipes-section .columns-3 .recipe-meta {
font-size: 0.75rem;
}
.recent-recipes-section .columns-5 .recipe-info h3 {
font-size: 0.85rem;
}
.recent-recipes-section .columns-5 .recipe-info .description {
font-size: 0.75rem;
-webkit-line-clamp: 2;
}
.recent-recipes-section .columns-5 .recipe-meta {
font-size: 0.7rem;
}
.recent-recipes-section .columns-7 .recipe-info .description,
.recent-recipes-section .columns-9 .recipe-info .description {
display: none;
}
/* Empty State */ /* Empty State */
.empty-state { .empty-state {
text-align: center; text-align: center;
@@ -690,7 +751,8 @@
width: 100%; width: 100%;
} }
.cookbooks-toolbar { .page-toolbar,
.pagination-toolbar {
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
padding: 1rem; padding: 1rem;

View File

@@ -327,6 +327,38 @@
margin-top: auto; margin-top: auto;
} }
/* Column-specific styles for recipe grid */
.recipe-grid-enhanced.columns-3 .recipe-card-content h3 {
font-size: 0.95rem;
}
.recipe-grid-enhanced.columns-3 .recipe-card-content p {
font-size: 0.8rem;
-webkit-line-clamp: 2;
}
.recipe-grid-enhanced.columns-3 .recipe-meta {
font-size: 0.75rem;
}
.recipe-grid-enhanced.columns-5 .recipe-card-content h3 {
font-size: 0.85rem;
}
.recipe-grid-enhanced.columns-5 .recipe-card-content p {
font-size: 0.75rem;
-webkit-line-clamp: 2;
}
.recipe-grid-enhanced.columns-5 .recipe-meta {
font-size: 0.7rem;
}
.recipe-grid-enhanced.columns-7 .recipe-card-content p,
.recipe-grid-enhanced.columns-9 .recipe-card-content p {
display: none;
}
/* Empty state */ /* Empty state */
.empty-state { .empty-state {
text-align: center; text-align: center;