@docmd/template-summer 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/assets/css/summer.css +3418 -0
- package/dist/assets/js/summer.js +660 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +79 -0
- package/dist/templates/404.ejs +156 -0
- package/dist/templates/layout.ejs +609 -0
- package/dist/templates/partials/footer.ejs +69 -0
- package/dist/templates/partials/menubar.ejs +92 -0
- package/dist/templates/partials/options-menu.ejs +45 -0
- package/dist/templates/toc.ejs +53 -0
- package/package.json +61 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<%# ---------------------------------------------------------------
|
|
2
|
+
# @docmd/template-summer — partials/footer.ejs
|
|
3
|
+
#
|
|
4
|
+
# Two visual styles:
|
|
5
|
+
# - "complete" (config.footer.style === 'complete') — multi-column
|
|
6
|
+
# footer with branding, description, link columns
|
|
7
|
+
# - "minimal" / default — single-line bar with copyright + branding
|
|
8
|
+
# ---------------------------------------------------------------
|
|
9
|
+
%>
|
|
10
|
+
<% const _fc = (typeof footerConfig !== 'undefined' ? footerConfig : (locals.footerConfig || {})); %>
|
|
11
|
+
<% if (_fc?.style === 'complete' && Array.isArray(_fc.columns) && _fc.columns.length) { %>
|
|
12
|
+
<footer class="summer-footer summer-footer--complete">
|
|
13
|
+
<div class="summer-footer__top">
|
|
14
|
+
<div class="summer-footer__brand">
|
|
15
|
+
<div class="summer-footer__brand-logo">
|
|
16
|
+
<% if (logo && (logo.light || logo.dark)) { %>
|
|
17
|
+
<a href="<%= logo.href || relativePathToRoot %>" aria-label="<%= logo.alt || siteTitle %>">
|
|
18
|
+
<% if (logo.light) { %><img src="<%= relativePathToRoot %><%= logo.light.startsWith('/') ? logo.light.substring(1) : logo.light %>" alt="<%= logo.alt || siteTitle %>" class="summer-logo__light"><% } %>
|
|
19
|
+
<% if (logo.dark) { %><img src="<%= relativePathToRoot %><%= logo.dark.startsWith('/') ? logo.dark.substring(1) : logo.dark %>" alt="<%= logo.alt || siteTitle %>" class="summer-logo__dark"><% } %>
|
|
20
|
+
</a>
|
|
21
|
+
<% } else { %>
|
|
22
|
+
<span class="summer-logo summer-logo--text"><span class="summer-logo__icon"><%= (siteTitle || 'D').charAt(0).toUpperCase() %></span><span><%= siteTitle %></span></span>
|
|
23
|
+
<% } %>
|
|
24
|
+
</div>
|
|
25
|
+
<% if (_fc.description) { %>
|
|
26
|
+
<p class="summer-footer__desc"><%= _fc.description %></p>
|
|
27
|
+
<% } %>
|
|
28
|
+
</div>
|
|
29
|
+
<% _fc.columns.forEach(col => { %>
|
|
30
|
+
<div class="summer-footer__col">
|
|
31
|
+
<h4 class="summer-footer__col-title"><%= col.title %></h4>
|
|
32
|
+
<ul>
|
|
33
|
+
<% (col.links || []).forEach(link => { %>
|
|
34
|
+
<li><a href="<%= link.external ? (link.url || '#') : buildRelativeUrl(link.url || '#') %>" <%= link.external ? 'target="_blank" rel="noopener noreferrer"' : '' %>><%= link.text %></a></li>
|
|
35
|
+
<% }) %>
|
|
36
|
+
</ul>
|
|
37
|
+
</div>
|
|
38
|
+
<% }) %>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="summer-footer__inner">
|
|
41
|
+
<div class="summer-footer__user"><%- footerHtml || (_fc.copyright ? _fc.copyright : '') %></div>
|
|
42
|
+
<% if (_fc.branding !== false) { %>
|
|
43
|
+
<div class="summer-footer__branding">
|
|
44
|
+
<span><%= typeof t === 'function' ? t('builtWith') : 'Built with' %></span>
|
|
45
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path></svg>
|
|
46
|
+
<a href="https://docmd.io" target="_blank" rel="noopener">docmd</a>
|
|
47
|
+
<span style="margin: 0 6px; opacity: 0.5;">·</span>
|
|
48
|
+
<a href="https://github.com/sponsors/mgks" target="_blank" rel="noopener" style="display: inline-flex; align-items: center; gap: 4px;">
|
|
49
|
+
<svg viewBox="0 0 24 24" fill="currentColor" stroke="none" width="14" height="14"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
|
50
|
+
<span>Sponsor</span>
|
|
51
|
+
</a>
|
|
52
|
+
</div>
|
|
53
|
+
<% } %>
|
|
54
|
+
</div>
|
|
55
|
+
</footer>
|
|
56
|
+
<% } else { %>
|
|
57
|
+
<footer class="summer-footer">
|
|
58
|
+
<div class="summer-footer__inner">
|
|
59
|
+
<div class="summer-footer__user"><%- footerHtml || (_fc?.copyright ? _fc.copyright : '') %></div>
|
|
60
|
+
<% if (_fc?.branding !== false) { %>
|
|
61
|
+
<div class="summer-footer__branding">
|
|
62
|
+
<span><%= typeof t === 'function' ? t('builtWith') : 'Built with' %></span>
|
|
63
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path></svg>
|
|
64
|
+
<a href="https://docmd.io" target="_blank" rel="noopener">docmd</a>
|
|
65
|
+
</div>
|
|
66
|
+
<% } %>
|
|
67
|
+
</div>
|
|
68
|
+
</footer>
|
|
69
|
+
<% } %>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<%# ---------------------------------------------------------------
|
|
2
|
+
# @docmd/template-summer — partials/menubar.ejs
|
|
3
|
+
#
|
|
4
|
+
# Sits in a sticky sub-nav bar BELOW the top header. Each item is
|
|
5
|
+
# rendered as a tab. Supports dropdowns, icons, and a trailing
|
|
6
|
+
# action slot (right side of the bar) used for tertiary controls.
|
|
7
|
+
# ---------------------------------------------------------------
|
|
8
|
+
%>
|
|
9
|
+
<%
|
|
10
|
+
const menubar = (typeof menubarConfig !== 'undefined' ? menubarConfig : (locals.menubarConfig || {}));
|
|
11
|
+
const left = Array.isArray(menubar.left) ? menubar.left : [];
|
|
12
|
+
const right = Array.isArray(menubar.right) ? menubar.right : [];
|
|
13
|
+
|
|
14
|
+
// Detect the active item: prefer explicit `active` flag, else match by URL
|
|
15
|
+
function isActive(item) {
|
|
16
|
+
if (item.active) return true;
|
|
17
|
+
if (!currentPagePath) return false;
|
|
18
|
+
const itemUrl = (item.url || item.path || '').replace(/^\/+/, '').replace(/^index\.html$/, '').replace(/\/$/, '');
|
|
19
|
+
const cur = (currentPagePath || '').replace(/^\/+/, '').replace(/^index\.html$/, '').replace(/\/$/, '');
|
|
20
|
+
if (!itemUrl) return false;
|
|
21
|
+
return cur === itemUrl || cur.startsWith(itemUrl + '/');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function itemHref(item) {
|
|
25
|
+
if (item.url) return buildRelativeUrl(item.url);
|
|
26
|
+
if (item.path) return buildRelativeUrl(item.path);
|
|
27
|
+
return '#';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function renderTab(item) {
|
|
31
|
+
const active = isActive(item);
|
|
32
|
+
const href = itemHref(item);
|
|
33
|
+
const external = !!item.external;
|
|
34
|
+
const target = external ? ' target="_blank" rel="noopener noreferrer"' : '';
|
|
35
|
+
const cls = 'summer-subnav__tab' + (active ? ' active' : '');
|
|
36
|
+
const icon = item.icon ? `<span class="summer-subnav__tab-icon">${renderIcon(item.icon)}</span>` : '';
|
|
37
|
+
const text = item.text || item.title || '';
|
|
38
|
+
return `<a href="${href}" class="${cls}"${target}${active ? ' aria-current="page"' : ''}>${icon}<span>${text}</span>${external ? '<span class="summer-subnav__tab-chevron">↗</span>' : ''}</a>`;
|
|
39
|
+
}
|
|
40
|
+
%>
|
|
41
|
+
<div class="summer-subnav__inner">
|
|
42
|
+
<% left.forEach(item => { %>
|
|
43
|
+
<% if (item.type === 'dropdown') { %>
|
|
44
|
+
<div class="summer-subnav__dropdown" data-summer-dropdown>
|
|
45
|
+
<button type="button" class="summer-subnav__tab" aria-haspopup="true" aria-expanded="false">
|
|
46
|
+
<% if (item.icon) { %><span class="summer-subnav__tab-icon"><%- renderIcon(item.icon) %></span><% } %>
|
|
47
|
+
<span><%= item.text || item.title %></span>
|
|
48
|
+
<span class="summer-subnav__tab-chevron"><%- renderIcon('chevron-down', { class: 'summer-subnav__tab-chev' }) %></span>
|
|
49
|
+
</button>
|
|
50
|
+
<div class="summer-subnav__menu" role="menu">
|
|
51
|
+
<% (item.items || []).forEach(sub => { %>
|
|
52
|
+
<a href="<%= sub.external ? (sub.url || '#') : buildRelativeUrl(sub.url || sub.path || '#') %>" class="summer-subnav__menuitem" role="menuitem" <%= sub.external ? 'target="_blank" rel="noopener noreferrer"' : '' %>>
|
|
53
|
+
<% if (sub.icon) { %><span class="summer-subnav__menuitem-icon"><%- renderIcon(sub.icon) %></span><% } %>
|
|
54
|
+
<span><%= sub.text || sub.title %></span>
|
|
55
|
+
<% if (sub.description) { %><span class="summer-subnav__menuitem-desc"><%= sub.description %></span><% } %>
|
|
56
|
+
</a>
|
|
57
|
+
<% }) %>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
<% } else { %>
|
|
61
|
+
<%- renderTab(item) %>
|
|
62
|
+
<% } %>
|
|
63
|
+
<% }) %>
|
|
64
|
+
|
|
65
|
+
<% if (left.length && right.length) { %>
|
|
66
|
+
<div class="summer-subnav__spacer"></div>
|
|
67
|
+
<% } %>
|
|
68
|
+
|
|
69
|
+
<div class="summer-subnav__right">
|
|
70
|
+
<% right.forEach(item => { %>
|
|
71
|
+
<% if (item.type === 'dropdown') { %>
|
|
72
|
+
<div class="summer-subnav__dropdown" data-summer-dropdown>
|
|
73
|
+
<button type="button" class="summer-subnav__tab" aria-haspopup="true" aria-expanded="false">
|
|
74
|
+
<% if (item.icon) { %><span class="summer-subnav__tab-icon"><%- renderIcon(item.icon) %></span><% } %>
|
|
75
|
+
<span><%= item.text || item.title %></span>
|
|
76
|
+
<span class="summer-subnav__tab-chevron"><%- renderIcon('chevron-down', { class: 'summer-subnav__tab-chev' }) %></span>
|
|
77
|
+
</button>
|
|
78
|
+
<div class="summer-subnav__menu" role="menu">
|
|
79
|
+
<% (item.items || []).forEach(sub => { %>
|
|
80
|
+
<a href="<%= sub.external ? (sub.url || '#') : buildRelativeUrl(sub.url || sub.path || '#') %>" class="summer-subnav__menuitem" role="menuitem" <%= sub.external ? 'target="_blank" rel="noopener noreferrer"' : '' %>>
|
|
81
|
+
<% if (sub.icon) { %><span class="summer-subnav__menuitem-icon"><%- renderIcon(sub.icon) %></span><% } %>
|
|
82
|
+
<span><%= sub.text || sub.title %></span>
|
|
83
|
+
</a>
|
|
84
|
+
<% }) %>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
<% } else { %>
|
|
88
|
+
<%- renderTab(item) %>
|
|
89
|
+
<% } %>
|
|
90
|
+
<% }) %>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<%# ---------------------------------------------------------------
|
|
2
|
+
# @docmd/template-summer — partials/options-menu.ejs
|
|
3
|
+
#
|
|
4
|
+
# Custom options menu for summer template. The search component is
|
|
5
|
+
# intentionally NOT rendered here because the top-bar already
|
|
6
|
+
# shows the search button. The remaining discrete actions
|
|
7
|
+
# (theme switch, language, project switcher, sponsor) are surfaced
|
|
8
|
+
# as icon buttons, styled with `.summer-iconbtn`.
|
|
9
|
+
# ---------------------------------------------------------------
|
|
10
|
+
%>
|
|
11
|
+
<% if (optionsMenu && optionsMenu.components) { %>
|
|
12
|
+
<div class="summer-options-menu" data-summer-options-menu>
|
|
13
|
+
<%# Note: search is rendered separately in the topbar, see layout.ejs %>
|
|
14
|
+
|
|
15
|
+
<% if (locals.workspace && workspace.switcher.enabled && workspace.switcher.position === 'options-menu') { %>
|
|
16
|
+
<div class="summer-options-menu__item">
|
|
17
|
+
<%- await include('project-switcher', { workspace, config, renderIcon, compact: true }) %>
|
|
18
|
+
</div>
|
|
19
|
+
<% } %>
|
|
20
|
+
|
|
21
|
+
<% if (locals.allLocales && allLocales && allLocales.length > 1 && locals.config && config.i18n && config.i18n.position === 'options-menu') { %>
|
|
22
|
+
<div class="summer-options-menu__item">
|
|
23
|
+
<%- await include('language-switcher', { allLocales, activeLocale: locals.activeLocale, defaultLocale: locals.defaultLocale, config, renderIcon, compact: true, currentPagePath: locals.currentPagePath, localePrefix: locals.localePrefix }) %>
|
|
24
|
+
</div>
|
|
25
|
+
<% } %>
|
|
26
|
+
|
|
27
|
+
<% if (optionsMenu.components.themeSwitch !== false) { %>
|
|
28
|
+
<button class="summer-iconbtn" data-summer-theme-toggle aria-label="<%= typeof t === 'function' ? t('toggleTheme') : 'Toggle theme' %>">
|
|
29
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>
|
|
30
|
+
</button>
|
|
31
|
+
<% } %>
|
|
32
|
+
|
|
33
|
+
<% if (optionsMenu.components.sponsor) { %>
|
|
34
|
+
<a href="<%= optionsMenu.components.sponsor %>" target="_blank" rel="noopener noreferrer" class="summer-iconbtn" aria-label="<%= typeof t === 'function' ? t('sponsor') : 'Sponsor' %>">
|
|
35
|
+
<svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
|
36
|
+
</a>
|
|
37
|
+
<% } %>
|
|
38
|
+
|
|
39
|
+
<% if (optionsMenu.components.github) { %>
|
|
40
|
+
<a href="<%= optionsMenu.components.github %>" target="_blank" rel="noopener noreferrer" class="summer-iconbtn" aria-label="GitHub">
|
|
41
|
+
<svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 .5C5.4.5 0 5.9 0 12.5c0 5.3 3.4 9.8 8.2 11.4.6.1.8-.3.8-.6v-2.2c-3.3.7-4-1.6-4-1.6-.5-1.4-1.3-1.7-1.3-1.7-1.1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1.1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.8-1.6-2.7-.3-5.5-1.3-5.5-6 0-1.3.5-2.4 1.3-3.2-.1-.3-.6-1.5.1-3.2 0 0 1-.3 3.3 1.2 1-.3 2-.4 3-.4s2 .1 3 .4c2.3-1.5 3.3-1.2 3.3-1.2.7 1.7.2 2.9.1 3.2.8.8 1.3 1.9 1.3 3.2 0 4.7-2.8 5.7-5.5 6 .4.4.8 1.1.8 2.3v3.4c0 .3.2.7.8.6 4.8-1.6 8.2-6.1 8.2-11.4C24 5.9 18.6.5 12 .5z"/></svg>
|
|
42
|
+
</a>
|
|
43
|
+
<% } %>
|
|
44
|
+
</div>
|
|
45
|
+
<% } %>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<%# ---------------------------------------------------------------
|
|
2
|
+
# @docmd/template-summer — toc.ejs
|
|
3
|
+
#
|
|
4
|
+
# Right-rail table of contents. We re-use the heading detection
|
|
5
|
+
# logic from the default template so the template stays
|
|
6
|
+
# plug-and-play, then style the result with `.summer-toc__*`
|
|
7
|
+
# classes that the rest of the stylesheet targets.
|
|
8
|
+
# ---------------------------------------------------------------
|
|
9
|
+
%>
|
|
10
|
+
|
|
11
|
+
<%
|
|
12
|
+
function decodeHtmlEntities(html) {
|
|
13
|
+
return String(html).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(/ /g, ' ');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Skip on the no-style fallback and on pages that opt out via frontmatter.
|
|
17
|
+
const _tocDisabled = (frontmatter && (frontmatter.toc === false || frontmatter.toc === 'false' || frontmatter.toc === 'hidden'));
|
|
18
|
+
if (!_tocDisabled) {
|
|
19
|
+
let tocHeadings = [];
|
|
20
|
+
if (typeof headings !== 'undefined' && Array.isArray(headings) && headings.length > 0) {
|
|
21
|
+
tocHeadings = headings.filter(h => h.level >= 1 && h.level <= 4);
|
|
22
|
+
} else if (typeof content !== 'undefined' && content) {
|
|
23
|
+
const headingRegex = /<h([1-4])[^>]*?(?:id="([^"]*)")?[^>]*?>([\s\S]*?)<\/h\1>/g;
|
|
24
|
+
let match;
|
|
25
|
+
const contentStr = content.toString();
|
|
26
|
+
while ((match = headingRegex.exec(contentStr)) !== null) {
|
|
27
|
+
const level = parseInt(match[1], 10);
|
|
28
|
+
let id = match[2];
|
|
29
|
+
const text = decodeHtmlEntities(match[3].replace(/<\/?\w+[^>]*>/g, ''));
|
|
30
|
+
if (!id) id = text.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '').replace(/--+/g, '-').replace(/^-+|-+$/g, '');
|
|
31
|
+
tocHeadings.push({ id, level, text });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (tocHeadings.length > 1) {
|
|
36
|
+
// Build a nested list (preserve heading level)
|
|
37
|
+
let lastLevel = 0;
|
|
38
|
+
%>
|
|
39
|
+
<aside class="summer-toc__inner">
|
|
40
|
+
<h2 class="summer-toc__title">On this page</h2>
|
|
41
|
+
<ul class="summer-toc__list">
|
|
42
|
+
<% tocHeadings.forEach((heading, idx) => {
|
|
43
|
+
const indent = Math.max(0, heading.level - 1);
|
|
44
|
+
const prevHeading = idx > 0 ? tocHeadings[idx - 1] : null;
|
|
45
|
+
const prevLevel = prevHeading ? prevHeading.level : heading.level;
|
|
46
|
+
%>
|
|
47
|
+
<li class="summer-toc__item summer-toc__item--level-<%= heading.level %>" data-prev-level="<%= prevLevel %>" data-level="<%= heading.level %>">
|
|
48
|
+
<a href="#<%= heading.id %>" class="summer-toc__link" data-toc-level="<%= heading.level %>"><%= decodeHtmlEntities(heading.text.replace(/<[^>]*>?/gm, '')) %></a>
|
|
49
|
+
</li>
|
|
50
|
+
<% }) %>
|
|
51
|
+
</ul>
|
|
52
|
+
</aside>
|
|
53
|
+
<% } } %>
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@docmd/template-summer",
|
|
3
|
+
"version": "0.8.6",
|
|
4
|
+
"description": "Summer template for docmd 0.8.7+",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^25.9.3",
|
|
19
|
+
"esbuild": "^0.28.1",
|
|
20
|
+
"typescript": "^5.9.3",
|
|
21
|
+
"@docmd/api": "0.8.7"
|
|
22
|
+
},
|
|
23
|
+
"docmd": {
|
|
24
|
+
"kind": "template",
|
|
25
|
+
"displayName": "Summer",
|
|
26
|
+
"tagline": "A bright, hopeful, summer-feel layout with a top search bar.",
|
|
27
|
+
"preview": "assets/css/summer.css"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"docmd",
|
|
31
|
+
"docmd-template",
|
|
32
|
+
"template",
|
|
33
|
+
"summer",
|
|
34
|
+
"documentation",
|
|
35
|
+
"theme"
|
|
36
|
+
],
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"author": {
|
|
41
|
+
"name": "Ghazi",
|
|
42
|
+
"url": "https://mgks.dev"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/docmd-io/docmd",
|
|
47
|
+
"directory": "packages/templates/summer"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/docmd-io/docmd/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://docmd.io",
|
|
53
|
+
"funding": {
|
|
54
|
+
"github": "https://github.com/sponsors/mgks"
|
|
55
|
+
},
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"scripts": {
|
|
58
|
+
"build": "tsc && node scripts/copy-assets.mjs",
|
|
59
|
+
"clean": "rm -rf dist"
|
|
60
|
+
}
|
|
61
|
+
}
|