@daffodil/design 0.90.0 → 0.91.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 (200) hide show
  1. package/accordion/index.d.ts +8 -5
  2. package/article/README.md +1 -1
  3. package/article/index.d.ts +20 -0
  4. package/article/src/article-theme.scss +10 -0
  5. package/button/index.d.ts +4 -4
  6. package/button/src/button/button-base.scss +3 -3
  7. package/button/src/button/raised/raised-theme.scss +2 -2
  8. package/card/README.md +0 -8
  9. package/card/index.d.ts +7 -41
  10. package/card/src/card-base-theme.scss +2 -5
  11. package/card/src/card-base.scss +2 -2
  12. package/checkbox/README.md +0 -0
  13. package/checkbox/index.d.ts +177 -0
  14. package/fesm2022/daffodil-design-accordion.mjs +23 -14
  15. package/fesm2022/daffodil-design-accordion.mjs.map +1 -1
  16. package/fesm2022/daffodil-design-article.mjs +129 -5
  17. package/fesm2022/daffodil-design-article.mjs.map +1 -1
  18. package/fesm2022/daffodil-design-button.mjs +24 -20
  19. package/fesm2022/daffodil-design-button.mjs.map +1 -1
  20. package/fesm2022/daffodil-design-card.mjs +16 -63
  21. package/fesm2022/daffodil-design-card.mjs.map +1 -1
  22. package/fesm2022/daffodil-design-checkbox.mjs +317 -0
  23. package/fesm2022/daffodil-design-checkbox.mjs.map +1 -0
  24. package/fesm2022/daffodil-design-form-field.mjs +35 -65
  25. package/fesm2022/daffodil-design-form-field.mjs.map +1 -1
  26. package/fesm2022/daffodil-design-form.mjs +62 -0
  27. package/fesm2022/daffodil-design-form.mjs.map +1 -0
  28. package/fesm2022/daffodil-design-image.mjs +12 -4
  29. package/fesm2022/daffodil-design-image.mjs.map +1 -1
  30. package/fesm2022/daffodil-design-modal.mjs +55 -56
  31. package/fesm2022/daffodil-design-modal.mjs.map +1 -1
  32. package/fesm2022/daffodil-design-notification.mjs +14 -50
  33. package/fesm2022/daffodil-design-notification.mjs.map +1 -1
  34. package/fesm2022/daffodil-design-paginator.mjs +6 -11
  35. package/fesm2022/daffodil-design-paginator.mjs.map +1 -1
  36. package/fesm2022/daffodil-design-quantity-field.mjs +3 -5
  37. package/fesm2022/daffodil-design-quantity-field.mjs.map +1 -1
  38. package/fesm2022/daffodil-design-radio.mjs +13 -42
  39. package/fesm2022/daffodil-design-radio.mjs.map +1 -1
  40. package/fesm2022/daffodil-design-sidebar.mjs +6 -36
  41. package/fesm2022/daffodil-design-sidebar.mjs.map +1 -1
  42. package/fesm2022/daffodil-design-switch.mjs +48 -105
  43. package/fesm2022/daffodil-design-switch.mjs.map +1 -1
  44. package/fesm2022/daffodil-design-tabs.mjs +22 -14
  45. package/fesm2022/daffodil-design-tabs.mjs.map +1 -1
  46. package/fesm2022/daffodil-design-toast.mjs +56 -55
  47. package/fesm2022/daffodil-design-toast.mjs.map +1 -1
  48. package/fesm2022/daffodil-design-tree.mjs +4 -13
  49. package/fesm2022/daffodil-design-tree.mjs.map +1 -1
  50. package/fesm2022/daffodil-design.mjs +250 -461
  51. package/fesm2022/daffodil-design.mjs.map +1 -1
  52. package/form/README.md +75 -0
  53. package/form/index.d.ts +27 -0
  54. package/form-field/README.md +49 -39
  55. package/form-field/index.d.ts +56 -36
  56. package/image/README.md +27 -19
  57. package/image/index.d.ts +6 -1
  58. package/index.d.ts +180 -259
  59. package/input/README.md +32 -12
  60. package/modal/README.md +106 -16
  61. package/modal/index.d.ts +50 -21
  62. package/native-select/README.md +52 -15
  63. package/notification/index.d.ts +7 -38
  64. package/package.json +1 -1
  65. package/paginator/index.d.ts +1 -7
  66. package/radio/index.d.ts +0 -16
  67. package/scss/layout/_breakpoint.scss +1 -1
  68. package/scss/theme.scss +2 -4
  69. package/scss/theming/_color-palettes.scss +21 -7
  70. package/scss/theming/_configure-theme.scss +11 -10
  71. package/scss/theming/_daff-theme.scss +5 -14
  72. package/scss/theming/_get-base-color.scss +2 -2
  73. package/scss/theming/_get-palette.scss +2 -2
  74. package/scss/theming/_get-theme-mode.scss +3 -3
  75. package/scss/theming/_index.scss +2 -1
  76. package/scss/theming/contrast/max-contrast/max-contrast.scss +3 -3
  77. package/scss/theming/contrast/text-contrast/text-contrast.scss +22 -16
  78. package/scss/theming/contrast/text-contrast/text-contrast.spec.scss +57 -0
  79. package/scss/theming/create-theme/_create-theme.scss +330 -0
  80. package/scss/theming/create-theme/_create-theme.spec.scss +122 -0
  81. package/scss/theming/create-theme/_index.scss +1 -0
  82. package/scss/theming/get-font-colors/_get-font-colors.scss +36 -0
  83. package/scss/theming/get-font-colors/_get-font-colors.spec.scss +72 -0
  84. package/scss/typography/mixins/_font-weight.scss +8 -14
  85. package/select/README.md +107 -4
  86. package/sidebar/README.md +0 -8
  87. package/sidebar/index.d.ts +3 -15
  88. package/switch/README.md +19 -27
  89. package/switch/index.d.ts +18 -48
  90. package/switch/src/switch-theme.scss +26 -18
  91. package/tabs/index.d.ts +7 -4
  92. package/tag/src/tag-theme.scss +11 -9
  93. package/textarea/README.md +35 -5
  94. package/tree/index.d.ts +0 -6
  95. package/tree/src/tree-theme.scss +0 -4
  96. package/accordion/examples/index.d.ts +0 -20
  97. package/article/examples/index.d.ts +0 -50
  98. package/breadcrumb/examples/index.d.ts +0 -10
  99. package/button/examples/index.d.ts +0 -67
  100. package/callout/examples/index.d.ts +0 -41
  101. package/card/examples/index.d.ts +0 -62
  102. package/card/src/card/raised/raised-theme.scss +0 -28
  103. package/checkbox/examples/index.d.ts +0 -32
  104. package/container/examples/index.d.ts +0 -16
  105. package/fesm2022/daffodil-design-accordion-examples.mjs +0 -50
  106. package/fesm2022/daffodil-design-accordion-examples.mjs.map +0 -1
  107. package/fesm2022/daffodil-design-article-examples.mjs +0 -134
  108. package/fesm2022/daffodil-design-article-examples.mjs.map +0 -1
  109. package/fesm2022/daffodil-design-breadcrumb-examples.mjs +0 -46
  110. package/fesm2022/daffodil-design-breadcrumb-examples.mjs.map +0 -1
  111. package/fesm2022/daffodil-design-button-examples.mjs +0 -178
  112. package/fesm2022/daffodil-design-button-examples.mjs.map +0 -1
  113. package/fesm2022/daffodil-design-callout-examples.mjs +0 -116
  114. package/fesm2022/daffodil-design-callout-examples.mjs.map +0 -1
  115. package/fesm2022/daffodil-design-card-examples.mjs +0 -168
  116. package/fesm2022/daffodil-design-card-examples.mjs.map +0 -1
  117. package/fesm2022/daffodil-design-checkbox-examples.mjs +0 -76
  118. package/fesm2022/daffodil-design-checkbox-examples.mjs.map +0 -1
  119. package/fesm2022/daffodil-design-container-examples.mjs +0 -41
  120. package/fesm2022/daffodil-design-container-examples.mjs.map +0 -1
  121. package/fesm2022/daffodil-design-form-field-examples.mjs +0 -96
  122. package/fesm2022/daffodil-design-form-field-examples.mjs.map +0 -1
  123. package/fesm2022/daffodil-design-hero-examples.mjs +0 -121
  124. package/fesm2022/daffodil-design-hero-examples.mjs.map +0 -1
  125. package/fesm2022/daffodil-design-image-examples.mjs +0 -58
  126. package/fesm2022/daffodil-design-image-examples.mjs.map +0 -1
  127. package/fesm2022/daffodil-design-input-examples.mjs +0 -108
  128. package/fesm2022/daffodil-design-input-examples.mjs.map +0 -1
  129. package/fesm2022/daffodil-design-list-examples.mjs +0 -77
  130. package/fesm2022/daffodil-design-list-examples.mjs.map +0 -1
  131. package/fesm2022/daffodil-design-loading-icon-examples.mjs +0 -44
  132. package/fesm2022/daffodil-design-loading-icon-examples.mjs.map +0 -1
  133. package/fesm2022/daffodil-design-media-gallery-examples.mjs +0 -104
  134. package/fesm2022/daffodil-design-media-gallery-examples.mjs.map +0 -1
  135. package/fesm2022/daffodil-design-menu-examples.mjs +0 -50
  136. package/fesm2022/daffodil-design-menu-examples.mjs.map +0 -1
  137. package/fesm2022/daffodil-design-modal-examples.mjs +0 -51
  138. package/fesm2022/daffodil-design-modal-examples.mjs.map +0 -1
  139. package/fesm2022/daffodil-design-native-select-examples.mjs +0 -71
  140. package/fesm2022/daffodil-design-native-select-examples.mjs.map +0 -1
  141. package/fesm2022/daffodil-design-navbar-examples.mjs +0 -88
  142. package/fesm2022/daffodil-design-navbar-examples.mjs.map +0 -1
  143. package/fesm2022/daffodil-design-notification-examples.mjs +0 -102
  144. package/fesm2022/daffodil-design-notification-examples.mjs.map +0 -1
  145. package/fesm2022/daffodil-design-paginator-examples.mjs +0 -59
  146. package/fesm2022/daffodil-design-paginator-examples.mjs.map +0 -1
  147. package/fesm2022/daffodil-design-progress-bar-examples.mjs +0 -57
  148. package/fesm2022/daffodil-design-progress-bar-examples.mjs.map +0 -1
  149. package/fesm2022/daffodil-design-quantity-field-examples.mjs +0 -85
  150. package/fesm2022/daffodil-design-quantity-field-examples.mjs.map +0 -1
  151. package/fesm2022/daffodil-design-radio-examples.mjs +0 -34
  152. package/fesm2022/daffodil-design-radio-examples.mjs.map +0 -1
  153. package/fesm2022/daffodil-design-select-examples.mjs +0 -117
  154. package/fesm2022/daffodil-design-select-examples.mjs.map +0 -1
  155. package/fesm2022/daffodil-design-sidebar-examples.mjs +0 -109
  156. package/fesm2022/daffodil-design-sidebar-examples.mjs.map +0 -1
  157. package/fesm2022/daffodil-design-sticky-examples.mjs +0 -25
  158. package/fesm2022/daffodil-design-sticky-examples.mjs.map +0 -1
  159. package/fesm2022/daffodil-design-switch-examples.mjs +0 -110
  160. package/fesm2022/daffodil-design-switch-examples.mjs.map +0 -1
  161. package/fesm2022/daffodil-design-tabs-examples.mjs +0 -115
  162. package/fesm2022/daffodil-design-tabs-examples.mjs.map +0 -1
  163. package/fesm2022/daffodil-design-tag-examples.mjs +0 -125
  164. package/fesm2022/daffodil-design-tag-examples.mjs.map +0 -1
  165. package/fesm2022/daffodil-design-text-snippet-examples.mjs +0 -25
  166. package/fesm2022/daffodil-design-text-snippet-examples.mjs.map +0 -1
  167. package/fesm2022/daffodil-design-textarea-examples.mjs +0 -66
  168. package/fesm2022/daffodil-design-textarea-examples.mjs.map +0 -1
  169. package/fesm2022/daffodil-design-toast-examples.mjs +0 -147
  170. package/fesm2022/daffodil-design-toast-examples.mjs.map +0 -1
  171. package/fesm2022/daffodil-design-tree-examples.mjs +0 -104
  172. package/fesm2022/daffodil-design-tree-examples.mjs.map +0 -1
  173. package/form-field/examples/index.d.ts +0 -18
  174. package/hero/examples/index.d.ts +0 -45
  175. package/image/examples/index.d.ts +0 -10
  176. package/input/examples/index.d.ts +0 -10
  177. package/list/examples/index.d.ts +0 -29
  178. package/loading-icon/examples/index.d.ts +0 -16
  179. package/media-gallery/examples/index.d.ts +0 -38
  180. package/menu/examples/index.d.ts +0 -20
  181. package/modal/examples/index.d.ts +0 -15
  182. package/native-select/examples/index.d.ts +0 -10
  183. package/navbar/examples/index.d.ts +0 -31
  184. package/notification/examples/index.d.ts +0 -12
  185. package/paginator/examples/index.d.ts +0 -26
  186. package/progress-bar/examples/index.d.ts +0 -10
  187. package/quantity-field/examples/index.d.ts +0 -30
  188. package/radio/examples/index.d.ts +0 -13
  189. package/select/examples/index.d.ts +0 -28
  190. package/sidebar/examples/index.d.ts +0 -10
  191. package/sticky/examples/index.d.ts +0 -10
  192. package/switch/examples/index.d.ts +0 -46
  193. package/tabs/examples/index.d.ts +0 -12
  194. package/tag/examples/index.d.ts +0 -50
  195. package/text-snippet/examples/index.d.ts +0 -10
  196. package/textarea/examples/index.d.ts +0 -10
  197. package/toast/examples/index.d.ts +0 -56
  198. package/tree/examples/index.d.ts +0 -18
  199. /package/{form-field → form}/src/error-message/error-message-theme.scss +0 -0
  200. /package/{form-field → form}/src/hint/hint-theme.scss +0 -0
@@ -0,0 +1,330 @@
1
+ @use 'sass:list';
2
+ @use 'sass:map';
3
+ @use 'sass:meta';
4
+ @use '../configure-palette';
5
+ @use '../color-palettes' as palette;
6
+ @use '../get-color';
7
+
8
+ $daff-light-theme: (
9
+ 'mode': 'light',
10
+ 'base': palette.$white,
11
+ 'base-contrast': palette.$black,
12
+ 'white': palette.$white,
13
+ 'black': palette.$black,
14
+ );
15
+
16
+ $daff-dark-theme: (
17
+ 'mode': 'dark',
18
+ 'base': get-color.daff-color(palette.$daff-neutral, 100),
19
+ 'base-contrast': palette.$white,
20
+ 'white': palette.$white,
21
+ 'black': palette.$black,
22
+ );
23
+
24
+ $supported-theme-modes: (
25
+ 'light': $daff-light-theme,
26
+ 'dark': $daff-dark-theme,
27
+ );
28
+
29
+ /// Creates a theme with:
30
+ /// - Required palettes: `primary`, `secondary`, `tertiary`
31
+ /// - Optional palettes: `neutral`, `informational`, `warn`, `critical`, `success`, and `neutral`.
32
+ /// - Optional colors: `text-color-default` and `text-color-inverse`.
33
+ ///
34
+ /// Defaults for optional palettes and colors are provided based on the theme mode.
35
+ ///
36
+ /// @group Theming
37
+ ///
38
+ /// @param {Map} $config - A map containing theme configuration
39
+ /// @param {String} $config.mode - Theme mode ('light' or 'dark'). Defaults to 'light' if not provided.
40
+ /// @param {Map} $config.primary - Primary color palette (required)
41
+ /// @param {Map} $config.secondary - Secondary color palette (required)
42
+ /// @param {Map} $config.tertiary - Tertiary color palette (required)
43
+ /// @param {Map} $config.neutral - Neutral color palette (optional, defaults provided)
44
+ /// @param {Map} $config.informational - Informational color palette (optional, defaults provided)
45
+ /// @param {Map} $config.warn - Warning color palette (optional, defaults provided)
46
+ /// @param {Map} $config.critical - Critical/error color palette (optional, defaults provided)
47
+ /// @param {Map} $config.success - Success color palette (optional, defaults provided)
48
+ /// @param {Map} $config.neutral - Neutral color palette (optional, defaults provided)
49
+ /// @param {Color} $config.text-color-default - Default text color (optional, defaults provided)
50
+ /// @param {Color} $config.text-color-inverse - Inverse text color (optional, defaults provided)
51
+ ///
52
+ /// @example scss
53
+ /// $primary: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
54
+ /// $secondary: configure-palette.daff-configure-palette(palette.$daff-purple, 60);
55
+ /// $tertiary: configure-palette.daff-configure-palette(palette.$daff-turquoise, 60);
56
+ /// $theme: daff-create-theme((
57
+ /// 'mode': 'light',
58
+ /// 'primary': $primary,
59
+ /// 'secondary': $secondary,
60
+ /// 'tertiary': $tertiary
61
+ /// ));
62
+ ///
63
+ /// @example scss
64
+ /// $primary: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
65
+ /// $secondary: configure-palette.daff-configure-palette(palette.$daff-purple, 60);
66
+ /// $tertiary: configure-palette.daff-configure-palette(palette.$daff-turquoise, 60);
67
+ /// $informational: configure-palette.daff-configure-palette(palette.$daff-neutral, 60);
68
+ /// $warn: configure-palette.daff-configure-palette(palette.$daff-bronze, 60);
69
+ /// $critical: configure-palette.daff-configure-palette(palette.$daff-red, 60);
70
+ /// $success: configure-palette.daff-configure-palette(palette.$daff-green, 60);
71
+ /// $neutral: configure-palette.daff-configure-palette(palette.$daff-neutral, 60);
72
+ /// $text-color-default: get-color.daff-color(palette.$daff-neutral, 10);
73
+ /// $text-color-inverse: get-color.daff-color(palette.$daff-neutral, 100);
74
+ /// $theme: daff-create-theme((
75
+ /// 'mode': 'light',
76
+ /// 'primary': $primary,
77
+ /// 'secondary': $secondary,
78
+ /// 'tertiary': $tertiary,
79
+ /// 'informational': $informational,
80
+ /// 'warn': $warn,
81
+ /// 'critical': $critical,
82
+ /// 'success': $success,
83
+ /// 'neutral': $neutral,
84
+ /// 'text-color-default': $text-color-default,
85
+ /// 'text-color-inverse': $text-color-inverse
86
+ /// ));
87
+ ///
88
+ @function daff-create-theme($config) {
89
+ $verify: daff-verify-config($config);
90
+
91
+ $mode: map.get($config, 'mode');
92
+ $primary: map.get($config, 'primary');
93
+ $secondary: map.get($config, 'secondary');
94
+ $tertiary: map.get($config, 'tertiary');
95
+
96
+ $text-color-default: map.get($config, 'text-color-default');
97
+ $text-color-inverse: map.get($config, 'text-color-inverse');
98
+
99
+ $informational: map.get($config, 'informational');
100
+ $warn: map.get($config, 'warn');
101
+ $critical: map.get($config, 'critical');
102
+ $success: map.get($config, 'success');
103
+ $neutral: map.get($config, 'neutral');
104
+
105
+ $mode: if($mode == null, 'light', $mode);
106
+
107
+ $optional-palettes: daff-configure-optional-palettes(
108
+ $mode,
109
+ $warn,
110
+ $critical,
111
+ $success,
112
+ $informational,
113
+ $neutral
114
+ );
115
+
116
+ $optional-font-colors: daff-configure-text-colors(
117
+ $mode,
118
+ $text-color-default,
119
+ $text-color-inverse
120
+ );
121
+
122
+ @return (
123
+ 'primary': $primary,
124
+ 'secondary': $secondary,
125
+ 'tertiary': $tertiary,
126
+ 'informational': map.get($optional-palettes, 'informational'),
127
+ 'warn': map.get($optional-palettes, 'warn'),
128
+ 'text-color-default': map.get($optional-font-colors, 'text-color-default'),
129
+ 'text-color-inverse': map.get($optional-font-colors, 'text-color-inverse'),
130
+ 'critical': map.get($optional-palettes, 'critical'),
131
+ 'success': map.get($optional-palettes, 'success'),
132
+ 'neutral': map.get($optional-palettes, 'neutral'),
133
+ 'core': daff-build-theme-core($mode, map.get($optional-palettes, 'neutral'))
134
+ );
135
+ }
136
+
137
+ /// @access private
138
+ ///
139
+ /// Checks if the optional text colors are set, if not it sets them to defaults based on the theme mode.
140
+ ///
141
+ @function daff-configure-text-colors(
142
+ $mode,
143
+ $text-color-default,
144
+ $text-color-inverse
145
+ ) {
146
+ $dark: palette.$black;
147
+ $light: palette.$white;
148
+
149
+ @if ($text-color-default == null) {
150
+ $text-color-default: if($mode == 'light', $dark, $light);
151
+ }
152
+
153
+ @if ($text-color-inverse == null) {
154
+ $text-color-inverse: if($mode == 'light', $light, $dark);
155
+ }
156
+
157
+ @return (
158
+ 'text-color-default': $text-color-default,
159
+ 'text-color-inverse': $text-color-inverse
160
+ );
161
+ }
162
+
163
+ /// @access private
164
+ /// Checks if the optional palettes are set, if not it sets them to defaults based on the theme mode.
165
+ ///
166
+ /// @param {String} $mode - Theme mode ('light' or 'dark')
167
+ /// @param {Color|null} $warn - Warning status color palette
168
+ /// @param {Color|null} $critical - Critical status color palette
169
+ /// @param {Color|null} $success - Success status color palette
170
+ /// @param {Color|null} $informational - Informational status color palette
171
+ /// @param {Color|null} $neutral - Neutral color palette
172
+ ///
173
+ /// @return {Map} Map containing optional color configurations
174
+ ///
175
+ @function daff-configure-optional-palettes(
176
+ $mode,
177
+ $warn,
178
+ $critical,
179
+ $success,
180
+ $informational,
181
+ $neutral
182
+ ) {
183
+ $validate: daff-validate-mode($mode);
184
+ $default-hue: if($mode == 'dark', 50, 60);
185
+ @if ($warn == null) {
186
+ $warn: configure-palette.daff-configure-palette(
187
+ palette.$daff-bronze,
188
+ $default-hue
189
+ );
190
+ }
191
+ @if ($critical == null) {
192
+ $critical: configure-palette.daff-configure-palette(
193
+ palette.$daff-red,
194
+ $default-hue
195
+ );
196
+ }
197
+ @if ($success == null) {
198
+ $success: configure-palette.daff-configure-palette(
199
+ palette.$daff-green,
200
+ $default-hue
201
+ );
202
+ }
203
+ @if ($informational == null) {
204
+ $informational: configure-palette.daff-configure-palette(
205
+ palette.$daff-neutral,
206
+ $default-hue
207
+ );
208
+ }
209
+ @if ($neutral == null) {
210
+ $neutral: configure-palette.daff-configure-palette(
211
+ palette.$daff-neutral,
212
+ $default-hue
213
+ );
214
+ }
215
+ @return (
216
+ 'success': $success,
217
+ 'warn': $warn,
218
+ 'critical': $critical,
219
+ 'informational': $informational,
220
+ 'neutral': $neutral
221
+ );
222
+ }
223
+
224
+ /// @access private
225
+ /// Retrieves and customizes the core theme based on theme mode and optional overrides
226
+ ///
227
+ /// @param {String} $mode - Theme mode ('light' or 'dark')
228
+ /// @param {Map|null} $neutral - Neutral color palette override
229
+ ///
230
+ /// @return {Map} Customized core theme map
231
+ ///
232
+ @function daff-build-theme-core($mode, $neutral) {
233
+ $validate: daff-validate-mode($mode);
234
+ $core: map.get($supported-theme-modes, $mode);
235
+ $core: map.merge(
236
+ $core,
237
+ (
238
+ 'neutral': if($neutral != null, $neutral, map.get($core, 'neutral')),
239
+ )
240
+ );
241
+ @return $core;
242
+ }
243
+
244
+ /// @access private
245
+ /// Validates the configuration map for theme creation
246
+ ///
247
+ /// @param {Map} $config - The theme configuration map to validate
248
+ /// @return {Boolean} True if the configuration is valid
249
+ /// @throws Will throw an error if the configuration is invalid
250
+ ///
251
+ @function daff-verify-config($config) {
252
+ $required-keys: ('primary', 'secondary', 'tertiary');
253
+ $valid-keys: (
254
+ 'mode',
255
+ 'primary',
256
+ 'secondary',
257
+ 'tertiary',
258
+ 'neutral',
259
+ 'informational',
260
+ 'warn',
261
+ 'critical',
262
+ 'success',
263
+ 'text-color-default',
264
+ 'text-color-inverse'
265
+ );
266
+ $color-keys: ('text-color-default', 'text-color-inverse');
267
+
268
+ @each $key in $required-keys {
269
+ @if not map.has-key($config, $key) {
270
+ @error 'The `#{$key}` key is required.';
271
+ }
272
+ }
273
+
274
+ @each $key in map.keys($config) {
275
+ @if not list.index($valid-keys, $key) {
276
+ @error '`#{$key}` is not a valid key.';
277
+ }
278
+
279
+ $value: map.get($config, $key);
280
+ @if $key == 'mode' {
281
+ $validate: daff-validate-mode($value);
282
+ } @else if list.index($color-keys, $key) {
283
+ @if not daff-validate-color($value) {
284
+ @error '"#{$value}" is not a valid color value for the `#{$key}` key.';
285
+ }
286
+ } @else {
287
+ @if not daff-validate-palette($value) {
288
+ @error '"#{$value}" is not a valid color palette for the `#{$key}` key.';
289
+ }
290
+ }
291
+ }
292
+
293
+ @return true;
294
+ }
295
+
296
+ /// @access private
297
+ /// Validates that the theme mode is supported
298
+ ///
299
+ /// @param {String} $value - The theme mode to check
300
+ /// @return {Boolean} True if the value is a valid configured mode, false otherwise
301
+ /// @throws Will throw an error if the mode is not valid
302
+ ///
303
+ @function daff-validate-mode($value) {
304
+ @if (not map.has-key($supported-theme-modes, $value)) {
305
+ @error '`#{$value}` is not a valid theme mode - valid modes: #{map-keys($supported-theme-modes)}';
306
+ }
307
+ @return true;
308
+ }
309
+
310
+ /// @access private
311
+ /// Checks if a value is a properly configured color palette map
312
+ ///
313
+ /// @param {Any} $value - The palette to check
314
+ /// @return {Boolean} True if the value is a valid configured palette, false otherwise
315
+ ///
316
+ @function daff-validate-palette($value) {
317
+ @return meta.type-of($value) == 'map'
318
+ and map.has-key($value, 'default')
319
+ and daff-validate-color(map.get($value, 'default'));
320
+ }
321
+
322
+ /// @access private
323
+ /// Checks if a value is a color
324
+ ///
325
+ /// @param {Any} $value - The value to check
326
+ /// @return {Boolean} True if the value is a valid color, false otherwise
327
+ ///
328
+ @function daff-validate-color($value) {
329
+ @return meta.type-of($value) == 'color';
330
+ }
@@ -0,0 +1,122 @@
1
+ @use 'true' as *;
2
+ @use './create-theme' as *;
3
+ @use '../color-palettes' as palette;
4
+ @use '../get-color';
5
+ @use '../configure-palette';
6
+ @use 'sass:map';
7
+
8
+ @include describe('daff-create-theme') {
9
+ $primary: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
10
+ $secondary: configure-palette.daff-configure-palette(palette.$daff-purple, 60);
11
+ $tertiary: configure-palette.daff-configure-palette(palette.$daff-turquoise, 60);
12
+ $neutral: configure-palette.daff-configure-palette(palette.$daff-neutral, 50);
13
+ $informational: configure-palette.daff-configure-palette(palette.$daff-blue, 40);
14
+ $warn: configure-palette.daff-configure-palette(palette.$daff-bronze, 40);
15
+ $critical: configure-palette.daff-configure-palette(palette.$daff-red, 40);
16
+ $success: configure-palette.daff-configure-palette(palette.$daff-green, 40);
17
+ $text-color-inverse: get-color.daff-color(palette.$daff-neutral, 10);
18
+ $text-color-default: get-color.daff-color(palette.$daff-neutral, 100);
19
+
20
+ $default-daff-light-theme: (
21
+ 'mode': 'light',
22
+ 'base': palette.$white,
23
+ 'base-contrast': palette.$black,
24
+ 'white': palette.$white,
25
+ 'black': palette.$black,
26
+ 'neutral': configure-palette.daff-configure-palette(palette.$daff-neutral, 60),
27
+ );
28
+ $daff-dark-theme: (
29
+ 'mode': 'dark',
30
+ 'base': get-color.daff-color(palette.$daff-neutral, 100),
31
+ 'base-contrast': palette.$white,
32
+ 'white': palette.$white,
33
+ 'black': palette.$black,
34
+ 'neutral': configure-palette.daff-configure-palette(palette.$daff-neutral, 50),
35
+ );
36
+
37
+ @include it('creates a light theme with only required parameters') {
38
+ $config: (
39
+ 'primary': $primary,
40
+ 'secondary': $secondary,
41
+ 'tertiary': $tertiary
42
+ );
43
+ $theme: daff-create-theme($config);
44
+
45
+ @include assert-equal(map.get($theme, 'primary'), $primary);
46
+ @include assert-equal(map.get($theme, 'secondary'), $secondary);
47
+ @include assert-equal(map.get($theme, 'tertiary'), $tertiary);
48
+ @include assert-true(map.has-key($theme, 'core'));
49
+
50
+ $core: map.get($theme, 'core');
51
+ @include assert-equal($core, $default-daff-light-theme);
52
+ }
53
+
54
+ @include it('creates a dark theme when mode is specified') {
55
+ $config: (
56
+ 'mode': 'dark',
57
+ 'primary': $primary,
58
+ 'secondary': $secondary,
59
+ 'tertiary': $tertiary
60
+ );
61
+ $theme: daff-create-theme($config);
62
+ @include assert-equal(map.get($theme, 'primary'), $primary);
63
+ @include assert-equal(map.get($theme, 'secondary'), $secondary);
64
+ @include assert-equal(map.get($theme, 'tertiary'), $tertiary);
65
+ @include assert-true(map.has-key($theme, 'core'));
66
+
67
+ $core: map.get($theme, 'core');
68
+ @include assert-equal($core, $daff-dark-theme);
69
+ }
70
+
71
+ @include it('creates a theme with all optional parameters') {
72
+ $config: (
73
+ 'mode': 'light',
74
+ 'primary': $primary,
75
+ 'secondary': $secondary,
76
+ 'tertiary': $tertiary,
77
+ 'neutral': $neutral,
78
+ 'informational': $informational,
79
+ 'warn': $warn,
80
+ 'critical': $critical,
81
+ 'success': $success,
82
+ 'text-color-inverse': $text-color-inverse,
83
+ 'text-color-default': $text-color-default
84
+ );
85
+ $theme: daff-create-theme($config);
86
+
87
+ @include assert-equal(map.get($theme, 'primary'), $primary);
88
+ @include assert-equal(map.get($theme, 'secondary'), $secondary);
89
+ @include assert-equal(map.get($theme, 'tertiary'), $tertiary);
90
+ @include assert-equal(map.get($theme, 'informational'), $informational);
91
+ @include assert-equal(map.get($theme, 'warn'), $warn);
92
+ @include assert-equal(map.get($theme, 'critical'), $critical);
93
+ @include assert-equal(map.get($theme, 'success'), $success);
94
+ @include assert-equal(map.get($theme, 'text-color-default'), $text-color-default);
95
+ @include assert-equal(map.get($theme, 'text-color-inverse'), $text-color-inverse);
96
+ @include assert-equal(map.get($theme, 'neutral'), $neutral);
97
+
98
+ @include assert-true(map.has-key($theme, 'core'));
99
+ $core: map.get($theme, 'core');
100
+ $expected-core: map.merge($default-daff-light-theme, (
101
+ 'neutral': $neutral,
102
+ ));
103
+ @include assert-equal($core, $expected-core);
104
+ }
105
+
106
+ @include it('provides default status colors when not specified') {
107
+ $config: (
108
+ 'mode': 'light',
109
+ 'primary': $primary,
110
+ 'secondary': $secondary,
111
+ 'tertiary': $tertiary
112
+ );
113
+ $theme: daff-create-theme($config);
114
+
115
+ @include assert-equal(
116
+ map.get($theme, 'informational'), configure-palette.daff-configure-palette(palette.$daff-neutral, 60)
117
+ );
118
+ @include assert-equal(map.get($theme, 'warn'), configure-palette.daff-configure-palette(palette.$daff-bronze, 60));
119
+ @include assert-equal(map.get($theme, 'critical'), configure-palette.daff-configure-palette(palette.$daff-red, 60));
120
+ @include assert-equal(map.get($theme, 'success'), configure-palette.daff-configure-palette(palette.$daff-green, 60));
121
+ }
122
+ }
@@ -0,0 +1 @@
1
+ @forward 'create-theme' show daff-create-theme;
@@ -0,0 +1,36 @@
1
+ @use 'sass:map';
2
+ @use 'sass:list';
3
+ @use '../get-base-color' as *;
4
+
5
+ /// Returns a light and dark color.
6
+ ///
7
+ /// If you are not using Daffodil's default theme, a theme **must** be
8
+ /// created with `daff-create-theme` before this function can be used.
9
+ /// See the [customize your own theme](daff.io/docs/design/theming/customize-your-own-theme)
10
+ /// guide for more information.
11
+ ///
12
+ /// @group Theming
13
+ ///
14
+ /// @param {Map} $theme — A theme map created with the `daff-create-theme` function.
15
+ ///
16
+ /// @return {List} — Returns a list of colors
17
+ ///
18
+ /// @example scss
19
+ /// @use '@daffodil/design/scss/theme' as daff-theme;
20
+ ///
21
+ /// @mixin custom-content-theme($theme) {
22
+ /// $availableColors: daff-theme.daff-get-font-colors($theme);
23
+ /// }
24
+ ///
25
+ @function daff-get-font-colors($theme) {
26
+ @if (map.get($theme, 'text-color-default')) {
27
+ @return (
28
+ map.get($theme, 'text-color-default'),
29
+ map.get($theme, 'text-color-inverse')
30
+ );
31
+ }
32
+ @return (
33
+ daff-get-base-color($theme, 'white'),
34
+ daff-get-base-color($theme, 'black')
35
+ );
36
+ }
@@ -0,0 +1,72 @@
1
+ @use 'true' as *;
2
+ @use 'sass:list';
3
+ @use 'sass:map';
4
+ @use '../create-theme' as *;
5
+ @use '../color-palettes' as palette;
6
+ @use '../configure-palette';
7
+ @use '../get-color';
8
+ @use '../get-base-color' as *;
9
+ @use './get-font-colors' as *;
10
+ @use '../configure-theme' as ct;
11
+
12
+ @include describe('daff-get-font-colors') {
13
+ $primary: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
14
+ $secondary: configure-palette.daff-configure-palette(palette.$daff-purple, 60);
15
+ $tertiary: configure-palette.daff-configure-palette(palette.$daff-turquoise, 60);
16
+ $font-light: get-color.daff-color(palette.$daff-neutral, 10);
17
+ $font-dark: get-color.daff-color(palette.$daff-neutral, 100);
18
+ $default-dark: palette.$black;
19
+ $default-light: palette.$white;
20
+ $white: palette.$white;
21
+ $black: palette.$black;
22
+
23
+ @include it('returns theme text colors when provided') {
24
+ $config: (
25
+ 'primary': $primary,
26
+ 'secondary': $secondary,
27
+ 'tertiary': $tertiary,
28
+ 'text-color-default': $font-dark,
29
+ 'text-color-inverse': $font-light
30
+ );
31
+ $theme: daff-create-theme($config);
32
+
33
+ $colors: daff-get-font-colors($theme);
34
+ @include assert-equal(list.nth($colors, 1), $font-dark);
35
+ @include assert-equal(list.nth($colors, 2), $font-light);
36
+ }
37
+
38
+ @include it('falls back to default text colors when no explicit text colors') {
39
+ $config: (
40
+ 'primary': $primary,
41
+ 'secondary': $secondary,
42
+ 'tertiary': $tertiary
43
+ );
44
+ $theme: daff-create-theme($config);
45
+
46
+ $colors: daff-get-font-colors($theme);
47
+ @include assert-equal(list.nth($colors, 1), $default-dark);
48
+ @include assert-equal(list.nth($colors, 2), $default-light);
49
+ }
50
+
51
+ @include it('works when theme provides only one of the text colors') {
52
+ $config: (
53
+ 'mode': 'dark',
54
+ 'primary': $primary,
55
+ 'secondary': $secondary,
56
+ 'tertiary': $tertiary,
57
+ 'text-color-default': $font-light
58
+ );
59
+ $theme: daff-create-theme($config);
60
+
61
+ $colors: daff-get-font-colors($theme);
62
+ @include assert-equal(list.nth($colors, 1), $font-light);
63
+ @include assert-equal(list.nth($colors, 2), $default-dark);
64
+ }
65
+
66
+ @include it('returns base colors when theme map is created with daff-configure-theme instead of daff-create-theme') {
67
+ $theme: ct.daff-configure-theme($primary, $secondary, $tertiary, 'light');
68
+ $colors: daff-get-font-colors($theme);
69
+ @include assert-equal(list.nth($colors, 1), $white);
70
+ @include assert-equal(list.nth($colors, 2), $black);
71
+ }
72
+ }
@@ -1,19 +1,13 @@
1
1
  @use '../utilities/variables';
2
2
 
3
- //
4
- // @deprecated
5
- //
6
- // @docs
7
- //
8
- // Changes the weight of text to bold
9
- //
10
- // @usage
11
- // ```scss
12
- // @use '@daffodil/design/scss/typography;
13
- //
14
- // @include typography.embolden;
15
- // ```
16
- //
3
+ /// @group Typography
4
+ /// @deprecated
5
+ /// @example scss
6
+ /// @use '@daffodil/design/scss/typography';
7
+ ///
8
+ /// .title {
9
+ /// @include typography.embolden;
10
+ /// }
17
11
 
18
12
  @mixin embolden() {
19
13
  font-weight: variables.$bold-font-weight;