@retray-dev/ui-kit 6.1.0 → 7.0.1
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.
- package/COMPONENTS.md +447 -13
- package/EXAMPLES.md +248 -0
- package/README.md +11 -10
- package/dist/Accordion.d.mts +28 -0
- package/dist/Accordion.d.ts +28 -0
- package/dist/Accordion.js +340 -0
- package/dist/Accordion.mjs +6 -0
- package/dist/AlertBanner.d.mts +16 -0
- package/dist/AlertBanner.d.ts +16 -0
- package/dist/AlertBanner.js +247 -0
- package/dist/AlertBanner.mjs +5 -0
- package/dist/Avatar.d.mts +20 -0
- package/dist/Avatar.d.ts +20 -0
- package/dist/Avatar.js +234 -0
- package/dist/Avatar.mjs +3 -0
- package/dist/Badge.d.mts +26 -0
- package/dist/Badge.d.ts +26 -0
- package/dist/Badge.js +247 -0
- package/dist/Badge.mjs +4 -0
- package/dist/Button.d.mts +25 -0
- package/dist/Button.d.ts +25 -0
- package/dist/Button.js +414 -0
- package/dist/Button.mjs +8 -0
- package/dist/ButtonGroup.d.mts +26 -0
- package/dist/ButtonGroup.d.ts +26 -0
- package/dist/ButtonGroup.js +52 -0
- package/dist/ButtonGroup.mjs +2 -0
- package/dist/Card.d.mts +39 -0
- package/dist/Card.d.ts +39 -0
- package/dist/Card.js +329 -0
- package/dist/Card.mjs +7 -0
- package/dist/CategoryStrip.d.mts +26 -0
- package/dist/CategoryStrip.d.ts +26 -0
- package/dist/CategoryStrip.js +396 -0
- package/dist/CategoryStrip.mjs +9 -0
- package/dist/Checkbox.d.mts +14 -0
- package/dist/Checkbox.d.ts +14 -0
- package/dist/Checkbox.js +304 -0
- package/dist/Checkbox.mjs +7 -0
- package/dist/Chip.d.mts +31 -0
- package/dist/Chip.d.ts +31 -0
- package/dist/Chip.js +370 -0
- package/dist/Chip.mjs +8 -0
- package/dist/ConfirmDialog.d.mts +15 -0
- package/dist/ConfirmDialog.d.ts +15 -0
- package/dist/ConfirmDialog.js +530 -0
- package/dist/ConfirmDialog.mjs +9 -0
- package/dist/CurrencyDisplay.d.mts +24 -0
- package/dist/CurrencyDisplay.d.ts +24 -0
- package/dist/CurrencyDisplay.js +189 -0
- package/dist/CurrencyDisplay.mjs +3 -0
- package/dist/CurrencyInput.d.mts +26 -0
- package/dist/CurrencyInput.d.ts +26 -0
- package/dist/CurrencyInput.js +404 -0
- package/dist/CurrencyInput.mjs +7 -0
- package/dist/DetailRow.d.mts +32 -0
- package/dist/DetailRow.d.ts +32 -0
- package/dist/DetailRow.js +275 -0
- package/dist/DetailRow.mjs +4 -0
- package/dist/EmptyState.d.mts +27 -0
- package/dist/EmptyState.d.ts +27 -0
- package/dist/EmptyState.js +503 -0
- package/dist/EmptyState.mjs +9 -0
- package/dist/Form.d.mts +52 -0
- package/dist/Form.d.ts +52 -0
- package/dist/Form.js +204 -0
- package/dist/Form.mjs +3 -0
- package/dist/IconButton.d.mts +22 -0
- package/dist/IconButton.d.ts +22 -0
- package/dist/IconButton.js +383 -0
- package/dist/IconButton.mjs +7 -0
- package/dist/Input.d.mts +23 -0
- package/dist/Input.d.ts +23 -0
- package/dist/Input.js +351 -0
- package/dist/Input.mjs +6 -0
- package/dist/LabelValue.d.mts +16 -0
- package/dist/LabelValue.d.ts +16 -0
- package/dist/LabelValue.js +225 -0
- package/dist/LabelValue.mjs +4 -0
- package/dist/ListGroup.d.mts +34 -0
- package/dist/ListGroup.d.ts +34 -0
- package/dist/ListGroup.js +217 -0
- package/dist/ListGroup.mjs +4 -0
- package/dist/ListItem.d.mts +64 -0
- package/dist/ListItem.d.ts +64 -0
- package/dist/ListItem.js +430 -0
- package/dist/ListItem.mjs +8 -0
- package/dist/MediaCard.d.mts +39 -0
- package/dist/MediaCard.d.ts +39 -0
- package/dist/MediaCard.js +427 -0
- package/dist/MediaCard.mjs +8 -0
- package/dist/MenuGroup.d.mts +34 -0
- package/dist/MenuGroup.d.ts +34 -0
- package/dist/MenuGroup.js +217 -0
- package/dist/MenuGroup.mjs +4 -0
- package/dist/MenuItem.d.mts +48 -0
- package/dist/MenuItem.d.ts +48 -0
- package/dist/MenuItem.js +403 -0
- package/dist/MenuItem.mjs +8 -0
- package/dist/MonthPicker.d.mts +20 -0
- package/dist/MonthPicker.d.ts +20 -0
- package/dist/MonthPicker.js +234 -0
- package/dist/MonthPicker.mjs +4 -0
- package/dist/Pressable.d.mts +34 -0
- package/dist/Pressable.d.ts +34 -0
- package/dist/Pressable.js +132 -0
- package/dist/Pressable.mjs +4 -0
- package/dist/Progress.d.mts +14 -0
- package/dist/Progress.d.ts +14 -0
- package/dist/Progress.js +191 -0
- package/dist/Progress.mjs +4 -0
- package/dist/RadioGroup.d.mts +19 -0
- package/dist/RadioGroup.d.ts +19 -0
- package/dist/RadioGroup.js +341 -0
- package/dist/RadioGroup.mjs +7 -0
- package/dist/Select.d.mts +22 -0
- package/dist/Select.d.ts +22 -0
- package/dist/Select.js +441 -0
- package/dist/Select.mjs +6 -0
- package/dist/Separator.d.mts +10 -0
- package/dist/Separator.d.ts +10 -0
- package/dist/Separator.js +156 -0
- package/dist/Separator.mjs +2 -0
- package/dist/Sheet.d.mts +81 -0
- package/dist/Sheet.d.ts +81 -0
- package/dist/Sheet.js +340 -0
- package/dist/Sheet.mjs +4 -0
- package/dist/Skeleton.d.mts +17 -0
- package/dist/Skeleton.d.ts +17 -0
- package/dist/Skeleton.js +205 -0
- package/dist/Skeleton.mjs +4 -0
- package/dist/Slider.d.mts +20 -0
- package/dist/Slider.d.ts +20 -0
- package/dist/Slider.js +232 -0
- package/dist/Slider.mjs +4 -0
- package/dist/Spinner.d.mts +12 -0
- package/dist/Spinner.d.ts +12 -0
- package/dist/Spinner.js +172 -0
- package/dist/Spinner.mjs +3 -0
- package/dist/Switch.d.mts +13 -0
- package/dist/Switch.d.ts +13 -0
- package/dist/Switch.js +261 -0
- package/dist/Switch.mjs +5 -0
- package/dist/Tabs.d.mts +27 -0
- package/dist/Tabs.d.ts +27 -0
- package/dist/Tabs.js +389 -0
- package/dist/Tabs.mjs +6 -0
- package/dist/Text.d.mts +12 -0
- package/dist/Text.d.ts +12 -0
- package/dist/Text.js +311 -0
- package/dist/Text.mjs +4 -0
- package/dist/Textarea.d.mts +16 -0
- package/dist/Textarea.d.ts +16 -0
- package/dist/Textarea.js +333 -0
- package/dist/Textarea.mjs +6 -0
- package/dist/Toast.d.mts +47 -0
- package/dist/Toast.d.ts +47 -0
- package/dist/Toast.js +185 -0
- package/dist/Toast.mjs +3 -0
- package/dist/Toggle.d.mts +33 -0
- package/dist/Toggle.d.ts +33 -0
- package/dist/Toggle.js +397 -0
- package/dist/Toggle.mjs +8 -0
- package/dist/VirtualList.d.mts +19 -0
- package/dist/VirtualList.d.ts +19 -0
- package/dist/VirtualList.js +38 -0
- package/dist/VirtualList.mjs +1 -0
- package/dist/chunk-2CE3TQVY.mjs +11 -0
- package/dist/chunk-2UYENBLV.mjs +49 -0
- package/dist/chunk-3BBOZ3OQ.mjs +41 -0
- package/dist/chunk-5IKW3VNC.mjs +43 -0
- package/dist/chunk-63357L2X.mjs +51 -0
- package/dist/chunk-6LQYY7HC.mjs +127 -0
- package/dist/chunk-6Q64UFIA.mjs +71 -0
- package/dist/chunk-76PFOSM2.mjs +41 -0
- package/dist/chunk-7H2OR44A.mjs +14 -0
- package/dist/chunk-A4MDAP7G.mjs +42 -0
- package/dist/chunk-AU2VDY4P.mjs +190 -0
- package/dist/chunk-BRKYVJVV.mjs +60 -0
- package/dist/chunk-CRYBX2CM.mjs +146 -0
- package/dist/chunk-DITNP6PL.mjs +106 -0
- package/dist/chunk-FTLJOUOQ.mjs +97 -0
- package/dist/chunk-GCWOGZYL.mjs +104 -0
- package/dist/chunk-GNGLDL6Z.mjs +60 -0
- package/dist/chunk-GPOUINK5.mjs +148 -0
- package/dist/chunk-HSPSMN6U.mjs +115 -0
- package/dist/chunk-IRRY3CRZ.mjs +82 -0
- package/dist/chunk-JB67UOB5.mjs +92 -0
- package/dist/chunk-JBLL7U3U.mjs +64 -0
- package/dist/chunk-KWCPOM6W.mjs +136 -0
- package/dist/chunk-KZJRQOIU.mjs +64 -0
- package/dist/chunk-L7E7TVEZ.mjs +145 -0
- package/dist/chunk-LG4DO3DK.mjs +174 -0
- package/dist/chunk-LWG526VX.mjs +139 -0
- package/dist/chunk-MN7OG7IY.mjs +96 -0
- package/dist/chunk-MX6HRKMI.mjs +29 -0
- package/dist/chunk-NC5ZTR2Y.mjs +32 -0
- package/dist/chunk-NQGVLMWG.mjs +90 -0
- package/dist/chunk-QCNARS3X.mjs +46 -0
- package/dist/chunk-QXGYKWI7.mjs +134 -0
- package/dist/chunk-QY3X2UYR.mjs +191 -0
- package/dist/chunk-RKLHUDZS.mjs +92 -0
- package/dist/chunk-RMMK64W5.mjs +54 -0
- package/dist/chunk-RR2VQLKE.mjs +190 -0
- package/dist/chunk-RTC3CFXF.mjs +29 -0
- package/dist/chunk-SBZYEV4S.mjs +61 -0
- package/dist/chunk-SOA2Z4RB.mjs +82 -0
- package/dist/chunk-SOYNZDVY.mjs +151 -0
- package/dist/chunk-T7XZ7H7Y.mjs +57 -0
- package/dist/chunk-TAJ2PQ2O.mjs +163 -0
- package/dist/chunk-U4N7WF4Z.mjs +108 -0
- package/dist/chunk-URDE3EUU.mjs +132 -0
- package/dist/chunk-URLL5JBR.mjs +245 -0
- package/dist/chunk-XDMN67KV.mjs +59 -0
- package/dist/chunk-Y6MXOREN.mjs +120 -0
- package/dist/chunk-YZJAFS4P.mjs +131 -0
- package/dist/index.d.mts +94 -852
- package/dist/index.d.ts +94 -852
- package/dist/index.js +1387 -942
- package/dist/index.mjs +50 -3844
- package/package.json +23 -14
- package/src/assets/fonts/Sohne-Bold.otf +0 -0
- package/src/assets/fonts/Sohne-BoldItalic.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraBold.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraBoldItalic.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraLight.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraLightItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Italic.otf +0 -0
- package/src/assets/fonts/Sohne-Light.otf +0 -0
- package/src/assets/fonts/Sohne-LightItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Medium.otf +0 -0
- package/src/assets/fonts/Sohne-MediumItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Regular.otf +0 -0
- package/src/assets/fonts/Sohne-SemiBold.otf +0 -0
- package/src/assets/fonts/Sohne-SemiBoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Bold.otf +0 -0
- package/src/assets/fonts/SohneMono-BoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraBold.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraBoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraLight.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraLightItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Italic.otf +0 -0
- package/src/assets/fonts/SohneMono-Light.otf +0 -0
- package/src/assets/fonts/SohneMono-LightItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Medium.otf +0 -0
- package/src/assets/fonts/SohneMono-MediumItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Regular.otf +0 -0
- package/src/assets/fonts/SohneMono-SemiBold.otf +0 -0
- package/src/assets/fonts/SohneMono-SemiBoldItalic.otf +0 -0
- package/src/components/Accordion/Accordion.tsx +13 -15
- package/src/components/AlertBanner/AlertBanner.tsx +33 -12
- package/src/components/Avatar/Avatar.tsx +4 -2
- package/src/components/Badge/Badge.tsx +4 -2
- package/src/components/Button/Button.tsx +30 -29
- package/src/components/ButtonGroup/ButtonGroup.tsx +13 -10
- package/src/components/Card/Card.tsx +36 -65
- package/src/components/CategoryStrip/CategoryStrip.tsx +68 -58
- package/src/components/Checkbox/Checkbox.tsx +41 -55
- package/src/components/Chip/Chip.tsx +49 -84
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +2 -2
- package/src/components/CurrencyDisplay/CurrencyDisplay.tsx +4 -2
- package/src/components/CurrencyInput/CurrencyInput.tsx +2 -2
- package/src/components/DetailRow/DetailRow.tsx +9 -7
- package/src/components/EmptyState/EmptyState.tsx +2 -2
- package/src/components/Form/Form.tsx +149 -0
- package/src/components/Form/index.ts +1 -0
- package/src/components/IconButton/IconButton.tsx +24 -20
- package/src/components/Input/Input.tsx +63 -50
- package/src/components/LabelValue/LabelValue.tsx +6 -4
- package/src/components/ListGroup/ListGroup.tsx +145 -0
- package/src/components/ListGroup/index.ts +1 -0
- package/src/components/ListItem/ListItem.tsx +30 -43
- package/src/components/MediaCard/MediaCard.tsx +31 -29
- package/src/components/MenuGroup/MenuGroup.tsx +145 -0
- package/src/components/MenuGroup/index.ts +1 -0
- package/src/components/MenuItem/MenuItem.tsx +29 -40
- package/src/components/MonthPicker/MonthPicker.tsx +14 -4
- package/src/components/Pressable/Pressable.tsx +27 -46
- package/src/components/Progress/Progress.tsx +21 -12
- package/src/components/RadioGroup/RadioGroup.tsx +55 -32
- package/src/components/Select/Select.tsx +23 -21
- package/src/components/Separator/Separator.tsx +1 -3
- package/src/components/Sheet/Sheet.tsx +85 -18
- package/src/components/Skeleton/Skeleton.tsx +25 -14
- package/src/components/Slider/Slider.tsx +13 -3
- package/src/components/Spinner/Spinner.tsx +1 -1
- package/src/components/Switch/Switch.tsx +70 -52
- package/src/components/Tabs/Tabs.tsx +59 -47
- package/src/components/Text/Text.tsx +3 -1
- package/src/components/Textarea/Textarea.tsx +44 -23
- package/src/components/Toast/Toast.tsx +6 -6
- package/src/components/Toggle/Toggle.tsx +86 -68
- package/src/components/VirtualList/VirtualList.tsx +60 -0
- package/src/components/VirtualList/index.ts +1 -0
- package/src/fonts.ts +38 -20
- package/src/index.ts +5 -1
- package/src/theme/colors.ts +53 -39
- package/src/theme/types.ts +3 -0
- package/src/tokens.ts +49 -39
- package/src/utils/animations.ts +58 -0
- package/src/utils/icons.ts +47 -20
- package/src/utils/useColorTransition.ts +40 -0
- package/src/utils/usePressScale.ts +75 -0
- package/src/assets/fonts/Poppins-Black.ttf +0 -0
- package/src/assets/fonts/Poppins-BlackItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Bold.ttf +0 -0
- package/src/assets/fonts/Poppins-BoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraBold.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraLight.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Italic.ttf +0 -0
- package/src/assets/fonts/Poppins-Light.ttf +0 -0
- package/src/assets/fonts/Poppins-LightItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Medium.ttf +0 -0
- package/src/assets/fonts/Poppins-MediumItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Regular.ttf +0 -0
- package/src/assets/fonts/Poppins-SemiBold.ttf +0 -0
- package/src/assets/fonts/Poppins-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Thin.ttf +0 -0
- package/src/assets/fonts/Poppins-ThinItalic.ttf +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
type ListGroupVariant = 'plain' | 'card';
|
|
5
|
+
interface ListGroupProps {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* - `plain` (default): no background, plain ListItems inside.
|
|
9
|
+
* - `card`: card surface with background + border wrapping plain ListItems.
|
|
10
|
+
*/
|
|
11
|
+
variant?: ListGroupVariant;
|
|
12
|
+
style?: ViewStyle;
|
|
13
|
+
}
|
|
14
|
+
interface ListGroupHeaderProps {
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
style?: ViewStyle;
|
|
17
|
+
}
|
|
18
|
+
interface ListGroupFooterProps {
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
style?: ViewStyle;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* ListGroup wraps multiple ListItems and auto-adds separators between them.
|
|
24
|
+
* Use variant="card" for a standalone surface or "plain" for items inside another container.
|
|
25
|
+
*/
|
|
26
|
+
declare function ListGroup({ children, variant, style }: ListGroupProps): React.JSX.Element;
|
|
27
|
+
declare namespace ListGroup {
|
|
28
|
+
var Header: typeof ListGroupHeader;
|
|
29
|
+
var Footer: typeof ListGroupFooter;
|
|
30
|
+
}
|
|
31
|
+
declare function ListGroupHeader({ children, style }: ListGroupHeaderProps): React.JSX.Element;
|
|
32
|
+
declare function ListGroupFooter({ children, style }: ListGroupFooterProps): React.JSX.Element;
|
|
33
|
+
|
|
34
|
+
export { ListGroup, ListGroupFooter, type ListGroupFooterProps, ListGroupHeader, type ListGroupHeaderProps, type ListGroupProps, type ListGroupVariant };
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React2 = require('react');
|
|
4
|
+
var reactNative = require('react-native');
|
|
5
|
+
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
10
|
+
|
|
11
|
+
// src/components/ListGroup/ListGroup.tsx
|
|
12
|
+
|
|
13
|
+
// src/theme/colorUtils.ts
|
|
14
|
+
function hexToRgb(hex) {
|
|
15
|
+
const clean = hex.replace("#", "");
|
|
16
|
+
const full = clean.length === 3 ? clean.split("").map((c) => c + c).join("") : clean;
|
|
17
|
+
if (full.length !== 6) return null;
|
|
18
|
+
return {
|
|
19
|
+
r: parseInt(full.slice(0, 2), 16),
|
|
20
|
+
g: parseInt(full.slice(2, 4), 16),
|
|
21
|
+
b: parseInt(full.slice(4, 6), 16)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function componentToHex(c) {
|
|
25
|
+
return Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, "0");
|
|
26
|
+
}
|
|
27
|
+
function rgbToHex(r, g, b) {
|
|
28
|
+
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;
|
|
29
|
+
}
|
|
30
|
+
function withAlphaOnWhite(hex, alpha) {
|
|
31
|
+
const rgb = hexToRgb(hex);
|
|
32
|
+
if (!rgb) return hex;
|
|
33
|
+
const r = rgb.r * alpha + 255 * (1 - alpha);
|
|
34
|
+
const g = rgb.g * alpha + 255 * (1 - alpha);
|
|
35
|
+
const b = rgb.b * alpha + 255 * (1 - alpha);
|
|
36
|
+
return rgbToHex(r, g, b);
|
|
37
|
+
}
|
|
38
|
+
function withAlphaOnDark(hex, alpha, bgHex = "#0f0f0f") {
|
|
39
|
+
const rgb = hexToRgb(hex);
|
|
40
|
+
const bg = hexToRgb(bgHex);
|
|
41
|
+
if (!rgb || !bg) return hex;
|
|
42
|
+
const r = rgb.r * alpha + bg.r * (1 - alpha);
|
|
43
|
+
const g = rgb.g * alpha + bg.g * (1 - alpha);
|
|
44
|
+
const b = rgb.b * alpha + bg.b * (1 - alpha);
|
|
45
|
+
return rgbToHex(r, g, b);
|
|
46
|
+
}
|
|
47
|
+
function mixWithBackground(fgHex, bgHex, opacity) {
|
|
48
|
+
const fg = hexToRgb(fgHex);
|
|
49
|
+
const bg = hexToRgb(bgHex);
|
|
50
|
+
if (!fg || !bg) return fgHex;
|
|
51
|
+
const r = fg.r * opacity + bg.r * (1 - opacity);
|
|
52
|
+
const g = fg.g * opacity + bg.g * (1 - opacity);
|
|
53
|
+
const b = fg.b * opacity + bg.b * (1 - opacity);
|
|
54
|
+
return rgbToHex(r, g, b);
|
|
55
|
+
}
|
|
56
|
+
function lighten(hex, amount) {
|
|
57
|
+
return withAlphaOnWhite(hex, 1 - amount);
|
|
58
|
+
}
|
|
59
|
+
function darken(hex, amount) {
|
|
60
|
+
const rgb = hexToRgb(hex);
|
|
61
|
+
if (!rgb) return hex;
|
|
62
|
+
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/theme/colors.ts
|
|
66
|
+
var defaultLight = {
|
|
67
|
+
background: "#ffffff",
|
|
68
|
+
foreground: "#1a1a1a",
|
|
69
|
+
card: "#ffffff",
|
|
70
|
+
primary: "#1a1a1a",
|
|
71
|
+
primaryForeground: "#ffffff",
|
|
72
|
+
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
73
|
+
accent: "#d4561d",
|
|
74
|
+
accentForeground: "#ffffff",
|
|
75
|
+
border: "#dddddd",
|
|
76
|
+
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
77
|
+
destructive: "#c72828",
|
|
78
|
+
destructiveForeground: "#ffffff",
|
|
79
|
+
success: "#1a7a45",
|
|
80
|
+
successForeground: "#ffffff",
|
|
81
|
+
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
82
|
+
warning: "#9a5200",
|
|
83
|
+
warningForeground: "#ffffff"
|
|
84
|
+
};
|
|
85
|
+
function deriveColors(t, scheme) {
|
|
86
|
+
const dark = scheme === "dark";
|
|
87
|
+
const bg = t.background;
|
|
88
|
+
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
89
|
+
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
90
|
+
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
91
|
+
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
92
|
+
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
93
|
+
const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
|
|
94
|
+
const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
|
|
95
|
+
const successBorder = dark ? withAlphaOnDark(t.success, 0.45, bg) : withAlphaOnWhite(t.success, 0.3);
|
|
96
|
+
const warningTint = dark ? withAlphaOnDark(t.warning, 0.15, bg) : withAlphaOnWhite(t.warning, 0.08);
|
|
97
|
+
const warningBorder = dark ? withAlphaOnDark(t.warning, 0.45, bg) : withAlphaOnWhite(t.warning, 0.3);
|
|
98
|
+
return {
|
|
99
|
+
...t,
|
|
100
|
+
foregroundSubtle,
|
|
101
|
+
foregroundMuted,
|
|
102
|
+
surface,
|
|
103
|
+
surfaceStrong,
|
|
104
|
+
destructiveTint,
|
|
105
|
+
destructiveBorder,
|
|
106
|
+
successTint,
|
|
107
|
+
successBorder,
|
|
108
|
+
warningTint,
|
|
109
|
+
warningBorder,
|
|
110
|
+
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
111
|
+
accentResolved: t.accent ?? t.primary,
|
|
112
|
+
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
113
|
+
ring: t.accent ?? t.primary,
|
|
114
|
+
input: t.border,
|
|
115
|
+
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/theme/ThemeProvider.tsx
|
|
120
|
+
var ThemeContext = React2.createContext({
|
|
121
|
+
colors: deriveColors(defaultLight, "light"),
|
|
122
|
+
colorScheme: "light"
|
|
123
|
+
});
|
|
124
|
+
function useTheme() {
|
|
125
|
+
const context = React2.useContext(ThemeContext);
|
|
126
|
+
if (!context) {
|
|
127
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
128
|
+
}
|
|
129
|
+
return context;
|
|
130
|
+
}
|
|
131
|
+
var isWeb = reactNative.Platform.OS === "web";
|
|
132
|
+
var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
133
|
+
var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
|
|
134
|
+
|
|
135
|
+
// src/tokens.ts
|
|
136
|
+
var RADIUS = {
|
|
137
|
+
md: 14};
|
|
138
|
+
|
|
139
|
+
// src/components/ListGroup/ListGroup.tsx
|
|
140
|
+
function ListGroup({ children, variant = "plain", style }) {
|
|
141
|
+
const { colors } = useTheme();
|
|
142
|
+
const processedChildren = React2__default.default.Children.map(children, (child, index) => {
|
|
143
|
+
if (!React2__default.default.isValidElement(child)) return child;
|
|
144
|
+
if (child.type === ListGroupHeader || child.type === ListGroupFooter) {
|
|
145
|
+
return child;
|
|
146
|
+
}
|
|
147
|
+
const childProps = child.props;
|
|
148
|
+
const isListItem = "title" in childProps;
|
|
149
|
+
if (!isListItem) return child;
|
|
150
|
+
const isLast = index === React2__default.default.Children.count(children) - 1;
|
|
151
|
+
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
152
|
+
return React2__default.default.cloneElement(child, {
|
|
153
|
+
showSeparator: true
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return child;
|
|
157
|
+
});
|
|
158
|
+
const cardStyle = variant === "card" ? {
|
|
159
|
+
backgroundColor: colors.card,
|
|
160
|
+
borderRadius: RADIUS.md,
|
|
161
|
+
borderWidth: 1,
|
|
162
|
+
borderColor: colors.border,
|
|
163
|
+
shadowColor: "#000",
|
|
164
|
+
shadowOffset: { width: 0, height: 2 },
|
|
165
|
+
shadowOpacity: 0.06,
|
|
166
|
+
shadowRadius: 6,
|
|
167
|
+
elevation: 2,
|
|
168
|
+
paddingVertical: vs(4)
|
|
169
|
+
} : {};
|
|
170
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.container, cardStyle, style] }, processedChildren);
|
|
171
|
+
}
|
|
172
|
+
function ListGroupHeader({ children, style }) {
|
|
173
|
+
const { colors } = useTheme();
|
|
174
|
+
if (typeof children === "string") {
|
|
175
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
176
|
+
}
|
|
177
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
178
|
+
}
|
|
179
|
+
function ListGroupFooter({ children, style }) {
|
|
180
|
+
const { colors } = useTheme();
|
|
181
|
+
if (typeof children === "string") {
|
|
182
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
183
|
+
}
|
|
184
|
+
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, children);
|
|
185
|
+
}
|
|
186
|
+
ListGroup.Header = ListGroupHeader;
|
|
187
|
+
ListGroup.Footer = ListGroupFooter;
|
|
188
|
+
var styles = reactNative.StyleSheet.create({
|
|
189
|
+
container: {
|
|
190
|
+
overflow: "hidden"
|
|
191
|
+
},
|
|
192
|
+
header: {
|
|
193
|
+
paddingHorizontal: s(16),
|
|
194
|
+
paddingTop: vs(12),
|
|
195
|
+
paddingBottom: vs(8),
|
|
196
|
+
borderBottomWidth: reactNative.StyleSheet.hairlineWidth
|
|
197
|
+
},
|
|
198
|
+
headerText: {
|
|
199
|
+
fontFamily: "Sohne-SemiBold",
|
|
200
|
+
fontSize: 13,
|
|
201
|
+
letterSpacing: 0.32,
|
|
202
|
+
textTransform: "uppercase"
|
|
203
|
+
},
|
|
204
|
+
footer: {
|
|
205
|
+
paddingHorizontal: s(16),
|
|
206
|
+
paddingTop: vs(8),
|
|
207
|
+
paddingBottom: vs(12)
|
|
208
|
+
},
|
|
209
|
+
footerText: {
|
|
210
|
+
fontFamily: "Sohne-Regular",
|
|
211
|
+
fontSize: 12
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
exports.ListGroup = ListGroup;
|
|
216
|
+
exports.ListGroupFooter = ListGroupFooter;
|
|
217
|
+
exports.ListGroupHeader = ListGroupHeader;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewStyle, TextStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
type ListItemVariant = 'plain' | 'card';
|
|
5
|
+
interface ListItemProps {
|
|
6
|
+
/**
|
|
7
|
+
* Arbitrary content rendered on the left (avatar, icon, image, etc.).
|
|
8
|
+
* Rendered inside a 44×44 aligned container.
|
|
9
|
+
*/
|
|
10
|
+
leftRender?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Arbitrary content rendered on the right (badge, price, chevron, switch, etc.).
|
|
13
|
+
* Replaces the old `trailing` prop (still accepted as an alias).
|
|
14
|
+
*/
|
|
15
|
+
rightRender?: React.ReactNode | string;
|
|
16
|
+
/** @deprecated Use `rightRender` instead. */
|
|
17
|
+
trailing?: React.ReactNode | string;
|
|
18
|
+
/** @deprecated Use `leftRender` instead. */
|
|
19
|
+
icon?: React.ReactNode;
|
|
20
|
+
/**
|
|
21
|
+
* Icon name from `@expo/vector-icons` rendered in the left slot.
|
|
22
|
+
* See https://icons.expo.fyi. Takes precedence over `leftRender`.
|
|
23
|
+
*/
|
|
24
|
+
leftIcon?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Icon name from `@expo/vector-icons` rendered in the right slot.
|
|
27
|
+
* See https://icons.expo.fyi. Takes precedence over `rightRender`.
|
|
28
|
+
*/
|
|
29
|
+
rightIcon?: string;
|
|
30
|
+
/** Override the resolved left icon color. Defaults to `foreground`. */
|
|
31
|
+
leftIconColor?: string;
|
|
32
|
+
/** Override the resolved right icon color. Defaults to `mutedForeground`. */
|
|
33
|
+
rightIconColor?: string;
|
|
34
|
+
title: string;
|
|
35
|
+
/** Secondary line below the title. */
|
|
36
|
+
subtitle?: string;
|
|
37
|
+
/** Tertiary / caption line below the subtitle. */
|
|
38
|
+
caption?: string;
|
|
39
|
+
/**
|
|
40
|
+
* - `plain` (default): no background, no border — designed to sit inside a parent surface (Card, list wrapper, etc.)
|
|
41
|
+
* - `card`: standalone surface with background, border and shadow.
|
|
42
|
+
*/
|
|
43
|
+
variant?: ListItemVariant;
|
|
44
|
+
/** Show a right-pointing chevron on the far right. Ignored when `rightRender` / `trailing` is set. */
|
|
45
|
+
showChevron?: boolean;
|
|
46
|
+
/** Visual separator line at the bottom of the item. Useful when rendering multiple plain items in a list. */
|
|
47
|
+
showSeparator?: boolean;
|
|
48
|
+
onPress?: () => void;
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
/** Style applied to the outer container. */
|
|
51
|
+
style?: ViewStyle;
|
|
52
|
+
/** Style applied to the title Text. */
|
|
53
|
+
titleStyle?: TextStyle;
|
|
54
|
+
/** Style applied to the subtitle Text. */
|
|
55
|
+
subtitleStyle?: TextStyle;
|
|
56
|
+
/** Style applied to the caption Text. */
|
|
57
|
+
captionStyle?: TextStyle;
|
|
58
|
+
/** Accessibility label override. Defaults to the title. */
|
|
59
|
+
accessibilityLabel?: string;
|
|
60
|
+
}
|
|
61
|
+
declare function ListItemBase({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
|
|
62
|
+
declare const ListItem: React.MemoExoticComponent<typeof ListItemBase>;
|
|
63
|
+
|
|
64
|
+
export { ListItem, type ListItemProps };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ViewStyle, TextStyle } from 'react-native';
|
|
3
|
+
|
|
4
|
+
type ListItemVariant = 'plain' | 'card';
|
|
5
|
+
interface ListItemProps {
|
|
6
|
+
/**
|
|
7
|
+
* Arbitrary content rendered on the left (avatar, icon, image, etc.).
|
|
8
|
+
* Rendered inside a 44×44 aligned container.
|
|
9
|
+
*/
|
|
10
|
+
leftRender?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Arbitrary content rendered on the right (badge, price, chevron, switch, etc.).
|
|
13
|
+
* Replaces the old `trailing` prop (still accepted as an alias).
|
|
14
|
+
*/
|
|
15
|
+
rightRender?: React.ReactNode | string;
|
|
16
|
+
/** @deprecated Use `rightRender` instead. */
|
|
17
|
+
trailing?: React.ReactNode | string;
|
|
18
|
+
/** @deprecated Use `leftRender` instead. */
|
|
19
|
+
icon?: React.ReactNode;
|
|
20
|
+
/**
|
|
21
|
+
* Icon name from `@expo/vector-icons` rendered in the left slot.
|
|
22
|
+
* See https://icons.expo.fyi. Takes precedence over `leftRender`.
|
|
23
|
+
*/
|
|
24
|
+
leftIcon?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Icon name from `@expo/vector-icons` rendered in the right slot.
|
|
27
|
+
* See https://icons.expo.fyi. Takes precedence over `rightRender`.
|
|
28
|
+
*/
|
|
29
|
+
rightIcon?: string;
|
|
30
|
+
/** Override the resolved left icon color. Defaults to `foreground`. */
|
|
31
|
+
leftIconColor?: string;
|
|
32
|
+
/** Override the resolved right icon color. Defaults to `mutedForeground`. */
|
|
33
|
+
rightIconColor?: string;
|
|
34
|
+
title: string;
|
|
35
|
+
/** Secondary line below the title. */
|
|
36
|
+
subtitle?: string;
|
|
37
|
+
/** Tertiary / caption line below the subtitle. */
|
|
38
|
+
caption?: string;
|
|
39
|
+
/**
|
|
40
|
+
* - `plain` (default): no background, no border — designed to sit inside a parent surface (Card, list wrapper, etc.)
|
|
41
|
+
* - `card`: standalone surface with background, border and shadow.
|
|
42
|
+
*/
|
|
43
|
+
variant?: ListItemVariant;
|
|
44
|
+
/** Show a right-pointing chevron on the far right. Ignored when `rightRender` / `trailing` is set. */
|
|
45
|
+
showChevron?: boolean;
|
|
46
|
+
/** Visual separator line at the bottom of the item. Useful when rendering multiple plain items in a list. */
|
|
47
|
+
showSeparator?: boolean;
|
|
48
|
+
onPress?: () => void;
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
/** Style applied to the outer container. */
|
|
51
|
+
style?: ViewStyle;
|
|
52
|
+
/** Style applied to the title Text. */
|
|
53
|
+
titleStyle?: TextStyle;
|
|
54
|
+
/** Style applied to the subtitle Text. */
|
|
55
|
+
subtitleStyle?: TextStyle;
|
|
56
|
+
/** Style applied to the caption Text. */
|
|
57
|
+
captionStyle?: TextStyle;
|
|
58
|
+
/** Accessibility label override. Defaults to the title. */
|
|
59
|
+
accessibilityLabel?: string;
|
|
60
|
+
}
|
|
61
|
+
declare function ListItemBase({ leftRender, rightRender, trailing, icon, leftIcon, rightIcon, leftIconColor, rightIconColor, title, subtitle, caption, variant, showChevron, showSeparator, onPress, disabled, style, titleStyle, subtitleStyle, captionStyle, accessibilityLabel, }: ListItemProps): React.JSX.Element;
|
|
62
|
+
declare const ListItem: React.MemoExoticComponent<typeof ListItemBase>;
|
|
63
|
+
|
|
64
|
+
export { ListItem, type ListItemProps };
|