@lmb-it/kitsconcerto-native 0.1.277 → 0.1.284
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/Avatar/index.cjs +1 -0
- package/components/Avatar/index.cjs.map +1 -1
- package/components/Avatar/index.js +1 -0
- package/components/Avatar/index.js.map +1 -1
- package/components/Banner/banner.cjs +1 -0
- package/components/Banner/banner.cjs.map +1 -1
- package/components/Banner/banner.js +1 -0
- package/components/Banner/banner.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/BreadCrumb/index.cjs.map +1 -1
- package/components/BreadCrumb/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/Carousel/index.cjs +1 -0
- package/components/Carousel/index.cjs.map +1 -1
- package/components/Carousel/index.js +1 -0
- package/components/Carousel/index.js.map +1 -1
- package/components/ChatBubble/index.cjs +1 -0
- package/components/ChatBubble/index.cjs.map +1 -1
- package/components/ChatBubble/index.js +1 -0
- package/components/ChatBubble/index.js.map +1 -1
- package/components/Chip/index.cjs +1 -0
- package/components/Chip/index.cjs.map +1 -1
- package/components/Chip/index.js +1 -0
- package/components/Chip/index.js.map +1 -1
- package/components/DateSeparator/index.cjs +1 -0
- package/components/DateSeparator/index.cjs.map +1 -1
- package/components/DateSeparator/index.js +1 -0
- package/components/DateSeparator/index.js.map +1 -1
- package/components/DetailsList/index.cjs +1 -0
- package/components/DetailsList/index.cjs.map +1 -1
- package/components/DetailsList/index.js +1 -0
- package/components/DetailsList/index.js.map +1 -1
- package/components/EmptyState/index.cjs +1 -0
- package/components/EmptyState/index.cjs.map +1 -1
- package/components/EmptyState/index.js +1 -0
- package/components/EmptyState/index.js.map +1 -1
- package/components/Gallery/index.cjs +1 -0
- package/components/Gallery/index.cjs.map +1 -1
- package/components/Gallery/index.js +1 -0
- package/components/Gallery/index.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/MessageReceipt/index.cjs +1 -0
- package/components/MessageReceipt/index.cjs.map +1 -1
- package/components/MessageReceipt/index.js +1 -0
- package/components/MessageReceipt/index.js.map +1 -1
- package/components/ProgressBar/index.cjs +1 -0
- package/components/ProgressBar/index.cjs.map +1 -1
- package/components/ProgressBar/index.js +1 -0
- package/components/ProgressBar/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/StatCard/index.cjs +1 -0
- package/components/StatCard/index.cjs.map +1 -1
- package/components/StatCard/index.js +1 -0
- package/components/StatCard/index.js.map +1 -1
- package/components/Stepper/index.cjs +1 -0
- package/components/Stepper/index.cjs.map +1 -1
- package/components/Stepper/index.js +1 -0
- package/components/Stepper/index.js.map +1 -1
- package/components/Tabs/index.cjs +1 -0
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +1 -0
- package/components/Tabs/index.js.map +1 -1
- package/components/Timeline/index.cjs +1 -0
- package/components/Timeline/index.cjs.map +1 -1
- package/components/Timeline/index.js +1 -0
- package/components/Timeline/index.js.map +1 -1
- package/components/Translate/index.cjs +1 -0
- package/components/Translate/index.cjs.map +1 -1
- package/components/Translate/index.js +1 -0
- package/components/Translate/index.js.map +1 -1
- package/components/TypingIndicator/index.cjs +1 -0
- package/components/TypingIndicator/index.cjs.map +1 -1
- package/components/TypingIndicator/index.js +1 -0
- package/components/TypingIndicator/index.js.map +1 -1
- package/components/overlay/ConfirmDialog/index.cjs +1 -0
- package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
- package/components/overlay/ConfirmDialog/index.js +1 -0
- package/components/overlay/ConfirmDialog/index.js.map +1 -1
- package/components/overlay/Dialog/index.cjs +1 -0
- package/components/overlay/Dialog/index.cjs.map +1 -1
- package/components/overlay/Dialog/index.js +1 -0
- package/components/overlay/Dialog/index.js.map +1 -1
- package/contexts/BreadcrumbContext.cjs +33 -0
- package/contexts/BreadcrumbContext.cjs.map +1 -0
- package/contexts/BreadcrumbContext.js +28 -0
- package/contexts/BreadcrumbContext.js.map +1 -0
- package/form/controls/Checkbox/index.cjs +1 -0
- package/form/controls/Checkbox/index.cjs.map +1 -1
- package/form/controls/Checkbox/index.js +1 -0
- package/form/controls/Checkbox/index.js.map +1 -1
- package/form/controls/RadioButton/radio.cjs +1 -0
- package/form/controls/RadioButton/radio.cjs.map +1 -1
- package/form/controls/RadioButton/radio.js +1 -0
- package/form/controls/RadioButton/radio.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/index.cjs +1 -0
- package/form/file-pickers/index.cjs.map +1 -1
- package/form/file-pickers/index.js +1 -0
- package/form/file-pickers/index.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/inputs/ColorPicker/index.cjs +1 -0
- package/form/inputs/ColorPicker/index.cjs.map +1 -1
- package/form/inputs/ColorPicker/index.js +1 -0
- package/form/inputs/ColorPicker/index.js.map +1 -1
- package/form/inputs/Datepicker/index.cjs +1 -0
- package/form/inputs/Datepicker/index.cjs.map +1 -1
- package/form/inputs/Datepicker/index.js +1 -0
- package/form/inputs/Datepicker/index.js.map +1 -1
- package/form/inputs/InputLocation/index.cjs +1 -0
- package/form/inputs/InputLocation/index.cjs.map +1 -1
- package/form/inputs/InputLocation/index.js +1 -0
- package/form/inputs/InputLocation/index.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/CascadeSelect/index.cjs +1 -0
- package/form/selects/CascadeSelect/index.cjs.map +1 -1
- package/form/selects/CascadeSelect/index.js +1 -0
- package/form/selects/CascadeSelect/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
- package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.js +1 -0
- package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
- package/form-renderer/components/fields/Group/index.cjs +1 -0
- package/form-renderer/components/fields/Group/index.cjs.map +1 -1
- package/form-renderer/components/fields/Group/index.js +1 -0
- package/form-renderer/components/fields/Group/index.js.map +1 -1
- package/form-renderer/components/fields/Radios/index.cjs +1 -0
- package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
- package/form-renderer/components/fields/Radios/index.js +1 -0
- package/form-renderer/components/fields/Radios/index.js.map +1 -1
- package/form-renderer/components/fields/Select/index.cjs +1 -0
- package/form-renderer/components/fields/Select/index.cjs.map +1 -1
- package/form-renderer/components/fields/Select/index.js +1 -0
- package/form-renderer/components/fields/Select/index.js.map +1 -1
- package/hooks/main.cjs +1 -0
- package/hooks/main.cjs.map +1 -1
- package/hooks/main.js +1 -0
- package/hooks/main.js.map +1 -1
- package/hooks/useBreadcrumbTrail.cjs +21 -0
- package/hooks/useBreadcrumbTrail.cjs.map +1 -0
- package/hooks/useBreadcrumbTrail.js +16 -0
- package/hooks/useBreadcrumbTrail.js.map +1 -0
- package/index.cjs +5 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +144 -5
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Timeline/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {ITimelineProps, ITimelineItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {node: 18, font: 9, title: 13, desc: 11, meta: 10, gap: 10, pad: 14},\n md: {node: 24, font: 11, title: 14, desc: 12, meta: 11, gap: 12, pad: 18},\n} as const;\n\n/**\n * Timeline — vertical status tracker with done / active / pending nodes and\n * connectors. Cross-platform and presentational (Box + Text + Icon).\n *\n * Covers the pending-review timeline (Received → Auto-checks → Specialist →\n * Outcome), team activity feeds, \"what's next\" numbered steps, and the\n * micro-deposit steps.\n *\n * <Timeline items={[\n * {title:'Document received', status:'done'},\n * {title:'Specialist review', description:'In progress', status:'active'},\n * {title:'Outcome', description:'Up next', status:'pending'},\n * ]} />\n * <Timeline numbered items={steps} />\n */\nexport function Timeline(rawProps: ITimelineProps) {\n const props = useComponentDefaults<ITimelineProps>(\"Timeline\", rawProps).mergedProps;\n const {items, numbered = false, size = \"md\", activeColor = \"brand\", trackColor = \"gray.200\", testID, ...rest} = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"list\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const renderNode = (item: ITimelineItem, i: number) => {\n const status = item.status ?? \"pending\";\n const accent = item.color ?? activeColor;\n const done = status === \"done\";\n const active = status === \"active\";\n\n const bg = done ? accent : \"surface-card\";\n const border = done ? accent : active ? accent : trackColor;\n const glyphColor = done ? \"#FFFFFF\" : active ? accent : \"ink.400\";\n\n let glyph: React.ReactNode;\n if (item.icon != null) {\n glyph = <Icon name={item.icon as never} size={Math.round(cfg.node * 0.55)} color={glyphColor} />;\n } else if (numbered) {\n glyph = (\n <Text fontSize={cfg.font} fontWeight=\"700\" color={glyphColor}>\n {i + 1}\n </Text>\n );\n } else if (done) {\n glyph = <Icon name=\"check\" size={Math.round(cfg.node * 0.55)} color=\"#FFFFFF\" />;\n } else {\n // active = filled dot, pending = small muted dot\n const d = active ? Math.round(cfg.node * 0.38) : Math.round(cfg.node * 0.28);\n glyph = <Box width={d} height={d} borderRadius={999} bgColor={active ? accent : \"ink.300\"} />;\n }\n\n return (\n <Box\n width={cfg.node}\n height={cfg.node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={bg}\n borderWidth={done ? 0 : 2}\n borderColor={border}\n >\n {glyph}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" {...(rest as any)} {...(a11yProps as any)}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n const status = item.status ?? \"pending\";\n const connectorColor = status === \"done\" ? item.color ?? activeColor : trackColor;\n\n return (\n <Box key={i} flexDirection=\"row\" alignItems=\"stretch\" gap={cfg.gap}>\n {/* rail: node + connector */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n {renderNode(item, i)}\n {!isLast && (\n <Box\n width={2}\n flex={1}\n minHeight={14}\n marginTop={2}\n marginBottom={2}\n borderRadius={999}\n bgColor={connectorColor}\n />\n )}\n </Box>\n\n {/* content */}\n <Box flex={1} flexDirection=\"column\" paddingBottom={isLast ? 0 : cfg.pad}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" gap={8}>\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n {item.meta != null && (\n <Text fontSize={cfg.meta} color=\"text-secondary\" whiteSpace=\"nowrap\">\n {item.meta}\n </Text>\n )}\n </Box>\n {item.description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" marginTop={2}>\n {item.description}\n </Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nexport default Timeline;\n"],"names":["useComponentDefaults","jsx","Icon","Text","Box","jsxs"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Timeline/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {ITimelineProps, ITimelineItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {node: 18, font: 9, title: 13, desc: 11, meta: 10, gap: 10, pad: 14},\n md: {node: 24, font: 11, title: 14, desc: 12, meta: 11, gap: 12, pad: 18},\n} as const;\n\n/**\n * Timeline — vertical status tracker with done / active / pending nodes and\n * connectors. Cross-platform and presentational (Box + Text + Icon).\n *\n * Covers the pending-review timeline (Received → Auto-checks → Specialist →\n * Outcome), team activity feeds, \"what's next\" numbered steps, and the\n * micro-deposit steps.\n *\n * <Timeline items={[\n * {title:'Document received', status:'done'},\n * {title:'Specialist review', description:'In progress', status:'active'},\n * {title:'Outcome', description:'Up next', status:'pending'},\n * ]} />\n * <Timeline numbered items={steps} />\n */\nexport function Timeline(rawProps: ITimelineProps) {\n const props = useComponentDefaults<ITimelineProps>(\"Timeline\", rawProps).mergedProps;\n const {items, numbered = false, size = \"md\", activeColor = \"brand\", trackColor = \"gray.200\", testID, ...rest} = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"list\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const renderNode = (item: ITimelineItem, i: number) => {\n const status = item.status ?? \"pending\";\n const accent = item.color ?? activeColor;\n const done = status === \"done\";\n const active = status === \"active\";\n\n const bg = done ? accent : \"surface-card\";\n const border = done ? accent : active ? accent : trackColor;\n const glyphColor = done ? \"#FFFFFF\" : active ? accent : \"ink.400\";\n\n let glyph: React.ReactNode;\n if (item.icon != null) {\n glyph = <Icon name={item.icon as never} size={Math.round(cfg.node * 0.55)} color={glyphColor} />;\n } else if (numbered) {\n glyph = (\n <Text fontSize={cfg.font} fontWeight=\"700\" color={glyphColor}>\n {i + 1}\n </Text>\n );\n } else if (done) {\n glyph = <Icon name=\"check\" size={Math.round(cfg.node * 0.55)} color=\"#FFFFFF\" />;\n } else {\n // active = filled dot, pending = small muted dot\n const d = active ? Math.round(cfg.node * 0.38) : Math.round(cfg.node * 0.28);\n glyph = <Box width={d} height={d} borderRadius={999} bgColor={active ? accent : \"ink.300\"} />;\n }\n\n return (\n <Box\n width={cfg.node}\n height={cfg.node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={bg}\n borderWidth={done ? 0 : 2}\n borderColor={border}\n >\n {glyph}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" {...(rest as any)} {...(a11yProps as any)}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n const status = item.status ?? \"pending\";\n const connectorColor = status === \"done\" ? item.color ?? activeColor : trackColor;\n\n return (\n <Box key={i} flexDirection=\"row\" alignItems=\"stretch\" gap={cfg.gap}>\n {/* rail: node + connector */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n {renderNode(item, i)}\n {!isLast && (\n <Box\n width={2}\n flex={1}\n minHeight={14}\n marginTop={2}\n marginBottom={2}\n borderRadius={999}\n bgColor={connectorColor}\n />\n )}\n </Box>\n\n {/* content */}\n <Box flex={1} flexDirection=\"column\" paddingBottom={isLast ? 0 : cfg.pad}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" gap={8}>\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n {item.meta != null && (\n <Text fontSize={cfg.meta} color=\"text-secondary\" whiteSpace=\"nowrap\">\n {item.meta}\n </Text>\n )}\n </Box>\n {item.description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" marginTop={2}>\n {item.description}\n </Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nexport default Timeline;\n"],"names":["useComponentDefaults","jsx","Icon","Text","Box","jsxs"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { Icon } from '../../primitives/Icon/index.js';
|
|
|
5
5
|
import 'react';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
7
|
import '../../contexts/PermissionsContext.js';
|
|
8
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
8
9
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
9
10
|
|
|
10
11
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Timeline/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {ITimelineProps, ITimelineItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {node: 18, font: 9, title: 13, desc: 11, meta: 10, gap: 10, pad: 14},\n md: {node: 24, font: 11, title: 14, desc: 12, meta: 11, gap: 12, pad: 18},\n} as const;\n\n/**\n * Timeline — vertical status tracker with done / active / pending nodes and\n * connectors. Cross-platform and presentational (Box + Text + Icon).\n *\n * Covers the pending-review timeline (Received → Auto-checks → Specialist →\n * Outcome), team activity feeds, \"what's next\" numbered steps, and the\n * micro-deposit steps.\n *\n * <Timeline items={[\n * {title:'Document received', status:'done'},\n * {title:'Specialist review', description:'In progress', status:'active'},\n * {title:'Outcome', description:'Up next', status:'pending'},\n * ]} />\n * <Timeline numbered items={steps} />\n */\nexport function Timeline(rawProps: ITimelineProps) {\n const props = useComponentDefaults<ITimelineProps>(\"Timeline\", rawProps).mergedProps;\n const {items, numbered = false, size = \"md\", activeColor = \"brand\", trackColor = \"gray.200\", testID, ...rest} = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"list\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const renderNode = (item: ITimelineItem, i: number) => {\n const status = item.status ?? \"pending\";\n const accent = item.color ?? activeColor;\n const done = status === \"done\";\n const active = status === \"active\";\n\n const bg = done ? accent : \"surface-card\";\n const border = done ? accent : active ? accent : trackColor;\n const glyphColor = done ? \"#FFFFFF\" : active ? accent : \"ink.400\";\n\n let glyph: React.ReactNode;\n if (item.icon != null) {\n glyph = <Icon name={item.icon as never} size={Math.round(cfg.node * 0.55)} color={glyphColor} />;\n } else if (numbered) {\n glyph = (\n <Text fontSize={cfg.font} fontWeight=\"700\" color={glyphColor}>\n {i + 1}\n </Text>\n );\n } else if (done) {\n glyph = <Icon name=\"check\" size={Math.round(cfg.node * 0.55)} color=\"#FFFFFF\" />;\n } else {\n // active = filled dot, pending = small muted dot\n const d = active ? Math.round(cfg.node * 0.38) : Math.round(cfg.node * 0.28);\n glyph = <Box width={d} height={d} borderRadius={999} bgColor={active ? accent : \"ink.300\"} />;\n }\n\n return (\n <Box\n width={cfg.node}\n height={cfg.node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={bg}\n borderWidth={done ? 0 : 2}\n borderColor={border}\n >\n {glyph}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" {...(rest as any)} {...(a11yProps as any)}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n const status = item.status ?? \"pending\";\n const connectorColor = status === \"done\" ? item.color ?? activeColor : trackColor;\n\n return (\n <Box key={i} flexDirection=\"row\" alignItems=\"stretch\" gap={cfg.gap}>\n {/* rail: node + connector */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n {renderNode(item, i)}\n {!isLast && (\n <Box\n width={2}\n flex={1}\n minHeight={14}\n marginTop={2}\n marginBottom={2}\n borderRadius={999}\n bgColor={connectorColor}\n />\n )}\n </Box>\n\n {/* content */}\n <Box flex={1} flexDirection=\"column\" paddingBottom={isLast ? 0 : cfg.pad}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" gap={8}>\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n {item.meta != null && (\n <Text fontSize={cfg.meta} color=\"text-secondary\" whiteSpace=\"nowrap\">\n {item.meta}\n </Text>\n )}\n </Box>\n {item.description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" marginTop={2}>\n {item.description}\n </Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nexport default Timeline;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Timeline/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {ITimelineProps, ITimelineItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {node: 18, font: 9, title: 13, desc: 11, meta: 10, gap: 10, pad: 14},\n md: {node: 24, font: 11, title: 14, desc: 12, meta: 11, gap: 12, pad: 18},\n} as const;\n\n/**\n * Timeline — vertical status tracker with done / active / pending nodes and\n * connectors. Cross-platform and presentational (Box + Text + Icon).\n *\n * Covers the pending-review timeline (Received → Auto-checks → Specialist →\n * Outcome), team activity feeds, \"what's next\" numbered steps, and the\n * micro-deposit steps.\n *\n * <Timeline items={[\n * {title:'Document received', status:'done'},\n * {title:'Specialist review', description:'In progress', status:'active'},\n * {title:'Outcome', description:'Up next', status:'pending'},\n * ]} />\n * <Timeline numbered items={steps} />\n */\nexport function Timeline(rawProps: ITimelineProps) {\n const props = useComponentDefaults<ITimelineProps>(\"Timeline\", rawProps).mergedProps;\n const {items, numbered = false, size = \"md\", activeColor = \"brand\", trackColor = \"gray.200\", testID, ...rest} = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"list\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const renderNode = (item: ITimelineItem, i: number) => {\n const status = item.status ?? \"pending\";\n const accent = item.color ?? activeColor;\n const done = status === \"done\";\n const active = status === \"active\";\n\n const bg = done ? accent : \"surface-card\";\n const border = done ? accent : active ? accent : trackColor;\n const glyphColor = done ? \"#FFFFFF\" : active ? accent : \"ink.400\";\n\n let glyph: React.ReactNode;\n if (item.icon != null) {\n glyph = <Icon name={item.icon as never} size={Math.round(cfg.node * 0.55)} color={glyphColor} />;\n } else if (numbered) {\n glyph = (\n <Text fontSize={cfg.font} fontWeight=\"700\" color={glyphColor}>\n {i + 1}\n </Text>\n );\n } else if (done) {\n glyph = <Icon name=\"check\" size={Math.round(cfg.node * 0.55)} color=\"#FFFFFF\" />;\n } else {\n // active = filled dot, pending = small muted dot\n const d = active ? Math.round(cfg.node * 0.38) : Math.round(cfg.node * 0.28);\n glyph = <Box width={d} height={d} borderRadius={999} bgColor={active ? accent : \"ink.300\"} />;\n }\n\n return (\n <Box\n width={cfg.node}\n height={cfg.node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={bg}\n borderWidth={done ? 0 : 2}\n borderColor={border}\n >\n {glyph}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\" {...(rest as any)} {...(a11yProps as any)}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n const status = item.status ?? \"pending\";\n const connectorColor = status === \"done\" ? item.color ?? activeColor : trackColor;\n\n return (\n <Box key={i} flexDirection=\"row\" alignItems=\"stretch\" gap={cfg.gap}>\n {/* rail: node + connector */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n {renderNode(item, i)}\n {!isLast && (\n <Box\n width={2}\n flex={1}\n minHeight={14}\n marginTop={2}\n marginBottom={2}\n borderRadius={999}\n bgColor={connectorColor}\n />\n )}\n </Box>\n\n {/* content */}\n <Box flex={1} flexDirection=\"column\" paddingBottom={isLast ? 0 : cfg.pad}>\n <Box flexDirection=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\" gap={8}>\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n {item.meta != null && (\n <Text fontSize={cfg.meta} color=\"text-secondary\" whiteSpace=\"nowrap\">\n {item.meta}\n </Text>\n )}\n </Box>\n {item.description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" marginTop={2}>\n {item.description}\n </Text>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nexport default Timeline;\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ require('react');
|
|
|
7
7
|
var locale = require('../../hooks/locale.cjs');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
9
|
require('../../contexts/PermissionsContext.cjs');
|
|
10
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
10
11
|
|
|
11
12
|
const Translate = ({ label, children }) => {
|
|
12
13
|
const { t } = locale.useLanguage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Translate/index.tsx"],"sourcesContent":["import React, {type PropsWithChildren} from \"react\";\nimport {useLanguage} from \"../../hooks\";\nimport type {ITranslateComponent} from \"@lmb-it/kitsconcerto-types\";\n\nconst Translate = ({label, children}: PropsWithChildren<ITranslateComponent>) => {\n const {t} = useLanguage();\n\n\n return (\n <>\n {label\n ? t(label)\n : typeof children == \"string\"\n ? t(children)\n : children}\n </>\n );\n}\nexport default Translate;\n"],"names":["useLanguage","jsx","Fragment"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Translate/index.tsx"],"sourcesContent":["import React, {type PropsWithChildren} from \"react\";\nimport {useLanguage} from \"../../hooks\";\nimport type {ITranslateComponent} from \"@lmb-it/kitsconcerto-types\";\n\nconst Translate = ({label, children}: PropsWithChildren<ITranslateComponent>) => {\n const {t} = useLanguage();\n\n\n return (\n <>\n {label\n ? t(label)\n : typeof children == \"string\"\n ? t(children)\n : children}\n </>\n );\n}\nexport default Translate;\n"],"names":["useLanguage","jsx","Fragment"],"mappings":";;;;;;;;;;;AAIA,MAAM,SAAA,GAAY,CAAC,EAAC,KAAA,EAAO,UAAQ,KAA8C;AAC7E,EAAA,MAAM,EAAC,CAAA,EAAC,GAAIA,kBAAA,EAAY;AAGxB,EAAA,uBACIC,cAAA,CAAAC,mBAAA,EAAA,EACK,QAAA,EAAA,KAAA,GACK,CAAA,CAAE,KAAK,CAAA,GACP,OAAO,QAAA,IAAY,QAAA,GACf,CAAA,CAAE,QAAQ,CAAA,GACV,QAAA,EACd,CAAA;AAER;;;;"}
|
|
@@ -3,6 +3,7 @@ import 'react';
|
|
|
3
3
|
import { useLanguage } from '../../hooks/locale.js';
|
|
4
4
|
import '../../contexts/DialogContext.js';
|
|
5
5
|
import '../../contexts/PermissionsContext.js';
|
|
6
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
6
7
|
|
|
7
8
|
const Translate = ({ label, children }) => {
|
|
8
9
|
const { t } = useLanguage();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Translate/index.tsx"],"sourcesContent":["import React, {type PropsWithChildren} from \"react\";\nimport {useLanguage} from \"../../hooks\";\nimport type {ITranslateComponent} from \"@lmb-it/kitsconcerto-types\";\n\nconst Translate = ({label, children}: PropsWithChildren<ITranslateComponent>) => {\n const {t} = useLanguage();\n\n\n return (\n <>\n {label\n ? t(label)\n : typeof children == \"string\"\n ? t(children)\n : children}\n </>\n );\n}\nexport default Translate;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Translate/index.tsx"],"sourcesContent":["import React, {type PropsWithChildren} from \"react\";\nimport {useLanguage} from \"../../hooks\";\nimport type {ITranslateComponent} from \"@lmb-it/kitsconcerto-types\";\n\nconst Translate = ({label, children}: PropsWithChildren<ITranslateComponent>) => {\n const {t} = useLanguage();\n\n\n return (\n <>\n {label\n ? t(label)\n : typeof children == \"string\"\n ? t(children)\n : children}\n </>\n );\n}\nexport default Translate;\n"],"names":[],"mappings":";;;;;;;AAIA,MAAM,SAAA,GAAY,CAAC,EAAC,KAAA,EAAO,UAAQ,KAA8C;AAC7E,EAAA,MAAM,EAAC,CAAA,EAAC,GAAI,WAAA,EAAY;AAGxB,EAAA,uBACI,GAAA,CAAA,QAAA,EAAA,EACK,QAAA,EAAA,KAAA,GACK,CAAA,CAAE,KAAK,CAAA,GACP,OAAO,QAAA,IAAY,QAAA,GACf,CAAA,CAAE,QAAQ,CAAA,GACV,QAAA,EACd,CAAA;AAER;;;;"}
|
|
@@ -5,6 +5,7 @@ var React = require('react');
|
|
|
5
5
|
var reactNative = require('react-native');
|
|
6
6
|
require('../../contexts/DialogContext.cjs');
|
|
7
7
|
require('../../contexts/PermissionsContext.cjs');
|
|
8
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
8
9
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
9
10
|
var useRtlLineHeight = require('../../hooks/useRtlLineHeight.cjs');
|
|
10
11
|
var KitsThemeProvider_native = require('../../contexts/Theme/KitsThemeProvider.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/TypingIndicator/index.native.tsx"],"sourcesContent":["import React, {useEffect, useRef} from \"react\";\nimport {View, Text, Animated, Easing} from \"react-native\";\nimport type {ITypingIndicatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\n/**\n * TypingIndicator (native) — three dots pulsing via RN `Animated` (opacity only,\n * which is native-driver-safe), optionally inside an incoming-style bubble, with\n * an optional resolved caption. Mirrors CircularProgress.native (Animated.loop +\n * useNativeDriver). Each loop is stopped on unmount. Colours resolve from tokens.\n */\nexport function TypingIndicator(rawProps: ITypingIndicatorProps) {\n const props = useComponentDefaults<ITypingIndicatorProps>(\"TypingIndicator\", rawProps).mergedProps;\n const {label, dotColor = \"text-secondary\", bubble = true, bubbleColor = \"surface-muted\", testID} = props;\n const {resolveToken} = useKitsTheme();\n const dot = resolveToken(dotColor);\n const bg = resolveToken(bubbleColor);\n const labelColor = resolveToken(\"text-secondary\");\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. This renders a RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural line box — and NotoKufiArabic's is too short for\n * its own ascenders, cutting the glyph along its top edge. In an RTL\n * script that does not read as clipping, it reads as a BAD TRANSLATION:\n * ش/س, غ/ع and ة/ه differ only by marks above the baseline.\n * ⚠️ undefined in LTR, so no English layout moves.\n */\n const rtlLineHeight = useRtlLineHeight(undefined, 11);\n\n const d0 = useRef(new Animated.Value(0.3)).current;\n const d1 = useRef(new Animated.Value(0.3)).current;\n const d2 = useRef(new Animated.Value(0.3)).current;\n\n useEffect(() => {\n const values = [d0, d1, d2];\n const loops = values.map((v, i) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(i * 180),\n Animated.timing(v, {toValue: 1, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n Animated.timing(v, {toValue: 0.3, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n ]),\n ),\n );\n loops.forEach(l => l.start());\n return () => loops.forEach(l => l.stop());\n }, [d0, d1, d2]);\n\n const dots = (\n <View style={{flexDirection: \"row\", gap: 5, alignItems: \"center\"}}>\n {[d0, d1, d2].map((v, i) => (\n <Animated.View key={i} style={{width: 7, height: 7, borderRadius: 9999, backgroundColor: dot, opacity: v}} />\n ))}\n </View>\n );\n\n return (\n <View testID={testID} style={{alignItems: \"flex-start\", gap: 4}}>\n {label != null && <Text style={{fontSize: 11, fontWeight: \"600\", color: labelColor, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>{label}</Text>}\n {bubble ? (\n <View\n style={{\n backgroundColor: bg,\n borderRadius: 16,\n borderBottomLeftRadius: 4,\n paddingVertical: 10,\n paddingHorizontal: 14,\n alignSelf: \"flex-start\",\n }}\n >\n {dots}\n </View>\n ) : (\n dots\n )}\n </View>\n );\n}\n\nexport default TypingIndicator;\n"],"names":["useComponentDefaults","useKitsTheme","useRtlLineHeight","useRef","Animated","useEffect","Easing","jsx","View","jsxs","Text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/TypingIndicator/index.native.tsx"],"sourcesContent":["import React, {useEffect, useRef} from \"react\";\nimport {View, Text, Animated, Easing} from \"react-native\";\nimport type {ITypingIndicatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\n/**\n * TypingIndicator (native) — three dots pulsing via RN `Animated` (opacity only,\n * which is native-driver-safe), optionally inside an incoming-style bubble, with\n * an optional resolved caption. Mirrors CircularProgress.native (Animated.loop +\n * useNativeDriver). Each loop is stopped on unmount. Colours resolve from tokens.\n */\nexport function TypingIndicator(rawProps: ITypingIndicatorProps) {\n const props = useComponentDefaults<ITypingIndicatorProps>(\"TypingIndicator\", rawProps).mergedProps;\n const {label, dotColor = \"text-secondary\", bubble = true, bubbleColor = \"surface-muted\", testID} = props;\n const {resolveToken} = useKitsTheme();\n const dot = resolveToken(dotColor);\n const bg = resolveToken(bubbleColor);\n const labelColor = resolveToken(\"text-secondary\");\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. This renders a RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural line box — and NotoKufiArabic's is too short for\n * its own ascenders, cutting the glyph along its top edge. In an RTL\n * script that does not read as clipping, it reads as a BAD TRANSLATION:\n * ش/س, غ/ع and ة/ه differ only by marks above the baseline.\n * ⚠️ undefined in LTR, so no English layout moves.\n */\n const rtlLineHeight = useRtlLineHeight(undefined, 11);\n\n const d0 = useRef(new Animated.Value(0.3)).current;\n const d1 = useRef(new Animated.Value(0.3)).current;\n const d2 = useRef(new Animated.Value(0.3)).current;\n\n useEffect(() => {\n const values = [d0, d1, d2];\n const loops = values.map((v, i) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(i * 180),\n Animated.timing(v, {toValue: 1, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n Animated.timing(v, {toValue: 0.3, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n ]),\n ),\n );\n loops.forEach(l => l.start());\n return () => loops.forEach(l => l.stop());\n }, [d0, d1, d2]);\n\n const dots = (\n <View style={{flexDirection: \"row\", gap: 5, alignItems: \"center\"}}>\n {[d0, d1, d2].map((v, i) => (\n <Animated.View key={i} style={{width: 7, height: 7, borderRadius: 9999, backgroundColor: dot, opacity: v}} />\n ))}\n </View>\n );\n\n return (\n <View testID={testID} style={{alignItems: \"flex-start\", gap: 4}}>\n {label != null && <Text style={{fontSize: 11, fontWeight: \"600\", color: labelColor, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>{label}</Text>}\n {bubble ? (\n <View\n style={{\n backgroundColor: bg,\n borderRadius: 16,\n borderBottomLeftRadius: 4,\n paddingVertical: 10,\n paddingHorizontal: 14,\n alignSelf: \"flex-start\",\n }}\n >\n {dots}\n </View>\n ) : (\n dots\n )}\n </View>\n );\n}\n\nexport default TypingIndicator;\n"],"names":["useComponentDefaults","useKitsTheme","useRtlLineHeight","useRef","Animated","useEffect","Easing","jsx","View","jsxs","Text"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { useRef, useEffect } from 'react';
|
|
|
3
3
|
import { Animated, Easing, View, Text } from 'react-native';
|
|
4
4
|
import '../../contexts/DialogContext.js';
|
|
5
5
|
import '../../contexts/PermissionsContext.js';
|
|
6
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
6
7
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
7
8
|
import useRtlLineHeight from '../../hooks/useRtlLineHeight.js';
|
|
8
9
|
import { useKitsTheme } from '../../contexts/Theme/KitsThemeProvider.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/TypingIndicator/index.native.tsx"],"sourcesContent":["import React, {useEffect, useRef} from \"react\";\nimport {View, Text, Animated, Easing} from \"react-native\";\nimport type {ITypingIndicatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\n/**\n * TypingIndicator (native) — three dots pulsing via RN `Animated` (opacity only,\n * which is native-driver-safe), optionally inside an incoming-style bubble, with\n * an optional resolved caption. Mirrors CircularProgress.native (Animated.loop +\n * useNativeDriver). Each loop is stopped on unmount. Colours resolve from tokens.\n */\nexport function TypingIndicator(rawProps: ITypingIndicatorProps) {\n const props = useComponentDefaults<ITypingIndicatorProps>(\"TypingIndicator\", rawProps).mergedProps;\n const {label, dotColor = \"text-secondary\", bubble = true, bubbleColor = \"surface-muted\", testID} = props;\n const {resolveToken} = useKitsTheme();\n const dot = resolveToken(dotColor);\n const bg = resolveToken(bubbleColor);\n const labelColor = resolveToken(\"text-secondary\");\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. This renders a RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural line box — and NotoKufiArabic's is too short for\n * its own ascenders, cutting the glyph along its top edge. In an RTL\n * script that does not read as clipping, it reads as a BAD TRANSLATION:\n * ش/س, غ/ع and ة/ه differ only by marks above the baseline.\n * ⚠️ undefined in LTR, so no English layout moves.\n */\n const rtlLineHeight = useRtlLineHeight(undefined, 11);\n\n const d0 = useRef(new Animated.Value(0.3)).current;\n const d1 = useRef(new Animated.Value(0.3)).current;\n const d2 = useRef(new Animated.Value(0.3)).current;\n\n useEffect(() => {\n const values = [d0, d1, d2];\n const loops = values.map((v, i) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(i * 180),\n Animated.timing(v, {toValue: 1, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n Animated.timing(v, {toValue: 0.3, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n ]),\n ),\n );\n loops.forEach(l => l.start());\n return () => loops.forEach(l => l.stop());\n }, [d0, d1, d2]);\n\n const dots = (\n <View style={{flexDirection: \"row\", gap: 5, alignItems: \"center\"}}>\n {[d0, d1, d2].map((v, i) => (\n <Animated.View key={i} style={{width: 7, height: 7, borderRadius: 9999, backgroundColor: dot, opacity: v}} />\n ))}\n </View>\n );\n\n return (\n <View testID={testID} style={{alignItems: \"flex-start\", gap: 4}}>\n {label != null && <Text style={{fontSize: 11, fontWeight: \"600\", color: labelColor, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>{label}</Text>}\n {bubble ? (\n <View\n style={{\n backgroundColor: bg,\n borderRadius: 16,\n borderBottomLeftRadius: 4,\n paddingVertical: 10,\n paddingHorizontal: 14,\n alignSelf: \"flex-start\",\n }}\n >\n {dots}\n </View>\n ) : (\n dots\n )}\n </View>\n );\n}\n\nexport default TypingIndicator;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/TypingIndicator/index.native.tsx"],"sourcesContent":["import React, {useEffect, useRef} from \"react\";\nimport {View, Text, Animated, Easing} from \"react-native\";\nimport type {ITypingIndicatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\n/**\n * TypingIndicator (native) — three dots pulsing via RN `Animated` (opacity only,\n * which is native-driver-safe), optionally inside an incoming-style bubble, with\n * an optional resolved caption. Mirrors CircularProgress.native (Animated.loop +\n * useNativeDriver). Each loop is stopped on unmount. Colours resolve from tokens.\n */\nexport function TypingIndicator(rawProps: ITypingIndicatorProps) {\n const props = useComponentDefaults<ITypingIndicatorProps>(\"TypingIndicator\", rawProps).mergedProps;\n const {label, dotColor = \"text-secondary\", bubble = true, bubbleColor = \"surface-muted\", testID} = props;\n const {resolveToken} = useKitsTheme();\n const dot = resolveToken(dotColor);\n const bg = resolveToken(bubbleColor);\n const labelColor = resolveToken(\"text-secondary\");\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. This renders a RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural line box — and NotoKufiArabic's is too short for\n * its own ascenders, cutting the glyph along its top edge. In an RTL\n * script that does not read as clipping, it reads as a BAD TRANSLATION:\n * ش/س, غ/ع and ة/ه differ only by marks above the baseline.\n * ⚠️ undefined in LTR, so no English layout moves.\n */\n const rtlLineHeight = useRtlLineHeight(undefined, 11);\n\n const d0 = useRef(new Animated.Value(0.3)).current;\n const d1 = useRef(new Animated.Value(0.3)).current;\n const d2 = useRef(new Animated.Value(0.3)).current;\n\n useEffect(() => {\n const values = [d0, d1, d2];\n const loops = values.map((v, i) =>\n Animated.loop(\n Animated.sequence([\n Animated.delay(i * 180),\n Animated.timing(v, {toValue: 1, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n Animated.timing(v, {toValue: 0.3, duration: 400, easing: Easing.inOut(Easing.ease), useNativeDriver: true}),\n ]),\n ),\n );\n loops.forEach(l => l.start());\n return () => loops.forEach(l => l.stop());\n }, [d0, d1, d2]);\n\n const dots = (\n <View style={{flexDirection: \"row\", gap: 5, alignItems: \"center\"}}>\n {[d0, d1, d2].map((v, i) => (\n <Animated.View key={i} style={{width: 7, height: 7, borderRadius: 9999, backgroundColor: dot, opacity: v}} />\n ))}\n </View>\n );\n\n return (\n <View testID={testID} style={{alignItems: \"flex-start\", gap: 4}}>\n {label != null && <Text style={{fontSize: 11, fontWeight: \"600\", color: labelColor, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>{label}</Text>}\n {bubble ? (\n <View\n style={{\n backgroundColor: bg,\n borderRadius: 16,\n borderBottomLeftRadius: 4,\n paddingVertical: 10,\n paddingHorizontal: 14,\n alignSelf: \"flex-start\",\n }}\n >\n {dots}\n </View>\n ) : (\n dots\n )}\n </View>\n );\n}\n\nexport default TypingIndicator;\n"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ var reactNativeSafeAreaContext = require('react-native-safe-area-context');
|
|
|
10
10
|
var useSeverityColors = require('../../../hooks/useSeverityColors.cjs');
|
|
11
11
|
require('../../../contexts/DialogContext.cjs');
|
|
12
12
|
require('../../../contexts/PermissionsContext.cjs');
|
|
13
|
+
require('../../../contexts/BreadcrumbContext.cjs');
|
|
13
14
|
var useResolvedStyle = require('../../../hooks/useResolvedStyle.cjs');
|
|
14
15
|
var index = require('../../../animations/index.cjs');
|
|
15
16
|
var sheetMotion_native = require('../sheetMotion.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["useKitsTheme","useSeverityColors","useAllSeverityColors","useSafeAreaInsets","useResolvedStyle","jsx","View","Pressable","Text","jsxs","Fragment","Modal","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","sheetEnter","sheetExit","ZoomIn","ZoomOut","Easing","runOnJS","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["useKitsTheme","useSeverityColors","useAllSeverityColors","useSafeAreaInsets","useResolvedStyle","jsx","View","Pressable","Text","jsxs","Fragment","Modal","FadeIn","anim","FadeOut","scrimExitDuration","StyleSheet","sheetEnter","sheetExit","ZoomIn","ZoomOut","Easing","runOnJS","Icon"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
|
6
6
|
import { useSeverityColors, useAllSeverityColors } from '../../../hooks/useSeverityColors.js';
|
|
7
7
|
import '../../../contexts/DialogContext.js';
|
|
8
8
|
import '../../../contexts/PermissionsContext.js';
|
|
9
|
+
import '../../../contexts/BreadcrumbContext.js';
|
|
9
10
|
import useResolvedStyle from '../../../hooks/useResolvedStyle.js';
|
|
10
11
|
import { scrimExitDuration, overlayAnimations } from '../../../animations/index.js';
|
|
11
12
|
import { sheetExit, sheetEnter } from '../sheetMotion.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["anim"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/ConfirmDialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, StyleSheet, View} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IConfirmDialogProps} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors, useAllSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim, scrimExitDuration} from \"../../../animations\";\nimport {sheetEnter, sheetExit} from \"../sheetMotion\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit cancels the panel's exit\n * (reanimated reports `finished=false`, so the unmount is skipped) and the\n * inner re-enters cleanly; `visibleRef` is a second guard for the case where\n * the exit had already completed.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsConfirm(props: IConfirmDialogProps) {\n const {\n visible,\n header,\n message,\n icon,\n type = \"secondary\",\n accept,\n reject,\n acceptLabel = \"Accept\",\n rejectLabel = \"Reject\",\n buttons,\n headless,\n defaultUI,\n async: asyncMode,\n onHide,\n content,\n children,\n position = \"center\",\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n // LEGIT-PLATFORM-ONLY (web): acceptIcon/rejectIcon take PrimeReact\n // icon classes ('pi pi-*') with no native rendering path — use the\n // `buttons` array for custom native actions. acceptClassName/\n // rejectClassName are CSS classes; appendTo is a DOM portal target.\n ...rest\n } = props;\n\n const {resolveToken, theme} = useKitsTheme();\n const colors = useSeverityColors(type);\n const allColors = useAllSeverityColors();\n const insets = useSafeAreaInsets();\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!visible);\n if (!mounted) return null;\n\n const isSheet = position === 'bottom';\n const hide = () => onHide?.('hide');\n\n const doClick = async (callback?: () => void) => {\n if (asyncMode) {\n await callback?.();\n hide();\n } else {\n hide();\n callback?.();\n }\n };\n\n const showIcon = icon != null || brandLogo != null;\n // Panel always uses surface-card. Severity (danger/success/...) only colours\n // the icon bubble and the action button — not the whole panel — otherwise\n // a danger confirm renders as a red wash with the underlying screen\n // bleeding through.\n const panelBg = surfaceColor;\n\n // Shared action row. `stretch` makes each button flex:1 (bottom-sheet,\n // full-width). The default accept/reject pair is ordered accept-first in the\n // centered card but reject-first (Cancel | Confirm) in the sheet, matching\n // the platform-native bottom-sheet convention.\n const renderActions = (stretch: boolean) => {\n if (buttons?.length) {\n return (\n <View style={styles.buttonRow}>\n {buttons.map((b, i) => {\n const btnColor = allColors[b.type ?? type]?.solid ?? colors.solid;\n return (\n <Pressable\n key={i}\n disabled={b.disabled}\n style={[\n styles.actionBtn,\n stretch && styles.actionBtnSheet,\n stretch && {flex: 1},\n b.outlined\n ? {backgroundColor: \"transparent\", borderColor: btnColor, borderWidth: 1.5}\n : {backgroundColor: btnColor},\n b.rounded && {borderRadius: 999},\n b.disabled && {opacity: 0.5},\n ]}\n onPress={() => b.onClick(hide, accept, reject)}\n >\n <Text style={{\n color: b.outlined ? btnColor : \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n }}>\n {b.title}\n </Text>\n </Pressable>\n );\n })}\n </View>\n );\n }\n\n const acceptBtn = (\n <Pressable\n key=\"accept\"\n style={[styles.actionBtn, stretch && styles.actionBtnSheet, {backgroundColor: colors.solid, flex: 1}]}\n onPress={() => doClick(accept)}\n >\n <Text style={styles.btnTextPrimary}>{acceptLabel}</Text>\n </Pressable>\n );\n const rejectBtn = !defaultUI ? (\n <Pressable\n key=\"reject\"\n style={[styles.actionBtn, styles.actionBtnOutlined, stretch && styles.actionBtnSheet, {borderColor: colors.solid, flex: 1}]}\n onPress={() => doClick(reject)}\n >\n <Text style={[styles.btnTextOutlined, {color: colors.solid}]}>{rejectLabel}</Text>\n </Pressable>\n ) : null;\n\n return (\n <View style={styles.buttonRow}>\n {stretch ? <>{rejectBtn}{acceptBtn}</> : <>{acceptBtn}{rejectBtn}</>}\n </View>\n );\n };\n\n // ── Bottom sheet ────────────────────────────────────────\n if (isSheet) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the sheet — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.sheet.exitDuration))}\n style={[styles.sheetOverlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n /* ⛔ THE SAME FAULT AS `Dialog`'s SHEET, AND THE SAME ANSWER —\n see `../sheetMotion`. `SlideInDown` takes its travel from\n the window, and inside an RN `Modal` the window it measures\n is not the screen, so the panel is placed at rest on frame\n one. Measured on the Dialog, 30 September 2026; this file\n has the identical shape, so it takes the identical fix\n rather than a second one (§5).\n ⚠️ AND THIS FILE IS NOT YET WHOLE. Its panel is still a\n CHILD of the scrim above, so it still inherits the scrim's\n fade — the defect `Dialog` had corrected on 29 September and\n that was recorded then as this file's own next unit. The\n sheet will now slide AND fade here. That is better than not\n sliding, and it is still not the ruled motion. Not fixed in\n this unit, and not left unsaid. */\n entering={sheetEnter(anim.sheet.enter)}\n exiting={sheetExit(anim.sheet.exitDuration, handleExitFinished)}\n style={[\n styles.sheetPanel,\n {backgroundColor: panelBg, paddingBottom: 24 + insets.bottom},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Grabber */}\n <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.sheetHeader, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.sheetMessage, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Injected item / extra content */}\n {children}\n\n {/* Actions */}\n {renderActions(true)}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n // ── Content-only mode (prompt) ──────────────────────────\n if (content) {\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.content.damping).stiffness(anim.confirm.content.stiffness).mass(anim.confirm.content.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380},\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {content as React.ReactNode}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n }\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n /* Contains the centred panel — see `scrimExitDuration`. */\n exiting={FadeOut.duration(scrimExitDuration(anim.confirm.exitDuration))}\n style={[styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={hide}/>\n\n {/* Card + icon stack: icon sits above the card */}\n <View style={styles.cardStack}>\n {/* Soft-circle icon bubble */}\n {showIcon && (\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.icon.damping).stiffness(anim.confirm.icon.stiffness).mass(anim.confirm.icon.mass ?? 1).delay(anim.confirm.icon.delay ?? 0)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease))}\n style={[styles.iconBubble, {backgroundColor: colors.iconBg}]}\n >\n {brandLogo ? brandLogo : typeof icon === \"string\" ? (\n <Icon name={icon as never} size={'xl'} color={colors.iconFg}/>\n ) : (\n icon\n )}\n </Animated.View>\n )}\n\n {/* Panel */}\n <Animated.View\n entering={ZoomIn.springify().damping(anim.confirm.enter.damping).stiffness(anim.confirm.enter.stiffness).mass(anim.confirm.enter.mass ?? 1)}\n exiting={ZoomOut.duration(anim.confirm.exitDuration).easing(Easing.in(Easing.ease)).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n {\n backgroundColor: panelBg,\n paddingTop: showIcon ? 48 : 24,\n gap: 10,\n },\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {/* Close button */}\n <Pressable style={styles.closeBtn} onPress={hide} hitSlop={12}>\n <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>\n </Pressable>\n\n {/* Header */}\n {header != null && (\n <Text style={[styles.header, {color: textColor}, resolvedHeaderStyle as any]}>\n {header as React.ReactNode}\n </Text>\n )}\n\n {/* Message */}\n {message != null && (\n <Text style={[styles.message, {color: subtextColor}]}>\n {message as React.ReactNode}\n </Text>\n )}\n\n {/* Children */}\n {children}\n\n {/* Buttons */}\n {renderActions(false)}\n </Animated.View>\n </View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 28,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n // 24 == radii.2xl, top corners only (bottom stays square).\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n paddingHorizontal: 24,\n paddingTop: 10,\n gap: 14,\n // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: -2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n sheetHeader: {\n fontSize: 24,\n fontWeight: \"700\",\n textAlign: \"left\",\n },\n sheetMessage: {\n fontSize: 15,\n lineHeight: 22,\n textAlign: \"left\",\n },\n cardStack: {\n minWidth: 250,\n maxWidth: 380,\n alignItems: \"center\",\n },\n iconBubble: {\n width: 72,\n height: 72,\n borderRadius: 36,\n justifyContent: \"center\",\n alignItems: \"center\",\n zIndex: 2,\n marginBottom: -36,\n elevation: 8,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 4},\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n panel: {\n alignSelf: \"stretch\",\n // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.\n borderRadius: 20,\n paddingHorizontal: 24,\n paddingBottom: 24,\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n alignItems: \"center\",\n },\n closeBtn: {\n position: \"absolute\",\n top: 12,\n right: 14,\n zIndex: 3,\n },\n header: {\n fontSize: 22,\n fontWeight: \"700\",\n textAlign: \"center\",\n marginBottom: 8,\n },\n message: {\n fontSize: 14,\n textAlign: \"center\",\n lineHeight: 20,\n // Tightened so top/bottom whitespace around the actions reads balanced.\n marginBottom: 16,\n },\n buttonRow: {\n flexDirection: \"row\",\n justifyContent: \"center\",\n gap: 12,\n width: \"100%\",\n },\n actionBtn: {\n paddingVertical: 12,\n paddingHorizontal: 24,\n // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,\n // so the pill comes from borderRadius — the pattern the `buttons` array\n // path (`b.rounded && {borderRadius: 999}`) already uses in this file.\n borderRadius: 999,\n minWidth: 100,\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n // Taller buttons for the bottom-sheet action row (pill shape shared).\n actionBtnSheet: {\n paddingVertical: 16,\n borderRadius: 999,\n },\n actionBtnOutlined: {\n backgroundColor: \"transparent\",\n borderWidth: 1.5,\n },\n btnTextPrimary: {\n color: \"#fff\",\n fontWeight: \"600\",\n fontSize: 14,\n },\n btnTextOutlined: {\n fontWeight: \"600\",\n fontSize: 14,\n },\n});\n"],"names":["anim"],"mappings":"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"}
|