@lmb-it/kitsconcerto-native 0.1.288 → 0.1.290
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/Dropdown/index.cjs +1 -0
- package/apps/mobile/src/Core/Dropdown/index.cjs.map +1 -1
- package/apps/mobile/src/Core/Dropdown/index.js +1 -0
- package/apps/mobile/src/Core/Dropdown/index.js.map +1 -1
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs +1 -0
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs.map +1 -1
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.js +1 -0
- package/apps/mobile/src/Core/Trees/components/CoreToolbar.js.map +1 -1
- package/apps/mobile/src/Factory/ResponsiveElement.cjs +1 -0
- package/apps/mobile/src/Factory/ResponsiveElement.cjs.map +1 -1
- package/apps/mobile/src/Factory/ResponsiveElement.js +1 -0
- package/apps/mobile/src/Factory/ResponsiveElement.js.map +1 -1
- package/apps/mobile/src/Factory/helpers/cssVarMap.cjs +1 -0
- package/apps/mobile/src/Factory/helpers/cssVarMap.cjs.map +1 -1
- package/apps/mobile/src/Factory/helpers/cssVarMap.js +1 -0
- package/apps/mobile/src/Factory/helpers/cssVarMap.js.map +1 -1
- package/apps/mobile/src/Factory/helpers/style.cjs +1 -0
- package/apps/mobile/src/Factory/helpers/style.cjs.map +1 -1
- package/apps/mobile/src/Factory/helpers/style.js +1 -0
- package/apps/mobile/src/Factory/helpers/style.js.map +1 -1
- package/apps/mobile/src/Factory/useSeparator.cjs +1 -0
- package/apps/mobile/src/Factory/useSeparator.cjs.map +1 -1
- package/apps/mobile/src/Factory/useSeparator.js +1 -0
- package/apps/mobile/src/Factory/useSeparator.js.map +1 -1
- package/components/Accordion/accordion.cjs +1 -0
- package/components/Accordion/accordion.cjs.map +1 -1
- package/components/Accordion/accordion.js +1 -0
- package/components/Accordion/accordion.js.map +1 -1
- package/components/Badge/index.cjs +1 -0
- package/components/Badge/index.cjs.map +1 -1
- package/components/Badge/index.js +1 -0
- package/components/Badge/index.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/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/ImageCropper/index.cjs +584 -550
- package/components/ImageCropper/index.cjs.map +1 -1
- package/components/ImageCropper/index.js +585 -551
- package/components/ImageCropper/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/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/SkeletonText/index.cjs +1 -0
- package/components/SkeletonText/index.cjs.map +1 -1
- package/components/SkeletonText/index.js +1 -0
- package/components/SkeletonText/index.js.map +1 -1
- package/components/Tabs/index.cjs +3 -2
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +3 -2
- package/components/Tabs/index.js.map +1 -1
- package/contexts/Locale/index.cjs +1 -0
- package/contexts/Locale/index.cjs.map +1 -1
- package/contexts/Locale/index.js +1 -0
- package/contexts/Locale/index.js.map +1 -1
- package/contexts/Main/index.cjs +1 -0
- package/contexts/Main/index.cjs.map +1 -1
- package/contexts/Main/index.js +1 -0
- package/contexts/Main/index.js.map +1 -1
- package/contexts/Theme/index.cjs +1 -0
- package/contexts/Theme/index.cjs.map +1 -1
- package/contexts/Theme/index.js +1 -0
- package/contexts/Theme/index.js.map +1 -1
- package/data/DataView/Pagination/index.cjs +1 -0
- package/data/DataView/Pagination/index.cjs.map +1 -1
- package/data/DataView/Pagination/index.js +1 -0
- package/data/DataView/Pagination/index.js.map +1 -1
- package/data/TreeView/index.cjs +1 -0
- package/data/TreeView/index.cjs.map +1 -1
- package/data/TreeView/index.js +1 -0
- package/data/TreeView/index.js.map +1 -1
- package/form/controls/Checkbox/checkbox.cjs +1 -0
- package/form/controls/Checkbox/checkbox.cjs.map +1 -1
- package/form/controls/Checkbox/checkbox.js +1 -0
- package/form/controls/Checkbox/checkbox.js.map +1 -1
- package/form/controls/RadioButton/radiobutton.cjs +1 -0
- package/form/controls/RadioButton/radiobutton.cjs.map +1 -1
- package/form/controls/RadioButton/radiobutton.js +1 -0
- package/form/controls/RadioButton/radiobutton.js.map +1 -1
- package/form/controls/SelectButton/index.cjs +1 -0
- package/form/controls/SelectButton/index.cjs.map +1 -1
- package/form/controls/SelectButton/index.js +1 -0
- package/form/controls/SelectButton/index.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/MainUploader/index.cjs +1 -0
- package/form/file-pickers/MainUploader/index.cjs.map +1 -1
- package/form/file-pickers/MainUploader/index.js +1 -0
- package/form/file-pickers/MainUploader/index.js.map +1 -1
- package/form/helpers/ErrorMessage/errormessage.cjs +1 -0
- package/form/helpers/ErrorMessage/errormessage.cjs.map +1 -1
- package/form/helpers/ErrorMessage/errormessage.js +1 -0
- package/form/helpers/ErrorMessage/errormessage.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/helpers/Label/label.cjs +1 -0
- package/form/helpers/Label/label.cjs.map +1 -1
- package/form/helpers/Label/label.js +1 -0
- package/form/helpers/Label/label.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/inputs/RadiusPicker/components/NumericRadiusInput.cjs +1 -0
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.cjs.map +1 -1
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.js +1 -0
- package/form/inputs/RadiusPicker/components/NumericRadiusInput.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/layout/FieldWrapper.cjs +1 -0
- package/form-renderer/components/layout/FieldWrapper.cjs.map +1 -1
- package/form-renderer/components/layout/FieldWrapper.js +1 -0
- package/form-renderer/components/layout/FieldWrapper.js.map +1 -1
- package/hooks/shadowPresets.cjs +1 -0
- package/hooks/shadowPresets.cjs.map +1 -1
- package/hooks/shadowPresets.js +1 -0
- package/hooks/shadowPresets.js.map +1 -1
- package/hooks/useFocusStyles.cjs +1 -0
- package/hooks/useFocusStyles.cjs.map +1 -1
- package/hooks/useFocusStyles.js +1 -0
- package/hooks/useFocusStyles.js.map +1 -1
- package/index.cjs +2 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +117 -5
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/layout/Center/index.cjs +1 -0
- package/layout/Center/index.cjs.map +1 -1
- package/layout/Center/index.js +1 -0
- package/layout/Center/index.js.map +1 -1
- package/layout/Container/container.cjs +1 -0
- package/layout/Container/container.cjs.map +1 -1
- package/layout/Container/container.js +1 -0
- package/layout/Container/container.js.map +1 -1
- package/layout/Flex/index.cjs +1 -0
- package/layout/Flex/index.cjs.map +1 -1
- package/layout/Flex/index.js +1 -0
- package/layout/Flex/index.js.map +1 -1
- package/layout/HStack/index.cjs +1 -0
- package/layout/HStack/index.cjs.map +1 -1
- package/layout/HStack/index.js +1 -0
- package/layout/HStack/index.js.map +1 -1
- package/layout/List/index.cjs +1 -0
- package/layout/List/index.cjs.map +1 -1
- package/layout/List/index.js +1 -0
- package/layout/List/index.js.map +1 -1
- package/layout/ListItem/index.cjs +1 -0
- package/layout/ListItem/index.cjs.map +1 -1
- package/layout/ListItem/index.js +1 -0
- package/layout/ListItem/index.js.map +1 -1
- package/layout/ScrollView/index.cjs +1 -0
- package/layout/ScrollView/index.cjs.map +1 -1
- package/layout/ScrollView/index.js +1 -0
- package/layout/ScrollView/index.js.map +1 -1
- package/layout/VStack/index.cjs +1 -0
- package/layout/VStack/index.cjs.map +1 -1
- package/layout/VStack/index.js +1 -0
- package/layout/VStack/index.js.map +1 -1
- package/package.json +1 -1
- package/packages/types/src/Theme/resolvers.cjs +2 -55
- package/packages/types/src/Theme/resolvers.cjs.map +1 -1
- package/packages/types/src/Theme/resolvers.js +2 -55
- package/packages/types/src/Theme/resolvers.js.map +1 -1
- package/packages/types/src/Theme/semanticTokenNames.cjs +64 -0
- package/packages/types/src/Theme/semanticTokenNames.cjs.map +1 -0
- package/packages/types/src/Theme/semanticTokenNames.js +62 -0
- package/packages/types/src/Theme/semanticTokenNames.js.map +1 -0
- package/primitives/Box/index.cjs +1 -0
- package/primitives/Box/index.cjs.map +1 -1
- package/primitives/Box/index.js +1 -0
- package/primitives/Box/index.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
- package/primitives/Divider/index.cjs +1 -0
- package/primitives/Divider/index.cjs.map +1 -1
- package/primitives/Divider/index.js +1 -0
- package/primitives/Divider/index.js.map +1 -1
- package/primitives/Heading/index.cjs +1 -0
- package/primitives/Heading/index.cjs.map +1 -1
- package/primitives/Heading/index.js +1 -0
- package/primitives/Heading/index.js.map +1 -1
- package/primitives/Image/index.cjs +1 -0
- package/primitives/Image/index.cjs.map +1 -1
- package/primitives/Image/index.js +1 -0
- package/primitives/Image/index.js.map +1 -1
- package/primitives/Skeleton/index.cjs +1 -0
- package/primitives/Skeleton/index.cjs.map +1 -1
- package/primitives/Skeleton/index.js +1 -0
- package/primitives/Skeleton/index.js.map +1 -1
- package/primitives/Svg/index.cjs +1 -0
- package/primitives/Svg/index.cjs.map +1 -1
- package/primitives/Svg/index.js +1 -0
- package/primitives/Svg/index.js.map +1 -1
- package/primitives/Text/index.cjs +1 -0
- package/primitives/Text/index.cjs.map +1 -1
- package/primitives/Text/index.js +1 -0
- package/primitives/Text/index.js.map +1 -1
|
@@ -61,6 +61,7 @@ require('yup');
|
|
|
61
61
|
require('../../packages/types/src/Css/map/index.cjs');
|
|
62
62
|
require('../../packages/types/src/Theme/shadows.cjs');
|
|
63
63
|
require('../../packages/types/src/Theme/defaultTheme.cjs');
|
|
64
|
+
require('../../packages/types/src/Theme/resolvers.cjs');
|
|
64
65
|
require('../../packages/types/src/Theme/alphaColors.cjs');
|
|
65
66
|
require('../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
66
67
|
require('../../apps/mobile/src/Factory/DimensionsContext.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.cjs","sources":["../../../../src/components/Accordion/accordion.native.tsx"],"sourcesContent":["import React, {useEffect, useState} from \"react\";\nimport type {IAccordionProps} from \"@lmb-it/kitsconcerto-types\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionContentText,\n AccordionHeader,\n AccordionIcon,\n AccordionItem,\n AccordionTitleText,\n AccordionTrigger,\n ChevronDownIcon,\n ChevronUpIcon,\n Divider\n} from \"@lmb-it/kitsconcertomobile\";\n\nimport {Box, Heading} from \"../../_compat\"; // your existing KitsConcerto components\nimport useThemedFont from \"../../hooks/useThemedFont\";\n\nconst CustomAccordion = ({\n accordionTitle,\n accordionItems,\n isLoading,\n allOpenedByDefault,\n localProps,\n }: IAccordionProps<any>) => {\n\n const [expanded, setExpanded] = useState<string[] | string>(\n localProps?.multiple ? [\"0\"] : \"0\"\n );\n\n // Apply \"open all by default\"\n useEffect(() => {\n if (allOpenedByDefault && accordionItems?.length) {\n const allValues = accordionItems.map((_, i) => `${i}`);\n setExpanded(localProps?.multiple ? allValues ?? [\"0\"] : allValues[0] ?? \"0\");\n }\n }, [allOpenedByDefault]);\n\n // Gluestack expects:\n // type=\"single\" or \"multiple\"\n const type = localProps?.multiple ? \"multiple\" : \"single\";\n\n const titleFont = useThemedFont('heading');\n const bodyFont = useThemedFont('body');\n\n const handleChange = (val: string | string[]) => {\n setExpanded(val);\n\n // call item-specific onToggle if provided\n if (accordionItems) {\n if (Array.isArray(val)) {\n val.forEach((key) => {\n const index = parseInt(key, 10);\n accordionItems[index]?.onToggle?.(true);\n });\n } else {\n const index = parseInt(val, 10);\n accordionItems[index]?.onToggle?.(true);\n }\n }\n };\n\n return (\n <Box w=\"100%\" borderRadius={8} overflow=\"hidden\" className=\"bg-background-0\">\n {!!accordionTitle && (\n <Heading as=\"h2\" p={4} fontSize=\"lg\" className=\"bg-background-100\">\n {accordionTitle}\n </Heading>\n )}\n\n {isLoading ? (\n <Box p={4}>\n {/* Replace with RN skeleton later */}\n </Box>\n ) : (\n <Accordion\n {...localProps}\n value={expanded}\n onValueChange={handleChange}\n type={type}\n className=\"w-full\"\n >\n {accordionItems?.map(({button, panel}, i) => (\n <React.Fragment key={i}>\n <AccordionItem value={`${i}`}>\n <AccordionHeader>\n <AccordionTrigger>\n {({isExpanded}:{isExpanded:boolean}) => (\n <>\n <AccordionTitleText style={titleFont ? {fontFamily: titleFont} : undefined}>{button}</AccordionTitleText>\n <AccordionIcon\n as={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n className=\"ms-3\"\n />\n </>\n )}\n </AccordionTrigger>\n </AccordionHeader>\n\n <AccordionContent>\n <AccordionContentText style={bodyFont ? {fontFamily: bodyFont} : undefined}>\n {panel}\n </AccordionContentText>\n </AccordionContent>\n </AccordionItem>\n\n {i !== accordionItems.length - 1 && <Divider/>}\n </React.Fragment>\n ))}\n </Accordion>\n )}\n </Box>\n );\n};\n\nexport default CustomAccordion;\n"],"names":["useState","useEffect","useThemedFont","jsxs","Box","jsx","Heading","Accordion","AccordionItem","AccordionHeader","AccordionTrigger","Fragment","AccordionTitleText","AccordionIcon","ChevronUpIcon","ChevronDownIcon","AccordionContent","AccordionContentText","Divider"],"mappings":"
|
|
1
|
+
{"version":3,"file":"accordion.cjs","sources":["../../../../src/components/Accordion/accordion.native.tsx"],"sourcesContent":["import React, {useEffect, useState} from \"react\";\nimport type {IAccordionProps} from \"@lmb-it/kitsconcerto-types\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionContentText,\n AccordionHeader,\n AccordionIcon,\n AccordionItem,\n AccordionTitleText,\n AccordionTrigger,\n ChevronDownIcon,\n ChevronUpIcon,\n Divider\n} from \"@lmb-it/kitsconcertomobile\";\n\nimport {Box, Heading} from \"../../_compat\"; // your existing KitsConcerto components\nimport useThemedFont from \"../../hooks/useThemedFont\";\n\nconst CustomAccordion = ({\n accordionTitle,\n accordionItems,\n isLoading,\n allOpenedByDefault,\n localProps,\n }: IAccordionProps<any>) => {\n\n const [expanded, setExpanded] = useState<string[] | string>(\n localProps?.multiple ? [\"0\"] : \"0\"\n );\n\n // Apply \"open all by default\"\n useEffect(() => {\n if (allOpenedByDefault && accordionItems?.length) {\n const allValues = accordionItems.map((_, i) => `${i}`);\n setExpanded(localProps?.multiple ? allValues ?? [\"0\"] : allValues[0] ?? \"0\");\n }\n }, [allOpenedByDefault]);\n\n // Gluestack expects:\n // type=\"single\" or \"multiple\"\n const type = localProps?.multiple ? \"multiple\" : \"single\";\n\n const titleFont = useThemedFont('heading');\n const bodyFont = useThemedFont('body');\n\n const handleChange = (val: string | string[]) => {\n setExpanded(val);\n\n // call item-specific onToggle if provided\n if (accordionItems) {\n if (Array.isArray(val)) {\n val.forEach((key) => {\n const index = parseInt(key, 10);\n accordionItems[index]?.onToggle?.(true);\n });\n } else {\n const index = parseInt(val, 10);\n accordionItems[index]?.onToggle?.(true);\n }\n }\n };\n\n return (\n <Box w=\"100%\" borderRadius={8} overflow=\"hidden\" className=\"bg-background-0\">\n {!!accordionTitle && (\n <Heading as=\"h2\" p={4} fontSize=\"lg\" className=\"bg-background-100\">\n {accordionTitle}\n </Heading>\n )}\n\n {isLoading ? (\n <Box p={4}>\n {/* Replace with RN skeleton later */}\n </Box>\n ) : (\n <Accordion\n {...localProps}\n value={expanded}\n onValueChange={handleChange}\n type={type}\n className=\"w-full\"\n >\n {accordionItems?.map(({button, panel}, i) => (\n <React.Fragment key={i}>\n <AccordionItem value={`${i}`}>\n <AccordionHeader>\n <AccordionTrigger>\n {({isExpanded}:{isExpanded:boolean}) => (\n <>\n <AccordionTitleText style={titleFont ? {fontFamily: titleFont} : undefined}>{button}</AccordionTitleText>\n <AccordionIcon\n as={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n className=\"ms-3\"\n />\n </>\n )}\n </AccordionTrigger>\n </AccordionHeader>\n\n <AccordionContent>\n <AccordionContentText style={bodyFont ? {fontFamily: bodyFont} : undefined}>\n {panel}\n </AccordionContentText>\n </AccordionContent>\n </AccordionItem>\n\n {i !== accordionItems.length - 1 && <Divider/>}\n </React.Fragment>\n ))}\n </Accordion>\n )}\n </Box>\n );\n};\n\nexport default CustomAccordion;\n"],"names":["useState","useEffect","useThemedFont","jsxs","Box","jsx","Heading","Accordion","AccordionItem","AccordionHeader","AccordionTrigger","Fragment","AccordionTitleText","AccordionIcon","ChevronUpIcon","ChevronDownIcon","AccordionContent","AccordionContentText","Divider"],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ import 'yup';
|
|
|
57
57
|
import '../../packages/types/src/Css/map/index.js';
|
|
58
58
|
import '../../packages/types/src/Theme/shadows.js';
|
|
59
59
|
import '../../packages/types/src/Theme/defaultTheme.js';
|
|
60
|
+
import '../../packages/types/src/Theme/resolvers.js';
|
|
60
61
|
import '../../packages/types/src/Theme/alphaColors.js';
|
|
61
62
|
import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
62
63
|
import '../../apps/mobile/src/Factory/DimensionsContext.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","sources":["../../../../src/components/Accordion/accordion.native.tsx"],"sourcesContent":["import React, {useEffect, useState} from \"react\";\nimport type {IAccordionProps} from \"@lmb-it/kitsconcerto-types\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionContentText,\n AccordionHeader,\n AccordionIcon,\n AccordionItem,\n AccordionTitleText,\n AccordionTrigger,\n ChevronDownIcon,\n ChevronUpIcon,\n Divider\n} from \"@lmb-it/kitsconcertomobile\";\n\nimport {Box, Heading} from \"../../_compat\"; // your existing KitsConcerto components\nimport useThemedFont from \"../../hooks/useThemedFont\";\n\nconst CustomAccordion = ({\n accordionTitle,\n accordionItems,\n isLoading,\n allOpenedByDefault,\n localProps,\n }: IAccordionProps<any>) => {\n\n const [expanded, setExpanded] = useState<string[] | string>(\n localProps?.multiple ? [\"0\"] : \"0\"\n );\n\n // Apply \"open all by default\"\n useEffect(() => {\n if (allOpenedByDefault && accordionItems?.length) {\n const allValues = accordionItems.map((_, i) => `${i}`);\n setExpanded(localProps?.multiple ? allValues ?? [\"0\"] : allValues[0] ?? \"0\");\n }\n }, [allOpenedByDefault]);\n\n // Gluestack expects:\n // type=\"single\" or \"multiple\"\n const type = localProps?.multiple ? \"multiple\" : \"single\";\n\n const titleFont = useThemedFont('heading');\n const bodyFont = useThemedFont('body');\n\n const handleChange = (val: string | string[]) => {\n setExpanded(val);\n\n // call item-specific onToggle if provided\n if (accordionItems) {\n if (Array.isArray(val)) {\n val.forEach((key) => {\n const index = parseInt(key, 10);\n accordionItems[index]?.onToggle?.(true);\n });\n } else {\n const index = parseInt(val, 10);\n accordionItems[index]?.onToggle?.(true);\n }\n }\n };\n\n return (\n <Box w=\"100%\" borderRadius={8} overflow=\"hidden\" className=\"bg-background-0\">\n {!!accordionTitle && (\n <Heading as=\"h2\" p={4} fontSize=\"lg\" className=\"bg-background-100\">\n {accordionTitle}\n </Heading>\n )}\n\n {isLoading ? (\n <Box p={4}>\n {/* Replace with RN skeleton later */}\n </Box>\n ) : (\n <Accordion\n {...localProps}\n value={expanded}\n onValueChange={handleChange}\n type={type}\n className=\"w-full\"\n >\n {accordionItems?.map(({button, panel}, i) => (\n <React.Fragment key={i}>\n <AccordionItem value={`${i}`}>\n <AccordionHeader>\n <AccordionTrigger>\n {({isExpanded}:{isExpanded:boolean}) => (\n <>\n <AccordionTitleText style={titleFont ? {fontFamily: titleFont} : undefined}>{button}</AccordionTitleText>\n <AccordionIcon\n as={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n className=\"ms-3\"\n />\n </>\n )}\n </AccordionTrigger>\n </AccordionHeader>\n\n <AccordionContent>\n <AccordionContentText style={bodyFont ? {fontFamily: bodyFont} : undefined}>\n {panel}\n </AccordionContentText>\n </AccordionContent>\n </AccordionItem>\n\n {i !== accordionItems.length - 1 && <Divider/>}\n </React.Fragment>\n ))}\n </Accordion>\n )}\n </Box>\n );\n};\n\nexport default CustomAccordion;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accordion.js","sources":["../../../../src/components/Accordion/accordion.native.tsx"],"sourcesContent":["import React, {useEffect, useState} from \"react\";\nimport type {IAccordionProps} from \"@lmb-it/kitsconcerto-types\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionContentText,\n AccordionHeader,\n AccordionIcon,\n AccordionItem,\n AccordionTitleText,\n AccordionTrigger,\n ChevronDownIcon,\n ChevronUpIcon,\n Divider\n} from \"@lmb-it/kitsconcertomobile\";\n\nimport {Box, Heading} from \"../../_compat\"; // your existing KitsConcerto components\nimport useThemedFont from \"../../hooks/useThemedFont\";\n\nconst CustomAccordion = ({\n accordionTitle,\n accordionItems,\n isLoading,\n allOpenedByDefault,\n localProps,\n }: IAccordionProps<any>) => {\n\n const [expanded, setExpanded] = useState<string[] | string>(\n localProps?.multiple ? [\"0\"] : \"0\"\n );\n\n // Apply \"open all by default\"\n useEffect(() => {\n if (allOpenedByDefault && accordionItems?.length) {\n const allValues = accordionItems.map((_, i) => `${i}`);\n setExpanded(localProps?.multiple ? allValues ?? [\"0\"] : allValues[0] ?? \"0\");\n }\n }, [allOpenedByDefault]);\n\n // Gluestack expects:\n // type=\"single\" or \"multiple\"\n const type = localProps?.multiple ? \"multiple\" : \"single\";\n\n const titleFont = useThemedFont('heading');\n const bodyFont = useThemedFont('body');\n\n const handleChange = (val: string | string[]) => {\n setExpanded(val);\n\n // call item-specific onToggle if provided\n if (accordionItems) {\n if (Array.isArray(val)) {\n val.forEach((key) => {\n const index = parseInt(key, 10);\n accordionItems[index]?.onToggle?.(true);\n });\n } else {\n const index = parseInt(val, 10);\n accordionItems[index]?.onToggle?.(true);\n }\n }\n };\n\n return (\n <Box w=\"100%\" borderRadius={8} overflow=\"hidden\" className=\"bg-background-0\">\n {!!accordionTitle && (\n <Heading as=\"h2\" p={4} fontSize=\"lg\" className=\"bg-background-100\">\n {accordionTitle}\n </Heading>\n )}\n\n {isLoading ? (\n <Box p={4}>\n {/* Replace with RN skeleton later */}\n </Box>\n ) : (\n <Accordion\n {...localProps}\n value={expanded}\n onValueChange={handleChange}\n type={type}\n className=\"w-full\"\n >\n {accordionItems?.map(({button, panel}, i) => (\n <React.Fragment key={i}>\n <AccordionItem value={`${i}`}>\n <AccordionHeader>\n <AccordionTrigger>\n {({isExpanded}:{isExpanded:boolean}) => (\n <>\n <AccordionTitleText style={titleFont ? {fontFamily: titleFont} : undefined}>{button}</AccordionTitleText>\n <AccordionIcon\n as={isExpanded ? ChevronUpIcon : ChevronDownIcon}\n className=\"ms-3\"\n />\n </>\n )}\n </AccordionTrigger>\n </AccordionHeader>\n\n <AccordionContent>\n <AccordionContentText style={bodyFont ? {fontFamily: bodyFont} : undefined}>\n {panel}\n </AccordionContentText>\n </AccordionContent>\n </AccordionItem>\n\n {i !== accordionItems.length - 1 && <Divider/>}\n </React.Fragment>\n ))}\n </Accordion>\n )}\n </Box>\n );\n};\n\nexport default CustomAccordion;\n"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,7 @@ require('yup');
|
|
|
59
59
|
require('../../packages/types/src/Css/map/index.cjs');
|
|
60
60
|
require('../../packages/types/src/Theme/shadows.cjs');
|
|
61
61
|
require('../../packages/types/src/Theme/defaultTheme.cjs');
|
|
62
|
+
require('../../packages/types/src/Theme/resolvers.cjs');
|
|
62
63
|
require('../../packages/types/src/Theme/alphaColors.cjs');
|
|
63
64
|
require('../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
64
65
|
require('../../apps/mobile/src/Factory/DimensionsContext.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Badge/index.native.tsx"],"sourcesContent":["import {PrimeBadge, type BadgeProps} from \"@lmb-it/kitsconcertomobile\";\n\nexport type {BadgeProps};\n\nexport const Badge = (props: BadgeProps) => {\n return <PrimeBadge {...props} />;\n};\n"],"names":["jsx","PrimeBadge"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Badge/index.native.tsx"],"sourcesContent":["import {PrimeBadge, type BadgeProps} from \"@lmb-it/kitsconcertomobile\";\n\nexport type {BadgeProps};\n\nexport const Badge = (props: BadgeProps) => {\n return <PrimeBadge {...props} />;\n};\n"],"names":["jsx","PrimeBadge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAsB;AACxC,EAAA,uBAAOA,cAAA,CAACC,gBAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAClC;;;;"}
|
|
@@ -57,6 +57,7 @@ import 'yup';
|
|
|
57
57
|
import '../../packages/types/src/Css/map/index.js';
|
|
58
58
|
import '../../packages/types/src/Theme/shadows.js';
|
|
59
59
|
import '../../packages/types/src/Theme/defaultTheme.js';
|
|
60
|
+
import '../../packages/types/src/Theme/resolvers.js';
|
|
60
61
|
import '../../packages/types/src/Theme/alphaColors.js';
|
|
61
62
|
import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
62
63
|
import '../../apps/mobile/src/Factory/DimensionsContext.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Badge/index.native.tsx"],"sourcesContent":["import {PrimeBadge, type BadgeProps} from \"@lmb-it/kitsconcertomobile\";\n\nexport type {BadgeProps};\n\nexport const Badge = (props: BadgeProps) => {\n return <PrimeBadge {...props} />;\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Badge/index.native.tsx"],"sourcesContent":["import {PrimeBadge, type BadgeProps} from \"@lmb-it/kitsconcertomobile\";\n\nexport type {BadgeProps};\n\nexport const Badge = (props: BadgeProps) => {\n return <PrimeBadge {...props} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAsB;AACxC,EAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAY,GAAG,KAAA,EAAO,CAAA;AAClC;;;;"}
|
|
@@ -61,6 +61,7 @@ require('yup');
|
|
|
61
61
|
require('../../packages/types/src/Css/map/index.cjs');
|
|
62
62
|
require('../../packages/types/src/Theme/shadows.cjs');
|
|
63
63
|
require('../../packages/types/src/Theme/defaultTheme.cjs');
|
|
64
|
+
require('../../packages/types/src/Theme/resolvers.cjs');
|
|
64
65
|
require('../../packages/types/src/Theme/alphaColors.cjs');
|
|
65
66
|
require('../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
66
67
|
require('i18next');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/BottomTabBar/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Pressable, Text, View} from \"react-native\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IBottomTabBarProps, ITabBarItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {Box} from \"../../primitives\";\nimport Flex from \"../../layout/Flex\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's AMTabBar geometry (App/src/components/shared/layout).\nconst BAR_MIN_HEIGHT = 60;\nconst FAB_SIZE = 56;\n\nfunction Badge({badge, barBg, dangerColor}: {badge: number | boolean; barBg: string; dangerColor: string}) {\n const isDot = badge === true || badge === 0;\n if (isDot) {\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 10,\n height: 10,\n borderRadius: 5,\n backgroundColor: dangerColor,\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n />\n );\n }\n const count = typeof badge === \"number\" ? (badge > 99 ? \"99+\" : String(badge)) : \"\";\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -6,\n right: -10,\n minWidth: 16,\n height: 16,\n borderRadius: 8,\n paddingHorizontal: 4,\n backgroundColor: dangerColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n >\n <Text style={{color: \"#FFFFFF\", fontSize: 9, fontWeight: \"700\", lineHeight: 11}}>{count}</Text>\n </Box>\n );\n}\n\n/**\n * BottomTabBar — iOS/Android bottom navigation with an elevated center FAB.\n *\n * Layout mirrors the app's working `AMTabBar`: a `row` / `space-between` bar\n * with four `flex:1` **column** slots and a content-width centre slot holding\n * the FAB. The FAB is lifted with `marginTop:-26` and ringed with a 3px\n * border so it sits above the bar plane — never absolutely positioned.\n * Presentational + controlled (router-agnostic).\n */\nexport function BottomTabBar<K extends string = string>(rawProps: IBottomTabBarProps<K>) {\n const props = useComponentDefaults<IBottomTabBarProps<K>>(\"BottomTabBar\", rawProps).mergedProps;\n const {\n items,\n value,\n onChange,\n activeColor = \"brand\",\n inactiveColor = \"text-secondary\",\n background = \"surface-card\",\n fabColor,\n showLabels = true,\n testID,\n } = props;\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX — a raw react-native <Text>\n * with a fontSize and no lineHeight gets the FONT'S natural box, and\n * NotoKufiArabic's is too short for its own ascenders. In an RTL script\n * that reads as a BAD TRANSLATION rather than as clipping: ش/س, غ/ع and\n * ة/ه 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 insets = useSafeAreaInsets();\n\n // Resolve tokens → hex with the standalone resolver (the one `Icon` uses),\n // so colors apply on raw RN elements in both app and Storybook contexts.\n const activeC = resolveThemeTokenForNative(activeColor);\n const inactiveC = resolveThemeTokenForNative(inactiveColor);\n const bg = resolveThemeTokenForNative(background);\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fabBg = resolveThemeTokenForNative(fabColor ?? activeColor);\n const danger = resolveThemeTokenForNative(\"danger\");\n\n return (\n <View\n testID={testID}\n style={{\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: BAR_MIN_HEIGHT,\n paddingHorizontal: 20,\n paddingTop: 10,\n paddingBottom: Math.max(insets.bottom, 12),\n backgroundColor: bg,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {items.map((item: ITabBarItem<K>) => {\n const active = item.key === value;\n\n // Centre FAB — a content-width slot (NOT flex:1) so the four\n // side slots distribute evenly; the FAB is lifted in-flow.\n if (item.fab) {\n return (\n <Flex key={item.key} style={{alignItems: \"center\", justifyContent: \"center\"}}>\n <Pressable\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n hitSlop={8}\n style={({pressed}) => [\n {\n width: FAB_SIZE,\n height: FAB_SIZE,\n borderRadius: FAB_SIZE / 2,\n marginTop: -26,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: fabBg,\n borderWidth: 3,\n borderColor: bg,\n shadowColor: fabBg,\n shadowOffset: {width: 0, height: 6},\n shadowOpacity: 0.35,\n shadowRadius: 12,\n elevation: 8,\n },\n pressed && {opacity: 0.9},\n ]}\n >\n <Icon name={item.icon as never} size={26} color=\"#FFFFFF\" />\n </Pressable>\n </Flex>\n );\n }\n\n const color = active ? activeC : inactiveC;\n const iconName = active && item.activeIcon != null ? item.activeIcon : item.icon;\n\n return (\n <Pressable\n key={item.key}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={({pressed}) => [\n {\n flex: 1,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n paddingVertical: 6,\n paddingHorizontal: 4,\n minHeight: 44,\n },\n pressed && {opacity: 0.7},\n ]}\n >\n <View style={{alignItems: \"center\", justifyContent: \"center\", position: \"relative\"}}>\n <Icon name={iconName as never} size={24} color={color} />\n {item.badge != null && item.badge !== false && (\n <Badge badge={item.badge} barBg={bg} dangerColor={danger} />\n )}\n </View>\n {showLabels && item.label != null && (\n <Text numberOfLines={1} style={{fontSize: 11, fontWeight: \"500\", color, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>\n {item.label}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport default BottomTabBar;\n"],"names":["jsx","Box","Text","useComponentDefaults","useRtlLineHeight","useSafeAreaInsets","resolveThemeTokenForNative","View","Flex","Pressable","Icon","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,cAAA,GAAiB,EAAA;AACvB,MAAM,QAAA,GAAW,EAAA;AAEjB,SAAS,KAAA,CAAM,EAAC,KAAA,EAAO,KAAA,EAAO,aAAW,EAAkE;AACvG,EAAA,MAAM,KAAA,GAAQ,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,CAAA;AAC1C,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,uBACIA,cAAA;AAAA,MAACC,eAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,EAAA;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UACP,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,eAAA,EAAiB,WAAA;AAAA,UACjB,WAAA,EAAa,GAAA;AAAA,UACb,WAAA,EAAa,KAAA;AAAA,UACb,MAAA,EAAQ;AAAA;AACZ;AAAA,KACJ;AAAA,EAER;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAY,QAAQ,EAAA,GAAK,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,GAAK,EAAA;AACjF,EAAA,uBACID,cAAA;AAAA,IAACC,eAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO;AAAA,QACH,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,EAAA;AAAA,QACL,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc,CAAA;AAAA,QACd,iBAAA,EAAmB,CAAA;AAAA,QACnB,eAAA,EAAiB,WAAA;AAAA,QACjB,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa,KAAA;AAAA,QACb,MAAA,EAAQ;AAAA,OACZ;AAAA,MAEA,QAAA,kBAAAD,cAAA,CAACE,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,EAAA,IAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,GAC5F;AAER;AAWO,SAAS,aAAwC,QAAA,EAAiC;AACrF,EAAA,MAAM,KAAA,GAAQC,4BAAA,CAA4C,cAAA,EAAgB,QAAQ,CAAA,CAAE,WAAA;AACpF,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,aAAA,GAAgB,gBAAA;AAAA,IAChB,UAAA,GAAa,cAAA;AAAA,IACb,QAAA;AAAA,IACA,UAAA,GAAa,IAAA;AAAA,IACb;AAAA,GACJ,GAAI,KAAA;AASJ,EAAA,MAAM,aAAA,GAAgBC,wBAAA,CAAiB,MAAA,EAAW,EAAE,CAAA;AAEpD,EAAA,MAAM,SAASC,4CAAA,EAAkB;AAIjC,EAAA,MAAM,OAAA,GAAUC,iCAA2B,WAAW,CAAA;AACtD,EAAA,MAAM,SAAA,GAAYA,iCAA2B,aAAa,CAAA;AAC1D,EAAA,MAAM,EAAA,GAAKA,iCAA2B,UAAU,CAAA;AAChD,EAAA,MAAM,MAAA,GAASA,iCAA2B,gBAAgB,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQA,gCAAA,CAA2B,QAAA,IAAY,WAAW,CAAA;AAChE,EAAA,MAAM,MAAA,GAASA,iCAA2B,QAAQ,CAAA;AAElD,EAAA,uBACIN,cAAA;AAAA,IAACO,gBAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,MAAA;AAAA,QACP,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,eAAA;AAAA,QAChB,SAAA,EAAW,cAAA;AAAA,QACX,iBAAA,EAAmB,EAAA;AAAA,QACnB,UAAA,EAAY,EAAA;AAAA,QACZ,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,QACzC,eAAA,EAAiB,EAAA;AAAA,QACjB,cAAA,EAAgB,CAAA;AAAA,QAChB,cAAA,EAAgB;AAAA,OACpB;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAyB;AACjC,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,KAAQ,KAAA;AAI5B,QAAA,IAAI,KAAK,GAAA,EAAK;AACV,UAAA,uBACIP,cAAA,CAACQ,iBAAoB,KAAA,EAAO,EAAC,YAAY,QAAA,EAAU,cAAA,EAAgB,UAAQ,EACvE,QAAA,kBAAAR,cAAA;AAAA,YAACS,qBAAA;AAAA,YAAA;AAAA,cACG,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,cAChC,iBAAA,EAAkB,QAAA;AAAA,cAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,MAAA,EAAM;AAAA,cACrC,OAAA,EAAS,CAAA;AAAA,cACT,KAAA,EAAO,CAAC,EAAC,OAAA,EAAO,KAAM;AAAA,gBAClB;AAAA,kBACI,KAAA,EAAO,QAAA;AAAA,kBACP,MAAA,EAAQ,QAAA;AAAA,kBACR,cAAc,QAAA,GAAW,CAAA;AAAA,kBACzB,SAAA,EAAW,GAAA;AAAA,kBACX,UAAA,EAAY,QAAA;AAAA,kBACZ,cAAA,EAAgB,QAAA;AAAA,kBAChB,eAAA,EAAiB,KAAA;AAAA,kBACjB,WAAA,EAAa,CAAA;AAAA,kBACb,WAAA,EAAa,EAAA;AAAA,kBACb,WAAA,EAAa,KAAA;AAAA,kBACb,YAAA,EAAc,EAAC,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAC;AAAA,kBAClC,aAAA,EAAe,IAAA;AAAA,kBACf,YAAA,EAAc,EAAA;AAAA,kBACd,SAAA,EAAW;AAAA,iBACf;AAAA,gBACA,OAAA,IAAW,EAAC,OAAA,EAAS,GAAA;AAAG,eAC5B;AAAA,cAEA,QAAA,kBAAAT,cAAA,CAACU,qBAAK,IAAA,EAAM,IAAA,CAAK,MAAe,IAAA,EAAM,EAAA,EAAI,OAAM,SAAA,EAAU;AAAA;AAAA,WAC9D,EAAA,EA3BO,KAAK,GA4BhB,CAAA;AAAA,QAER;AAEA,QAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,GAAU,SAAA;AACjC,QAAA,MAAM,WAAW,MAAA,IAAU,IAAA,CAAK,cAAc,IAAA,GAAO,IAAA,CAAK,aAAa,IAAA,CAAK,IAAA;AAE5E,QAAA,uBACIC,eAAA;AAAA,UAACF,qBAAA;AAAA,UAAA;AAAA,YAEG,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,YAChC,iBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,MAAA,EAAM;AAAA,YACrC,KAAA,EAAO,CAAC,EAAC,OAAA,EAAO,KAAM;AAAA,cAClB;AAAA,gBACI,IAAA,EAAM,CAAA;AAAA,gBACN,aAAA,EAAe,QAAA;AAAA,gBACf,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,QAAA;AAAA,gBAChB,GAAA,EAAK,CAAA;AAAA,gBACL,eAAA,EAAiB,CAAA;AAAA,gBACjB,iBAAA,EAAmB,CAAA;AAAA,gBACnB,SAAA,EAAW;AAAA,eACf;AAAA,cACA,OAAA,IAAW,EAAC,OAAA,EAAS,GAAA;AAAG,aAC5B;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAE,eAAA,CAACJ,gBAAA,EAAA,EAAK,OAAO,EAAC,UAAA,EAAY,UAAU,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,UAAA,EAAU,EAC9E,QAAA,EAAA;AAAA,gCAAAP,cAAA,CAACU,iBAAA,EAAA,EAAK,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,IAAI,KAAA,EAAc,CAAA;AAAA,gBACtD,IAAA,CAAK,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,UAAU,KAAA,oBAClCV,cAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,aAAa,MAAA,EAAQ;AAAA,eAAA,EAElE,CAAA;AAAA,cACC,UAAA,IAAc,IAAA,CAAK,KAAA,IAAS,IAAA,oBACzBA,cAAA,CAACE,gBAAA,EAAA,EAAK,aAAA,EAAe,CAAA,EAAG,KAAA,EAAO,EAAC,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,OAAO,KAAA,EAAO,GAAI,aAAA,IAAiB,IAAA,GAAO,EAAC,UAAA,EAAY,aAAA,EAAa,GAAI,EAAC,EAAE,EAChI,QAAA,EAAA,IAAA,CAAK,KAAA,EACV;AAAA;AAAA,WAAA;AAAA,UA3BC,IAAA,CAAK;AAAA,SA6Bd;AAAA,MAER,CAAC;AAAA;AAAA,GACL;AAER;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/BottomTabBar/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Pressable, Text, View} from \"react-native\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IBottomTabBarProps, ITabBarItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {Box} from \"../../primitives\";\nimport Flex from \"../../layout/Flex\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's AMTabBar geometry (App/src/components/shared/layout).\nconst BAR_MIN_HEIGHT = 60;\nconst FAB_SIZE = 56;\n\nfunction Badge({badge, barBg, dangerColor}: {badge: number | boolean; barBg: string; dangerColor: string}) {\n const isDot = badge === true || badge === 0;\n if (isDot) {\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 10,\n height: 10,\n borderRadius: 5,\n backgroundColor: dangerColor,\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n />\n );\n }\n const count = typeof badge === \"number\" ? (badge > 99 ? \"99+\" : String(badge)) : \"\";\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -6,\n right: -10,\n minWidth: 16,\n height: 16,\n borderRadius: 8,\n paddingHorizontal: 4,\n backgroundColor: dangerColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n >\n <Text style={{color: \"#FFFFFF\", fontSize: 9, fontWeight: \"700\", lineHeight: 11}}>{count}</Text>\n </Box>\n );\n}\n\n/**\n * BottomTabBar — iOS/Android bottom navigation with an elevated center FAB.\n *\n * Layout mirrors the app's working `AMTabBar`: a `row` / `space-between` bar\n * with four `flex:1` **column** slots and a content-width centre slot holding\n * the FAB. The FAB is lifted with `marginTop:-26` and ringed with a 3px\n * border so it sits above the bar plane — never absolutely positioned.\n * Presentational + controlled (router-agnostic).\n */\nexport function BottomTabBar<K extends string = string>(rawProps: IBottomTabBarProps<K>) {\n const props = useComponentDefaults<IBottomTabBarProps<K>>(\"BottomTabBar\", rawProps).mergedProps;\n const {\n items,\n value,\n onChange,\n activeColor = \"brand\",\n inactiveColor = \"text-secondary\",\n background = \"surface-card\",\n fabColor,\n showLabels = true,\n testID,\n } = props;\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX — a raw react-native <Text>\n * with a fontSize and no lineHeight gets the FONT'S natural box, and\n * NotoKufiArabic's is too short for its own ascenders. In an RTL script\n * that reads as a BAD TRANSLATION rather than as clipping: ش/س, غ/ع and\n * ة/ه 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 insets = useSafeAreaInsets();\n\n // Resolve tokens → hex with the standalone resolver (the one `Icon` uses),\n // so colors apply on raw RN elements in both app and Storybook contexts.\n const activeC = resolveThemeTokenForNative(activeColor);\n const inactiveC = resolveThemeTokenForNative(inactiveColor);\n const bg = resolveThemeTokenForNative(background);\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fabBg = resolveThemeTokenForNative(fabColor ?? activeColor);\n const danger = resolveThemeTokenForNative(\"danger\");\n\n return (\n <View\n testID={testID}\n style={{\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: BAR_MIN_HEIGHT,\n paddingHorizontal: 20,\n paddingTop: 10,\n paddingBottom: Math.max(insets.bottom, 12),\n backgroundColor: bg,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {items.map((item: ITabBarItem<K>) => {\n const active = item.key === value;\n\n // Centre FAB — a content-width slot (NOT flex:1) so the four\n // side slots distribute evenly; the FAB is lifted in-flow.\n if (item.fab) {\n return (\n <Flex key={item.key} style={{alignItems: \"center\", justifyContent: \"center\"}}>\n <Pressable\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n hitSlop={8}\n style={({pressed}) => [\n {\n width: FAB_SIZE,\n height: FAB_SIZE,\n borderRadius: FAB_SIZE / 2,\n marginTop: -26,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: fabBg,\n borderWidth: 3,\n borderColor: bg,\n shadowColor: fabBg,\n shadowOffset: {width: 0, height: 6},\n shadowOpacity: 0.35,\n shadowRadius: 12,\n elevation: 8,\n },\n pressed && {opacity: 0.9},\n ]}\n >\n <Icon name={item.icon as never} size={26} color=\"#FFFFFF\" />\n </Pressable>\n </Flex>\n );\n }\n\n const color = active ? activeC : inactiveC;\n const iconName = active && item.activeIcon != null ? item.activeIcon : item.icon;\n\n return (\n <Pressable\n key={item.key}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={({pressed}) => [\n {\n flex: 1,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n paddingVertical: 6,\n paddingHorizontal: 4,\n minHeight: 44,\n },\n pressed && {opacity: 0.7},\n ]}\n >\n <View style={{alignItems: \"center\", justifyContent: \"center\", position: \"relative\"}}>\n <Icon name={iconName as never} size={24} color={color} />\n {item.badge != null && item.badge !== false && (\n <Badge badge={item.badge} barBg={bg} dangerColor={danger} />\n )}\n </View>\n {showLabels && item.label != null && (\n <Text numberOfLines={1} style={{fontSize: 11, fontWeight: \"500\", color, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>\n {item.label}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport default BottomTabBar;\n"],"names":["jsx","Box","Text","useComponentDefaults","useRtlLineHeight","useSafeAreaInsets","resolveThemeTokenForNative","View","Flex","Pressable","Icon","jsxs"],"mappings":"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"}
|
|
@@ -59,6 +59,7 @@ import 'yup';
|
|
|
59
59
|
import '../../packages/types/src/Css/map/index.js';
|
|
60
60
|
import '../../packages/types/src/Theme/shadows.js';
|
|
61
61
|
import '../../packages/types/src/Theme/defaultTheme.js';
|
|
62
|
+
import '../../packages/types/src/Theme/resolvers.js';
|
|
62
63
|
import '../../packages/types/src/Theme/alphaColors.js';
|
|
63
64
|
import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
64
65
|
import 'i18next';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/BottomTabBar/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Pressable, Text, View} from \"react-native\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IBottomTabBarProps, ITabBarItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {Box} from \"../../primitives\";\nimport Flex from \"../../layout/Flex\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's AMTabBar geometry (App/src/components/shared/layout).\nconst BAR_MIN_HEIGHT = 60;\nconst FAB_SIZE = 56;\n\nfunction Badge({badge, barBg, dangerColor}: {badge: number | boolean; barBg: string; dangerColor: string}) {\n const isDot = badge === true || badge === 0;\n if (isDot) {\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 10,\n height: 10,\n borderRadius: 5,\n backgroundColor: dangerColor,\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n />\n );\n }\n const count = typeof badge === \"number\" ? (badge > 99 ? \"99+\" : String(badge)) : \"\";\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -6,\n right: -10,\n minWidth: 16,\n height: 16,\n borderRadius: 8,\n paddingHorizontal: 4,\n backgroundColor: dangerColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n >\n <Text style={{color: \"#FFFFFF\", fontSize: 9, fontWeight: \"700\", lineHeight: 11}}>{count}</Text>\n </Box>\n );\n}\n\n/**\n * BottomTabBar — iOS/Android bottom navigation with an elevated center FAB.\n *\n * Layout mirrors the app's working `AMTabBar`: a `row` / `space-between` bar\n * with four `flex:1` **column** slots and a content-width centre slot holding\n * the FAB. The FAB is lifted with `marginTop:-26` and ringed with a 3px\n * border so it sits above the bar plane — never absolutely positioned.\n * Presentational + controlled (router-agnostic).\n */\nexport function BottomTabBar<K extends string = string>(rawProps: IBottomTabBarProps<K>) {\n const props = useComponentDefaults<IBottomTabBarProps<K>>(\"BottomTabBar\", rawProps).mergedProps;\n const {\n items,\n value,\n onChange,\n activeColor = \"brand\",\n inactiveColor = \"text-secondary\",\n background = \"surface-card\",\n fabColor,\n showLabels = true,\n testID,\n } = props;\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX — a raw react-native <Text>\n * with a fontSize and no lineHeight gets the FONT'S natural box, and\n * NotoKufiArabic's is too short for its own ascenders. In an RTL script\n * that reads as a BAD TRANSLATION rather than as clipping: ش/س, غ/ع and\n * ة/ه 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 insets = useSafeAreaInsets();\n\n // Resolve tokens → hex with the standalone resolver (the one `Icon` uses),\n // so colors apply on raw RN elements in both app and Storybook contexts.\n const activeC = resolveThemeTokenForNative(activeColor);\n const inactiveC = resolveThemeTokenForNative(inactiveColor);\n const bg = resolveThemeTokenForNative(background);\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fabBg = resolveThemeTokenForNative(fabColor ?? activeColor);\n const danger = resolveThemeTokenForNative(\"danger\");\n\n return (\n <View\n testID={testID}\n style={{\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: BAR_MIN_HEIGHT,\n paddingHorizontal: 20,\n paddingTop: 10,\n paddingBottom: Math.max(insets.bottom, 12),\n backgroundColor: bg,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {items.map((item: ITabBarItem<K>) => {\n const active = item.key === value;\n\n // Centre FAB — a content-width slot (NOT flex:1) so the four\n // side slots distribute evenly; the FAB is lifted in-flow.\n if (item.fab) {\n return (\n <Flex key={item.key} style={{alignItems: \"center\", justifyContent: \"center\"}}>\n <Pressable\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n hitSlop={8}\n style={({pressed}) => [\n {\n width: FAB_SIZE,\n height: FAB_SIZE,\n borderRadius: FAB_SIZE / 2,\n marginTop: -26,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: fabBg,\n borderWidth: 3,\n borderColor: bg,\n shadowColor: fabBg,\n shadowOffset: {width: 0, height: 6},\n shadowOpacity: 0.35,\n shadowRadius: 12,\n elevation: 8,\n },\n pressed && {opacity: 0.9},\n ]}\n >\n <Icon name={item.icon as never} size={26} color=\"#FFFFFF\" />\n </Pressable>\n </Flex>\n );\n }\n\n const color = active ? activeC : inactiveC;\n const iconName = active && item.activeIcon != null ? item.activeIcon : item.icon;\n\n return (\n <Pressable\n key={item.key}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={({pressed}) => [\n {\n flex: 1,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n paddingVertical: 6,\n paddingHorizontal: 4,\n minHeight: 44,\n },\n pressed && {opacity: 0.7},\n ]}\n >\n <View style={{alignItems: \"center\", justifyContent: \"center\", position: \"relative\"}}>\n <Icon name={iconName as never} size={24} color={color} />\n {item.badge != null && item.badge !== false && (\n <Badge badge={item.badge} barBg={bg} dangerColor={danger} />\n )}\n </View>\n {showLabels && item.label != null && (\n <Text numberOfLines={1} style={{fontSize: 11, fontWeight: \"500\", color, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>\n {item.label}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport default BottomTabBar;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/BottomTabBar/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Pressable, Text, View} from \"react-native\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IBottomTabBarProps, ITabBarItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {Box} from \"../../primitives\";\nimport Flex from \"../../layout/Flex\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's AMTabBar geometry (App/src/components/shared/layout).\nconst BAR_MIN_HEIGHT = 60;\nconst FAB_SIZE = 56;\n\nfunction Badge({badge, barBg, dangerColor}: {badge: number | boolean; barBg: string; dangerColor: string}) {\n const isDot = badge === true || badge === 0;\n if (isDot) {\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -2,\n right: -2,\n width: 10,\n height: 10,\n borderRadius: 5,\n backgroundColor: dangerColor,\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n />\n );\n }\n const count = typeof badge === \"number\" ? (badge > 99 ? \"99+\" : String(badge)) : \"\";\n return (\n <Box\n style={{\n position: \"absolute\",\n top: -6,\n right: -10,\n minWidth: 16,\n height: 16,\n borderRadius: 8,\n paddingHorizontal: 4,\n backgroundColor: dangerColor,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 1.5,\n borderColor: barBg,\n zIndex: 10,\n }}\n >\n <Text style={{color: \"#FFFFFF\", fontSize: 9, fontWeight: \"700\", lineHeight: 11}}>{count}</Text>\n </Box>\n );\n}\n\n/**\n * BottomTabBar — iOS/Android bottom navigation with an elevated center FAB.\n *\n * Layout mirrors the app's working `AMTabBar`: a `row` / `space-between` bar\n * with four `flex:1` **column** slots and a content-width centre slot holding\n * the FAB. The FAB is lifted with `marginTop:-26` and ringed with a 3px\n * border so it sits above the bar plane — never absolutely positioned.\n * Presentational + controlled (router-agnostic).\n */\nexport function BottomTabBar<K extends string = string>(rawProps: IBottomTabBarProps<K>) {\n const props = useComponentDefaults<IBottomTabBarProps<K>>(\"BottomTabBar\", rawProps).mergedProps;\n const {\n items,\n value,\n onChange,\n activeColor = \"brand\",\n inactiveColor = \"text-secondary\",\n background = \"surface-card\",\n fabColor,\n showLabels = true,\n testID,\n } = props;\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX — a raw react-native <Text>\n * with a fontSize and no lineHeight gets the FONT'S natural box, and\n * NotoKufiArabic's is too short for its own ascenders. In an RTL script\n * that reads as a BAD TRANSLATION rather than as clipping: ش/س, غ/ع and\n * ة/ه 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 insets = useSafeAreaInsets();\n\n // Resolve tokens → hex with the standalone resolver (the one `Icon` uses),\n // so colors apply on raw RN elements in both app and Storybook contexts.\n const activeC = resolveThemeTokenForNative(activeColor);\n const inactiveC = resolveThemeTokenForNative(inactiveColor);\n const bg = resolveThemeTokenForNative(background);\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fabBg = resolveThemeTokenForNative(fabColor ?? activeColor);\n const danger = resolveThemeTokenForNative(\"danger\");\n\n return (\n <View\n testID={testID}\n style={{\n width: \"100%\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n minHeight: BAR_MIN_HEIGHT,\n paddingHorizontal: 20,\n paddingTop: 10,\n paddingBottom: Math.max(insets.bottom, 12),\n backgroundColor: bg,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {items.map((item: ITabBarItem<K>) => {\n const active = item.key === value;\n\n // Centre FAB — a content-width slot (NOT flex:1) so the four\n // side slots distribute evenly; the FAB is lifted in-flow.\n if (item.fab) {\n return (\n <Flex key={item.key} style={{alignItems: \"center\", justifyContent: \"center\"}}>\n <Pressable\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n hitSlop={8}\n style={({pressed}) => [\n {\n width: FAB_SIZE,\n height: FAB_SIZE,\n borderRadius: FAB_SIZE / 2,\n marginTop: -26,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: fabBg,\n borderWidth: 3,\n borderColor: bg,\n shadowColor: fabBg,\n shadowOffset: {width: 0, height: 6},\n shadowOpacity: 0.35,\n shadowRadius: 12,\n elevation: 8,\n },\n pressed && {opacity: 0.9},\n ]}\n >\n <Icon name={item.icon as never} size={26} color=\"#FFFFFF\" />\n </Pressable>\n </Flex>\n );\n }\n\n const color = active ? activeC : inactiveC;\n const iconName = active && item.activeIcon != null ? item.activeIcon : item.icon;\n\n return (\n <Pressable\n key={item.key}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={({pressed}) => [\n {\n flex: 1,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n paddingVertical: 6,\n paddingHorizontal: 4,\n minHeight: 44,\n },\n pressed && {opacity: 0.7},\n ]}\n >\n <View style={{alignItems: \"center\", justifyContent: \"center\", position: \"relative\"}}>\n <Icon name={iconName as never} size={24} color={color} />\n {item.badge != null && item.badge !== false && (\n <Badge badge={item.badge} barBg={bg} dangerColor={danger} />\n )}\n </View>\n {showLabels && item.label != null && (\n <Text numberOfLines={1} style={{fontSize: 11, fontWeight: \"500\", color, ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {})}}>\n {item.label}\n </Text>\n )}\n </Pressable>\n );\n })}\n </View>\n );\n}\n\nexport default BottomTabBar;\n"],"names":[],"mappings":"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"}
|
|
@@ -61,6 +61,7 @@ require('yup');
|
|
|
61
61
|
require('../../packages/types/src/Css/map/index.cjs');
|
|
62
62
|
require('../../packages/types/src/Theme/shadows.cjs');
|
|
63
63
|
require('../../packages/types/src/Theme/defaultTheme.cjs');
|
|
64
|
+
require('../../packages/types/src/Theme/resolvers.cjs');
|
|
64
65
|
require('../../packages/types/src/Theme/alphaColors.cjs');
|
|
65
66
|
require('../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
|
|
66
67
|
var useSeparator = require('../../apps/mobile/src/Factory/useSeparator.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.cjs","sources":["../../../../src/components/Button/Button.native.tsx"],"sourcesContent":["import React, {useMemo, useCallback, type ElementType, type ReactElement} from 'react';\nimport {\n ActivityIndicator,\n Text as RNText,\n type TextStyle,\n type GestureResponderEvent,\n} from 'react-native';\nimport type {IButtonProps, IconName, IStyleClasses} from '@lmb-it/kitsconcerto-types';\nimport {ResponsiveElement, useSeparator, style as resolveStyle} from '@lmb-it/kitsconcertomobile';\nimport {IconMap} from '../../assets/Icons';\nimport {useLanguage, useComponentDefaults, useThemedFont} from '../../hooks';\nimport {useSeverityColors} from '../../hooks/useSeverityColors';\nimport {useKitsTheme} from '../../contexts/Theme';\n\n/* ─── Size configuration (matches web) ────────────────────────── */\nconst SIZE_MAP = {\n sm: {height: 32, fontSize: 12, px: 10, py: 6, gap: 6, iconSize: 14},\n md: {height: 40, fontSize: 14, px: 16, py: 10, gap: 8, iconSize: 16},\n lg: {height: 48, fontSize: 16, px: 24, py: 12, gap: 10, iconSize: 18},\n} as const;\n\n/* ─── Icon resolver ──────────────────────────────────────────── */\nfunction resolveIcon(\n icon: unknown,\n color: string,\n iconSize: number,\n): React.ReactNode {\n if (!icon) return null;\n if (React.isValidElement(icon)) {\n return React.cloneElement(icon as ReactElement<any>, {color, size: iconSize});\n }\n if (typeof icon === 'function') {\n const Comp = icon as ElementType;\n return <Comp size={iconSize} color={color} />;\n }\n if (typeof icon !== 'string') return null;\n const piMatches = icon.match(/pi-([a-z-]+)/g);\n const iconName = piMatches\n ? (piMatches[piMatches.length - 1]!.replace('pi-', '') as IconName)\n : (icon as IconName);\n const Component = IconMap[iconName];\n if (Component) return <Component size={iconSize} color={color} />;\n return null;\n}\n\n/* ─── Button Component ───────────────────────────────────────── */\nexport function Button(rawProps: IButtonProps<IconName | string | ElementType | ReactElement>) {\n const {mergedProps: props, themeStyle, elementStyles} = useComponentDefaults('Button', rawProps);\n const {\n children,\n label,\n isLoadingText,\n severity = 'brand',\n size = 'md',\n loading,\n iconPos = 'left',\n icon,\n disabled,\n outlined,\n raised,\n rounded,\n testID,\n style: styleProp,\n onPress,\n onClick,\n ...rest\n } = props;\n\n const {t} = useLanguage();\n const labelFont = useThemedFont('body');\n const {cssProps, nativeProps} = useSeparator<Record<any, any>>(rest);\n const sevColors = useSeverityColors((severity as any) ?? 'brand');\n\n const sizeConfig = SIZE_MAP[size as keyof typeof SIZE_MAP] ?? SIZE_MAP.md;\n const isDisabled = disabled || loading;\n\n /* ── Resolve label text ── */\n const resolvedLabel = typeof children === 'string'\n ? children\n : loading && isLoadingText\n ? isLoadingText\n : label ? t(label) : '';\n\n const hasLabel = !!resolvedLabel;\n const isIconOnly = !hasLabel && !!icon;\n\n /* ── Severity colors ── */\n /*\n * ⛔ A DISABLED BUTTON STOPS BEING THE BRAND, IT DOES NOT FADE — and this is\n * the phone's half of the same change made on web.\n *\n * The only disabled treatment was `opacity: isDisabled ? 50 : 100`, so the\n * button kept its brand fill, its white label and its brand border at half\n * strength. Same colour family, same filled shape, same affordance: it reads\n * as a slightly lighter LIVE button, and white on half-opacity brand is near\n * 1.7:1, so the fade hurts the label more than it announces the state.\n *\n * ⛔ THE COMP ALREADY ANSWERED IT: the locked bid rows draw a disabled\n * control as `#EEF0F2` ground with `#9CA3AF` text at FULL opacity.\n * `surface-muted` and `text-subtle` are the theme's own nearest tokens.\n *\n * ⚠️ OUTLINED KEEPS ITS TRANSPARENT GROUND. Filling it grey would make a\n * quiet control louder disabled than enabled.\n */\n const {resolveToken} = useKitsTheme();\n const disabledText = resolveToken('text-subtle');\n const textColor = isDisabled\n ? disabledText\n : outlined ? sevColors.solid : sevColors.solidText;\n const bgColor = outlined\n ? 'transparent'\n : isDisabled ? resolveToken('surface-muted') : sevColors.solid;\n const borderColor = isDisabled\n ? resolveToken('border')\n : sevColors.border || sevColors.solid;\n\n /* ── Build CSS props for ResponsiveElement ── */\n const computedCss:IStyleClasses = useMemo(() => ({\n backgroundColor: bgColor,\n borderColor,\n borderWidth: 1,\n height: sizeConfig.height,\n paddingLeft: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingRight: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: rounded ? 9999 : 6,\n flexDirection: iconPos === 'top' || iconPos === 'bottom'\n ? (iconPos === 'bottom' ? 'column-reverse' : 'column')\n : (iconPos === 'right' ? 'row-reverse' : 'row'),\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n // ⚠️ NO OPACITY BRANCH. The colours above carry the state now; fading\n // them as well would take the new muted label back below legibility.\n opacity: 100,\n alignSelf: 'flex-start',\n overflow: 'hidden',\n ...(raised ? {\n shadowColor: '#000',\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.16,\n shadowRadius: 6,\n elevation: 4,\n } : {}),\n // Theme overrides the defaults above: shared `root` first, then the\n // `text` slot (label buttons) or the `iconOnly` slot. Icon-only buttons\n // are forced square so a `root`/`text` height can never stretch them —\n // the `iconOnly` slot can still override the square if needed.\n ...themeStyle,\n ...(elementStyles.root || {}),\n ...(isIconOnly\n ? {\n width: sizeConfig.height,\n height: sizeConfig.height,\n minWidth: sizeConfig.height,\n ...(elementStyles.iconOnly || {}),\n }\n : (elementStyles.text || {})),\n ...cssProps,\n ...styleProp,\n }), [themeStyle, elementStyles, cssProps, bgColor, borderColor, sizeConfig,\n hasLabel, icon, iconPos, rounded, raised, isDisabled, styleProp, isIconOnly]);\n\n /* ── Icon element ── */\n const iconElement = loading\n ? <ActivityIndicator size=\"small\" color={textColor} />\n : resolveIcon(icon, textColor, sizeConfig.iconSize);\n\n /* ── Text style ── */\n const labelStyle: TextStyle = useMemo(() => ({\n color: textColor,\n fontSize: sizeConfig.fontSize,\n fontWeight: '600',\n lineHeight: sizeConfig.fontSize * 1.2,\n ...(labelFont ? {fontFamily: labelFont} : {}),\n // Theme/per-instance label slot wins — e.g. theme.components.Button.label.style\n // = { lineHeight: 22 } to stop Arabic (NotoKufiArabic) glyphs clipping.\n ...((elementStyles.label as TextStyle) || {}),\n }), [textColor, sizeConfig, labelFont, elementStyles.label]);\n\n /* ── Press handler ── */\n const handlePress = useCallback((e: GestureResponderEvent) => {\n if (isDisabled) return;\n if (onPress) onPress(e as any);\n if (onClick) onClick(e as any);\n }, [isDisabled, onPress, onClick]);\n\n return (\n <ResponsiveElement\n as=\"Pressable\"\n cssProps={computedCss}\n nativeProps={{\n ...nativeProps,\n onPress: handlePress,\n disabled: isDisabled,\n testID,\n accessibilityRole: 'button',\n accessibilityState: {disabled: isDisabled, busy: loading},\n accessibilityLabel: resolvedLabel || undefined,\n }}\n >\n {iconElement}\n {!!hasLabel && (\n <RNText style={labelStyle} numberOfLines={1}>\n {resolvedLabel}\n </RNText>\n )}\n {typeof children !== 'string' ? children : undefined}\n </ResponsiveElement>\n );\n}\n\nexport default Button;\n"],"names":["jsx","IconMap","useComponentDefaults","useLanguage","useThemedFont","useSeparator","useSeverityColors","useKitsTheme","useMemo","ActivityIndicator","useCallback","jsxs","ResponsiveElement","RNText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Button.cjs","sources":["../../../../src/components/Button/Button.native.tsx"],"sourcesContent":["import React, {useMemo, useCallback, type ElementType, type ReactElement} from 'react';\nimport {\n ActivityIndicator,\n Text as RNText,\n type TextStyle,\n type GestureResponderEvent,\n} from 'react-native';\nimport type {IButtonProps, IconName, IStyleClasses} from '@lmb-it/kitsconcerto-types';\nimport {ResponsiveElement, useSeparator, style as resolveStyle} from '@lmb-it/kitsconcertomobile';\nimport {IconMap} from '../../assets/Icons';\nimport {useLanguage, useComponentDefaults, useThemedFont} from '../../hooks';\nimport {useSeverityColors} from '../../hooks/useSeverityColors';\nimport {useKitsTheme} from '../../contexts/Theme';\n\n/* ─── Size configuration (matches web) ────────────────────────── */\nconst SIZE_MAP = {\n sm: {height: 32, fontSize: 12, px: 10, py: 6, gap: 6, iconSize: 14},\n md: {height: 40, fontSize: 14, px: 16, py: 10, gap: 8, iconSize: 16},\n lg: {height: 48, fontSize: 16, px: 24, py: 12, gap: 10, iconSize: 18},\n} as const;\n\n/* ─── Icon resolver ──────────────────────────────────────────── */\nfunction resolveIcon(\n icon: unknown,\n color: string,\n iconSize: number,\n): React.ReactNode {\n if (!icon) return null;\n if (React.isValidElement(icon)) {\n return React.cloneElement(icon as ReactElement<any>, {color, size: iconSize});\n }\n if (typeof icon === 'function') {\n const Comp = icon as ElementType;\n return <Comp size={iconSize} color={color} />;\n }\n if (typeof icon !== 'string') return null;\n const piMatches = icon.match(/pi-([a-z-]+)/g);\n const iconName = piMatches\n ? (piMatches[piMatches.length - 1]!.replace('pi-', '') as IconName)\n : (icon as IconName);\n const Component = IconMap[iconName];\n if (Component) return <Component size={iconSize} color={color} />;\n return null;\n}\n\n/* ─── Button Component ───────────────────────────────────────── */\nexport function Button(rawProps: IButtonProps<IconName | string | ElementType | ReactElement>) {\n const {mergedProps: props, themeStyle, elementStyles} = useComponentDefaults('Button', rawProps);\n const {\n children,\n label,\n isLoadingText,\n severity = 'brand',\n size = 'md',\n loading,\n iconPos = 'left',\n icon,\n disabled,\n outlined,\n raised,\n rounded,\n testID,\n style: styleProp,\n onPress,\n onClick,\n ...rest\n } = props;\n\n const {t} = useLanguage();\n const labelFont = useThemedFont('body');\n const {cssProps, nativeProps} = useSeparator<Record<any, any>>(rest);\n const sevColors = useSeverityColors((severity as any) ?? 'brand');\n\n const sizeConfig = SIZE_MAP[size as keyof typeof SIZE_MAP] ?? SIZE_MAP.md;\n const isDisabled = disabled || loading;\n\n /* ── Resolve label text ── */\n const resolvedLabel = typeof children === 'string'\n ? children\n : loading && isLoadingText\n ? isLoadingText\n : label ? t(label) : '';\n\n const hasLabel = !!resolvedLabel;\n const isIconOnly = !hasLabel && !!icon;\n\n /* ── Severity colors ── */\n /*\n * ⛔ A DISABLED BUTTON STOPS BEING THE BRAND, IT DOES NOT FADE — and this is\n * the phone's half of the same change made on web.\n *\n * The only disabled treatment was `opacity: isDisabled ? 50 : 100`, so the\n * button kept its brand fill, its white label and its brand border at half\n * strength. Same colour family, same filled shape, same affordance: it reads\n * as a slightly lighter LIVE button, and white on half-opacity brand is near\n * 1.7:1, so the fade hurts the label more than it announces the state.\n *\n * ⛔ THE COMP ALREADY ANSWERED IT: the locked bid rows draw a disabled\n * control as `#EEF0F2` ground with `#9CA3AF` text at FULL opacity.\n * `surface-muted` and `text-subtle` are the theme's own nearest tokens.\n *\n * ⚠️ OUTLINED KEEPS ITS TRANSPARENT GROUND. Filling it grey would make a\n * quiet control louder disabled than enabled.\n */\n const {resolveToken} = useKitsTheme();\n const disabledText = resolveToken('text-subtle');\n const textColor = isDisabled\n ? disabledText\n : outlined ? sevColors.solid : sevColors.solidText;\n const bgColor = outlined\n ? 'transparent'\n : isDisabled ? resolveToken('surface-muted') : sevColors.solid;\n const borderColor = isDisabled\n ? resolveToken('border')\n : sevColors.border || sevColors.solid;\n\n /* ── Build CSS props for ResponsiveElement ── */\n const computedCss:IStyleClasses = useMemo(() => ({\n backgroundColor: bgColor,\n borderColor,\n borderWidth: 1,\n height: sizeConfig.height,\n paddingLeft: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingRight: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: rounded ? 9999 : 6,\n flexDirection: iconPos === 'top' || iconPos === 'bottom'\n ? (iconPos === 'bottom' ? 'column-reverse' : 'column')\n : (iconPos === 'right' ? 'row-reverse' : 'row'),\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n // ⚠️ NO OPACITY BRANCH. The colours above carry the state now; fading\n // them as well would take the new muted label back below legibility.\n opacity: 100,\n alignSelf: 'flex-start',\n overflow: 'hidden',\n ...(raised ? {\n shadowColor: '#000',\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.16,\n shadowRadius: 6,\n elevation: 4,\n } : {}),\n // Theme overrides the defaults above: shared `root` first, then the\n // `text` slot (label buttons) or the `iconOnly` slot. Icon-only buttons\n // are forced square so a `root`/`text` height can never stretch them —\n // the `iconOnly` slot can still override the square if needed.\n ...themeStyle,\n ...(elementStyles.root || {}),\n ...(isIconOnly\n ? {\n width: sizeConfig.height,\n height: sizeConfig.height,\n minWidth: sizeConfig.height,\n ...(elementStyles.iconOnly || {}),\n }\n : (elementStyles.text || {})),\n ...cssProps,\n ...styleProp,\n }), [themeStyle, elementStyles, cssProps, bgColor, borderColor, sizeConfig,\n hasLabel, icon, iconPos, rounded, raised, isDisabled, styleProp, isIconOnly]);\n\n /* ── Icon element ── */\n const iconElement = loading\n ? <ActivityIndicator size=\"small\" color={textColor} />\n : resolveIcon(icon, textColor, sizeConfig.iconSize);\n\n /* ── Text style ── */\n const labelStyle: TextStyle = useMemo(() => ({\n color: textColor,\n fontSize: sizeConfig.fontSize,\n fontWeight: '600',\n lineHeight: sizeConfig.fontSize * 1.2,\n ...(labelFont ? {fontFamily: labelFont} : {}),\n // Theme/per-instance label slot wins — e.g. theme.components.Button.label.style\n // = { lineHeight: 22 } to stop Arabic (NotoKufiArabic) glyphs clipping.\n ...((elementStyles.label as TextStyle) || {}),\n }), [textColor, sizeConfig, labelFont, elementStyles.label]);\n\n /* ── Press handler ── */\n const handlePress = useCallback((e: GestureResponderEvent) => {\n if (isDisabled) return;\n if (onPress) onPress(e as any);\n if (onClick) onClick(e as any);\n }, [isDisabled, onPress, onClick]);\n\n return (\n <ResponsiveElement\n as=\"Pressable\"\n cssProps={computedCss}\n nativeProps={{\n ...nativeProps,\n onPress: handlePress,\n disabled: isDisabled,\n testID,\n accessibilityRole: 'button',\n accessibilityState: {disabled: isDisabled, busy: loading},\n accessibilityLabel: resolvedLabel || undefined,\n }}\n >\n {iconElement}\n {!!hasLabel && (\n <RNText style={labelStyle} numberOfLines={1}>\n {resolvedLabel}\n </RNText>\n )}\n {typeof children !== 'string' ? children : undefined}\n </ResponsiveElement>\n );\n}\n\nexport default Button;\n"],"names":["jsx","IconMap","useComponentDefaults","useLanguage","useThemedFont","useSeparator","useSeverityColors","useKitsTheme","useMemo","ActivityIndicator","useCallback","jsxs","ResponsiveElement","RNText"],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ import 'yup';
|
|
|
57
57
|
import '../../packages/types/src/Css/map/index.js';
|
|
58
58
|
import '../../packages/types/src/Theme/shadows.js';
|
|
59
59
|
import '../../packages/types/src/Theme/defaultTheme.js';
|
|
60
|
+
import '../../packages/types/src/Theme/resolvers.js';
|
|
60
61
|
import '../../packages/types/src/Theme/alphaColors.js';
|
|
61
62
|
import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
|
|
62
63
|
import useSeparator from '../../apps/mobile/src/Factory/useSeparator.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../../../../src/components/Button/Button.native.tsx"],"sourcesContent":["import React, {useMemo, useCallback, type ElementType, type ReactElement} from 'react';\nimport {\n ActivityIndicator,\n Text as RNText,\n type TextStyle,\n type GestureResponderEvent,\n} from 'react-native';\nimport type {IButtonProps, IconName, IStyleClasses} from '@lmb-it/kitsconcerto-types';\nimport {ResponsiveElement, useSeparator, style as resolveStyle} from '@lmb-it/kitsconcertomobile';\nimport {IconMap} from '../../assets/Icons';\nimport {useLanguage, useComponentDefaults, useThemedFont} from '../../hooks';\nimport {useSeverityColors} from '../../hooks/useSeverityColors';\nimport {useKitsTheme} from '../../contexts/Theme';\n\n/* ─── Size configuration (matches web) ────────────────────────── */\nconst SIZE_MAP = {\n sm: {height: 32, fontSize: 12, px: 10, py: 6, gap: 6, iconSize: 14},\n md: {height: 40, fontSize: 14, px: 16, py: 10, gap: 8, iconSize: 16},\n lg: {height: 48, fontSize: 16, px: 24, py: 12, gap: 10, iconSize: 18},\n} as const;\n\n/* ─── Icon resolver ──────────────────────────────────────────── */\nfunction resolveIcon(\n icon: unknown,\n color: string,\n iconSize: number,\n): React.ReactNode {\n if (!icon) return null;\n if (React.isValidElement(icon)) {\n return React.cloneElement(icon as ReactElement<any>, {color, size: iconSize});\n }\n if (typeof icon === 'function') {\n const Comp = icon as ElementType;\n return <Comp size={iconSize} color={color} />;\n }\n if (typeof icon !== 'string') return null;\n const piMatches = icon.match(/pi-([a-z-]+)/g);\n const iconName = piMatches\n ? (piMatches[piMatches.length - 1]!.replace('pi-', '') as IconName)\n : (icon as IconName);\n const Component = IconMap[iconName];\n if (Component) return <Component size={iconSize} color={color} />;\n return null;\n}\n\n/* ─── Button Component ───────────────────────────────────────── */\nexport function Button(rawProps: IButtonProps<IconName | string | ElementType | ReactElement>) {\n const {mergedProps: props, themeStyle, elementStyles} = useComponentDefaults('Button', rawProps);\n const {\n children,\n label,\n isLoadingText,\n severity = 'brand',\n size = 'md',\n loading,\n iconPos = 'left',\n icon,\n disabled,\n outlined,\n raised,\n rounded,\n testID,\n style: styleProp,\n onPress,\n onClick,\n ...rest\n } = props;\n\n const {t} = useLanguage();\n const labelFont = useThemedFont('body');\n const {cssProps, nativeProps} = useSeparator<Record<any, any>>(rest);\n const sevColors = useSeverityColors((severity as any) ?? 'brand');\n\n const sizeConfig = SIZE_MAP[size as keyof typeof SIZE_MAP] ?? SIZE_MAP.md;\n const isDisabled = disabled || loading;\n\n /* ── Resolve label text ── */\n const resolvedLabel = typeof children === 'string'\n ? children\n : loading && isLoadingText\n ? isLoadingText\n : label ? t(label) : '';\n\n const hasLabel = !!resolvedLabel;\n const isIconOnly = !hasLabel && !!icon;\n\n /* ── Severity colors ── */\n /*\n * ⛔ A DISABLED BUTTON STOPS BEING THE BRAND, IT DOES NOT FADE — and this is\n * the phone's half of the same change made on web.\n *\n * The only disabled treatment was `opacity: isDisabled ? 50 : 100`, so the\n * button kept its brand fill, its white label and its brand border at half\n * strength. Same colour family, same filled shape, same affordance: it reads\n * as a slightly lighter LIVE button, and white on half-opacity brand is near\n * 1.7:1, so the fade hurts the label more than it announces the state.\n *\n * ⛔ THE COMP ALREADY ANSWERED IT: the locked bid rows draw a disabled\n * control as `#EEF0F2` ground with `#9CA3AF` text at FULL opacity.\n * `surface-muted` and `text-subtle` are the theme's own nearest tokens.\n *\n * ⚠️ OUTLINED KEEPS ITS TRANSPARENT GROUND. Filling it grey would make a\n * quiet control louder disabled than enabled.\n */\n const {resolveToken} = useKitsTheme();\n const disabledText = resolveToken('text-subtle');\n const textColor = isDisabled\n ? disabledText\n : outlined ? sevColors.solid : sevColors.solidText;\n const bgColor = outlined\n ? 'transparent'\n : isDisabled ? resolveToken('surface-muted') : sevColors.solid;\n const borderColor = isDisabled\n ? resolveToken('border')\n : sevColors.border || sevColors.solid;\n\n /* ── Build CSS props for ResponsiveElement ── */\n const computedCss:IStyleClasses = useMemo(() => ({\n backgroundColor: bgColor,\n borderColor,\n borderWidth: 1,\n height: sizeConfig.height,\n paddingLeft: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingRight: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: rounded ? 9999 : 6,\n flexDirection: iconPos === 'top' || iconPos === 'bottom'\n ? (iconPos === 'bottom' ? 'column-reverse' : 'column')\n : (iconPos === 'right' ? 'row-reverse' : 'row'),\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n // ⚠️ NO OPACITY BRANCH. The colours above carry the state now; fading\n // them as well would take the new muted label back below legibility.\n opacity: 100,\n alignSelf: 'flex-start',\n overflow: 'hidden',\n ...(raised ? {\n shadowColor: '#000',\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.16,\n shadowRadius: 6,\n elevation: 4,\n } : {}),\n // Theme overrides the defaults above: shared `root` first, then the\n // `text` slot (label buttons) or the `iconOnly` slot. Icon-only buttons\n // are forced square so a `root`/`text` height can never stretch them —\n // the `iconOnly` slot can still override the square if needed.\n ...themeStyle,\n ...(elementStyles.root || {}),\n ...(isIconOnly\n ? {\n width: sizeConfig.height,\n height: sizeConfig.height,\n minWidth: sizeConfig.height,\n ...(elementStyles.iconOnly || {}),\n }\n : (elementStyles.text || {})),\n ...cssProps,\n ...styleProp,\n }), [themeStyle, elementStyles, cssProps, bgColor, borderColor, sizeConfig,\n hasLabel, icon, iconPos, rounded, raised, isDisabled, styleProp, isIconOnly]);\n\n /* ── Icon element ── */\n const iconElement = loading\n ? <ActivityIndicator size=\"small\" color={textColor} />\n : resolveIcon(icon, textColor, sizeConfig.iconSize);\n\n /* ── Text style ── */\n const labelStyle: TextStyle = useMemo(() => ({\n color: textColor,\n fontSize: sizeConfig.fontSize,\n fontWeight: '600',\n lineHeight: sizeConfig.fontSize * 1.2,\n ...(labelFont ? {fontFamily: labelFont} : {}),\n // Theme/per-instance label slot wins — e.g. theme.components.Button.label.style\n // = { lineHeight: 22 } to stop Arabic (NotoKufiArabic) glyphs clipping.\n ...((elementStyles.label as TextStyle) || {}),\n }), [textColor, sizeConfig, labelFont, elementStyles.label]);\n\n /* ── Press handler ── */\n const handlePress = useCallback((e: GestureResponderEvent) => {\n if (isDisabled) return;\n if (onPress) onPress(e as any);\n if (onClick) onClick(e as any);\n }, [isDisabled, onPress, onClick]);\n\n return (\n <ResponsiveElement\n as=\"Pressable\"\n cssProps={computedCss}\n nativeProps={{\n ...nativeProps,\n onPress: handlePress,\n disabled: isDisabled,\n testID,\n accessibilityRole: 'button',\n accessibilityState: {disabled: isDisabled, busy: loading},\n accessibilityLabel: resolvedLabel || undefined,\n }}\n >\n {iconElement}\n {!!hasLabel && (\n <RNText style={labelStyle} numberOfLines={1}>\n {resolvedLabel}\n </RNText>\n )}\n {typeof children !== 'string' ? children : undefined}\n </ResponsiveElement>\n );\n}\n\nexport default Button;\n"],"names":["RNText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../../../src/components/Button/Button.native.tsx"],"sourcesContent":["import React, {useMemo, useCallback, type ElementType, type ReactElement} from 'react';\nimport {\n ActivityIndicator,\n Text as RNText,\n type TextStyle,\n type GestureResponderEvent,\n} from 'react-native';\nimport type {IButtonProps, IconName, IStyleClasses} from '@lmb-it/kitsconcerto-types';\nimport {ResponsiveElement, useSeparator, style as resolveStyle} from '@lmb-it/kitsconcertomobile';\nimport {IconMap} from '../../assets/Icons';\nimport {useLanguage, useComponentDefaults, useThemedFont} from '../../hooks';\nimport {useSeverityColors} from '../../hooks/useSeverityColors';\nimport {useKitsTheme} from '../../contexts/Theme';\n\n/* ─── Size configuration (matches web) ────────────────────────── */\nconst SIZE_MAP = {\n sm: {height: 32, fontSize: 12, px: 10, py: 6, gap: 6, iconSize: 14},\n md: {height: 40, fontSize: 14, px: 16, py: 10, gap: 8, iconSize: 16},\n lg: {height: 48, fontSize: 16, px: 24, py: 12, gap: 10, iconSize: 18},\n} as const;\n\n/* ─── Icon resolver ──────────────────────────────────────────── */\nfunction resolveIcon(\n icon: unknown,\n color: string,\n iconSize: number,\n): React.ReactNode {\n if (!icon) return null;\n if (React.isValidElement(icon)) {\n return React.cloneElement(icon as ReactElement<any>, {color, size: iconSize});\n }\n if (typeof icon === 'function') {\n const Comp = icon as ElementType;\n return <Comp size={iconSize} color={color} />;\n }\n if (typeof icon !== 'string') return null;\n const piMatches = icon.match(/pi-([a-z-]+)/g);\n const iconName = piMatches\n ? (piMatches[piMatches.length - 1]!.replace('pi-', '') as IconName)\n : (icon as IconName);\n const Component = IconMap[iconName];\n if (Component) return <Component size={iconSize} color={color} />;\n return null;\n}\n\n/* ─── Button Component ───────────────────────────────────────── */\nexport function Button(rawProps: IButtonProps<IconName | string | ElementType | ReactElement>) {\n const {mergedProps: props, themeStyle, elementStyles} = useComponentDefaults('Button', rawProps);\n const {\n children,\n label,\n isLoadingText,\n severity = 'brand',\n size = 'md',\n loading,\n iconPos = 'left',\n icon,\n disabled,\n outlined,\n raised,\n rounded,\n testID,\n style: styleProp,\n onPress,\n onClick,\n ...rest\n } = props;\n\n const {t} = useLanguage();\n const labelFont = useThemedFont('body');\n const {cssProps, nativeProps} = useSeparator<Record<any, any>>(rest);\n const sevColors = useSeverityColors((severity as any) ?? 'brand');\n\n const sizeConfig = SIZE_MAP[size as keyof typeof SIZE_MAP] ?? SIZE_MAP.md;\n const isDisabled = disabled || loading;\n\n /* ── Resolve label text ── */\n const resolvedLabel = typeof children === 'string'\n ? children\n : loading && isLoadingText\n ? isLoadingText\n : label ? t(label) : '';\n\n const hasLabel = !!resolvedLabel;\n const isIconOnly = !hasLabel && !!icon;\n\n /* ── Severity colors ── */\n /*\n * ⛔ A DISABLED BUTTON STOPS BEING THE BRAND, IT DOES NOT FADE — and this is\n * the phone's half of the same change made on web.\n *\n * The only disabled treatment was `opacity: isDisabled ? 50 : 100`, so the\n * button kept its brand fill, its white label and its brand border at half\n * strength. Same colour family, same filled shape, same affordance: it reads\n * as a slightly lighter LIVE button, and white on half-opacity brand is near\n * 1.7:1, so the fade hurts the label more than it announces the state.\n *\n * ⛔ THE COMP ALREADY ANSWERED IT: the locked bid rows draw a disabled\n * control as `#EEF0F2` ground with `#9CA3AF` text at FULL opacity.\n * `surface-muted` and `text-subtle` are the theme's own nearest tokens.\n *\n * ⚠️ OUTLINED KEEPS ITS TRANSPARENT GROUND. Filling it grey would make a\n * quiet control louder disabled than enabled.\n */\n const {resolveToken} = useKitsTheme();\n const disabledText = resolveToken('text-subtle');\n const textColor = isDisabled\n ? disabledText\n : outlined ? sevColors.solid : sevColors.solidText;\n const bgColor = outlined\n ? 'transparent'\n : isDisabled ? resolveToken('surface-muted') : sevColors.solid;\n const borderColor = isDisabled\n ? resolveToken('border')\n : sevColors.border || sevColors.solid;\n\n /* ── Build CSS props for ResponsiveElement ── */\n const computedCss:IStyleClasses = useMemo(() => ({\n backgroundColor: bgColor,\n borderColor,\n borderWidth: 1,\n height: sizeConfig.height,\n paddingLeft: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingRight: hasLabel ? sizeConfig.px : sizeConfig.py,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: rounded ? 9999 : 6,\n flexDirection: iconPos === 'top' || iconPos === 'bottom'\n ? (iconPos === 'bottom' ? 'column-reverse' : 'column')\n : (iconPos === 'right' ? 'row-reverse' : 'row'),\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n // ⚠️ NO OPACITY BRANCH. The colours above carry the state now; fading\n // them as well would take the new muted label back below legibility.\n opacity: 100,\n alignSelf: 'flex-start',\n overflow: 'hidden',\n ...(raised ? {\n shadowColor: '#000',\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.16,\n shadowRadius: 6,\n elevation: 4,\n } : {}),\n // Theme overrides the defaults above: shared `root` first, then the\n // `text` slot (label buttons) or the `iconOnly` slot. Icon-only buttons\n // are forced square so a `root`/`text` height can never stretch them —\n // the `iconOnly` slot can still override the square if needed.\n ...themeStyle,\n ...(elementStyles.root || {}),\n ...(isIconOnly\n ? {\n width: sizeConfig.height,\n height: sizeConfig.height,\n minWidth: sizeConfig.height,\n ...(elementStyles.iconOnly || {}),\n }\n : (elementStyles.text || {})),\n ...cssProps,\n ...styleProp,\n }), [themeStyle, elementStyles, cssProps, bgColor, borderColor, sizeConfig,\n hasLabel, icon, iconPos, rounded, raised, isDisabled, styleProp, isIconOnly]);\n\n /* ── Icon element ── */\n const iconElement = loading\n ? <ActivityIndicator size=\"small\" color={textColor} />\n : resolveIcon(icon, textColor, sizeConfig.iconSize);\n\n /* ── Text style ── */\n const labelStyle: TextStyle = useMemo(() => ({\n color: textColor,\n fontSize: sizeConfig.fontSize,\n fontWeight: '600',\n lineHeight: sizeConfig.fontSize * 1.2,\n ...(labelFont ? {fontFamily: labelFont} : {}),\n // Theme/per-instance label slot wins — e.g. theme.components.Button.label.style\n // = { lineHeight: 22 } to stop Arabic (NotoKufiArabic) glyphs clipping.\n ...((elementStyles.label as TextStyle) || {}),\n }), [textColor, sizeConfig, labelFont, elementStyles.label]);\n\n /* ── Press handler ── */\n const handlePress = useCallback((e: GestureResponderEvent) => {\n if (isDisabled) return;\n if (onPress) onPress(e as any);\n if (onClick) onClick(e as any);\n }, [isDisabled, onPress, onClick]);\n\n return (\n <ResponsiveElement\n as=\"Pressable\"\n cssProps={computedCss}\n nativeProps={{\n ...nativeProps,\n onPress: handlePress,\n disabled: isDisabled,\n testID,\n accessibilityRole: 'button',\n accessibilityState: {disabled: isDisabled, busy: loading},\n accessibilityLabel: resolvedLabel || undefined,\n }}\n >\n {iconElement}\n {!!hasLabel && (\n <RNText style={labelStyle} numberOfLines={1}>\n {resolvedLabel}\n </RNText>\n )}\n {typeof children !== 'string' ? children : undefined}\n </ResponsiveElement>\n );\n}\n\nexport default Button;\n"],"names":["RNText"],"mappings":"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"}
|