Skip to content

Commit

Permalink
Shortcodes for tabbed panes:
Browse files Browse the repository at this point in the history
- allow tab content in markdown
- tab(s) can now be disabled
- improve storage of active language
- new option to turn storage of active language off
- improvements and fixes
- documentation update
  • Loading branch information
deining committed May 18, 2022
1 parent 9d41397 commit 95ee1e9
Show file tree
Hide file tree
Showing 15 changed files with 213 additions and 94 deletions.
1 change: 1 addition & 0 deletions assets/scss/main.scss
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
@import "pageinfo";
@import "taxonomy";
@import "drawio";
@import "shortcodes";

@if $td-enable-google-fonts {
@import url($web-font-path);
Expand Down
2 changes: 2 additions & 0 deletions assets/scss/shortcodes.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@import "shortcodes/tabbed-pane.scss";
@import "shortcodes/cards-pane.scss";
19 changes: 19 additions & 0 deletions assets/scss/shortcodes/cards-pane.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.card-deck {
max-width: 83%;
}
.card {
max-width: 80%;
.highlight {
border: none;
}
}
.card-body.code {
background-color: #f8f9fa;
padding: 0 0 0 1ex;
}
.card-body {
pre {
margin: 0;
padding: 0 1rem 1rem 1rem;
}
}
39 changes: 39 additions & 0 deletions assets/scss/shortcodes/tabbed-pane.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
.td-content {
.highlight {
margin: 0rem 0 2rem 0;
}
}
.tab-content {
.tab-pane {
.highlight {
border: none;
max-width: 100%;
}
pre {
border-left: 1px solid rgba(0, 0, 0, 0.125);
border-right: 1px solid rgba(0, 0, 0, 0.125);
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
margin: 0rem;
max-width: 80%;
border-left: none;
border-right: none;
border-bottom: none;
}
}

.tab-body {
font-weight: $font-weight-medium;
background: $gray-100;
color: inherit;
border-radius: 0;
padding: 1.5rem;

@each $color, $value in $theme-colors {
&-#{$color} {

border-style: solid;
border-color: $value;
}
}
}
24 changes: 15 additions & 9 deletions layouts/shortcodes/tab.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<!-- Make sure that we are enclosed within a tabpane shortcode block -->
{{ with $.Parent }}
{{- if ne $.Parent.Name "tabpane" -}}
{{- errorf "tab must be used within a tabpane block" -}}
{{- end -}}
{{- if ne $.Parent.Name "tabpane" -}}
{{- errorf "shortcode 'tab' must be used within a 'tabpane' block" -}}
{{- end -}}
{{- end -}}

<!-- Prefill header if not given as parameter -->
Expand All @@ -11,18 +11,24 @@
<!-- store all tab info in dict tab -->
{{ $tab := dict "header" $header }}
{{ with $.Get "lang" }}
{{ $tab = merge $tab (dict "language" ($.Get "lang")) }}
{{ $tab = merge $tab (dict "language" ($.Get "lang")) }}
{{ end }}
{{ with $.Get "highlight" }}
{{ $tab = merge $tab (dict "highlight" ($.Get "highlight")) }}
{{ $tab = merge $tab (dict "highlight" ($.Get "highlight")) }}
{{ end }}
{{ with $.Get "code" }}
{{ $tab = merge $tab (dict "code" ($.Get "code")) }}
{{ end }}
{{ with $.Get "disabled" }}
{{ $tab = merge $tab (dict "disabled" ($.Get "disabled")) }}
{{ end }}
{{ with $.Inner }}
<!-- Trim any leading and trailing newlines from .Inner, this avoids
spurious lines during syntax highlighting -->
{{ $tab = merge $tab (dict "content" (trim $.Inner "\n")) }}
<!-- Trim any leading and trailing newlines from .Inner, this avoids
spurious lines during syntax highlighting -->
{{ $tab = merge $tab (dict "content" $.Inner ) }}
{{ end }}

<!-- add dict tab to parent's scratchpad -->
{{ with .Parent }}
{{- $.Parent.Scratch.SetInMap "tabs" (printf "%v" $.Ordinal) $tab -}}
{{- $.Parent.Scratch.SetInMap "tabs" (printf "%v" $.Ordinal) $tab -}}
{{ end }}
113 changes: 95 additions & 18 deletions layouts/shortcodes/tabpane.html
Original file line number Diff line number Diff line change
@@ -1,46 +1,123 @@
<!-- Scratchpad gets populated through call to .Inner -->
<!-- Check parameter types -->
{{ with .Get "langEqualsHeader" }}
{{ if ne ( printf "%T" . ) "bool" }}
{{- errorf "shortcode tabpane: parameter 'langEqualsHeader' must be either true or false" -}}
{{ end }}
{{ end }}

{{ with .Get "code" }}
{{ if ne ( printf "%T" . ) "bool" }}
{{- errorf "shortcode tabpane: parameter 'code' must be either true or false" -}}
{{ end }}
{{ end }}

{{ with .Get "persistLang" }}
{{ if ne ( printf "%T" . ) "bool" }}
{{- errorf "shortcode tabpane: parameter 'persistLang' must be either true or false" -}}
{{ end }}
{{ end }}

<!-- Set values given defined within tabpane -->
{{- $langPane := default "" ($.Get "lang") -}}
{{- $hloptionsPane := default "" ($.Get "highlight") -}}
{{- $codePane := default true ($.Get "code") -}}
{{- $langEqualsHeader := default false ($.Get "langEqualsHeader") -}}
{{- $persistLang := default true ($.Get "persistLang") -}}
{{- $disabled := false -}}
{{- $activeSet := false -}}

<!-- Scratchpad gets populated through call to .Inner -->
{{- .Inner -}}

<ul class="nav nav-tabs" id="tabs-{{- $.Ordinal -}}" role="tablist">
{{- range $index, $element := $.Scratch.Get "tabs" -}}

{{- $lang := $langPane -}}
{{- if $langEqualsHeader -}}
{{- $lang = $element.header -}}
{{end}}
{{- with $element.language -}}
{{- $lang = $element.language -}}
{{- end -}}

{{- $disabled := false -}}
{{- with $element.disabled -}}
{{ if ne ( printf "%T" . ) "bool" }}
{{- errorf "shortcode tab: parameter 'disabled' must be either true or false" -}}
{{ end }}
{{- $disabled = . }}
{{- end -}}

<!-- Replace space and +, not valid for css selectors -->
{{- $lang := replaceRE "[\\s+]" "-" $lang -}}

<li class="nav-item">
<!-- Generate the IDs for the <a> and the <div> elements -->
{{- $tabid := printf "tabs-%v-%v-tab" $.Ordinal $index | anchorize -}}
{{- $entryid := printf "tabs-%v-%v" $.Ordinal $index | anchorize -}}
<!-- Replace space and + from tabname to set class -->
{{- $tabname := replaceRE "(\\s)" "-" $element.header -}}
{{- $tabname := replaceRE "(\\+)" "-" $tabname -}}
<a class="nav-link{{ if eq $index "0" }} active{{ end }} tab-{{ $tabname }}"
id="{{ $tabid }}" data-toggle="tab" href="#{{ $entryid }}" role="tab" onclick="handleClick({{ $tabname }});"
aria-controls="{{ $entryid }}" aria-selected="{{- cond (eq $index "0") "true" "false" -}}">
{{ index . "header" }}

<a class="nav-link{{ if and ( not $activeSet ) ( not $disabled ) }} active{{ end }}{{ if eq $disabled true }} disabled{{ end }}{{ if ne $lang "" }}{{ if $persistLang }} persistLang-{{- $lang -}}{{ end }}{{ end }}"
id="{{- $tabid -}}" data-toggle="tab" href="#{{ $entryid }}" role="tab"
{{ if ne $lang "" }}{{- if $persistLang -}}onclick="handleClick({{- $lang -}});"{{end}}{{end}}
aria-controls="{{- $entryid -}}" aria-selected="{{- cond (eq $index "0") "true" "false" -}}">
{{- index . "header" | markdownify -}}
</a>
</li>

{{ if not $disabled }}
{{ $activeSet = true }}
{{ end }}

{{- end -}}
</ul>

{{ $activeSet = false }}

<!-- Inner content -->
<div class="tab-content" id="tabs-{{- $.Ordinal -}}-content">
{{- range $index, $element := $.Scratch.Get "tabs" -}}

{{- $lang := default $.Site.Language.Lang ($.Get "lang") -}}
{{with $.Get "langEqualsHeader"}}
{{ if $.Get "langEqualsHeader"}}
{{ $lang = $element.header }}
{{end}}
{{- $lang := $langPane -}}
{{- if $langEqualsHeader -}}
{{- $lang = $element.header -}}
{{end}}
{{- $hloptions := default "" ($.Get "highlight") -}}
{{- with $element.language -}}
{{ $lang = $element.language }}
{{- $lang = $element.language -}}
{{- end -}}

{{- $disabled := false -}}
{{- with $element.disabled -}}
{{- $disabled = . }}
{{- end -}}

{{- $hloptions := $hloptionsPane -}}
{{- with $element.highlight -}}
{{ $hloptions = $element.highlight }}
{{- $hloptions = $element.highlight -}}
{{- end -}}

{{- $code := $codePane -}}
{{- with $element.code -}}
{{ if ne ( printf "%T" . ) "bool" }}
{{- errorf "shortcode tab: parameter 'code' must be either true or false" -}}
{{ end }}
{{- $code = . }}
{{- end -}}

{{- $tabid := printf "tabs-%v-%v-tab" $.Ordinal $index | anchorize -}}
{{- $entryid := printf "tabs-%v-%v" $.Ordinal $index | anchorize -}}
<div class="tab-pane fade{{ if eq $index "0" }} show active{{ end }}"

<div class="{{ if not $code }}tab-body {{end}}tab-pane fade{{ if and ( not $activeSet ) ( not $disabled ) }} show active{{ end }}"
id="{{ $entryid }}" role="tabpanel" aria-labelled-by="{{ $tabid }}">
{{- highlight (index . "content") $lang $hloptions -}}
{{ if $code }}
{{- highlight (trim (index . "content") "\n") $lang $hloptions -}}
{{- else -}}
{{- index . "content" -}}
{{- end -}}
</div>

{{ if not $disabled }}
{{ $activeSet = true }}
{{ end }}

{{ end }}
</div>
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@
"bootstrap": "^4.6.1"
},
"devDependencies": {
"hugo-extended": "0.98.0"
"hugo-extended": "0.99.1"
}
}
2 changes: 0 additions & 2 deletions static/css/shortcodes.css

This file was deleted.

21 changes: 0 additions & 21 deletions static/css/shortcodes/cards-pane.css

This file was deleted.

18 changes: 0 additions & 18 deletions static/css/shortcodes/tabbed-pane.css

This file was deleted.

4 changes: 2 additions & 2 deletions static/js/tabpane-persist.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ if (typeof Storage !== 'undefined') {
const activeLanguage = localStorage.getItem('active_language');
if (activeLanguage) {
document
.querySelectorAll('.tab-' + activeLanguage)
.querySelectorAll('.persistLang-' + activeLanguage)
.forEach((element) => {
$('#' + element.id).tab('show');
});
Expand All @@ -11,7 +11,7 @@ if (typeof Storage !== 'undefined') {
function handleClick(language) {
if (typeof Storage !== 'undefined') {
localStorage.setItem('active_language', language);
document.querySelectorAll('.tab-' + language)
document.querySelectorAll('.persistLang-' + language)
.forEach((element) => {
$('#' + element.id).tab('show');
});
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 95ee1e9

Please sign in to comment.