Skip to content

Commit 414e038

Browse files
hadlJosefBredereck
andauthored
feat: integrate @hadl/patternlab-plugin-pattern-wrap into core (#1433)
* feat: integrate @hadl/patternlab-plugin-pattern-wrap into core * test: pattern wrap classes reading from markdown and/or json Refs: #1432 * docs: pattern wrap classes config and details documentation Refs: #1432 Co-authored-by: Josef Bredreck <13408112+JosefBredereck@users.noreply.github.com>
1 parent c32a45c commit 414e038

10 files changed

+240
-2
lines changed

packages/core/patternlab-config.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,7 @@
9797
"excludedPatternStates": [],
9898
"excludedTags": []
9999
}
100-
]
100+
],
101+
"patternWrapClassesEnable": false,
102+
"patternWrapClassesKey": []
101103
}

packages/core/src/lib/compose.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const render = require('./render');
1010
const uikitExcludePattern = require('./uikitExcludePattern');
1111
const pm = require('./plugin_manager');
1212
const dataMerger = require('./dataMerger');
13+
const patternWrapClassesChangePatternTemplate = require('./patternWrapClasses');
1314
const pluginManager = new pm();
1415

1516
const Pattern = require('./object_factory').Pattern;
@@ -159,6 +160,7 @@ module.exports = async function (pattern, patternlab) {
159160
const headHTML = intermediateResults[0]; //headPromise
160161
pattern.patternPartialCode = intermediateResults[1]; //patternPartialPromise
161162
const footerPartial = intermediateResults[2]; //footerPartialPromise
163+
patternWrapClassesChangePatternTemplate(patternlab, pattern);
162164

163165
//finish up our footer data
164166
let allFooterData;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* get the classes from pattern markdown and/or json
3+
* @param {PatternLab} patternlab
4+
* @param {Pattern} pattern
5+
* @return {string}
6+
*/
7+
function getPatternWrapClasses(patternlab, pattern) {
8+
const { patternWrapClassesEnable, patternWrapClassesKey } = patternlab.config;
9+
if (
10+
!patternWrapClassesEnable ||
11+
!patternWrapClassesKey ||
12+
patternWrapClassesKey.length === 0
13+
) {
14+
return '';
15+
}
16+
17+
const classes = [];
18+
patternWrapClassesKey.forEach((key) => {
19+
const { allMarkdown, jsonFileData } = pattern;
20+
21+
if (allMarkdown && allMarkdown[key]) {
22+
classes.push(allMarkdown[key]);
23+
}
24+
25+
if (jsonFileData && jsonFileData[key]) {
26+
classes.push(jsonFileData[key]);
27+
}
28+
});
29+
30+
return classes.join(' ');
31+
}
32+
33+
/**
34+
* change pattern template and wrap with classes pattern wrapper
35+
* @param {PatternLab} patternlab
36+
* @param {Pattern} pattern
37+
*/
38+
function patternWrapClassesChangePatternTemplate(patternlab, pattern) {
39+
const classes = getPatternWrapClasses(patternlab, pattern);
40+
if (classes.length !== 0) {
41+
pattern.patternPartialCode = `<div class="pl-pattern-wrapper-element ${classes}">${pattern.patternPartialCode}</div>`;
42+
}
43+
}
44+
45+
module.exports = patternWrapClassesChangePatternTemplate;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"theme-class": "json-theme-class"
3+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bar
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
theme-class: markdown-theme-class
3+
---
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bar
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'use strict';
2+
3+
const path = require('path');
4+
const tap = require('tap');
5+
6+
const loadPattern = require('../src/lib/loadPattern');
7+
const patternWrapClassesChangePatternTemplate = require('../src/lib/patternWrapClasses');
8+
const util = require('./util/test_utils.js');
9+
const patternEngines = require('../src/lib/pattern_engines');
10+
const config = require('./util/patternlab-config.json');
11+
12+
patternEngines.loadAllEngines(config);
13+
14+
const patterns_dir = `${__dirname}/files/_patterns`;
15+
16+
tap.test('reading pattern wrap class from markdown', function (test) {
17+
const patternlab = util.fakePatternLab(patterns_dir);
18+
patternlab.config = {
19+
...patternlab.config,
20+
patternWrapClassesEnable: true,
21+
patternWrapClassesKey: ['theme-class'],
22+
};
23+
24+
const patternPathMarkdown = path.join(
25+
'test',
26+
'pattern-wrap-class-markdown.mustache'
27+
);
28+
const patternMarkdown = loadPattern(patternPathMarkdown, patternlab);
29+
patternWrapClassesChangePatternTemplate(patternlab, patternMarkdown);
30+
const patternPartialMarkdown =
31+
'<div class="pl-pattern-wrapper-element markdown-theme-class"></div>';
32+
33+
test.equal(patternMarkdown.patternPartialCode, patternPartialMarkdown);
34+
test.end();
35+
});
36+
37+
tap.test('reading pattern wrap class from json', function (test) {
38+
const patternlab = util.fakePatternLab(patterns_dir);
39+
patternlab.config = {
40+
...patternlab.config,
41+
patternWrapClassesEnable: true,
42+
patternWrapClassesKey: ['theme-class'],
43+
};
44+
45+
const patternPathJson = path.join('test', 'pattern-wrap-class-json.mustache');
46+
const patternJson = loadPattern(patternPathJson, patternlab);
47+
patternWrapClassesChangePatternTemplate(patternlab, patternJson);
48+
const patternPartialJson =
49+
'<div class="pl-pattern-wrapper-element json-theme-class"></div>';
50+
51+
test.equal(patternJson.patternPartialCode, patternPartialJson);
52+
test.end();
53+
});

packages/docs/src/docs/advanced-config-options.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ For example, to export the navigation, header, and footer, one might do:
210210

211211
## patternMergeVariantArrays
212212

213-
Used to override the merge behavior of pattern variants. For more information see [The Pseudo-Pattern File Data](docs/using-pseudo-patterns/#heading-the-pseudo-pattern-file-data).
213+
Used to override the merge behavior of pattern variants. For more information see [The Pseudo-Pattern File Data](/docs/using-pseudo-patterns/#heading-the-pseudo-pattern-file-data).
214214

215215
- `true` will merge arrays of the pattern and pseudo-pattern with [lodash merge](https://lodash.com/docs/4.17.15#merge)
216216
- `false` will override arrays from the pattern with pseudo-patterns arrays
@@ -221,6 +221,29 @@ Used to override the merge behavior of pattern variants. For more information se
221221

222222
**default**: `true` | `undefined`
223223

224+
## patternWrapClassesEnable
225+
226+
Set to `true` to enable adding a wrapper div with css class(es) around a pattern.
227+
For more information see [Pattern Wrap Classes](/docs/pattern-wrap-classes/).
228+
229+
```javascript
230+
"patternWrapClassesEnable": false,
231+
```
232+
233+
**default**: `false`
234+
235+
## patternWrapClassesKey
236+
237+
Configure your class keys for `"patternWrapClassesEnable": true`.
238+
For more information see [Pattern Wrap Classes](/docs/pattern-wrap-classes/).
239+
240+
241+
```javascript
242+
"patternWrapClassesKey": ['theme-class'],
243+
```
244+
245+
**default**: `[]`
246+
224247
## renderFlatPatternsOnViewAllPages
225248

226249
Used to activate rendering flat patterns on view all pages and generate view all pages if only flat patterns are available
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
---
2+
title: Pattern Wrap Classes
3+
tags:
4+
- docs
5+
category: advanced
6+
eleventyNavigation:
7+
title: Pattern Wrap Classes
8+
key: advanced
9+
order: 300
10+
sitemapPriority: '0.8'
11+
---
12+
13+
This feature allows you to add a wrapper div with css class(es) around a pattern when shown in the single preview.
14+
If it gets included in another pattern, the wrapper is not added.
15+
16+
This comes in handy if you, for example, use theming classes to visualize different backgrounds, colors etc.
17+
18+
## Configuration
19+
20+
Enable this feature with the configuration options
21+
[patternWrapClassesEnable](/docs/editing-the-configuration-options/#heading-patternwrapclassesenable) and
22+
[patternWrapClassesKey](/docs/editing-the-configuration-options/#heading-patternwrapclasseskey).
23+
24+
## How does it work?
25+
26+
Patternlab will look for any "data key" added to the `patternWrapClassesKey` array and adds that
27+
date to the wrapper element classes.
28+
29+
Data key can be set inside the Markdown or JSON file of any pattern.
30+
31+
### Example Config
32+
33+
```json
34+
"patternWrapClassesKey": ["theme-class"]
35+
```
36+
37+
## Use in Markdown
38+
39+
Usage [Documenting Patterns](/docs/documenting-patterns/)
40+
41+
### my-pattern.md
42+
```markdown
43+
---
44+
theme-class: my-theme-class
45+
---
46+
```
47+
48+
### Result
49+
```html
50+
<div class="pl-pattern-wrapper-element my-theme-class">...markup of pattern...</div>
51+
```
52+
53+
## Use in JSON
54+
55+
Usage [Creating Pattern-specific Values](/docs/creating-pattern-specific-values/)
56+
57+
### my-pattern.json
58+
```json
59+
{
60+
"theme-class": "my-other-theme-class"
61+
}
62+
```
63+
64+
### Result
65+
```html
66+
<div class="pl-pattern-wrapper-element my-other-theme-class">...markup of pattern...</div>
67+
```
68+
69+
## Pseudo-Patterns
70+
71+
This will work with pseudo-patterns too ([Using Pseudo-Patterns](/docs/using-pseudo-patterns/))
72+
73+
### my-pattern~variant.json
74+
```json
75+
{
76+
"theme-class": "my-variant-theme-class"
77+
}
78+
```
79+
80+
### Result
81+
```html
82+
<div class="pl-pattern-wrapper-element my-variant-theme-class">...markup of pattern...</div>
83+
```
84+
85+
## Multiple entries in "patternWrapClassesKey"
86+
87+
Will result in multiple classes in the wrapper div.
88+
89+
### Example Config
90+
```json
91+
"patternWrapClassesKey": ["theme-class", "other-class"]
92+
```
93+
94+
### my-pattern.json
95+
```json
96+
{
97+
"theme-class": "theme-class",
98+
"other-class": "some-other-class"
99+
}
100+
```
101+
102+
### Result
103+
```html
104+
<div class="pl-pattern-wrapper-element theme-class some-other-class">...markup of pattern...</div>
105+
```

0 commit comments

Comments
 (0)