setmy-info-less-extended 3.0.0 → 3.1.0

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.
Files changed (44) hide show
  1. package/README.md +56 -0
  2. package/cucumber.js +4 -3
  3. package/dist/main.css +171 -65
  4. package/dist/main.min.css +1 -1
  5. package/jest.config.js +10 -0
  6. package/jest.e2e.config.js +5 -0
  7. package/package.json +21 -23
  8. package/playwright.config.js +8 -15
  9. package/src/main/less/main.less +26 -1
  10. package/src/main/less/utility/article.less +52 -0
  11. package/src/main/less/utility/card.less +28 -0
  12. package/src/main/less/utility/index.less +11 -0
  13. package/src/main/less/utility/modal.less +61 -0
  14. package/src/main/less/utility/section.less +36 -0
  15. package/src/test/gherkin/article.feature +11 -0
  16. package/src/test/gherkin/card.feature +13 -0
  17. package/src/test/gherkin/modal.feature +27 -0
  18. package/src/test/gherkin/section.feature +11 -0
  19. package/src/test/js/e2e/article.e2e.js +29 -0
  20. package/src/test/js/e2e/body.e2e.js +9 -7
  21. package/src/test/js/e2e/card.e2e.js +30 -0
  22. package/src/test/js/e2e/modal.e2e.js +42 -0
  23. package/src/test/js/e2e/section.e2e.js +28 -0
  24. package/src/test/pug/article.pug +6 -0
  25. package/src/test/pug/card.pug +7 -0
  26. package/src/test/pug/include/head.pug +0 -1
  27. package/src/test/pug/main.pug +0 -2
  28. package/src/test/pug/modal.pug +12 -0
  29. package/src/test/pug/section.pug +7 -0
  30. package/src/main/less/experimental/experimental-frames-colors.less +0 -35
  31. package/src/main/less/experimental/main.less +0 -3
  32. package/src/main/less/frames/index.less +0 -115
  33. package/src/test/js/bdd/given.js +0 -7
  34. package/src/test/js/bdd/then.js +0 -60
  35. package/src/test/js/bdd/when.js +0 -10
  36. package/src/test/js/firefoxHelper.js +0 -17
  37. package/src/test/js/pageHelper.js +0 -102
  38. package/src/test/js/pugBuild.js +0 -37
  39. package/src/test/js/pugTranspile.js +0 -16
  40. package/src/test/js/pugWatch.js +0 -23
  41. package/src/test/js/server.js +0 -15
  42. package/src/test/js/testPageName.js +0 -10
  43. package/src/test/js/unit/main.test.js +0 -5
  44. package/src/test/pug/partials/experimental-frames.pug +0 -100
package/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # setmy-info-less-extended
2
+
3
+ Extended content components on top of the base module: page sections, modal/overlay, cards, and
4
+ article typography. These higher-level patterns were moved out of the base package to keep the base
5
+ minimal (resets, tokens, single-purpose utilities). This package does **not** own the
6
+ NetBeans-inspired IDE frame shell — that lives in `setmy-info-less-ide`.
7
+
8
+ **For what:** Adding common content patterns (sections, modals, cards, article text) on top of the
9
+ base utilities.
10
+
11
+ **For who:** Front-end developers building page content on top of the base module.
12
+
13
+ ## Install
14
+
15
+ ```shell
16
+ npm i setmy-info-less-extended
17
+ ```
18
+
19
+ * https://www.npmjs.com/package/setmy-info-less-extended
20
+
21
+ ## Dependencies
22
+
23
+ Depends on [`setmy-info-less`](../setmy-info-less/README.md). Load base CSS before this.
24
+
25
+ ## Usage
26
+
27
+ ```html
28
+ <link rel="stylesheet" href="node_modules/setmy-info-less/dist/main.css">
29
+ <link rel="stylesheet" href="node_modules/setmy-info-less-extended/dist/main.css">
30
+ ```
31
+
32
+ Or from CDN:
33
+
34
+ ```html
35
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/setmy-info-less-extended/dist/main.min.css">
36
+ ```
37
+
38
+ ## What is included
39
+
40
+ | Group | Classes |
41
+ |---|---|
42
+ | Section | `.fullViewport`, `.pageSection`, `.pageSectionNarrow`, `.sectionContentCenter`, `.sectionContentRow` |
43
+ | Modal | `.overlay`, `.modal`, `.modalHeader`, `.modalBody`, `.modalFooter`, `.modalClose` |
44
+ | Card | `.card`, `.cardTitle`, `.cardBody`, `.cardGrid` |
45
+ | Article | `.articleBody`, `.codeInline`, `.codePre`, `.blockquote`, `.definitionTerm`, `.definitionDesc` |
46
+
47
+ These reference base design tokens but ship only as this package's own CSS (standalone/delta — base
48
+ CSS is not bundled). Load the base stylesheet before this one.
49
+
50
+ ## Development
51
+
52
+ ```shell
53
+ npm run build
54
+ npm run lint:less
55
+ npm run verify
56
+ ```
package/cucumber.js CHANGED
@@ -1,9 +1,10 @@
1
1
  module.exports = {
2
2
  default: [
3
3
  `--format-options '{"snippetInterface": "synchronous"}'`,
4
- '--require ./src/test/js/bdd/given.js',
5
- '--require ./src/test/js/bdd/when.js',
6
- '--require ./src/test/js/bdd/then.js',
4
+ '--require ../common/test/js/bdd/support.js',
5
+ '--require ../common/test/js/bdd/given.js',
6
+ '--require ../common/test/js/bdd/when.js',
7
+ '--require ../common/test/js/bdd/then.js',
7
8
  './src/test/gherkin'
8
9
  ].join(' ')
9
10
  };
package/dist/main.css CHANGED
@@ -1,76 +1,182 @@
1
+ /*
2
+ Main entry point for the extended module.
3
+
4
+ Distribution model: STANDALONE / DELTA.
5
+ `dist/main.css` contains ONLY this package's own rules — it does not bundle the base
6
+ module's CSS. Consumers load the stylesheets in dependency order:
7
+
8
+ setmy-info-less -> setmy-info-less-extended
9
+
10
+ This package is currently a skeleton: it has no rules of its own yet. The base module's
11
+ `values/index.less` is imported for TOKENS ONLY (LESS variables produce no CSS output), so
12
+ future extended rules can reference shared tokens without re-emitting base styles here.
13
+ Stable NetBeans-style frame presets live in `setmy-info-less-ide`.
14
+ */
15
+ /* Base tokens only (no CSS output) — gives future rules access to shared variables */
1
16
  /* values/main.less */
2
17
  /* values/colors/main.less */
3
18
  /* values/fonts/main.less */
4
- body.framesDefaultPadding {
5
- height: calc(100% - 0px);
6
- width: calc(100% - 0px);
7
- padding: 0px;
8
- }
9
- .contentHeader {
19
+ /* This package's own rules (empty skeleton — add files via utility/index.less) */
20
+ /*
21
+ Extended utility classes.
22
+
23
+ Higher-level content patterns moved here from the base module: page sections, modal/overlay,
24
+ cards, and article typography. These reference base design tokens (imported for tokens only by
25
+ this package's main.less) but live in the extended layer so the base module stays minimal.
26
+ */
27
+ /* section.less */
28
+ /* Full viewport height — use for hero or landing sections */
29
+ .fullViewport {
30
+ height: 100vh;
10
31
  width: 100%;
11
- height: 50px;
12
32
  }
13
- .defaultHeader {
33
+ /* Generic full-width content section with vertical padding */
34
+ .pageSection {
14
35
  width: 100%;
15
- height: 25px;
36
+ padding-top: 20px;
37
+ padding-bottom: 20px;
16
38
  }
17
- .content {
39
+ /* Width-constrained centered content section — combine with .centerBox */
40
+ .pageSectionNarrow {
18
41
  width: 100%;
19
- height: calc(100% - 75px);
20
- }
21
- .contentFooter {
42
+ max-width: 1024px;
43
+ margin: 0 auto;
44
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
45
+ padding: 20px 10px;
46
+ }
47
+ /* Centers child content vertically and horizontally — display:table works in IE8+ */
48
+ .sectionContentCenter {
49
+ display: table;
22
50
  width: 100%;
23
- height: 25px;
24
- }
25
- .sectionLeft {
26
- width: calc(30% - 8px - 4px);
27
- height: 100%;
28
- }
29
- .verticalSeparator {
30
- width: 8px;
31
- height: 100%;
32
- display: block;
33
- }
34
- .sectionRight {
35
- width: 70%;
36
51
  height: 100%;
37
- }
38
- .sectionHeader {
39
- width: 100%;
40
- height: 25px;
41
- }
42
- .sectionLeftUp {
43
- width: 100%;
44
- height: calc(60% - 4px - 8px);
45
- }
46
- .contentLeftUp {
47
- width: 100%;
48
- height: calc(100% - 25px);
49
- }
50
- .horizontalSeparator {
51
- height: 4px;
52
- }
53
- .sectionLeftBottom {
54
- width: 100%;
55
- height: calc(40%);
56
- }
57
- .contentLeftBottom {
58
- width: 100%;
59
- height: calc(100% - 25px);
60
- }
61
- .sectionRightUp {
62
- width: 100%;
63
- height: 30%;
64
- }
65
- .contentRightUp {
66
- width: 100%;
67
- height: calc(100% - 25px);
68
- }
69
- .sectionRightBottom {
70
- width: 100%;
71
- height: calc(70% - 4px - 8px);
72
- }
73
- .contentRightBottom {
74
- width: 100%;
75
- height: calc(100% - 25px);
52
+ text-align: center;
53
+ }
54
+ /* Clearfix for floated children arranged in a row */
55
+ .sectionContentRow {
56
+ overflow: hidden;
57
+ }
58
+ /* modal.less */
59
+ /* Full-screen overlay blocks background; JS controls visibility toggle */
60
+ .overlay {
61
+ position: fixed;
62
+ /* stylelint-disable declaration-block-no-redundant-longhand-properties */
63
+ top: 0;
64
+ right: 0;
65
+ bottom: 0;
66
+ left: 0;
67
+ /* stylelint-enable declaration-block-no-redundant-longhand-properties */
68
+ background: rgba(0, 0, 0, 0.5);
69
+ z-index: 800;
70
+ }
71
+ /* Centered dialog box — JS controls open/close; LESS handles size and position only */
72
+ .modal {
73
+ position: fixed;
74
+ top: 50%;
75
+ left: 50%;
76
+ transform: translate(-50%, -50%);
77
+ max-width: 640px;
78
+ width: 90%;
79
+ max-height: 80vh;
80
+ overflow-y: auto;
81
+ background: #ffffff;
82
+ border-radius: 6px;
83
+ z-index: 900;
84
+ }
85
+ .modalHeader {
86
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
87
+ padding: 10px 20px;
88
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
89
+ border-bottom: 1px solid #cccccc;
90
+ font-weight: bold;
91
+ }
92
+ .modalBody {
93
+ padding: 20px;
94
+ overflow-y: auto;
95
+ }
96
+ .modalFooter {
97
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
98
+ padding: 10px 20px;
99
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
100
+ border-top: 1px solid #cccccc;
101
+ text-align: right;
102
+ }
103
+ /* Absolute close button — position inside .modal which has position:fixed */
104
+ .modalClose {
105
+ position: absolute;
106
+ top: 10px;
107
+ right: 10px;
108
+ cursor: pointer;
109
+ background: transparent;
110
+ border-style: none;
111
+ line-height: 1;
112
+ }
113
+ /* card.less */
114
+ /* Base content card */
115
+ .card {
116
+ border-style: solid;
117
+ border-width: 2px;
118
+ border-color: #cccccc;
119
+ border-radius: 6px;
120
+ padding: 20px;
121
+ background: #ffffff;
122
+ box-sizing: border-box;
123
+ }
124
+ /* Card heading */
125
+ .cardTitle {
126
+ font-weight: bold;
127
+ margin-bottom: 10px;
128
+ }
129
+ /* Card body text area */
130
+ .cardBody {
131
+ color: black;
132
+ }
133
+ /* Wrapping row of cards — clearfix for floated children */
134
+ .cardGrid {
135
+ overflow: hidden;
136
+ }
137
+ /* article.less */
138
+ /* Long-form article text container */
139
+ .articleBody {
140
+ line-height: 1.7;
141
+ max-width: 75ch;
142
+ }
143
+ /* Inline code span */
144
+ .codeInline {
145
+ font-family: monospace;
146
+ background: #f3f4f6;
147
+ padding-left: 4px;
148
+ padding-right: 4px;
149
+ border-radius: 3px;
150
+ font-size: 75%;
151
+ }
152
+ /* Block code area */
153
+ .codePre {
154
+ font-family: monospace;
155
+ background: #f3f4f6;
156
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
157
+ padding: 10px 20px;
158
+ border-radius: 6px;
159
+ overflow-x: auto;
160
+ line-height: 1.5;
161
+ white-space: pre;
162
+ }
163
+ /* Block quotation with left accent border */
164
+ .blockquote {
165
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
166
+ border-left: 4px solid #93c5fd;
167
+ padding-left: 20px;
168
+ margin-top: 10px;
169
+ margin-bottom: 10px;
170
+ color: dimgray;
171
+ font-style: italic;
172
+ }
173
+ /* Definition list term */
174
+ .definitionTerm {
175
+ font-weight: bold;
176
+ margin-top: 10px;
177
+ }
178
+ /* Definition list description */
179
+ .definitionDesc {
180
+ margin-left: 20px;
181
+ color: dimgray;
76
182
  }
package/dist/main.min.css CHANGED
@@ -1 +1 @@
1
- body.framesDefaultPadding{height:calc(100% - 0px);width:calc(100% - 0px);padding:0}.contentHeader{width:100%;height:50px}.defaultHeader{width:100%;height:25px}.content{width:100%;height:calc(100% - 75px)}.contentFooter{width:100%;height:25px}.sectionLeft{width:calc(30% - 8px - 4px);height:100%}.verticalSeparator{width:8px;height:100%;display:block}.sectionRight{width:70%;height:100%}.sectionHeader{width:100%;height:25px}.sectionLeftUp{width:100%;height:calc(60% - 4px - 8px)}.contentLeftUp{width:100%;height:calc(100% - 25px)}.horizontalSeparator{height:4px}.sectionLeftBottom{width:100%;height:calc(40%)}.contentLeftBottom{width:100%;height:calc(100% - 25px)}.sectionRightUp{width:100%;height:30%}.contentRightUp{width:100%;height:calc(100% - 25px)}.sectionRightBottom{width:100%;height:calc(70% - 4px - 8px)}.contentRightBottom{width:100%;height:calc(100% - 25px)}
1
+ .fullViewport{height:100vh;width:100%}.pageSection{width:100%;padding-top:20px;padding-bottom:20px}.pageSectionNarrow{width:100%;max-width:1024px;margin:0 auto;padding:20px 10px}.sectionContentCenter{display:table;width:100%;height:100%;text-align:center}.sectionContentRow{overflow:hidden}.overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.5);z-index:800}.modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);max-width:640px;width:90%;max-height:80vh;overflow-y:auto;background:#fff;border-radius:6px;z-index:900}.modalHeader{padding:10px 20px;border-bottom:1px solid #ccc;font-weight:700}.modalBody{padding:20px;overflow-y:auto}.modalFooter{padding:10px 20px;border-top:1px solid #ccc;text-align:right}.modalClose{position:absolute;top:10px;right:10px;cursor:pointer;background:0 0;border-style:none;line-height:1}.card{border-style:solid;border-width:2px;border-color:#ccc;border-radius:6px;padding:20px;background:#fff;box-sizing:border-box}.cardTitle{font-weight:700;margin-bottom:10px}.cardBody{color:#000}.cardGrid{overflow:hidden}.articleBody{line-height:1.7;max-width:75ch}.codeInline{font-family:monospace;background:#f3f4f6;padding-left:4px;padding-right:4px;border-radius:3px;font-size:75%}.codePre{font-family:monospace;background:#f3f4f6;padding:10px 20px;border-radius:6px;overflow-x:auto;line-height:1.5;white-space:pre}.blockquote{border-left:4px solid #93c5fd;padding-left:20px;margin-top:10px;margin-bottom:10px;color:#696969;font-style:italic}.definitionTerm{font-weight:700;margin-top:10px}.definitionDesc{margin-left:20px;color:#696969}
package/jest.config.js ADDED
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ roots: [
3
+ '<rootDir>',
4
+ '<rootDir>/../common'
5
+ ],
6
+ testMatch: [
7
+ '**/__tests__/**/*.?([mc])[jt]s?(x)',
8
+ '**/?(*.)+(spec|test).?([mc])[jt]s?(x)'
9
+ ]
10
+ };
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ testMatch: ['**/*.e2e.js'],
3
+ testTimeout: 60000,
4
+ maxWorkers: 1
5
+ };
package/package.json CHANGED
@@ -1,37 +1,36 @@
1
1
  {
2
2
  "name": "setmy-info-less-extended",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "SMI LESS project",
5
5
  "main": "dist/main.min.css",
6
6
  "dependencies": {
7
7
  "setmy-info-less": "*"
8
8
  },
9
9
  "scripts": {
10
- "build": "npm run css && npm run css-min && npm run html",
11
- "build:experimental": "npm run css:experimental",
10
+ "build": "npm run css && npm run css-min && npm run html && npm run styleguide",
12
11
  "css": "lessc ./src/main/less/main.less dist/main.css",
13
- "css:experimental": "lessc ./src/main/less/experimental/main.less dist/experimental.css",
14
12
  "css-min": "lessc ./src/main/less/main.less dist/main.min.css --clean-css",
15
13
  "css:debug": "lessc --modify-var=debug=true ./src/main/less/main.less dist/main.css",
16
- "html": "node ./src/test/js/pugBuild.js",
17
- "start": "node ./src/test/js/server.js",
14
+ "html": "node ../common/test/js/pugBuild.js",
15
+ "start": "node ../common/test/js/server.js",
18
16
  "watch": "less-watch-compiler ./src/main/less dist main.less",
19
- "watch:pug": "node ./src/test/js/pugWatch.js",
17
+ "watch:pug": "node ../common/test/js/pugWatch.js",
20
18
  "clean": "rimraf dist",
21
19
  "clean:all": "rimraf dist node_modules",
22
20
  "verify": "npm test && npm run e2e && npm run lint:less && npm run cucumber",
23
21
  "test": "jest",
24
- "e2e": "npx playwright test --config=playwright.config.js",
25
- "e2e:one": "npx playwright test --config=playwright.config.js",
22
+ "e2e": "jest --config=jest.e2e.config.js",
23
+ "e2e:one": "jest --config=jest.e2e.config.js --testNamePattern",
26
24
  "cucumber": "cucumber-js",
27
25
  "lint:less": "stylelint ./src/main/less/**/*.less",
28
- "lint:fix-less": "stylelint ./src/main/less/**/*.less --fix"
26
+ "lint:fix-less": "stylelint ./src/main/less/**/*.less --fix",
27
+ "styleguide": "kss-node --source src/main/less --destination dist/styleguide --css ../main.css"
29
28
  },
30
29
  "keywords": [
31
30
  "less",
32
31
  "css",
33
32
  "pug",
34
- "playwright",
33
+ "selenium",
35
34
  "jest"
36
35
  ],
37
36
  "author": "Imre Tabur <imre.tabur@mail.ee>",
@@ -42,19 +41,18 @@
42
41
  },
43
42
  "homepage": "https://github.com/setmy-info/setmy-info-less",
44
43
  "devDependencies": {
45
- "@cucumber/cucumber": "^12.6.0",
46
- "@playwright/test": "^1.53.1",
47
- "express": "^5.1.0",
48
- "jest": "^30.2.0",
49
- "less": "^4.3.0",
44
+ "express": "^5.2.1",
45
+ "jest": "^30.4.2",
46
+ "kss": "^2.4.0",
47
+ "less": "^4.6.6",
50
48
  "less-plugin-clean-css": "^1.6.0",
51
- "less-watch-compiler": "^1.16.3",
52
- "playwright": "^1.53.1",
49
+ "less-watch-compiler": "^1.17.5",
53
50
  "postcss-less": "^6.0.0",
54
- "pug": "^3.0.3",
55
- "rimraf": "^6.0.1",
56
- "stylelint": "^16.21.1",
57
- "stylelint-config-standard": "^38.0.0",
58
- "stylelint-less": "^3.0.1"
51
+ "selenium-webdriver": "^4.45.0",
52
+ "pug": "^3.0.4",
53
+ "rimraf": "^6.1.3",
54
+ "stylelint": "^17.13.0",
55
+ "stylelint-config-standard": "^40.0.0",
56
+ "stylelint-less": "^4.2.1"
59
57
  }
60
58
  }
@@ -1,16 +1,9 @@
1
- const {defineConfig} = require('@playwright/test');
2
- const firefoxHelper = require('./src/test/js/firefoxHelper');
1
+ /*
2
+ LEGACY STUB retained intentionally, kept empty on purpose (not removed).
3
3
 
4
- const firefoxPath = firefoxHelper.getFirefoxPath();
5
-
6
- module.exports = defineConfig({
7
- testDir: 'src/test/js',
8
- timeout: 30000,
9
- retries: 0,
10
- use: {
11
- headless: false,
12
- browserName: 'firefox',
13
- executablePath: firefoxPath
14
- },
15
- testMatch: '**/*.e2e.js'
16
- });
4
+ Playwright is no longer used: e2e tests run via an external Selenium Grid through the Jest
5
+ runner (see jest.e2e.config.js and ../common/test/js/pageHelper.js). This empty config remains
6
+ as a marker of the migration and to avoid breaking any tooling or muscle-memory that still
7
+ references a playwright.config.js. It is deliberately a no-op and exports nothing meaningful.
8
+ */
9
+ module.exports = {};
@@ -1,3 +1,28 @@
1
+ /*
2
+ Main entry point for the extended module.
3
+
4
+ Distribution model: STANDALONE / DELTA.
5
+ `dist/main.css` contains ONLY this package's own rules — it does not bundle the base
6
+ module's CSS. Consumers load the stylesheets in dependency order:
7
+
8
+ setmy-info-less -> setmy-info-less-extended
9
+
10
+ This package is currently a skeleton: it has no rules of its own yet. The base module's
11
+ `values/index.less` is imported for TOKENS ONLY (LESS variables produce no CSS output), so
12
+ future extended rules can reference shared tokens without re-emitting base styles here.
13
+ Stable NetBeans-style frame presets live in `setmy-info-less-ide`.
14
+ */
15
+
16
+ // Extended module
17
+ //
18
+ // Optional additions on top of `setmy-info-less`. Load the base CSS before this file.
19
+ //
20
+ // Markup: <div class="smi-frame"></div>
21
+ //
22
+ // Styleguide: packages.extended
23
+
24
+ /* Base tokens only (no CSS output) — gives future rules access to shared variables */
1
25
  @import url("../../../../setmy-info-less/src/main/less/values/index.less");
2
- @import url("frames/index.less");
3
26
 
27
+ /* This package's own rules (empty skeleton — add files via utility/index.less) */
28
+ @import url("utility/index.less");
@@ -0,0 +1,52 @@
1
+ /* article.less */
2
+
3
+ /* Long-form article text container */
4
+ .articleBody {
5
+ line-height: @articleLineHeight;
6
+ max-width: 75ch;
7
+ }
8
+
9
+ /* Inline code span */
10
+ .codeInline {
11
+ font-family: monospace;
12
+ background: @gray-100;
13
+ padding-left: 4px;
14
+ padding-right: 4px;
15
+ border-radius: 3px;
16
+ font-size: @smallFontSize;
17
+ }
18
+
19
+ /* Block code area */
20
+ .codePre {
21
+ font-family: monospace;
22
+ background: @gray-100;
23
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
24
+ padding: @defaultPadding @doubleDefaultPadding;
25
+ border-radius: @defaultBorderRadius;
26
+ overflow-x: auto;
27
+ line-height: 1.5;
28
+ white-space: pre;
29
+ }
30
+
31
+ /* Block quotation with left accent border */
32
+ .blockquote {
33
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
34
+ border-left: 4px solid @blue-300;
35
+ padding-left: @doubleDefaultPadding;
36
+ margin-top: @defaultPadding;
37
+ margin-bottom: @defaultPadding;
38
+ color: @quinaryColor;
39
+ font-style: italic;
40
+ }
41
+
42
+ /* Definition list term */
43
+ .definitionTerm {
44
+ font-weight: bold;
45
+ margin-top: @defaultPadding;
46
+ }
47
+
48
+ /* Definition list description */
49
+ .definitionDesc {
50
+ margin-left: @doubleDefaultPadding;
51
+ color: @quinaryColor;
52
+ }
@@ -0,0 +1,28 @@
1
+ /* card.less */
2
+
3
+ /* Base content card */
4
+ .card {
5
+ border-style: solid;
6
+ border-width: @defaultBorder;
7
+ border-color: @tertiaryColor;
8
+ border-radius: @defaultBorderRadius;
9
+ padding: @doubleDefaultPadding;
10
+ background: @secondaryBackgroundColor;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ /* Card heading */
15
+ .cardTitle {
16
+ font-weight: bold;
17
+ margin-bottom: @defaultPadding;
18
+ }
19
+
20
+ /* Card body text area */
21
+ .cardBody {
22
+ color: @textColor;
23
+ }
24
+
25
+ /* Wrapping row of cards — clearfix for floated children */
26
+ .cardGrid {
27
+ overflow: hidden;
28
+ }
@@ -0,0 +1,11 @@
1
+ /*
2
+ Extended utility classes.
3
+
4
+ Higher-level content patterns moved here from the base module: page sections, modal/overlay,
5
+ cards, and article typography. These reference base design tokens (imported for tokens only by
6
+ this package's main.less) but live in the extended layer so the base module stays minimal.
7
+ */
8
+ @import url("section.less");
9
+ @import url("modal.less");
10
+ @import url("card.less");
11
+ @import url("article.less");
@@ -0,0 +1,61 @@
1
+ /* modal.less */
2
+
3
+ /* Full-screen overlay — blocks background; JS controls visibility toggle */
4
+ .overlay {
5
+ position: fixed;
6
+ /* stylelint-disable declaration-block-no-redundant-longhand-properties */
7
+ top: 0;
8
+ right: 0;
9
+ bottom: 0;
10
+ left: 0;
11
+ /* stylelint-enable declaration-block-no-redundant-longhand-properties */
12
+ background: @overlayBackgroundColor;
13
+ z-index: @z-index-8;
14
+ }
15
+
16
+ /* Centered dialog box — JS controls open/close; LESS handles size and position only */
17
+ .modal {
18
+ position: fixed;
19
+ top: 50%;
20
+ left: 50%;
21
+ transform: translate(-50%, -50%);
22
+ max-width: 640px;
23
+ width: 90%;
24
+ max-height: 80vh;
25
+ overflow-y: auto;
26
+ background: @secondaryBackgroundColor;
27
+ border-radius: @defaultBorderRadius;
28
+ z-index: @z-index-9;
29
+ }
30
+
31
+ .modalHeader {
32
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
33
+ padding: @defaultPadding @doubleDefaultPadding;
34
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
35
+ border-bottom: 1px solid @tertiaryColor;
36
+ font-weight: bold;
37
+ }
38
+
39
+ .modalBody {
40
+ padding: @doubleDefaultPadding;
41
+ overflow-y: auto;
42
+ }
43
+
44
+ .modalFooter {
45
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
46
+ padding: @defaultPadding @doubleDefaultPadding;
47
+ /* stylelint-disable-next-line declaration-property-value-no-unknown */
48
+ border-top: 1px solid @tertiaryColor;
49
+ text-align: right;
50
+ }
51
+
52
+ /* Absolute close button — position inside .modal which has position:fixed */
53
+ .modalClose {
54
+ position: absolute;
55
+ top: @defaultPadding;
56
+ right: @defaultPadding;
57
+ cursor: pointer;
58
+ background: transparent;
59
+ border-style: none;
60
+ line-height: 1;
61
+ }