@yahoo/uds-mobile 1.6.4 → 1.7.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.
@@ -396,6 +396,9 @@ var buttonVariantsFlat = [
396
396
  "warning-secondary",
397
397
  "info-secondary",
398
398
  "tertiary",
399
+ "contrast-high",
400
+ "contrast-medium",
401
+ "contrast-low",
399
402
  "brand-tertiary",
400
403
  "alert-tertiary",
401
404
  "positive-tertiary",
@@ -10,7 +10,7 @@ import { fontAliasToPostscript } from "@yahoo/uds-mobile/fonts";
10
10
  /**
11
11
  * Generate Unistyles theme from UDS tokens.
12
12
  *
13
- * Takes UniversalTokensConfig and generates theme objects for React Native Unistyles.
13
+ * Takes UniversalTokensConfigGeneric and generates theme objects for React Native Unistyles.
14
14
  */
15
15
  /**
16
16
  * Converts an array of BoxShadowValue objects to a CSS box-shadow string.
@@ -72,11 +72,63 @@ function rgbStringToRgb(rgbString) {
72
72
  return `rgb(${parts.join(", ")})`;
73
73
  }
74
74
  /**
75
- * Generates elevation colors from config.
75
+ * Generates elevation border colors (for line palette) from config.
76
+ * Resolves the borderColor from each elevation preset to an RGB value.
76
77
  */
77
- function generateElevationColors(elevation) {
78
+ function generateElevationBorderColors(config, colorMode) {
78
79
  const result = {};
79
- for (const level of Object.keys(elevation)) result[`elevation-${level}`] = "transparent";
80
+ const palette = config.colorMode[colorMode].palette;
81
+ const spectrum = config.colorMode[colorMode].spectrum;
82
+ for (const level of Object.keys(config.elevation)) {
83
+ const borderColorDef = config.elevation[level][colorMode].borderColor;
84
+ let color = "transparent";
85
+ if (borderColorDef.type === "line") {
86
+ const colorDef = palette.line?.[borderColorDef.value];
87
+ if (colorDef) {
88
+ const rgbValue = spectrum[colorDef.hue]?.[colorDef.step];
89
+ if (rgbValue) {
90
+ const parts = rgbValue.trim().split(/\s+/);
91
+ color = colorDef.opacity !== void 0 ? `rgba(${parts.join(", ")}, ${parseInt(colorDef.opacity, 10) / 100})` : `rgb(${parts.join(", ")})`;
92
+ }
93
+ }
94
+ } else if (borderColorDef.type === "always") color = newAlwaysPalette[borderColorDef.value] ?? "transparent";
95
+ else if (borderColorDef.type === "spectrum") {
96
+ const spectrumValue = borderColorDef.value;
97
+ const rgbValue = spectrum[spectrumValue.hue]?.[spectrumValue.step];
98
+ if (rgbValue) color = `rgb(${rgbValue.trim().split(/\s+/).join(", ")})`;
99
+ }
100
+ result[`elevation-${level}`] = color;
101
+ }
102
+ return result;
103
+ }
104
+ /**
105
+ * Generates elevation background colors from config.
106
+ * Resolves backgroundFill from elevation preset through the background palette.
107
+ */
108
+ function generateElevationBackgroundColors(config, colorMode) {
109
+ const result = {};
110
+ const palette = config.colorMode[colorMode].palette;
111
+ const spectrum = config.colorMode[colorMode].spectrum;
112
+ for (const level of Object.keys(config.elevation)) {
113
+ const backgroundFill = config.elevation[level][colorMode].backgroundFill;
114
+ let color = "transparent";
115
+ if (backgroundFill.type === "background") {
116
+ const colorDef = palette.background?.[backgroundFill.value];
117
+ if (colorDef) {
118
+ const rgbValue = spectrum[colorDef.hue]?.[colorDef.step];
119
+ if (rgbValue) {
120
+ const parts = rgbValue.trim().split(/\s+/);
121
+ color = colorDef.opacity !== void 0 ? `rgba(${parts.join(", ")}, ${parseInt(colorDef.opacity, 10) / 100})` : `rgb(${parts.join(", ")})`;
122
+ }
123
+ }
124
+ } else if (backgroundFill.type === "always") color = newAlwaysPalette[backgroundFill.value] ?? "transparent";
125
+ else if (backgroundFill.type === "spectrum") {
126
+ const spectrumValue = backgroundFill.value;
127
+ const rgbValue = spectrum[spectrumValue.hue]?.[spectrumValue.step];
128
+ if (rgbValue) color = `rgb(${rgbValue.trim().split(/\s+/).join(", ")})`;
129
+ }
130
+ result[`elevation-${level}`] = color;
131
+ }
80
132
  return result;
81
133
  }
82
134
  /**
@@ -180,12 +232,65 @@ function generateShadows(config) {
180
232
  });
181
233
  return result;
182
234
  }
235
+ function isElevationCustomShadows(value) {
236
+ return Array.isArray(value);
237
+ }
238
+ /**
239
+ * Generates pre-computed boxShadow CSS strings for all shadow variants.
240
+ * Produces both drop and inset shadow maps keyed by variant name.
241
+ * Elevation levels resolve their dropShadow config (which may reference
242
+ * a ShadowVariant or provide custom ShadowPreset tuples).
243
+ */
244
+ function generateBoxShadows(config, colorMode) {
245
+ const colorsConfig = config.colorMode[colorMode];
246
+ const spectrum = colorsConfig.spectrum;
247
+ const palette = colorsConfig.palette.foreground;
248
+ const drop = {};
249
+ const inset = {};
250
+ for (const [variant, presets] of Object.entries(config.shadow.drop)) {
251
+ if (variant === "none" || !presets || presets.length === 0) {
252
+ drop[variant] = "";
253
+ continue;
254
+ }
255
+ drop[variant] = boxShadowToCssString(convertShadowToBoxShadow(presets, spectrum, palette));
256
+ }
257
+ for (const [level, modePresets] of Object.entries(config.elevation)) {
258
+ const preset = modePresets[colorMode];
259
+ const key = `elevation-${level}`;
260
+ if (!preset.dropShadow || preset.dropShadow === "none") {
261
+ drop[key] = "";
262
+ continue;
263
+ }
264
+ if (isElevationCustomShadows(preset.dropShadow)) {
265
+ const allPresets = [...preset.dropShadow];
266
+ if (allPresets.length > 0) drop[key] = boxShadowToCssString(convertShadowToBoxShadow(allPresets, spectrum, palette));
267
+ else drop[key] = "";
268
+ } else {
269
+ const refPresets = config.shadow.drop[preset.dropShadow];
270
+ if (refPresets && refPresets.length > 0) drop[key] = boxShadowToCssString(convertShadowToBoxShadow(refPresets, spectrum, palette));
271
+ else drop[key] = "";
272
+ }
273
+ }
274
+ for (const [variant, presets] of Object.entries(config.shadow.inset)) {
275
+ if (variant === "none" || !presets || presets.length === 0) {
276
+ inset[variant] = "";
277
+ continue;
278
+ }
279
+ inset[variant] = boxShadowToCssString(convertShadowToBoxShadow(presets, spectrum, palette, true));
280
+ }
281
+ drop["none"] = drop["none"] ?? "";
282
+ inset["none"] = inset["none"] ?? "";
283
+ return {
284
+ drop,
285
+ inset
286
+ };
287
+ }
183
288
  /**
184
289
  * Resolves a typography variant name to React Native text styles.
185
290
  * Looks up the typography config and converts to RN-compatible values.
186
291
  *
187
292
  * @param variantName - The typography variant name (e.g., 'body1', 'label4', 'ui2')
188
- * @param typography - The typography config from UniversalTokensConfig
293
+ * @param typography - The typography config from UniversalTokensConfigGeneric
189
294
  * @param config - The full config for resolving font family aliases
190
295
  * @returns Resolved typography styles (fontSize, lineHeight, letterSpacing, fontFamily)
191
296
  */
@@ -208,7 +313,7 @@ function resolveTypographyStyles(variantName, typography, config) {
208
313
  }
209
314
  return result;
210
315
  }
211
- function resolveValue(variable, config, colorMode) {
316
+ function resolveValue(variable, config, colorMode, propName) {
212
317
  const { type, value } = variable;
213
318
  const palette = config.colorMode[colorMode].palette;
214
319
  const spectrum = config.colorMode[colorMode].spectrum;
@@ -263,6 +368,69 @@ function resolveValue(variable, config, colorMode) {
263
368
  if (dropPresets && dropPresets.length > 0) return convertShadowToBoxShadow(dropPresets, spectrum, palette.foreground, true);
264
369
  return [];
265
370
  }
371
+ if (type === "elevationAliases") {
372
+ const level = value.replace("elevation-", "");
373
+ const elevationPreset = config.elevation[level];
374
+ if (!elevationPreset) return;
375
+ const preset = elevationPreset[colorMode];
376
+ if (propName === "backgroundColor") {
377
+ const backgroundFill = preset.backgroundFill;
378
+ if (backgroundFill.type === "background") {
379
+ const colorDef = palette.background?.[backgroundFill.value];
380
+ if (colorDef) {
381
+ const rgbValue = spectrum[colorDef.hue]?.[colorDef.step];
382
+ if (rgbValue) {
383
+ const parts = rgbValue.trim().split(/\s+/);
384
+ if (colorDef.opacity !== void 0) return `rgba(${parts.join(", ")}, ${parseInt(colorDef.opacity, 10) / 100})`;
385
+ return `rgb(${parts.join(", ")})`;
386
+ }
387
+ }
388
+ } else if (backgroundFill.type === "always") return newAlwaysPalette[backgroundFill.value] ?? "transparent";
389
+ else if (backgroundFill.type === "spectrum") {
390
+ const spectrumValue = backgroundFill.value;
391
+ const rgbValue = spectrum[spectrumValue.hue]?.[spectrumValue.step];
392
+ if (rgbValue) return `rgb(${rgbValue.trim().split(/\s+/).join(", ")})`;
393
+ }
394
+ return "transparent";
395
+ }
396
+ if (propName === "borderColor") {
397
+ const borderColorDef = preset.borderColor;
398
+ if (borderColorDef.type === "line") {
399
+ const colorDef = palette.line?.[borderColorDef.value];
400
+ if (colorDef) {
401
+ const rgbValue = spectrum[colorDef.hue]?.[colorDef.step];
402
+ if (rgbValue) {
403
+ const parts = rgbValue.trim().split(/\s+/);
404
+ if (colorDef.opacity !== void 0) return `rgba(${parts.join(", ")}, ${parseInt(colorDef.opacity, 10) / 100})`;
405
+ return `rgb(${parts.join(", ")})`;
406
+ }
407
+ }
408
+ } else if (borderColorDef.type === "always") return newAlwaysPalette[borderColorDef.value] ?? "transparent";
409
+ else if (borderColorDef.type === "spectrum") {
410
+ const spectrumValue = borderColorDef.value;
411
+ const rgbValue = spectrum[spectrumValue.hue]?.[spectrumValue.step];
412
+ if (rgbValue) return `rgb(${rgbValue.trim().split(/\s+/).join(", ")})`;
413
+ }
414
+ return "transparent";
415
+ }
416
+ if (propName === "borderWidth") {
417
+ const borderWidthKey = preset.borderWidth;
418
+ return scaleConfig.borderWidth[borderWidthKey] ?? 0;
419
+ }
420
+ if (propName === "shadow") {
421
+ const elevationPreset = config.elevation[level];
422
+ if (!elevationPreset) return [];
423
+ const preset = elevationPreset[colorMode];
424
+ if (!preset.dropShadow || preset.dropShadow === "none") return [];
425
+ if (isElevationCustomShadows(preset.dropShadow)) {
426
+ const allPresets = [...preset.dropShadow];
427
+ return allPresets.length > 0 ? convertShadowToBoxShadow(allPresets, spectrum, palette.foreground) : [];
428
+ }
429
+ const refPresets = config.shadow.drop[preset.dropShadow];
430
+ return refPresets && refPresets.length > 0 ? convertShadowToBoxShadow(refPresets, spectrum, palette.foreground) : [];
431
+ }
432
+ return;
433
+ }
266
434
  if (type === "textDecorationLines") return value;
267
435
  if (typeof value === "number") return value;
268
436
  }
@@ -296,7 +464,7 @@ function generateComponents(config, colorMode) {
296
464
  if (!rnProps) continue;
297
465
  const stateValue = states[state];
298
466
  if (!stateValue) continue;
299
- const resolvedValue = resolveValue(stateValue, config, colorMode);
467
+ const resolvedValue = resolveValue(stateValue, config, colorMode, propName);
300
468
  if (resolvedValue === void 0) continue;
301
469
  if (SHADOW_PROPS.has(propName)) {
302
470
  if (Array.isArray(resolvedValue)) shadowValues.push(...resolvedValue);
@@ -333,6 +501,16 @@ function generateComponents(config, colorMode) {
333
501
  state
334
502
  ]);
335
503
  result[flatKey] = textStyleObj;
504
+ if (variantPath[0] === "icon" && textStyleObj.color) {
505
+ const iconLayer = "icon";
506
+ const iconFlatKey = toSlashKey([
507
+ componentName,
508
+ ...variantPath,
509
+ iconLayer,
510
+ state
511
+ ]);
512
+ result[iconFlatKey] = { color: textStyleObj.color };
513
+ }
336
514
  }
337
515
  }
338
516
  }
@@ -346,31 +524,40 @@ function generateComponents(config, colorMode) {
346
524
  function generateTheme(config, colorMode) {
347
525
  const colorsConfig = config.colorMode[colorMode];
348
526
  const scaleConfig = config.scaleMode[DEFAULT_SCALE_MODE];
349
- const elevationColors = generateElevationColors(config.elevation);
527
+ const elevationBackgroundColors = generateElevationBackgroundColors(config, colorMode);
528
+ const elevationBorderColors = generateElevationBorderColors(config, colorMode);
529
+ const boxShadows = generateBoxShadows(config, colorMode);
350
530
  return {
351
531
  colors: {
352
532
  spectrum: sortKeys(generateSpectrum(colorsConfig.spectrum)),
353
533
  background: sortKeys({
354
534
  ...generatePalette(colorsConfig.palette.background, colorsConfig.spectrum),
355
- ...elevationColors
535
+ ...elevationBackgroundColors
356
536
  }),
357
537
  foreground: sortKeys(generatePalette(colorsConfig.palette.foreground, colorsConfig.spectrum)),
358
538
  line: sortKeys({
359
539
  ...generatePalette(colorsConfig.palette.line, colorsConfig.spectrum),
360
- ...elevationColors
540
+ ...elevationBorderColors
361
541
  })
362
542
  },
363
543
  spacing: sortKeys({ ...spacingMap }),
364
544
  borderRadius: sortKeys({ ...scaleConfig.borderRadius }),
365
545
  borderWidth: sortKeys({
366
546
  ...scaleConfig.borderWidth,
367
- ...Object.fromEntries(Object.keys(config.elevation).map((level) => [`elevation-${level}`, parseInt(level, 10)]))
547
+ ...Object.fromEntries(Object.keys(config.elevation).map((level) => {
548
+ const borderWidthKey = config.elevation[level].light.borderWidth;
549
+ return [`elevation-${level}`, scaleConfig.borderWidth[borderWidthKey] ?? 0];
550
+ }))
368
551
  }),
369
552
  iconSize: sortKeys({ ...scaleConfig.iconSizes }),
370
553
  avatarSize: sortKeys({ ...scaleConfig.avatarSizes }),
371
554
  font: sortKeys(generateFontAliases(config.font)),
372
555
  typography: sortKeys(generateTypography(config.typography, config.font)),
373
556
  shadow: sortKeys(generateShadows(config)),
557
+ boxShadow: {
558
+ drop: sortKeys(boxShadows.drop),
559
+ inset: sortKeys(boxShadows.inset)
560
+ },
374
561
  components: generateComponents(config, colorMode)
375
562
  };
376
563
  }
@@ -4,6 +4,7 @@ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
4
  let react = require("react");
5
5
  let react_native = require("react-native");
6
6
  let generated_styles = require("../../generated/styles");
7
+ let react_native_unistyles = require("react-native-unistyles");
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
8
9
 
9
10
  //#region src/components/Box.tsx
@@ -35,20 +36,21 @@ let react_jsx_runtime = require("react/jsx-runtime");
35
36
  * @see {@link HStack} for horizontal layouts
36
37
  * @see {@link VStack} for vertical layouts
37
38
  */
38
- const Box = (0, react.memo)(function Box({ backgroundColor, dangerouslySetBackgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, dangerouslySetBorderColor, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, display = "flex", overflow, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, width, height, minWidth, maxWidth, minHeight, maxHeight, style, ref, ...props }) {
39
+ const Box = (0, react.memo)(function Box({ elevation, backgroundColor, dangerouslySetBackgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, dangerouslySetBorderColor, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, display = "flex", overflow, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, width, height, minWidth, maxWidth, minHeight, maxHeight, dropShadow, insetShadow, style, ref, ...props }) {
40
+ const elevationAlias = elevation !== void 0 ? `elevation-${elevation}` : void 0;
39
41
  const variants = {
40
- backgroundColor,
42
+ backgroundColor: backgroundColor ?? elevationAlias,
41
43
  borderRadius,
42
44
  borderTopStartRadius,
43
45
  borderTopEndRadius,
44
46
  borderBottomStartRadius,
45
47
  borderBottomEndRadius,
46
- borderColor,
48
+ borderColor: borderColor ?? elevationAlias,
47
49
  borderStartColor,
48
50
  borderEndColor,
49
51
  borderTopColor,
50
52
  borderBottomColor,
51
- borderWidth,
53
+ borderWidth: borderWidth ?? elevationAlias,
52
54
  borderVerticalWidth,
53
55
  borderHorizontalWidth,
54
56
  borderStartWidth,
@@ -84,6 +86,8 @@ const Box = (0, react.memo)(function Box({ backgroundColor, dangerouslySetBackgr
84
86
  rowGap
85
87
  };
86
88
  generated_styles.styles.useVariants(variants);
89
+ const effectiveDropShadow = dropShadow ?? elevationAlias;
90
+ const shadowStyle = effectiveDropShadow || insetShadow ? shadowSheet.shadow(effectiveDropShadow, insetShadow) : void 0;
87
91
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_native.View, {
88
92
  ref,
89
93
  style: (0, react.useMemo)(() => [
@@ -95,6 +99,7 @@ const Box = (0, react.memo)(function Box({ backgroundColor, dangerouslySetBackgr
95
99
  maxWidth ? { maxWidth } : void 0,
96
100
  minHeight ? { minHeight } : void 0,
97
101
  maxHeight ? { maxHeight } : void 0,
102
+ shadowStyle,
98
103
  generated_styles.styles.foundation,
99
104
  style
100
105
  ], [
@@ -106,6 +111,7 @@ const Box = (0, react.memo)(function Box({ backgroundColor, dangerouslySetBackgr
106
111
  maxWidth,
107
112
  minHeight,
108
113
  maxHeight,
114
+ shadowStyle,
109
115
  generated_styles.styles.foundation,
110
116
  style
111
117
  ]),
@@ -113,6 +119,14 @@ const Box = (0, react.memo)(function Box({ backgroundColor, dangerouslySetBackgr
113
119
  });
114
120
  });
115
121
  Box.displayName = "Box";
122
+ /**
123
+ * Dynamic shadow stylesheet that merges drop and inset shadows into a single
124
+ * boxShadow CSS string. Theme-reactive so shadows update on color mode change.
125
+ */
126
+ const shadowSheet = react_native_unistyles.StyleSheet.create((theme) => ({ shadow: (drop, inset) => {
127
+ const parts = [drop ? theme.boxShadow.drop[drop] : "", inset ? theme.boxShadow.inset[inset] : ""].filter(Boolean);
128
+ return parts.length > 0 ? { boxShadow: parts.join(", ") } : {};
129
+ } }));
116
130
 
117
131
  //#endregion
118
132
  exports.Box = Box;
@@ -1,4 +1,5 @@
1
1
 
2
+ import { ElevationLevel } from "../types/dist/index.cjs";
2
3
  import { SizeProps } from "../types.cjs";
3
4
  import * as react from "react";
4
5
  import { Ref } from "react";
@@ -7,9 +8,8 @@ import { StyleProps } from "../../generated/styles";
7
8
 
8
9
  //#region src/components/Box.d.ts
9
10
  interface BoxProps extends ViewProps, SizeProps {
10
- /** Ref to the underlying View */
11
11
  ref?: Ref<View>;
12
- /** Background color from the theme palette */
12
+ elevation?: ElevationLevel;
13
13
  backgroundColor?: StyleProps['backgroundColor'];
14
14
  borderRadius?: StyleProps['borderRadius'];
15
15
  borderTopStartRadius?: StyleProps['borderTopStartRadius'];
@@ -55,6 +55,8 @@ interface BoxProps extends ViewProps, SizeProps {
55
55
  offsetTop?: StyleProps['offsetTop'];
56
56
  columnGap?: StyleProps['columnGap'];
57
57
  rowGap?: StyleProps['rowGap'];
58
+ dropShadow?: StyleProps['dropShadow'];
59
+ insetShadow?: StyleProps['insetShadow'];
58
60
  dangerouslySetBackgroundColor?: string;
59
61
  dangerouslySetBorderColor?: string;
60
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Box.d.cts","names":[],"sources":["../../src/components/Box.tsx"],"mappings":";;;;;;;;UASU,QAAA,SAAiB,SAAA,EAAW,SAAA;;EAEpC,GAAA,GAAM,GAAA,CAAI,IAAA;EAFO;EAIjB,eAAA,GAAkB,UAAA;EAClB,YAAA,GAAe,UAAA;EACf,oBAAA,GAAuB,UAAA;EACvB,kBAAA,GAAqB,UAAA;EACrB,uBAAA,GAA0B,UAAA;EAC1B,qBAAA,GAAwB,UAAA;EACxB,WAAA,GAAc,UAAA;EACd,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,WAAA,GAAc,UAAA;EACd,mBAAA,GAAsB,UAAA;EACtB,qBAAA,GAAwB,UAAA;EACxB,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,SAAA,GAAY,UAAA;EACZ,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,UAAA;EAChB,QAAA,GAAW,UAAA;EACX,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,UAAA;EAEjB,OAAA,GAAU,UAAA;EACV,QAAA,GAAW,UAAA;EAIX,OAAA,GAAU,UAAA;EACV,iBAAA,GAAoB,UAAA;EACpB,eAAA,GAAkB,UAAA;EAClB,aAAA,GAAgB,UAAA;EAChB,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,UAAA;EACT,cAAA,GAAiB,UAAA;EACjB,gBAAA,GAAmB,UAAA;EACnB,YAAA,GAAe,UAAA;EACf,SAAA,GAAY,UAAA;EACZ,WAAA,GAAc,UAAA;EACd,SAAA,GAAY,UAAA;EACZ,SAAA,GAAY,UAAA;EACZ,MAAA,GAAS,UAAA;EACT,6BAAA;EACA,yBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BI,GAAA,EAAG,KAAA,CAAA,oBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"Box.d.cts","names":[],"sources":["../../src/components/Box.tsx"],"mappings":";;;;;;;;;UAWU,QAAA,SAAiB,SAAA,EAAW,SAAA;EACpC,GAAA,GAAM,GAAA,CAAI,IAAA;EACV,SAAA,GAAY,cAAA;EACZ,eAAA,GAAkB,UAAA;EAClB,YAAA,GAAe,UAAA;EACf,oBAAA,GAAuB,UAAA;EACvB,kBAAA,GAAqB,UAAA;EACrB,uBAAA,GAA0B,UAAA;EAC1B,qBAAA,GAAwB,UAAA;EACxB,WAAA,GAAc,UAAA;EACd,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,WAAA,GAAc,UAAA;EACd,mBAAA,GAAsB,UAAA;EACtB,qBAAA,GAAwB,UAAA;EACxB,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,SAAA,GAAY,UAAA;EACZ,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,UAAA;EAChB,QAAA,GAAW,UAAA;EACX,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,UAAA;EAEjB,OAAA,GAAU,UAAA;EACV,QAAA,GAAW,UAAA;EAIX,OAAA,GAAU,UAAA;EACV,iBAAA,GAAoB,UAAA;EACpB,eAAA,GAAkB,UAAA;EAClB,aAAA,GAAgB,UAAA;EAChB,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,UAAA;EACT,cAAA,GAAiB,UAAA;EACjB,gBAAA,GAAmB,UAAA;EACnB,YAAA,GAAe,UAAA;EACf,SAAA,GAAY,UAAA;EACZ,WAAA,GAAc,UAAA;EACd,SAAA,GAAY,UAAA;EACZ,SAAA,GAAY,UAAA;EACZ,MAAA,GAAS,UAAA;EACT,UAAA,GAAa,UAAA;EACb,WAAA,GAAc,UAAA;EACd,6BAAA;EACA,yBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BI,GAAA,EAAG,KAAA,CAAA,oBAAA,CAAA,QAAA"}
@@ -1,4 +1,5 @@
1
1
 
2
+ import { ElevationLevel } from "../types/dist/index.mjs";
2
3
  import { SizeProps } from "../types.mjs";
3
4
  import * as react from "react";
4
5
  import { Ref } from "react";
@@ -7,9 +8,8 @@ import { StyleProps } from "../../generated/styles";
7
8
 
8
9
  //#region src/components/Box.d.ts
9
10
  interface BoxProps extends ViewProps, SizeProps {
10
- /** Ref to the underlying View */
11
11
  ref?: Ref<View>;
12
- /** Background color from the theme palette */
12
+ elevation?: ElevationLevel;
13
13
  backgroundColor?: StyleProps['backgroundColor'];
14
14
  borderRadius?: StyleProps['borderRadius'];
15
15
  borderTopStartRadius?: StyleProps['borderTopStartRadius'];
@@ -55,6 +55,8 @@ interface BoxProps extends ViewProps, SizeProps {
55
55
  offsetTop?: StyleProps['offsetTop'];
56
56
  columnGap?: StyleProps['columnGap'];
57
57
  rowGap?: StyleProps['rowGap'];
58
+ dropShadow?: StyleProps['dropShadow'];
59
+ insetShadow?: StyleProps['insetShadow'];
58
60
  dangerouslySetBackgroundColor?: string;
59
61
  dangerouslySetBorderColor?: string;
60
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Box.d.mts","names":[],"sources":["../../src/components/Box.tsx"],"mappings":";;;;;;;;UASU,QAAA,SAAiB,SAAA,EAAW,SAAA;;EAEpC,GAAA,GAAM,GAAA,CAAI,IAAA;EAFO;EAIjB,eAAA,GAAkB,UAAA;EAClB,YAAA,GAAe,UAAA;EACf,oBAAA,GAAuB,UAAA;EACvB,kBAAA,GAAqB,UAAA;EACrB,uBAAA,GAA0B,UAAA;EAC1B,qBAAA,GAAwB,UAAA;EACxB,WAAA,GAAc,UAAA;EACd,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,WAAA,GAAc,UAAA;EACd,mBAAA,GAAsB,UAAA;EACtB,qBAAA,GAAwB,UAAA;EACxB,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,SAAA,GAAY,UAAA;EACZ,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,UAAA;EAChB,QAAA,GAAW,UAAA;EACX,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,UAAA;EAEjB,OAAA,GAAU,UAAA;EACV,QAAA,GAAW,UAAA;EAIX,OAAA,GAAU,UAAA;EACV,iBAAA,GAAoB,UAAA;EACpB,eAAA,GAAkB,UAAA;EAClB,aAAA,GAAgB,UAAA;EAChB,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,UAAA;EACT,cAAA,GAAiB,UAAA;EACjB,gBAAA,GAAmB,UAAA;EACnB,YAAA,GAAe,UAAA;EACf,SAAA,GAAY,UAAA;EACZ,WAAA,GAAc,UAAA;EACd,SAAA,GAAY,UAAA;EACZ,SAAA,GAAY,UAAA;EACZ,MAAA,GAAS,UAAA;EACT,6BAAA;EACA,yBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BI,GAAA,EAAG,KAAA,CAAA,oBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"Box.d.mts","names":[],"sources":["../../src/components/Box.tsx"],"mappings":";;;;;;;;;UAWU,QAAA,SAAiB,SAAA,EAAW,SAAA;EACpC,GAAA,GAAM,GAAA,CAAI,IAAA;EACV,SAAA,GAAY,cAAA;EACZ,eAAA,GAAkB,UAAA;EAClB,YAAA,GAAe,UAAA;EACf,oBAAA,GAAuB,UAAA;EACvB,kBAAA,GAAqB,UAAA;EACrB,uBAAA,GAA0B,UAAA;EAC1B,qBAAA,GAAwB,UAAA;EACxB,WAAA,GAAc,UAAA;EACd,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,WAAA,GAAc,UAAA;EACd,mBAAA,GAAsB,UAAA;EACtB,qBAAA,GAAwB,UAAA;EACxB,gBAAA,GAAmB,UAAA;EACnB,cAAA,GAAiB,UAAA;EACjB,cAAA,GAAiB,UAAA;EACjB,iBAAA,GAAoB,UAAA;EACpB,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,SAAA,GAAY,UAAA;EACZ,IAAA,GAAO,UAAA;EACP,aAAA,GAAgB,UAAA;EAChB,QAAA,GAAW,UAAA;EACX,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,UAAA;EACX,cAAA,GAAiB,UAAA;EAEjB,OAAA,GAAU,UAAA;EACV,QAAA,GAAW,UAAA;EAIX,OAAA,GAAU,UAAA;EACV,iBAAA,GAAoB,UAAA;EACpB,eAAA,GAAkB,UAAA;EAClB,aAAA,GAAgB,UAAA;EAChB,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,UAAA;EACf,UAAA,GAAa,UAAA;EACb,MAAA,GAAS,UAAA;EACT,cAAA,GAAiB,UAAA;EACjB,gBAAA,GAAmB,UAAA;EACnB,YAAA,GAAe,UAAA;EACf,SAAA,GAAY,UAAA;EACZ,WAAA,GAAc,UAAA;EACd,SAAA,GAAY,UAAA;EACZ,SAAA,GAAY,UAAA;EACZ,MAAA,GAAS,UAAA;EACT,UAAA,GAAa,UAAA;EACb,WAAA,GAAc,UAAA;EACd,6BAAA;EACA,yBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BI,GAAA,EAAG,KAAA,CAAA,oBAAA,CAAA,QAAA"}
@@ -2,6 +2,7 @@
2
2
  import { memo, useMemo } from "react";
3
3
  import { View } from "react-native";
4
4
  import { styles } from "../../generated/styles";
5
+ import { StyleSheet } from "react-native-unistyles";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
 
7
8
  //#region src/components/Box.tsx
@@ -33,20 +34,21 @@ import { jsx } from "react/jsx-runtime";
33
34
  * @see {@link HStack} for horizontal layouts
34
35
  * @see {@link VStack} for vertical layouts
35
36
  */
36
- const Box = memo(function Box({ backgroundColor, dangerouslySetBackgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, dangerouslySetBorderColor, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, display = "flex", overflow, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, width, height, minWidth, maxWidth, minHeight, maxHeight, style, ref, ...props }) {
37
+ const Box = memo(function Box({ elevation, backgroundColor, dangerouslySetBackgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, dangerouslySetBorderColor, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, display = "flex", overflow, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, width, height, minWidth, maxWidth, minHeight, maxHeight, dropShadow, insetShadow, style, ref, ...props }) {
38
+ const elevationAlias = elevation !== void 0 ? `elevation-${elevation}` : void 0;
37
39
  const variants = {
38
- backgroundColor,
40
+ backgroundColor: backgroundColor ?? elevationAlias,
39
41
  borderRadius,
40
42
  borderTopStartRadius,
41
43
  borderTopEndRadius,
42
44
  borderBottomStartRadius,
43
45
  borderBottomEndRadius,
44
- borderColor,
46
+ borderColor: borderColor ?? elevationAlias,
45
47
  borderStartColor,
46
48
  borderEndColor,
47
49
  borderTopColor,
48
50
  borderBottomColor,
49
- borderWidth,
51
+ borderWidth: borderWidth ?? elevationAlias,
50
52
  borderVerticalWidth,
51
53
  borderHorizontalWidth,
52
54
  borderStartWidth,
@@ -82,6 +84,8 @@ const Box = memo(function Box({ backgroundColor, dangerouslySetBackgroundColor,
82
84
  rowGap
83
85
  };
84
86
  styles.useVariants(variants);
87
+ const effectiveDropShadow = dropShadow ?? elevationAlias;
88
+ const shadowStyle = effectiveDropShadow || insetShadow ? shadowSheet.shadow(effectiveDropShadow, insetShadow) : void 0;
85
89
  return /* @__PURE__ */ jsx(View, {
86
90
  ref,
87
91
  style: useMemo(() => [
@@ -93,6 +97,7 @@ const Box = memo(function Box({ backgroundColor, dangerouslySetBackgroundColor,
93
97
  maxWidth ? { maxWidth } : void 0,
94
98
  minHeight ? { minHeight } : void 0,
95
99
  maxHeight ? { maxHeight } : void 0,
100
+ shadowStyle,
96
101
  styles.foundation,
97
102
  style
98
103
  ], [
@@ -104,6 +109,7 @@ const Box = memo(function Box({ backgroundColor, dangerouslySetBackgroundColor,
104
109
  maxWidth,
105
110
  minHeight,
106
111
  maxHeight,
112
+ shadowStyle,
107
113
  styles.foundation,
108
114
  style
109
115
  ]),
@@ -111,6 +117,14 @@ const Box = memo(function Box({ backgroundColor, dangerouslySetBackgroundColor,
111
117
  });
112
118
  });
113
119
  Box.displayName = "Box";
120
+ /**
121
+ * Dynamic shadow stylesheet that merges drop and inset shadows into a single
122
+ * boxShadow CSS string. Theme-reactive so shadows update on color mode change.
123
+ */
124
+ const shadowSheet = StyleSheet.create((theme) => ({ shadow: (drop, inset) => {
125
+ const parts = [drop ? theme.boxShadow.drop[drop] : "", inset ? theme.boxShadow.inset[inset] : ""].filter(Boolean);
126
+ return parts.length > 0 ? { boxShadow: parts.join(", ") } : {};
127
+ } }));
114
128
 
115
129
  //#endregion
116
130
  export { Box };
@@ -1 +1 @@
1
- {"version":3,"file":"Box.mjs","names":[],"sources":["../../src/components/Box.tsx"],"sourcesContent":["import type { Ref } from 'react';\nimport { memo, useMemo } from 'react';\nimport type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\n\nimport type { StyleProps } from '../../generated/styles';\nimport { styles } from '../../generated/styles';\nimport type { SizeProps } from '../types';\n\ninterface BoxProps extends ViewProps, SizeProps {\n /** Ref to the underlying View */\n ref?: Ref<View>;\n /** Background color from the theme palette */\n backgroundColor?: StyleProps['backgroundColor'];\n borderRadius?: StyleProps['borderRadius'];\n borderTopStartRadius?: StyleProps['borderTopStartRadius'];\n borderTopEndRadius?: StyleProps['borderTopEndRadius'];\n borderBottomStartRadius?: StyleProps['borderBottomStartRadius'];\n borderBottomEndRadius?: StyleProps['borderBottomEndRadius'];\n borderColor?: StyleProps['borderColor'];\n borderStartColor?: StyleProps['borderStartColor'];\n borderEndColor?: StyleProps['borderEndColor'];\n borderTopColor?: StyleProps['borderTopColor'];\n borderBottomColor?: StyleProps['borderBottomColor'];\n borderWidth?: StyleProps['borderWidth'];\n borderVerticalWidth?: StyleProps['borderVerticalWidth'];\n borderHorizontalWidth?: StyleProps['borderHorizontalWidth'];\n borderStartWidth?: StyleProps['borderStartWidth'];\n borderEndWidth?: StyleProps['borderEndWidth'];\n borderTopWidth?: StyleProps['borderTopWidth'];\n borderBottomWidth?: StyleProps['borderBottomWidth'];\n alignContent?: StyleProps['alignContent'];\n alignItems?: StyleProps['alignItems'];\n alignSelf?: StyleProps['alignSelf'];\n flex?: StyleProps['flex'];\n flexDirection?: StyleProps['flexDirection'];\n flexGrow?: StyleProps['flexGrow'];\n flexShrink?: StyleProps['flexShrink'];\n flexWrap?: StyleProps['flexWrap'];\n justifyContent?: StyleProps['justifyContent'];\n // flexBasis?: StyleProps['flexBasis'];\n display?: StyleProps['display'];\n overflow?: StyleProps['overflow'];\n // overflowX?: StyleProps['overflowX'];\n // overflowY?: StyleProps['overflowY'];\n // position?: StyleProps['position'];\n spacing?: StyleProps['spacing'];\n spacingHorizontal?: StyleProps['spacingHorizontal'];\n spacingVertical?: StyleProps['spacingVertical'];\n spacingBottom?: StyleProps['spacingBottom'];\n spacingEnd?: StyleProps['spacingEnd'];\n spacingStart?: StyleProps['spacingStart'];\n spacingTop?: StyleProps['spacingTop'];\n offset?: StyleProps['offset'];\n offsetVertical?: StyleProps['offsetVertical'];\n offsetHorizontal?: StyleProps['offsetHorizontal'];\n offsetBottom?: StyleProps['offsetBottom'];\n offsetEnd?: StyleProps['offsetEnd'];\n offsetStart?: StyleProps['offsetStart'];\n offsetTop?: StyleProps['offsetTop'];\n columnGap?: StyleProps['columnGap'];\n rowGap?: StyleProps['rowGap'];\n dangerouslySetBackgroundColor?: string;\n dangerouslySetBorderColor?: string;\n}\n\n/**\n * **📦 A layout component that can be used to compose other components**\n *\n * @description\n * The most simple component we ship - a View. But with all the power of the UDS design system.\n * By default, `Box` is a flexbox container. When working with vertical or horizontal layouts,\n * consider using VStack or HStack respectively.\n *\n * @category Layout\n * @platform mobile\n *\n * @example\n * ```tsx\n * import { Box } from '@yahoo/uds-mobile';\n *\n * <Box backgroundColor=\"primary\" spacing=\"6\">\n * Any kind of content can go here!\n * </Box>\n * ```\n *\n * @usage\n * - Use as a container to apply padding, shapes, or other styling\n * - Use for creating card components\n * - Use HStack/VStack for directional layouts\n *\n * @see {@link HStack} for horizontal layouts\n * @see {@link VStack} for vertical layouts\n */\nconst Box = memo(function Box({\n // background\n backgroundColor,\n dangerouslySetBackgroundColor,\n // border\n borderRadius,\n borderTopStartRadius,\n borderTopEndRadius,\n borderBottomStartRadius,\n borderBottomEndRadius,\n borderColor,\n dangerouslySetBorderColor,\n borderStartColor,\n borderEndColor,\n borderTopColor,\n borderBottomColor,\n borderWidth,\n borderVerticalWidth,\n borderHorizontalWidth,\n borderStartWidth,\n borderEndWidth,\n borderTopWidth,\n borderBottomWidth,\n // flex\n alignContent,\n alignItems,\n alignSelf,\n flex,\n flexDirection,\n flexGrow,\n flexShrink,\n flexWrap,\n justifyContent,\n // flexBasis,\n // layout\n display = 'flex',\n overflow,\n // overflowX,\n // overflowY,\n // position,\n // spacing\n spacing,\n spacingHorizontal,\n spacingVertical,\n spacingBottom,\n spacingEnd,\n spacingStart,\n spacingTop,\n offset,\n offsetVertical,\n offsetHorizontal,\n offsetBottom,\n offsetEnd,\n offsetStart,\n offsetTop,\n columnGap,\n rowGap,\n // size\n width,\n height,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n // // shadow\n // dropShadow,\n // insetShadow,\n // // nested border radius\n // nestedBorderRadius,\n // nestedBorderRadiusSize = nestedBorderRadius ? borderRadius : undefined,\n // nestedBorderRadiusSpacing = nestedBorderRadius ? spacing : undefined,\n // nestedBorderRadiusWidth = nestedBorderRadius ? borderWidth : undefined,\n // style - extracted to merge with variants\n style,\n ref,\n // rest\n ...props\n}: BoxProps) {\n const variants = {\n // background\n backgroundColor,\n // border\n borderRadius,\n borderTopStartRadius,\n borderTopEndRadius,\n borderBottomStartRadius,\n borderBottomEndRadius,\n // nestedBorderRadius,\n // nestedBorderRadiusSize,\n // nestedBorderRadiusSpacing,\n // nestedBorderRadiusWidth,\n borderColor,\n borderStartColor,\n borderEndColor,\n borderTopColor,\n borderBottomColor,\n borderWidth,\n borderVerticalWidth,\n borderHorizontalWidth,\n borderStartWidth,\n borderEndWidth,\n borderTopWidth,\n borderBottomWidth,\n // flex\n alignContent,\n alignItems,\n alignSelf,\n flex,\n flexDirection,\n flexGrow,\n flexShrink,\n flexWrap,\n justifyContent,\n // flexBasis,\n // layout\n display,\n overflow,\n // overflowX,\n // overflowY,\n // position,\n // spacing\n spacing,\n spacingHorizontal,\n spacingVertical,\n spacingBottom,\n spacingEnd,\n spacingStart,\n spacingTop,\n offset,\n offsetVertical,\n offsetHorizontal,\n offsetBottom,\n offsetEnd,\n offsetStart,\n offsetTop,\n columnGap,\n rowGap,\n // rest\n };\n\n styles.useVariants(variants);\n\n // styles.foundation must be in deps - it returns a new reference when variants change\n const boxStyles = useMemo(\n () => [\n dangerouslySetBackgroundColor\n ? { backgroundColor: dangerouslySetBackgroundColor }\n : undefined,\n dangerouslySetBorderColor ? { borderColor: dangerouslySetBorderColor } : undefined,\n width ? { width } : undefined,\n height ? { height } : undefined,\n minWidth ? { minWidth } : undefined,\n maxWidth ? { maxWidth } : undefined,\n minHeight ? { minHeight } : undefined,\n maxHeight ? { maxHeight } : undefined,\n styles.foundation,\n style,\n ],\n [\n dangerouslySetBackgroundColor,\n dangerouslySetBorderColor,\n width,\n height,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n styles.foundation,\n style,\n ],\n );\n\n // Merge variant styles with user-provided style prop\n // User styles come last so they can override variant styles if needed\n return <View ref={ref} style={boxStyles} {...props} />;\n});\n\nBox.displayName = 'Box';\n\nexport { Box, type BoxProps };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FA,MAAM,MAAM,KAAK,SAAS,IAAI,EAE5B,iBACA,+BAEA,cACA,sBACA,oBACA,yBACA,uBACA,aACA,2BACA,kBACA,gBACA,gBACA,mBACA,aACA,qBACA,uBACA,kBACA,gBACA,gBACA,mBAEA,cACA,YACA,WACA,MACA,eACA,UACA,YACA,UACA,gBAGA,UAAU,QACV,UAKA,SACA,mBACA,iBACA,eACA,YACA,cACA,YACA,QACA,gBACA,kBACA,cACA,WACA,aACA,WACA,WACA,QAEA,OACA,QACA,UACA,UACA,WACA,WAUA,OACA,KAEA,GAAG,SACQ;CACX,MAAM,WAAW;EAEf;EAEA;EACA;EACA;EACA;EACA;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAED;AAED,QAAO,YAAY,SAAS;AAkC5B,QAAO,oBAAC;EAAU;EAAK,OA/BL,cACV;GACJ,gCACI,EAAE,iBAAiB,+BAA+B,GAClD;GACJ,4BAA4B,EAAE,aAAa,2BAA2B,GAAG;GACzE,QAAQ,EAAE,OAAO,GAAG;GACpB,SAAS,EAAE,QAAQ,GAAG;GACtB,WAAW,EAAE,UAAU,GAAG;GAC1B,WAAW,EAAE,UAAU,GAAG;GAC1B,YAAY,EAAE,WAAW,GAAG;GAC5B,YAAY,EAAE,WAAW,GAAG;GAC5B,OAAO;GACP;GACD,EACD;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,OAAO;GACP;GACD,CACF;EAIwC,GAAI;GAAS;EACtD;AAEF,IAAI,cAAc"}
1
+ {"version":3,"file":"Box.mjs","names":[],"sources":["../../src/components/Box.tsx"],"sourcesContent":["import type { ElevationLevel } from '@yahoo/uds-types';\nimport type { Ref } from 'react';\nimport { memo, useMemo } from 'react';\nimport type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { StyleProps } from '../../generated/styles';\nimport { styles } from '../../generated/styles';\nimport type { SizeProps } from '../types';\n\ninterface BoxProps extends ViewProps, SizeProps {\n ref?: Ref<View>;\n elevation?: ElevationLevel;\n backgroundColor?: StyleProps['backgroundColor'];\n borderRadius?: StyleProps['borderRadius'];\n borderTopStartRadius?: StyleProps['borderTopStartRadius'];\n borderTopEndRadius?: StyleProps['borderTopEndRadius'];\n borderBottomStartRadius?: StyleProps['borderBottomStartRadius'];\n borderBottomEndRadius?: StyleProps['borderBottomEndRadius'];\n borderColor?: StyleProps['borderColor'];\n borderStartColor?: StyleProps['borderStartColor'];\n borderEndColor?: StyleProps['borderEndColor'];\n borderTopColor?: StyleProps['borderTopColor'];\n borderBottomColor?: StyleProps['borderBottomColor'];\n borderWidth?: StyleProps['borderWidth'];\n borderVerticalWidth?: StyleProps['borderVerticalWidth'];\n borderHorizontalWidth?: StyleProps['borderHorizontalWidth'];\n borderStartWidth?: StyleProps['borderStartWidth'];\n borderEndWidth?: StyleProps['borderEndWidth'];\n borderTopWidth?: StyleProps['borderTopWidth'];\n borderBottomWidth?: StyleProps['borderBottomWidth'];\n alignContent?: StyleProps['alignContent'];\n alignItems?: StyleProps['alignItems'];\n alignSelf?: StyleProps['alignSelf'];\n flex?: StyleProps['flex'];\n flexDirection?: StyleProps['flexDirection'];\n flexGrow?: StyleProps['flexGrow'];\n flexShrink?: StyleProps['flexShrink'];\n flexWrap?: StyleProps['flexWrap'];\n justifyContent?: StyleProps['justifyContent'];\n // flexBasis?: StyleProps['flexBasis'];\n display?: StyleProps['display'];\n overflow?: StyleProps['overflow'];\n // overflowX?: StyleProps['overflowX'];\n // overflowY?: StyleProps['overflowY'];\n // position?: StyleProps['position'];\n spacing?: StyleProps['spacing'];\n spacingHorizontal?: StyleProps['spacingHorizontal'];\n spacingVertical?: StyleProps['spacingVertical'];\n spacingBottom?: StyleProps['spacingBottom'];\n spacingEnd?: StyleProps['spacingEnd'];\n spacingStart?: StyleProps['spacingStart'];\n spacingTop?: StyleProps['spacingTop'];\n offset?: StyleProps['offset'];\n offsetVertical?: StyleProps['offsetVertical'];\n offsetHorizontal?: StyleProps['offsetHorizontal'];\n offsetBottom?: StyleProps['offsetBottom'];\n offsetEnd?: StyleProps['offsetEnd'];\n offsetStart?: StyleProps['offsetStart'];\n offsetTop?: StyleProps['offsetTop'];\n columnGap?: StyleProps['columnGap'];\n rowGap?: StyleProps['rowGap'];\n dropShadow?: StyleProps['dropShadow'];\n insetShadow?: StyleProps['insetShadow'];\n dangerouslySetBackgroundColor?: string;\n dangerouslySetBorderColor?: string;\n}\n\n/**\n * **📦 A layout component that can be used to compose other components**\n *\n * @description\n * The most simple component we ship - a View. But with all the power of the UDS design system.\n * By default, `Box` is a flexbox container. When working with vertical or horizontal layouts,\n * consider using VStack or HStack respectively.\n *\n * @category Layout\n * @platform mobile\n *\n * @example\n * ```tsx\n * import { Box } from '@yahoo/uds-mobile';\n *\n * <Box backgroundColor=\"primary\" spacing=\"6\">\n * Any kind of content can go here!\n * </Box>\n * ```\n *\n * @usage\n * - Use as a container to apply padding, shapes, or other styling\n * - Use for creating card components\n * - Use HStack/VStack for directional layouts\n *\n * @see {@link HStack} for horizontal layouts\n * @see {@link VStack} for vertical layouts\n */\nconst Box = memo(function Box({\n // elevation\n elevation,\n // background\n backgroundColor,\n dangerouslySetBackgroundColor,\n // border\n borderRadius,\n borderTopStartRadius,\n borderTopEndRadius,\n borderBottomStartRadius,\n borderBottomEndRadius,\n borderColor,\n dangerouslySetBorderColor,\n borderStartColor,\n borderEndColor,\n borderTopColor,\n borderBottomColor,\n borderWidth,\n borderVerticalWidth,\n borderHorizontalWidth,\n borderStartWidth,\n borderEndWidth,\n borderTopWidth,\n borderBottomWidth,\n // flex\n alignContent,\n alignItems,\n alignSelf,\n flex,\n flexDirection,\n flexGrow,\n flexShrink,\n flexWrap,\n justifyContent,\n // flexBasis,\n // layout\n display = 'flex',\n overflow,\n // overflowX,\n // overflowY,\n // position,\n // spacing\n spacing,\n spacingHorizontal,\n spacingVertical,\n spacingBottom,\n spacingEnd,\n spacingStart,\n spacingTop,\n offset,\n offsetVertical,\n offsetHorizontal,\n offsetBottom,\n offsetEnd,\n offsetStart,\n offsetTop,\n columnGap,\n rowGap,\n // size\n width,\n height,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n // shadow\n dropShadow,\n insetShadow,\n // // nested border radius\n // nestedBorderRadius,\n // nestedBorderRadiusSize = nestedBorderRadius ? borderRadius : undefined,\n // nestedBorderRadiusSpacing = nestedBorderRadius ? spacing : undefined,\n // nestedBorderRadiusWidth = nestedBorderRadius ? borderWidth : undefined,\n // style - extracted to merge with variants\n style,\n ref,\n // rest\n ...props\n}: BoxProps) {\n const elevationAlias = elevation !== undefined ? (`elevation-${elevation}` as const) : undefined;\n\n const variants = {\n // background\n backgroundColor: backgroundColor ?? elevationAlias,\n // border\n borderRadius,\n borderTopStartRadius,\n borderTopEndRadius,\n borderBottomStartRadius,\n borderBottomEndRadius,\n // nestedBorderRadius,\n // nestedBorderRadiusSize,\n // nestedBorderRadiusSpacing,\n // nestedBorderRadiusWidth,\n borderColor: borderColor ?? elevationAlias,\n borderStartColor,\n borderEndColor,\n borderTopColor,\n borderBottomColor,\n borderWidth: borderWidth ?? elevationAlias,\n borderVerticalWidth,\n borderHorizontalWidth,\n borderStartWidth,\n borderEndWidth,\n borderTopWidth,\n borderBottomWidth,\n // flex\n alignContent,\n alignItems,\n alignSelf,\n flex,\n flexDirection,\n flexGrow,\n flexShrink,\n flexWrap,\n justifyContent,\n // flexBasis,\n // layout\n display,\n overflow,\n // overflowX,\n // overflowY,\n // position,\n // spacing\n spacing,\n spacingHorizontal,\n spacingVertical,\n spacingBottom,\n spacingEnd,\n spacingStart,\n spacingTop,\n offset,\n offsetVertical,\n offsetHorizontal,\n offsetBottom,\n offsetEnd,\n offsetStart,\n offsetTop,\n columnGap,\n rowGap,\n // rest\n };\n\n styles.useVariants(variants);\n\n const effectiveDropShadow = dropShadow ?? elevationAlias;\n const shadowStyle =\n effectiveDropShadow || insetShadow\n ? shadowSheet.shadow(effectiveDropShadow, insetShadow)\n : undefined;\n\n // styles.foundation must be in deps - it returns a new reference when variants change\n const boxStyles = useMemo(\n () => [\n dangerouslySetBackgroundColor\n ? { backgroundColor: dangerouslySetBackgroundColor }\n : undefined,\n dangerouslySetBorderColor ? { borderColor: dangerouslySetBorderColor } : undefined,\n width ? { width } : undefined,\n height ? { height } : undefined,\n minWidth ? { minWidth } : undefined,\n maxWidth ? { maxWidth } : undefined,\n minHeight ? { minHeight } : undefined,\n maxHeight ? { maxHeight } : undefined,\n shadowStyle,\n styles.foundation,\n style,\n ],\n [\n dangerouslySetBackgroundColor,\n dangerouslySetBorderColor,\n width,\n height,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n shadowStyle,\n styles.foundation,\n style,\n ],\n );\n\n // Merge variant styles with user-provided style prop\n // User styles come last so they can override variant styles if needed\n return <View ref={ref} style={boxStyles} {...props} />;\n});\n\nBox.displayName = 'Box';\n\n/**\n * Dynamic shadow stylesheet that merges drop and inset shadows into a single\n * boxShadow CSS string. Theme-reactive so shadows update on color mode change.\n */\nconst shadowSheet = StyleSheet.create((theme) => ({\n shadow: (drop?: string, inset?: string) => {\n const parts = [\n drop ? theme.boxShadow.drop[drop as keyof typeof theme.boxShadow.drop] : '',\n inset ? theme.boxShadow.inset[inset as keyof typeof theme.boxShadow.inset] : '',\n ].filter(Boolean);\n return parts.length > 0 ? { boxShadow: parts.join(', ') } : {};\n },\n}));\n\nexport { Box, type BoxProps };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiGA,MAAM,MAAM,KAAK,SAAS,IAAI,EAE5B,WAEA,iBACA,+BAEA,cACA,sBACA,oBACA,yBACA,uBACA,aACA,2BACA,kBACA,gBACA,gBACA,mBACA,aACA,qBACA,uBACA,kBACA,gBACA,gBACA,mBAEA,cACA,YACA,WACA,MACA,eACA,UACA,YACA,UACA,gBAGA,UAAU,QACV,UAKA,SACA,mBACA,iBACA,eACA,YACA,cACA,YACA,QACA,gBACA,kBACA,cACA,WACA,aACA,WACA,WACA,QAEA,OACA,QACA,UACA,UACA,WACA,WAEA,YACA,aAOA,OACA,KAEA,GAAG,SACQ;CACX,MAAM,iBAAiB,cAAc,SAAa,aAAa,cAAwB;CAEvF,MAAM,WAAW;EAEf,iBAAiB,mBAAmB;EAEpC;EACA;EACA;EACA;EACA;EAKA,aAAa,eAAe;EAC5B;EACA;EACA;EACA;EACA,aAAa,eAAe;EAC5B;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAED;AAED,QAAO,YAAY,SAAS;CAE5B,MAAM,sBAAsB,cAAc;CAC1C,MAAM,cACJ,uBAAuB,cACnB,YAAY,OAAO,qBAAqB,YAAY,GACpD;AAoCN,QAAO,oBAAC;EAAU;EAAK,OAjCL,cACV;GACJ,gCACI,EAAE,iBAAiB,+BAA+B,GAClD;GACJ,4BAA4B,EAAE,aAAa,2BAA2B,GAAG;GACzE,QAAQ,EAAE,OAAO,GAAG;GACpB,SAAS,EAAE,QAAQ,GAAG;GACtB,WAAW,EAAE,UAAU,GAAG;GAC1B,WAAW,EAAE,UAAU,GAAG;GAC1B,YAAY,EAAE,WAAW,GAAG;GAC5B,YAAY,EAAE,WAAW,GAAG;GAC5B;GACA,OAAO;GACP;GACD,EACD;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,OAAO;GACP;GACD,CACF;EAIwC,GAAI;GAAS;EACtD;AAEF,IAAI,cAAc;;;;;AAMlB,MAAM,cAAc,WAAW,QAAQ,WAAW,EAChD,SAAS,MAAe,UAAmB;CACzC,MAAM,QAAQ,CACZ,OAAO,MAAM,UAAU,KAAK,QAA6C,IACzE,QAAQ,MAAM,UAAU,MAAM,SAA+C,GAC9E,CAAC,OAAO,QAAQ;AACjB,QAAO,MAAM,SAAS,IAAI,EAAE,WAAW,MAAM,KAAK,KAAK,EAAE,GAAG,EAAE;GAEjE,EAAE"}
@@ -7,9 +7,9 @@ const require_tokens = require('../icons/dist/tokens.cjs');
7
7
  let react = require("react");
8
8
  let react_native = require("react-native");
9
9
  let generated_styles = require("../../generated/styles");
10
+ let react_native_unistyles = require("react-native-unistyles");
10
11
  let react_jsx_runtime = require("react/jsx-runtime");
11
12
  let react_native_svg = require("react-native-svg");
12
- let react_native_unistyles = require("react-native-unistyles");
13
13
 
14
14
  //#region src/components/Icon.tsx
15
15
  const DEFAULT_PROPS = {
@@ -5,9 +5,9 @@ import { ICON_SIZE_MAP } from "../icons/dist/tokens.mjs";
5
5
  import { memo, useMemo } from "react";
6
6
  import { Text, View } from "react-native";
7
7
  import { styles } from "../../generated/styles";
8
+ import { useUnistyles } from "react-native-unistyles";
8
9
  import { jsx } from "react/jsx-runtime";
9
10
  import { SvgXml } from "react-native-svg";
10
- import { useUnistyles } from "react-native-unistyles";
11
11
 
12
12
  //#region src/components/Icon.tsx
13
13
  const DEFAULT_PROPS = {
@@ -6,8 +6,8 @@ const require_components_VStack = require('./VStack.cjs');
6
6
  let react = require("react");
7
7
  let react_native = require("react-native");
8
8
  let generated_styles = require("../../generated/styles");
9
- let react_jsx_runtime = require("react/jsx-runtime");
10
9
  let react_native_unistyles = require("react-native-unistyles");
10
+ let react_jsx_runtime = require("react/jsx-runtime");
11
11
 
12
12
  //#region src/components/Screen.tsx
13
13
  /**
@@ -4,8 +4,8 @@ import { VStack } from "./VStack.mjs";
4
4
  import { memo, useMemo } from "react";
5
5
  import { ScrollView } from "react-native";
6
6
  import { styles } from "../../generated/styles";
7
- import { jsx, jsxs } from "react/jsx-runtime";
8
7
  import { StyleSheet } from "react-native-unistyles";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
9
 
10
10
  //#region src/components/Screen.tsx
11
11
  /**
@@ -7,8 +7,8 @@ const require_components_HStack = require('./HStack.cjs');
7
7
  let react = require("react");
8
8
  let react_native = require("react-native");
9
9
  let generated_styles = require("../../generated/styles");
10
- let react_jsx_runtime = require("react/jsx-runtime");
11
10
  let react_native_unistyles = require("react-native-unistyles");
11
+ let react_jsx_runtime = require("react/jsx-runtime");
12
12
  let react_native_reanimated = require("react-native-reanimated");
13
13
  react_native_reanimated = require_runtime.__toESM(react_native_reanimated);
14
14
  let react_native_unistyles_reanimated = require("react-native-unistyles/reanimated");
@@ -5,8 +5,8 @@ import { HStack } from "./HStack.mjs";
5
5
  import { memo, useCallback, useEffect, useMemo, useState } from "react";
6
6
  import { AccessibilityInfo, Pressable } from "react-native";
7
7
  import { switchStyles } from "../../generated/styles";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
8
  import { StyleSheet } from "react-native-unistyles";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import Animated, { useAnimatedStyle, useDerivedValue, withTiming } from "react-native-reanimated";
11
11
  import { useAnimatedVariantColor } from "react-native-unistyles/reanimated";
12
12