@vrembem/content 4.0.0-next.44

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 ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 Sebastian Nitu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # Content
2
+
3
+ A content wrapper that provides typographic styles for common HTML elements.
4
+
5
+ [Documentation](https://vrembem.com/packages/content)
6
+
7
+ ## Installation
8
+
9
+ ```sh
10
+ npm install @vrembem/content
11
+ ```
12
+
13
+ ### Styles
14
+
15
+ ```scss
16
+ @use "@vrembem/content";
17
+ ```
package/dev/index.css ADDED
@@ -0,0 +1,174 @@
1
+ @layer base {
2
+ .content {
3
+ font-family: var(--vb-content-font-family, inherit);
4
+ font-size: var(--vb-content-font-size, inherit);
5
+ line-height: var(--vb-content-line-height, inherit);
6
+ color: var(--vb-content-foreground, var(--vb-foreground));
7
+ }
8
+ .content > * + * {
9
+ margin-top: var(--vb-content-spacing);
10
+ }
11
+ .h1, .content > h1, .h2, .content > h2, .h3, .content > h3, .h4, .content > h4, .h5, .content > h5, .h6, .content > h6 {
12
+ font-family: var(--vb-headings-font-family, inherit);
13
+ font-size: var(--vb-headings-font-size, 1em);
14
+ font-weight: var(--vb-headings-font-weight, var(--vb-font-weight-semi-bold));
15
+ line-height: var(--vb-headings-line-height, inherit);
16
+ color: var(--vb-headings-foreground, var(--vb-foreground-strong));
17
+ }
18
+ .h1, .content > h1 {
19
+ --vb-headings-font-size: 2.75em;
20
+ }
21
+ .h2, .content > h2 {
22
+ --vb-headings-font-size: 2em;
23
+ }
24
+ .h3, .content > h3 {
25
+ --vb-headings-font-size: 1.75em;
26
+ }
27
+ .h4, .content > h4 {
28
+ --vb-headings-font-size: 1.5em;
29
+ }
30
+ .h5, .content > h5 {
31
+ --vb-headings-font-size: 1.25em;
32
+ }
33
+ .h6, .content > h6 {
34
+ --vb-headings-font-size: 1em;
35
+ }
36
+ .link, .content :not(div) > a {
37
+ color: var(--vb-link-foreground, var(--vb-foreground-accent));
38
+ text-decoration: var(--vb-link-decoration, underline);
39
+ text-decoration-thickness: var(--vb-link-decoration-thickness, 1px);
40
+ text-underline-offset: var(--vb-link-underline-offset, 2px);
41
+ }
42
+ .link code, .content :not(div) > a code {
43
+ color: var(--vb-link-foreground, var(--vb-foreground-accent));
44
+ background-color: var(--vb-background-alt);
45
+ }
46
+ .link:hover, .link:focus, .content :not(div) > a:hover, .content :not(div) > a:focus {
47
+ color: var(--vb-link-foreground-hover, light-dark(oklch(from var(--vb-foreground-accent) calc(l - 0.1) c h), oklch(from var(--vb-foreground-accent) calc(l + 0.1) c h)));
48
+ text-decoration: var(--vb-link-decoration-hover, none);
49
+ }
50
+ .link:hover code, .link:focus code, .content :not(div) > a:hover code, .content :not(div) > a:focus code {
51
+ color: var(--vb-link-foreground-hover, light-dark(oklch(from var(--vb-foreground-accent) calc(l - 0.1) c h), oklch(from var(--vb-foreground-accent) calc(l + 0.1) c h)));
52
+ }
53
+ .link:focus, .content :not(div) > a:focus {
54
+ outline: var(--vb-link-focus-ring, currentcolor dotted 1px);
55
+ outline-offset: var(--vb-link-focus-ring-offset, 0.125rem);
56
+ }
57
+ .list, .content > ul, .content > ol {
58
+ margin-left: var(--vb-list-indent, var(--vb-spacing-lg));
59
+ }
60
+ .list ul,
61
+ .list ol, .content > ul ul,
62
+ .content > ul ol, .content > ol ul,
63
+ .content > ol ol {
64
+ margin-left: var(--vb-list-indent, var(--vb-spacing-lg));
65
+ }
66
+ .list li li,
67
+ .list li + li, .content > ul li li,
68
+ .content > ul li + li, .content > ol li li,
69
+ .content > ol li + li {
70
+ margin-top: var(--vb-list-spacing, var(--vb-spacing-sm));
71
+ }
72
+ .list-style-none {
73
+ list-style: none !important;
74
+ }
75
+ .code, .content :not(pre) > code {
76
+ padding: var(--vb-code-padding, 0.125rem 0.375rem);
77
+ border: var(--vb-code-border);
78
+ border-radius: var(--vb-code-border-radius, var(--vb-border-radius));
79
+ font-family: var(--vb-font-family-mono);
80
+ font-size: var(--vb-code-font-size, var(--vb-font-size-sm));
81
+ color: var(--vb-code-foreground, var(--vb-foreground-accent-alt));
82
+ overflow-wrap: break-word;
83
+ background: var(--vb-code-background, var(--vb-background-alt));
84
+ }
85
+ .pre, .content > pre {
86
+ overflow: auto;
87
+ padding: var(--vb-pre-padding, var(--vb-spacing-md));
88
+ border: var(--vb-pre-border, none);
89
+ border-radius: var(--vb-pre-border-radius, var(--vb-border-radius));
90
+ font-family: var(--vb-font-family-mono);
91
+ color: var(--vb-pre-foreground, var(--vb-foreground-strong));
92
+ background: var(--vb-pre-background, var(--vb-background-alt));
93
+ }
94
+ .pre code, .content > pre code {
95
+ padding: 0;
96
+ border: none;
97
+ font-size: var(--vb-pre-font-size, var(--vb-font-size-sm));
98
+ color: inherit;
99
+ background: none;
100
+ }
101
+ .blockquote, .content > blockquote {
102
+ position: relative;
103
+ padding: var(--vb-blockquote-padding, var(--vb-spacing-md));
104
+ border: var(--vb-blockquote-border, var(--vb-border));
105
+ border-radius: var(--vb-blockquote-border-radius, var(--vb-border-radius));
106
+ color: var(--vb-blockquote-foreground, currentcolor);
107
+ background: var(--vb-blockquote-background, transparent);
108
+ }
109
+ .blockquote > * + *, .content > blockquote > * + * {
110
+ margin-top: var(--vb-blockquote-spacing, var(--vb-spacing-md));
111
+ }
112
+ .sep, .content > hr {
113
+ display: block;
114
+ height: 0;
115
+ border: none;
116
+ border-top: var(--vb-separator-border-width, var(--vb-border-width)) var(--vb-separator-border-style, var(--vb-border-style)) var(--vb-separator-border-color, var(--vb-border-color));
117
+ }
118
+ .arrow,
119
+ .arrow-up,
120
+ .arrow-down,
121
+ .arrow-left,
122
+ .arrow-right {
123
+ pointer-events: none;
124
+ transform-origin: center;
125
+ display: inline-block;
126
+ flex-grow: 0;
127
+ flex-shrink: 0;
128
+ width: 0;
129
+ height: 0;
130
+ border-color: var(--vb-arrow-color, currentcolor) transparent transparent;
131
+ border-style: solid;
132
+ border-width: var(--vb-arrow-size, 6px 4px);
133
+ border-bottom-width: 0;
134
+ border-radius: var(--vb-arrow-radius, 2px);
135
+ }
136
+ .arrow-up {
137
+ transform: rotate(180deg);
138
+ }
139
+ .arrow-left {
140
+ transform: rotate(90deg);
141
+ }
142
+ .arrow-right {
143
+ transform: rotate(-90deg);
144
+ }
145
+ .loading-spinner {
146
+ width: var(--vb-loading-size, 1em);
147
+ height: var(--vb-loading-size, 1em);
148
+ position: relative;
149
+ display: inline-block;
150
+ border: var(--vb-loading-border, 2px solid);
151
+ border-color: var(--vb-loading-color, currentcolor) var(--vb-loading-color, currentcolor) transparent transparent;
152
+ border-radius: var(--vb-border-radius-circle);
153
+ animation: spin var(--vb-loading-duration, 0.6s) infinite linear;
154
+ }
155
+ @keyframes spin {
156
+ from {
157
+ transform: rotate(0deg);
158
+ }
159
+ to {
160
+ transform: rotate(360deg);
161
+ }
162
+ }
163
+ .sr-only {
164
+ position: absolute;
165
+ overflow: hidden;
166
+ width: 1px;
167
+ height: 1px;
168
+ margin: -1px;
169
+ padding: 0;
170
+ clip-path: inset(50%);
171
+ }
172
+ }
173
+
174
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../index.scss","../src/modules/_content.scss","../src/modules/_headings.scss","../../../node_modules/@vrembem/core/src/scss/modules/_tokens.scss","../src/modules/_link.scss","../src/modules/_list.scss","../src/modules/_code.scss","../src/modules/_pre.scss","../src/modules/_blockquote.scss","../src/modules/_separator.scss","../src/modules/_arrow.scss","../../../node_modules/@vrembem/core/src/scss/library/_arrow.scss","../src/modules/_loading-spinner.scss","../../../node_modules/@vrembem/core/src/scss/library/_size.scss","../../../node_modules/@vrembem/core/src/scss/library/_loading-spinner.scss","../src/modules/_sr-only.scss","../../../node_modules/@vrembem/core/src/scss/library/_sr-only.scss"],"names":[],"mappings":"AAIA;ECGE;IACE;IACA;IACA;IACA;;EAEA;IACE;;ECLJ;IACE;IACA;IACA;IACA;IACA;;EAYA;IC0JE;;ED1JF;IC0JE;;ED1JF;IC0JE;;ED1JF;IC0JE;;ED1JF;IC0JE;;ED1JF;IC0JE;;EC7KJ;IACE;IACA;IACA;IACA;;EAEA;IACE;IACA;;EAIF;IAEE;IAIA;;EAEA;IACE;;EAOJ;IACE;IACA;;EC/BJ;IACE;;EAEA;AAAA;AAAA;AAAA;IAEE;;EAGF;AAAA;AAAA;AAAA;IAEE;;EAIJ;IACE;;ECfF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;ECRF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IACE;IACA;IACA;IACA;IACA;;ECdJ;IACE;IACA;IACA;IACA;IACA;IACA;;EAEA;IACE;;ECTJ;IACE;IACA;IACA;IACA;;ECNF;AAAA;AAAA;AAAA;AAAA;ICMA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EDTA;IACE;;EAGF;IACE;;EAGF;IACE;;EEjBF;ICUE,OCCY;IDAZ;ICOF,UFjBgC;IEkBhC;IACA;IACA;IACA;IACA;;EAME;IACE;MACE;;IAGF;MACE;;;ECnCN;ICFA;IACA;IACA;IACA;IACA;IACA;IACA","file":"index.css"}
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ @layer base{.content{font-family:var(--vb-content-font-family, inherit);font-size:var(--vb-content-font-size, inherit);line-height:var(--vb-content-line-height, inherit);color:var(--vb-content-foreground, var(--vb-foreground))}.content>*+*{margin-top:var(--vb-content-spacing)}.h1,.content>h1,.h2,.content>h2,.h3,.content>h3,.h4,.content>h4,.h5,.content>h5,.h6,.content>h6{font-family:var(--vb-headings-font-family, inherit);font-size:var(--vb-headings-font-size, 1em);font-weight:var(--vb-headings-font-weight, var(--vb-font-weight-semi-bold));line-height:var(--vb-headings-line-height, inherit);color:var(--vb-headings-foreground, var(--vb-foreground-strong))}.h1,.content>h1{--vb-headings-font-size:2.75em}.h2,.content>h2{--vb-headings-font-size:2em}.h3,.content>h3{--vb-headings-font-size:1.75em}.h4,.content>h4{--vb-headings-font-size:1.5em}.h5,.content>h5{--vb-headings-font-size:1.25em}.h6,.content>h6{--vb-headings-font-size:1em}.link,.content :not(div)>a{color:var(--vb-link-foreground, var(--vb-foreground-accent));text-decoration:var(--vb-link-decoration, underline);text-decoration-thickness:var(--vb-link-decoration-thickness, 1px);text-underline-offset:var(--vb-link-underline-offset, 2px)}.link code,.content :not(div)>a code{color:var(--vb-link-foreground, var(--vb-foreground-accent));background-color:var(--vb-background-alt)}.link:hover,.link:focus,.content :not(div)>a:hover,.content :not(div)>a:focus{color:var(--vb-link-foreground-hover, light-dark(oklch(from var(--vb-foreground-accent) calc(l - 0.1) c h), oklch(from var(--vb-foreground-accent) calc(l + 0.1) c h)));text-decoration:var(--vb-link-decoration-hover, none)}.link:hover code,.link:focus code,.content :not(div)>a:hover code,.content :not(div)>a:focus code{color:var(--vb-link-foreground-hover, light-dark(oklch(from var(--vb-foreground-accent) calc(l - 0.1) c h), oklch(from var(--vb-foreground-accent) calc(l + 0.1) c h)))}.link:focus,.content :not(div)>a:focus{outline:var(--vb-link-focus-ring, currentcolor dotted 1px);outline-offset:var(--vb-link-focus-ring-offset, 0.125rem)}.list,.content>ul,.content>ol{margin-left:var(--vb-list-indent, var(--vb-spacing-lg))}.list ul,.list ol,.content>ul ul,.content>ul ol,.content>ol ul,.content>ol ol{margin-left:var(--vb-list-indent, var(--vb-spacing-lg))}.list li li,.list li+li,.content>ul li li,.content>ul li+li,.content>ol li li,.content>ol li+li{margin-top:var(--vb-list-spacing, var(--vb-spacing-sm))}.list-style-none{list-style:none !important}.code,.content :not(pre)>code{padding:var(--vb-code-padding, 0.125rem 0.375rem);border:var(--vb-code-border);border-radius:var(--vb-code-border-radius, var(--vb-border-radius));font-family:var(--vb-font-family-mono);font-size:var(--vb-code-font-size, var(--vb-font-size-sm));color:var(--vb-code-foreground, var(--vb-foreground-accent-alt));overflow-wrap:break-word;background:var(--vb-code-background, var(--vb-background-alt))}.pre,.content>pre{overflow:auto;padding:var(--vb-pre-padding, var(--vb-spacing-md));border:var(--vb-pre-border, none);border-radius:var(--vb-pre-border-radius, var(--vb-border-radius));font-family:var(--vb-font-family-mono);color:var(--vb-pre-foreground, var(--vb-foreground-strong));background:var(--vb-pre-background, var(--vb-background-alt))}.pre code,.content>pre code{padding:0;border:none;font-size:var(--vb-pre-font-size, var(--vb-font-size-sm));color:inherit;background:none}.blockquote,.content>blockquote{position:relative;padding:var(--vb-blockquote-padding, var(--vb-spacing-md));border:var(--vb-blockquote-border, var(--vb-border));border-radius:var(--vb-blockquote-border-radius, var(--vb-border-radius));color:var(--vb-blockquote-foreground, currentcolor);background:var(--vb-blockquote-background, transparent)}.blockquote>*+*,.content>blockquote>*+*{margin-top:var(--vb-blockquote-spacing, var(--vb-spacing-md))}.sep,.content>hr{display:block;height:0;border:none;border-top:var(--vb-separator-border-width, var(--vb-border-width)) var(--vb-separator-border-style, var(--vb-border-style)) var(--vb-separator-border-color, var(--vb-border-color))}.arrow,.arrow-up,.arrow-down,.arrow-left,.arrow-right{pointer-events:none;transform-origin:center;display:inline-block;flex-grow:0;flex-shrink:0;width:0;height:0;border-color:var(--vb-arrow-color, currentcolor) rgba(0,0,0,0) rgba(0,0,0,0);border-style:solid;border-width:var(--vb-arrow-size, 6px 4px);border-bottom-width:0;border-radius:var(--vb-arrow-radius, 2px)}.arrow-up{transform:rotate(180deg)}.arrow-left{transform:rotate(90deg)}.arrow-right{transform:rotate(-90deg)}.loading-spinner{width:var(--vb-loading-size, 1em);height:var(--vb-loading-size, 1em);position:relative;display:inline-block;border:var(--vb-loading-border, 2px solid);border-color:var(--vb-loading-color, currentcolor) var(--vb-loading-color, currentcolor) rgba(0,0,0,0) rgba(0,0,0,0);border-radius:var(--vb-border-radius-circle);animation:spin var(--vb-loading-duration, 0.6s) infinite linear}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.sr-only{position:absolute;overflow:hidden;width:1px;height:1px;margin:-1px;padding:0;clip-path:inset(50%)}}/*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../index.scss","../src/modules/_content.scss","../src/modules/_headings.scss","../../../node_modules/@vrembem/core/src/scss/modules/_tokens.scss","../src/modules/_link.scss","../src/modules/_list.scss","../src/modules/_code.scss","../src/modules/_pre.scss","../src/modules/_blockquote.scss","../src/modules/_separator.scss","../src/modules/_arrow.scss","../../../node_modules/@vrembem/core/src/scss/library/_arrow.scss","../src/modules/_loading-spinner.scss","../../../node_modules/@vrembem/core/src/scss/library/_size.scss","../../../node_modules/@vrembem/core/src/scss/library/_loading-spinner.scss","../src/modules/_sr-only.scss","../../../node_modules/@vrembem/core/src/scss/library/_sr-only.scss"],"names":[],"mappings":"AAIA,YCGE,SACE,mDACA,+CACA,mDACA,yDAEA,aACE,qCCLJ,gGACE,oDACA,4CACA,4EACA,oDACA,iEAYA,gBC0JE,+BD1JF,gBC0JE,4BD1JF,gBC0JE,+BD1JF,gBC0JE,8BD1JF,gBC0JE,+BD1JF,gBC0JE,4BC7KJ,2BACE,6DACA,qDACA,mEACA,2DAEA,qCACE,6DACA,0CAIF,8EAEE,wKAIA,sDAEA,kGACE,wKAOJ,uCACE,2DACA,0DC/BJ,8BACE,wDAEA,8EAEE,wDAGF,gGAEE,wDAIJ,iBACE,2BCfF,8BACE,kDACA,6BACA,oEACA,uCACA,2DACA,iEACA,yBACA,+DCRF,kBACE,cACA,oDACA,kCACA,mEACA,uCACA,4DACA,8DAEA,4BACE,UACA,YACA,0DACA,cACA,gBCdJ,gCACE,kBACA,2DACA,qDACA,0EACA,oDACA,wDAEA,wCACE,8DCTJ,iBACE,cACA,SACA,YACA,sLCNF,sDCMA,oBACA,wBACA,qBACA,YACA,cACA,QACA,SACA,6EACA,mBACA,2CACA,sBACA,0CDTA,UACE,yBAGF,YACE,wBAGF,aACE,yBEjBF,iBCUE,MCCY,+DAOd,SFjBgC,SEkBhC,qBACA,2CACA,qHACA,6CACA,gEAME,gBACE,KACE,uBAGF,GACE,0BCnCN,SCFA,kBACA,gBACA,UACA,WACA,YACA,UACA","file":"index.css"}
package/index.scss ADDED
@@ -0,0 +1,17 @@
1
+ @use "sass:meta";
2
+ @forward "./src/config";
3
+ @forward "./src/functions";
4
+
5
+ @layer base {
6
+ @include meta.load-css("./src/modules/content");
7
+ @include meta.load-css("./src/modules/headings");
8
+ @include meta.load-css("./src/modules/link");
9
+ @include meta.load-css("./src/modules/list");
10
+ @include meta.load-css("./src/modules/code");
11
+ @include meta.load-css("./src/modules/pre");
12
+ @include meta.load-css("./src/modules/blockquote");
13
+ @include meta.load-css("./src/modules/separator");
14
+ @include meta.load-css("./src/modules/arrow");
15
+ @include meta.load-css("./src/modules/loading-spinner");
16
+ @include meta.load-css("./src/modules/sr-only");
17
+ }
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@vrembem/content",
3
+ "description": "A content wrapper that provides typographic styles for common HTML elements.",
4
+ "version": "4.0.0-next.44",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "BEM",
8
+ "front-end",
9
+ "component",
10
+ "content"
11
+ ],
12
+ "style": "./dist/index.css",
13
+ "exports": {
14
+ ".": {
15
+ "sass": "./index.scss",
16
+ "style": "./dist/index.css"
17
+ },
18
+ "./dev/*": "./dev/*",
19
+ "./dist/*": "./dist/*",
20
+ "./*": "./src/*"
21
+ },
22
+ "files": [
23
+ "dev",
24
+ "dist",
25
+ "src",
26
+ "index.scss"
27
+ ],
28
+ "scripts": {
29
+ "serve": "vite",
30
+ "build": "npm-run-all clean styles",
31
+ "clean": "del dev && del dist",
32
+ "styles": "npm-run-all styles:dev styles:dist",
33
+ "styles:dev": "sass index.scss dev/index.css --load-path=../../node_modules",
34
+ "styles:dist": "sass index.scss dist/index.css --load-path=../../node_modules --style=compressed",
35
+ "watch": "npm run watch:styles",
36
+ "watch:styles": "concurrently 'npm run styles:dev -- --watch' 'npm run styles:dist -- --watch'"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/sebnitu/vrembem.git",
41
+ "directory": "packages/base"
42
+ },
43
+ "homepage": "https://github.com/sebnitu/vrembem/tree/main/packages/base#readme",
44
+ "dependencies": {
45
+ "@vrembem/core": "^4.0.0-next.44"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "gitHead": "db5caf39b87d0e20d9ff9ed1821166d3d28c6635"
51
+ }
@@ -0,0 +1,59 @@
1
+ @use "@vrembem/core";
2
+ @use "@vrembem/core/config";
3
+
4
+ $config: () !default;
5
+
6
+ // prettier-ignore
7
+ $default: (
8
+ // Controls whether module styles are output. This can be overridden on a per
9
+ // module basis using the `content-output-exceptions` config option.
10
+ // @type boolean
11
+ "content-output": true,
12
+
13
+ // Modules to exclude from the output rule set in `content-output`
14
+ // @type list
15
+ "content-output-exceptions": (),
16
+
17
+ // A map containing module names as keys and their preferred class selectors
18
+ // @type map
19
+ "content-classes": (
20
+ "separator": "sep"
21
+ ),
22
+
23
+ // A prefix to apply to content class selectors. Provided value is automatically
24
+ // suffixed with a "-" character when applied.
25
+ // @type string
26
+ "content-prefix": "",
27
+
28
+ // Used to output the heading styles and their font-size/line-height CSS
29
+ // variables. Should contain a key of the heading level to output and the
30
+ // value of a font-size and optional line-height (space separated).
31
+ // @type map
32
+ "content-headings": (
33
+ "h1": 2.75em,
34
+ "h2": 2em,
35
+ "h3": 1.75em,
36
+ "h4": 1.5em,
37
+ "h5": 1.25em,
38
+ "h6": 1em
39
+ ),
40
+
41
+ // Map modules to their preferred content selectors
42
+ // @type map
43
+ "content-selectors": (
44
+ "h1": "> h1",
45
+ "h2": "> h2",
46
+ "h3": "> h3",
47
+ "h4": "> h4",
48
+ "h5": "> h5",
49
+ "h6": "> h6",
50
+ "link": ":not(div) > a",
51
+ "list": "> ul, > ol",
52
+ "code": ":not(pre) > code",
53
+ "pre": "> pre",
54
+ "blockquote": "> blockquote",
55
+ "separator": "> hr"
56
+ )
57
+ );
58
+
59
+ @include config.apply($config, $default);
@@ -0,0 +1,133 @@
1
+ @use "sass:list";
2
+ @use "sass:string";
3
+ @use "sass:map";
4
+ @use "sass:meta";
5
+ @use "@vrembem/core/config";
6
+
7
+ /// Conditional logic for when to output a content module.
8
+ ///
9
+ /// @param {string} $module
10
+ /// The module name to conditionally toggle output.
11
+ ///
12
+ /// @return {boolean}
13
+ /// The resolved condition boolean.
14
+ ///
15
+ @function maybe-output($module) {
16
+ @if list.index(config.get("content-output-exceptions"), $module) {
17
+ @return not config.get("content-output");
18
+ } @else {
19
+ @return config.get("content-output");
20
+ }
21
+ }
22
+
23
+ /// Creates a content selector for a content module if configured in `$content-include`.
24
+ ///
25
+ /// @param {string} $module
26
+ /// The content module to check if content selector should be included.
27
+ ///
28
+ /// @return {selector}
29
+ /// A partial CSS selector starting with ", " meant to be appended to an
30
+ /// existing selector. Will return an empty string if not configured.
31
+ ///
32
+ /// @access private
33
+ @function -get-content-selector($module) {
34
+ // Initialize the content selector as an empty string
35
+ $content-selector: "";
36
+
37
+ // Check if we should include this module in content styles
38
+ @if map.has-key(config.get("content-selectors"), $module) {
39
+ // Initialize the content class selector
40
+ $content: "content";
41
+
42
+ // Check if there's a shortname for the content module
43
+ @if map.has-key(config.get("content-classes"), "content") {
44
+ $content: map.get(config.get("content-classes"), "content");
45
+ }
46
+
47
+ // Apply the block prefix to the root content class
48
+ $content: '#{config.get("prefix-block")}#{$content}';
49
+
50
+ // Create the content selector using the content module selector
51
+ $list: string.split(map.get(config.get("content-selectors"), $module), ",");
52
+
53
+ @each $item in $list {
54
+ $content-selector: "#{$content-selector}, .#{$content} #{$item}";
55
+ }
56
+ }
57
+
58
+ // Return the content selector
59
+ @return $content-selector;
60
+ }
61
+
62
+ /// Generate a content module selector with a core prefix and optional modifiers.
63
+ ///
64
+ /// @param {string} $module
65
+ /// The content module name.
66
+ /// @param {string} $args...
67
+ /// Additional strings appended as modifiers to the class selector.
68
+ ///
69
+ /// @return {selector}
70
+ /// A valid content module CSS selector.
71
+ ///
72
+ @function selector(
73
+ $module,
74
+ $args...
75
+ ) {
76
+ @if meta.type-of($module) == "map" or meta.type-of($module) == "list" {
77
+ // If $module is a map or list, build a selector for each item/key
78
+ $selectors: ();
79
+ $items: $module;
80
+
81
+ @if meta.type-of($module) == "map" {
82
+ $items: map.keys($module);
83
+ }
84
+
85
+ @each $item in $items {
86
+ $selectors: list.append(
87
+ $selectors,
88
+ selector(
89
+ $item,
90
+ $args...
91
+ ),
92
+ comma
93
+ );
94
+ }
95
+
96
+ @return list.join($selectors, ", ");
97
+ } @else {
98
+ // Setup name var since we use `$module` later
99
+ $name: $module;
100
+
101
+ // Check if there's a shortname for the provided module name
102
+ @if map.has-key(config.get("content-classes"), $name) {
103
+ $name: map.get(config.get("content-classes"), $name);
104
+ }
105
+
106
+ $prefix: config.get("content-prefix");
107
+
108
+ @if $prefix and $prefix != "" {
109
+ $prefix: "#{$prefix}-";
110
+ }
111
+
112
+ // Setup the content module class name with prefix
113
+ $class: "#{$prefix}#{$name}";
114
+
115
+ // Apply all the arguments to class
116
+ @each $arg in $args {
117
+ // Convert arg to a string
118
+ $arg: "" + $arg;
119
+
120
+ // Ensure that it's not an empty string
121
+ @if $arg != "" {
122
+ // Append $arg to $class with a dash delimiter
123
+ $class: "#{$class}-#{$arg}";
124
+ }
125
+ }
126
+
127
+ // Get the content selector if one is required
128
+ $content-selector: -get-content-selector($module);
129
+
130
+ // Return the class
131
+ @return ".#{$class}#{$content-selector}";
132
+ }
133
+ }
@@ -0,0 +1,24 @@
1
+ @use "@vrembem/core";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("arrow") {
5
+ #{fun.selector("arrow")},
6
+ #{fun.selector("arrow", "up")},
7
+ #{fun.selector("arrow", "down")},
8
+ #{fun.selector("arrow", "left")},
9
+ #{fun.selector("arrow", "right")} {
10
+ @include core.arrow;
11
+ }
12
+
13
+ #{fun.selector("arrow", "up")} {
14
+ transform: rotate(180deg);
15
+ }
16
+
17
+ #{fun.selector("arrow", "left")} {
18
+ transform: rotate(90deg);
19
+ }
20
+
21
+ #{fun.selector("arrow", "right")} {
22
+ transform: rotate(-90deg);
23
+ }
24
+ }
@@ -0,0 +1,19 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("blockquote") {
5
+ @include tokens.register("blockquote");
6
+
7
+ #{fun.selector("blockquote")} {
8
+ position: relative;
9
+ padding: tokens.get("blockquote", "padding", tokens.get("spacing-md"));
10
+ border: tokens.get("blockquote", "border", tokens.get("border"));
11
+ border-radius: tokens.get("blockquote", "border-radius", tokens.get("border-radius"));
12
+ color: tokens.get("blockquote", "foreground", currentcolor);
13
+ background: tokens.get("blockquote", "background", transparent);
14
+
15
+ > * + * {
16
+ margin-top: tokens.get("blockquote", "spacing", tokens.get("spacing-md"));
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,17 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("code") {
5
+ @include tokens.register("code");
6
+
7
+ #{fun.selector("code")} {
8
+ padding: tokens.get("code", "padding", 0.125rem 0.375rem);
9
+ border: tokens.get("code", "border", null);
10
+ border-radius: tokens.get("code", "border-radius", tokens.get("border-radius"));
11
+ font-family: tokens.get("font-family-mono");
12
+ font-size: tokens.get("code", "font-size", tokens.get("font-size-sm"));
13
+ color: tokens.get("code", "foreground", tokens.get("foreground-accent-alt"));
14
+ overflow-wrap: break-word;
15
+ background: tokens.get("code", "background", tokens.get("background-alt"));
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("content") {
5
+ @include tokens.register("content");
6
+ @include tokens.register("heading");
7
+
8
+ #{fun.selector("content")} {
9
+ font-family: tokens.get("content", "font-family", inherit);
10
+ font-size: tokens.get("content", "font-size", inherit);
11
+ line-height: tokens.get("content", "line-height", inherit);
12
+ color: tokens.get("content", "foreground", tokens.get("foreground"));
13
+
14
+ > * + * {
15
+ margin-top: tokens.get("content", "spacing", null);
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,32 @@
1
+ @use "sass:list";
2
+ @use "sass:meta";
3
+ @use "@vrembem/core/tokens";
4
+ @use "@vrembem/core/config";
5
+ @use "../functions" as fun;
6
+
7
+ @if fun.maybe-output("headings") {
8
+ @include tokens.register("headings");
9
+
10
+ #{fun.selector(config.get("content-headings"))} {
11
+ font-family: tokens.get("headings", "font-family", inherit);
12
+ font-size: tokens.get("headings", "font-size", 1em);
13
+ font-weight: tokens.get("headings", "font-weight", tokens.get("font-weight-semi-bold"));
14
+ line-height: tokens.get("headings", "line-height", inherit);
15
+ color: tokens.get("headings", "foreground", tokens.get("foreground-strong"));
16
+ }
17
+
18
+ @each $key, $value in config.get("content-headings") {
19
+ $font-size: $value;
20
+ $line-height: null;
21
+
22
+ @if meta.type-of($value) == list {
23
+ $font-size: list.nth($value, 1);
24
+ $line-height: list.nth($value, 2);
25
+ }
26
+
27
+ #{fun.selector($key)} {
28
+ @include tokens.override("headings", "font-size", $font-size);
29
+ @include tokens.override("headings", "line-height", $line-height);
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,41 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "@vrembem/core/palette";
3
+ @use "../functions" as fun;
4
+
5
+ @if fun.maybe-output("link") {
6
+ @include tokens.register("link");
7
+
8
+ #{fun.selector("link")} {
9
+ color: tokens.get("link", "foreground", tokens.get("foreground-accent"));
10
+ text-decoration: tokens.get("link", "decoration", underline);
11
+ text-decoration-thickness: tokens.get("link", "decoration-thickness", 1px);
12
+ text-underline-offset: tokens.get("link", "underline-offset", 2px);
13
+
14
+ code {
15
+ color: tokens.get("link", "foreground", tokens.get("foreground-accent"));
16
+ background-color: tokens.get("background-alt");
17
+ }
18
+
19
+ // prettier-ignore
20
+ &:hover,
21
+ &:focus {
22
+ color: tokens.get("link", "foreground-hover", light-dark(
23
+ oklch(from tokens.get("foreground-accent") calc(l - 0.1) c h),
24
+ oklch(from tokens.get("foreground-accent") calc(l + 0.1) c h),
25
+ ));
26
+ text-decoration: tokens.get("link", "decoration-hover", none);
27
+
28
+ code {
29
+ color: tokens.get("link", "foreground-hover", light-dark(
30
+ oklch(from tokens.get("foreground-accent") calc(l - 0.1) c h),
31
+ oklch(from tokens.get("foreground-accent") calc(l + 0.1) c h)
32
+ ));
33
+ }
34
+ }
35
+
36
+ &:focus {
37
+ outline: tokens.get("link", "focus-ring", currentcolor dotted 1px);
38
+ outline-offset: tokens.get("link", "focus-ring-offset", 0.125rem);
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,24 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("list") {
5
+ @include tokens.register("list");
6
+
7
+ #{fun.selector("list")} {
8
+ margin-left: tokens.get("list", "indent", tokens.get("spacing-lg"));
9
+
10
+ ul,
11
+ ol {
12
+ margin-left: tokens.get("list", "indent", tokens.get("spacing-lg"));
13
+ }
14
+
15
+ li li,
16
+ li + li {
17
+ margin-top: tokens.get("list", "spacing", tokens.get("spacing-sm"));
18
+ }
19
+ }
20
+
21
+ #{fun.selector("list-style-none")} {
22
+ list-style: none !important;
23
+ }
24
+ }
@@ -0,0 +1,8 @@
1
+ @use "@vrembem/core";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("loading-spinner") {
5
+ #{fun.selector("loading-spinner")} {
6
+ @include core.loading-spinner(relative);
7
+ }
8
+ }
@@ -0,0 +1,24 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("pre") {
5
+ @include tokens.register("pre");
6
+
7
+ #{fun.selector("pre")} {
8
+ overflow: auto;
9
+ padding: tokens.get("pre", "padding", tokens.get("spacing-md"));
10
+ border: tokens.get("pre", "border", none);
11
+ border-radius: tokens.get("pre", "border-radius", tokens.get("border-radius"));
12
+ font-family: tokens.get("font-family-mono");
13
+ color: tokens.get("pre", "foreground", tokens.get("foreground-strong"));
14
+ background: tokens.get("pre", "background", tokens.get("background-alt"));
15
+
16
+ code {
17
+ padding: 0;
18
+ border: none;
19
+ font-size: tokens.get("pre", "font-size", tokens.get("font-size-sm"));
20
+ color: inherit;
21
+ background: none;
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,13 @@
1
+ @use "@vrembem/core/tokens";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("separator") {
5
+ @include tokens.register("separator");
6
+
7
+ #{fun.selector("separator")} {
8
+ display: block;
9
+ height: 0;
10
+ border: none;
11
+ border-top: tokens.get("separator", "border-width", tokens.get("border-width")) tokens.get("separator", "border-style", tokens.get("border-style")) tokens.get("separator", "border-color", tokens.get("border-color"));
12
+ }
13
+ }
@@ -0,0 +1,8 @@
1
+ @use "@vrembem/core";
2
+ @use "../functions" as fun;
3
+
4
+ @if fun.maybe-output("sr-only") {
5
+ #{fun.selector("sr-only")} {
6
+ @include core.sr-only;
7
+ }
8
+ }