@situaction/traquiste-mobile 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +3 -2
  2. package/build/components/Button/Button.js +1 -1
  3. package/build/components/Button/Button.js.map +1 -1
  4. package/build/components/ButtonMenu/ButtonMenu.js +2 -2
  5. package/build/components/ButtonMenu/ButtonMenu.js.map +1 -1
  6. package/build/components/Calendar/Calendar.js +1 -1
  7. package/build/components/Calendar/Calendar.js.map +1 -1
  8. package/build/components/Calendar/Calendar.styles.d.ts +11 -8
  9. package/build/components/Calendar/Calendar.styles.d.ts.map +1 -1
  10. package/build/components/Calendar/Calendar.styles.js +13 -10
  11. package/build/components/Calendar/Calendar.styles.js.map +1 -1
  12. package/build/components/Calendar/CalendarLegend.js +1 -1
  13. package/build/components/Calendar/CalendarLegend.js.map +1 -1
  14. package/build/components/Checkbox/Checkbox.d.ts +2 -2
  15. package/build/components/Checkbox/Checkbox.d.ts.map +1 -1
  16. package/build/components/Checkbox/Checkbox.js +4 -5
  17. package/build/components/Checkbox/Checkbox.js.map +1 -1
  18. package/build/components/FilterChip/FilterChip.d.ts.map +1 -1
  19. package/build/components/FilterChip/FilterChip.js +45 -16
  20. package/build/components/FilterChip/FilterChip.js.map +1 -1
  21. package/build/components/Input/Input.d.ts.map +1 -1
  22. package/build/components/Input/Input.js +5 -6
  23. package/build/components/Input/Input.js.map +1 -1
  24. package/build/components/Input/Input.styles.d.ts +6 -1
  25. package/build/components/Input/Input.styles.d.ts.map +1 -1
  26. package/build/components/Input/Input.styles.js +6 -1
  27. package/build/components/Input/Input.styles.js.map +1 -1
  28. package/build/components/ListGroup/ListGroup.d.ts +24 -0
  29. package/build/components/ListGroup/ListGroup.d.ts.map +1 -0
  30. package/build/components/ListGroup/ListGroup.js +44 -0
  31. package/build/components/ListGroup/ListGroup.js.map +1 -0
  32. package/build/components/ListGroup/index.d.ts +3 -0
  33. package/build/components/ListGroup/index.d.ts.map +1 -0
  34. package/build/components/ListGroup/index.js +2 -0
  35. package/build/components/ListGroup/index.js.map +1 -0
  36. package/build/components/ListItem/ListItem.d.ts +3 -1
  37. package/build/components/ListItem/ListItem.d.ts.map +1 -1
  38. package/build/components/ListItem/ListItem.js +6 -3
  39. package/build/components/ListItem/ListItem.js.map +1 -1
  40. package/build/components/Switch/Switch.d.ts.map +1 -1
  41. package/build/components/Switch/Switch.js +9 -3
  42. package/build/components/Switch/Switch.js.map +1 -1
  43. package/build/components/Tab/Tab.d.ts +4 -2
  44. package/build/components/Tab/Tab.d.ts.map +1 -1
  45. package/build/components/Tab/Tab.js +14 -10
  46. package/build/components/Tab/Tab.js.map +1 -1
  47. package/build/components/Tag/Tag.js +2 -2
  48. package/build/components/Tag/Tag.js.map +1 -1
  49. package/build/components/Tag/Tag.styles.d.ts +4 -2
  50. package/build/components/Tag/Tag.styles.d.ts.map +1 -1
  51. package/build/components/Tag/Tag.styles.js +6 -6
  52. package/build/components/Tag/Tag.styles.js.map +1 -1
  53. package/build/components/navigation/GeneralNav/GeneralNav.d.ts +7 -5
  54. package/build/components/navigation/GeneralNav/GeneralNav.d.ts.map +1 -1
  55. package/build/components/navigation/GeneralNav/GeneralNav.js +5 -7
  56. package/build/components/navigation/GeneralNav/GeneralNav.js.map +1 -1
  57. package/build/index.d.ts +2 -0
  58. package/build/index.d.ts.map +1 -1
  59. package/build/index.js +1 -0
  60. package/build/index.js.map +1 -1
  61. package/build/theme/tokens/dark.js +5 -5
  62. package/build/theme/tokens/dark.js.map +1 -1
  63. package/build/theme/tokens/light.js +4 -4
  64. package/build/theme/tokens/light.js.map +1 -1
  65. package/package.json +1 -1
package/README.md CHANGED
@@ -69,7 +69,8 @@ export default function App() {
69
69
  | `Card` / `CardEquip` / `CardProfile` | Equipment and profile cards |
70
70
  | `FilterChip` / `FilterNav` | Filter chips and filter bar |
71
71
  | `Input` | Text field with label, icons, helper text |
72
- | `ListItem` | Flexible list row with leading/trailing slots |
72
+ | `ListItem` | Flexible list row with leading/trailing/primaryLabel slots |
73
+ | `ListGroup` | Selectable list group with section title and check icon |
73
74
  | `MapPin` / `Cluster` | Map markers for react-native-maps |
74
75
  | `Tag` / `AssociationTag` | Labels and MAC address badges |
75
76
  | `Calendar` | Date picker with range selection |
@@ -79,7 +80,7 @@ export default function App() {
79
80
  | `Checkbox` / `RadioButton` / `Switch` | Form controls |
80
81
  | `Spinner` / `ProgressStep` / `Stepper` | Progress indicators |
81
82
  | `GeneralNav` / `PageNav` | Navigation headers |
82
- | `Tab` / `TabBar` | Tab navigation |
83
+ | `Tab` / `TabBar` | Tab navigation — line & button variants, showContainerBorder |
83
84
  | `ColorPicker` / `ColorSwatch` | Color selection |
84
85
 
85
86
  ## Stack
@@ -41,7 +41,7 @@ export function Button({ variant = 'primary', size = 'M', content = 'icon-both',
41
41
  fontSize: sizeTokens.fontSize,
42
42
  lineHeight: sizeTokens.lineHeight,
43
43
  fontFamily,
44
- fontWeight: '500',
44
+ fontWeight: (variant === 'ghost' ? '600' : '500'),
45
45
  };
46
46
  // Clone icon elements to inject size and color from active theme state
47
47
  const cloneIcon = (icon) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Button component for Traq[UI]ste Mobile.\n * Supports four variants, four sizes and three content layouts.\n */\nimport React, { useState } from 'react';\nimport { Pressable, Text } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport type ButtonVariant = 'primary' | 'tertiary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'S' | 'M' | 'L' | 'XL';\nexport type ButtonContent = 'icon-only' | 'icon-only-rounded' | 'icon-both';\n\nexport interface ButtonProps {\n /** Button visual variant */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Content layout */\n content?: ButtonContent;\n /** Label text — required when content is 'icon-both' */\n label?: string;\n /** Left icon component (Phosphor icon) */\n iconLeft?: React.ReactElement;\n /** Right icon component (Phosphor icon) */\n iconRight?: React.ReactElement;\n /** Disabled state */\n disabled?: boolean;\n /** Press handler */\n onPress?: () => void;\n /** Additional container styles */\n style?: StyleProp<ViewStyle>;\n /** Accessibility label for screen readers — defaults to label when omitted */\n accessibilityLabel?: string;\n /** Test identifier */\n testID?: string;\n}\n\n// --- Size tokens (static, theme-independent) ---\n\nconst SIZE_TOKENS = {\n S: { height: 36, paddingVertical: 10, paddingHorizontal: 10, gap: 8, borderRadius: 8, iconSize: 16, fontSize: 12, lineHeight: 16 },\n M: { height: 40, paddingVertical: 10, paddingHorizontal: 16, gap: 4, borderRadius: 8, iconSize: 18, fontSize: 14, lineHeight: 20 },\n L: { height: 48, paddingVertical: 12, paddingHorizontal: 12, gap: 10, borderRadius: 8, iconSize: 20, fontSize: 16, lineHeight: 24 },\n XL: { height: 60, paddingVertical: 16, paddingHorizontal: 32, gap: 12, borderRadius: 8, iconSize: 24, fontSize: 18, lineHeight: 26 },\n} as const;\n\n// --- Component ---\n\nexport function Button({\n variant = 'primary',\n size = 'M',\n content = 'icon-both',\n label,\n iconLeft,\n iconRight,\n disabled = false,\n onPress,\n style,\n accessibilityLabel,\n testID,\n}: ButtonProps) {\n const [pressed, setPressed] = useState(false);\n const { colors, fontFamily } = useTheme();\n\n const sizeTokens = SIZE_TOKENS[size];\n const state = disabled ? 'disabled' : pressed ? 'pressed' : 'default';\n const colorTokens = colors.button[variant][state];\n\n const isIconOnly = content === 'icon-only' || content === 'icon-only-rounded';\n const borderRadius = content === 'icon-only-rounded' ? 9999 : sizeTokens.borderRadius;\n const hasBorder = colorTokens.border !== 'transparent';\n\n const containerStyle: ViewStyle = {\n height: sizeTokens.height,\n paddingVertical: isIconOnly ? undefined : sizeTokens.paddingVertical,\n paddingHorizontal: isIconOnly ? undefined : sizeTokens.paddingHorizontal,\n width: isIconOnly ? sizeTokens.height : undefined,\n borderRadius,\n gap: sizeTokens.gap,\n backgroundColor: colorTokens.background,\n borderWidth: hasBorder ? 1 : undefined,\n borderColor: hasBorder ? colorTokens.border : undefined,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n };\n\n const textStyle = {\n color: colorTokens.text,\n fontSize: sizeTokens.fontSize,\n lineHeight: sizeTokens.lineHeight,\n fontFamily,\n fontWeight: '500' as const,\n };\n\n // Clone icon elements to inject size and color from active theme state\n const cloneIcon = (icon: React.ReactElement | undefined) => {\n if (!icon) return null;\n return React.cloneElement(icon, {\n size: sizeTokens.iconSize,\n color: colorTokens.icon,\n ...(icon.props as Record<string, unknown>),\n } as object);\n };\n\n const sharedA11y = {\n accessibilityRole: 'button' as const,\n accessibilityLabel: accessibilityLabel ?? label,\n accessibilityState: { disabled },\n testID,\n };\n\n if (isIconOnly) {\n return (\n <Pressable\n pointerEvents={disabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[containerStyle, style]}\n {...sharedA11y}\n >\n {cloneIcon(iconLeft)}\n </Pressable>\n );\n }\n\n return (\n <Pressable\n pointerEvents={disabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[containerStyle, style]}\n {...sharedA11y}\n >\n {cloneIcon(iconLeft)}\n {label != null && <Text style={textStyle}>{label}</Text>}\n {cloneIcon(iconRight)}\n </Pressable>\n );\n}"]}
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Button component for Traq[UI]ste Mobile.\n * Supports four variants, four sizes and three content layouts.\n */\nimport React, { useState } from 'react';\nimport { Pressable, Text } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport type ButtonVariant = 'primary' | 'tertiary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'S' | 'M' | 'L' | 'XL';\nexport type ButtonContent = 'icon-only' | 'icon-only-rounded' | 'icon-both';\n\nexport interface ButtonProps {\n /** Button visual variant */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Content layout */\n content?: ButtonContent;\n /** Label text — required when content is 'icon-both' */\n label?: string;\n /** Left icon component (Phosphor icon) */\n iconLeft?: React.ReactElement;\n /** Right icon component (Phosphor icon) */\n iconRight?: React.ReactElement;\n /** Disabled state */\n disabled?: boolean;\n /** Press handler */\n onPress?: () => void;\n /** Additional container styles */\n style?: StyleProp<ViewStyle>;\n /** Accessibility label for screen readers — defaults to label when omitted */\n accessibilityLabel?: string;\n /** Test identifier */\n testID?: string;\n}\n\n// --- Size tokens (static, theme-independent) ---\n\nconst SIZE_TOKENS = {\n S: { height: 36, paddingVertical: 10, paddingHorizontal: 10, gap: 8, borderRadius: 8, iconSize: 16, fontSize: 12, lineHeight: 16 },\n M: { height: 40, paddingVertical: 10, paddingHorizontal: 16, gap: 4, borderRadius: 8, iconSize: 18, fontSize: 14, lineHeight: 20 },\n L: { height: 48, paddingVertical: 12, paddingHorizontal: 12, gap: 10, borderRadius: 8, iconSize: 20, fontSize: 16, lineHeight: 24 },\n XL: { height: 60, paddingVertical: 16, paddingHorizontal: 32, gap: 12, borderRadius: 8, iconSize: 24, fontSize: 18, lineHeight: 26 },\n} as const;\n\n// --- Component ---\n\nexport function Button({\n variant = 'primary',\n size = 'M',\n content = 'icon-both',\n label,\n iconLeft,\n iconRight,\n disabled = false,\n onPress,\n style,\n accessibilityLabel,\n testID,\n}: ButtonProps) {\n const [pressed, setPressed] = useState(false);\n const { colors, fontFamily } = useTheme();\n\n const sizeTokens = SIZE_TOKENS[size];\n const state = disabled ? 'disabled' : pressed ? 'pressed' : 'default';\n const colorTokens = colors.button[variant][state];\n\n const isIconOnly = content === 'icon-only' || content === 'icon-only-rounded';\n const borderRadius = content === 'icon-only-rounded' ? 9999 : sizeTokens.borderRadius;\n const hasBorder = colorTokens.border !== 'transparent';\n\n const containerStyle: ViewStyle = {\n height: sizeTokens.height,\n paddingVertical: isIconOnly ? undefined : sizeTokens.paddingVertical,\n paddingHorizontal: isIconOnly ? undefined : sizeTokens.paddingHorizontal,\n width: isIconOnly ? sizeTokens.height : undefined,\n borderRadius,\n gap: sizeTokens.gap,\n backgroundColor: colorTokens.background,\n borderWidth: hasBorder ? 1 : undefined,\n borderColor: hasBorder ? colorTokens.border : undefined,\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n };\n\n const textStyle = {\n color: colorTokens.text,\n fontSize: sizeTokens.fontSize,\n lineHeight: sizeTokens.lineHeight,\n fontFamily,\n fontWeight: (variant === 'ghost' ? '600' : '500') as '600' | '500',\n };\n\n // Clone icon elements to inject size and color from active theme state\n const cloneIcon = (icon: React.ReactElement | undefined) => {\n if (!icon) return null;\n return React.cloneElement(icon, {\n size: sizeTokens.iconSize,\n color: colorTokens.icon,\n ...(icon.props as Record<string, unknown>),\n } as object);\n };\n\n const sharedA11y = {\n accessibilityRole: 'button' as const,\n accessibilityLabel: accessibilityLabel ?? label,\n accessibilityState: { disabled },\n testID,\n };\n\n if (isIconOnly) {\n return (\n <Pressable\n pointerEvents={disabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[containerStyle, style]}\n {...sharedA11y}\n >\n {cloneIcon(iconLeft)}\n </Pressable>\n );\n }\n\n return (\n <Pressable\n pointerEvents={disabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[containerStyle, style]}\n {...sharedA11y}\n >\n {cloneIcon(iconLeft)}\n {label != null && <Text style={textStyle}>{label}</Text>}\n {cloneIcon(iconRight)}\n </Pressable>\n );\n}"]}
@@ -29,8 +29,8 @@ export function ButtonMenu({ icon, state = 'default', notif = false, onPress, st
29
29
  padding: 10,
30
30
  borderRadius: 8,
31
31
  backgroundColor: background,
32
- borderWidth: borderColor != null ? 1 : undefined,
33
- borderColor: borderColor ?? undefined,
32
+ borderWidth: 1,
33
+ borderColor: borderColor ?? 'transparent',
34
34
  alignItems: 'center',
35
35
  justifyContent: 'center',
36
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonMenu.js","sourceRoot":"","sources":["../../../src/components/ButtonMenu/ButtonMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ButtonMenu component — icon-only toggle button for navigation/menu bars.\n * Supports default, active and disabled states with an optional notification dot.\n */\nimport React, { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { Pressable, View } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport type ButtonMenuState = 'default' | 'active' | 'disabled';\n\nexport interface ButtonMenuProps {\n /** Icon component (Phosphor Duotone icon) */\n icon: ReactElement;\n /** Toggle state */\n state?: ButtonMenuState;\n /** Show notification dot */\n notif?: boolean;\n /** Press handler */\n onPress?: () => void;\n /** Additional container styles */\n style?: StyleProp<ViewStyle>;\n /** Accessibility label for screen readers */\n accessibilityLabel?: string;\n /** Test identifier */\n testID?: string;\n}\n\nconst ICON_SIZE = 28;\nconst NOTIF_DOT = 8;\n\nexport function ButtonMenu({\n icon,\n state = 'default',\n notif = false,\n onPress,\n style,\n accessibilityLabel,\n testID,\n}: ButtonMenuProps) {\n const [pressed, setPressed] = useState(false);\n const { colors } = useTheme();\n\n const BACKGROUND: Record<ButtonMenuState, string> = {\n default: 'transparent',\n active: colors.tabBar.activeBackground,\n disabled: colors.button.tertiary.disabled.background,\n };\n\n const BORDER_COLOR: Record<ButtonMenuState, string | undefined> = {\n default: undefined,\n active: colors.border.default,\n disabled: undefined,\n };\n\n const isDisabled = state === 'disabled';\n const background = pressed && !isDisabled ? colors.button.tertiary.pressed.background : BACKGROUND[state];\n const borderColor = BORDER_COLOR[state];\n\n const containerStyle: ViewStyle = {\n width: 48,\n height: 48,\n padding: 10,\n borderRadius: 8,\n backgroundColor: background,\n borderWidth: borderColor != null ? 1 : undefined,\n borderColor: borderColor ?? undefined,\n alignItems: 'center',\n justifyContent: 'center',\n };\n\n const clonedIcon = React.cloneElement(icon, {\n size: ICON_SIZE,\n weight: 'duotone',\n color: isDisabled ? colors.text.disabled : undefined,\n ...(icon.props as Record<string, unknown>),\n } as object);\n\n return (\n <Pressable\n pointerEvents={isDisabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={isDisabled ? undefined : onPress}\n style={[containerStyle, style]}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ disabled: isDisabled, selected: state === 'active' }}\n testID={testID}\n >\n {clonedIcon}\n {notif && (\n <View\n style={{\n position: 'absolute',\n top: 6,\n left: 34,\n width: NOTIF_DOT,\n height: NOTIF_DOT,\n borderRadius: 9999,\n backgroundColor: colors.tabBar.badgeBackground,\n }}\n />\n )}\n </Pressable>\n );\n}"]}
1
+ {"version":3,"file":"ButtonMenu.js","sourceRoot":"","sources":["../../../src/components/ButtonMenu/ButtonMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * ButtonMenu component — icon-only toggle button for navigation/menu bars.\n * Supports default, active and disabled states with an optional notification dot.\n */\nimport React, { useState } from 'react';\nimport type { ReactElement } from 'react';\nimport { Pressable, View } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\nexport type ButtonMenuState = 'default' | 'active' | 'disabled';\n\nexport interface ButtonMenuProps {\n /** Icon component (Phosphor Duotone icon) */\n icon: ReactElement;\n /** Toggle state */\n state?: ButtonMenuState;\n /** Show notification dot */\n notif?: boolean;\n /** Press handler */\n onPress?: () => void;\n /** Additional container styles */\n style?: StyleProp<ViewStyle>;\n /** Accessibility label for screen readers */\n accessibilityLabel?: string;\n /** Test identifier */\n testID?: string;\n}\n\nconst ICON_SIZE = 28;\nconst NOTIF_DOT = 8;\n\nexport function ButtonMenu({\n icon,\n state = 'default',\n notif = false,\n onPress,\n style,\n accessibilityLabel,\n testID,\n}: ButtonMenuProps) {\n const [pressed, setPressed] = useState(false);\n const { colors } = useTheme();\n\n const BACKGROUND: Record<ButtonMenuState, string> = {\n default: 'transparent',\n active: colors.tabBar.activeBackground,\n disabled: colors.button.tertiary.disabled.background,\n };\n\n const BORDER_COLOR: Record<ButtonMenuState, string | undefined> = {\n default: undefined,\n active: colors.border.default,\n disabled: undefined,\n };\n\n const isDisabled = state === 'disabled';\n const background = pressed && !isDisabled ? colors.button.tertiary.pressed.background : BACKGROUND[state];\n const borderColor = BORDER_COLOR[state];\n\n const containerStyle: ViewStyle = {\n width: 48,\n height: 48,\n padding: 10,\n borderRadius: 8,\n backgroundColor: background,\n borderWidth: 1,\n borderColor: borderColor ?? 'transparent',\n alignItems: 'center',\n justifyContent: 'center',\n };\n\n const clonedIcon = React.cloneElement(icon, {\n size: ICON_SIZE,\n weight: 'duotone',\n color: isDisabled ? colors.text.disabled : undefined,\n ...(icon.props as Record<string, unknown>),\n } as object);\n\n return (\n <Pressable\n pointerEvents={isDisabled ? 'none' : 'auto'}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n onPress={isDisabled ? undefined : onPress}\n style={[containerStyle, style]}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ disabled: isDisabled, selected: state === 'active' }}\n testID={testID}\n >\n {clonedIcon}\n {notif && (\n <View\n style={{\n position: 'absolute',\n top: 6,\n left: 34,\n width: NOTIF_DOT,\n height: NOTIF_DOT,\n borderRadius: 9999,\n backgroundColor: colors.tabBar.badgeBackground,\n }}\n />\n )}\n </Pressable>\n );\n}"]}
@@ -124,7 +124,7 @@ export function Calendar({ selectedDate, rangeStart, rangeEnd, mode = 'day', sho
124
124
  calendarStyles.tab,
125
125
  active && [calendarStyles.tabActive, { backgroundColor: colors.background.primary, borderColor: cal.header.border }],
126
126
  ]} onPress={() => onModeChange?.(m)}>
127
- <Text style={[calendarStyles.tabText, { color: cal.day.default.text, fontFamily }]}>
127
+ <Text style={[calendarStyles.tabText, { color: cal.day.default.text, fontFamily }]} numberOfLines={1}>
128
128
  {m === 'day' ? i18n.modeDay : i18n.modeRange}
129
129
  </Text>
130
130
  </Pressable>);
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Calendar component — monthly date picker with day and range selection modes.\n * Supports data dots, mode tabs, today highlight and range band visualization.\n */\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\nimport { BottomSheetProvider } from '../../context/BottomSheetContext';\nimport { Button } from '../Button';\nimport type { CalendarProps, DayState } from './Calendar.types';\nimport { CALENDAR_FR } from './Calendar.i18n';\nimport { CalendarYearPicker } from './CalendarYearPicker';\nimport { calendarStyles } from './Calendar.styles';\nimport { CalendarDay } from './CalendarDay';\nimport { CalendarHeader } from './CalendarHeader';\nimport { CalendarLegend } from './CalendarLegend';\n\n// --- Constants ---\n\n\n// --- Helpers ---\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction stripTime(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\n\n\nfunction formatRangeDate(d: Date, showYear: boolean, monthsShort: string[]): string {\n const day = d.getDate();\n const month = monthsShort[d.getMonth()];\n return showYear ? `${day} ${month} ${d.getFullYear()}` : `${day} ${month}`;\n}\n\ninterface GridDay {\n day: number;\n date: Date;\n isCurrentMonth: boolean;\n}\n\nfunction buildMonthGrid(year: number, month: number): GridDay[] {\n const firstDay = new Date(year, month, 1);\n const lastDate = new Date(year, month + 1, 0).getDate();\n const startOffset = (firstDay.getDay() + 6) % 7; // Mon-based offset\n const days: GridDay[] = [];\n\n for (let i = startOffset; i > 0; i--) {\n const date = new Date(year, month, 1 - i);\n days.push({ day: date.getDate(), date, isCurrentMonth: false });\n }\n for (let d = 1; d <= lastDate; d++) {\n days.push({ day: d, date: new Date(year, month, d), isCurrentMonth: true });\n }\n const total = days.length <= 35 ? 35 : 42;\n let next = 1;\n while (days.length < total) {\n days.push({ day: next, date: new Date(year, month + 1, next++), isCurrentMonth: false });\n }\n return days;\n}\n\nfunction getDayState(\n date: Date,\n isCurrentMonth: boolean,\n today: Date,\n mode: 'day' | 'range',\n selectedDate?: Date,\n rangeStart?: Date,\n rangeEnd?: Date,\n dataDates?: Date[],\n): DayState {\n if (!isCurrentMonth) return 'outside';\n const t = stripTime(date);\n\n if (mode === 'day') {\n if (selectedDate && isSameDay(date, selectedDate)) return 'selected-start';\n if (isSameDay(date, today)) return 'today';\n if (dataDates?.length && !dataDates.some(d => isSameDay(d, date))) return 'nodata';\n return 'default';\n }\n\n if (rangeStart && isSameDay(date, rangeStart)) return 'selected-start';\n if (rangeEnd && isSameDay(date, rangeEnd)) return 'selected-end';\n if (rangeStart && rangeEnd) {\n if (t > stripTime(rangeStart) && t < stripTime(rangeEnd)) return 'in-range';\n }\n if (isSameDay(date, today)) return 'today';\n if (dataDates?.length && !dataDates.some(d => isSameDay(d, date))) return 'nodata';\n return 'default';\n}\n\nfunction chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) chunks.push(arr.slice(i, i + size));\n return chunks;\n}\n\nfunction getDisplayDate(mode: 'day' | 'range', monthsShort: string[], selectedDate?: Date, rangeStart?: Date, rangeEnd?: Date): string {\n if (mode === 'day') return selectedDate ? formatRangeDate(selectedDate, true, monthsShort) : '—';\n if (rangeStart && rangeEnd) {\n return `${formatRangeDate(rangeStart, false, monthsShort)} → ${formatRangeDate(rangeEnd, true, monthsShort)}`;\n }\n if (rangeStart) return formatRangeDate(rangeStart, true, monthsShort);\n return '—';\n}\n\n// --- Component ---\n\nexport function Calendar({\n selectedDate,\n rangeStart,\n rangeEnd,\n mode = 'day',\n showModeTabs = false,\n dataDates,\n onDayPress,\n onModeChange,\n onClear,\n onConfirm,\n minYear,\n maxYear,\n i18n: i18nProp,\n}: CalendarProps) {\n const i18n = { ...CALENDAR_FR, ...i18nProp };\n const { colors, fontFamily } = useTheme();\n const cal = colors.calendar;\n const today = new Date();\n\n const [showYearPicker, setShowYearPicker] = useState(false);\n\n const [currentMonth, setCurrentMonth] = useState<Date>(() => {\n const base = selectedDate ?? rangeStart ?? today;\n return new Date(base.getFullYear(), base.getMonth(), 1);\n });\n\n const year = currentMonth.getFullYear();\n const month = currentMonth.getMonth();\n const monthLabel = `${i18n.months[month]} ${year}`;\n const displayDate = getDisplayDate(mode, i18n.monthsShort, selectedDate, rangeStart, rangeEnd);\n const weeks = chunkArray(buildMonthGrid(year, month), 7);\n\n const handlePrev = () => setCurrentMonth(new Date(year, month - 1, 1));\n const handleNext = () => setCurrentMonth(new Date(year, month + 1, 1));\n\n return (\n <BottomSheetProvider>\n <View style={[calendarStyles.card, { backgroundColor: colors.background.primary, shadowColor: colors.shadow.lowest }]}>\n {/* Top bar */}\n <View style={calendarStyles.topBar}>\n <View>\n <Text style={[calendarStyles.topBarLabel, { color: cal.day.default.secondary, fontFamily }]}>{i18n.dateLabel}</Text>\n <Text style={[calendarStyles.topBarDate, { color: cal.day.default.text, fontFamily }]}>{displayDate}</Text>\n </View>\n\n {showModeTabs && (\n <View style={[calendarStyles.tabsContainer, { backgroundColor: cal.legend.background, borderColor: cal.header.border }]}>\n {(['day', 'range'] as const).map(m => {\n const active = mode === m;\n return (\n <Pressable\n key={m}\n style={[\n calendarStyles.tab,\n active && [calendarStyles.tabActive, { backgroundColor: colors.background.primary, borderColor: cal.header.border }],\n ]}\n onPress={() => onModeChange?.(m)}\n >\n <Text style={[calendarStyles.tabText, { color: cal.day.default.text, fontFamily }]}>\n {m === 'day' ? i18n.modeDay : i18n.modeRange}\n </Text>\n </Pressable>\n );\n })}\n </View>\n )}\n </View>\n\n <View style={[calendarStyles.divider, { backgroundColor: cal.header.border }]} />\n\n {/* Grid */}\n <View style={calendarStyles.gridContainer}>\n <CalendarHeader\n label={monthLabel}\n onPrev={handlePrev}\n onNext={handleNext}\n onLabelPress={() => setShowYearPicker(true)}\n />\n\n <View style={calendarStyles.weekLabelsRow}>\n {i18n.weekDays.map(d => (\n <View key={d} style={calendarStyles.weekLabelCell}>\n <Text style={[calendarStyles.weekLabelText, { color: cal.day.default.secondary, fontFamily }]}>{d}</Text>\n </View>\n ))}\n </View>\n\n {weeks.map((week, wi) => (\n <View key={wi} style={calendarStyles.weekRow}>\n {week.map((gd, di) => {\n const state = getDayState(gd.date, gd.isCurrentMonth, today, mode, selectedDate, rangeStart, rangeEnd, dataDates);\n const hasData = gd.isCurrentMonth && (dataDates?.some(d => isSameDay(d, gd.date)) ?? false);\n return (\n <CalendarDay\n key={di}\n day={gd.day}\n state={state}\n mode={mode}\n hasRange={!!(rangeStart && rangeEnd)}\n hasData={hasData}\n onPress={() => !gd.isCurrentMonth ? undefined : onDayPress?.(gd.date)}\n />\n );\n })}\n </View>\n ))}\n </View>\n\n <CalendarLegend mode={mode} i18n={i18n} />\n\n {/* Footer */}\n <View style={calendarStyles.footer}>\n <Button variant=\"tertiary\" label={i18n.clear} onPress={onClear} style={{ flex: 1 }} />\n <Button variant=\"primary\" label={i18n.confirm} onPress={onConfirm} style={{ flex: 1 }} />\n </View>\n\n <CalendarYearPicker\n visible={showYearPicker}\n currentYear={year}\n minYear={minYear}\n maxYear={maxYear}\n i18n={i18n}\n onSelect={selectedYear => {\n setCurrentMonth(new Date(selectedYear, month, 1));\n setShowYearPicker(false);\n }}\n onClose={() => setShowYearPicker(false)}\n />\n </View>\n </BottomSheetProvider>\n );\n}\n\nexport default Calendar;"]}
1
+ {"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Calendar component — monthly date picker with day and range selection modes.\n * Supports data dots, mode tabs, today highlight and range band visualization.\n */\nimport { useState } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\nimport { BottomSheetProvider } from '../../context/BottomSheetContext';\nimport { Button } from '../Button';\nimport type { CalendarProps, DayState } from './Calendar.types';\nimport { CALENDAR_FR } from './Calendar.i18n';\nimport { CalendarYearPicker } from './CalendarYearPicker';\nimport { calendarStyles } from './Calendar.styles';\nimport { CalendarDay } from './CalendarDay';\nimport { CalendarHeader } from './CalendarHeader';\nimport { CalendarLegend } from './CalendarLegend';\n\n// --- Constants ---\n\n\n// --- Helpers ---\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction stripTime(d: Date): number {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n}\n\n\n\nfunction formatRangeDate(d: Date, showYear: boolean, monthsShort: string[]): string {\n const day = d.getDate();\n const month = monthsShort[d.getMonth()];\n return showYear ? `${day} ${month} ${d.getFullYear()}` : `${day} ${month}`;\n}\n\ninterface GridDay {\n day: number;\n date: Date;\n isCurrentMonth: boolean;\n}\n\nfunction buildMonthGrid(year: number, month: number): GridDay[] {\n const firstDay = new Date(year, month, 1);\n const lastDate = new Date(year, month + 1, 0).getDate();\n const startOffset = (firstDay.getDay() + 6) % 7; // Mon-based offset\n const days: GridDay[] = [];\n\n for (let i = startOffset; i > 0; i--) {\n const date = new Date(year, month, 1 - i);\n days.push({ day: date.getDate(), date, isCurrentMonth: false });\n }\n for (let d = 1; d <= lastDate; d++) {\n days.push({ day: d, date: new Date(year, month, d), isCurrentMonth: true });\n }\n const total = days.length <= 35 ? 35 : 42;\n let next = 1;\n while (days.length < total) {\n days.push({ day: next, date: new Date(year, month + 1, next++), isCurrentMonth: false });\n }\n return days;\n}\n\nfunction getDayState(\n date: Date,\n isCurrentMonth: boolean,\n today: Date,\n mode: 'day' | 'range',\n selectedDate?: Date,\n rangeStart?: Date,\n rangeEnd?: Date,\n dataDates?: Date[],\n): DayState {\n if (!isCurrentMonth) return 'outside';\n const t = stripTime(date);\n\n if (mode === 'day') {\n if (selectedDate && isSameDay(date, selectedDate)) return 'selected-start';\n if (isSameDay(date, today)) return 'today';\n if (dataDates?.length && !dataDates.some(d => isSameDay(d, date))) return 'nodata';\n return 'default';\n }\n\n if (rangeStart && isSameDay(date, rangeStart)) return 'selected-start';\n if (rangeEnd && isSameDay(date, rangeEnd)) return 'selected-end';\n if (rangeStart && rangeEnd) {\n if (t > stripTime(rangeStart) && t < stripTime(rangeEnd)) return 'in-range';\n }\n if (isSameDay(date, today)) return 'today';\n if (dataDates?.length && !dataDates.some(d => isSameDay(d, date))) return 'nodata';\n return 'default';\n}\n\nfunction chunkArray<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) chunks.push(arr.slice(i, i + size));\n return chunks;\n}\n\nfunction getDisplayDate(mode: 'day' | 'range', monthsShort: string[], selectedDate?: Date, rangeStart?: Date, rangeEnd?: Date): string {\n if (mode === 'day') return selectedDate ? formatRangeDate(selectedDate, true, monthsShort) : '—';\n if (rangeStart && rangeEnd) {\n return `${formatRangeDate(rangeStart, false, monthsShort)} → ${formatRangeDate(rangeEnd, true, monthsShort)}`;\n }\n if (rangeStart) return formatRangeDate(rangeStart, true, monthsShort);\n return '—';\n}\n\n// --- Component ---\n\nexport function Calendar({\n selectedDate,\n rangeStart,\n rangeEnd,\n mode = 'day',\n showModeTabs = false,\n dataDates,\n onDayPress,\n onModeChange,\n onClear,\n onConfirm,\n minYear,\n maxYear,\n i18n: i18nProp,\n}: CalendarProps) {\n const i18n = { ...CALENDAR_FR, ...i18nProp };\n const { colors, fontFamily } = useTheme();\n const cal = colors.calendar;\n const today = new Date();\n\n const [showYearPicker, setShowYearPicker] = useState(false);\n\n const [currentMonth, setCurrentMonth] = useState<Date>(() => {\n const base = selectedDate ?? rangeStart ?? today;\n return new Date(base.getFullYear(), base.getMonth(), 1);\n });\n\n const year = currentMonth.getFullYear();\n const month = currentMonth.getMonth();\n const monthLabel = `${i18n.months[month]} ${year}`;\n const displayDate = getDisplayDate(mode, i18n.monthsShort, selectedDate, rangeStart, rangeEnd);\n const weeks = chunkArray(buildMonthGrid(year, month), 7);\n\n const handlePrev = () => setCurrentMonth(new Date(year, month - 1, 1));\n const handleNext = () => setCurrentMonth(new Date(year, month + 1, 1));\n\n return (\n <BottomSheetProvider>\n <View style={[calendarStyles.card, { backgroundColor: colors.background.primary, shadowColor: colors.shadow.lowest }]}>\n {/* Top bar */}\n <View style={calendarStyles.topBar}>\n <View>\n <Text style={[calendarStyles.topBarLabel, { color: cal.day.default.secondary, fontFamily }]}>{i18n.dateLabel}</Text>\n <Text style={[calendarStyles.topBarDate, { color: cal.day.default.text, fontFamily }]}>{displayDate}</Text>\n </View>\n\n {showModeTabs && (\n <View style={[calendarStyles.tabsContainer, { backgroundColor: cal.legend.background, borderColor: cal.header.border }]}>\n {(['day', 'range'] as const).map(m => {\n const active = mode === m;\n return (\n <Pressable\n key={m}\n style={[\n calendarStyles.tab,\n active && [calendarStyles.tabActive, { backgroundColor: colors.background.primary, borderColor: cal.header.border }],\n ]}\n onPress={() => onModeChange?.(m)}\n >\n <Text style={[calendarStyles.tabText, { color: cal.day.default.text, fontFamily }]} numberOfLines={1}>\n {m === 'day' ? i18n.modeDay : i18n.modeRange}\n </Text>\n </Pressable>\n );\n })}\n </View>\n )}\n </View>\n\n <View style={[calendarStyles.divider, { backgroundColor: cal.header.border }]} />\n\n {/* Grid */}\n <View style={calendarStyles.gridContainer}>\n <CalendarHeader\n label={monthLabel}\n onPrev={handlePrev}\n onNext={handleNext}\n onLabelPress={() => setShowYearPicker(true)}\n />\n\n <View style={calendarStyles.weekLabelsRow}>\n {i18n.weekDays.map(d => (\n <View key={d} style={calendarStyles.weekLabelCell}>\n <Text style={[calendarStyles.weekLabelText, { color: cal.day.default.secondary, fontFamily }]}>{d}</Text>\n </View>\n ))}\n </View>\n\n {weeks.map((week, wi) => (\n <View key={wi} style={calendarStyles.weekRow}>\n {week.map((gd, di) => {\n const state = getDayState(gd.date, gd.isCurrentMonth, today, mode, selectedDate, rangeStart, rangeEnd, dataDates);\n const hasData = gd.isCurrentMonth && (dataDates?.some(d => isSameDay(d, gd.date)) ?? false);\n return (\n <CalendarDay\n key={di}\n day={gd.day}\n state={state}\n mode={mode}\n hasRange={!!(rangeStart && rangeEnd)}\n hasData={hasData}\n onPress={() => !gd.isCurrentMonth ? undefined : onDayPress?.(gd.date)}\n />\n );\n })}\n </View>\n ))}\n </View>\n\n <CalendarLegend mode={mode} i18n={i18n} />\n\n {/* Footer */}\n <View style={calendarStyles.footer}>\n <Button variant=\"tertiary\" label={i18n.clear} onPress={onClear} style={{ flex: 1 }} />\n <Button variant=\"primary\" label={i18n.confirm} onPress={onConfirm} style={{ flex: 1 }} />\n </View>\n\n <CalendarYearPicker\n visible={showYearPicker}\n currentYear={year}\n minYear={minYear}\n maxYear={maxYear}\n i18n={i18n}\n onSelect={selectedYear => {\n setCurrentMonth(new Date(selectedYear, month, 1));\n setShowYearPicker(false);\n }}\n onClose={() => setShowYearPicker(false)}\n />\n </View>\n </BottomSheetProvider>\n );\n}\n\nexport default Calendar;"]}
@@ -23,8 +23,8 @@ export declare const CALENDAR_TOKENS: {
23
23
  readonly btnBorderRadius: 8;
24
24
  readonly btnGap: 4;
25
25
  readonly tabsContainerPad: 2;
26
- readonly tabsContainerWidth: 118;
27
- readonly tabsPaddingH: 12;
26
+ readonly tabsContainerWidth: 148;
27
+ readonly tabsPaddingH: 8;
28
28
  readonly tabsPaddingV: 6;
29
29
  readonly tabsBorderRadius: 4;
30
30
  readonly tabsContainerBorderRadius: 6;
@@ -65,7 +65,7 @@ export declare const TYPO: {
65
65
  };
66
66
  export declare const dayStyles: {
67
67
  cell: {
68
- flex: number;
68
+ width: 44;
69
69
  height: 44;
70
70
  alignItems: "center";
71
71
  justifyContent: "center";
@@ -147,10 +147,11 @@ export declare const calendarStyles: {
147
147
  };
148
148
  weekLabelsRow: {
149
149
  flexDirection: "row";
150
+ marginTop: number;
150
151
  marginBottom: number;
151
152
  };
152
153
  weekLabelCell: {
153
- flex: number;
154
+ width: 44;
154
155
  alignItems: "center";
155
156
  paddingVertical: number;
156
157
  };
@@ -190,6 +191,8 @@ export declare const calendarStyles: {
190
191
  gap: number;
191
192
  };
192
193
  legendText: {
194
+ includeFontPadding: false;
195
+ textAlignVertical: "center";
193
196
  fontFamily: "Urbanist";
194
197
  fontWeight: "600";
195
198
  fontSize: 11;
@@ -231,19 +234,19 @@ export declare const calendarStyles: {
231
234
  borderRadius: 6;
232
235
  padding: 2;
233
236
  gap: 4;
234
- width: 118;
237
+ width: 148;
235
238
  };
236
239
  tab: {
237
240
  flex: number;
238
241
  alignItems: "center";
239
242
  justifyContent: "center";
240
- paddingHorizontal: 12;
243
+ paddingHorizontal: 8;
241
244
  paddingVertical: 6;
242
245
  borderRadius: 4;
243
- };
244
- tabActive: {
245
246
  borderWidth: number;
247
+ borderColor: string;
246
248
  };
249
+ tabActive: {};
247
250
  tabText: {
248
251
  fontFamily: "Urbanist";
249
252
  fontWeight: "600";
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.styles.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqClB,CAAC;AAIX,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BP,CAAC;AAMX,eAAO,MAAM,SAAS;;;;;;;;;;;;;eAYyB,MAAM;;;;eACP,MAAM;;;;eACN,MAAM;;;;;;;;;;;;;;;;;;CAgBlD,CAAC;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8HzB,CAAC"}
1
+ {"version":3,"file":"Calendar.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.styles.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqClB,CAAC;AAIX,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BP,CAAC;AAMX,eAAO,MAAM,SAAS;;;;;;;;;;;;;eAYyB,MAAM;;;;eACP,MAAM;;;;eACN,MAAM;;;;;;;;;;;;;;;;;;CAgBlD,CAAC;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIzB,CAAC"}
@@ -26,8 +26,8 @@ export const CALENDAR_TOKENS = {
26
26
  btnBorderRadius: 8,
27
27
  btnGap: 4,
28
28
  tabsContainerPad: 2,
29
- tabsContainerWidth: 118,
30
- tabsPaddingH: 12,
29
+ tabsContainerWidth: 148,
30
+ tabsPaddingH: 8,
31
31
  tabsPaddingV: 6,
32
32
  tabsBorderRadius: 4,
33
33
  tabsContainerBorderRadius: 6,
@@ -71,7 +71,7 @@ const T = CALENDAR_TOKENS;
71
71
  // --- Day cell static layout ---
72
72
  export const dayStyles = StyleSheet.create({
73
73
  cell: {
74
- flex: 1,
74
+ width: T.dayTouchTarget,
75
75
  height: T.dayTouchTarget,
76
76
  alignItems: 'center',
77
77
  justifyContent: 'center',
@@ -135,10 +135,11 @@ export const calendarStyles = StyleSheet.create({
135
135
  },
136
136
  weekLabelsRow: {
137
137
  flexDirection: 'row',
138
+ marginTop: 8,
138
139
  marginBottom: 4,
139
140
  },
140
141
  weekLabelCell: {
141
- flex: 1,
142
+ width: T.dayTouchTarget,
142
143
  alignItems: 'center',
143
144
  paddingVertical: 4,
144
145
  },
@@ -175,6 +176,8 @@ export const calendarStyles = StyleSheet.create({
175
176
  },
176
177
  legendText: {
177
178
  ...TYPO.labelSmallest,
179
+ includeFontPadding: false,
180
+ textAlignVertical: 'center',
178
181
  },
179
182
  legendDot: {
180
183
  width: 4,
@@ -182,8 +185,8 @@ export const calendarStyles = StyleSheet.create({
182
185
  borderRadius: 9999,
183
186
  },
184
187
  legendTodayCircle: {
185
- width: 10,
186
- height: 10,
188
+ width: 13,
189
+ height: 13,
187
190
  borderRadius: 9999,
188
191
  borderWidth: 1.5,
189
192
  },
@@ -194,8 +197,8 @@ export const calendarStyles = StyleSheet.create({
194
197
  borderWidth: 1,
195
198
  },
196
199
  legendSelectionDot: {
197
- width: 10,
198
- height: 10,
200
+ width: 13,
201
+ height: 13,
199
202
  borderRadius: 9999,
200
203
  },
201
204
  footer: {
@@ -220,10 +223,10 @@ export const calendarStyles = StyleSheet.create({
220
223
  paddingHorizontal: T.tabsPaddingH,
221
224
  paddingVertical: T.tabsPaddingV,
222
225
  borderRadius: T.tabsBorderRadius,
223
- },
224
- tabActive: {
225
226
  borderWidth: 1,
227
+ borderColor: 'transparent',
226
228
  },
229
+ tabActive: {},
227
230
  tabText: {
228
231
  ...TYPO.textSemiBoldSmall,
229
232
  },
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.styles.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.styles.ts"],"names":[],"mappings":"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","sourcesContent":["/** Layout tokens and static styles for the Calendar component family — colors come from useTheme() */\nimport { StyleSheet } from 'react-native';\n\n// --- Dimension tokens ---\n\nexport const CALENDAR_TOKENS = {\n dayTouchTarget: 44,\n dayCircleSize: 36,\n dayCirclePaddingTop: 2,\n dayCircleBorderR: 9999,\n dayDotSize: 4,\n dayDotLeft: 16,\n dayDotTop: 27,\n rangeBarHeight: 32,\n gridPaddingH: 16,\n gridPaddingTop: 16,\n gridPaddingBottom: 20,\n gridGap: 8,\n headerHeight: 52,\n legendPaddingH: 32,\n legendPaddingV: 10,\n footerPaddingH: 16,\n footerPaddingTop: 12,\n footerPaddingBottom: 16,\n footerGap: 8,\n btnPaddingH: 16,\n btnPaddingV: 10,\n btnBorderRadius: 8,\n btnGap: 4,\n tabsContainerPad: 2,\n tabsContainerWidth: 118,\n tabsPaddingH: 12,\n tabsPaddingV: 6,\n tabsBorderRadius: 4,\n tabsContainerBorderRadius: 6,\n tabsGap: 4,\n topBarPaddingLeft: 20,\n topBarPaddingRight: 16,\n topBarPaddingTop: 16,\n topBarPaddingBottom: 12,\n cardBorderRadius: 16,\n yearItemBorderRadius: 12,\n} as const;\n\n// --- Typography presets (no color) ---\n\nexport const TYPO = {\n labelSmallest: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 11,\n lineHeight: 14,\n letterSpacing: 0.66,\n },\n textSmall: {\n fontFamily: 'Urbanist',\n fontWeight: '500' as const,\n fontSize: 14,\n lineHeight: 20,\n },\n textSemiBoldSmall: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 14,\n lineHeight: 20,\n },\n textSemiBoldLarge: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 18,\n lineHeight: 26,\n },\n} as const;\n\nconst T = CALENDAR_TOKENS;\n\n// --- Day cell static layout ---\n\nexport const dayStyles = StyleSheet.create({\n cell: {\n flex: 1,\n height: T.dayTouchTarget,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rangeBarBase: {\n position: 'absolute',\n height: T.rangeBarHeight,\n top: (T.dayTouchTarget - T.rangeBarHeight) / 2,\n },\n rangeBarFull: { width: '100%' as unknown as number, left: 0 },\n rangeBarStart: { width: '50%' as unknown as number, right: 0 },\n rangeBarEnd: { width: '50%' as unknown as number, left: 0 },\n circle: {\n width: T.dayCircleSize,\n height: T.dayCircleSize,\n borderRadius: T.dayCircleBorderR,\n alignItems: 'center',\n justifyContent: 'center',\n },\n dot: {\n position: 'absolute',\n width: T.dayDotSize,\n height: T.dayDotSize,\n borderRadius: 9999,\n left: T.dayDotLeft,\n top: T.dayDotTop,\n },\n});\n\n// --- Calendar layout ---\n\nexport const calendarStyles = StyleSheet.create({\n card: {\n borderRadius: T.cardBorderRadius,\n overflow: 'hidden',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 1,\n shadowRadius: 16,\n elevation: 4,\n },\n topBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: T.topBarPaddingLeft,\n paddingRight: T.topBarPaddingRight,\n paddingTop: T.topBarPaddingTop,\n paddingBottom: T.topBarPaddingBottom,\n },\n topBarLabel: {\n ...TYPO.labelSmallest,\n },\n topBarDate: {\n ...TYPO.textSmall,\n },\n divider: {\n height: 1,\n },\n gridContainer: {\n paddingHorizontal: T.gridPaddingH,\n paddingTop: T.gridPaddingTop,\n paddingBottom: T.gridPaddingBottom,\n },\n weekLabelsRow: {\n flexDirection: 'row',\n marginBottom: 4,\n },\n weekLabelCell: {\n flex: 1,\n alignItems: 'center',\n paddingVertical: 4,\n },\n weekLabelText: {\n ...TYPO.labelSmallest,\n },\n weekRow: {\n flexDirection: 'row',\n marginTop: T.gridGap,\n },\n header: {\n height: T.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n headerArrow: {\n padding: 10,\n },\n legend: {\n borderTopWidth: 1,\n borderBottomWidth: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: T.legendPaddingH,\n paddingVertical: T.legendPaddingV,\n gap: 16,\n },\n legendItem: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n legendText: {\n ...TYPO.labelSmallest,\n },\n legendDot: {\n width: 4,\n height: 4,\n borderRadius: 9999,\n },\n legendTodayCircle: {\n width: 10,\n height: 10,\n borderRadius: 9999,\n borderWidth: 1.5,\n },\n legendRangeBar: {\n width: 20,\n height: 8,\n borderRadius: 2,\n borderWidth: 1,\n },\n legendSelectionDot: {\n width: 10,\n height: 10,\n borderRadius: 9999,\n },\n footer: {\n paddingHorizontal: T.footerPaddingH,\n paddingTop: T.footerPaddingTop,\n paddingBottom: T.footerPaddingBottom,\n flexDirection: 'row',\n gap: T.footerGap,\n },\n tabsContainer: {\n flexDirection: 'row',\n borderWidth: 1,\n borderRadius: T.tabsContainerBorderRadius,\n padding: T.tabsContainerPad,\n gap: T.tabsGap,\n width: T.tabsContainerWidth,\n },\n tab: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: T.tabsPaddingH,\n paddingVertical: T.tabsPaddingV,\n borderRadius: T.tabsBorderRadius,\n },\n tabActive: {\n borderWidth: 1,\n },\n tabText: {\n ...TYPO.textSemiBoldSmall,\n },\n});"]}
1
+ {"version":3,"file":"Calendar.styles.js","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.styles.ts"],"names":[],"mappings":"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","sourcesContent":["/** Layout tokens and static styles for the Calendar component family — colors come from useTheme() */\nimport { StyleSheet } from 'react-native';\n\n// --- Dimension tokens ---\n\nexport const CALENDAR_TOKENS = {\n dayTouchTarget: 44,\n dayCircleSize: 36,\n dayCirclePaddingTop: 2,\n dayCircleBorderR: 9999,\n dayDotSize: 4,\n dayDotLeft: 16,\n dayDotTop: 27,\n rangeBarHeight: 32,\n gridPaddingH: 16,\n gridPaddingTop: 16,\n gridPaddingBottom: 20,\n gridGap: 8,\n headerHeight: 52,\n legendPaddingH: 32,\n legendPaddingV: 10,\n footerPaddingH: 16,\n footerPaddingTop: 12,\n footerPaddingBottom: 16,\n footerGap: 8,\n btnPaddingH: 16,\n btnPaddingV: 10,\n btnBorderRadius: 8,\n btnGap: 4,\n tabsContainerPad: 2,\n tabsContainerWidth: 148,\n tabsPaddingH: 8,\n tabsPaddingV: 6,\n tabsBorderRadius: 4,\n tabsContainerBorderRadius: 6,\n tabsGap: 4,\n topBarPaddingLeft: 20,\n topBarPaddingRight: 16,\n topBarPaddingTop: 16,\n topBarPaddingBottom: 12,\n cardBorderRadius: 16,\n yearItemBorderRadius: 12,\n} as const;\n\n// --- Typography presets (no color) ---\n\nexport const TYPO = {\n labelSmallest: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 11,\n lineHeight: 14,\n letterSpacing: 0.66,\n },\n textSmall: {\n fontFamily: 'Urbanist',\n fontWeight: '500' as const,\n fontSize: 14,\n lineHeight: 20,\n },\n textSemiBoldSmall: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 14,\n lineHeight: 20,\n },\n textSemiBoldLarge: {\n fontFamily: 'Urbanist',\n fontWeight: '600' as const,\n fontSize: 18,\n lineHeight: 26,\n },\n} as const;\n\nconst T = CALENDAR_TOKENS;\n\n// --- Day cell static layout ---\n\nexport const dayStyles = StyleSheet.create({\n cell: {\n width: T.dayTouchTarget,\n height: T.dayTouchTarget,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rangeBarBase: {\n position: 'absolute',\n height: T.rangeBarHeight,\n top: (T.dayTouchTarget - T.rangeBarHeight) / 2,\n },\n rangeBarFull: { width: '100%' as unknown as number, left: 0 },\n rangeBarStart: { width: '50%' as unknown as number, right: 0 },\n rangeBarEnd: { width: '50%' as unknown as number, left: 0 },\n circle: {\n width: T.dayCircleSize,\n height: T.dayCircleSize,\n borderRadius: T.dayCircleBorderR,\n alignItems: 'center',\n justifyContent: 'center',\n },\n dot: {\n position: 'absolute',\n width: T.dayDotSize,\n height: T.dayDotSize,\n borderRadius: 9999,\n left: T.dayDotLeft,\n top: T.dayDotTop,\n },\n});\n\n// --- Calendar layout ---\n\nexport const calendarStyles = StyleSheet.create({\n card: {\n borderRadius: T.cardBorderRadius,\n overflow: 'hidden',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 1,\n shadowRadius: 16,\n elevation: 4,\n },\n topBar: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: T.topBarPaddingLeft,\n paddingRight: T.topBarPaddingRight,\n paddingTop: T.topBarPaddingTop,\n paddingBottom: T.topBarPaddingBottom,\n },\n topBarLabel: {\n ...TYPO.labelSmallest,\n },\n topBarDate: {\n ...TYPO.textSmall,\n },\n divider: {\n height: 1,\n },\n gridContainer: {\n paddingHorizontal: T.gridPaddingH,\n paddingTop: T.gridPaddingTop,\n paddingBottom: T.gridPaddingBottom,\n },\n weekLabelsRow: {\n flexDirection: 'row',\n marginTop: 8,\n marginBottom: 4,\n },\n weekLabelCell: {\n width: T.dayTouchTarget,\n alignItems: 'center',\n paddingVertical: 4,\n },\n weekLabelText: {\n ...TYPO.labelSmallest,\n },\n weekRow: {\n flexDirection: 'row',\n marginTop: T.gridGap,\n },\n header: {\n height: T.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n headerArrow: {\n padding: 10,\n },\n legend: {\n borderTopWidth: 1,\n borderBottomWidth: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: T.legendPaddingH,\n paddingVertical: T.legendPaddingV,\n gap: 16,\n },\n legendItem: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n legendText: {\n ...TYPO.labelSmallest,\n includeFontPadding: false,\n textAlignVertical: 'center',\n },\n legendDot: {\n width: 4,\n height: 4,\n borderRadius: 9999,\n },\n legendTodayCircle: {\n width: 13,\n height: 13,\n borderRadius: 9999,\n borderWidth: 1.5,\n },\n legendRangeBar: {\n width: 20,\n height: 8,\n borderRadius: 2,\n borderWidth: 1,\n },\n legendSelectionDot: {\n width: 13,\n height: 13,\n borderRadius: 9999,\n },\n footer: {\n paddingHorizontal: T.footerPaddingH,\n paddingTop: T.footerPaddingTop,\n paddingBottom: T.footerPaddingBottom,\n flexDirection: 'row',\n gap: T.footerGap,\n },\n tabsContainer: {\n flexDirection: 'row',\n borderWidth: 1,\n borderRadius: T.tabsContainerBorderRadius,\n padding: T.tabsContainerPad,\n gap: T.tabsGap,\n width: T.tabsContainerWidth,\n },\n tab: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: T.tabsPaddingH,\n paddingVertical: T.tabsPaddingV,\n borderRadius: T.tabsBorderRadius,\n borderWidth: 1,\n borderColor: 'transparent',\n },\n tabActive: {},\n tabText: {\n ...TYPO.textSemiBoldSmall,\n },\n});"]}
@@ -7,7 +7,7 @@ export function CalendarLegend({ mode, i18n }) {
7
7
  const cal = colors.calendar;
8
8
  return (<View style={[
9
9
  calendarStyles.legend,
10
- { borderTopColor: cal.header.border, borderBottomColor: cal.header.border, backgroundColor: cal.legend.background },
10
+ { borderTopColor: cal.header.border, borderBottomColor: cal.header.border },
11
11
  ]}>
12
12
  <View style={calendarStyles.legendItem}>
13
13
  <View style={[calendarStyles.legendDot, { backgroundColor: cal.day.data.dot }]}/>
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarLegend.js","sourceRoot":"","sources":["../../../src/components/Calendar/CalendarLegend.tsx"],"names":[],"mappings":"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","sourcesContent":["/** Calendar legend — three items explaining day states */\nimport { Text, View } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\nimport type { CalendarLegendProps } from './Calendar.types';\nimport { calendarStyles } from './Calendar.styles';\n\nexport function CalendarLegend({ mode, i18n }: CalendarLegendProps) {\n const { colors, fontFamily } = useTheme();\n const cal = colors.calendar;\n\n return (\n <View style={[\n calendarStyles.legend,\n { borderTopColor: cal.header.border, borderBottomColor: cal.header.border, backgroundColor: cal.legend.background },\n ]}>\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendDot, { backgroundColor: cal.day.data.dot }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendData}</Text>\n </View>\n\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendTodayCircle, { borderColor: cal.day.today.border }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendToday}</Text>\n </View>\n\n {mode === 'range' ? (\n <View style={calendarStyles.legendItem}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {/* Cercle start */}\n <View style={{ width: 13, height: 13, borderRadius: 9999, backgroundColor: cal.day.selected.background, zIndex: 1 }} />\n {/* Barre centrale — passe sous les dots jusqu'à leur milieu */}\n <View style={{ width: 18, height: 13, backgroundColor: cal.range.background, marginHorizontal: -6 }} />\n {/* Cercle end */}\n <View style={{ width: 13, height: 13, borderRadius: 9999, backgroundColor: cal.day.selected.background, zIndex: 1 }} />\n </View>\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendRange}</Text>\n </View>\n ) : (\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendSelectionDot, { backgroundColor: cal.day.selected.background }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendSelection}</Text>\n </View>\n )}\n </View>\n );\n}"]}
1
+ {"version":3,"file":"CalendarLegend.js","sourceRoot":"","sources":["../../../src/components/Calendar/CalendarLegend.tsx"],"names":[],"mappings":"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","sourcesContent":["/** Calendar legend — three items explaining day states */\nimport { Text, View } from 'react-native';\nimport { useTheme } from '../../context/ThemeContext';\nimport type { CalendarLegendProps } from './Calendar.types';\nimport { calendarStyles } from './Calendar.styles';\n\nexport function CalendarLegend({ mode, i18n }: CalendarLegendProps) {\n const { colors, fontFamily } = useTheme();\n const cal = colors.calendar;\n\n return (\n <View style={[\n calendarStyles.legend,\n { borderTopColor: cal.header.border, borderBottomColor: cal.header.border },\n ]}>\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendDot, { backgroundColor: cal.day.data.dot }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendData}</Text>\n </View>\n\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendTodayCircle, { borderColor: cal.day.today.border }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendToday}</Text>\n </View>\n\n {mode === 'range' ? (\n <View style={calendarStyles.legendItem}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {/* Cercle start */}\n <View style={{ width: 13, height: 13, borderRadius: 9999, backgroundColor: cal.day.selected.background, zIndex: 1 }} />\n {/* Barre centrale — passe sous les dots jusqu'à leur milieu */}\n <View style={{ width: 18, height: 13, backgroundColor: cal.range.background, marginHorizontal: -6 }} />\n {/* Cercle end */}\n <View style={{ width: 13, height: 13, borderRadius: 9999, backgroundColor: cal.day.selected.background, zIndex: 1 }} />\n </View>\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendRange}</Text>\n </View>\n ) : (\n <View style={calendarStyles.legendItem}>\n <View style={[calendarStyles.legendSelectionDot, { backgroundColor: cal.day.selected.background }]} />\n <Text style={[calendarStyles.legendText, { color: cal.day.default.secondary, fontFamily }]}>{i18n.legendSelection}</Text>\n </View>\n )}\n </View>\n );\n}"]}
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import React from 'react';
7
7
  import type { StyleProp, ViewStyle } from 'react-native';
8
- export type CheckboxSize = 'm' | 'l';
8
+ export type CheckboxSize = 'm' | 'xl';
9
9
  export interface CheckboxProps {
10
10
  /** Whether the checkbox is checked — required (controlled) */
11
11
  checked: boolean;
@@ -17,7 +17,7 @@ export interface CheckboxProps {
17
17
  helperText?: string;
18
18
  /** Disabled state */
19
19
  disabled?: boolean;
20
- /** Box size — m: 24×24, l: 32×32 */
20
+ /** Box size — m: 24×24, xl: 32×32 */
21
21
  size?: CheckboxSize;
22
22
  /** Press handler — required for controlled usage */
23
23
  onPress: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQzD,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAkBD,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,aAAqB,EACrB,QAAQ,EACR,UAAU,EACV,QAAgB,EAChB,IAAU,EACV,OAAO,EACP,KAAK,GACN,EAAE,aAAa,qBAmDf"}
1
+ {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAQzD,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAiBD,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,aAAqB,EACrB,QAAQ,EACR,UAAU,EACV,QAAgB,EAChB,IAAU,EACV,OAAO,EACP,KAAK,GACN,EAAE,aAAa,qBAoDf"}
@@ -11,10 +11,9 @@ import { useTheme } from '../../context/ThemeContext';
11
11
  // Size config
12
12
  // ---------------------------------------------------------------------------
13
13
  const BOX_BORDER_WIDTH = 1.5;
14
- const BOX_BORDER_RADIUS = 4;
15
14
  const SIZE_CONFIG = {
16
- m: { box: 24, icon: 17 },
17
- l: { box: 32, icon: 21 },
15
+ m: { box: 24, icon: 18, borderRadius: 4 },
16
+ xl: { box: 32, icon: 22, borderRadius: 8 },
18
17
  };
19
18
  // ---------------------------------------------------------------------------
20
19
  // Component
@@ -23,7 +22,7 @@ export function Checkbox({ checked, indeterminate = false, children, helperText,
23
22
  const [pressed, setPressed] = useState(false);
24
23
  const { colors, fontFamily } = useTheme();
25
24
  const t = colors.checkbox;
26
- const { box: boxSize, icon: iconSize } = SIZE_CONFIG[size];
25
+ const { box: boxSize, icon: iconSize, borderRadius } = SIZE_CONFIG[size] ?? SIZE_CONFIG['m'];
27
26
  // indeterminate + checked share the same filled token group
28
27
  const variantTokens = indeterminate || checked ? t.checked : t.unchecked;
29
28
  const stateKey = disabled ? 'disabled' : pressed ? 'pressed' : 'default';
@@ -39,6 +38,7 @@ export function Checkbox({ checked, indeterminate = false, children, helperText,
39
38
  backgroundColor: tokens.background,
40
39
  borderColor: tokens.border,
41
40
  borderWidth: BOX_BORDER_WIDTH,
41
+ borderRadius,
42
42
  },
43
43
  ]}>
44
44
  {indeterminate ? (<Minus size={iconSize} color={tokens.icon} weight="bold"/>) : checked ? (<Check size={iconSize} color={tokens.icon} weight="bold"/>) : null}
@@ -61,7 +61,6 @@ const styles = StyleSheet.create({
61
61
  gap: 8,
62
62
  },
63
63
  box: {
64
- borderRadius: BOX_BORDER_RADIUS,
65
64
  alignItems: 'center',
66
65
  justifyContent: 'center',
67
66
  },
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Checkbox component for Traq[UI]ste Mobile.\n * Controlled component supporting checked, indeterminate, and disabled states,\n * with an optional label and helper text.\n */\nimport React, { useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { Check, Minus } from 'phosphor-react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type CheckboxSize = 'm' | 'l';\n\nexport interface CheckboxProps {\n /** Whether the checkbox is checked — required (controlled) */\n checked: boolean;\n /** Indeterminate state — visually overrides checked, shows a minus icon */\n indeterminate?: boolean;\n /** Content displayed to the right of the box — use Text, tags, links, etc. */\n children?: React.ReactNode;\n /** Helper or error text displayed below the label */\n helperText?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Box size — m: 24×24, l: 32×32 */\n size?: CheckboxSize;\n /** Press handler — required for controlled usage */\n onPress: () => void;\n /** Additional wrapper styles */\n style?: StyleProp<ViewStyle>;\n}\n\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst BOX_BORDER_WIDTH = 1.5;\nconst BOX_BORDER_RADIUS = 4;\n\nconst SIZE_CONFIG: Record<CheckboxSize, { box: number; icon: number }> = {\n m: { box: 24, icon: 17 },\n l: { box: 32, icon: 21 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n checked,\n indeterminate = false,\n children,\n helperText,\n disabled = false,\n size = 'm',\n onPress,\n style,\n}: CheckboxProps) {\n const [pressed, setPressed] = useState(false);\n const { colors, fontFamily } = useTheme();\n const t = colors.checkbox;\n const { box: boxSize, icon: iconSize } = SIZE_CONFIG[size];\n\n // indeterminate + checked share the same filled token group\n const variantTokens = indeterminate || checked ? t.checked : t.unchecked;\n const stateKey = disabled ? 'disabled' : pressed ? 'pressed' : 'default';\n const tokens = variantTokens[stateKey];\n\n return (\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked: indeterminate ? 'mixed' : checked, disabled }}\n onPressIn={() => { if (!disabled) setPressed(true); }}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[styles.wrapper, style]}\n >\n {/* Box */}\n <View\n style={[\n styles.box,\n {\n width: boxSize,\n height: boxSize,\n backgroundColor: tokens.background,\n borderColor: tokens.border,\n borderWidth: BOX_BORDER_WIDTH,\n },\n ]}\n >\n {indeterminate ? (\n <Minus size={iconSize} color={tokens.icon} weight=\"bold\" />\n ) : checked ? (\n <Check size={iconSize} color={tokens.icon} weight=\"bold\" />\n ) : null}\n </View>\n\n {/* Content + helper text */}\n {(children != null || helperText != null) && (\n <View style={styles.textContainer}>\n {children}\n {helperText != null && (\n <Text style={[styles.helper, { color: t.helper, fontFamily }]}>{helperText}</Text>\n )}\n </View>\n )}\n </Pressable>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n wrapper: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n box: {\n borderRadius: BOX_BORDER_RADIUS,\n alignItems: 'center',\n justifyContent: 'center',\n },\n textContainer: {\n flex: 1,\n gap: 2,\n },\n helper: {\n fontSize: 12,\n lineHeight: 16,\n fontWeight: '400',\n },\n});\n"]}
1
+ {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Checkbox component for Traq[UI]ste Mobile.\n * Controlled component supporting checked, indeterminate, and disabled states,\n * with an optional label and helper text.\n */\nimport React, { useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport { Check, Minus } from 'phosphor-react-native';\nimport { useTheme } from '../../context/ThemeContext';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type CheckboxSize = 'm' | 'xl';\n\nexport interface CheckboxProps {\n /** Whether the checkbox is checked — required (controlled) */\n checked: boolean;\n /** Indeterminate state — visually overrides checked, shows a minus icon */\n indeterminate?: boolean;\n /** Content displayed to the right of the box — use Text, tags, links, etc. */\n children?: React.ReactNode;\n /** Helper or error text displayed below the label */\n helperText?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Box size — m: 24×24, xl: 32×32 */\n size?: CheckboxSize;\n /** Press handler — required for controlled usage */\n onPress: () => void;\n /** Additional wrapper styles */\n style?: StyleProp<ViewStyle>;\n}\n\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst BOX_BORDER_WIDTH = 1.5;\n\nconst SIZE_CONFIG: Record<CheckboxSize, { box: number; icon: number; borderRadius: number }> = {\n m: { box: 24, icon: 18, borderRadius: 4 },\n xl: { box: 32, icon: 22, borderRadius: 8 },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function Checkbox({\n checked,\n indeterminate = false,\n children,\n helperText,\n disabled = false,\n size = 'm',\n onPress,\n style,\n}: CheckboxProps) {\n const [pressed, setPressed] = useState(false);\n const { colors, fontFamily } = useTheme();\n const t = colors.checkbox;\n const { box: boxSize, icon: iconSize, borderRadius } = SIZE_CONFIG[size] ?? SIZE_CONFIG['m'];\n\n // indeterminate + checked share the same filled token group\n const variantTokens = indeterminate || checked ? t.checked : t.unchecked;\n const stateKey = disabled ? 'disabled' : pressed ? 'pressed' : 'default';\n const tokens = variantTokens[stateKey];\n\n return (\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityState={{ checked: indeterminate ? 'mixed' : checked, disabled }}\n onPressIn={() => { if (!disabled) setPressed(true); }}\n onPressOut={() => setPressed(false)}\n onPress={disabled ? undefined : onPress}\n style={[styles.wrapper, style]}\n >\n {/* Box */}\n <View\n style={[\n styles.box,\n {\n width: boxSize,\n height: boxSize,\n backgroundColor: tokens.background,\n borderColor: tokens.border,\n borderWidth: BOX_BORDER_WIDTH,\n borderRadius,\n },\n ]}\n >\n {indeterminate ? (\n <Minus size={iconSize} color={tokens.icon} weight=\"bold\" />\n ) : checked ? (\n <Check size={iconSize} color={tokens.icon} weight=\"bold\" />\n ) : null}\n </View>\n\n {/* Content + helper text */}\n {(children != null || helperText != null) && (\n <View style={styles.textContainer}>\n {children}\n {helperText != null && (\n <Text style={[styles.helper, { color: t.helper, fontFamily }]}>{helperText}</Text>\n )}\n </View>\n )}\n </Pressable>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n wrapper: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n box: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n textContainer: {\n flex: 1,\n gap: 2,\n },\n helper: {\n fontSize: 12,\n lineHeight: 16,\n fontWeight: '400',\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterChip.d.ts","sourceRoot":"","sources":["../../../src/components/FilterChip/FilterChip.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC9B,mDAAmD;IACnD,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC/B,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAgB,UAAU,CAAC,EACzB,IAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EACL,kBAAkB,EAClB,MAAM,GACP,EAAE,eAAe,qBAkEjB"}
1
+ {"version":3,"file":"FilterChip.d.ts","sourceRoot":"","sources":["../../../src/components/FilterChip/FilterChip.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC9B,mDAAmD;IACnD,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC/B,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAgB,UAAU,CAAC,EACzB,IAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EACL,kBAAkB,EAClB,MAAM,GACP,EAAE,eAAe,qBAkGjB"}