@canopy-iiif/app 0.8.3 → 0.8.5

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 (36) hide show
  1. package/lib/build/build.js +2 -0
  2. package/lib/build/dev.js +38 -22
  3. package/lib/build/iiif.js +359 -83
  4. package/lib/build/mdx.js +12 -2
  5. package/lib/build/pages.js +15 -1
  6. package/lib/build/styles.js +53 -1
  7. package/lib/common.js +28 -6
  8. package/lib/components/navigation.js +308 -0
  9. package/lib/page-context.js +14 -0
  10. package/lib/search/search-app.jsx +177 -25
  11. package/lib/search/search-form-runtime.js +126 -19
  12. package/lib/search/search.js +130 -18
  13. package/package.json +4 -1
  14. package/ui/dist/index.mjs +204 -101
  15. package/ui/dist/index.mjs.map +4 -4
  16. package/ui/dist/server.mjs +167 -59
  17. package/ui/dist/server.mjs.map +4 -4
  18. package/ui/styles/_variables.scss +1 -0
  19. package/ui/styles/base/_common.scss +27 -5
  20. package/ui/styles/base/_heading.scss +2 -4
  21. package/ui/styles/base/index.scss +1 -0
  22. package/ui/styles/components/_card.scss +47 -4
  23. package/ui/styles/components/_sub-navigation.scss +76 -0
  24. package/ui/styles/components/header/_header.scss +1 -4
  25. package/ui/styles/components/header/_logo.scss +33 -10
  26. package/ui/styles/components/index.scss +1 -0
  27. package/ui/styles/components/search/_filters.scss +5 -7
  28. package/ui/styles/components/search/_form.scss +55 -17
  29. package/ui/styles/components/search/_results.scss +49 -14
  30. package/ui/styles/index.css +344 -56
  31. package/ui/styles/index.scss +2 -4
  32. package/ui/tailwind-canopy-iiif-plugin.js +10 -2
  33. package/ui/tailwind-canopy-iiif-preset.js +21 -19
  34. package/ui/theme.js +303 -0
  35. package/ui/styles/variables.emit.scss +0 -72
  36. package/ui/styles/variables.scss +0 -76
@@ -6,14 +6,21 @@
6
6
  * Tailwind theme.extend values to those variables for easy use in utilities.
7
7
  */
8
8
  const plugin = require("tailwindcss/plugin");
9
- const fs = require("fs");
10
9
  const path = require("path");
10
+ const {loadCanopyTheme} = require("./theme");
11
11
 
12
12
  function compileVarsCss() {
13
+ const theme = loadCanopyTheme();
14
+ if (theme && theme.css) {
15
+ if (process.env.CANOPY_DEBUG_THEME) {
16
+ console.log('[preset] using theme css');
17
+ }
18
+ return theme.css;
19
+ }
13
20
  try {
14
21
  const sass = require("sass");
15
22
  const entry = path.join(__dirname, "styles", "variables.emit.scss");
16
- const out = sass.compile(entry, { style: "expanded" });
23
+ const out = sass.compile(entry, {style: "expanded"});
17
24
  return out && out.css ? out.css : "";
18
25
  } catch (_) {
19
26
  return "";
@@ -22,7 +29,7 @@ function compileVarsCss() {
22
29
 
23
30
  module.exports = {
24
31
  theme: {
25
- container: { center: true, padding: "1rem" },
32
+ container: {center: true, padding: "1rem"},
26
33
  extend: {
27
34
  colors: {
28
35
  brand: {
@@ -69,33 +76,28 @@ module.exports = {
69
76
  black: "#000000",
70
77
  },
71
78
  fontFamily: {
72
- sans: ["var(--font-sans)"],
73
79
  mono: ["var(--font-mono)"],
80
+ sans: ["var(--font-sans)"],
81
+ serif: ["var(--font-serif)"],
74
82
  },
75
83
  fontSize: {
76
- xs: ["var(--font-size-xs)", { lineHeight: "var(--line-height-xs)" }],
77
- sm: ["var(--font-size-sm)", { lineHeight: "var(--line-height-sm)" }],
84
+ xs: ["var(--font-size-xs)", {lineHeight: "var(--line-height-xs)"}],
85
+ sm: ["var(--font-size-sm)", {lineHeight: "var(--line-height-sm)"}],
78
86
  base: [
79
87
  "var(--font-size-base)",
80
- { lineHeight: "var(--line-height-base)" },
81
- ],
82
- lg: ["var(--font-size-lg)", { lineHeight: "var(--line-height-lg)" }],
83
- xl: ["var(--font-size-xl)", { lineHeight: "var(--line-height-xl)" }],
84
- "2xl": [
85
- "var(--font-size-2xl)",
86
- { lineHeight: "var(--line-height-2xl)" },
87
- ],
88
- "3xl": [
89
- "var(--font-size-3xl)",
90
- { lineHeight: "var(--line-height-3xl)" },
88
+ {lineHeight: "var(--line-height-base)"},
91
89
  ],
90
+ lg: ["var(--font-size-lg)", {lineHeight: "var(--line-height-lg)"}],
91
+ xl: ["var(--font-size-xl)", {lineHeight: "var(--line-height-xl)"}],
92
+ "2xl": ["var(--font-size-2xl)", {lineHeight: "var(--line-height-2xl)"}],
93
+ "3xl": ["var(--font-size-3xl)", {lineHeight: "var(--line-height-3xl)"}],
92
94
  },
93
95
  borderRadius: {
94
96
  sm: "var(--radius-sm)",
95
97
  DEFAULT: "var(--radius-default)",
96
98
  md: "var(--radius-md)",
97
99
  },
98
- maxWidth: { content: "var(--max-w-content)", wide: "var(--max-w-wide)" },
100
+ maxWidth: {content: "var(--max-w-content)", wide: "var(--max-w-wide)"},
99
101
  boxShadow: {
100
102
  sm: "var(--shadow-sm)",
101
103
  DEFAULT: "var(--shadow)",
@@ -112,7 +114,7 @@ module.exports = {
112
114
  },
113
115
  plugins: [
114
116
  // Inject CSS variables (tokens) derived from Sass variables
115
- plugin(function ({ addBase, postcss }) {
117
+ plugin(function ({addBase, postcss}) {
116
118
  const css = compileVarsCss();
117
119
  if (css && postcss && postcss.parse) addBase(postcss.parse(css));
118
120
  }),
package/ui/theme.js ADDED
@@ -0,0 +1,303 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const yaml = require("js-yaml");
4
+ const radixColors = require("@radix-ui/colors");
5
+
6
+ const DEFAULT_ACCENT = "indigo";
7
+ const DEFAULT_GRAY = "slate";
8
+ const DEFAULT_APPEARANCE = "light";
9
+ const DEBUG_FLAG_RAW = String(process.env.CANOPY_DEBUG_THEME || "");
10
+ const DEBUG_ENABLED = /^(1|true|yes|on)$/i.test(DEBUG_FLAG_RAW.trim());
11
+ const SASS_STYLES_DIR = path.join(__dirname, "styles");
12
+ const SASS_VARIABLES_ENTRY = path.join(SASS_STYLES_DIR, "_variables.scss");
13
+
14
+ function debugLog(...args) {
15
+ if (!DEBUG_ENABLED) return;
16
+ try {
17
+ console.log("[canopy-theme]", ...args);
18
+ } catch (_) {}
19
+ }
20
+
21
+ function loadSassVariableTokens() {
22
+ try {
23
+ if (!fs.existsSync(SASS_VARIABLES_ENTRY)) return {map: {}, css: ""};
24
+ const sass = require("sass");
25
+ const source = `@use 'sass:meta';\n@use 'sass:string';\n@use 'variables';\n$__canopy_tokens: meta.module-variables('variables');\n@function canopy-token-name($name) {\n $identifier: #{$name};\n @if $identifier == null or $identifier == '' {\n @return null;\n }\n @if string.slice($identifier, 1, 1) == '_' {\n @return null;\n }\n @return '--#{$identifier}';\n}\n@mixin canopy-emit-tokens() {\n @each $name, $value in $__canopy_tokens {\n $css-name: canopy-token-name($name);\n @if $css-name {\n #{$css-name}: #{meta.inspect($value)};\n }\n }\n}\n:root {\n @include canopy-emit-tokens();\n}\n:host {\n @include canopy-emit-tokens();\n}\n`;
26
+ const result = sass.compileString(source, {
27
+ loadPaths: [SASS_STYLES_DIR],
28
+ style: "expanded",
29
+ });
30
+ const css = (result && result.css ? result.css : "").trim();
31
+ const vars = {};
32
+ const regex = /--([A-Za-z0-9_-]+)\s*:\s*([^;]+);/g;
33
+ let match;
34
+ while ((match = regex.exec(css))) {
35
+ vars[`--${match[1]}`] = match[2].trim();
36
+ }
37
+ return {map: vars, css};
38
+ } catch (error) {
39
+ debugLog("failed to compile Sass variables", error && error.message ? error.message : error);
40
+ return {map: {}, css: ""};
41
+ }
42
+ }
43
+ const LEVELS = [
44
+ "50",
45
+ "100",
46
+ "200",
47
+ "300",
48
+ "400",
49
+ "500",
50
+ "600",
51
+ "700",
52
+ "800",
53
+ "900",
54
+ ];
55
+ const STEP_MAP = {
56
+ 50: 1,
57
+ 100: 3,
58
+ 200: 5,
59
+ 300: 7,
60
+ 400: 8,
61
+ 500: 9,
62
+ 600: 10,
63
+ 700: 11,
64
+ 800: 12,
65
+ 900: 12,
66
+ };
67
+
68
+ const AVAILABLE = new Set(
69
+ Object.keys(radixColors).filter(
70
+ (key) =>
71
+ /^[a-z]+$/.test(key) && radixColors[key] && radixColors[key][`${key}1`]
72
+ )
73
+ );
74
+
75
+ const APPEARANCES = new Set(["light", "dark"]);
76
+
77
+ function readYamlConfig(cfgPath) {
78
+ try {
79
+ if (!cfgPath) return {};
80
+ if (!fs.existsSync(cfgPath)) {
81
+ debugLog("config not found; falling back to defaults", cfgPath);
82
+ return {};
83
+ }
84
+ const raw = fs.readFileSync(cfgPath, "utf8");
85
+ const data = yaml.load(raw) || {};
86
+ debugLog("loaded config", cfgPath);
87
+ return data;
88
+ } catch (_) {
89
+ return {};
90
+ }
91
+ }
92
+
93
+ function normalizePaletteName(raw) {
94
+ if (!raw) return "";
95
+ const cleaned = String(raw).trim().toLowerCase();
96
+ const compact = cleaned.replace(/[^a-z]/g, "");
97
+ return AVAILABLE.has(compact) ? compact : "";
98
+ }
99
+
100
+ function normalizeAppearance(raw) {
101
+ if (!raw) return DEFAULT_APPEARANCE;
102
+ const cleaned = String(raw).trim().toLowerCase();
103
+ return APPEARANCES.has(cleaned) ? cleaned : DEFAULT_APPEARANCE;
104
+ }
105
+
106
+ function resolveRadixPalette(name, appearance) {
107
+ if (!name || !AVAILABLE.has(name)) return null;
108
+ const paletteKey = appearance === "dark" ? `${name}Dark` : name;
109
+ const palette = radixColors[paletteKey];
110
+ if (palette && palette[`${name}1`]) return palette;
111
+ const fallback = radixColors[name];
112
+ return fallback && fallback[`${name}1`] ? fallback : null;
113
+ }
114
+
115
+ function darkenHex(hex, amount = 0.15) {
116
+ if (!hex) return hex;
117
+ const normalized = hex.replace("#", "");
118
+ if (!/^[0-9a-fA-F]{6}$/.test(normalized)) return hex;
119
+ const num = parseInt(normalized, 16);
120
+ const r = (num >> 16) & 255;
121
+ const g = (num >> 8) & 255;
122
+ const b = num & 255;
123
+ const clamp = (value) => Math.max(0, Math.min(255, Math.round(value)));
124
+ const toHex = (value) => clamp(value).toString(16).padStart(2, "0");
125
+ const factor = 1 - amount;
126
+ return `#${toHex(r * factor)}${toHex(g * factor)}${toHex(b * factor)}`;
127
+ }
128
+
129
+ function toTailwindScale(name, options = {}) {
130
+ if (!name || !AVAILABLE.has(name)) return null;
131
+ const appearance = normalizeAppearance(options.appearance);
132
+ const palette = resolveRadixPalette(name, appearance);
133
+ if (!palette) return null;
134
+ const prefix = name;
135
+ const scale = {};
136
+ for (const lvl of LEVELS) {
137
+ const radixStep = STEP_MAP[lvl];
138
+ const key = `${prefix}${radixStep}`;
139
+ const value = palette[key];
140
+ if (!value) return null;
141
+ scale[lvl] = value;
142
+ }
143
+ const darkestKey = `${prefix}${STEP_MAP["900"]}`;
144
+ if (scale["800"] && palette[darkestKey]) {
145
+ scale["900"] = darkenHex(palette[darkestKey], 0.15);
146
+ }
147
+ return scale;
148
+ }
149
+
150
+ function buildVariablesMap(brandScale, grayScale, options = {}) {
151
+ const appearance = normalizeAppearance(options.appearance);
152
+ const vars = {};
153
+ if (brandScale) {
154
+ for (const lvl of LEVELS) {
155
+ const value = brandScale[lvl];
156
+ if (value) vars[`--color-brand-${lvl}`] = value;
157
+ }
158
+ if (brandScale["600"]) vars["--color-brand-default"] = brandScale["600"];
159
+ }
160
+ if (grayScale) {
161
+ for (const lvl of LEVELS) {
162
+ const value = grayScale[lvl];
163
+ if (value) vars[`--color-gray-${lvl}`] = value;
164
+ }
165
+ if (grayScale["900"]) vars["--color-gray-default"] = grayScale["900"];
166
+ if (grayScale["600"]) vars["--color-gray-muted"] = grayScale["600"];
167
+ }
168
+ if (brandScale && grayScale) {
169
+ if (brandScale["600"])
170
+ vars["--colors-accent"] = `${brandScale["600"]} !important`;
171
+ if (brandScale["800"])
172
+ vars["--colors-accentAlt"] = `${brandScale["800"]} !important`;
173
+ if (brandScale["400"])
174
+ vars["--colors-accentMuted"] = `${brandScale["400"]} !important`;
175
+ if (grayScale["900"]) {
176
+ const primary = `${grayScale["900"]} !important`;
177
+ vars["--colors-primary"] = primary;
178
+ vars["--colors-primaryAlt"] = primary;
179
+ vars["--colors-primaryMuted"] = primary;
180
+ }
181
+ if (grayScale["50"]) {
182
+ const secondary = `${grayScale["50"]} !important`;
183
+ vars["--colors-secondary"] = secondary;
184
+ vars["--colors-secondaryAlt"] = secondary;
185
+ vars["--colors-secondaryMuted"] = secondary;
186
+ }
187
+ }
188
+ vars["color-scheme"] = appearance === "dark" ? "dark" : "light";
189
+ return vars;
190
+ }
191
+
192
+ function variablesToCss(vars) {
193
+ const entries = Object.entries(vars || {});
194
+ if (!entries.length) return "";
195
+ const body = entries
196
+ .map(([prop, value]) => ` ${prop}: ${value};`)
197
+ .join("\n");
198
+ return `@layer properties {\n :root {\n${body}\n }\n :host {\n${body}\n }\n}`;
199
+ }
200
+
201
+ function buildSassConfig(brandScale, grayScale) {
202
+ return "";
203
+ }
204
+
205
+ function loadCanopyTheme(options = {}) {
206
+ const cwd = options.cwd || process.cwd();
207
+ const cfgPath =
208
+ options.configPath ||
209
+ path.resolve(cwd, process.env.CANOPY_CONFIG || "canopy.yml");
210
+ const cfg = readYamlConfig(cfgPath);
211
+ const theme = (cfg && cfg.theme) || {};
212
+ const accentRequested = theme && theme.accentColor;
213
+ const grayRequested = theme && theme.grayColor;
214
+ const appearanceRequested = theme && theme.appearance;
215
+ const appearance = normalizeAppearance(appearanceRequested);
216
+
217
+ let accentName = normalizePaletteName(accentRequested);
218
+ let accentScale = accentName
219
+ ? toTailwindScale(accentName, {appearance})
220
+ : null;
221
+ let accentFallback = false;
222
+ if (!accentScale) {
223
+ accentFallback = true;
224
+ accentName = DEFAULT_ACCENT;
225
+ accentScale = toTailwindScale(DEFAULT_ACCENT, {appearance});
226
+ }
227
+
228
+ let grayName = normalizePaletteName(grayRequested);
229
+ let grayScale = grayName ? toTailwindScale(grayName, {appearance}) : null;
230
+ let grayFallback = false;
231
+ if (!grayScale) {
232
+ grayFallback = true;
233
+ grayName = DEFAULT_GRAY;
234
+ grayScale = toTailwindScale(DEFAULT_GRAY, {appearance});
235
+ }
236
+
237
+ const sassTokens = loadSassVariableTokens();
238
+ const dynamicVars = buildVariablesMap(accentScale, grayScale, {appearance});
239
+ const mergedVars = {...(sassTokens && sassTokens.map ? sassTokens.map : {}), ...dynamicVars};
240
+ const css = variablesToCss(mergedVars);
241
+ const sassConfig = buildSassConfig(accentScale, grayScale);
242
+
243
+ debugLog("resolved theme", {
244
+ configPath: cfgPath,
245
+ requested: {
246
+ accent: accentRequested || null,
247
+ gray: grayRequested || null,
248
+ appearance: appearanceRequested || null,
249
+ },
250
+ resolved: {
251
+ appearance,
252
+ accent: accentName,
253
+ gray: grayName,
254
+ accentFallback,
255
+ grayFallback,
256
+ brandSamples: accentScale
257
+ ? {
258
+ 50: accentScale["50"],
259
+ 500: accentScale["500"],
260
+ 900: accentScale["900"],
261
+ }
262
+ : null,
263
+ graySamples: grayScale
264
+ ? {50: grayScale["50"], 500: grayScale["500"], 900: grayScale["900"]}
265
+ : null,
266
+ },
267
+ });
268
+
269
+ if (
270
+ !DEBUG_ENABLED &&
271
+ (accentName !== DEFAULT_ACCENT || grayName !== DEFAULT_GRAY)
272
+ ) {
273
+ try {
274
+ console.log("[canopy-theme]", "resolved", {
275
+ appearance,
276
+ accent: accentName,
277
+ accent500: accentScale && accentScale["500"],
278
+ gray: grayName,
279
+ gray500: grayScale && grayScale["500"],
280
+ });
281
+ } catch (_) {}
282
+ }
283
+
284
+ return {
285
+ appearance,
286
+ accent: {name: accentName, scale: accentScale},
287
+ gray: {name: grayName, scale: grayScale},
288
+ variables: mergedVars,
289
+ css,
290
+ sassConfig,
291
+ };
292
+ }
293
+
294
+ module.exports = {
295
+ loadCanopyTheme,
296
+ toTailwindScale,
297
+ normalizePaletteName,
298
+ normalizeAppearance,
299
+ AVAILABLE_PALETTES: Array.from(AVAILABLE).sort(),
300
+ __DEBUG_ENABLED: DEBUG_ENABLED,
301
+ variablesToCss,
302
+ buildSassConfig,
303
+ };
@@ -1,72 +0,0 @@
1
- @use "./variables" as *;
2
-
3
- :root {
4
- --color-brand-50: #{$color-brand-50};
5
- --color-brand-100: #{$color-brand-100};
6
- --color-brand-200: #{$color-brand-200};
7
- --color-brand-300: #{$color-brand-300};
8
- --color-brand-400: #{$color-brand-400};
9
- --color-brand-500: #{$color-brand-500};
10
- --color-brand-600: #{$color-brand-600};
11
- --color-brand-700: #{$color-brand-700};
12
- --color-brand-800: #{$color-brand-800};
13
- --color-brand-900: #{$color-brand-900};
14
- --color-brand-default: #{$color-brand-default};
15
-
16
- --color-gray-50: #{$color-gray-50};
17
- --color-gray-100: #{$color-gray-100};
18
- --color-gray-200: #{$color-gray-200};
19
- --color-gray-300: #{$color-gray-300};
20
- --color-gray-400: #{$color-gray-400};
21
- --color-gray-500: #{$color-gray-500};
22
- --color-gray-600: #{$color-gray-600};
23
- --color-gray-700: #{$color-gray-700};
24
- --color-gray-800: #{$color-gray-800};
25
- --color-gray-900: #{$color-gray-900};
26
- --color-gray-default: #{$color-gray-default};
27
- --color-gray-muted: #{$color-gray-muted};
28
-
29
- // Clover IIIF specific color roles
30
- --colors-accent: #{$color-brand-default} !important;
31
- --colors-accentAlt: #{$color-brand-800} !important;
32
- --colors-accentMuted: #{$color-brand-400} !important;
33
- --colors-primary: #{$color-gray-default} !important;
34
- --colors-primaryAlt: #{$color-gray-default} !important;
35
- --colors-primaryMuted: #{$color-gray-default} !important;
36
- --colors-secondary: #{$color-gray-50} !important;
37
- --colors-secondaryAlt: #{$color-gray-50} !important;
38
- --colors-secondaryMuted: #{$color-gray-50} !important;
39
-
40
- --font-sans: #{$font-sans} !important;
41
- --font-mono: #{$font-mono} !important;
42
-
43
- --font-size-xs: #{$font-size-xs} !important;
44
- --line-height-xs: #{$line-height-xs} !important;
45
- --font-size-sm: #{$font-size-sm} !important;
46
- --line-height-sm: #{$line-height-sm} !important;
47
- --font-size-base: #{$font-size-base} !important;
48
- --line-height-base: #{$line-height-base} !important;
49
- --font-size-lg: #{$font-size-lg} !important;
50
- --line-height-lg: #{$line-height-lg} !important;
51
- --font-size-xl: #{$font-size-xl} !important;
52
- --line-height-xl: #{$line-height-xl} !important;
53
- --font-size-2xl: #{$font-size-2xl} !important;
54
- --line-height-2xl: #{$line-height-2xl} !important;
55
- --font-size-3xl: #{$font-size-3xl} !important;
56
- --line-height-3xl: #{$line-height-3xl} !important;
57
-
58
- --radius-sm: #{$radius-sm} !important;
59
- --radius-default: #{$radius-default} !important;
60
- --radius-md: #{$radius-md} !important;
61
-
62
- --max-w-content: #{$max-w-content} !important;
63
- --max-w-wide: #{$max-w-wide} !important;
64
-
65
- --shadow-sm: #{$shadow-sm} !important;
66
- --shadow: #{$shadow} !important;
67
- --shadow-md: #{$shadow-md} !important;
68
- --shadow-lg: #{$shadow-lg} !important;
69
-
70
- --duration-fast: #{$duration-fast} !important;
71
- --easing-standard: #{$easing-standard} !important;
72
- }
@@ -1,76 +0,0 @@
1
- // Sass variables (source of truth) and CSS variables (emitted) for Canopy UI.
2
-
3
- // Brand scale
4
- $color-brand-50: #fdfdfe !default;
5
- $color-brand-100: #edf2fe !default;
6
- $color-brand-200: #d2deff !default;
7
- $color-brand-300: #abbdf9 !default;
8
- $color-brand-400: #8da4ef !default;
9
- $color-brand-500: #3e63dd !default;
10
- $color-brand-600: #3358d4 !default;
11
- $color-brand-700: #2c4bbd !default;
12
- $color-brand-800: #243c94 !default;
13
- $color-brand-900: #1f2d5c !default;
14
- $color-brand-default: $color-brand-600 !default;
15
-
16
- $color-gray-50: #fcfcfd !default;
17
- $color-gray-100: #f0f0f3 !default;
18
- $color-gray-200: #e0e1e6 !default;
19
- $color-gray-300: #cdced6 !default;
20
- $color-gray-400: #b9bbc6 !default;
21
- $color-gray-500: #8b8d98 !default;
22
- $color-gray-600: #80838d !default;
23
- $color-gray-700: #60646c !default;
24
- $color-gray-800: #1c2024 !default;
25
- $color-gray-900: #121418 !default;
26
- $color-gray-default: $color-gray-900 !default;
27
- $color-gray-muted: $color-gray-600 !default;
28
-
29
- // Fonts
30
- $font-sans:
31
- "DM Sans", "-apple-system", "Segoe UI", Roboto, Ubuntu, Helvetica, Arial,
32
- sans-serif !default;
33
- $font-serif: "DM Serif Display", Georgia, "Times New Roman", serif !default;
34
- $font-mono:
35
- "ui-monospace", "SFMono-Regular", Menlo, Monaco, Consolas, monospace !default;
36
-
37
- // Font sizes / line heights
38
- $font-size-xs: 0.75rem !default;
39
- $line-height-xs: 1rem !default;
40
- $font-size-sm: 0.875rem !default;
41
- $line-height-sm: 1.25rem !default;
42
- $font-size-base: 1rem !default;
43
- $line-height-base: 1.5rem !default;
44
- $font-size-lg: 1.125rem !default;
45
- $line-height-lg: 1.75rem !default;
46
- $font-size-xl: 1.25rem !default;
47
- $line-height-xl: 1.75rem !default;
48
- $font-size-2xl: 1.5rem !default;
49
- $line-height-2xl: 2rem !default;
50
- $font-size-3xl: 1.875rem !default;
51
- $line-height-3xl: 2.25rem !default;
52
-
53
- // Radii
54
- $radius-sm: 0.125rem !default;
55
- $radius-default: 0.25rem !default;
56
- $radius-md: 0.375rem !default;
57
-
58
- // Max widths
59
- $max-w-content: 1200px !default;
60
- $max-w-wide: 1440px !default;
61
-
62
- // Shadows
63
- $shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05) !default;
64
- $shadow:
65
- 0 1px 3px rgba(0, 0, 0, 0.1),
66
- 0 1px 2px rgba(0, 0, 0, 0.06) !default;
67
- $shadow-md:
68
- 0 4px 6px rgba(0, 0, 0, 0.1),
69
- 0 2px 4px rgba(0, 0, 0, 0.06) !default;
70
- $shadow-lg:
71
- 0 10px 15px rgba(0, 0, 0, 0.1),
72
- 0 4px 6px rgba(0, 0, 0, 0.05) !default;
73
-
74
- // Transitions
75
- $duration-fast: 150ms !default;
76
- $easing-standard: cubic-bezier(0.2, 0.8, 0.2, 1) !default;