@lmb-it/kitsconcerto-native 0.1.277 → 0.1.285
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/apps/mobile/src/Core/AutoComplete/index.cjs +12 -4
- package/apps/mobile/src/Core/AutoComplete/index.cjs.map +1 -1
- package/apps/mobile/src/Core/AutoComplete/index.js +12 -4
- package/apps/mobile/src/Core/AutoComplete/index.js.map +1 -1
- package/apps/mobile/src/Core/MultiSelect/index.cjs +7 -4
- package/apps/mobile/src/Core/MultiSelect/index.cjs.map +1 -1
- package/apps/mobile/src/Core/MultiSelect/index.js +7 -4
- package/apps/mobile/src/Core/MultiSelect/index.js.map +1 -1
- 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 +13 -2
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +13 -2
- 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 +11 -1
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +12 -2
- 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 +9 -1
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +10 -2
- 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/hooks/useComponentDefaults.cjs +50 -8
- package/hooks/useComponentDefaults.cjs.map +1 -1
- package/hooks/useComponentDefaults.js +50 -8
- package/hooks/useComponentDefaults.js.map +1 -1
- package/index.cjs +5 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +245 -19
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/packages/types/src/Theme/defaultTheme.cjs +24 -4
- package/packages/types/src/Theme/defaultTheme.cjs.map +1 -1
- package/packages/types/src/Theme/defaultTheme.js +24 -4
- package/packages/types/src/Theme/defaultTheme.js.map +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.js","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var index_native$1 = require('../../primitives/Icon/index.cjs');
|
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
9
|
require('../../contexts/PermissionsContext.cjs');
|
|
10
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
10
11
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
11
12
|
|
|
12
13
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":["useComponentDefaults","jsx","Box","Text","jsxs","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":["useComponentDefaults","jsx","Box","Text","jsxs","Icon"],"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/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ var index_native$1 = require('../../primitives/Text/index.cjs');
|
|
|
87
87
|
var index_native = require('../../primitives/Icon/index.cjs');
|
|
88
88
|
require('../../contexts/DialogContext.cjs');
|
|
89
89
|
require('../../contexts/PermissionsContext.cjs');
|
|
90
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
90
91
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
91
92
|
|
|
92
93
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":"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"}
|
package/components/Tabs/index.js
CHANGED
|
@@ -85,6 +85,7 @@ import Text from '../../primitives/Text/index.js';
|
|
|
85
85
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
86
86
|
import '../../contexts/DialogContext.js';
|
|
87
87
|
import '../../contexts/PermissionsContext.js';
|
|
88
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
88
89
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
89
90
|
|
|
90
91
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var index_native$1 = require('../../primitives/Icon/index.cjs');
|
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
9
|
require('../../contexts/PermissionsContext.cjs');
|
|
10
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
10
11
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
11
12
|
|
|
12
13
|
const SIZE = {
|
|
@@ -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":";;;;;;;;;;;;AAaO,SAAS,gBAAgB,QAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAA4C,iBAAA,EAAmB,QAAQ,CAAA,CAAE,WAAA;AACvF,EAAA,MAAM,EAAC,OAAO,QAAA,GAAW,gBAAA,EAAkB,SAAS,IAAA,EAAM,WAAA,GAAc,eAAA,EAAiB,MAAA,EAAM,GAAI,KAAA;AACnG,EAAA,MAAM,EAAC,YAAA,EAAY,GAAIC,qCAAA,EAAa;AACpC,EAAA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,aAAa,WAAW,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,aAAa,gBAAgB,CAAA;AAUhD,EAAA,MAAM,aAAA,GAAgBC,wBAAA,CAAiB,MAAA,EAAW,EAAE,CAAA;AAEpD,EAAA,MAAM,KAAKC,YAAA,CAAO,IAAIC,qBAAS,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,OAAA;AAC3C,EAAA,MAAM,KAAKD,YAAA,CAAO,IAAIC,qBAAS,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,OAAA;AAC3C,EAAA,MAAM,KAAKD,YAAA,CAAO,IAAIC,qBAAS,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,OAAA;AAE3C,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,QAAQ,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,CAAA,EAAG,CAAA,KACzBD,oBAAA,CAAS,IAAA;AAAA,QACLA,qBAAS,QAAA,CAAS;AAAA,UACdA,oBAAA,CAAS,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAAA,UACtBA,qBAAS,MAAA,CAAO,CAAA,EAAG,EAAC,OAAA,EAAS,GAAG,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQE,kBAAA,CAAO,MAAMA,kBAAA,CAAO,IAAI,CAAA,EAAG,eAAA,EAAiB,MAAK,CAAA;AAAA,UACxGF,qBAAS,MAAA,CAAO,CAAA,EAAG,EAAC,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQE,kBAAA,CAAO,MAAMA,kBAAA,CAAO,IAAI,CAAA,EAAG,eAAA,EAAiB,MAAK;AAAA,SAC7G;AAAA;AACL,KACJ;AACA,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,CAAA;AAC5B,IAAA,OAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAEf,EAAA,MAAM,uBACFC,cAAA,CAACC,gBAAA,EAAA,EAAK,OAAO,EAAC,aAAA,EAAe,OAAO,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,QAAA,IACnD,QAAA,EAAA,CAAC,EAAA,EAAI,IAAI,EAAE,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,CAAA,qBAClBD,cAAA,CAACH,qBAAS,IAAA,EAAT,EAAsB,OAAO,EAAC,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,IAAA,EAAM,iBAAiB,GAAA,EAAK,OAAA,EAAS,GAAC,EAAA,EAApF,CAAuF,CAC9G,CAAA,EACL,CAAA;AAGJ,EAAA,uBACIK,eAAA,CAACD,oBAAK,MAAA,EAAgB,KAAA,EAAO,EAAC,UAAA,EAAY,YAAA,EAAc,GAAA,EAAK,CAAA,EAAC,EACzD,QAAA,EAAA;AAAA,IAAA,KAAA,IAAS,IAAA,mCAASE,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,QAAA,EAAU,EAAA,EAAI,YAAY,KAAA,EAAO,KAAA,EAAO,YAAY,GAAI,aAAA,IAAiB,OAAO,EAAC,UAAA,EAAY,eAAa,GAAI,EAAC,EAAE,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC1J,MAAA,mBACGH,cAAA;AAAA,MAACC,gBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,eAAA,EAAiB,EAAA;AAAA,UACjB,YAAA,EAAc,EAAA;AAAA,UACd,sBAAA,EAAwB,CAAA;AAAA,UACxB,eAAA,EAAiB,EAAA;AAAA,UACjB,iBAAA,EAAmB,EAAA;AAAA,UACnB,SAAA,EAAW;AAAA,SACf;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACL,GAEA;AAAA,GAAA,EAER,CAAA;AAER;;;;"}
|
|
@@ -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');
|