@ulu/frontend 0.6.10 → 0.6.11

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.
@@ -80,6 +80,7 @@ $config: (
80
80
 
81
81
  $rule-styles: (
82
82
  "default": 1px solid color.get("rule"),
83
+ "large": 2px solid color.get("rule"),
83
84
  "light": 1px solid color.get("rule-light"),
84
85
  ) !default;
85
86
 
@@ -41,10 +41,91 @@ $config: (
41
41
  @return utils.require-map-get($config, $name, "layout [config]");
42
42
  }
43
43
 
44
+ /// System widths
45
+ /// @type Map
46
+ /// @prop {Map} [name] The width definition
47
+ /// @prop {String|Number} [name].value The base width value
48
+ /// @prop {Boolean} [name].helper-class Output a helper class for this width
49
+ /// @prop {Map} [name].breakpoints Responsive breakpoints (optional)
50
+
51
+ $widths: (
52
+ "small-x": (
53
+ "value": 6rem,
54
+ "helper-class": true
55
+ ),
56
+ "small": (
57
+ "value": 8rem,
58
+ "helper-class": true
59
+ ),
60
+ "medium": (
61
+ "value": 16rem,
62
+ "helper-class": true
63
+ ),
64
+ "large": (
65
+ "value": 32rem,
66
+ "helper-class": true
67
+ )
68
+ ) !default;
69
+
70
+ /// Change widths config
71
+ /// @param {Map} $changes Map of changes
72
+ /// @param {String} $merge-mode Merge mode see utils.map-merge() [null|"deep"|"overwrite"]
73
+
74
+ @mixin set-widths($changes, $merge-mode: null) {
75
+ $widths: utils.map-merge($widths, $changes, $merge-mode) !global;
76
+ }
77
+
78
+ /// Get a width config by name
79
+ /// @param {String} $name Name of width
80
+ /// @return {Map} The width configuration object
81
+
82
+ @function get-width($name) {
83
+ @return utils.require-map-get($widths, $name, "layout [widths]");
84
+ }
85
+
86
+ /// System max-widths
87
+ /// @type Map
88
+ /// @prop {Map} [name] The max-width definition
89
+ /// @prop {String|Number} [name].value The base max-width value
90
+ /// @prop {Boolean} [name].helper-class Output a helper class for this max-width
91
+ /// @prop {Map} [name].breakpoints Responsive breakpoints (optional)
92
+
93
+ $max-widths: (
94
+ "small": (
95
+ "value": 20rem,
96
+ "helper-class": true
97
+ ),
98
+ "medium": (
99
+ "value": 40rem,
100
+ "helper-class": true
101
+ ),
102
+ "large": (
103
+ "value": 60rem,
104
+ "helper-class": true
105
+ )
106
+ ) !default;
107
+
108
+ /// Change max-widths config
109
+ /// @param {Map} $changes Map of changes
110
+ /// @param {String} $merge-mode Merge mode see utils.map-merge() [null|"deep"|"overwrite"]
111
+
112
+ @mixin set-max-widths($changes, $merge-mode: null) {
113
+ $max-widths: utils.map-merge($max-widths, $changes, $merge-mode) !global;
114
+ }
115
+
116
+ /// Get a max-width config by name
117
+ /// @param {String} $name Name of max-width
118
+ /// @return {Map} The max-width configuration object
119
+
120
+ @function get-max-width($name) {
121
+ @return utils.require-map-get($max-widths, $name, "layout [max-widths]");
122
+ }
123
+
44
124
  /// Containers Lookup (use set-containers)
45
125
  /// @type Map
46
126
  /// @ignore This needs to be below the methods it uses!
47
127
 
128
+
48
129
  $containers: (
49
130
  "container" : (
50
131
  "width" : 100%,
@@ -7,6 +7,7 @@
7
7
 
8
8
  @use "../utils";
9
9
  @use "../cssvar";
10
+ @use "../layout";
10
11
 
11
12
  /// Module Settings
12
13
  /// @type Map
@@ -102,4 +103,12 @@ $cssvars: () !default;
102
103
  // This may need to be adjusted if config is used for something else
103
104
  @include cssvar.declare-all($config, $prefix);
104
105
  @include cssvar.declare("scrollbar-width", 0px, $prefix); // Set by JS
106
+
107
+ @each $name, $props in layout.$widths {
108
+ @include cssvar.declare("width-#{ $name }", $props, $prefix);
109
+ }
110
+
111
+ @each $name, $props in layout.$max-widths {
112
+ @include cssvar.declare("max-width-#{ $name }", $props, $prefix);
113
+ }
105
114
  }
@@ -0,0 +1,182 @@
1
+ ////
2
+ /// @group graphic-text-group
3
+ /// Graphic Text Group layout component
4
+ ////
5
+
6
+ @use "sass:map";
7
+ @use "sass:meta";
8
+ @use "sass:math";
9
+
10
+ @use "../selector";
11
+ @use "../utils";
12
+ @use "../element";
13
+ @use "../breakpoint";
14
+
15
+ // Used for function fallback
16
+ $-fallbacks: (
17
+ "rule-border": (
18
+ "function": meta.get-function("get-rule-style", false, "element"),
19
+ "arguments": ("large",)
20
+ ),
21
+ "separator-border": (
22
+ "function": meta.get-function("get-rule-style", false, "element"),
23
+ "arguments": ("light",)
24
+ )
25
+ );
26
+
27
+ /// Module Settings
28
+ /// @type Map
29
+ /// @prop {CssUnit} gap [1rem] The gap between graphic and text.
30
+ /// @prop {List} margin [2em 0] Margin applied to the group.
31
+ /// @prop {CssUnit} graphic-width [3.5rem] The default safe width for the graphic.
32
+ /// @prop {Border} rule-border [true] The border style for the rules.
33
+ /// @prop {CssUnit} rule-padding [1rem] The padding applied when using rules.
34
+ /// @prop {String} wrap-breakpoint ["small"] The breakpoint name at which the layout wraps to a column.
35
+ /// @prop {Border} separator-border [true] The border style for the separator between graphic and text.
36
+ /// @prop {CssUnit} separator-gap [0.5rem] The gap when the separator modifier is used (typically smaller since there are two gaps around the separator).
37
+
38
+ $config: (
39
+ "gap" : 1rem,
40
+ "margin" : (2em 0),
41
+ "graphic-width" : 3.5rem,
42
+ "rule-border" : true,
43
+ "rule-padding" : 1rem,
44
+ "wrap-breakpoint" : "small",
45
+ "separator-border" : true,
46
+ "separator-gap" : 0.8rem,
47
+ ) !default;
48
+
49
+ /// Change modules $config
50
+ /// @param {Map} $changes Map of changes
51
+ /// @example scss
52
+ /// @include ulu.component-graphic-text-group-set(( "property" : value ));
53
+
54
+ @mixin set($changes) {
55
+ $config: map.merge($config, $changes) !global;
56
+ }
57
+
58
+ /// Get a config option
59
+ /// @param {Map} $name Name of property
60
+ /// @example scss
61
+ /// @include ulu.component-graphic-text-group-get("property");
62
+
63
+ @function get($name) {
64
+ $value: utils.require-map-get($config, $name, "graphic-text-group [config]");
65
+ @return utils.function-fallback($name, $value, $-fallbacks);
66
+ }
67
+
68
+ /// Prints component styles
69
+ /// @demo graphic-text-group
70
+ /// @example scss
71
+ /// @include ulu.component-graphic-text-group-styles();
72
+
73
+ @mixin styles {
74
+ $prefix: selector.class("graphic-text-group");
75
+
76
+ #{ $prefix } {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: get("gap");
80
+ margin: get("margin");
81
+ }
82
+
83
+ #{ $prefix }__graphic {
84
+ flex-shrink: 0;
85
+ width: get("graphic-width");
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ order: 1;
90
+
91
+ img, svg {
92
+ margin: 0;
93
+ }
94
+ }
95
+
96
+ #{ $prefix }__text {
97
+ flex-grow: 1;
98
+ min-width: 0;
99
+ order: 3;
100
+ }
101
+
102
+ // Separator Modifier
103
+ #{ $prefix }--separator {
104
+ gap: get("separator-gap");
105
+ &::before {
106
+ content: "";
107
+ display: block;
108
+ order: 2;
109
+ align-self: stretch;
110
+ border-left: get("separator-border");
111
+ }
112
+ &#{ $prefix }--top,
113
+ &#{ $prefix }--bottom {
114
+ &::before {
115
+ border-left: none;
116
+ border-bottom: get("separator-border");
117
+ }
118
+ }
119
+ }
120
+
121
+ // Responsive Modifiers
122
+ #{ $prefix }--wrap {
123
+ @include breakpoint.max(get("wrap-breakpoint")) {
124
+ flex-direction: column;
125
+ align-items: flex-start;
126
+ &#{ $prefix }--separator::before {
127
+ border-left: none;
128
+ border-bottom: get("separator-border");
129
+ }
130
+ }
131
+ }
132
+
133
+ // Alignment Modifiers
134
+ #{ $prefix }--align-start {
135
+ align-items: flex-start;
136
+ }
137
+
138
+ #{ $prefix }--align-end {
139
+ align-items: flex-end;
140
+ }
141
+
142
+ // Position Modifiers
143
+ #{ $prefix }--right {
144
+ > #{ $prefix }__graphic {
145
+ order: 3;
146
+ }
147
+ > #{ $prefix }__text {
148
+ order: 1;
149
+ }
150
+ }
151
+
152
+ #{ $prefix }--top {
153
+ flex-direction: column;
154
+ }
155
+
156
+ #{ $prefix }--bottom {
157
+ flex-direction: column;
158
+ > #{ $prefix }__graphic {
159
+ order: 3;
160
+ }
161
+ > #{ $prefix }__text {
162
+ order: 1;
163
+ }
164
+ }
165
+
166
+ #{ $prefix }--center {
167
+ align-items: center;
168
+ text-align: center;
169
+ }
170
+
171
+ // Rule Modifiers
172
+ #{ $prefix }--rule-top {
173
+ border-top: get("rule-border");
174
+ padding-top: get("rule-padding");
175
+ }
176
+
177
+ #{ $prefix }--rule-bottom {
178
+ border-bottom: get("rule-border");
179
+ padding-bottom: get("rule-padding");
180
+ }
181
+ }
182
+
@@ -25,6 +25,7 @@
25
25
  @forward "flipcard" as flipcard-*;
26
26
  @forward "flipcard-grid" as flipcard-grid-*;
27
27
  @forward "form-theme" as form-theme-*;
28
+ @forward "graphic-text-group" as graphic-text-group-*;
28
29
  @forward "headline-label" as headline-label-*;
29
30
  @forward "input-group" as input-group-*;
30
31
  @forward "rule-inline" as rule-inline-*;
@@ -91,6 +92,7 @@
91
92
  @use "flipcard";
92
93
  @use "flipcard-grid";
93
94
  @use "form-theme";
95
+ @use "graphic-text-group";
94
96
  @use "headline-label";
95
97
  @use "input-group";
96
98
  @use "rule-inline";
@@ -158,6 +160,7 @@ $all-includes: (
158
160
  "flipcard",
159
161
  "flipcard-grid",
160
162
  "form-theme",
163
+ "graphic-text-group",
161
164
  "headline-label",
162
165
  "input-group",
163
166
  "rule-inline",
@@ -309,6 +312,9 @@ $current-includes: $all-includes;
309
312
  @if (list.index($includes, "form-theme")) {
310
313
  @include form-theme.styles;
311
314
  }
315
+ @if (list.index($includes, "graphic-text-group")) {
316
+ @include graphic-text-group.styles;
317
+ }
312
318
  @if (list.index($includes, "headline-label")) {
313
319
  @include headline-label.styles;
314
320
  }
@@ -28,6 +28,10 @@ $-fallbacks: (
28
28
  "link-line-height" : (
29
29
  "function" : meta.get-function("get", false, "typography"),
30
30
  "property" : "line-height-dense"
31
+ ),
32
+ "stacked-link-border-radius" : (
33
+ "function" : meta.get-function("get", false, "element"),
34
+ "property" : "border-radius-small"
31
35
  )
32
36
  );
33
37
 
@@ -46,6 +50,9 @@ $-fallbacks: (
46
50
  /// @prop {Dimension} compact-selectable-input-width [2em] The width of the checkbox/radio input (when compact modifier)
47
51
  /// @prop {Dimension} compact-selectable-input-font-size [null] Optional compact input font-size
48
52
  /// @prop {Dimension} compact-selectable-input-top [null] Optional y/top for input
53
+ /// @prop {Dimension} stacked-link-padding-x [0.4em] The links horizontal padding when using the stacked option.
54
+ /// @prop {Dimension} stacked-link-padding-y [0.4em] The links vertical padding when using the stacked option.
55
+ /// @prop {Dimension} stacked-link-icon-margin [0.35em] Margin between icon and text when stacked.
49
56
  /// @prop {Color} label-color [null] The type color of the label.
50
57
  /// @prop {Dimension} label-margin [0.5em] The margin of the label.
51
58
  /// @prop {CssValue} label-text-transform [uppercase] Transforms the label text.
@@ -121,6 +128,10 @@ $config: (
121
128
  "compact-selectable-input-width": 2.2em,
122
129
  "compact-selectable-input-top" : 0.5em,
123
130
  "compact-selectable-input-font-size": 0.8em,
131
+ "stacked-link-padding-x": 0.4em,
132
+ "stacked-link-padding-y": 0.4em,
133
+ "stacked-link-icon-margin": 0.35em,
134
+ "stacked-link-border-radius": true,
124
135
  "selectable-input-width" : 3em,
125
136
  "selectable-input-top" : 0.73em,
126
137
  "selectable-input-font-size" : null,
@@ -372,6 +383,28 @@ $config: (
372
383
  }
373
384
  }
374
385
 
386
+ #{ $prefix }--stacked {
387
+ @include cssvar.declare-ulu("menu-stack-link-padding-x", get("stacked-link-padding-x"));
388
+
389
+ #{ $prefix }__link,
390
+ #{ $prefix }__toggle {
391
+ flex-direction: column;
392
+ justify-content: center;
393
+ text-align: center;
394
+ border-radius: get("stacked-link-border-radius");
395
+ padding-top: get("stacked-link-padding-y");
396
+ padding-bottom: get("stacked-link-padding-y");
397
+ }
398
+ #{ $prefix }__link-icon {
399
+ margin-right: 0;
400
+ margin-bottom: get("stacked-link-icon-margin");
401
+
402
+ &:last-child {
403
+ margin-bottom: 0;
404
+ }
405
+ }
406
+ }
407
+
375
408
  #{ $prefix }--columns {
376
409
  > #{ $prefix }__list {
377
410
  display: grid;
@@ -9,6 +9,7 @@
9
9
  @forward "print" as print-*;
10
10
  @forward "units" as units-*;
11
11
  @forward "color" as color-*;
12
+ @forward "layout" as layout-*;
12
13
 
13
14
  @use "sass:list";
14
15
 
@@ -19,6 +20,7 @@
19
20
  @use "units";
20
21
  @use "print";
21
22
  @use "color";
23
+ @use "layout";
22
24
 
23
25
  /// Default includes, all modules
24
26
  /// @type List
@@ -29,7 +31,8 @@ $all-includes: (
29
31
  "display",
30
32
  "utilities",
31
33
  "print",
32
- "color"
34
+ "color",
35
+ "layout"
33
36
  );
34
37
 
35
38
  /// Current included modules (for output when using styles), defaults to all
@@ -71,6 +74,9 @@ $current-includes: $all-includes;
71
74
  @if (list.index($includes, "units")) {
72
75
  @include units.styles;
73
76
  }
77
+ @if (list.index($includes, "layout")) {
78
+ @include layout.styles;
79
+ }
74
80
  @if (list.index($includes, "display")) {
75
81
  @include display.styles;
76
82
  }
@@ -89,3 +95,4 @@ $current-includes: $all-includes;
89
95
 
90
96
 
91
97
 
98
+
@@ -0,0 +1,36 @@
1
+ ////
2
+ /// @group layout
3
+ /// Output layout helper classes (widths, max-widths, etc)
4
+ ////
5
+
6
+ @use "sass:map";
7
+
8
+ @use "../layout";
9
+ @use "../selector";
10
+ @use "../utils";
11
+ @use "../cssvar";
12
+
13
+ /// Output Layout Helper Styles
14
+
15
+ @mixin styles {
16
+ @include utils.file-header('helpers', 'layout');
17
+
18
+ $prefix-width: selector.class("width");
19
+ @each $name, $props in layout.$widths {
20
+ @if map.get($props, "helper-class") {
21
+ #{ $prefix-width }-#{ $name } {
22
+ width: cssvar.use-ulu("width-#{ $name }");
23
+ max-width: 100%;
24
+ }
25
+ }
26
+ }
27
+
28
+ $prefix-max-width: selector.class("max-width");
29
+ @each $name, $props in layout.$max-widths {
30
+ @if map.get($props, "helper-class") {
31
+ #{ $prefix-max-width }-#{ $name } {
32
+ max-width: cssvar.use-ulu("max-width-#{ $name }");
33
+ }
34
+ }
35
+ }
36
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulu/frontend",
3
- "version": "0.6.10",
3
+ "version": "0.6.11",
4
4
  "description": "A framework-agnostic frontend toolkit providing a modular, tree-shakable library of accessible components and utilities. Designed for seamless integration, it features a highly configurable SCSS system for any environment and vanilla JavaScript modules optimized for traditional websites and content management systems.",
5
5
  "type": "module",
6
6
  "files": [
@@ -12,7 +12,7 @@
12
12
  "types": "./dist/es/index.d.ts",
13
13
  "exports": {
14
14
  ".": {
15
- "sass" : "./lib/scss/index.scss",
15
+ "sass": "./lib/scss/index.scss",
16
16
  "types": "./dist/es/index.d.ts",
17
17
  "import": "./dist/es/index.js",
18
18
  "require": "./dist/umd/ulu-frontend.umd.js"
@@ -99,6 +99,7 @@
99
99
  "@fortawesome/fontawesome-free": "^6.5.2",
100
100
  "@ulu/eleventy-plugin-nav-tree": "^0.0.1",
101
101
  "@ulu/markdown-output-utils": "^0.0.6",
102
+ "@ulu/mcp-context-server": "^0.0.3",
102
103
  "@ulu/sassdoc-to-markdown": "^0.0.16",
103
104
  "@ulu/utils": "^0.0.34",
104
105
  "@ulu/vite-plugin-eleventy": "^0.0.1",