@lmb-it/kitsconcerto-native 0.1.274 → 0.1.276
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Avatar/index.cjs +1 -0
- package/components/Avatar/index.cjs.map +1 -1
- package/components/Avatar/index.js +1 -0
- package/components/Avatar/index.js.map +1 -1
- package/components/Banner/banner.cjs +1 -0
- package/components/Banner/banner.cjs.map +1 -1
- package/components/Banner/banner.js +1 -0
- package/components/Banner/banner.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/Carousel/index.cjs +1 -0
- package/components/Carousel/index.cjs.map +1 -1
- package/components/Carousel/index.js +1 -0
- package/components/Carousel/index.js.map +1 -1
- package/components/ChatBubble/index.cjs +1 -0
- package/components/ChatBubble/index.cjs.map +1 -1
- package/components/ChatBubble/index.js +1 -0
- package/components/ChatBubble/index.js.map +1 -1
- package/components/Chip/index.cjs +1 -0
- package/components/Chip/index.cjs.map +1 -1
- package/components/Chip/index.js +1 -0
- package/components/Chip/index.js.map +1 -1
- package/components/DateSeparator/index.cjs +1 -0
- package/components/DateSeparator/index.cjs.map +1 -1
- package/components/DateSeparator/index.js +1 -0
- package/components/DateSeparator/index.js.map +1 -1
- package/components/DetailsList/index.cjs +1 -0
- package/components/DetailsList/index.cjs.map +1 -1
- package/components/DetailsList/index.js +1 -0
- package/components/DetailsList/index.js.map +1 -1
- package/components/EmptyState/index.cjs +1 -0
- package/components/EmptyState/index.cjs.map +1 -1
- package/components/EmptyState/index.js +1 -0
- package/components/EmptyState/index.js.map +1 -1
- package/components/Gallery/index.cjs +1 -0
- package/components/Gallery/index.cjs.map +1 -1
- package/components/Gallery/index.js +1 -0
- package/components/Gallery/index.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/MessageReceipt/index.cjs +1 -0
- package/components/MessageReceipt/index.cjs.map +1 -1
- package/components/MessageReceipt/index.js +1 -0
- package/components/MessageReceipt/index.js.map +1 -1
- package/components/ProgressBar/index.cjs +1 -0
- package/components/ProgressBar/index.cjs.map +1 -1
- package/components/ProgressBar/index.js +1 -0
- package/components/ProgressBar/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/StatCard/index.cjs +1 -0
- package/components/StatCard/index.cjs.map +1 -1
- package/components/StatCard/index.js +1 -0
- package/components/StatCard/index.js.map +1 -1
- package/components/Stepper/index.cjs +1 -0
- package/components/Stepper/index.cjs.map +1 -1
- package/components/Stepper/index.js +1 -0
- package/components/Stepper/index.js.map +1 -1
- package/components/Tabs/index.cjs +1 -0
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +1 -0
- package/components/Tabs/index.js.map +1 -1
- package/components/Timeline/index.cjs +1 -0
- package/components/Timeline/index.cjs.map +1 -1
- package/components/Timeline/index.js +1 -0
- package/components/Timeline/index.js.map +1 -1
- package/components/Translate/index.cjs +1 -0
- package/components/Translate/index.cjs.map +1 -1
- package/components/Translate/index.js +1 -0
- package/components/Translate/index.js.map +1 -1
- package/components/TypingIndicator/index.cjs +1 -0
- package/components/TypingIndicator/index.cjs.map +1 -1
- package/components/TypingIndicator/index.js +1 -0
- package/components/TypingIndicator/index.js.map +1 -1
- package/components/overlay/ConfirmDialog/index.cjs +1 -0
- package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
- package/components/overlay/ConfirmDialog/index.js +1 -0
- package/components/overlay/ConfirmDialog/index.js.map +1 -1
- package/components/overlay/Dialog/index.cjs +1 -0
- package/components/overlay/Dialog/index.cjs.map +1 -1
- package/components/overlay/Dialog/index.js +1 -0
- package/components/overlay/Dialog/index.js.map +1 -1
- package/contexts/PermissionsContext.cjs +2 -0
- package/contexts/PermissionsContext.cjs.map +1 -1
- package/contexts/PermissionsContext.js +3 -2
- package/contexts/PermissionsContext.js.map +1 -1
- package/form/controls/Checkbox/index.cjs +1 -0
- package/form/controls/Checkbox/index.cjs.map +1 -1
- package/form/controls/Checkbox/index.js +1 -0
- package/form/controls/Checkbox/index.js.map +1 -1
- package/form/controls/RadioButton/radio.cjs +1 -0
- package/form/controls/RadioButton/radio.cjs.map +1 -1
- package/form/controls/RadioButton/radio.js +1 -0
- package/form/controls/RadioButton/radio.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/index.cjs +1 -0
- package/form/file-pickers/index.cjs.map +1 -1
- package/form/file-pickers/index.js +1 -0
- package/form/file-pickers/index.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/inputs/ColorPicker/index.cjs +1 -0
- package/form/inputs/ColorPicker/index.cjs.map +1 -1
- package/form/inputs/ColorPicker/index.js +1 -0
- package/form/inputs/ColorPicker/index.js.map +1 -1
- package/form/inputs/Datepicker/index.cjs +1 -0
- package/form/inputs/Datepicker/index.cjs.map +1 -1
- package/form/inputs/Datepicker/index.js +1 -0
- package/form/inputs/Datepicker/index.js.map +1 -1
- package/form/inputs/InputLocation/index.cjs +1 -0
- package/form/inputs/InputLocation/index.cjs.map +1 -1
- package/form/inputs/InputLocation/index.js +1 -0
- package/form/inputs/InputLocation/index.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/CascadeSelect/index.cjs +1 -0
- package/form/selects/CascadeSelect/index.cjs.map +1 -1
- package/form/selects/CascadeSelect/index.js +1 -0
- package/form/selects/CascadeSelect/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
- package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.js +1 -0
- package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
- package/form-renderer/components/fields/Group/index.cjs +1 -0
- package/form-renderer/components/fields/Group/index.cjs.map +1 -1
- package/form-renderer/components/fields/Group/index.js +1 -0
- package/form-renderer/components/fields/Group/index.js.map +1 -1
- package/form-renderer/components/fields/Radios/index.cjs +1 -0
- package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
- package/form-renderer/components/fields/Radios/index.js +1 -0
- package/form-renderer/components/fields/Radios/index.js.map +1 -1
- package/form-renderer/components/fields/Select/index.cjs +1 -0
- package/form-renderer/components/fields/Select/index.cjs.map +1 -1
- package/form-renderer/components/fields/Select/index.js +1 -0
- package/form-renderer/components/fields/Select/index.js.map +1 -1
- package/hooks/main.cjs +1 -0
- package/hooks/main.cjs.map +1 -1
- package/hooks/main.js +1 -0
- package/hooks/main.js.map +1 -1
- package/index.cjs +3 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +14 -2
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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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"}
|
|
@@ -84,6 +84,7 @@ import '../../apps/mobile/src/Core/Input/Slot.js';
|
|
|
84
84
|
import { IconMap } from '../../assets/Icons/index.js';
|
|
85
85
|
import { useLanguage } from '../../hooks/locale.js';
|
|
86
86
|
import '../../contexts/DialogContext.js';
|
|
87
|
+
import '../../contexts/PermissionsContext.js';
|
|
87
88
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
88
89
|
import { useSeverityColors } from '../../hooks/useSeverityColors.js';
|
|
89
90
|
import useThemedFont from '../../hooks/useThemedFont.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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"}
|
|
@@ -7,6 +7,7 @@ var Animated = require('react-native-reanimated');
|
|
|
7
7
|
var index = require('../../primitives/Box/index.cjs');
|
|
8
8
|
var index_native = require('../../primitives/Text/index.cjs');
|
|
9
9
|
require('../../contexts/DialogContext.cjs');
|
|
10
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
10
11
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
11
12
|
|
|
12
13
|
const DOT = 7;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Carousel/index.native.tsx"],"sourcesContent":["import React, {useRef, useState} from \"react\";\nimport {View, ScrollView, Image as RNImage, type NativeSyntheticEvent, type NativeScrollEvent} from \"react-native\";\nimport Animated, {useAnimatedStyle, withTiming} from \"react-native-reanimated\";\nimport type {ICarouselProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/** Page-dot geometry — kept in sync with the animated indicator's travel. */\nconst DOT = 7;\nconst DOT_GAP = 6;\nconst STEP = DOT + DOT_GAP;\n\n/**\n * Carousel — swipeable paged image viewer with a counter + dots overlay.\n * Native: a paging `ScrollView`; the active page is tracked on momentum end.\n */\nexport function Carousel(rawProps: ICarouselProps) {\n const props = useComponentDefaults<ICarouselProps>(\"Carousel\", rawProps).mergedProps;\n const {images, aspectRatio = 1.2, radius = 0, showCounter = true, showDots = true, onIndexChange, testID} = props;\n\n const [w, setW] = useState(0);\n const [active, setActive] = useState(0);\n const scrollRef = useRef<ScrollView>(null);\n const h = w > 0 ? Math.round(w / aspectRatio) : 0;\n\n // Active-dot indicator slides between page dots when `active` changes.\n const indicatorStyle = useAnimatedStyle(() => ({\n transform: [{translateX: withTiming(active * STEP, {duration: 250})}],\n }));\n\n const onMomentumEnd = (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const vw = e.nativeEvent.layoutMeasurement.width || w || 1;\n const i = Math.max(0, Math.min(images.length - 1, Math.round(e.nativeEvent.contentOffset.x / vw)));\n if (i !== active) {\n setActive(i);\n onIndexChange?.(i);\n }\n };\n\n return (\n <View\n testID={testID}\n onLayout={e => setW(e.nativeEvent.layout.width)}\n style={{width: \"100%\", position: \"relative\", borderRadius: radius, overflow: \"hidden\"}}\n >\n <ScrollView\n ref={scrollRef}\n horizontal\n pagingEnabled\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={onMomentumEnd}\n scrollEventThrottle={16}\n >\n {images.map((src, i) => (\n <RNImage key={i} source={{uri: src}} resizeMode=\"cover\" style={{width: w, height: h}} />\n ))}\n </ScrollView>\n\n {showCounter && images.length > 0 && (\n <Box\n position=\"absolute\"\n top={8}\n right={8}\n bgColor=\"rgba(0,0,0,0.55)\"\n paddingLeft={8}\n paddingRight={8}\n paddingTop={2}\n paddingBottom={2}\n borderRadius={999}\n >\n <Text color=\"#FFFFFF\" fontSize={11} fontWeight=\"700\">\n {active + 1} / {images.length}\n </Text>\n </Box>\n )}\n\n {showDots && images.length > 1 && (\n <View style={{position: \"absolute\", bottom: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\"}}>\n <View style={{position: \"relative\", flexDirection: \"row\", gap: DOT_GAP}}>\n {images.map((_, i) => (\n <View\n key={i}\n style={{width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"rgba(255,255,255,0.5)\"}}\n />\n ))}\n <Animated.View\n style={[\n {position: \"absolute\", top: 0, left: 0, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"#FFFFFF\"},\n indicatorStyle,\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n}\n\nexport default Carousel;\n"],"names":["useComponentDefaults","useState","useRef","useAnimatedStyle","withTiming","jsxs","View","jsx","ScrollView","RNImage","Box","Text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Carousel/index.native.tsx"],"sourcesContent":["import React, {useRef, useState} from \"react\";\nimport {View, ScrollView, Image as RNImage, type NativeSyntheticEvent, type NativeScrollEvent} from \"react-native\";\nimport Animated, {useAnimatedStyle, withTiming} from \"react-native-reanimated\";\nimport type {ICarouselProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/** Page-dot geometry — kept in sync with the animated indicator's travel. */\nconst DOT = 7;\nconst DOT_GAP = 6;\nconst STEP = DOT + DOT_GAP;\n\n/**\n * Carousel — swipeable paged image viewer with a counter + dots overlay.\n * Native: a paging `ScrollView`; the active page is tracked on momentum end.\n */\nexport function Carousel(rawProps: ICarouselProps) {\n const props = useComponentDefaults<ICarouselProps>(\"Carousel\", rawProps).mergedProps;\n const {images, aspectRatio = 1.2, radius = 0, showCounter = true, showDots = true, onIndexChange, testID} = props;\n\n const [w, setW] = useState(0);\n const [active, setActive] = useState(0);\n const scrollRef = useRef<ScrollView>(null);\n const h = w > 0 ? Math.round(w / aspectRatio) : 0;\n\n // Active-dot indicator slides between page dots when `active` changes.\n const indicatorStyle = useAnimatedStyle(() => ({\n transform: [{translateX: withTiming(active * STEP, {duration: 250})}],\n }));\n\n const onMomentumEnd = (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const vw = e.nativeEvent.layoutMeasurement.width || w || 1;\n const i = Math.max(0, Math.min(images.length - 1, Math.round(e.nativeEvent.contentOffset.x / vw)));\n if (i !== active) {\n setActive(i);\n onIndexChange?.(i);\n }\n };\n\n return (\n <View\n testID={testID}\n onLayout={e => setW(e.nativeEvent.layout.width)}\n style={{width: \"100%\", position: \"relative\", borderRadius: radius, overflow: \"hidden\"}}\n >\n <ScrollView\n ref={scrollRef}\n horizontal\n pagingEnabled\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={onMomentumEnd}\n scrollEventThrottle={16}\n >\n {images.map((src, i) => (\n <RNImage key={i} source={{uri: src}} resizeMode=\"cover\" style={{width: w, height: h}} />\n ))}\n </ScrollView>\n\n {showCounter && images.length > 0 && (\n <Box\n position=\"absolute\"\n top={8}\n right={8}\n bgColor=\"rgba(0,0,0,0.55)\"\n paddingLeft={8}\n paddingRight={8}\n paddingTop={2}\n paddingBottom={2}\n borderRadius={999}\n >\n <Text color=\"#FFFFFF\" fontSize={11} fontWeight=\"700\">\n {active + 1} / {images.length}\n </Text>\n </Box>\n )}\n\n {showDots && images.length > 1 && (\n <View style={{position: \"absolute\", bottom: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\"}}>\n <View style={{position: \"relative\", flexDirection: \"row\", gap: DOT_GAP}}>\n {images.map((_, i) => (\n <View\n key={i}\n style={{width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"rgba(255,255,255,0.5)\"}}\n />\n ))}\n <Animated.View\n style={[\n {position: \"absolute\", top: 0, left: 0, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"#FFFFFF\"},\n indicatorStyle,\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n}\n\nexport default Carousel;\n"],"names":["useComponentDefaults","useState","useRef","useAnimatedStyle","withTiming","jsxs","View","jsx","ScrollView","RNImage","Box","Text"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated'
|
|
|
5
5
|
import Box from '../../primitives/Box/index.js';
|
|
6
6
|
import Text from '../../primitives/Text/index.js';
|
|
7
7
|
import '../../contexts/DialogContext.js';
|
|
8
|
+
import '../../contexts/PermissionsContext.js';
|
|
8
9
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
9
10
|
|
|
10
11
|
const DOT = 7;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Carousel/index.native.tsx"],"sourcesContent":["import React, {useRef, useState} from \"react\";\nimport {View, ScrollView, Image as RNImage, type NativeSyntheticEvent, type NativeScrollEvent} from \"react-native\";\nimport Animated, {useAnimatedStyle, withTiming} from \"react-native-reanimated\";\nimport type {ICarouselProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/** Page-dot geometry — kept in sync with the animated indicator's travel. */\nconst DOT = 7;\nconst DOT_GAP = 6;\nconst STEP = DOT + DOT_GAP;\n\n/**\n * Carousel — swipeable paged image viewer with a counter + dots overlay.\n * Native: a paging `ScrollView`; the active page is tracked on momentum end.\n */\nexport function Carousel(rawProps: ICarouselProps) {\n const props = useComponentDefaults<ICarouselProps>(\"Carousel\", rawProps).mergedProps;\n const {images, aspectRatio = 1.2, radius = 0, showCounter = true, showDots = true, onIndexChange, testID} = props;\n\n const [w, setW] = useState(0);\n const [active, setActive] = useState(0);\n const scrollRef = useRef<ScrollView>(null);\n const h = w > 0 ? Math.round(w / aspectRatio) : 0;\n\n // Active-dot indicator slides between page dots when `active` changes.\n const indicatorStyle = useAnimatedStyle(() => ({\n transform: [{translateX: withTiming(active * STEP, {duration: 250})}],\n }));\n\n const onMomentumEnd = (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const vw = e.nativeEvent.layoutMeasurement.width || w || 1;\n const i = Math.max(0, Math.min(images.length - 1, Math.round(e.nativeEvent.contentOffset.x / vw)));\n if (i !== active) {\n setActive(i);\n onIndexChange?.(i);\n }\n };\n\n return (\n <View\n testID={testID}\n onLayout={e => setW(e.nativeEvent.layout.width)}\n style={{width: \"100%\", position: \"relative\", borderRadius: radius, overflow: \"hidden\"}}\n >\n <ScrollView\n ref={scrollRef}\n horizontal\n pagingEnabled\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={onMomentumEnd}\n scrollEventThrottle={16}\n >\n {images.map((src, i) => (\n <RNImage key={i} source={{uri: src}} resizeMode=\"cover\" style={{width: w, height: h}} />\n ))}\n </ScrollView>\n\n {showCounter && images.length > 0 && (\n <Box\n position=\"absolute\"\n top={8}\n right={8}\n bgColor=\"rgba(0,0,0,0.55)\"\n paddingLeft={8}\n paddingRight={8}\n paddingTop={2}\n paddingBottom={2}\n borderRadius={999}\n >\n <Text color=\"#FFFFFF\" fontSize={11} fontWeight=\"700\">\n {active + 1} / {images.length}\n </Text>\n </Box>\n )}\n\n {showDots && images.length > 1 && (\n <View style={{position: \"absolute\", bottom: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\"}}>\n <View style={{position: \"relative\", flexDirection: \"row\", gap: DOT_GAP}}>\n {images.map((_, i) => (\n <View\n key={i}\n style={{width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"rgba(255,255,255,0.5)\"}}\n />\n ))}\n <Animated.View\n style={[\n {position: \"absolute\", top: 0, left: 0, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"#FFFFFF\"},\n indicatorStyle,\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n}\n\nexport default Carousel;\n"],"names":["RNImage"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Carousel/index.native.tsx"],"sourcesContent":["import React, {useRef, useState} from \"react\";\nimport {View, ScrollView, Image as RNImage, type NativeSyntheticEvent, type NativeScrollEvent} from \"react-native\";\nimport Animated, {useAnimatedStyle, withTiming} from \"react-native-reanimated\";\nimport type {ICarouselProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/** Page-dot geometry — kept in sync with the animated indicator's travel. */\nconst DOT = 7;\nconst DOT_GAP = 6;\nconst STEP = DOT + DOT_GAP;\n\n/**\n * Carousel — swipeable paged image viewer with a counter + dots overlay.\n * Native: a paging `ScrollView`; the active page is tracked on momentum end.\n */\nexport function Carousel(rawProps: ICarouselProps) {\n const props = useComponentDefaults<ICarouselProps>(\"Carousel\", rawProps).mergedProps;\n const {images, aspectRatio = 1.2, radius = 0, showCounter = true, showDots = true, onIndexChange, testID} = props;\n\n const [w, setW] = useState(0);\n const [active, setActive] = useState(0);\n const scrollRef = useRef<ScrollView>(null);\n const h = w > 0 ? Math.round(w / aspectRatio) : 0;\n\n // Active-dot indicator slides between page dots when `active` changes.\n const indicatorStyle = useAnimatedStyle(() => ({\n transform: [{translateX: withTiming(active * STEP, {duration: 250})}],\n }));\n\n const onMomentumEnd = (e: NativeSyntheticEvent<NativeScrollEvent>) => {\n const vw = e.nativeEvent.layoutMeasurement.width || w || 1;\n const i = Math.max(0, Math.min(images.length - 1, Math.round(e.nativeEvent.contentOffset.x / vw)));\n if (i !== active) {\n setActive(i);\n onIndexChange?.(i);\n }\n };\n\n return (\n <View\n testID={testID}\n onLayout={e => setW(e.nativeEvent.layout.width)}\n style={{width: \"100%\", position: \"relative\", borderRadius: radius, overflow: \"hidden\"}}\n >\n <ScrollView\n ref={scrollRef}\n horizontal\n pagingEnabled\n showsHorizontalScrollIndicator={false}\n onMomentumScrollEnd={onMomentumEnd}\n scrollEventThrottle={16}\n >\n {images.map((src, i) => (\n <RNImage key={i} source={{uri: src}} resizeMode=\"cover\" style={{width: w, height: h}} />\n ))}\n </ScrollView>\n\n {showCounter && images.length > 0 && (\n <Box\n position=\"absolute\"\n top={8}\n right={8}\n bgColor=\"rgba(0,0,0,0.55)\"\n paddingLeft={8}\n paddingRight={8}\n paddingTop={2}\n paddingBottom={2}\n borderRadius={999}\n >\n <Text color=\"#FFFFFF\" fontSize={11} fontWeight=\"700\">\n {active + 1} / {images.length}\n </Text>\n </Box>\n )}\n\n {showDots && images.length > 1 && (\n <View style={{position: \"absolute\", bottom: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\"}}>\n <View style={{position: \"relative\", flexDirection: \"row\", gap: DOT_GAP}}>\n {images.map((_, i) => (\n <View\n key={i}\n style={{width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"rgba(255,255,255,0.5)\"}}\n />\n ))}\n <Animated.View\n style={[\n {position: \"absolute\", top: 0, left: 0, width: DOT, height: DOT, borderRadius: DOT / 2, backgroundColor: \"#FFFFFF\"},\n indicatorStyle,\n ]}\n />\n </View>\n </View>\n )}\n </View>\n );\n}\n\nexport default Carousel;\n"],"names":["RNImage"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var index_native$1 = require('../../primitives/Text/index.cjs');
|
|
|
6
6
|
var index_native = require('../../primitives/Icon/index.cjs');
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
9
10
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
10
11
|
var index$1 = require('../MessageReceipt/index.cjs');
|
|
11
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/ChatBubble/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IChatBubbleProps, ChatBubbleTone} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {MessageReceipt} from \"../MessageReceipt\";\n\nconst TONE: Record<ChatBubbleTone, {bg: string; text: string}> = {\n neutral: {bg: \"surface-muted\", text: \"text-secondary\"},\n info: {bg: \"brand-tint\", text: \"brand-text\"},\n warning: {bg: \"warning-tint\", text: \"warning-text\"},\n success: {bg: \"success-tint\", text: \"success-text\"},\n};\n\n/**\n * ChatBubble — a message bubble (incoming / outgoing) or a centered system\n * event pill. Presentational and cross-platform (Box + Text), mirroring the\n * app's chat thread styling.\n *\n * <ChatBubble variant=\"incoming\" author=\"Sam\" time=\"10:30\">Hi!</ChatBubble>\n * <ChatBubble variant=\"outgoing\" time=\"10:32\">On my way</ChatBubble>\n * <ChatBubble variant=\"system\" tone=\"warning\" time=\"10:40\">Leadership transferred</ChatBubble>\n */\nexport function ChatBubble(rawProps: IChatBubbleProps) {\n const props = useComponentDefaults<IChatBubbleProps>(\"ChatBubble\", rawProps).mergedProps;\n const {\n variant = \"incoming\",\n children,\n text,\n author,\n authorColor = \"text-secondary\",\n time,\n tone = \"neutral\",\n incomingColor = \"gray.100\",\n outgoingColor = \"brand\",\n receipt,\n receiptLabel,\n footer,\n bare = false,\n reply,\n icon,\n testID,\n ...rest\n } = props;\n\n const content = text ?? children;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n if (variant === \"system\") {\n const t = TONE[tone] ?? TONE.neutral;\n return (\n <Box\n alignSelf=\"center\"\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={6}\n bgColor={t.bg}\n borderRadius={999}\n paddingLeft={10}\n paddingRight={10}\n paddingTop={4}\n paddingBottom={4}\n marginTop={4}\n marginBottom={4}\n {...(rest as any)}\n {...a11y}\n >\n {icon != null && (typeof icon === \"string\"\n ? <Icon name={icon} size={13} color={t.text} />\n : icon)}\n <Text fontSize={11} fontWeight=\"600\" color={t.text}>\n {content}\n </Text>\n {time != null && (\n <Text fontSize={10} color={t.text}>\n {time}\n </Text>\n )}\n </Box>\n );\n }\n\n const outgoing = variant === \"outgoing\";\n const bubbleBg = outgoing ? outgoingColor : incomingColor;\n const fg = outgoing ? \"#FFFFFF\" : \"text\";\n const timeFg = outgoing ? \"rgba(255,255,255,0.7)\" : \"text-secondary\";\n\n return (\n <Box\n alignSelf={outgoing ? \"flex-end\" : \"flex-start\"}\n maxWidth=\"78%\"\n marginTop={3}\n marginBottom={3}\n {...(rest as any)}\n {...a11y}\n >\n {author != null && !outgoing && (\n <Text fontSize={11} fontWeight=\"600\" color={authorColor} marginLeft={4} marginBottom={2}>\n {author}\n </Text>\n )}\n <Box\n bgColor={bubbleBg}\n paddingLeft={bare ? 0 : 12}\n paddingRight={bare ? 0 : 12}\n paddingTop={bare ? 0 : 8}\n paddingBottom={bare ? 0 : 8}\n overflow={bare ? \"hidden\" : undefined}\n borderTopLeftRadius={16}\n borderTopRightRadius={16}\n borderBottomLeftRadius={outgoing ? 16 : 4}\n borderBottomRightRadius={outgoing ? 4 : 16}\n >\n {reply}\n {bare ? content : (\n <Text fontSize={14} color={fg} lineHeight={19}>\n {content}\n </Text>\n )}\n {time != null && !bare && !(outgoing && (receipt != null || footer != null)) && (\n <Text fontSize={10} color={timeFg} alignSelf=\"flex-end\" marginTop={2}>\n {time}\n </Text>\n )}\n </Box>\n {outgoing && (receipt != null || footer != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"flex-end\" gap={4} marginTop={2} marginRight={2}>\n {time != null && receipt !== \"failed\" && (\n <Text fontSize={10} color=\"text-secondary\">\n {time}\n </Text>\n )}\n {receipt != null && (\n <MessageReceipt state={receipt} label={receiptLabel} showLabel={receiptLabel != null} />\n )}\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default ChatBubble;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text","MessageReceipt"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/ChatBubble/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IChatBubbleProps, ChatBubbleTone} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {MessageReceipt} from \"../MessageReceipt\";\n\nconst TONE: Record<ChatBubbleTone, {bg: string; text: string}> = {\n neutral: {bg: \"surface-muted\", text: \"text-secondary\"},\n info: {bg: \"brand-tint\", text: \"brand-text\"},\n warning: {bg: \"warning-tint\", text: \"warning-text\"},\n success: {bg: \"success-tint\", text: \"success-text\"},\n};\n\n/**\n * ChatBubble — a message bubble (incoming / outgoing) or a centered system\n * event pill. Presentational and cross-platform (Box + Text), mirroring the\n * app's chat thread styling.\n *\n * <ChatBubble variant=\"incoming\" author=\"Sam\" time=\"10:30\">Hi!</ChatBubble>\n * <ChatBubble variant=\"outgoing\" time=\"10:32\">On my way</ChatBubble>\n * <ChatBubble variant=\"system\" tone=\"warning\" time=\"10:40\">Leadership transferred</ChatBubble>\n */\nexport function ChatBubble(rawProps: IChatBubbleProps) {\n const props = useComponentDefaults<IChatBubbleProps>(\"ChatBubble\", rawProps).mergedProps;\n const {\n variant = \"incoming\",\n children,\n text,\n author,\n authorColor = \"text-secondary\",\n time,\n tone = \"neutral\",\n incomingColor = \"gray.100\",\n outgoingColor = \"brand\",\n receipt,\n receiptLabel,\n footer,\n bare = false,\n reply,\n icon,\n testID,\n ...rest\n } = props;\n\n const content = text ?? children;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n if (variant === \"system\") {\n const t = TONE[tone] ?? TONE.neutral;\n return (\n <Box\n alignSelf=\"center\"\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={6}\n bgColor={t.bg}\n borderRadius={999}\n paddingLeft={10}\n paddingRight={10}\n paddingTop={4}\n paddingBottom={4}\n marginTop={4}\n marginBottom={4}\n {...(rest as any)}\n {...a11y}\n >\n {icon != null && (typeof icon === \"string\"\n ? <Icon name={icon} size={13} color={t.text} />\n : icon)}\n <Text fontSize={11} fontWeight=\"600\" color={t.text}>\n {content}\n </Text>\n {time != null && (\n <Text fontSize={10} color={t.text}>\n {time}\n </Text>\n )}\n </Box>\n );\n }\n\n const outgoing = variant === \"outgoing\";\n const bubbleBg = outgoing ? outgoingColor : incomingColor;\n const fg = outgoing ? \"#FFFFFF\" : \"text\";\n const timeFg = outgoing ? \"rgba(255,255,255,0.7)\" : \"text-secondary\";\n\n return (\n <Box\n alignSelf={outgoing ? \"flex-end\" : \"flex-start\"}\n maxWidth=\"78%\"\n marginTop={3}\n marginBottom={3}\n {...(rest as any)}\n {...a11y}\n >\n {author != null && !outgoing && (\n <Text fontSize={11} fontWeight=\"600\" color={authorColor} marginLeft={4} marginBottom={2}>\n {author}\n </Text>\n )}\n <Box\n bgColor={bubbleBg}\n paddingLeft={bare ? 0 : 12}\n paddingRight={bare ? 0 : 12}\n paddingTop={bare ? 0 : 8}\n paddingBottom={bare ? 0 : 8}\n overflow={bare ? \"hidden\" : undefined}\n borderTopLeftRadius={16}\n borderTopRightRadius={16}\n borderBottomLeftRadius={outgoing ? 16 : 4}\n borderBottomRightRadius={outgoing ? 4 : 16}\n >\n {reply}\n {bare ? content : (\n <Text fontSize={14} color={fg} lineHeight={19}>\n {content}\n </Text>\n )}\n {time != null && !bare && !(outgoing && (receipt != null || footer != null)) && (\n <Text fontSize={10} color={timeFg} alignSelf=\"flex-end\" marginTop={2}>\n {time}\n </Text>\n )}\n </Box>\n {outgoing && (receipt != null || footer != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"flex-end\" gap={4} marginTop={2} marginRight={2}>\n {time != null && receipt !== \"failed\" && (\n <Text fontSize={10} color=\"text-secondary\">\n {time}\n </Text>\n )}\n {receipt != null && (\n <MessageReceipt state={receipt} label={receiptLabel} showLabel={receiptLabel != null} />\n )}\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default ChatBubble;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text","MessageReceipt"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import Text from '../../primitives/Text/index.js';
|
|
|
4
4
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
5
5
|
import 'react';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
|
+
import '../../contexts/PermissionsContext.js';
|
|
7
8
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
8
9
|
import { MessageReceipt } from '../MessageReceipt/index.js';
|
|
9
10
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/ChatBubble/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IChatBubbleProps, ChatBubbleTone} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {MessageReceipt} from \"../MessageReceipt\";\n\nconst TONE: Record<ChatBubbleTone, {bg: string; text: string}> = {\n neutral: {bg: \"surface-muted\", text: \"text-secondary\"},\n info: {bg: \"brand-tint\", text: \"brand-text\"},\n warning: {bg: \"warning-tint\", text: \"warning-text\"},\n success: {bg: \"success-tint\", text: \"success-text\"},\n};\n\n/**\n * ChatBubble — a message bubble (incoming / outgoing) or a centered system\n * event pill. Presentational and cross-platform (Box + Text), mirroring the\n * app's chat thread styling.\n *\n * <ChatBubble variant=\"incoming\" author=\"Sam\" time=\"10:30\">Hi!</ChatBubble>\n * <ChatBubble variant=\"outgoing\" time=\"10:32\">On my way</ChatBubble>\n * <ChatBubble variant=\"system\" tone=\"warning\" time=\"10:40\">Leadership transferred</ChatBubble>\n */\nexport function ChatBubble(rawProps: IChatBubbleProps) {\n const props = useComponentDefaults<IChatBubbleProps>(\"ChatBubble\", rawProps).mergedProps;\n const {\n variant = \"incoming\",\n children,\n text,\n author,\n authorColor = \"text-secondary\",\n time,\n tone = \"neutral\",\n incomingColor = \"gray.100\",\n outgoingColor = \"brand\",\n receipt,\n receiptLabel,\n footer,\n bare = false,\n reply,\n icon,\n testID,\n ...rest\n } = props;\n\n const content = text ?? children;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n if (variant === \"system\") {\n const t = TONE[tone] ?? TONE.neutral;\n return (\n <Box\n alignSelf=\"center\"\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={6}\n bgColor={t.bg}\n borderRadius={999}\n paddingLeft={10}\n paddingRight={10}\n paddingTop={4}\n paddingBottom={4}\n marginTop={4}\n marginBottom={4}\n {...(rest as any)}\n {...a11y}\n >\n {icon != null && (typeof icon === \"string\"\n ? <Icon name={icon} size={13} color={t.text} />\n : icon)}\n <Text fontSize={11} fontWeight=\"600\" color={t.text}>\n {content}\n </Text>\n {time != null && (\n <Text fontSize={10} color={t.text}>\n {time}\n </Text>\n )}\n </Box>\n );\n }\n\n const outgoing = variant === \"outgoing\";\n const bubbleBg = outgoing ? outgoingColor : incomingColor;\n const fg = outgoing ? \"#FFFFFF\" : \"text\";\n const timeFg = outgoing ? \"rgba(255,255,255,0.7)\" : \"text-secondary\";\n\n return (\n <Box\n alignSelf={outgoing ? \"flex-end\" : \"flex-start\"}\n maxWidth=\"78%\"\n marginTop={3}\n marginBottom={3}\n {...(rest as any)}\n {...a11y}\n >\n {author != null && !outgoing && (\n <Text fontSize={11} fontWeight=\"600\" color={authorColor} marginLeft={4} marginBottom={2}>\n {author}\n </Text>\n )}\n <Box\n bgColor={bubbleBg}\n paddingLeft={bare ? 0 : 12}\n paddingRight={bare ? 0 : 12}\n paddingTop={bare ? 0 : 8}\n paddingBottom={bare ? 0 : 8}\n overflow={bare ? \"hidden\" : undefined}\n borderTopLeftRadius={16}\n borderTopRightRadius={16}\n borderBottomLeftRadius={outgoing ? 16 : 4}\n borderBottomRightRadius={outgoing ? 4 : 16}\n >\n {reply}\n {bare ? content : (\n <Text fontSize={14} color={fg} lineHeight={19}>\n {content}\n </Text>\n )}\n {time != null && !bare && !(outgoing && (receipt != null || footer != null)) && (\n <Text fontSize={10} color={timeFg} alignSelf=\"flex-end\" marginTop={2}>\n {time}\n </Text>\n )}\n </Box>\n {outgoing && (receipt != null || footer != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"flex-end\" gap={4} marginTop={2} marginRight={2}>\n {time != null && receipt !== \"failed\" && (\n <Text fontSize={10} color=\"text-secondary\">\n {time}\n </Text>\n )}\n {receipt != null && (\n <MessageReceipt state={receipt} label={receiptLabel} showLabel={receiptLabel != null} />\n )}\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default ChatBubble;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/ChatBubble/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IChatBubbleProps, ChatBubbleTone} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {MessageReceipt} from \"../MessageReceipt\";\n\nconst TONE: Record<ChatBubbleTone, {bg: string; text: string}> = {\n neutral: {bg: \"surface-muted\", text: \"text-secondary\"},\n info: {bg: \"brand-tint\", text: \"brand-text\"},\n warning: {bg: \"warning-tint\", text: \"warning-text\"},\n success: {bg: \"success-tint\", text: \"success-text\"},\n};\n\n/**\n * ChatBubble — a message bubble (incoming / outgoing) or a centered system\n * event pill. Presentational and cross-platform (Box + Text), mirroring the\n * app's chat thread styling.\n *\n * <ChatBubble variant=\"incoming\" author=\"Sam\" time=\"10:30\">Hi!</ChatBubble>\n * <ChatBubble variant=\"outgoing\" time=\"10:32\">On my way</ChatBubble>\n * <ChatBubble variant=\"system\" tone=\"warning\" time=\"10:40\">Leadership transferred</ChatBubble>\n */\nexport function ChatBubble(rawProps: IChatBubbleProps) {\n const props = useComponentDefaults<IChatBubbleProps>(\"ChatBubble\", rawProps).mergedProps;\n const {\n variant = \"incoming\",\n children,\n text,\n author,\n authorColor = \"text-secondary\",\n time,\n tone = \"neutral\",\n incomingColor = \"gray.100\",\n outgoingColor = \"brand\",\n receipt,\n receiptLabel,\n footer,\n bare = false,\n reply,\n icon,\n testID,\n ...rest\n } = props;\n\n const content = text ?? children;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n if (variant === \"system\") {\n const t = TONE[tone] ?? TONE.neutral;\n return (\n <Box\n alignSelf=\"center\"\n flexDirection=\"row\"\n alignItems=\"center\"\n gap={6}\n bgColor={t.bg}\n borderRadius={999}\n paddingLeft={10}\n paddingRight={10}\n paddingTop={4}\n paddingBottom={4}\n marginTop={4}\n marginBottom={4}\n {...(rest as any)}\n {...a11y}\n >\n {icon != null && (typeof icon === \"string\"\n ? <Icon name={icon} size={13} color={t.text} />\n : icon)}\n <Text fontSize={11} fontWeight=\"600\" color={t.text}>\n {content}\n </Text>\n {time != null && (\n <Text fontSize={10} color={t.text}>\n {time}\n </Text>\n )}\n </Box>\n );\n }\n\n const outgoing = variant === \"outgoing\";\n const bubbleBg = outgoing ? outgoingColor : incomingColor;\n const fg = outgoing ? \"#FFFFFF\" : \"text\";\n const timeFg = outgoing ? \"rgba(255,255,255,0.7)\" : \"text-secondary\";\n\n return (\n <Box\n alignSelf={outgoing ? \"flex-end\" : \"flex-start\"}\n maxWidth=\"78%\"\n marginTop={3}\n marginBottom={3}\n {...(rest as any)}\n {...a11y}\n >\n {author != null && !outgoing && (\n <Text fontSize={11} fontWeight=\"600\" color={authorColor} marginLeft={4} marginBottom={2}>\n {author}\n </Text>\n )}\n <Box\n bgColor={bubbleBg}\n paddingLeft={bare ? 0 : 12}\n paddingRight={bare ? 0 : 12}\n paddingTop={bare ? 0 : 8}\n paddingBottom={bare ? 0 : 8}\n overflow={bare ? \"hidden\" : undefined}\n borderTopLeftRadius={16}\n borderTopRightRadius={16}\n borderBottomLeftRadius={outgoing ? 16 : 4}\n borderBottomRightRadius={outgoing ? 4 : 16}\n >\n {reply}\n {bare ? content : (\n <Text fontSize={14} color={fg} lineHeight={19}>\n {content}\n </Text>\n )}\n {time != null && !bare && !(outgoing && (receipt != null || footer != null)) && (\n <Text fontSize={10} color={timeFg} alignSelf=\"flex-end\" marginTop={2}>\n {time}\n </Text>\n )}\n </Box>\n {outgoing && (receipt != null || footer != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"flex-end\" gap={4} marginTop={2} marginRight={2}>\n {time != null && receipt !== \"failed\" && (\n <Text fontSize={10} color=\"text-secondary\">\n {time}\n </Text>\n )}\n {receipt != null && (\n <MessageReceipt state={receipt} label={receiptLabel} showLabel={receiptLabel != null} />\n )}\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default ChatBubble;\n"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var reactNative = require('react-native');
|
|
|
6
6
|
var index_native = require('../../assets/Icons/index.cjs');
|
|
7
7
|
var useSeverityColors = require('../../hooks/useSeverityColors.cjs');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
9
10
|
var useResolvedStyle = require('../../hooks/useResolvedStyle.cjs');
|
|
10
11
|
var useRtlLineHeight = require('../../hooks/useRtlLineHeight.cjs');
|
|
11
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Chip/index.native.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport {Pressable, Text, View, StyleSheet} from \"react-native\";\nimport type {IChipProps, IconName} from \"@lmb-it/kitsconcerto-types\";\nimport {IconMap} from \"../../assets/Icons\";\nimport {useSeverityColors} from \"../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\nconst SIZE_MAP = {\n sm: {fontSize: 12, px: 8, py: 4, gap: 6, iconSize: 12, height: 24, removeSize: 12},\n md: {fontSize: 14, px: 12, py: 6, gap: 6, iconSize: 14, height: 32, removeSize: 14},\n lg: {fontSize: 16, px: 14, py: 8, gap: 8, iconSize: 16, height: 40, removeSize: 16},\n} as const;\n\nfunction resolveIcon(icon: unknown, color: string, iconSize: number): React.ReactNode {\n if (!icon) return null;\n if (icon === \"dot\") {\n return (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: color,\n }}\n />\n );\n }\n if (React.isValidElement(icon)) return icon;\n if (typeof icon !== \"string\") return null;\n const Component = IconMap[icon as IconName];\n if (Component) return <Component size={iconSize} color={color}/>;\n return null;\n}\n\nexport function Chip(props: IChipProps) {\n const {\n label,\n children,\n icon,\n selected = false,\n onPress,\n disabled = false,\n onRemove,\n severity = \"secondary\",\n size: rawSize,\n outlined,\n testID,\n style,\n // LEGIT-PLATFORM-ONLY (web): className is a CSS class hook with no\n // native equivalent — use `style` for cross-platform overrides.\n } = props;\n const resolvedStyle = useResolvedStyle(style || {});\n\n const sizeStr = String(rawSize ?? \"md\");\n const size: \"sm\" | \"md\" | \"lg\" = sizeStr === \"sm\" || sizeStr === \"lg\" ? sizeStr : \"md\";\n const sizeConfig = SIZE_MAP[size];\n\n // RTL only: NotoKufiArabic needs a taller line box than its own metrics\n // give it. `undefined` in LTR, so English chips are byte-identical.\n const rtlLineHeight = useRtlLineHeight(size as string, sizeConfig.fontSize);\n\n const sevColors = useSeverityColors(severity as any);\n\n const visual = useMemo(() => {\n if (selected && !outlined) {\n return {\n backgroundColor: sevColors.solid,\n textColor: sevColors.solidText,\n borderColor: sevColors.border || sevColors.solid,\n };\n }\n if (outlined) {\n return {\n backgroundColor: \"transparent\",\n textColor: sevColors.solid,\n borderColor: sevColors.solid,\n };\n }\n return {\n backgroundColor: sevColors.bgTint,\n textColor: sevColors.text,\n borderColor: sevColors.border,\n };\n }, [selected, outlined, sevColors]);\n\n const resolvedIcon = resolveIcon(icon, visual.textColor, sizeConfig.iconSize);\n const content = label ?? children;\n const isInteractive = !!onPress && !disabled;\n\n const containerStyle = {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingHorizontal: sizeConfig.px,\n paddingRight: onRemove ? sizeConfig.gap : sizeConfig.px,\n borderRadius: 9999,\n borderWidth: 1,\n borderStyle: \"solid\" as const,\n backgroundColor: visual.backgroundColor,\n borderColor: visual.borderColor,\n opacity: disabled ? 0.5 : 1,\n // Consumer `style` wins last — mirrors web's computedCss merge order.\n ...(resolvedStyle as object),\n };\n\n const inner = (\n <>\n {resolvedIcon}\n {content != null && (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n fontWeight: \"500\",\n color: visual.textColor,\n /* ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX, AND THE\n CHIP'S OWN HEIGHT DOES NOT SAVE IT. Every SIZE_MAP\n row is already tall enough — 24/32/40 against font\n sizes 12/14/16, all above the 1.5x this script needs.\n The container was never the problem: React Native\n gives this raw <Text> the FONT'S natural line box,\n and NotoKufiArabic's is too short for its own\n ascenders, so the glyph is cut inside a box with room\n to spare. undefined in LTR — English is unchanged. */\n ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {}),\n }}\n numberOfLines={1}\n >\n {content}\n </Text>\n )}\n {onRemove && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove\"\n onPress={(e) => {\n e.stopPropagation?.();\n if (!disabled) onRemove();\n }}\n hitSlop={6}\n style={{\n marginLeft: 2,\n width: sizeConfig.removeSize + 4,\n height: sizeConfig.removeSize + 4,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: (sizeConfig.removeSize + 4) / 2,\n }}\n >\n <Text style={{fontSize: sizeConfig.removeSize, color: visual.textColor, lineHeight: sizeConfig.removeSize + 2}}>×</Text>\n </Pressable>\n )}\n </>\n );\n\n if (isInteractive) {\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{selected, disabled}}\n testID={testID}\n style={({pressed}) => [containerStyle, pressed && styles.pressed]}\n >\n {inner}\n </Pressable>\n );\n }\n\n return (\n <View style={containerStyle} testID={testID}>\n {inner}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pressed: {\n opacity: 0.7,\n },\n});\n\nexport default Chip;\n"],"names":["jsx","View","IconMap","useResolvedStyle","useRtlLineHeight","useSeverityColors","useMemo","jsxs","Fragment","Text","Pressable","StyleSheet"],"mappings":";;;;;;;;;;;AAQA,MAAM,QAAA,GAAW;AAAA,EACb,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA,EAAE;AAAA,EACjF,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA,EAAE;AAAA,EAClF,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA;AACpF,CAAA;AAEA,SAAS,WAAA,CAAY,IAAA,EAAe,KAAA,EAAe,QAAA,EAAmC;AAClF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,SAAS,KAAA,EAAO;AAChB,IAAA,uBACIA,cAAA;AAAA,MAACC,gBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,KAAA,EAAO,CAAA;AAAA,UACP,MAAA,EAAQ,CAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,eAAA,EAAiB;AAAA;AACrB;AAAA,KACJ;AAAA,EAER;AACA,EAAA,IAAI,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,IAAA;AACvC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,MAAM,SAAA,GAAYC,qBAAQ,IAAgB,CAAA;AAC1C,EAAA,IAAI,WAAW,uBAAOF,cAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,UAAU,KAAA,EAAa,CAAA;AAC9D,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,KAAK,KAAA,EAAmB;AACpC,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,QAAA,GAAW,WAAA;AAAA,IACX,IAAA,EAAM,OAAA;AAAA,IACN,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA;AAAA;AAAA,GAGJ,GAAI,KAAA;AACJ,EAAA,MAAM,aAAA,GAAgBG,wBAAA,CAAiB,KAAA,IAAS,EAAE,CAAA;AAElD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,IAAI,CAAA;AACtC,EAAA,MAAM,IAAA,GAA2B,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,OAAO,OAAA,GAAU,IAAA;AAClF,EAAA,MAAM,UAAA,GAAa,SAAS,IAAI,CAAA;AAIhC,EAAA,MAAM,aAAA,GAAgBC,wBAAA,CAAiB,IAAA,EAAgB,UAAA,CAAW,QAAQ,CAAA;AAE1E,EAAA,MAAM,SAAA,GAAYC,oCAAkB,QAAe,CAAA;AAEnD,EAAA,MAAM,MAAA,GAASC,cAAQ,MAAM;AACzB,IAAA,IAAI,QAAA,IAAY,CAAC,QAAA,EAAU;AACvB,MAAA,OAAO;AAAA,QACH,iBAAiB,SAAA,CAAU,KAAA;AAAA,QAC3B,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAA,EAAa,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU;AAAA,OAC/C;AAAA,IACJ;AACA,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,OAAO;AAAA,QACH,eAAA,EAAiB,aAAA;AAAA,QACjB,WAAW,SAAA,CAAU,KAAA;AAAA,QACrB,aAAa,SAAA,CAAU;AAAA,OAC3B;AAAA,IACJ;AACA,IAAA,OAAO;AAAA,MACH,iBAAiB,SAAA,CAAU,MAAA;AAAA,MAC3B,WAAW,SAAA,CAAU,IAAA;AAAA,MACrB,aAAa,SAAA,CAAU;AAAA,KAC3B;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,eAAe,WAAA,CAAY,IAAA,EAAM,MAAA,CAAO,SAAA,EAAW,WAAW,QAAQ,CAAA;AAC5E,EAAA,MAAM,UAAU,KAAA,IAAS,QAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA,IAAW,CAAC,QAAA;AAEpC,EAAA,MAAM,cAAA,GAAiB;AAAA,IACnB,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,KAAK,UAAA,CAAW,GAAA;AAAA,IAChB,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,mBAAmB,UAAA,CAAW,EAAA;AAAA,IAC9B,YAAA,EAAc,QAAA,GAAW,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,EAAA;AAAA,IACrD,YAAA,EAAc,IAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,OAAA;AAAA,IACb,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAA,EAAS,WAAW,GAAA,GAAM,CAAA;AAAA;AAAA,IAE1B,GAAI;AAAA,GACR;AAEA,EAAA,MAAM,wBACFC,eAAA,CAAAC,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,YAAA;AAAA,IACA,WAAW,IAAA,oBACRR,cAAA;AAAA,MAACS,gBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,UAAA,EAAY,KAAA;AAAA,UACZ,OAAO,MAAA,CAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUd,GAAI,aAAA,IAAiB,IAAA,GAAO,EAAC,UAAA,EAAY,aAAA,KAAiB;AAAC,SAC/D;AAAA,QACA,aAAA,EAAe,CAAA;AAAA,QAEd,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,IAEH,QAAA,oBACGT,cAAA;AAAA,MAACU,qBAAA;AAAA,MAAA;AAAA,QACG,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAmB,QAAA;AAAA,QACnB,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,UAAA,CAAA,CAAE,eAAA,IAAkB;AACpB,UAAA,IAAI,CAAC,UAAU,QAAA,EAAS;AAAA,QAC5B,CAAA;AAAA,QACA,OAAA,EAAS,CAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAO,WAAW,UAAA,GAAa,CAAA;AAAA,UAC/B,MAAA,EAAQ,WAAW,UAAA,GAAa,CAAA;AAAA,UAChC,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,YAAA,EAAA,CAAe,UAAA,CAAW,UAAA,GAAa,CAAA,IAAK;AAAA,SAChD;AAAA,QAEA,QAAA,kBAAAV,cAAA,CAACS,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAU,UAAA,CAAW,UAAA,EAAY,KAAA,EAAO,MAAA,CAAO,WAAW,UAAA,EAAY,UAAA,CAAW,UAAA,GAAa,CAAA,IAAI,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AACrH,GAAA,EAER,CAAA;AAGJ,EAAA,IAAI,aAAA,EAAe;AACf,IAAA,uBACIT,cAAA;AAAA,MAACU,qBAAA;AAAA,MAAA;AAAA,QACG,OAAA;AAAA,QACA,QAAA;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,QAAA,EAAQ;AAAA,QACvC,MAAA;AAAA,QACA,KAAA,EAAO,CAAC,EAAC,OAAA,OAAa,CAAC,cAAA,EAAgB,OAAA,IAAW,MAAA,CAAO,OAAO,CAAA;AAAA,QAE/D,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,EAER;AAEA,EAAA,uBACIV,cAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QACxB,QAAA,EAAA,KAAA,EACL,CAAA;AAER;AAEA,MAAM,MAAA,GAASU,uBAAW,MAAA,CAAO;AAAA,EAC7B,OAAA,EAAS;AAAA,IACL,OAAA,EAAS;AAAA;AAEjB,CAAC,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Chip/index.native.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport {Pressable, Text, View, StyleSheet} from \"react-native\";\nimport type {IChipProps, IconName} from \"@lmb-it/kitsconcerto-types\";\nimport {IconMap} from \"../../assets/Icons\";\nimport {useSeverityColors} from \"../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\nconst SIZE_MAP = {\n sm: {fontSize: 12, px: 8, py: 4, gap: 6, iconSize: 12, height: 24, removeSize: 12},\n md: {fontSize: 14, px: 12, py: 6, gap: 6, iconSize: 14, height: 32, removeSize: 14},\n lg: {fontSize: 16, px: 14, py: 8, gap: 8, iconSize: 16, height: 40, removeSize: 16},\n} as const;\n\nfunction resolveIcon(icon: unknown, color: string, iconSize: number): React.ReactNode {\n if (!icon) return null;\n if (icon === \"dot\") {\n return (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: color,\n }}\n />\n );\n }\n if (React.isValidElement(icon)) return icon;\n if (typeof icon !== \"string\") return null;\n const Component = IconMap[icon as IconName];\n if (Component) return <Component size={iconSize} color={color}/>;\n return null;\n}\n\nexport function Chip(props: IChipProps) {\n const {\n label,\n children,\n icon,\n selected = false,\n onPress,\n disabled = false,\n onRemove,\n severity = \"secondary\",\n size: rawSize,\n outlined,\n testID,\n style,\n // LEGIT-PLATFORM-ONLY (web): className is a CSS class hook with no\n // native equivalent — use `style` for cross-platform overrides.\n } = props;\n const resolvedStyle = useResolvedStyle(style || {});\n\n const sizeStr = String(rawSize ?? \"md\");\n const size: \"sm\" | \"md\" | \"lg\" = sizeStr === \"sm\" || sizeStr === \"lg\" ? sizeStr : \"md\";\n const sizeConfig = SIZE_MAP[size];\n\n // RTL only: NotoKufiArabic needs a taller line box than its own metrics\n // give it. `undefined` in LTR, so English chips are byte-identical.\n const rtlLineHeight = useRtlLineHeight(size as string, sizeConfig.fontSize);\n\n const sevColors = useSeverityColors(severity as any);\n\n const visual = useMemo(() => {\n if (selected && !outlined) {\n return {\n backgroundColor: sevColors.solid,\n textColor: sevColors.solidText,\n borderColor: sevColors.border || sevColors.solid,\n };\n }\n if (outlined) {\n return {\n backgroundColor: \"transparent\",\n textColor: sevColors.solid,\n borderColor: sevColors.solid,\n };\n }\n return {\n backgroundColor: sevColors.bgTint,\n textColor: sevColors.text,\n borderColor: sevColors.border,\n };\n }, [selected, outlined, sevColors]);\n\n const resolvedIcon = resolveIcon(icon, visual.textColor, sizeConfig.iconSize);\n const content = label ?? children;\n const isInteractive = !!onPress && !disabled;\n\n const containerStyle = {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingHorizontal: sizeConfig.px,\n paddingRight: onRemove ? sizeConfig.gap : sizeConfig.px,\n borderRadius: 9999,\n borderWidth: 1,\n borderStyle: \"solid\" as const,\n backgroundColor: visual.backgroundColor,\n borderColor: visual.borderColor,\n opacity: disabled ? 0.5 : 1,\n // Consumer `style` wins last — mirrors web's computedCss merge order.\n ...(resolvedStyle as object),\n };\n\n const inner = (\n <>\n {resolvedIcon}\n {content != null && (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n fontWeight: \"500\",\n color: visual.textColor,\n /* ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX, AND THE\n CHIP'S OWN HEIGHT DOES NOT SAVE IT. Every SIZE_MAP\n row is already tall enough — 24/32/40 against font\n sizes 12/14/16, all above the 1.5x this script needs.\n The container was never the problem: React Native\n gives this raw <Text> the FONT'S natural line box,\n and NotoKufiArabic's is too short for its own\n ascenders, so the glyph is cut inside a box with room\n to spare. undefined in LTR — English is unchanged. */\n ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {}),\n }}\n numberOfLines={1}\n >\n {content}\n </Text>\n )}\n {onRemove && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove\"\n onPress={(e) => {\n e.stopPropagation?.();\n if (!disabled) onRemove();\n }}\n hitSlop={6}\n style={{\n marginLeft: 2,\n width: sizeConfig.removeSize + 4,\n height: sizeConfig.removeSize + 4,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: (sizeConfig.removeSize + 4) / 2,\n }}\n >\n <Text style={{fontSize: sizeConfig.removeSize, color: visual.textColor, lineHeight: sizeConfig.removeSize + 2}}>×</Text>\n </Pressable>\n )}\n </>\n );\n\n if (isInteractive) {\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{selected, disabled}}\n testID={testID}\n style={({pressed}) => [containerStyle, pressed && styles.pressed]}\n >\n {inner}\n </Pressable>\n );\n }\n\n return (\n <View style={containerStyle} testID={testID}>\n {inner}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pressed: {\n opacity: 0.7,\n },\n});\n\nexport default Chip;\n"],"names":["jsx","View","IconMap","useResolvedStyle","useRtlLineHeight","useSeverityColors","useMemo","jsxs","Fragment","Text","Pressable","StyleSheet"],"mappings":"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"}
|
package/components/Chip/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { Text, Pressable, View, StyleSheet } from 'react-native';
|
|
|
4
4
|
import { IconMap } from '../../assets/Icons/index.js';
|
|
5
5
|
import { useSeverityColors } from '../../hooks/useSeverityColors.js';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
|
+
import '../../contexts/PermissionsContext.js';
|
|
7
8
|
import useResolvedStyle from '../../hooks/useResolvedStyle.js';
|
|
8
9
|
import useRtlLineHeight from '../../hooks/useRtlLineHeight.js';
|
|
9
10
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Chip/index.native.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport {Pressable, Text, View, StyleSheet} from \"react-native\";\nimport type {IChipProps, IconName} from \"@lmb-it/kitsconcerto-types\";\nimport {IconMap} from \"../../assets/Icons\";\nimport {useSeverityColors} from \"../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\nconst SIZE_MAP = {\n sm: {fontSize: 12, px: 8, py: 4, gap: 6, iconSize: 12, height: 24, removeSize: 12},\n md: {fontSize: 14, px: 12, py: 6, gap: 6, iconSize: 14, height: 32, removeSize: 14},\n lg: {fontSize: 16, px: 14, py: 8, gap: 8, iconSize: 16, height: 40, removeSize: 16},\n} as const;\n\nfunction resolveIcon(icon: unknown, color: string, iconSize: number): React.ReactNode {\n if (!icon) return null;\n if (icon === \"dot\") {\n return (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: color,\n }}\n />\n );\n }\n if (React.isValidElement(icon)) return icon;\n if (typeof icon !== \"string\") return null;\n const Component = IconMap[icon as IconName];\n if (Component) return <Component size={iconSize} color={color}/>;\n return null;\n}\n\nexport function Chip(props: IChipProps) {\n const {\n label,\n children,\n icon,\n selected = false,\n onPress,\n disabled = false,\n onRemove,\n severity = \"secondary\",\n size: rawSize,\n outlined,\n testID,\n style,\n // LEGIT-PLATFORM-ONLY (web): className is a CSS class hook with no\n // native equivalent — use `style` for cross-platform overrides.\n } = props;\n const resolvedStyle = useResolvedStyle(style || {});\n\n const sizeStr = String(rawSize ?? \"md\");\n const size: \"sm\" | \"md\" | \"lg\" = sizeStr === \"sm\" || sizeStr === \"lg\" ? sizeStr : \"md\";\n const sizeConfig = SIZE_MAP[size];\n\n // RTL only: NotoKufiArabic needs a taller line box than its own metrics\n // give it. `undefined` in LTR, so English chips are byte-identical.\n const rtlLineHeight = useRtlLineHeight(size as string, sizeConfig.fontSize);\n\n const sevColors = useSeverityColors(severity as any);\n\n const visual = useMemo(() => {\n if (selected && !outlined) {\n return {\n backgroundColor: sevColors.solid,\n textColor: sevColors.solidText,\n borderColor: sevColors.border || sevColors.solid,\n };\n }\n if (outlined) {\n return {\n backgroundColor: \"transparent\",\n textColor: sevColors.solid,\n borderColor: sevColors.solid,\n };\n }\n return {\n backgroundColor: sevColors.bgTint,\n textColor: sevColors.text,\n borderColor: sevColors.border,\n };\n }, [selected, outlined, sevColors]);\n\n const resolvedIcon = resolveIcon(icon, visual.textColor, sizeConfig.iconSize);\n const content = label ?? children;\n const isInteractive = !!onPress && !disabled;\n\n const containerStyle = {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingHorizontal: sizeConfig.px,\n paddingRight: onRemove ? sizeConfig.gap : sizeConfig.px,\n borderRadius: 9999,\n borderWidth: 1,\n borderStyle: \"solid\" as const,\n backgroundColor: visual.backgroundColor,\n borderColor: visual.borderColor,\n opacity: disabled ? 0.5 : 1,\n // Consumer `style` wins last — mirrors web's computedCss merge order.\n ...(resolvedStyle as object),\n };\n\n const inner = (\n <>\n {resolvedIcon}\n {content != null && (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n fontWeight: \"500\",\n color: visual.textColor,\n /* ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX, AND THE\n CHIP'S OWN HEIGHT DOES NOT SAVE IT. Every SIZE_MAP\n row is already tall enough — 24/32/40 against font\n sizes 12/14/16, all above the 1.5x this script needs.\n The container was never the problem: React Native\n gives this raw <Text> the FONT'S natural line box,\n and NotoKufiArabic's is too short for its own\n ascenders, so the glyph is cut inside a box with room\n to spare. undefined in LTR — English is unchanged. */\n ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {}),\n }}\n numberOfLines={1}\n >\n {content}\n </Text>\n )}\n {onRemove && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove\"\n onPress={(e) => {\n e.stopPropagation?.();\n if (!disabled) onRemove();\n }}\n hitSlop={6}\n style={{\n marginLeft: 2,\n width: sizeConfig.removeSize + 4,\n height: sizeConfig.removeSize + 4,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: (sizeConfig.removeSize + 4) / 2,\n }}\n >\n <Text style={{fontSize: sizeConfig.removeSize, color: visual.textColor, lineHeight: sizeConfig.removeSize + 2}}>×</Text>\n </Pressable>\n )}\n </>\n );\n\n if (isInteractive) {\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{selected, disabled}}\n testID={testID}\n style={({pressed}) => [containerStyle, pressed && styles.pressed]}\n >\n {inner}\n </Pressable>\n );\n }\n\n return (\n <View style={containerStyle} testID={testID}>\n {inner}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pressed: {\n opacity: 0.7,\n },\n});\n\nexport default Chip;\n"],"names":[],"mappings":";;;;;;;;;AAQA,MAAM,QAAA,GAAW;AAAA,EACb,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA,EAAE;AAAA,EACjF,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA,EAAE;AAAA,EAClF,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,GAAG,QAAA,EAAU,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,YAAY,EAAA;AACpF,CAAA;AAEA,SAAS,WAAA,CAAY,IAAA,EAAe,KAAA,EAAe,QAAA,EAAmC;AAClF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,SAAS,KAAA,EAAO;AAChB,IAAA,uBACI,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,KAAA,EAAO,CAAA;AAAA,UACP,MAAA,EAAQ,CAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,eAAA,EAAiB;AAAA;AACrB;AAAA,KACJ;AAAA,EAER;AACA,EAAA,IAAI,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,IAAA;AACvC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAgB,CAAA;AAC1C,EAAA,IAAI,WAAW,uBAAO,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,UAAU,KAAA,EAAa,CAAA;AAC9D,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,KAAK,KAAA,EAAmB;AACpC,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,QAAA,GAAW,WAAA;AAAA,IACX,IAAA,EAAM,OAAA;AAAA,IACN,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA;AAAA;AAAA,GAGJ,GAAI,KAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,IAAS,EAAE,CAAA;AAElD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,IAAI,CAAA;AACtC,EAAA,MAAM,IAAA,GAA2B,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,OAAO,OAAA,GAAU,IAAA;AAClF,EAAA,MAAM,UAAA,GAAa,SAAS,IAAI,CAAA;AAIhC,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,IAAA,EAAgB,UAAA,CAAW,QAAQ,CAAA;AAE1E,EAAA,MAAM,SAAA,GAAY,kBAAkB,QAAe,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AACzB,IAAA,IAAI,QAAA,IAAY,CAAC,QAAA,EAAU;AACvB,MAAA,OAAO;AAAA,QACH,iBAAiB,SAAA,CAAU,KAAA;AAAA,QAC3B,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAA,EAAa,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU;AAAA,OAC/C;AAAA,IACJ;AACA,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,OAAO;AAAA,QACH,eAAA,EAAiB,aAAA;AAAA,QACjB,WAAW,SAAA,CAAU,KAAA;AAAA,QACrB,aAAa,SAAA,CAAU;AAAA,OAC3B;AAAA,IACJ;AACA,IAAA,OAAO;AAAA,MACH,iBAAiB,SAAA,CAAU,MAAA;AAAA,MAC3B,WAAW,SAAA,CAAU,IAAA;AAAA,MACrB,aAAa,SAAA,CAAU;AAAA,KAC3B;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,eAAe,WAAA,CAAY,IAAA,EAAM,MAAA,CAAO,SAAA,EAAW,WAAW,QAAQ,CAAA;AAC5E,EAAA,MAAM,UAAU,KAAA,IAAS,QAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA,IAAW,CAAC,QAAA;AAEpC,EAAA,MAAM,cAAA,GAAiB;AAAA,IACnB,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,KAAK,UAAA,CAAW,GAAA;AAAA,IAChB,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,mBAAmB,UAAA,CAAW,EAAA;AAAA,IAC9B,YAAA,EAAc,QAAA,GAAW,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,EAAA;AAAA,IACrD,YAAA,EAAc,IAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,OAAA;AAAA,IACb,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAA,EAAS,WAAW,GAAA,GAAM,CAAA;AAAA;AAAA,IAE1B,GAAI;AAAA,GACR;AAEA,EAAA,MAAM,wBACF,IAAA,CAAA,QAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,YAAA;AAAA,IACA,WAAW,IAAA,oBACR,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO;AAAA,UACH,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,UAAA,EAAY,KAAA;AAAA,UACZ,OAAO,MAAA,CAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUd,GAAI,aAAA,IAAiB,IAAA,GAAO,EAAC,UAAA,EAAY,aAAA,KAAiB;AAAC,SAC/D;AAAA,QACA,aAAA,EAAe,CAAA;AAAA,QAEd,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,IAEH,QAAA,oBACG,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAmB,QAAA;AAAA,QACnB,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,UAAA,CAAA,CAAE,eAAA,IAAkB;AACpB,UAAA,IAAI,CAAC,UAAU,QAAA,EAAS;AAAA,QAC5B,CAAA;AAAA,QACA,OAAA,EAAS,CAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAO,WAAW,UAAA,GAAa,CAAA;AAAA,UAC/B,MAAA,EAAQ,WAAW,UAAA,GAAa,CAAA;AAAA,UAChC,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,YAAA,EAAA,CAAe,UAAA,CAAW,UAAA,GAAa,CAAA,IAAK;AAAA,SAChD;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAU,UAAA,CAAW,UAAA,EAAY,KAAA,EAAO,MAAA,CAAO,WAAW,UAAA,EAAY,UAAA,CAAW,UAAA,GAAa,CAAA,IAAI,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AACrH,GAAA,EAER,CAAA;AAGJ,EAAA,IAAI,aAAA,EAAe;AACf,IAAA,uBACI,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACG,OAAA;AAAA,QACA,QAAA;AAAA,QACA,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,QAAA,EAAQ;AAAA,QACvC,MAAA;AAAA,QACA,KAAA,EAAO,CAAC,EAAC,OAAA,OAAa,CAAC,cAAA,EAAgB,OAAA,IAAW,MAAA,CAAO,OAAO,CAAA;AAAA,QAE/D,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,EAER;AAEA,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QACxB,QAAA,EAAA,KAAA,EACL,CAAA;AAER;AAEA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO;AAAA,EAC7B,OAAA,EAAS;AAAA,IACL,OAAA,EAAS;AAAA;AAEjB,CAAC,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Chip/index.native.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport {Pressable, Text, View, StyleSheet} from \"react-native\";\nimport type {IChipProps, IconName} from \"@lmb-it/kitsconcerto-types\";\nimport {IconMap} from \"../../assets/Icons\";\nimport {useSeverityColors} from \"../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../hooks\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\n\nconst SIZE_MAP = {\n sm: {fontSize: 12, px: 8, py: 4, gap: 6, iconSize: 12, height: 24, removeSize: 12},\n md: {fontSize: 14, px: 12, py: 6, gap: 6, iconSize: 14, height: 32, removeSize: 14},\n lg: {fontSize: 16, px: 14, py: 8, gap: 8, iconSize: 16, height: 40, removeSize: 16},\n} as const;\n\nfunction resolveIcon(icon: unknown, color: string, iconSize: number): React.ReactNode {\n if (!icon) return null;\n if (icon === \"dot\") {\n return (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: color,\n }}\n />\n );\n }\n if (React.isValidElement(icon)) return icon;\n if (typeof icon !== \"string\") return null;\n const Component = IconMap[icon as IconName];\n if (Component) return <Component size={iconSize} color={color}/>;\n return null;\n}\n\nexport function Chip(props: IChipProps) {\n const {\n label,\n children,\n icon,\n selected = false,\n onPress,\n disabled = false,\n onRemove,\n severity = \"secondary\",\n size: rawSize,\n outlined,\n testID,\n style,\n // LEGIT-PLATFORM-ONLY (web): className is a CSS class hook with no\n // native equivalent — use `style` for cross-platform overrides.\n } = props;\n const resolvedStyle = useResolvedStyle(style || {});\n\n const sizeStr = String(rawSize ?? \"md\");\n const size: \"sm\" | \"md\" | \"lg\" = sizeStr === \"sm\" || sizeStr === \"lg\" ? sizeStr : \"md\";\n const sizeConfig = SIZE_MAP[size];\n\n // RTL only: NotoKufiArabic needs a taller line box than its own metrics\n // give it. `undefined` in LTR, so English chips are byte-identical.\n const rtlLineHeight = useRtlLineHeight(size as string, sizeConfig.fontSize);\n\n const sevColors = useSeverityColors(severity as any);\n\n const visual = useMemo(() => {\n if (selected && !outlined) {\n return {\n backgroundColor: sevColors.solid,\n textColor: sevColors.solidText,\n borderColor: sevColors.border || sevColors.solid,\n };\n }\n if (outlined) {\n return {\n backgroundColor: \"transparent\",\n textColor: sevColors.solid,\n borderColor: sevColors.solid,\n };\n }\n return {\n backgroundColor: sevColors.bgTint,\n textColor: sevColors.text,\n borderColor: sevColors.border,\n };\n }, [selected, outlined, sevColors]);\n\n const resolvedIcon = resolveIcon(icon, visual.textColor, sizeConfig.iconSize);\n const content = label ?? children;\n const isInteractive = !!onPress && !disabled;\n\n const containerStyle = {\n flexDirection: \"row\" as const,\n alignItems: \"center\" as const,\n justifyContent: \"center\" as const,\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingHorizontal: sizeConfig.px,\n paddingRight: onRemove ? sizeConfig.gap : sizeConfig.px,\n borderRadius: 9999,\n borderWidth: 1,\n borderStyle: \"solid\" as const,\n backgroundColor: visual.backgroundColor,\n borderColor: visual.borderColor,\n opacity: disabled ? 0.5 : 1,\n // Consumer `style` wins last — mirrors web's computedCss merge order.\n ...(resolvedStyle as object),\n };\n\n const inner = (\n <>\n {resolvedIcon}\n {content != null && (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n fontWeight: \"500\",\n color: visual.textColor,\n /* ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX, AND THE\n CHIP'S OWN HEIGHT DOES NOT SAVE IT. Every SIZE_MAP\n row is already tall enough — 24/32/40 against font\n sizes 12/14/16, all above the 1.5x this script needs.\n The container was never the problem: React Native\n gives this raw <Text> the FONT'S natural line box,\n and NotoKufiArabic's is too short for its own\n ascenders, so the glyph is cut inside a box with room\n to spare. undefined in LTR — English is unchanged. */\n ...(rtlLineHeight != null ? {lineHeight: rtlLineHeight} : {}),\n }}\n numberOfLines={1}\n >\n {content}\n </Text>\n )}\n {onRemove && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Remove\"\n onPress={(e) => {\n e.stopPropagation?.();\n if (!disabled) onRemove();\n }}\n hitSlop={6}\n style={{\n marginLeft: 2,\n width: sizeConfig.removeSize + 4,\n height: sizeConfig.removeSize + 4,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: (sizeConfig.removeSize + 4) / 2,\n }}\n >\n <Text style={{fontSize: sizeConfig.removeSize, color: visual.textColor, lineHeight: sizeConfig.removeSize + 2}}>×</Text>\n </Pressable>\n )}\n </>\n );\n\n if (isInteractive) {\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityState={{selected, disabled}}\n testID={testID}\n style={({pressed}) => [containerStyle, pressed && styles.pressed]}\n >\n {inner}\n </Pressable>\n );\n }\n\n return (\n <View style={containerStyle} testID={testID}>\n {inner}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n pressed: {\n opacity: 0.7,\n },\n});\n\nexport default Chip;\n"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ var index = require('../../primitives/Box/index.cjs');
|
|
|
5
5
|
var index_native = require('../../primitives/Text/index.cjs');
|
|
6
6
|
require('react');
|
|
7
7
|
require('../../contexts/DialogContext.cjs');
|
|
8
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
8
9
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
9
10
|
|
|
10
11
|
function DateSeparator(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DateSeparator/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IDateSeparatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * DateSeparator — a centered date-divider pill for chat threads (e.g. \"Today\",\n * \"12 Jun\"). Presentational and cross-platform (Box + Text). `label` is a\n * resolved, already-localized/formatted string supplied by the consumer — this\n * primitive holds no copy and does no date formatting.\n *\n * <DateSeparator label=\"Today\" />\n */\nexport function DateSeparator(rawProps: IDateSeparatorProps) {\n const props = useComponentDefaults<IDateSeparatorProps>(\"DateSeparator\", rawProps).mergedProps;\n const {label, color = \"text-secondary\", backgroundColor = \"surface-muted\", testID, ...rest} = props;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box alignSelf=\"center\" marginTop={10} marginBottom={10} {...(rest as any)} {...a11y}>\n <Box\n bgColor={backgroundColor}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor=\"border\"\n borderRadius={999}\n paddingLeft={14}\n paddingRight={14}\n paddingTop={5}\n paddingBottom={5}\n >\n <Text fontSize={12} fontWeight=\"600\" color={color}>\n {label}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DateSeparator;\n"],"names":["useComponentDefaults","jsx","Box","Text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DateSeparator/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IDateSeparatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * DateSeparator — a centered date-divider pill for chat threads (e.g. \"Today\",\n * \"12 Jun\"). Presentational and cross-platform (Box + Text). `label` is a\n * resolved, already-localized/formatted string supplied by the consumer — this\n * primitive holds no copy and does no date formatting.\n *\n * <DateSeparator label=\"Today\" />\n */\nexport function DateSeparator(rawProps: IDateSeparatorProps) {\n const props = useComponentDefaults<IDateSeparatorProps>(\"DateSeparator\", rawProps).mergedProps;\n const {label, color = \"text-secondary\", backgroundColor = \"surface-muted\", testID, ...rest} = props;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box alignSelf=\"center\" marginTop={10} marginBottom={10} {...(rest as any)} {...a11y}>\n <Box\n bgColor={backgroundColor}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor=\"border\"\n borderRadius={999}\n paddingLeft={14}\n paddingRight={14}\n paddingTop={5}\n paddingBottom={5}\n >\n <Text fontSize={12} fontWeight=\"600\" color={color}>\n {label}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DateSeparator;\n"],"names":["useComponentDefaults","jsx","Box","Text"],"mappings":";;;;;;;;;;AAaO,SAAS,cAAc,QAAA,EAA+B;AACzD,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAA0C,eAAA,EAAiB,QAAQ,CAAA,CAAE,WAAA;AACnF,EAAA,MAAM,EAAC,OAAO,KAAA,GAAQ,gBAAA,EAAkB,kBAAkB,eAAA,EAAiB,MAAA,EAAQ,GAAG,IAAA,EAAI,GAAI,KAAA;AAC9F,EAAA,MAAM,OAAO,MAAA,GAAU,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAkB,EAAC;AAElE,EAAA,uBACIC,cAAA,CAACC,aAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,SAAA,EAAW,EAAA,EAAI,YAAA,EAAc,EAAA,EAAK,GAAI,IAAA,EAAe,GAAG,IAAA,EAC5E,QAAA,kBAAAD,cAAA;AAAA,IAACC,aAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAY,OAAA;AAAA,MACZ,WAAA,EAAY,QAAA;AAAA,MACZ,YAAA,EAAc,GAAA;AAAA,MACd,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,EAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,CAAA;AAAA,MAEf,yCAACC,oBAAA,EAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAW,KAAA,EAAM,OAChC,QAAA,EAAA,KAAA,EACL;AAAA;AAAA,GACJ,EACJ,CAAA;AAER;;;;"}
|
|
@@ -3,6 +3,7 @@ import Box from '../../primitives/Box/index.js';
|
|
|
3
3
|
import Text from '../../primitives/Text/index.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '../../contexts/DialogContext.js';
|
|
6
|
+
import '../../contexts/PermissionsContext.js';
|
|
6
7
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
7
8
|
|
|
8
9
|
function DateSeparator(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/DateSeparator/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IDateSeparatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * DateSeparator — a centered date-divider pill for chat threads (e.g. \"Today\",\n * \"12 Jun\"). Presentational and cross-platform (Box + Text). `label` is a\n * resolved, already-localized/formatted string supplied by the consumer — this\n * primitive holds no copy and does no date formatting.\n *\n * <DateSeparator label=\"Today\" />\n */\nexport function DateSeparator(rawProps: IDateSeparatorProps) {\n const props = useComponentDefaults<IDateSeparatorProps>(\"DateSeparator\", rawProps).mergedProps;\n const {label, color = \"text-secondary\", backgroundColor = \"surface-muted\", testID, ...rest} = props;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box alignSelf=\"center\" marginTop={10} marginBottom={10} {...(rest as any)} {...a11y}>\n <Box\n bgColor={backgroundColor}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor=\"border\"\n borderRadius={999}\n paddingLeft={14}\n paddingRight={14}\n paddingTop={5}\n paddingBottom={5}\n >\n <Text fontSize={12} fontWeight=\"600\" color={color}>\n {label}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DateSeparator;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/DateSeparator/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IDateSeparatorProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * DateSeparator — a centered date-divider pill for chat threads (e.g. \"Today\",\n * \"12 Jun\"). Presentational and cross-platform (Box + Text). `label` is a\n * resolved, already-localized/formatted string supplied by the consumer — this\n * primitive holds no copy and does no date formatting.\n *\n * <DateSeparator label=\"Today\" />\n */\nexport function DateSeparator(rawProps: IDateSeparatorProps) {\n const props = useComponentDefaults<IDateSeparatorProps>(\"DateSeparator\", rawProps).mergedProps;\n const {label, color = \"text-secondary\", backgroundColor = \"surface-muted\", testID, ...rest} = props;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box alignSelf=\"center\" marginTop={10} marginBottom={10} {...(rest as any)} {...a11y}>\n <Box\n bgColor={backgroundColor}\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor=\"border\"\n borderRadius={999}\n paddingLeft={14}\n paddingRight={14}\n paddingTop={5}\n paddingBottom={5}\n >\n <Text fontSize={12} fontWeight=\"600\" color={color}>\n {label}\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DateSeparator;\n"],"names":[],"mappings":";;;;;;;;AAaO,SAAS,cAAc,QAAA,EAA+B;AACzD,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAA0C,eAAA,EAAiB,QAAQ,CAAA,CAAE,WAAA;AACnF,EAAA,MAAM,EAAC,OAAO,KAAA,GAAQ,gBAAA,EAAkB,kBAAkB,eAAA,EAAiB,MAAA,EAAQ,GAAG,IAAA,EAAI,GAAI,KAAA;AAC9F,EAAA,MAAM,OAAO,MAAA,GAAU,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAkB,EAAC;AAElE,EAAA,uBACI,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,SAAA,EAAW,EAAA,EAAI,YAAA,EAAc,EAAA,EAAK,GAAI,IAAA,EAAe,GAAG,IAAA,EAC5E,QAAA,kBAAA,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAY,OAAA;AAAA,MACZ,WAAA,EAAY,QAAA;AAAA,MACZ,YAAA,EAAc,GAAA;AAAA,MACd,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,EAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,CAAA;AAAA,MAEf,8BAAC,IAAA,EAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAW,KAAA,EAAM,OAChC,QAAA,EAAA,KAAA,EACL;AAAA;AAAA,GACJ,EACJ,CAAA;AAER;;;;"}
|
|
@@ -17,6 +17,7 @@ var index_native$4 = require('../../form/inputs/InputTextarea/index.cjs');
|
|
|
17
17
|
require('axios');
|
|
18
18
|
var SelectContext = require('../../form/selects/SelectContext.cjs');
|
|
19
19
|
require('../../contexts/DialogContext.cjs');
|
|
20
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
20
21
|
|
|
21
22
|
const DetailList = ({
|
|
22
23
|
title,
|