566 lines
19 KiB
C
566 lines
19 KiB
C
/*
|
|
* KiCad Project Template HTML defaults
|
|
* Extracted from dialog_template_selector.cpp to allow reuse and to provide
|
|
* a styled fallback page when a template does not supply an info.html.
|
|
*/
|
|
|
|
#ifndef KICAD_TEMPLATE_DEFAULT_HTML_H
|
|
#define KICAD_TEMPLATE_DEFAULT_HTML_H
|
|
|
|
#include <wx/string.h>
|
|
|
|
// Uses _() translation macro which is defined globally in KiCad builds.
|
|
|
|
namespace
|
|
{
|
|
|
|
// Common CSS variables and base styles shared across all template HTML pages.
|
|
inline wxString GetCommonStyles()
|
|
{
|
|
return wxString( R"(
|
|
:root {
|
|
color-scheme: light dark;
|
|
|
|
--bg-primary: light-dark(#FFFFFF, #1E1E1E);
|
|
--bg-secondary: light-dark(#F3F3F3, #2D2D2D);
|
|
--bg-elevated: light-dark(#FFFFFF, #333333);
|
|
--text-primary: light-dark(#1F2328, #DED3DD);
|
|
--text-secondary: light-dark(#545454, #848484);
|
|
--accent: light-dark(#1A81C4, #42B8EB);
|
|
--accent-subtle: light-dark(rgba(26, 129, 196, 0.08), rgba(66, 184, 235, 0.1));
|
|
--border: light-dark(#E0E0E0, #404040);
|
|
--shadow: light-dark(0 1px 3px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.2));
|
|
}
|
|
|
|
body {
|
|
background-color: var(--bg-primary);
|
|
color: var(--text-primary);
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
}
|
|
|
|
a, a:link {
|
|
color: light-dark(#0D4A8B, #A7D7FC);
|
|
}
|
|
|
|
a:hover{
|
|
color: light-dark(#0A2540, #EBF5FE);
|
|
}
|
|
|
|
a:visited {
|
|
color: light-dark(#7C3EAE, #E9DDFC);
|
|
}
|
|
|
|
img {
|
|
max-width: 100%;
|
|
height: auto;
|
|
}
|
|
|
|
)" );
|
|
}
|
|
|
|
// SVG icon for template/document
|
|
inline wxString GetTemplateIcon()
|
|
{
|
|
return wxString(
|
|
"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" "
|
|
"stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">"
|
|
"<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>"
|
|
"<polyline points=\"14 2 14 8 20 8\"/>"
|
|
"<line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/>"
|
|
"<line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/>"
|
|
"<polyline points=\"10 9 9 9 8 9\"/>"
|
|
"</svg>"
|
|
);
|
|
}
|
|
|
|
// SVG icon for settings/gear
|
|
inline wxString GetSettingsIcon()
|
|
{
|
|
return wxString(
|
|
"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" "
|
|
"stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">"
|
|
"<circle cx=\"12\" cy=\"12\" r=\"3\"/>"
|
|
"<path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06"
|
|
"a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09"
|
|
"A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83"
|
|
"l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09"
|
|
"A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0"
|
|
"l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09"
|
|
"a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83"
|
|
"l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09"
|
|
"a1.65 1.65 0 0 0-1.51 1z\"/>"
|
|
"</svg>"
|
|
);
|
|
}
|
|
|
|
// SVG icon for layers/stack
|
|
inline wxString GetLayersIcon()
|
|
{
|
|
return wxString(
|
|
"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" "
|
|
"stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">"
|
|
"<polygon points=\"12 2 2 7 12 12 22 7 12 2\"/>"
|
|
"<polyline points=\"2 17 12 22 22 17\"/>"
|
|
"<polyline points=\"2 12 12 17 22 12\"/>"
|
|
"</svg>"
|
|
);
|
|
}
|
|
|
|
// SVG icon for folder
|
|
inline wxString GetFolderIcon()
|
|
{
|
|
return wxString(
|
|
"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" "
|
|
"stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">"
|
|
"<path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/>"
|
|
"</svg>"
|
|
);
|
|
}
|
|
|
|
// SVG icon for info/lightbulb
|
|
inline wxString GetInfoIcon()
|
|
{
|
|
return wxString(
|
|
"<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" "
|
|
"stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">"
|
|
"<circle cx=\"12\" cy=\"12\" r=\"10\"/>"
|
|
"<line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>"
|
|
"<line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>"
|
|
"</svg>"
|
|
);
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
// Welcome page shown when no template is selected.
|
|
inline wxString GetWelcomeHtml( bool aDarkMode )
|
|
{
|
|
wxString bodyClass = aDarkMode ? wxS( "kicad-dark" ) : wxS( "" );
|
|
|
|
return wxString(
|
|
"<!DOCTYPE html>"
|
|
"<html lang=\"en\">"
|
|
"<head>"
|
|
"<meta charset=\"UTF-8\">"
|
|
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">"
|
|
"<title>KiCad Project Template Selector</title>"
|
|
"<style>" )
|
|
+ GetCommonStyles() +
|
|
wxString(
|
|
".card {"
|
|
"max-width: 600px;"
|
|
"margin: 0 auto;"
|
|
"background: var(--bg-elevated);"
|
|
"border-radius: 8px;"
|
|
"padding: 32px;"
|
|
"box-shadow: var(--shadow);"
|
|
"border: 1px solid var(--border);"
|
|
"}"
|
|
".header {"
|
|
"text-align: center;"
|
|
"margin-bottom: 28px;"
|
|
"}"
|
|
".title {"
|
|
"font-size: 1.5rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"margin: 0 0 8px 0;"
|
|
"}"
|
|
".subtitle {"
|
|
"font-size: 0.95rem;"
|
|
"color: var(--text-secondary);"
|
|
"margin: 0;"
|
|
"}"
|
|
".features {"
|
|
"display: flex;"
|
|
"flex-direction: column;"
|
|
"gap: 16px;"
|
|
"margin-bottom: 28px;"
|
|
"}"
|
|
".feature {"
|
|
"display: flex;"
|
|
"align-items: flex-start;"
|
|
"gap: 14px;"
|
|
"padding: 14px;"
|
|
"background: var(--bg-secondary);"
|
|
"border-radius: 6px;"
|
|
"}"
|
|
".feature-icon {"
|
|
"flex-shrink: 0;"
|
|
"width: 40px;"
|
|
"height: 40px;"
|
|
"display: flex;"
|
|
"align-items: center;"
|
|
"justify-content: center;"
|
|
"background: var(--accent-subtle);"
|
|
"border-radius: 8px;"
|
|
"color: var(--accent);"
|
|
"}"
|
|
".feature-content h3 {"
|
|
"margin: 0 0 4px 0;"
|
|
"font-size: 0.95rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"}"
|
|
".feature-content p {"
|
|
"margin: 0;"
|
|
"font-size: 0.875rem;"
|
|
"color: var(--text-secondary);"
|
|
"}"
|
|
".tip {"
|
|
"display: flex;"
|
|
"align-items: flex-start;"
|
|
"gap: 10px;"
|
|
"padding: 12px 14px;"
|
|
"background: var(--accent-subtle);"
|
|
"border-radius: 6px;"
|
|
"border-left: 3px solid var(--accent);"
|
|
"}"
|
|
".tip-icon {"
|
|
"flex-shrink: 0;"
|
|
"color: var(--accent);"
|
|
"}"
|
|
".tip-text {"
|
|
"font-size: 0.875rem;"
|
|
"color: var(--text-secondary);"
|
|
"margin: 0;"
|
|
"}"
|
|
"</style>"
|
|
"</head>"
|
|
"<body class=\"" ) + bodyClass + wxString( "\">"
|
|
"<div class=\"card\">"
|
|
"<div class=\"header\">"
|
|
"<h1 class=\"title\">" ) + _( "Select a Template" ) + wxString( "</h1>"
|
|
"<p class=\"subtitle\">" )
|
|
+ _( "Templates provide pre-configured project structures to jumpstart your design." )
|
|
+ wxString( "</p>"
|
|
"</div>"
|
|
"<div class=\"features\">"
|
|
"<div class=\"feature\">"
|
|
"<div class=\"feature-icon\">" ) + GetTemplateIcon() + wxString( "</div>"
|
|
"<div class=\"feature-content\">"
|
|
"<h3>" ) + _( "Pre-configured Libraries" ) + wxString( "</h3>"
|
|
"<p>" ) + _( "Common symbols and footprints already linked and ready to use." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"feature\">"
|
|
"<div class=\"feature-icon\">" ) + GetSettingsIcon() + wxString( "</div>"
|
|
"<div class=\"feature-content\">"
|
|
"<h3>" ) + _( "Design Rules" ) + wxString( "</h3>"
|
|
"<p>" ) + _( "Electrical and mechanical constraints configured for the intended application." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"feature\">"
|
|
"<div class=\"feature-icon\">" ) + GetLayersIcon() + wxString( "</div>"
|
|
"<div class=\"feature-content\">"
|
|
"<h3>" ) + _( "Board Stackups" ) + wxString( "</h3>"
|
|
"<p>" ) + _( "Layer configurations optimized for common manufacturing processes." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"tip\">"
|
|
"<div class=\"tip-icon\">" ) + GetInfoIcon() + wxString( "</div>"
|
|
"<p class=\"tip-text\">" )
|
|
+ _( "Recently used templates appear at the top. Use the folder icon to browse custom template directories." )
|
|
+ wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"</body>"
|
|
"</html>"
|
|
);
|
|
}
|
|
|
|
|
|
// Fallback when a specific template has no meta/info.html.
|
|
inline wxString GetTemplateInfoHtml( const wxString& aTemplateName, bool aDarkMode )
|
|
{
|
|
wxString bodyClass = aDarkMode ? wxS( "kicad-dark" ) : wxS( "" );
|
|
|
|
return wxString(
|
|
"<!DOCTYPE html>"
|
|
"<html lang=\"en\">"
|
|
"<head>"
|
|
"<meta charset=\"UTF-8\">"
|
|
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">"
|
|
"<title>" ) + aTemplateName + wxString( " - KiCad Template</title>"
|
|
"<style>" )
|
|
+ GetCommonStyles() +
|
|
wxString(
|
|
".card {"
|
|
"max-width: 600px;"
|
|
"margin: 0 auto;"
|
|
"background: var(--bg-elevated);"
|
|
"border-radius: 8px;"
|
|
"padding: 28px;"
|
|
"box-shadow: var(--shadow);"
|
|
"border: 1px solid var(--border);"
|
|
"}"
|
|
".header {"
|
|
"display: flex;"
|
|
"align-items: center;"
|
|
"gap: 12px;"
|
|
"margin-bottom: 20px;"
|
|
"}"
|
|
".badge {"
|
|
"background: var(--accent);"
|
|
"color: #FFFFFF;"
|
|
"padding: 4px 10px;"
|
|
"border-radius: 4px;"
|
|
"font-size: 0.75rem;"
|
|
"font-weight: 600;"
|
|
"letter-spacing: 0.03em;"
|
|
"text-transform: uppercase;"
|
|
"}"
|
|
".template-name {"
|
|
"font-size: 1.25rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"margin: 0;"
|
|
"}"
|
|
".description {"
|
|
"color: var(--text-secondary);"
|
|
"margin-bottom: 24px;"
|
|
"}"
|
|
".steps {"
|
|
"background: var(--bg-secondary);"
|
|
"border-radius: 6px;"
|
|
"padding: 20px;"
|
|
"margin-bottom: 20px;"
|
|
"}"
|
|
".steps-title {"
|
|
"font-size: 0.875rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"margin: 0 0 16px 0;"
|
|
"}"
|
|
".step {"
|
|
"display: flex;"
|
|
"gap: 12px;"
|
|
"margin-bottom: 14px;"
|
|
"}"
|
|
".step:last-child {"
|
|
"margin-bottom: 0;"
|
|
"}"
|
|
".step-number {"
|
|
"flex-shrink: 0;"
|
|
"width: 24px;"
|
|
"height: 24px;"
|
|
"display: flex;"
|
|
"align-items: center;"
|
|
"justify-content: center;"
|
|
"background: var(--accent);"
|
|
"color: #FFFFFF;"
|
|
"border-radius: 50%;"
|
|
"font-size: 0.75rem;"
|
|
"font-weight: 600;"
|
|
"}"
|
|
".step-content h4 {"
|
|
"margin: 0 0 2px 0;"
|
|
"font-size: 0.875rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"}"
|
|
".step-content p {"
|
|
"margin: 0;"
|
|
"font-size: 0.8125rem;"
|
|
"color: var(--text-secondary);"
|
|
"}"
|
|
".hint {"
|
|
"display: flex;"
|
|
"align-items: flex-start;"
|
|
"gap: 10px;"
|
|
"padding: 12px 14px;"
|
|
"background: var(--accent-subtle);"
|
|
"border-radius: 6px;"
|
|
"border-left: 3px solid var(--accent);"
|
|
"}"
|
|
".hint-icon {"
|
|
"flex-shrink: 0;"
|
|
"color: var(--accent);"
|
|
"}"
|
|
".hint-text {"
|
|
"font-size: 0.8125rem;"
|
|
"color: var(--text-secondary);"
|
|
"margin: 0;"
|
|
"}"
|
|
"code {"
|
|
"background: var(--bg-secondary);"
|
|
"padding: 2px 6px;"
|
|
"border-radius: 3px;"
|
|
"font-size: 0.8125rem;"
|
|
"font-family: 'SF Mono', Monaco, Consolas, monospace;"
|
|
"}"
|
|
"</style>"
|
|
"</head>"
|
|
"<body class=\"" ) + bodyClass + wxString( "\">"
|
|
"<div class=\"card\">"
|
|
"<div class=\"header\">"
|
|
"<span class=\"badge\">" ) + _( "Template" ) + wxString( "</span>"
|
|
"<h1 class=\"template-name\">" ) + aTemplateName + wxString( "</h1>"
|
|
"</div>"
|
|
"<p class=\"description\">" )
|
|
+ _( "This template does not include a description. You can still use it to create a new project." )
|
|
+ wxString( "</p>"
|
|
"<div class=\"steps\">"
|
|
"<h3 class=\"steps-title\">" ) + _( "To use this template" ) + wxString( "</h3>"
|
|
"<div class=\"step\">"
|
|
"<span class=\"step-number\">1</span>"
|
|
"<div class=\"step-content\">"
|
|
"<h4>" ) + _( "Create the project" ) + wxString( "</h4>"
|
|
"<p>" ) + _( "Click OK to create a new project folder with this template's contents." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"step\">"
|
|
"<span class=\"step-number\">2</span>"
|
|
"<div class=\"step-content\">"
|
|
"<h4>" ) + _( "Open schematic and PCB" ) + wxString( "</h4>"
|
|
"<p>" ) + _( "Use the Project Manager to launch the Schematic and PCB editors." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"step\">"
|
|
"<span class=\"step-number\">3</span>"
|
|
"<div class=\"step-content\">"
|
|
"<h4>" ) + _( "Review settings" ) + wxString( "</h4>"
|
|
"<p>" ) + _( "Verify libraries, design rules, and board stackup match your needs." ) + wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"</div>"
|
|
"<div class=\"hint\">"
|
|
"<div class=\"hint-icon\">" ) + GetInfoIcon() + wxString( "</div>"
|
|
"<p class=\"hint-text\">" )
|
|
+ _( "Add a description by creating" ) + wxString( " <code>meta/info.html</code> " )
|
|
+ _( "inside this template's directory." )
|
|
+ wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"</body>"
|
|
"</html>"
|
|
);
|
|
}
|
|
|
|
|
|
// Page shown when a template directory has no templates.
|
|
inline wxString GetNoTemplatesHtml( bool aDarkMode )
|
|
{
|
|
wxString bodyClass = aDarkMode ? wxS( "kicad-dark" ) : wxS( "" );
|
|
|
|
return wxString(
|
|
"<!DOCTYPE html>"
|
|
"<html lang=\"en\">"
|
|
"<head>"
|
|
"<meta charset=\"UTF-8\">"
|
|
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">"
|
|
"<title>No Templates - KiCad</title>"
|
|
"<style>" )
|
|
+ GetCommonStyles() +
|
|
wxString(
|
|
".card {"
|
|
"max-width: 500px;"
|
|
"margin: 0 auto;"
|
|
"background: var(--bg-elevated);"
|
|
"border-radius: 8px;"
|
|
"padding: 32px;"
|
|
"box-shadow: var(--shadow);"
|
|
"border: 1px solid var(--border);"
|
|
"text-align: center;"
|
|
"}"
|
|
".icon {"
|
|
"width: 56px;"
|
|
"height: 56px;"
|
|
"margin: 0 auto 20px auto;"
|
|
"display: flex;"
|
|
"align-items: center;"
|
|
"justify-content: center;"
|
|
"background: var(--bg-secondary);"
|
|
"border-radius: 50%;"
|
|
"color: var(--text-secondary);"
|
|
"}"
|
|
".icon svg {"
|
|
"width: 28px;"
|
|
"height: 28px;"
|
|
"}"
|
|
".title {"
|
|
"font-size: 1.25rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"margin: 0 0 8px 0;"
|
|
"}"
|
|
".message {"
|
|
"color: var(--text-secondary);"
|
|
"margin: 0 0 24px 0;"
|
|
"}"
|
|
".suggestions {"
|
|
"text-align: left;"
|
|
"background: var(--bg-secondary);"
|
|
"border-radius: 6px;"
|
|
"padding: 16px 20px;"
|
|
"margin-bottom: 20px;"
|
|
"}"
|
|
".suggestions-title {"
|
|
"font-size: 0.875rem;"
|
|
"font-weight: 600;"
|
|
"color: var(--text-primary);"
|
|
"margin: 0 0 12px 0;"
|
|
"}"
|
|
".suggestions ul {"
|
|
"margin: 0;"
|
|
"padding-left: 20px;"
|
|
"color: var(--text-secondary);"
|
|
"font-size: 0.875rem;"
|
|
"}"
|
|
".suggestions li {"
|
|
"margin-bottom: 8px;"
|
|
"}"
|
|
".suggestions li:last-child {"
|
|
"margin-bottom: 0;"
|
|
"}"
|
|
".tip {"
|
|
"display: flex;"
|
|
"align-items: flex-start;"
|
|
"gap: 10px;"
|
|
"padding: 12px 14px;"
|
|
"background: var(--accent-subtle);"
|
|
"border-radius: 6px;"
|
|
"text-align: left;"
|
|
"}"
|
|
".tip-icon {"
|
|
"flex-shrink: 0;"
|
|
"color: var(--accent);"
|
|
"}"
|
|
".tip-text {"
|
|
"font-size: 0.8125rem;"
|
|
"color: var(--text-secondary);"
|
|
"margin: 0;"
|
|
"}"
|
|
"</style>"
|
|
"</head>"
|
|
"<body class=\"" ) + bodyClass + wxString( "\">"
|
|
"<div class=\"card\">"
|
|
"<div class=\"icon\">" ) + GetFolderIcon() + wxString( "</div>"
|
|
"<h1 class=\"title\">" ) + _( "No Templates Found" ) + wxString( "</h1>"
|
|
"<p class=\"message\">" )
|
|
+ _( "The selected directory does not contain any project templates." )
|
|
+ wxString( "</p>"
|
|
"<div class=\"suggestions\">"
|
|
"<h3 class=\"suggestions-title\">" ) + _( "Suggestions" ) + wxString( "</h3>"
|
|
"<ul>"
|
|
"<li>" ) + _( "Browse to a different directory using the folder icon" ) + wxString( "</li>"
|
|
"<li>" ) + _( "Use the refresh icon to reload the current directory" ) + wxString( "</li>"
|
|
"<li>" ) + _( "Switch to a system templates tab" ) + wxString( "</li>"
|
|
"</ul>"
|
|
"</div>"
|
|
"<div class=\"tip\">"
|
|
"<div class=\"tip-icon\">" ) + GetInfoIcon() + wxString( "</div>"
|
|
"<p class=\"tip-text\">" )
|
|
+ _( "Each template needs a 'meta' folder containing configuration files." )
|
|
+ wxString( "</p>"
|
|
"</div>"
|
|
"</div>"
|
|
"</body>"
|
|
"</html>"
|
|
);
|
|
}
|
|
|
|
#endif // KICAD_TEMPLATE_DEFAULT_HTML_H
|