@app-studio/web 0.9.79 → 0.9.80

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.
@@ -22,10 +22,6 @@ export declare const CardShapes: Record<Shape, number | string>;
22
22
  * Get card variants with consistent styling based on theme mode
23
23
  */
24
24
  export declare const getCardVariants: (themeMode: string) => Record<Variant, ViewProps>;
25
- /**
26
- * Default card variants (for backward compatibility)
27
- */
28
- export declare const CardVariants: Record<Variant, ViewProps>;
29
25
  /**
30
26
  * Function to get default styles for Card components
31
27
  * @param theme - Theme object from useTheme hook
@@ -37,12 +37,9 @@ export declare const ColorSchemes: {
37
37
  };
38
38
  states: {
39
39
  hover: {
40
- active: {
41
- opacity: number;
42
- };
43
- inactive: {
44
- backgroundColor: string;
45
- };
40
+ active: string;
41
+ inactive: string;
42
+ activeOpacity: number;
46
43
  };
47
44
  focus: {
48
45
  active: {
@@ -1,4 +1,9 @@
1
1
  import React, { ReactNode } from 'react';
2
+ interface ThemeModeContextType {
3
+ mode: 'light' | 'dark';
4
+ toggleThemeMode: () => void;
5
+ }
6
+ export declare const useThemeActions: () => ThemeModeContextType;
2
7
  interface WrapperProps {
3
8
  children: ReactNode;
4
9
  }
@@ -3319,11 +3319,23 @@ var ButtonView = _ref5 => {
3319
3319
  getColorHex
3320
3320
  } = appStudio.useTheme();
3321
3321
  /* MAIN COLOR – determines the entire palette */
3322
- var mainColorKey = (_ref6 = backgroundColor != null ? backgroundColor : color) != null ? _ref6 : 'theme.primary';
3323
- var mainTone = getColorHex(isDisabled ? 'theme.disabled' : mainColorKey);
3322
+ // Priority: explicit backgroundColor/color prop -> theme.button.background -> theme.primary
3323
+ var mainColorKey = (_ref6 = backgroundColor != null ? backgroundColor : color) != null ? _ref6 : 'theme.button.background';
3324
+ // Decide which theme token to resolve based on state
3325
+ var stateColorKey = isDisabled ? 'theme.disabled' : isLoading ? 'theme.loading' : mainColorKey;
3326
+ // Resolve to actual hex color.
3327
+ // If 'theme.button.background' isn't defined, it falls back to 'theme.primary'
3328
+ var mainTone = getColorHex(stateColorKey);
3329
+ if (mainTone === 'theme.button.background' || mainTone === 'theme.loading') {
3330
+ mainTone = getColorHex(isLoading ? 'color.dark.500' : 'theme.primary');
3331
+ }
3324
3332
  /* text color - explicitly provided or default to white */
3325
- var resolvedTextColorKey = textColor != null ? textColor : 'color.white';
3333
+ // Priority: explicit textColor prop -> theme.button.text -> color.white
3334
+ var resolvedTextColorKey = textColor != null ? textColor : 'theme.button.text';
3326
3335
  var resolvedTextColor = getColorHex(resolvedTextColorKey);
3336
+ if (resolvedTextColor === 'theme.button.text') {
3337
+ resolvedTextColor = getColorHex('color.white');
3338
+ }
3327
3339
  /* variant palette */
3328
3340
  var palette = React.useMemo(() => getButtonVariants(mainTone, resolvedTextColor, reversed), [mainTone, resolvedTextColor, reversed]);
3329
3341
  var base = palette[variant];
@@ -3396,50 +3408,57 @@ var Button = ButtonComponent;
3396
3408
  * - Rounded corners: Consistent border radius
3397
3409
  * - Transitions: Subtle animations
3398
3410
  */
3411
+ /**
3412
+ * Card sizes following the 4px grid system
3413
+ */
3414
+ var CardSizes = {
3415
+ sm: {
3416
+ padding: '12px'
3417
+ },
3418
+ md: {
3419
+ padding: '16px'
3420
+ },
3421
+ lg: {
3422
+ padding: '24px'
3423
+ }
3424
+ };
3399
3425
  /**
3400
3426
  * Card shapes with consistent border radius
3401
3427
  */
3402
3428
  var CardShapes = {
3403
3429
  sharp: 0,
3404
3430
  rounded: '8px',
3405
- pillShaped: '16px'
3431
+ pillShaped: '24px'
3406
3432
  };
3407
3433
  /**
3408
3434
  * Get card variants with consistent styling based on theme mode
3409
3435
  */
3410
3436
  var getCardVariants = themeMode => {
3437
+ var isDark = themeMode === 'dark';
3411
3438
  return {
3412
3439
  default: {
3413
- backgroundColor: 'color.white',
3440
+ backgroundColor: isDark ? 'color.gray.900' : 'color.white',
3414
3441
  border: 'none',
3415
3442
  transition: 'background-color 0.2s ease, box-shadow 0.2s ease'
3416
3443
  },
3417
3444
  outlined: {
3418
- backgroundColor: 'color.white',
3445
+ backgroundColor: isDark ? 'color.gray.900' : 'color.white',
3419
3446
  borderWidth: '1px',
3420
3447
  borderStyle: 'solid',
3421
- borderColor: 'color.gray.200',
3448
+ borderColor: isDark ? 'color.gray.700' : 'color.gray.200',
3422
3449
  transition: 'border-color 0.2s ease, box-shadow 0.2s ease',
3423
3450
  _hover: {
3424
- borderColor: 'color.gray.300',
3451
+ borderColor: isDark ? 'color.gray.600' : 'color.gray.300',
3425
3452
  boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.05)'
3426
- },
3427
- _focusVisible: {
3428
- outline: 'none',
3429
- boxShadow: '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1)'
3430
3453
  }
3431
3454
  },
3432
3455
  elevated: {
3433
- backgroundColor: 'color.white',
3434
- boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.08), 0px 1px 2px rgba(0, 0, 0, 0.06)',
3456
+ backgroundColor: isDark ? 'color.gray.900' : 'color.white',
3457
+ boxShadow: isDark ? '0px 4px 12px rgba(0, 0, 0, 0.3)' : '0px 1px 3px rgba(0, 0, 0, 0.08), 0px 1px 2px rgba(0, 0, 0, 0.06)',
3435
3458
  border: 'none',
3436
3459
  transition: 'box-shadow 0.2s ease',
3437
3460
  _hover: {
3438
- boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.08), 0px 2px 4px rgba(0, 0, 0, 0.06)'
3439
- },
3440
- _focusVisible: {
3441
- outline: 'none',
3442
- boxShadow: '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1), 0px 4px 6px rgba(0, 0, 0, 0.08)'
3461
+ boxShadow: isDark ? '0px 8px 16px rgba(0, 0, 0, 0.4)' : '0px 4px 6px rgba(0, 0, 0, 0.08), 0px 2px 4px rgba(0, 0, 0, 0.06)'
3443
3462
  }
3444
3463
  }
3445
3464
  };
@@ -3449,50 +3468,31 @@ var getCardVariants = themeMode => {
3449
3468
  * @param theme - Theme object from useTheme hook
3450
3469
  */
3451
3470
  var getDefaultCardStyles = theme => {
3471
+ var isDark = theme.themeMode === 'dark';
3452
3472
  return {
3453
3473
  container: {
3454
- backgroundColor: 'color.white',
3455
- color: 'color.black',
3474
+ backgroundColor: isDark ? 'color.gray.900' : 'color.white',
3475
+ color: isDark ? 'color.white' : 'color.black',
3456
3476
  borderRadius: '8px',
3457
3477
  overflow: 'hidden',
3458
- transition: 'all 0.2s ease',
3459
- media: {
3460
- mobile: {
3461
- borderRadius: '4px'
3462
- }
3463
- }
3478
+ transition: 'all 0.2s ease'
3464
3479
  },
3465
3480
  header: {
3466
3481
  padding: '16px',
3467
3482
  borderBottomWidth: '1px',
3468
3483
  borderBottomStyle: 'solid',
3469
- borderBottomColor: 'color.gray.200',
3470
- color: 'color.black',
3471
- media: {
3472
- mobile: {
3473
- padding: '12px'
3474
- }
3475
- }
3484
+ borderBottomColor: isDark ? 'color.gray.800' : 'color.gray.100',
3485
+ color: 'theme.primary'
3476
3486
  },
3477
3487
  content: {
3478
3488
  padding: '16px',
3479
- color: 'color.black',
3480
- media: {
3481
- mobile: {
3482
- padding: '12px'
3483
- }
3484
- }
3489
+ color: isDark ? 'color.gray.300' : 'color.gray.600'
3485
3490
  },
3486
3491
  footer: {
3487
3492
  padding: '16px',
3488
3493
  borderTopWidth: '1px',
3489
3494
  borderTopStyle: 'solid',
3490
- borderTopColor: 'color.gray.200',
3491
- media: {
3492
- mobile: {
3493
- padding: '12px'
3494
- }
3495
- }
3495
+ borderTopColor: isDark ? 'color.gray.800' : 'color.gray.100'
3496
3496
  }
3497
3497
  };
3498
3498
  };
@@ -3517,12 +3517,14 @@ var CardHeader = _ref => {
3517
3517
  var {
3518
3518
  styles: contextStyles
3519
3519
  } = useCardContext();
3520
- var defaultStyles = getDefaultCardStyles().header;
3520
+ var defaultStyles = getDefaultCardStyles(theme).header;
3521
3521
  // Merge styles: Default < Context Override < Direct Props/Style
3522
3522
  var mergedProps = Object.assign({}, defaultStyles, contextStyles == null ? void 0 : contextStyles.header, props, {
3523
3523
  style: Object.assign({}, defaultStyles == null ? void 0 : defaultStyles.style, contextStyles == null || (_contextStyles$header = contextStyles.header) == null ? void 0 : _contextStyles$header.style, style)
3524
3524
  });
3525
- return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, mergedProps), children);
3525
+ return /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
3526
+ gap: 8
3527
+ }, mergedProps), children);
3526
3528
  };
3527
3529
  var CardContent = _ref2 => {
3528
3530
  var _contextStyles$conten;
@@ -3535,12 +3537,14 @@ var CardContent = _ref2 => {
3535
3537
  var {
3536
3538
  styles: contextStyles
3537
3539
  } = useCardContext();
3538
- var defaultStyles = getDefaultCardStyles().content;
3540
+ var defaultStyles = getDefaultCardStyles(theme).content;
3539
3541
  // Merge styles: Default < Context Override < Direct Props/Style
3540
3542
  var mergedProps = Object.assign({}, defaultStyles, contextStyles == null ? void 0 : contextStyles.content, props, {
3541
3543
  style: Object.assign({}, defaultStyles == null ? void 0 : defaultStyles.style, contextStyles == null || (_contextStyles$conten = contextStyles.content) == null ? void 0 : _contextStyles$conten.style, style)
3542
3544
  });
3543
- return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, mergedProps), children);
3545
+ return /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
3546
+ gap: 12
3547
+ }, mergedProps), children);
3544
3548
  };
3545
3549
  var CardFooter = _ref3 => {
3546
3550
  var _contextStyles$footer;
@@ -3553,15 +3557,17 @@ var CardFooter = _ref3 => {
3553
3557
  var {
3554
3558
  styles: contextStyles
3555
3559
  } = useCardContext();
3556
- var defaultStyles = getDefaultCardStyles().footer;
3560
+ var defaultStyles = getDefaultCardStyles(theme).footer;
3557
3561
  // Merge styles: Default < Context Override < Direct Props/Style
3558
3562
  var mergedProps = Object.assign({}, defaultStyles, contextStyles == null ? void 0 : contextStyles.footer, props, {
3559
3563
  style: Object.assign({}, defaultStyles == null ? void 0 : defaultStyles.style, contextStyles == null || (_contextStyles$footer = contextStyles.footer) == null ? void 0 : _contextStyles$footer.style, style)
3560
3564
  });
3561
- return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, mergedProps), children);
3565
+ return /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
3566
+ gap: 8
3567
+ }, mergedProps), children);
3562
3568
  };
3563
3569
  var CardView = _ref4 => {
3564
- var _contextValue$styles$;
3570
+ var _CardSizes$size, _contextValue$styles$;
3565
3571
  var {
3566
3572
  variant = 'default',
3567
3573
  size = 'md',
@@ -3576,20 +3582,32 @@ var CardView = _ref4 => {
3576
3582
  } = _ref4,
3577
3583
  props = _objectWithoutPropertiesLoose(_ref4, _excluded4$3);
3578
3584
  var theme = appStudio.useTheme();
3579
- var defaultStyles = getDefaultCardStyles();
3585
+ var defaultStyles = getDefaultCardStyles(theme);
3586
+ // Get size padding
3587
+ var sizePadding = ((_CardSizes$size = CardSizes[size]) == null ? void 0 : _CardSizes$size.padding) || '16px';
3580
3588
  // Prepare context value, merging default styles with user's `views` overrides
3581
3589
  var contextValue = React.useMemo(() => ({
3582
3590
  styles: {
3583
3591
  container: Object.assign({}, defaultStyles.container, views == null ? void 0 : views.container),
3584
- header: Object.assign({}, defaultStyles.header, views == null ? void 0 : views.header),
3585
- content: Object.assign({}, defaultStyles.content, views == null ? void 0 : views.content),
3586
- footer: Object.assign({}, defaultStyles.footer, views == null ? void 0 : views.footer)
3587
- }
3588
- }), [defaultStyles, views]);
3592
+ header: Object.assign({}, defaultStyles.header, {
3593
+ padding: sizePadding
3594
+ }, views == null ? void 0 : views.header),
3595
+ content: Object.assign({}, defaultStyles.content, {
3596
+ padding: sizePadding
3597
+ }, views == null ? void 0 : views.content),
3598
+ footer: Object.assign({}, defaultStyles.footer, {
3599
+ padding: sizePadding
3600
+ }, views == null ? void 0 : views.footer)
3601
+ }
3602
+ }), [defaultStyles, views, sizePadding]);
3589
3603
  // Determine if we have explicit Card.Header, Card.Content, Card.Footer components
3590
- // or if we need to wrap children in a default layout
3591
3604
  var hasExplicitStructure = React__default.Children.toArray(children).some(child => /*#__PURE__*/React__default.isValidElement(child) && (child.type === CardHeader || child.type === CardContent || child.type === CardFooter));
3592
- var variantStyles = getCardVariants()[variant];
3605
+ // Get the appropriate variant styles based on theme mode
3606
+ var {
3607
+ themeMode
3608
+ } = theme;
3609
+ var currentThemeMode = elementMode || themeMode;
3610
+ var variantStyles = getCardVariants(currentThemeMode)[variant];
3593
3611
  // Merge styles for the root element
3594
3612
  var mergedRootProps = Object.assign({
3595
3613
  width: isFullWidth ? '100%' : 'auto',
@@ -3600,7 +3618,9 @@ var CardView = _ref4 => {
3600
3618
  });
3601
3619
  return /*#__PURE__*/React__default.createElement(CardContext.Provider, {
3602
3620
  value: contextValue
3603
- }, /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, mergedRootProps), hasExplicitStructure ? children : (/*#__PURE__*/React__default.createElement(appStudio.Vertical, null, header && /*#__PURE__*/React__default.createElement(CardHeader, null, header), /*#__PURE__*/React__default.createElement(CardContent, null, children), footer && /*#__PURE__*/React__default.createElement(CardFooter, null, footer)))));
3621
+ }, /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, mergedRootProps), hasExplicitStructure ? children : (/*#__PURE__*/React__default.createElement(appStudio.Vertical, {
3622
+ width: "100%"
3623
+ }, header && /*#__PURE__*/React__default.createElement(CardHeader, null, header), /*#__PURE__*/React__default.createElement(CardContent, null, children), footer && /*#__PURE__*/React__default.createElement(CardFooter, null, footer)))));
3604
3624
  };
3605
3625
 
3606
3626
  /**
@@ -7336,12 +7356,9 @@ var ColorSchemes = {
7336
7356
  // State-specific colors
7337
7357
  states: {
7338
7358
  hover: {
7339
- active: {
7340
- opacity: 0.9
7341
- },
7342
- inactive: {
7343
- backgroundColor: 'color.gray.400'
7344
- }
7359
+ active: 'theme.primary',
7360
+ inactive: 'color.gray.400',
7361
+ activeOpacity: 0.9
7345
7362
  },
7346
7363
  focus: {
7347
7364
  active: {
@@ -7355,6 +7372,17 @@ var ColorSchemes = {
7355
7372
  }
7356
7373
  }
7357
7374
  };
7375
+ /**
7376
+ * Transition styles for the Switch component
7377
+ */
7378
+ var TransitionStyles = {
7379
+ slider: {
7380
+ transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
7381
+ },
7382
+ knob: {
7383
+ transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
7384
+ }
7385
+ };
7358
7386
 
7359
7387
  var _excluded$t = ["id", "name", "label", "inActiveChild", "isChecked", "activeChild", "labelPosition", "shadow", "size", "value", "isHovered", "isDisabled", "isReadOnly", "on", "setOn", "onChange", "setValue", "setIsHovered", "helperText", "views"];
7360
7388
  var SwitchContent = props => /*#__PURE__*/React__default.createElement(appStudio.Input, Object.assign({
@@ -7393,7 +7421,8 @@ var SwitchView = _ref => {
7393
7421
  if (onChange) onChange(newValue);
7394
7422
  }
7395
7423
  };
7396
- var handleHover = () => setIsHovered(!isHovered);
7424
+ var handleMouseEnter = () => setIsHovered(true);
7425
+ var handleMouseLeave = () => setIsHovered(false);
7397
7426
  /**
7398
7427
  * Styles for the switch component
7399
7428
  */
@@ -7415,8 +7444,8 @@ var SwitchView = _ref => {
7415
7444
  };
7416
7445
  return /*#__PURE__*/React__default.createElement(Label, Object.assign({
7417
7446
  htmlFor: id,
7418
- onMouseEnter: handleHover,
7419
- onMouseLeave: handleHover
7447
+ onMouseEnter: handleMouseEnter,
7448
+ onMouseLeave: handleMouseLeave
7420
7449
  }, switchStyle.container, props), /*#__PURE__*/React__default.createElement(SwitchContent, Object.assign({
7421
7450
  id: id,
7422
7451
  name: name,
@@ -7444,12 +7473,10 @@ var SwitchView = _ref => {
7444
7473
  borderRadius: "9999px" // Full rounded for pill shape
7445
7474
  ,
7446
7475
  backgroundColor: isDisabled ? ColorSchemes.default.disabled : value ? isHovered ? ColorSchemes.states.hover.active : ColorSchemes.default.active : isHovered ? ColorSchemes.states.hover.inactive : ColorSchemes.default.inactive,
7447
- overflow: "hidden",
7476
+ opacity: !isDisabled && value && isHovered ? ColorSchemes.states.hover.activeOpacity : 1,
7448
7477
  // State properties
7449
- cursor: "pointer",
7450
- // Animation
7451
- transition: "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)"
7452
- }, shadow, SliderPadding[size], SliderSizes[size], views['slider']), activeChild && value && (/*#__PURE__*/React__default.createElement(appStudio.View, {
7478
+ cursor: "pointer"
7479
+ }, TransitionStyles.slider, shadow, SliderPadding[size], SliderSizes[size], views['slider']), activeChild && value && (/*#__PURE__*/React__default.createElement(appStudio.View, {
7453
7480
  marginLeft: 8,
7454
7481
  marginRight: 4,
7455
7482
  transition: "all 0.3s ease",
@@ -7460,8 +7487,9 @@ var SwitchView = _ref => {
7460
7487
  }, activeChild)), /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
7461
7488
  borderRadius: "50%",
7462
7489
  backgroundColor: ColorSchemes.default.knob,
7463
- boxShadow: "0 1px 2px rgba(0, 0, 0, 0.1)",
7464
- transition: "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
7490
+ boxShadow: isHovered ? '0 2px 4px rgba(0, 0, 0, 0.2)' : '0 1px 2px rgba(0, 0, 0, 0.1)',
7491
+ transform: isHovered ? 'scale(1.05)' : 'scale(1)'
7492
+ }, TransitionStyles.knob, {
7465
7493
  zIndex: 1
7466
7494
  }, KnobSizes[size], views['circle'])), inActiveChild && !value && (/*#__PURE__*/React__default.createElement(appStudio.View, {
7467
7495
  marginRight: 8,
@@ -11273,29 +11301,32 @@ var TagChip = _ref => {
11273
11301
  alignItems: "center",
11274
11302
  gap: 6,
11275
11303
  padding: chipSize.padding,
11276
- backgroundColor: "white",
11304
+ backgroundColor: "color.gray.100",
11277
11305
  borderRadius: "16px",
11278
- border: "1px solid",
11279
- borderColor: "color.black.100",
11306
+ borderWidth: "1px",
11307
+ borderStyle: "solid",
11308
+ borderColor: "color.gray.300",
11280
11309
  boxShadow: "0 1px 2px rgba(0,0,0,0.05)",
11281
11310
  transition: "all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",
11282
11311
  opacity: isDisabled ? 0.6 : 1,
11283
11312
  _hover: !isDisabled && !isReadOnly ? {
11284
- borderColor: 'color.gray.300',
11313
+ backgroundColor: 'color.gray.200',
11314
+ borderColor: 'color.gray.400',
11285
11315
  boxShadow: '0 4px 6px rgba(0,0,0,0.05)',
11286
11316
  transform: 'translateY(-1px)'
11287
11317
  } : {}
11288
11318
  }, views == null ? void 0 : views.tag), /*#__PURE__*/React__default.createElement(appStudio.Text, Object.assign({
11289
11319
  fontSize: chipSize.fontSize,
11290
- color: isDisabled ? 'color.gray.400' : 'color.gray.700',
11291
- fontWeight: "500",
11320
+ color: isDisabled ? 'color.gray.400' : 'theme.primary',
11321
+ fontWeight: "bold",
11292
11322
  whiteSpace: "nowrap"
11293
11323
  }, views == null ? void 0 : views.tagText), tag), isRemovable && !isDisabled && !isReadOnly && (/*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
11294
11324
  cursor: "pointer",
11295
11325
  padding: "2px",
11296
11326
  borderRadius: "50%",
11297
11327
  transition: "all 0.2s ease",
11298
- backgroundColor: isRemoveHovered ? 'color.red.50' : 'transparent',
11328
+ backgroundColor: isRemoveHovered ? 'color.red.100' : 'transparent',
11329
+ opacity: isRemoveHovered ? 1 : 0.7,
11299
11330
  onMouseEnter: () => setIsRemoveHovered(true),
11300
11331
  onMouseLeave: () => setIsRemoveHovered(false),
11301
11332
  onClick: e => {
@@ -11362,7 +11393,7 @@ var TagInputView = _ref2 => {
11362
11393
  outline: 'none',
11363
11394
  backgroundColor: 'transparent',
11364
11395
  fontSize: appStudio.Typography.fontSizes[size],
11365
- color: isDisabled ? 'color.gray.400' : 'color.gray.900',
11396
+ color: isDisabled ? 'color.gray.400' : 'color.gray.800',
11366
11397
  flex: 1,
11367
11398
  minWidth: '120px'
11368
11399
  }, views == null ? void 0 : views.input);