Repository: strapi/strapi-starter-nuxt-blog
Branch: master
Commit: f7cf92154a90
Files: 27
Total size: 21.5 KB
Directory structure:
gitextract_1dcvs84i/
├── .gitignore
├── LICENSE.txt
├── README.md
├── starter/
│ ├── .eslintignore
│ ├── .eslintrc
│ ├── assets/
│ │ ├── README.md
│ │ └── css/
│ │ └── main.css
│ ├── components/
│ │ ├── ArticleCard.vue
│ │ ├── Articles.vue
│ │ ├── Logo.vue
│ │ └── README.md
│ ├── layouts/
│ │ ├── README.md
│ │ └── default.vue
│ ├── middleware/
│ │ └── README.md
│ ├── nuxt.config.js
│ ├── package.json
│ ├── pages/
│ │ ├── README.md
│ │ ├── articles/
│ │ │ └── _slug.vue
│ │ ├── categories/
│ │ │ └── _slug.vue
│ │ └── index.vue
│ ├── plugins/
│ │ ├── README.md
│ │ └── uikit.js
│ ├── static/
│ │ └── README.md
│ ├── store/
│ │ └── README.md
│ └── utils/
│ ├── medias.js
│ └── seo.js
└── starter.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
############################
# OS X
############################
.DS_Store
.AppleDouble
.LSOverride
Icon
.Spotlight-V100
.Trashes
._*
############################
# Linux
############################
*~
############################
# Windows
############################
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msm
*.msp
############################
# Packages
############################
*.7z
*.csv
*.dat
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.com
*.class
*.dll
*.exe
*.o
*.seed
*.so
*.swo
*.swp
*.swn
*.swm
*.out
*.pid
############################
# Logs and databases
############################
.tmp
*.log
*.sql
*.sqlite
*.sqlite3
############################
# Misc.
############################
*#
ssl
.idea
nbproject
public/uploads/*
!public/uploads/.gitkeep
############################
# Node.js
############################
lib-cov
lcov.info
pids
logs
results
node_modules
.node_history
############################
# Tests
############################
testApp
coverage
############################
# Strapi
############################
exports
.cache
build
# Custom
.vscode
dist
.nuxt
.env
================================================
FILE: LICENSE.txt
================================================
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
**:no_entry: Deprecated**
This repository is no longer maintained and only works for Strapi v3. To find the newest Strapi v4 starters, check out the [starters-and-templates monorepo](https://github.com/strapi/starters-and-templates/).
---
# Strapi Starter Nuxt Blog
Nuxt starter for creating a blog with Strapi.

This starter allows you to try Strapi with Nuxt with the example of a simple blog. It is fully customizable and due to the fact that it is open source, fully open to contributions. So do not hesitate to add new features and report bugs!
This starter uses the [Strapi blog template](https://github.com/strapi/strapi-template-blog)
Check out all of our starters [here](https://strapi.io/starters)
## Features
- 2 Content types: Article, Category
- 2 Created articles
- 3 Created categories
- Permissions set to `true` for article and category
- Responsive design using UIkit
Pages:
- "/" display every articles
- "/article/:id" display one article
- "/category/:id" display articles depending on the category
## Getting started
Use our `create-strapi-starter` CLI to create your project.
```sh
npx create-strapi-starter@3 my-site nuxt-blog
```
The CLI will create a monorepo, install dependencies, and run your project automatically.
The Nuxt frontend server will run here => [http://localhost:3000](http://localhost:3000)
The Strapi backend server will run here => [http://localhost:1337](http://localhost:1337)
## Deploying to production
You will need to deploy the `frontend` and `backend` projects separately. Here are the docs to deploy each one:
- [Deploy Strapi](https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment.html#hosting-provider-guides)
- [Deploy Nuxt](https://nuxtjs.org/docs/2.x/deployment/deploying-to-21yunbox)
Don't forget to setup the environment variables on your production app:
For the frontend the following environment variable is required:
- `API_URL`: URL of your Strapi backend, without trailing slash
Enjoy this starter!
================================================
FILE: starter/.eslintignore
================================================
.gitignore
node_modules
.vscode
dist
.nuxt
================================================
FILE: starter/.eslintrc
================================================
{
"root": true,
"env": {
"browser": true,
"node": true
},
"parserOptions": {
"parser": "babel-eslint"
},
"extends": [
"eslint:recommended",
"plugin:vue/recommended",
"plugin:prettier/recommended",
"prettier/vue"
],
"plugins": ["vue"],
"rules": {}
}
================================================
FILE: starter/assets/README.md
================================================
# ASSETS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your un-compiled assets such as LESS, SASS, or JavaScript.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked).
================================================
FILE: starter/assets/css/main.css
================================================
a {
text-decoration: none;
}
h1 {
font-family: Staatliches;
font-size: 120px;
}
#category {
font-family: Staatliches;
font-weight: 500;
}
#title {
letter-spacing: .4px;
font-size: 22px;
font-size: 1.375rem;
line-height: 1.13636;
}
#banner {
margin: 20px;
height: 800px;
}
#editor {
font-size: 16px;
font-size: 1rem;
line-height: 1.75;
}
.uk-navbar-container {
background: #fff !important;
font-family: Staatliches;
}
img:hover {
opacity: 1;
transition: opacity 0.25s cubic-bezier(0.39, 0.575, 0.565, 1);
}
================================================
FILE: starter/components/ArticleCard.vue
================================================
<template>
<nuxt-link
:key="article.id"
:to="{ name: 'articles-slug', params: { slug: article.slug } }"
class="uk-link-reset"
>
<div class="uk-card uk-card-muted">
<div class="uk-card-media-top">
<img :src="getStrapiMedia(article.image.url)" height="100" />
</div>
<div class="uk-card-body">
<p v-if="article.category" id="category" class="uk-text-uppercase">
{{ article.category.name }}
</p>
<p id="title" class="uk-text-large">{{ article.title }}</p>
<hr class="uk-divider-small" />
<div class="uk-grid-small uk-flex-left" data-uk-grid="true">
<div>
<img
class="avatar"
:src="getStrapiMedia(article.author.picture.url)"
style="position: static; border-radius: 50%; object-fit: cover"
width="40px"
height="40px"
:alt="article.title"
/>
</div>
<div class="uk-width-expand">
<p class="uk-margin-remove-bottom">{{ article.author.name }}</p>
</div>
</div>
</div>
</div>
</nuxt-link>
</template>
<script>
import { getStrapiMedia } from "../utils/medias";
export default {
props: {
article: {
type: Object,
default: () => ({}),
},
},
methods: {
getStrapiMedia,
},
};
</script>
================================================
FILE: starter/components/Articles.vue
================================================
<template>
<div>
<div class="uk-child-width-1-2" uk-grid>
<div>
<ArticleCard
v-for="article in leftArticles"
:key="article.id"
:article="article"
/>
</div>
<div>
<div class="uk-child-width-1-2@m uk-grid-match" uk-grid>
<ArticleCard
v-for="article in rightArticles"
:key="article.id"
:article="article"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import ArticleCard from "./ArticleCard";
export default {
components: {
ArticleCard,
},
props: {
articles: {
type: Array,
default: () => [],
},
},
computed: {
leftArticlesCount() {
return Math.ceil(this.articles.length / 5);
},
leftArticles() {
return this.articles.slice(0, this.leftArticlesCount);
},
rightArticles() {
return this.articles.slice(this.leftArticlesCount, this.articles.length);
},
},
};
</script>
================================================
FILE: starter/components/Logo.vue
================================================
<template>
<div class="VueToNuxtLogo">
<div class="Triangle Triangle--two" />
<div class="Triangle Triangle--one" />
<div class="Triangle Triangle--three" />
<div class="Triangle Triangle--four" />
</div>
</template>
<style>
.VueToNuxtLogo {
display: inline-block;
animation: turn 2s linear forwards 1s;
transform: rotateX(180deg);
position: relative;
overflow: hidden;
height: 180px;
width: 245px;
}
.Triangle {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
}
.Triangle--one {
border-left: 105px solid transparent;
border-right: 105px solid transparent;
border-bottom: 180px solid #41b883;
}
.Triangle--two {
top: 30px;
left: 35px;
animation: goright 0.5s linear forwards 3.5s;
border-left: 87.5px solid transparent;
border-right: 87.5px solid transparent;
border-bottom: 150px solid #3b8070;
}
.Triangle--three {
top: 60px;
left: 35px;
animation: goright 0.5s linear forwards 3.5s;
border-left: 70px solid transparent;
border-right: 70px solid transparent;
border-bottom: 120px solid #35495e;
}
.Triangle--four {
top: 120px;
left: 70px;
animation: godown 0.5s linear forwards 3s;
border-left: 35px solid transparent;
border-right: 35px solid transparent;
border-bottom: 60px solid #fff;
}
@keyframes turn {
100% {
transform: rotateX(0deg);
}
}
@keyframes godown {
100% {
top: 180px;
}
}
@keyframes goright {
100% {
left: 70px;
}
}
</style>
================================================
FILE: starter/components/README.md
================================================
# COMPONENTS
**This directory is not required, you can delete it if you don't want to use it.**
The components directory contains your Vue.js Components.
_Nuxt.js doesn't supercharge these components._
================================================
FILE: starter/layouts/README.md
================================================
# LAYOUTS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your Application Layouts.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts).
================================================
FILE: starter/layouts/default.vue
================================================
<template>
<div>
<nav class="uk-navbar-container" uk-navbar>
<div class="uk-navbar-left">
<ul class="uk-navbar-nav">
<li>
<a href="#modal-full" uk-toggle><span uk-icon="icon: table" /></a>
</li>
<li>
<nuxt-link to="/" tag="a">Strapi Blog</nuxt-link>
</li>
</ul>
</div>
<div class="uk-navbar-right">
<ul class="uk-navbar-nav">
<li v-for="category in categories" :key="category.id">
<nuxt-link
:to="{ name: 'categories-slug', params: { slug: category.slug } }"
tag="a"
>
{{ category.name }}
</nuxt-link>
</li>
</ul>
</div>
</nav>
<div id="modal-full" class="uk-modal-full" uk-modal>
<div class="uk-modal-dialog">
<button
class="uk-modal-close-full uk-close-large"
type="button"
uk-close
/>
<div
class="uk-grid-collapse uk-child-width-1-2@s uk-flex-middle"
uk-grid
>
<div
class="uk-background-cover"
style="
background-image: url('https://images.unsplash.com/photo-1493612276216-ee3925520721?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3308&q=80 3308w');
"
uk-height-viewport
/>
<div class="uk-padding-large">
<h1 style="font-family: Staatliches">Strapi blog</h1>
<div class="uk-width-1-2@s">
<ul class="uk-nav-primary uk-nav-parent-icon" uk-nav>
<li v-for="category in categories" :key="category.id">
<nuxt-link
class="uk-modal-close"
:to="{
name: 'categories-slug',
params: { slug: category.slug },
}"
tag="a"
>
{{ category.name }}
</nuxt-link>
</li>
</ul>
</div>
<p class="uk-text-light">Built with strapi</p>
</div>
</div>
</div>
</div>
<nuxt />
</div>
</template>
<script>
export default {
async fetch() {
this.categories = await this.$strapi.find("categories");
},
data: function () {
return {
categories: [],
};
},
};
</script>
================================================
FILE: starter/middleware/README.md
================================================
# MIDDLEWARE
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your application middleware.
Middleware let you define custom functions that can be run before rendering either a page or a group of pages.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware).
================================================
FILE: starter/nuxt.config.js
================================================
const strapiBaseUri = process.env.API_URL || "http://localhost:1337";
export default {
target: "static",
env: {
strapiBaseUri,
},
head: {
meta: [
{ charset: "utf-8" },
{ name: "viewport", content: "width=device-width, initial-scale=1" },
],
link: [
{
rel: "stylesheet",
href: "https://fonts.googleapis.com/css?family=Staatliches",
},
],
},
/*
** Global CSS
*/
css: [
"uikit/dist/css/uikit.min.css",
"uikit/dist/css/uikit.css",
"@assets/css/main.css",
],
plugins: [{ src: "~/plugins/uikit.js", ssr: false }],
modules: ["@nuxtjs/markdownit", "@nuxtjs/strapi"],
strapi: {
url: strapiBaseUri,
entities: [
{
name: "articles",
type: "collection",
},
{
name: "categories",
type: "collection",
},
{
name: "homepage",
type: "single",
},
{
name: "global",
type: "single",
},
],
},
markdownit: {
preset: "default",
linkify: true,
breaks: true,
injected: true,
html: true,
},
};
================================================
FILE: starter/package.json
================================================
{
"name": "frontend",
"version": "1.0.0",
"description": "My polished Nuxt.js project",
"author": "You",
"private": true,
"scripts": {
"dev": "nuxt",
"develop": "nuxt",
"start": "nuxt start",
"generate": "nuxt generate",
"lint": "eslint --ext .js,.vue .",
"lint:fix": "eslint --ext .js,.vue . --fix"
},
"dependencies": {
"@nuxtjs/markdownit": "^1.2.7",
"@nuxtjs/strapi": "^0.1.6",
"graphql": "^14.5.8",
"moment": "^2.29.0",
"nuxt": "^2.14.6",
"uikit": "^3.2.3"
},
"devDependencies": {
"@babel/runtime-corejs3": "^7.9.6",
"babel-eslint": "^10.1.0",
"core-js": "^3.6.5",
"eslint": "^7.9.0",
"eslint-config-prettier": "^6.11.0",
"eslint-loader": "^4.0.2",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-vue": "^6.2.2",
"prettier": "^2.1.2"
},
"license": "MIT"
}
================================================
FILE: starter/pages/README.md
================================================
# PAGES
This directory contains your Application Views and Routes.
The framework reads all the `*.vue` files inside this directory and creates the router of your application.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing).
================================================
FILE: starter/pages/articles/_slug.vue
================================================
<template>
<div>
<div
v-if="article.image"
id="banner"
class="uk-height-small uk-flex uk-flex-center uk-flex-middle uk-background-cover uk-light uk-padding"
:data-src="getStrapiMedia(article.image.url)"
uk-img
>
<h1>{{ article.title }}</h1>
</div>
<div class="uk-section">
<div class="uk-container uk-container-small">
<!-- eslint-disable vue/no-v-html -->
<div
v-if="article.content"
id="editor"
v-html="$md.render(article.content)"
/>
<!-- eslint-enable vue/no-v-html -->
<p v-if="article.published_at">
{{ moment(article.published_at).format("MMM Do YY") }}
</p>
</div>
</div>
</div>
</template>
<script>
import moment from "moment";
import { getStrapiMedia } from "../../utils/medias";
import { getMetaTags } from "../../utils/seo";
export default {
async asyncData({ $strapi, params }) {
const matchingArticles = await $strapi.find("articles", {
slug: params.slug,
});
return {
article: matchingArticles[0],
global: await $strapi.find("global"),
};
},
data() {
return {
apiUrl: process.env.strapiBaseUri,
};
},
methods: {
moment,
getStrapiMedia,
},
head() {
const { defaultSeo, favicon, siteName } = this.global;
// Merge default and article-specific SEO data
const fullSeo = {
...defaultSeo,
metaTitle: this.article.title,
metaDescription: this.article.description,
shareImage: this.article.image,
};
return {
titleTemplate: `%s | ${siteName}`,
title: fullSeo.metaTitle,
meta: getMetaTags(fullSeo),
link: [
{
rel: "favicon",
href: getStrapiMedia(favicon.url),
},
],
};
},
};
</script>
================================================
FILE: starter/pages/categories/_slug.vue
================================================
<template>
<div>
<client-only>
<div class="uk-section">
<div class="uk-container uk-container-large">
<h1>{{ category.name }}</h1>
<Articles :articles="articles || []" />
</div>
</div>
</client-only>
</div>
</template>
<script>
import Articles from "../../components/Articles";
import { getMetaTags } from "../../utils/seo";
import { getStrapiMedia } from "../../utils/medias";
export default {
components: {
Articles,
},
async asyncData({ $strapi, params }) {
const matchingCategories = await $strapi.find("categories", {
slug: params.slug,
});
return {
category: matchingCategories[0],
articles: await $strapi.find("articles", {
"category.name": params.slug,
}),
global: await $strapi.find("global"),
};
},
head() {
const { defaultSeo, favicon, siteName } = this.global;
// Merge default and article-specific SEO data
const fullSeo = {
...defaultSeo,
metaTitle: `${this.category.name} articles`,
metaDescription: `All articles about ${this.category.name}`,
};
return {
title: fullSeo.metaTitle,
titleTemplate: `%s | ${siteName}`,
meta: getMetaTags(fullSeo),
link: [
{
rel: "favicon",
href: getStrapiMedia(favicon.url),
},
],
};
},
};
</script>
================================================
FILE: starter/pages/index.vue
================================================
<template>
<div>
<div class="uk-section">
<div class="uk-container uk-container-large">
<h1>{{ homepage.hero.title }}</h1>
<Articles :articles="articles" />
</div>
</div>
</div>
</template>
<script>
import Articles from "../components/Articles";
import { getMetaTags } from "../utils/seo";
import { getStrapiMedia } from "../utils/medias";
export default {
components: {
Articles,
},
async asyncData({ $strapi }) {
return {
articles: await $strapi.find("articles"),
homepage: await $strapi.find("homepage"),
global: await $strapi.find("global"),
};
},
head() {
const { seo } = this.homepage;
const { defaultSeo, favicon, siteName } = this.global;
// Merge default and article-specific SEO data
const fullSeo = {
...defaultSeo,
...seo,
};
return {
titleTemplate: `%s | ${siteName}`,
title: fullSeo.metaTitle,
meta: getMetaTags(fullSeo),
link: [
{
rel: "favicon",
href: getStrapiMedia(favicon.url),
},
],
};
},
};
</script>
================================================
FILE: starter/plugins/README.md
================================================
# PLUGINS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains Javascript plugins that you want to run before mounting the root Vue.js application.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/plugins).
================================================
FILE: starter/plugins/uikit.js
================================================
import Vue from "vue";
import UIkit from "uikit/dist/js/uikit-core";
import Icons from "uikit/dist/js/uikit-icons";
UIkit.use(Icons);
UIkit.container = "#__nuxt";
Vue.prototype.$uikit = UIkit;
================================================
FILE: starter/static/README.md
================================================
# STATIC
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your static files.
Each file inside this directory is mapped to `/`.
Thus you'd want to delete this README.md before deploying to production.
Example: `/static/robots.txt` is mapped as `/robots.txt`.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).
================================================
FILE: starter/store/README.md
================================================
# STORE
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your Vuex Store files.
Vuex Store option is implemented in the Nuxt.js framework.
Creating a file in this directory automatically activates the option in the framework.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/vuex-store).
================================================
FILE: starter/utils/medias.js
================================================
export function getStrapiMedia(url) {
// Check if URL is a local path
if (url.startsWith("/")) {
// Prepend Strapi address
return `${process.env.strapiBaseUri}${url}`;
}
// Otherwise return full URL
return url;
}
================================================
FILE: starter/utils/seo.js
================================================
import { getStrapiMedia } from "./medias";
export function getMetaTags(seo) {
const tags = [];
if (seo.metaTitle) {
tags.push(
{
property: "og:title",
content: seo.metaTitle,
},
{
name: "twitter:title",
content: seo.metaTitle,
}
);
}
if (seo.metaDescription) {
tags.push(
{
name: "description",
content: seo.metaDescription,
},
{
property: "og:description",
content: seo.metaDescription,
},
{
name: "twitter:description",
content: seo.metaDescription,
}
);
}
if (seo.shareImage) {
const imageUrl = getStrapiMedia(seo.shareImage.url);
tags.push(
{
name: "image",
content: imageUrl,
},
{
property: "og:image",
content: imageUrl,
},
{
name: "twitter:image",
content: imageUrl,
}
);
}
if (seo.article) {
tags.push({
property: "og:type",
content: "article",
});
}
tags.push({ name: "twitter:card", content: "summary_large_image" });
return tags;
}
================================================
FILE: starter.json
================================================
{
"template": "https://github.com/strapi/strapi-template-blog"
}
gitextract_1dcvs84i/ ├── .gitignore ├── LICENSE.txt ├── README.md ├── starter/ │ ├── .eslintignore │ ├── .eslintrc │ ├── assets/ │ │ ├── README.md │ │ └── css/ │ │ └── main.css │ ├── components/ │ │ ├── ArticleCard.vue │ │ ├── Articles.vue │ │ ├── Logo.vue │ │ └── README.md │ ├── layouts/ │ │ ├── README.md │ │ └── default.vue │ ├── middleware/ │ │ └── README.md │ ├── nuxt.config.js │ ├── package.json │ ├── pages/ │ │ ├── README.md │ │ ├── articles/ │ │ │ └── _slug.vue │ │ ├── categories/ │ │ │ └── _slug.vue │ │ └── index.vue │ ├── plugins/ │ │ ├── README.md │ │ └── uikit.js │ ├── static/ │ │ └── README.md │ ├── store/ │ │ └── README.md │ └── utils/ │ ├── medias.js │ └── seo.js └── starter.json
SYMBOL INDEX (2 symbols across 2 files)
FILE: starter/utils/medias.js
function getStrapiMedia (line 1) | function getStrapiMedia(url) {
FILE: starter/utils/seo.js
function getMetaTags (line 3) | function getMetaTags(seo) {
Condensed preview — 27 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (25K chars).
[
{
"path": ".gitignore",
"chars": 1146,
"preview": "############################\n# OS X\n############################\n\n.DS_Store\n.AppleDouble\n.LSOverride\nIcon\n.Spotlight-V10"
},
{
"path": "LICENSE.txt",
"chars": 1070,
"preview": "MIT License\n\nCopyright (c) [year] [fullname]\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "README.md",
"chars": 2063,
"preview": "**:no_entry: Deprecated**\n\nThis repository is no longer maintained and only works for Strapi v3. To find the newest Stra"
},
{
"path": "starter/.eslintignore",
"chars": 43,
"preview": ".gitignore\nnode_modules\n.vscode\ndist\n.nuxt\n"
},
{
"path": "starter/.eslintrc",
"chars": 294,
"preview": "{\n \"root\": true,\n \"env\": {\n \"browser\": true,\n \"node\": true\n },\n \"parserOptions\": {\n \"parser\": \"babel-eslint"
},
{
"path": "starter/assets/README.md",
"chars": 296,
"preview": "# ASSETS\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contains yo"
},
{
"path": "starter/assets/css/main.css",
"chars": 552,
"preview": "a {\n text-decoration: none;\n}\n\nh1 {\n font-family: Staatliches;\n font-size: 120px;\n}\n\n#category {\n font-family: Sta"
},
{
"path": "starter/components/ArticleCard.vue",
"chars": 1382,
"preview": "<template>\n <nuxt-link\n :key=\"article.id\"\n :to=\"{ name: 'articles-slug', params: { slug: article.slug } }\"\n cl"
},
{
"path": "starter/components/Articles.vue",
"chars": 1002,
"preview": "<template>\n <div>\n <div class=\"uk-child-width-1-2\" uk-grid>\n <div>\n <ArticleCard\n v-for=\"articl"
},
{
"path": "starter/components/Logo.vue",
"chars": 1473,
"preview": "<template>\n <div class=\"VueToNuxtLogo\">\n <div class=\"Triangle Triangle--two\" />\n <div class=\"Triangle Triangle--o"
},
{
"path": "starter/components/README.md",
"chars": 205,
"preview": "# COMPONENTS\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThe components directo"
},
{
"path": "starter/layouts/README.md",
"chars": 261,
"preview": "# LAYOUTS\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contains y"
},
{
"path": "starter/layouts/default.vue",
"chars": 2433,
"preview": "<template>\n <div>\n <nav class=\"uk-navbar-container\" uk-navbar>\n <div class=\"uk-navbar-left\">\n <ul class="
},
{
"path": "starter/middleware/README.md",
"chars": 383,
"preview": "# MIDDLEWARE\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contain"
},
{
"path": "starter/nuxt.config.js",
"chars": 1118,
"preview": "const strapiBaseUri = process.env.API_URL || \"http://localhost:1337\";\n\nexport default {\n target: \"static\",\n env: {\n "
},
{
"path": "starter/package.json",
"chars": 871,
"preview": "{\n \"name\": \"frontend\",\n \"version\": \"1.0.0\",\n \"description\": \"My polished Nuxt.js project\",\n \"author\": \"You\",\n \"priv"
},
{
"path": "starter/pages/README.md",
"chars": 286,
"preview": "# PAGES\n\nThis directory contains your Application Views and Routes.\nThe framework reads all the `*.vue` files inside thi"
},
{
"path": "starter/pages/articles/_slug.vue",
"chars": 1842,
"preview": "<template>\n <div>\n <div\n v-if=\"article.image\"\n id=\"banner\"\n class=\"uk-height-small uk-flex uk-flex-ce"
},
{
"path": "starter/pages/categories/_slug.vue",
"chars": 1388,
"preview": "<template>\n <div>\n <client-only>\n <div class=\"uk-section\">\n <div class=\"uk-container uk-container-large\""
},
{
"path": "starter/pages/index.vue",
"chars": 1114,
"preview": "<template>\n <div>\n <div class=\"uk-section\">\n <div class=\"uk-container uk-container-large\">\n <h1>{{ homep"
},
{
"path": "starter/plugins/README.md",
"chars": 314,
"preview": "# PLUGINS\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contains J"
},
{
"path": "starter/plugins/uikit.js",
"chars": 196,
"preview": "import Vue from \"vue\";\n\nimport UIkit from \"uikit/dist/js/uikit-core\";\nimport Icons from \"uikit/dist/js/uikit-icons\";\n\nUI"
},
{
"path": "starter/static/README.md",
"chars": 435,
"preview": "# STATIC\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contains yo"
},
{
"path": "starter/store/README.md",
"chars": 400,
"preview": "# STORE\n\n**This directory is not required, you can delete it if you don't want to use it.**\n\nThis directory contains you"
},
{
"path": "starter/utils/medias.js",
"chars": 231,
"preview": "export function getStrapiMedia(url) {\n // Check if URL is a local path\n if (url.startsWith(\"/\")) {\n // Prepend Stra"
},
{
"path": "starter/utils/seo.js",
"chars": 1140,
"preview": "import { getStrapiMedia } from \"./medias\";\n\nexport function getMetaTags(seo) {\n const tags = [];\n\n if (seo.metaTitle) "
},
{
"path": "starter.json",
"chars": 67,
"preview": "{\n \"template\": \"https://github.com/strapi/strapi-template-blog\"\n}\n"
}
]
About this extraction
This page contains the full source code of the strapi/strapi-starter-nuxt-blog GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 27 files (21.5 KB), approximately 6.4k tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.