@lmb-it/kitsconcerto-native 0.1.277 → 0.1.285
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/mobile/src/Core/AutoComplete/index.cjs +12 -4
- package/apps/mobile/src/Core/AutoComplete/index.cjs.map +1 -1
- package/apps/mobile/src/Core/AutoComplete/index.js +12 -4
- package/apps/mobile/src/Core/AutoComplete/index.js.map +1 -1
- package/apps/mobile/src/Core/MultiSelect/index.cjs +7 -4
- package/apps/mobile/src/Core/MultiSelect/index.cjs.map +1 -1
- package/apps/mobile/src/Core/MultiSelect/index.js +7 -4
- package/apps/mobile/src/Core/MultiSelect/index.js.map +1 -1
- package/components/Avatar/index.cjs +1 -0
- package/components/Avatar/index.cjs.map +1 -1
- package/components/Avatar/index.js +1 -0
- package/components/Avatar/index.js.map +1 -1
- package/components/Banner/banner.cjs +1 -0
- package/components/Banner/banner.cjs.map +1 -1
- package/components/Banner/banner.js +1 -0
- package/components/Banner/banner.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/BreadCrumb/index.cjs.map +1 -1
- package/components/BreadCrumb/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/Carousel/index.cjs +1 -0
- package/components/Carousel/index.cjs.map +1 -1
- package/components/Carousel/index.js +1 -0
- package/components/Carousel/index.js.map +1 -1
- package/components/ChatBubble/index.cjs +1 -0
- package/components/ChatBubble/index.cjs.map +1 -1
- package/components/ChatBubble/index.js +1 -0
- package/components/ChatBubble/index.js.map +1 -1
- package/components/Chip/index.cjs +1 -0
- package/components/Chip/index.cjs.map +1 -1
- package/components/Chip/index.js +1 -0
- package/components/Chip/index.js.map +1 -1
- package/components/DateSeparator/index.cjs +1 -0
- package/components/DateSeparator/index.cjs.map +1 -1
- package/components/DateSeparator/index.js +1 -0
- package/components/DateSeparator/index.js.map +1 -1
- package/components/DetailsList/index.cjs +1 -0
- package/components/DetailsList/index.cjs.map +1 -1
- package/components/DetailsList/index.js +1 -0
- package/components/DetailsList/index.js.map +1 -1
- package/components/EmptyState/index.cjs +1 -0
- package/components/EmptyState/index.cjs.map +1 -1
- package/components/EmptyState/index.js +1 -0
- package/components/EmptyState/index.js.map +1 -1
- package/components/Gallery/index.cjs +1 -0
- package/components/Gallery/index.cjs.map +1 -1
- package/components/Gallery/index.js +1 -0
- package/components/Gallery/index.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/MessageReceipt/index.cjs +1 -0
- package/components/MessageReceipt/index.cjs.map +1 -1
- package/components/MessageReceipt/index.js +1 -0
- package/components/MessageReceipt/index.js.map +1 -1
- package/components/ProgressBar/index.cjs +1 -0
- package/components/ProgressBar/index.cjs.map +1 -1
- package/components/ProgressBar/index.js +1 -0
- package/components/ProgressBar/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/StatCard/index.cjs +1 -0
- package/components/StatCard/index.cjs.map +1 -1
- package/components/StatCard/index.js +1 -0
- package/components/StatCard/index.js.map +1 -1
- package/components/Stepper/index.cjs +1 -0
- package/components/Stepper/index.cjs.map +1 -1
- package/components/Stepper/index.js +1 -0
- package/components/Stepper/index.js.map +1 -1
- package/components/Tabs/index.cjs +1 -0
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +1 -0
- package/components/Tabs/index.js.map +1 -1
- package/components/Timeline/index.cjs +1 -0
- package/components/Timeline/index.cjs.map +1 -1
- package/components/Timeline/index.js +1 -0
- package/components/Timeline/index.js.map +1 -1
- package/components/Translate/index.cjs +1 -0
- package/components/Translate/index.cjs.map +1 -1
- package/components/Translate/index.js +1 -0
- package/components/Translate/index.js.map +1 -1
- package/components/TypingIndicator/index.cjs +1 -0
- package/components/TypingIndicator/index.cjs.map +1 -1
- package/components/TypingIndicator/index.js +1 -0
- package/components/TypingIndicator/index.js.map +1 -1
- package/components/overlay/ConfirmDialog/index.cjs +1 -0
- package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
- package/components/overlay/ConfirmDialog/index.js +1 -0
- package/components/overlay/ConfirmDialog/index.js.map +1 -1
- package/components/overlay/Dialog/index.cjs +1 -0
- package/components/overlay/Dialog/index.cjs.map +1 -1
- package/components/overlay/Dialog/index.js +1 -0
- package/components/overlay/Dialog/index.js.map +1 -1
- package/contexts/BreadcrumbContext.cjs +33 -0
- package/contexts/BreadcrumbContext.cjs.map +1 -0
- package/contexts/BreadcrumbContext.js +28 -0
- package/contexts/BreadcrumbContext.js.map +1 -0
- package/form/controls/Checkbox/index.cjs +1 -0
- package/form/controls/Checkbox/index.cjs.map +1 -1
- package/form/controls/Checkbox/index.js +1 -0
- package/form/controls/Checkbox/index.js.map +1 -1
- package/form/controls/RadioButton/radio.cjs +1 -0
- package/form/controls/RadioButton/radio.cjs.map +1 -1
- package/form/controls/RadioButton/radio.js +1 -0
- package/form/controls/RadioButton/radio.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/index.cjs +1 -0
- package/form/file-pickers/index.cjs.map +1 -1
- package/form/file-pickers/index.js +1 -0
- package/form/file-pickers/index.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +13 -2
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +13 -2
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/inputs/ColorPicker/index.cjs +1 -0
- package/form/inputs/ColorPicker/index.cjs.map +1 -1
- package/form/inputs/ColorPicker/index.js +1 -0
- package/form/inputs/ColorPicker/index.js.map +1 -1
- package/form/inputs/Datepicker/index.cjs +1 -0
- package/form/inputs/Datepicker/index.cjs.map +1 -1
- package/form/inputs/Datepicker/index.js +1 -0
- package/form/inputs/Datepicker/index.js.map +1 -1
- package/form/inputs/InputLocation/index.cjs +1 -0
- package/form/inputs/InputLocation/index.cjs.map +1 -1
- package/form/inputs/InputLocation/index.js +1 -0
- package/form/inputs/InputLocation/index.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +11 -1
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +12 -2
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/CascadeSelect/index.cjs +1 -0
- package/form/selects/CascadeSelect/index.cjs.map +1 -1
- package/form/selects/CascadeSelect/index.js +1 -0
- package/form/selects/CascadeSelect/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +9 -1
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +10 -2
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
- package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.js +1 -0
- package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
- package/form-renderer/components/fields/Group/index.cjs +1 -0
- package/form-renderer/components/fields/Group/index.cjs.map +1 -1
- package/form-renderer/components/fields/Group/index.js +1 -0
- package/form-renderer/components/fields/Group/index.js.map +1 -1
- package/form-renderer/components/fields/Radios/index.cjs +1 -0
- package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
- package/form-renderer/components/fields/Radios/index.js +1 -0
- package/form-renderer/components/fields/Radios/index.js.map +1 -1
- package/form-renderer/components/fields/Select/index.cjs +1 -0
- package/form-renderer/components/fields/Select/index.cjs.map +1 -1
- package/form-renderer/components/fields/Select/index.js +1 -0
- package/form-renderer/components/fields/Select/index.js.map +1 -1
- package/hooks/main.cjs +1 -0
- package/hooks/main.cjs.map +1 -1
- package/hooks/main.js +1 -0
- package/hooks/main.js.map +1 -1
- package/hooks/useBreadcrumbTrail.cjs +21 -0
- package/hooks/useBreadcrumbTrail.cjs.map +1 -0
- package/hooks/useBreadcrumbTrail.js +16 -0
- package/hooks/useBreadcrumbTrail.js.map +1 -0
- package/hooks/useComponentDefaults.cjs +50 -8
- package/hooks/useComponentDefaults.cjs.map +1 -1
- package/hooks/useComponentDefaults.js +50 -8
- package/hooks/useComponentDefaults.js.map +1 -1
- package/index.cjs +5 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +245 -19
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/packages/types/src/Theme/defaultTheme.cjs +24 -4
- package/packages/types/src/Theme/defaultTheme.cjs.map +1 -1
- package/packages/types/src/Theme/defaultTheme.js +24 -4
- package/packages/types/src/Theme/defaultTheme.js.map +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../../../../apps/mobile/src/Core/MultiSelect/index.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n Modal,\n FlatList,\n TextInput,\n StyleSheet,\n Pressable,\n ActivityIndicator,\n Dimensions,\n} from 'react-native';\nimport { readerEdge } from '../../Factory/helpers/readerEdge';\nimport { resolveThemeTokenForNative } from '../../Factory/helpers/style';\n\nexport type MultiSelectChangeEvent<T> = React.ChangeEvent<{\n value: T[];\n}>;\n\nexport interface MultiSelectProps<T> {\n value?: T[] | null;\n onChange?: (e: MultiSelectChangeEvent<T>, selectedItems: T[]) => void;\n isModal?: boolean;\n\n options?: T[];\n\n optionLabel?: keyof T | string;\n optionValue?: keyof T | string;\n\n optionGroupLabel?: keyof T | string;\n optionGroupChildren?: keyof T | string;\n\n placeholder?: string;\n disabled?: boolean;\n loading?: boolean;\n filter?: boolean;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field, already written in the reader's\n * language by the KitsConcerto wrapper — this component lives in\n * `apps/mobile`, which `packages/ui` imports, so it cannot translate.\n */\n filterPlaceholder?: string;\n /** Reader's direction, from the wrapper's `useLanguage().isRTL`. */\n isRTL?: boolean;\n /**\n * Font family the app's theme names for body text, resolved by the wrapper.\n * React Native does not cascade fontFamily through Views, so each text sink\n * must set it — see the Dropdown's own note.\n */\n fontFamily?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger. Default false — see the Dropdown's own `popup`\n * for why the anchor is the thing being escaped.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper: the\n * container is this library's `KitsDialogControlled`, which lives in\n * `packages/ui`, and `packages/ui` imports THIS file.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. */\n popupTitle?: React.ReactNode;\n\n display?: 'comma' | 'chip';\n maxSelectedLabels?: number;\n\n itemTemplate?: (item: T) => React.ReactElement;\n selectedItemTemplate?: (item: T) => React.ReactElement;\n style?: import('react-native').ViewStyle;\n}\n\nconst t = resolveThemeTokenForNative;\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\nexport default function MultiSelect<T>(props: MultiSelectProps<T>) {\n const {\n value,\n onChange,\n options = [],\n optionLabel,\n optionValue,\n optionGroupLabel,\n optionGroupChildren,\n isModal = false,\n placeholder = 'Select',\n disabled,\n loading,\n filter,\n // ⚠️ English literals of last resort, not translations — the wrapper always\n // passes the reader's own sentence. These only apply when this component is\n // used directly from `apps/mobile`, so a panel can never render blank.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n fontFamily,\n popup = false,\n renderPopup,\n popupTitle,\n display = 'chip',\n maxSelectedLabels = 10,\n itemTemplate,\n selectedItemTemplate,\n style: externalStyle,\n } = props;\n\n /* Physical edges to write so content lands where the reader starts. */\n const edge = readerEdge(isRTL);\n\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n\n const close = () => setOpen(false);\n\n const toggleOpen = () => {\n if (disabled) return;\n if (open) {\n setOpen(false);\n return;\n }\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderFocus: t('primary'),\n bg: t('surface-card') || '#fff',\n disabledBg: t('surface-ground') || t('gray.100'),\n placeholder: t('text-secondary') || t('gray.400'),\n text: t('text') || t('gray.800'),\n textSecondary: t('text-secondary') || t('gray.500'),\n chipBg: t('primary.100') || t('indigo.100'),\n chipText: t('primary.700') || t('indigo.700'),\n chipRemove: t('primary.500') || t('indigo.500'),\n chipMoreBg: t('surface-ground') || t('gray.100'),\n headerBorder: t('border') || t('gray.200'),\n groupBg: t('surface-ground') || t('gray.50'),\n groupBorder: t('border') || t('gray.200'),\n itemBorder: t('surface-ground') || t('gray.100'),\n itemSelectedBg: t('highlight-bg') || t('indigo.50'),\n itemSelectedText: t('primary.700') || t('indigo.700'),\n checkboxBorder: t('border') || t('gray.300'),\n checkboxChecked: t('primary'),\n invalidBorder: t('danger') || t('red.500'),\n searchBg: t('surface-ground') || t('gray.50'),\n };\n\n const getValue = (item: T, key?: keyof T | string) =>\n key ? (item as any)[key] : item;\n\n const getLabel = (item: T, key?: keyof T | string) =>\n String(key ? (item as any)[key] : item);\n\n const selectedValues = Array.isArray(value) ? value : [];\n\n // Build display items: flat list with optional group headers\n const displayItems: { type: 'group' | 'item'; data: any }[] = useMemo(() => {\n if (optionGroupLabel && optionGroupChildren) {\n const result: { type: 'group' | 'item'; data: any }[] = [];\n options.forEach((group: any) => {\n result.push({ type: 'group', data: group });\n const children = group[optionGroupChildren] ?? [];\n children.forEach((child: any) => result.push({ type: 'item', data: child }));\n });\n return result;\n }\n return options.map((item) => ({ type: 'item' as const, data: item }));\n }, [options, optionGroupLabel, optionGroupChildren]);\n\n const filtered = useMemo(() => {\n if (!filter || !query) return displayItems;\n return displayItems.filter((entry) => {\n if (entry.type === 'group') return true; // keep group headers\n return getLabel(entry.data, optionLabel)\n .toLowerCase()\n .includes(query.toLowerCase());\n });\n }, [query, displayItems]);\n\n const isSelected = (item: T) =>\n selectedValues.some(\n (v) => getValue(v, optionValue) === getValue(item, optionValue),\n );\n\n const toggleItem = (item: T) => {\n const exists = isSelected(item);\n const next = exists\n ? selectedValues.filter(\n (v) => getValue(v, optionValue) !== getValue(item, optionValue),\n )\n : [...selectedValues, item];\n\n const syntheticEvent = {\n target: { value: next },\n } as React.ChangeEvent<any>;\n\n onChange?.(syntheticEvent, next);\n };\n\n const removeItem = (item: T) => {\n const next = selectedValues.filter(\n (v) => getValue(v, optionValue) !== getValue(item, optionValue),\n );\n const syntheticEvent = {\n target: { value: next },\n } as React.ChangeEvent<any>;\n onChange?.(syntheticEvent, next);\n };\n\n const renderCheckbox = (checked: boolean) => (\n <View\n style={[\n styles.checkbox,\n { borderColor: colors.checkboxBorder, backgroundColor: colors.bg },\n checked && { backgroundColor: colors.checkboxChecked, borderColor: colors.checkboxChecked },\n ]}\n >\n {checked && <Text style={styles.checkmark}>✓</Text>}\n </View>\n );\n\n const renderListContent = () => {\n if (loading) {\n return (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"small\" color={colors.checkboxChecked} />\n <Text style={[styles.loadingText, { color: colors.placeholder }]}>Loading...</Text>\n </View>\n );\n }\n\n const itemsOnly = filtered.filter((e) => e.type === 'item');\n if (itemsOnly.length === 0) {\n return (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.placeholder }]}>{emptyFilterMessage}</Text>\n </View>\n );\n }\n\n return (\n <FlatList\n data={filtered}\n keyExtractor={(entry, i) =>\n entry.type === 'group' ? `group-${i}` : `item-${i}`\n }\n keyboardShouldPersistTaps=\"handled\"\n renderItem={({ item: entry }) => {\n if (entry.type === 'group') {\n return (\n <View style={[styles.groupHeader, { backgroundColor: colors.groupBg, borderBottomColor: colors.groupBorder }]}>\n <Text style={[styles.groupHeaderText, { color: colors.textSecondary }]}>\n {getLabel(entry.data, optionGroupLabel)}\n </Text>\n </View>\n );\n }\n const checked = isSelected(entry.data);\n return (\n <TouchableOpacity\n onPress={() => toggleItem(entry.data)}\n style={[\n styles.item,\n { borderBottomColor: colors.itemBorder },\n checked && { backgroundColor: colors.itemSelectedBg },\n ]}\n activeOpacity={0.7}\n >\n {renderCheckbox(checked)}\n {itemTemplate ? (\n itemTemplate(entry.data)\n ) : (\n <Text style={[\n styles.itemText,\n { color: colors.text, fontFamily },\n checked && { color: colors.itemSelectedText, fontWeight: '500' },\n /* ⛔ The physical edge is COMPUTED — React Native mirrors\n `textAlign` when the process is RTL, so naming the RTL edge\n for an RTL reader lands on the LTR one. See `readerEdge`. */\n {\n textAlign: edge.textAlign,\n writingDirection: isRTL ? ('rtl' as const) : ('ltr' as const),\n },\n ]}>\n {getLabel(entry.data, optionLabel)}\n </Text>\n )}\n </TouchableOpacity>\n );\n }}\n />\n );\n };\n\n const renderSelected = () => {\n if (!selectedValues.length) {\n return <Text style={[styles.placeholder, { color: colors.placeholder }, externalTextStyle]}>{placeholder}</Text>;\n }\n\n if (display === 'chip') {\n const visibleItems = selectedValues.slice(0, maxSelectedLabels);\n const remaining = selectedValues.length - maxSelectedLabels;\n return (\n <View style={styles.chips}>\n {visibleItems.map((item, i) =>\n selectedItemTemplate ? (\n <React.Fragment key={i}>{selectedItemTemplate(item)}</React.Fragment>\n ) : (\n <View key={i} style={[styles.chip, { backgroundColor: colors.chipBg }]}>\n <Text style={[styles.chipText, { color: colors.chipText }]}>{getLabel(item, optionLabel)}</Text>\n <TouchableOpacity\n onPress={() => removeItem(item)}\n hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}\n >\n <Text style={[styles.chipRemove, { color: colors.chipRemove }]}>✕</Text>\n </TouchableOpacity>\n </View>\n ),\n )}\n {remaining > 0 && (\n <View style={[styles.chipMore, { backgroundColor: colors.chipMoreBg }]}>\n <Text style={[styles.chipMoreText, { color: colors.textSecondary }]}>+{remaining}</Text>\n </View>\n )}\n </View>\n );\n }\n\n return (\n <Text numberOfLines={1} style={[styles.commaText, { color: colors.text }, externalTextStyle]}>\n {selectedValues\n .slice(0, maxSelectedLabels)\n .map((v) => getLabel(v, optionLabel))\n .join(', ')}\n </Text>\n );\n };\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n const panelContent = (\n <View style={{ flex: 1 }}>\n {/* Header */}\n <View style={[styles.panelHeader, { borderBottomColor: colors.headerBorder }]}>\n <Text style={[styles.panelHeaderText, { color: colors.textSecondary }]}>\n {selectedValues.length} item{selectedValues.length !== 1 ? 's' : ''} selected\n </Text>\n {/* In popup mode the sheet already draws a close control, and two ✕\n in one header is a question the reader should not have to answer.\n The count stays — it is information, not chrome. */}\n {!usePopup && (\n <TouchableOpacity onPress={() => setOpen(false)}>\n <Text style={[styles.panelCloseText, { color: colors.placeholder }]}>✕</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {/* Search */}\n {filter && (\n <View style={[styles.searchContainer, { borderColor: colors.border, backgroundColor: colors.searchBg }]}>\n <Text style={styles.searchIcon}>🔍</Text>\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder={filterPlaceholder}\n style={[\n styles.searchInput,\n { color: colors.text, fontFamily },\n // The filter follows the reader's language, not the platform's\n // layout direction — same rule as the Dropdown's panel.\n isRTL ? styles.searchRtl : styles.searchLtr,\n ]}\n placeholderTextColor={colors.placeholder}\n />\n </View>\n )}\n\n {/* List */}\n {renderListContent()}\n </View>\n );\n\n return (\n <View style={{ width: '100%' }}>\n {/* Input trigger */}\n <TouchableOpacity\n ref={triggerRef as any}\n activeOpacity={0.8}\n disabled={disabled}\n onPress={toggleOpen}\n style={[\n styles.input,\n { borderColor: colors.border, backgroundColor: colors.bg },\n disabled && { backgroundColor: colors.disabledBg, opacity: 0.6 },\n open && { borderColor: colors.borderFocus },\n externalViewStyle,\n ]}\n >\n <View style={styles.inputContent}>\n {renderSelected()}\n </View>\n <Text style={[styles.dropdownArrow, { color: colors.placeholder }]}>{open ? '▲' : '▼'}</Text>\n </TouchableOpacity>\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); `panelContent` is unchanged. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: () => setOpen(false),\n title: popupTitle,\n children: panelContent,\n })}\n\n {/* Modal mode */}\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.overlay} onPress={() => setOpen(false)}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelContent}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Inline mode — Modal-portal popover anchored to trigger */}\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const PANEL_MAX_HEIGHT = 320;\n const GAP = 4;\n const spaceBelow = screen.height - (triggerLayout.y + triggerLayout.height);\n const spaceAbove = triggerLayout.y;\n const openUp = spaceBelow < PANEL_MAX_HEIGHT && spaceAbove > spaceBelow;\n const maxHeight = Math.min(\n PANEL_MAX_HEIGHT,\n openUp ? spaceAbove - GAP : spaceBelow - GAP,\n );\n const top = openUp\n ? triggerLayout.y - maxHeight - GAP\n : triggerLayout.y + triggerLayout.height + GAP;\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelContent}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n // Input\n input: {\n minHeight: 42,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 6,\n flexDirection: 'row',\n alignItems: 'center',\n },\n inputContent: {\n flex: 1,\n },\n dropdownArrow: {\n fontSize: 10,\n marginLeft: 8,\n },\n\n // Placeholder\n placeholder: { fontSize: 14 },\n commaText: { fontSize: 14 },\n\n // Chips display\n chips: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 4,\n },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 6,\n paddingVertical: 3,\n borderRadius: 16,\n gap: 4,\n },\n chipText: {\n fontSize: 13,\n },\n chipRemove: {\n fontSize: 12,\n paddingHorizontal: 2,\n },\n chipMore: {\n paddingHorizontal: 10,\n paddingVertical: 3,\n borderRadius: 16,\n },\n chipMoreText: {\n fontSize: 13,\n },\n\n // Panel header\n panelHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: 1,\n },\n panelHeaderText: {\n fontSize: 13,\n },\n panelCloseText: {\n fontSize: 18,\n fontWeight: '600',\n },\n\n // Search\n searchContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n margin: 8,\n paddingHorizontal: 10,\n height: 36,\n borderWidth: 1,\n borderRadius: 6,\n },\n searchIcon: {\n fontSize: 14,\n marginRight: 6,\n },\n searchInput: {\n flex: 1,\n fontSize: 14,\n paddingVertical: 0,\n },\n searchLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n searchRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n\n // Group header\n groupHeader: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n groupHeaderText: {\n fontSize: 12,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n\n // Items\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 10,\n paddingHorizontal: 12,\n gap: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n itemText: {\n fontSize: 14,\n /* The label takes the row's spare width so `textAlign` has somewhere to\n push to — a shrink-wrapped Text ignores it. Already here, which is why\n MultiSelect needs no extra entry; Dropdown's label style carries no flex\n and got `optionLabelFill`. */\n flex: 1,\n },\n\n // Checkbox\n checkbox: {\n width: 20,\n height: 20,\n borderWidth: 2,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n },\n checkmark: {\n color: '#fff',\n fontSize: 13,\n fontWeight: '700',\n },\n\n // Loading / Empty\n loadingContainer: {\n padding: 24,\n alignItems: 'center',\n gap: 8,\n },\n loadingText: {\n fontSize: 13,\n },\n emptyContainer: {\n padding: 24,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 14,\n },\n\n // Modal\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center',\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden',\n },\n\n // Popover (Modal-portal)\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute',\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden',\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../../../../apps/mobile/src/Core/MultiSelect/index.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n Modal,\n FlatList,\n TextInput,\n StyleSheet,\n Pressable,\n ActivityIndicator,\n Dimensions,\n} from 'react-native';\nimport { readerEdge } from '../../Factory/helpers/readerEdge';\nimport { resolveThemeTokenForNative } from '../../Factory/helpers/style';\n\nexport type MultiSelectChangeEvent<T> = React.ChangeEvent<{\n value: T[];\n}>;\n\nexport interface MultiSelectProps<T> {\n value?: T[] | null;\n onChange?: (e: MultiSelectChangeEvent<T>, selectedItems: T[]) => void;\n isModal?: boolean;\n\n options?: T[];\n\n optionLabel?: keyof T | string;\n optionValue?: keyof T | string;\n\n optionGroupLabel?: keyof T | string;\n optionGroupChildren?: keyof T | string;\n\n placeholder?: string;\n disabled?: boolean;\n loading?: boolean;\n filter?: boolean;\n emptyFilterMessage?: string;\n /**\n * Placeholder for the panel's filter field, already written in the reader's\n * language by the KitsConcerto wrapper — this component lives in\n * `apps/mobile`, which `packages/ui` imports, so it cannot translate.\n */\n filterPlaceholder?: string;\n /** Reader's direction, from the wrapper's `useLanguage().isRTL`. */\n isRTL?: boolean;\n /**\n * Font family the app's theme names for body text, resolved by the wrapper.\n * React Native does not cascade fontFamily through Views, so each text sink\n * must set it — see the Dropdown's own note.\n */\n fontFamily?: string;\n /**\n * Open the options in a popup that owns the screen instead of a panel\n * anchored to the trigger. Default false — see the Dropdown's own `popup`\n * for why the anchor is the thing being escaped.\n */\n popup?: boolean;\n /**\n * Supplies the popup's container. Injected by the KitsConcerto wrapper: the\n * container is this library's `KitsDialogControlled`, which lives in\n * `packages/ui`, and `packages/ui` imports THIS file.\n */\n renderPopup?: (args: {\n visible: boolean;\n onClose: () => void;\n title?: React.ReactNode;\n children: React.ReactNode;\n }) => React.ReactNode;\n /** Title for the popup header. */\n popupTitle?: React.ReactNode;\n\n display?: 'comma' | 'chip';\n maxSelectedLabels?: number;\n\n itemTemplate?: (item: T) => React.ReactElement;\n selectedItemTemplate?: (item: T) => React.ReactElement;\n style?: import('react-native').ViewStyle;\n\n /* ─── Chip slots ─────────────────────────────────────────────────────\n Same three props, same meaning, as `Core/AutoComplete` — so the two\n chip-bearing controls take their chip styling from one place in the\n theme instead of each hardcoding its own. */\n /** A single chip (the `View`): background, radius, padding, margin. */\n tokenStyle?: import('react-native').ViewStyle;\n /** The chip's label `Text`: color, fontSize, fontWeight, fontFamily. */\n tokenLabelStyle?: import('react-native').TextStyle;\n /** The chip's remove (✕) `Text`: color, fontSize. */\n tokenIconStyle?: import('react-native').TextStyle;\n}\n\nconst t = resolveThemeTokenForNative;\n\nconst TEXT_STYLE_KEYS = new Set([\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle',\n 'color', 'letterSpacing', 'lineHeight', 'textAlign',\n 'textDecorationLine', 'textTransform',\n]);\n\nfunction splitStyle(combined?: any): { viewStyle?: any; textStyle?: any } {\n if (!combined) return {};\n const view: Record<string, any> = {};\n const text: Record<string, any> = {};\n for (const [k, v] of Object.entries(combined)) {\n if (TEXT_STYLE_KEYS.has(k)) text[k] = v;\n else view[k] = v;\n }\n return {\n viewStyle: Object.keys(view).length ? view : undefined,\n textStyle: Object.keys(text).length ? text : undefined,\n };\n}\n\nexport default function MultiSelect<T>(props: MultiSelectProps<T>) {\n const {\n value,\n onChange,\n options = [],\n optionLabel,\n optionValue,\n optionGroupLabel,\n optionGroupChildren,\n isModal = false,\n placeholder = 'Select',\n disabled,\n loading,\n filter,\n // ⚠️ English literals of last resort, not translations — the wrapper always\n // passes the reader's own sentence. These only apply when this component is\n // used directly from `apps/mobile`, so a panel can never render blank.\n emptyFilterMessage = 'No results found',\n filterPlaceholder = 'Search...',\n isRTL = false,\n fontFamily,\n popup = false,\n renderPopup,\n popupTitle,\n display = 'chip',\n maxSelectedLabels = 10,\n itemTemplate,\n selectedItemTemplate,\n style: externalStyle,\n tokenStyle,\n tokenLabelStyle,\n tokenIconStyle,\n } = props;\n\n /* Physical edges to write so content lands where the reader starts. */\n const edge = readerEdge(isRTL);\n\n const triggerRef = useRef<View>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [triggerLayout, setTriggerLayout] = useState<{\n x: number; y: number; width: number; height: number;\n } | null>(null);\n\n const close = () => setOpen(false);\n\n const toggleOpen = () => {\n if (disabled) return;\n if (open) {\n setOpen(false);\n return;\n }\n triggerRef.current?.measureInWindow((x, y, width, height) => {\n setTriggerLayout({ x, y, width, height });\n setOpen(true);\n });\n };\n\n const { viewStyle: externalViewStyle, textStyle: externalTextStyle } = splitStyle(externalStyle);\n\n const colors = {\n border: t('border') || t('gray.300'),\n borderFocus: t('primary'),\n bg: t('surface-card') || '#fff',\n disabledBg: t('surface-ground') || t('gray.100'),\n placeholder: t('text-secondary') || t('gray.400'),\n text: t('text') || t('gray.800'),\n textSecondary: t('text-secondary') || t('gray.500'),\n chipBg: t('primary.100') || t('indigo.100'),\n chipText: t('primary.700') || t('indigo.700'),\n chipRemove: t('primary.500') || t('indigo.500'),\n chipMoreBg: t('surface-ground') || t('gray.100'),\n headerBorder: t('border') || t('gray.200'),\n groupBg: t('surface-ground') || t('gray.50'),\n groupBorder: t('border') || t('gray.200'),\n itemBorder: t('surface-ground') || t('gray.100'),\n itemSelectedBg: t('highlight-bg') || t('indigo.50'),\n itemSelectedText: t('primary.700') || t('indigo.700'),\n checkboxBorder: t('border') || t('gray.300'),\n checkboxChecked: t('primary'),\n invalidBorder: t('danger') || t('red.500'),\n searchBg: t('surface-ground') || t('gray.50'),\n };\n\n const getValue = (item: T, key?: keyof T | string) =>\n key ? (item as any)[key] : item;\n\n const getLabel = (item: T, key?: keyof T | string) =>\n String(key ? (item as any)[key] : item);\n\n const selectedValues = Array.isArray(value) ? value : [];\n\n // Build display items: flat list with optional group headers\n const displayItems: { type: 'group' | 'item'; data: any }[] = useMemo(() => {\n if (optionGroupLabel && optionGroupChildren) {\n const result: { type: 'group' | 'item'; data: any }[] = [];\n options.forEach((group: any) => {\n result.push({ type: 'group', data: group });\n const children = group[optionGroupChildren] ?? [];\n children.forEach((child: any) => result.push({ type: 'item', data: child }));\n });\n return result;\n }\n return options.map((item) => ({ type: 'item' as const, data: item }));\n }, [options, optionGroupLabel, optionGroupChildren]);\n\n const filtered = useMemo(() => {\n if (!filter || !query) return displayItems;\n return displayItems.filter((entry) => {\n if (entry.type === 'group') return true; // keep group headers\n return getLabel(entry.data, optionLabel)\n .toLowerCase()\n .includes(query.toLowerCase());\n });\n }, [query, displayItems]);\n\n const isSelected = (item: T) =>\n selectedValues.some(\n (v) => getValue(v, optionValue) === getValue(item, optionValue),\n );\n\n const toggleItem = (item: T) => {\n const exists = isSelected(item);\n const next = exists\n ? selectedValues.filter(\n (v) => getValue(v, optionValue) !== getValue(item, optionValue),\n )\n : [...selectedValues, item];\n\n const syntheticEvent = {\n target: { value: next },\n } as React.ChangeEvent<any>;\n\n onChange?.(syntheticEvent, next);\n };\n\n const removeItem = (item: T) => {\n const next = selectedValues.filter(\n (v) => getValue(v, optionValue) !== getValue(item, optionValue),\n );\n const syntheticEvent = {\n target: { value: next },\n } as React.ChangeEvent<any>;\n onChange?.(syntheticEvent, next);\n };\n\n const renderCheckbox = (checked: boolean) => (\n <View\n style={[\n styles.checkbox,\n { borderColor: colors.checkboxBorder, backgroundColor: colors.bg },\n checked && { backgroundColor: colors.checkboxChecked, borderColor: colors.checkboxChecked },\n ]}\n >\n {checked && <Text style={styles.checkmark}>✓</Text>}\n </View>\n );\n\n const renderListContent = () => {\n if (loading) {\n return (\n <View style={styles.loadingContainer}>\n <ActivityIndicator size=\"small\" color={colors.checkboxChecked} />\n <Text style={[styles.loadingText, { color: colors.placeholder }]}>Loading...</Text>\n </View>\n );\n }\n\n const itemsOnly = filtered.filter((e) => e.type === 'item');\n if (itemsOnly.length === 0) {\n return (\n <View style={styles.emptyContainer}>\n <Text style={[styles.emptyText, { color: colors.placeholder }]}>{emptyFilterMessage}</Text>\n </View>\n );\n }\n\n return (\n <FlatList\n data={filtered}\n keyExtractor={(entry, i) =>\n entry.type === 'group' ? `group-${i}` : `item-${i}`\n }\n keyboardShouldPersistTaps=\"handled\"\n renderItem={({ item: entry }) => {\n if (entry.type === 'group') {\n return (\n <View style={[styles.groupHeader, { backgroundColor: colors.groupBg, borderBottomColor: colors.groupBorder }]}>\n <Text style={[styles.groupHeaderText, { color: colors.textSecondary }]}>\n {getLabel(entry.data, optionGroupLabel)}\n </Text>\n </View>\n );\n }\n const checked = isSelected(entry.data);\n return (\n <TouchableOpacity\n onPress={() => toggleItem(entry.data)}\n style={[\n styles.item,\n { borderBottomColor: colors.itemBorder },\n checked && { backgroundColor: colors.itemSelectedBg },\n ]}\n activeOpacity={0.7}\n >\n {renderCheckbox(checked)}\n {itemTemplate ? (\n itemTemplate(entry.data)\n ) : (\n <Text style={[\n styles.itemText,\n { color: colors.text, fontFamily },\n checked && { color: colors.itemSelectedText, fontWeight: '500' },\n /* ⛔ The physical edge is COMPUTED — React Native mirrors\n `textAlign` when the process is RTL, so naming the RTL edge\n for an RTL reader lands on the LTR one. See `readerEdge`. */\n {\n textAlign: edge.textAlign,\n writingDirection: isRTL ? ('rtl' as const) : ('ltr' as const),\n },\n ]}>\n {getLabel(entry.data, optionLabel)}\n </Text>\n )}\n </TouchableOpacity>\n );\n }}\n />\n );\n };\n\n const renderSelected = () => {\n if (!selectedValues.length) {\n return <Text style={[styles.placeholder, { color: colors.placeholder }, externalTextStyle]}>{placeholder}</Text>;\n }\n\n if (display === 'chip') {\n const visibleItems = selectedValues.slice(0, maxSelectedLabels);\n const remaining = selectedValues.length - maxSelectedLabels;\n return (\n <View style={styles.chips}>\n {visibleItems.map((item, i) =>\n selectedItemTemplate ? (\n <React.Fragment key={i}>{selectedItemTemplate(item)}</React.Fragment>\n ) : (\n <View key={i} style={[styles.chip, { backgroundColor: colors.chipBg }, tokenStyle]}>\n <Text style={[styles.chipText, { color: colors.chipText }, tokenLabelStyle]}>{getLabel(item, optionLabel)}</Text>\n <TouchableOpacity\n onPress={() => removeItem(item)}\n hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}\n >\n <Text style={[styles.chipRemove, { color: colors.chipRemove }, tokenIconStyle]}>✕</Text>\n </TouchableOpacity>\n </View>\n ),\n )}\n {remaining > 0 && (\n <View style={[styles.chipMore, { backgroundColor: colors.chipMoreBg }]}>\n <Text style={[styles.chipMoreText, { color: colors.textSecondary }]}>+{remaining}</Text>\n </View>\n )}\n </View>\n );\n }\n\n return (\n <Text numberOfLines={1} style={[styles.commaText, { color: colors.text }, externalTextStyle]}>\n {selectedValues\n .slice(0, maxSelectedLabels)\n .map((v) => getLabel(v, optionLabel))\n .join(', ')}\n </Text>\n );\n };\n\n const usePopup = popup && typeof renderPopup === 'function';\n\n const panelContent = (\n <View style={{ flex: 1 }}>\n {/* Header */}\n <View style={[styles.panelHeader, { borderBottomColor: colors.headerBorder }]}>\n <Text style={[styles.panelHeaderText, { color: colors.textSecondary }]}>\n {selectedValues.length} item{selectedValues.length !== 1 ? 's' : ''} selected\n </Text>\n {/* In popup mode the sheet already draws a close control, and two ✕\n in one header is a question the reader should not have to answer.\n The count stays — it is information, not chrome. */}\n {!usePopup && (\n <TouchableOpacity onPress={() => setOpen(false)}>\n <Text style={[styles.panelCloseText, { color: colors.placeholder }]}>✕</Text>\n </TouchableOpacity>\n )}\n </View>\n\n {/* Search */}\n {filter && (\n <View style={[styles.searchContainer, { borderColor: colors.border, backgroundColor: colors.searchBg }]}>\n <Text style={styles.searchIcon}>🔍</Text>\n <TextInput\n value={query}\n onChangeText={setQuery}\n placeholder={filterPlaceholder}\n style={[\n styles.searchInput,\n { color: colors.text, fontFamily },\n // The filter follows the reader's language, not the platform's\n // layout direction — same rule as the Dropdown's panel.\n isRTL ? styles.searchRtl : styles.searchLtr,\n ]}\n placeholderTextColor={colors.placeholder}\n />\n </View>\n )}\n\n {/* List */}\n {renderListContent()}\n </View>\n );\n\n return (\n <View style={{ width: '100%' }}>\n {/* Input trigger */}\n <TouchableOpacity\n ref={triggerRef as any}\n activeOpacity={0.8}\n disabled={disabled}\n onPress={toggleOpen}\n style={[\n styles.input,\n { borderColor: colors.border, backgroundColor: colors.bg },\n disabled && { backgroundColor: colors.disabledBg, opacity: 0.6 },\n open && { borderColor: colors.borderFocus },\n externalViewStyle,\n ]}\n >\n <View style={styles.inputContent}>\n {renderSelected()}\n </View>\n <Text style={[styles.dropdownArrow, { color: colors.placeholder }]}>{open ? '▲' : '▼'}</Text>\n </TouchableOpacity>\n\n {/* Popup — the container comes from the wrapper (this library's own\n Dialog in sheet position); `panelContent` is unchanged. */}\n {usePopup && renderPopup!({\n visible: open,\n onClose: () => setOpen(false),\n title: popupTitle,\n children: panelContent,\n })}\n\n {/* Modal mode */}\n {!usePopup && isModal && (\n <Modal visible={open} transparent animationType=\"fade\">\n <Pressable style={styles.overlay} onPress={() => setOpen(false)}>\n <View\n style={[styles.modalPanel, { backgroundColor: colors.bg }]}\n onStartShouldSetResponder={() => true}\n >\n {panelContent}\n </View>\n </Pressable>\n </Modal>\n )}\n\n {/* Inline mode — Modal-portal popover anchored to trigger */}\n {!usePopup && !isModal && (\n <Modal\n visible={open && !!triggerLayout}\n transparent\n animationType=\"none\"\n onRequestClose={close}\n >\n <Pressable style={styles.popoverOverlay} onPress={close}>\n {triggerLayout && (() => {\n const screen = Dimensions.get('window');\n const PANEL_MAX_HEIGHT = 320;\n const GAP = 4;\n const spaceBelow = screen.height - (triggerLayout.y + triggerLayout.height);\n const spaceAbove = triggerLayout.y;\n const openUp = spaceBelow < PANEL_MAX_HEIGHT && spaceAbove > spaceBelow;\n const maxHeight = Math.min(\n PANEL_MAX_HEIGHT,\n openUp ? spaceAbove - GAP : spaceBelow - GAP,\n );\n const top = openUp\n ? triggerLayout.y - maxHeight - GAP\n : triggerLayout.y + triggerLayout.height + GAP;\n\n return (\n <View\n style={[\n styles.popoverPanel,\n {\n top,\n left: triggerLayout.x,\n width: triggerLayout.width,\n maxHeight,\n borderColor: colors.border,\n backgroundColor: colors.bg,\n },\n ]}\n onStartShouldSetResponder={() => true}\n >\n {panelContent}\n </View>\n );\n })()}\n </Pressable>\n </Modal>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n // Input\n input: {\n minHeight: 42,\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 6,\n flexDirection: 'row',\n alignItems: 'center',\n },\n inputContent: {\n flex: 1,\n },\n dropdownArrow: {\n fontSize: 10,\n marginLeft: 8,\n },\n\n // Placeholder\n placeholder: { fontSize: 14 },\n commaText: { fontSize: 14 },\n\n // Chips display\n chips: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: 4,\n },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 6,\n paddingVertical: 3,\n borderRadius: 16,\n gap: 4,\n },\n chipText: {\n fontSize: 13,\n },\n chipRemove: {\n fontSize: 12,\n paddingHorizontal: 2,\n },\n chipMore: {\n paddingHorizontal: 10,\n paddingVertical: 3,\n borderRadius: 16,\n },\n chipMoreText: {\n fontSize: 13,\n },\n\n // Panel header\n panelHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: 1,\n },\n panelHeaderText: {\n fontSize: 13,\n },\n panelCloseText: {\n fontSize: 18,\n fontWeight: '600',\n },\n\n // Search\n searchContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n margin: 8,\n paddingHorizontal: 10,\n height: 36,\n borderWidth: 1,\n borderRadius: 6,\n },\n searchIcon: {\n fontSize: 14,\n marginRight: 6,\n },\n searchInput: {\n flex: 1,\n fontSize: 14,\n paddingVertical: 0,\n },\n searchLtr: {\n textAlign: 'left' as const,\n writingDirection: 'ltr' as const,\n },\n searchRtl: {\n textAlign: 'right' as const,\n writingDirection: 'rtl' as const,\n },\n\n // Group header\n groupHeader: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n groupHeaderText: {\n fontSize: 12,\n fontWeight: '700',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n },\n\n // Items\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 10,\n paddingHorizontal: 12,\n gap: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n itemText: {\n fontSize: 14,\n /* The label takes the row's spare width so `textAlign` has somewhere to\n push to — a shrink-wrapped Text ignores it. Already here, which is why\n MultiSelect needs no extra entry; Dropdown's label style carries no flex\n and got `optionLabelFill`. */\n flex: 1,\n },\n\n // Checkbox\n checkbox: {\n width: 20,\n height: 20,\n borderWidth: 2,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n },\n checkmark: {\n color: '#fff',\n fontSize: 13,\n fontWeight: '700',\n },\n\n // Loading / Empty\n loadingContainer: {\n padding: 24,\n alignItems: 'center',\n gap: 8,\n },\n loadingText: {\n fontSize: 13,\n },\n emptyContainer: {\n padding: 24,\n alignItems: 'center',\n },\n emptyText: {\n fontSize: 14,\n },\n\n // Modal\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.4)',\n justifyContent: 'center',\n },\n modalPanel: {\n margin: 24,\n maxHeight: '70%',\n borderRadius: 12,\n overflow: 'hidden',\n },\n\n // Popover (Modal-portal)\n popoverOverlay: {\n flex: 1,\n backgroundColor: 'transparent',\n },\n popoverPanel: {\n position: 'absolute',\n borderWidth: 1,\n borderRadius: 6,\n overflow: 'hidden',\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.15,\n shadowRadius: 8,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var index_native = require('../../primitives/Icon/index.cjs');
|
|
|
8
8
|
require('react');
|
|
9
9
|
require('../../contexts/DialogContext.cjs');
|
|
10
10
|
require('../../contexts/PermissionsContext.cjs');
|
|
11
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
11
12
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
12
13
|
|
|
13
14
|
const SIZE_PX = { xs: 24, sm: 32, md: 40, lg: 56, xl: 72 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Avatar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IAvatarProps, IAvatarStackProps, AvatarSize} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size resolution ─────────────────────────────────────────── */\nconst SIZE_PX: Record<string, number> = {xs: 24, sm: 32, md: 40, lg: 56, xl: 72};\n\nfunction resolveSize(size: AvatarSize | undefined): number {\n if (typeof size === \"number\") return size;\n return SIZE_PX[size ?? \"md\"] ?? 40;\n}\n\n/* ─── Status dot → semantic token ─────────────────────────────── */\nconst STATUS_TOKENS: Record<string, string> = {\n online: \"success\",\n offline: \"gray.400\",\n away: \"warning\",\n busy: \"danger\",\n};\n\n/* ─── Deterministic monogram palette (all confirmed theme tokens) ─ */\nconst MONOGRAM_PALETTE = [\"brand\", \"primary.800\", \"success\", \"danger\", \"ink.700\"];\n\nfunction hashIndex(input: string, mod: number): number {\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (h * 31 + input.charCodeAt(i)) >>> 0;\n return mod > 0 ? h % mod : 0;\n}\n\nfunction deriveInitials(name?: string, initials?: string): string {\n if (initials) return initials.slice(0, 3).toUpperCase();\n if (!name) return \"\";\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]!.charAt(0) + parts[parts.length - 1]!.charAt(0)).toUpperCase();\n}\n\n/**\n * Avatar — image / monogram / icon identity tile.\n *\n * Pure presentational and cross-platform: composed from the `Box` + `Text` +\n * `Image` + `Icon` primitives, so it renders identically on web and native\n * with no platform split. Tappability is the caller's concern (wrap in a\n * Pressable / Button).\n *\n * <Avatar src=\"https://…/me.jpg\" size=\"lg\" />\n * <Avatar name=\"Fouad K\" status=\"online\" />\n * <Avatar initials=\"C\" masked /> // identity-masked (Flex)\n * <Avatar name=\"Acme\" shape=\"rounded\" badge={<Icon name=\"briefcase\" />} />\n */\nexport function Avatar(props: IAvatarProps) {\n const {mergedProps} = useComponentDefaults<IAvatarProps>(\"Avatar\", props);\n const {\n src,\n name,\n initials,\n icon,\n size = \"md\",\n shape = \"circle\",\n color,\n status = \"none\",\n ring = false,\n ringColor = \"brand\",\n masked = false,\n maskFillColor = \"indigo.600\",\n badge,\n alt,\n testID,\n ...rest\n } = mergedProps;\n\n const px = resolveSize(size);\n const radius = shape === \"circle\" ? px / 2 : Math.round(px * 0.28);\n const fontSize = Math.max(10, Math.round(px * 0.4));\n const iconSize = Math.round(px * 0.5);\n const dot = Math.max(8, Math.round(px * 0.28));\n const ringW = px >= 56 ? 3 : 2;\n\n const resolvedInitials = deriveInitials(name, initials);\n const hasImage = !!src;\n const showInitials = !hasImage && resolvedInitials.length > 0;\n const showIcon = !hasImage && !showInitials && icon != null;\n\n const monogramBg =\n color ?? (MONOGRAM_PALETTE[hashIndex(name ?? resolvedInitials, MONOGRAM_PALETTE.length)] ?? \"brand\");\n const surfaceBg = masked ? maskFillColor : hasImage ? \"gray.100\" : monogramBg;\n const initialsColor = \"#FFFFFF\";\n\n const statusColor = STATUS_TOKENS[status] ?? \"gray.400\";\n const ariaLabel = alt ?? name ?? \"avatar\";\n\n const a11yProps = {\n role: \"img\",\n \"aria-label\": ariaLabel,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n position=\"relative\"\n width={px}\n height={px}\n {...rest}\n {...(a11yProps as any)}\n >\n {/* Surface (clips the image / centres the monogram).\n overflow:hidden only when an image is present — clipping the\n monogram <Text> cuts off the glyph tops on native. */}\n <Box\n width=\"100%\"\n height=\"100%\"\n borderRadius={radius}\n overflow={hasImage && !masked ? \"hidden\" : \"visible\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={surfaceBg}\n >\n {masked ? (\n <Icon name=\"user\" size={iconSize} color=\"#FFFFFF\" />\n ) : hasImage ? (\n /*\n * width/height via style: the Image primitive types dimensions\n * differently per platform (web string vs native number).\n *\n * ⛔ `alt` IS REQUIRED HERE AND WAS MISSING — every Avatar with\n * a `src` warned, on every render. gluestack's own image creator\n * does `if (typeof alt !== 'string') console.warn('Please pass\n * alt prop to Image component')`, so the check is on the TYPE,\n * not on emptiness: a missing prop warns and an empty string\n * does not. Measured in AlphaMatch on 5 October 2026 — 21\n * warnings in a single sign-in from `AMTabBar`'s Me slot alone,\n * which is one Avatar.\n *\n * ⛔ AND IT IS EMPTY ON PURPOSE, NOT `ariaLabel`. The Box above\n * already carries `role=\"img\"` and `aria-label={ariaLabel}`, so\n * this image is PRESENTATION inside an element that is already\n * named; repeating the label here would announce the person's\n * name twice. Empty is the standing answer for a decorative\n * image, and it is this library's own: `PhoneInput` passes\n * `alt={countryISO ?? \"\"}` for exactly this reason.\n *\n * ⛔ `aria-hidden` IS THE OTHER HALF, AND `alt=\"\"` ALONE WAS NOT\n * ENOUGH — found by Codex, 5 October 2026. gluestack does not\n * only read `alt`; it also forces\n * `role={props.role || 'img'}`, so an empty alt leaves a\n * SECOND, NAMELESS image role sitting under the labelled Box.\n * On the web an `<img alt=\"\">` is decorative and harmless; on\n * React Native that role becomes `accessibilityRole=\"image\"`\n * and a screen reader can land on an unnamed image. Hiding the\n * node is what makes it presentational on both platforms —\n * RN maps `aria-hidden` to `accessibilityElementsHidden` on\n * iOS and `importantForAccessibility=\"no-hide-descendants\"` on\n * Android. `alt=\"\"` stays because it is what silences the\n * warning: gluestack checks `typeof alt !== 'string'`.\n *\n * ⚠️ `Gallery` HAS THE SAME MISSING `alt`, one file away, and is\n * NOT fixed here — it was outside what this change was opened\n * for. Recorded in the session report rather than swept in.\n */\n <Image\n src={src}\n alt=\"\"\n aria-hidden\n style={{width: px, height: px} as any}\n objectFit=\"cover\"\n />\n ) : showInitials ? (\n <Text\n color={initialsColor}\n fontSize={fontSize}\n fontWeight=\"700\"\n lineHeight={Math.round(fontSize * 1.2)}\n textAlign=\"center\"\n >\n {resolvedInitials}\n </Text>\n ) : showIcon ? (\n <Icon name={icon as never} size={iconSize} color=\"gray.500\" />\n ) : null}\n </Box>\n\n {/* Ring overlay (solid active ring) */}\n {ring && (\n <Box\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n borderRadius={radius}\n borderWidth={ringW}\n borderStyle=\"solid\"\n borderColor={ringColor}\n />\n )}\n\n {/* Badge OR presence dot (badge wins the corner) */}\n {badge != null ? (\n <Box position=\"absolute\" bottom={-2} right={-2} zIndex={2}>\n {badge}\n </Box>\n ) : status !== \"none\" ? (\n <Box\n position=\"absolute\"\n bottom={0}\n right={0}\n zIndex={2}\n width={dot}\n height={dot}\n borderRadius={dot}\n bgColor={statusColor}\n borderWidth={2}\n borderColor=\"surface-card\"\n />\n ) : null}\n </Box>\n );\n}\n\n/**\n * AvatarStack — overlapping row of avatars with a \"+N\" overflow tile.\n * Each avatar gets a surface-coloured cut-out ring so it reads cleanly\n * against the one behind it.\n *\n * <AvatarStack items={members} max={4} activeIndex={0} />\n */\nexport function AvatarStack(props: IAvatarStackProps) {\n const {mergedProps} = useComponentDefaults<IAvatarStackProps>(\"AvatarStack\", props);\n const {items, max = 4, size = \"md\", overlap = 0.35, activeIndex, ringColor = \"brand\", testID, ...rest} = mergedProps;\n\n const px = resolveSize(size);\n const clampedOverlap = Math.min(Math.max(overlap, 0), 0.9);\n const overlapPx = Math.round(px * clampedOverlap);\n const strokeW = px >= 56 ? 3 : 2;\n\n const visible = items.slice(0, max);\n const overflow = items.length - visible.length;\n\n const cell = (key: string, node: React.ReactNode, i: number) => (\n <Box\n key={key}\n marginLeft={i === 0 ? 0 : -overlapPx}\n zIndex={items.length - i}\n borderRadius={9999}\n borderWidth={strokeW}\n borderColor=\"surface-card\"\n bgColor=\"surface-card\"\n >\n {node}\n </Box>\n );\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" {...rest} {...(a11yProps as any)}>\n {visible.map((item, i) =>\n cell(\n `avatar-${i}`,\n <Avatar\n {...item}\n size={size}\n ring={i === activeIndex || item.ring}\n ringColor={item.ringColor ?? ringColor}\n />,\n i,\n ),\n )}\n {overflow > 0 && cell(\"avatar-overflow\", <Avatar initials={`+${overflow}`} size={size} color=\"ink.400\" />, visible.length)}\n </Box>\n );\n}\n\nexport default Avatar;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Image","Text"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Avatar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IAvatarProps, IAvatarStackProps, AvatarSize} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size resolution ─────────────────────────────────────────── */\nconst SIZE_PX: Record<string, number> = {xs: 24, sm: 32, md: 40, lg: 56, xl: 72};\n\nfunction resolveSize(size: AvatarSize | undefined): number {\n if (typeof size === \"number\") return size;\n return SIZE_PX[size ?? \"md\"] ?? 40;\n}\n\n/* ─── Status dot → semantic token ─────────────────────────────── */\nconst STATUS_TOKENS: Record<string, string> = {\n online: \"success\",\n offline: \"gray.400\",\n away: \"warning\",\n busy: \"danger\",\n};\n\n/* ─── Deterministic monogram palette (all confirmed theme tokens) ─ */\nconst MONOGRAM_PALETTE = [\"brand\", \"primary.800\", \"success\", \"danger\", \"ink.700\"];\n\nfunction hashIndex(input: string, mod: number): number {\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (h * 31 + input.charCodeAt(i)) >>> 0;\n return mod > 0 ? h % mod : 0;\n}\n\nfunction deriveInitials(name?: string, initials?: string): string {\n if (initials) return initials.slice(0, 3).toUpperCase();\n if (!name) return \"\";\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]!.charAt(0) + parts[parts.length - 1]!.charAt(0)).toUpperCase();\n}\n\n/**\n * Avatar — image / monogram / icon identity tile.\n *\n * Pure presentational and cross-platform: composed from the `Box` + `Text` +\n * `Image` + `Icon` primitives, so it renders identically on web and native\n * with no platform split. Tappability is the caller's concern (wrap in a\n * Pressable / Button).\n *\n * <Avatar src=\"https://…/me.jpg\" size=\"lg\" />\n * <Avatar name=\"Fouad K\" status=\"online\" />\n * <Avatar initials=\"C\" masked /> // identity-masked (Flex)\n * <Avatar name=\"Acme\" shape=\"rounded\" badge={<Icon name=\"briefcase\" />} />\n */\nexport function Avatar(props: IAvatarProps) {\n const {mergedProps} = useComponentDefaults<IAvatarProps>(\"Avatar\", props);\n const {\n src,\n name,\n initials,\n icon,\n size = \"md\",\n shape = \"circle\",\n color,\n status = \"none\",\n ring = false,\n ringColor = \"brand\",\n masked = false,\n maskFillColor = \"indigo.600\",\n badge,\n alt,\n testID,\n ...rest\n } = mergedProps;\n\n const px = resolveSize(size);\n const radius = shape === \"circle\" ? px / 2 : Math.round(px * 0.28);\n const fontSize = Math.max(10, Math.round(px * 0.4));\n const iconSize = Math.round(px * 0.5);\n const dot = Math.max(8, Math.round(px * 0.28));\n const ringW = px >= 56 ? 3 : 2;\n\n const resolvedInitials = deriveInitials(name, initials);\n const hasImage = !!src;\n const showInitials = !hasImage && resolvedInitials.length > 0;\n const showIcon = !hasImage && !showInitials && icon != null;\n\n const monogramBg =\n color ?? (MONOGRAM_PALETTE[hashIndex(name ?? resolvedInitials, MONOGRAM_PALETTE.length)] ?? \"brand\");\n const surfaceBg = masked ? maskFillColor : hasImage ? \"gray.100\" : monogramBg;\n const initialsColor = \"#FFFFFF\";\n\n const statusColor = STATUS_TOKENS[status] ?? \"gray.400\";\n const ariaLabel = alt ?? name ?? \"avatar\";\n\n const a11yProps = {\n role: \"img\",\n \"aria-label\": ariaLabel,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n position=\"relative\"\n width={px}\n height={px}\n {...rest}\n {...(a11yProps as any)}\n >\n {/* Surface (clips the image / centres the monogram).\n overflow:hidden only when an image is present — clipping the\n monogram <Text> cuts off the glyph tops on native. */}\n <Box\n width=\"100%\"\n height=\"100%\"\n borderRadius={radius}\n overflow={hasImage && !masked ? \"hidden\" : \"visible\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={surfaceBg}\n >\n {masked ? (\n <Icon name=\"user\" size={iconSize} color=\"#FFFFFF\" />\n ) : hasImage ? (\n /*\n * width/height via style: the Image primitive types dimensions\n * differently per platform (web string vs native number).\n *\n * ⛔ `alt` IS REQUIRED HERE AND WAS MISSING — every Avatar with\n * a `src` warned, on every render. gluestack's own image creator\n * does `if (typeof alt !== 'string') console.warn('Please pass\n * alt prop to Image component')`, so the check is on the TYPE,\n * not on emptiness: a missing prop warns and an empty string\n * does not. Measured in AlphaMatch on 5 October 2026 — 21\n * warnings in a single sign-in from `AMTabBar`'s Me slot alone,\n * which is one Avatar.\n *\n * ⛔ AND IT IS EMPTY ON PURPOSE, NOT `ariaLabel`. The Box above\n * already carries `role=\"img\"` and `aria-label={ariaLabel}`, so\n * this image is PRESENTATION inside an element that is already\n * named; repeating the label here would announce the person's\n * name twice. Empty is the standing answer for a decorative\n * image, and it is this library's own: `PhoneInput` passes\n * `alt={countryISO ?? \"\"}` for exactly this reason.\n *\n * ⛔ `aria-hidden` IS THE OTHER HALF, AND `alt=\"\"` ALONE WAS NOT\n * ENOUGH — found by Codex, 5 October 2026. gluestack does not\n * only read `alt`; it also forces\n * `role={props.role || 'img'}`, so an empty alt leaves a\n * SECOND, NAMELESS image role sitting under the labelled Box.\n * On the web an `<img alt=\"\">` is decorative and harmless; on\n * React Native that role becomes `accessibilityRole=\"image\"`\n * and a screen reader can land on an unnamed image. Hiding the\n * node is what makes it presentational on both platforms —\n * RN maps `aria-hidden` to `accessibilityElementsHidden` on\n * iOS and `importantForAccessibility=\"no-hide-descendants\"` on\n * Android. `alt=\"\"` stays because it is what silences the\n * warning: gluestack checks `typeof alt !== 'string'`.\n *\n * ⚠️ `Gallery` HAS THE SAME MISSING `alt`, one file away, and is\n * NOT fixed here — it was outside what this change was opened\n * for. Recorded in the session report rather than swept in.\n */\n <Image\n src={src}\n alt=\"\"\n aria-hidden\n style={{width: px, height: px} as any}\n objectFit=\"cover\"\n />\n ) : showInitials ? (\n <Text\n color={initialsColor}\n fontSize={fontSize}\n fontWeight=\"700\"\n lineHeight={Math.round(fontSize * 1.2)}\n textAlign=\"center\"\n >\n {resolvedInitials}\n </Text>\n ) : showIcon ? (\n <Icon name={icon as never} size={iconSize} color=\"gray.500\" />\n ) : null}\n </Box>\n\n {/* Ring overlay (solid active ring) */}\n {ring && (\n <Box\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n borderRadius={radius}\n borderWidth={ringW}\n borderStyle=\"solid\"\n borderColor={ringColor}\n />\n )}\n\n {/* Badge OR presence dot (badge wins the corner) */}\n {badge != null ? (\n <Box position=\"absolute\" bottom={-2} right={-2} zIndex={2}>\n {badge}\n </Box>\n ) : status !== \"none\" ? (\n <Box\n position=\"absolute\"\n bottom={0}\n right={0}\n zIndex={2}\n width={dot}\n height={dot}\n borderRadius={dot}\n bgColor={statusColor}\n borderWidth={2}\n borderColor=\"surface-card\"\n />\n ) : null}\n </Box>\n );\n}\n\n/**\n * AvatarStack — overlapping row of avatars with a \"+N\" overflow tile.\n * Each avatar gets a surface-coloured cut-out ring so it reads cleanly\n * against the one behind it.\n *\n * <AvatarStack items={members} max={4} activeIndex={0} />\n */\nexport function AvatarStack(props: IAvatarStackProps) {\n const {mergedProps} = useComponentDefaults<IAvatarStackProps>(\"AvatarStack\", props);\n const {items, max = 4, size = \"md\", overlap = 0.35, activeIndex, ringColor = \"brand\", testID, ...rest} = mergedProps;\n\n const px = resolveSize(size);\n const clampedOverlap = Math.min(Math.max(overlap, 0), 0.9);\n const overlapPx = Math.round(px * clampedOverlap);\n const strokeW = px >= 56 ? 3 : 2;\n\n const visible = items.slice(0, max);\n const overflow = items.length - visible.length;\n\n const cell = (key: string, node: React.ReactNode, i: number) => (\n <Box\n key={key}\n marginLeft={i === 0 ? 0 : -overlapPx}\n zIndex={items.length - i}\n borderRadius={9999}\n borderWidth={strokeW}\n borderColor=\"surface-card\"\n bgColor=\"surface-card\"\n >\n {node}\n </Box>\n );\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" {...rest} {...(a11yProps as any)}>\n {visible.map((item, i) =>\n cell(\n `avatar-${i}`,\n <Avatar\n {...item}\n size={size}\n ring={i === activeIndex || item.ring}\n ringColor={item.ringColor ?? ringColor}\n />,\n i,\n ),\n )}\n {overflow > 0 && cell(\"avatar-overflow\", <Avatar initials={`+${overflow}`} size={size} color=\"ink.400\" />, visible.length)}\n </Box>\n );\n}\n\nexport default Avatar;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Image","Text"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { Icon } from '../../primitives/Icon/index.js';
|
|
|
6
6
|
import 'react';
|
|
7
7
|
import '../../contexts/DialogContext.js';
|
|
8
8
|
import '../../contexts/PermissionsContext.js';
|
|
9
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
9
10
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
10
11
|
|
|
11
12
|
const SIZE_PX = { xs: 24, sm: 32, md: 40, lg: 56, xl: 72 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Avatar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IAvatarProps, IAvatarStackProps, AvatarSize} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size resolution ─────────────────────────────────────────── */\nconst SIZE_PX: Record<string, number> = {xs: 24, sm: 32, md: 40, lg: 56, xl: 72};\n\nfunction resolveSize(size: AvatarSize | undefined): number {\n if (typeof size === \"number\") return size;\n return SIZE_PX[size ?? \"md\"] ?? 40;\n}\n\n/* ─── Status dot → semantic token ─────────────────────────────── */\nconst STATUS_TOKENS: Record<string, string> = {\n online: \"success\",\n offline: \"gray.400\",\n away: \"warning\",\n busy: \"danger\",\n};\n\n/* ─── Deterministic monogram palette (all confirmed theme tokens) ─ */\nconst MONOGRAM_PALETTE = [\"brand\", \"primary.800\", \"success\", \"danger\", \"ink.700\"];\n\nfunction hashIndex(input: string, mod: number): number {\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (h * 31 + input.charCodeAt(i)) >>> 0;\n return mod > 0 ? h % mod : 0;\n}\n\nfunction deriveInitials(name?: string, initials?: string): string {\n if (initials) return initials.slice(0, 3).toUpperCase();\n if (!name) return \"\";\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]!.charAt(0) + parts[parts.length - 1]!.charAt(0)).toUpperCase();\n}\n\n/**\n * Avatar — image / monogram / icon identity tile.\n *\n * Pure presentational and cross-platform: composed from the `Box` + `Text` +\n * `Image` + `Icon` primitives, so it renders identically on web and native\n * with no platform split. Tappability is the caller's concern (wrap in a\n * Pressable / Button).\n *\n * <Avatar src=\"https://…/me.jpg\" size=\"lg\" />\n * <Avatar name=\"Fouad K\" status=\"online\" />\n * <Avatar initials=\"C\" masked /> // identity-masked (Flex)\n * <Avatar name=\"Acme\" shape=\"rounded\" badge={<Icon name=\"briefcase\" />} />\n */\nexport function Avatar(props: IAvatarProps) {\n const {mergedProps} = useComponentDefaults<IAvatarProps>(\"Avatar\", props);\n const {\n src,\n name,\n initials,\n icon,\n size = \"md\",\n shape = \"circle\",\n color,\n status = \"none\",\n ring = false,\n ringColor = \"brand\",\n masked = false,\n maskFillColor = \"indigo.600\",\n badge,\n alt,\n testID,\n ...rest\n } = mergedProps;\n\n const px = resolveSize(size);\n const radius = shape === \"circle\" ? px / 2 : Math.round(px * 0.28);\n const fontSize = Math.max(10, Math.round(px * 0.4));\n const iconSize = Math.round(px * 0.5);\n const dot = Math.max(8, Math.round(px * 0.28));\n const ringW = px >= 56 ? 3 : 2;\n\n const resolvedInitials = deriveInitials(name, initials);\n const hasImage = !!src;\n const showInitials = !hasImage && resolvedInitials.length > 0;\n const showIcon = !hasImage && !showInitials && icon != null;\n\n const monogramBg =\n color ?? (MONOGRAM_PALETTE[hashIndex(name ?? resolvedInitials, MONOGRAM_PALETTE.length)] ?? \"brand\");\n const surfaceBg = masked ? maskFillColor : hasImage ? \"gray.100\" : monogramBg;\n const initialsColor = \"#FFFFFF\";\n\n const statusColor = STATUS_TOKENS[status] ?? \"gray.400\";\n const ariaLabel = alt ?? name ?? \"avatar\";\n\n const a11yProps = {\n role: \"img\",\n \"aria-label\": ariaLabel,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n position=\"relative\"\n width={px}\n height={px}\n {...rest}\n {...(a11yProps as any)}\n >\n {/* Surface (clips the image / centres the monogram).\n overflow:hidden only when an image is present — clipping the\n monogram <Text> cuts off the glyph tops on native. */}\n <Box\n width=\"100%\"\n height=\"100%\"\n borderRadius={radius}\n overflow={hasImage && !masked ? \"hidden\" : \"visible\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={surfaceBg}\n >\n {masked ? (\n <Icon name=\"user\" size={iconSize} color=\"#FFFFFF\" />\n ) : hasImage ? (\n /*\n * width/height via style: the Image primitive types dimensions\n * differently per platform (web string vs native number).\n *\n * ⛔ `alt` IS REQUIRED HERE AND WAS MISSING — every Avatar with\n * a `src` warned, on every render. gluestack's own image creator\n * does `if (typeof alt !== 'string') console.warn('Please pass\n * alt prop to Image component')`, so the check is on the TYPE,\n * not on emptiness: a missing prop warns and an empty string\n * does not. Measured in AlphaMatch on 5 October 2026 — 21\n * warnings in a single sign-in from `AMTabBar`'s Me slot alone,\n * which is one Avatar.\n *\n * ⛔ AND IT IS EMPTY ON PURPOSE, NOT `ariaLabel`. The Box above\n * already carries `role=\"img\"` and `aria-label={ariaLabel}`, so\n * this image is PRESENTATION inside an element that is already\n * named; repeating the label here would announce the person's\n * name twice. Empty is the standing answer for a decorative\n * image, and it is this library's own: `PhoneInput` passes\n * `alt={countryISO ?? \"\"}` for exactly this reason.\n *\n * ⛔ `aria-hidden` IS THE OTHER HALF, AND `alt=\"\"` ALONE WAS NOT\n * ENOUGH — found by Codex, 5 October 2026. gluestack does not\n * only read `alt`; it also forces\n * `role={props.role || 'img'}`, so an empty alt leaves a\n * SECOND, NAMELESS image role sitting under the labelled Box.\n * On the web an `<img alt=\"\">` is decorative and harmless; on\n * React Native that role becomes `accessibilityRole=\"image\"`\n * and a screen reader can land on an unnamed image. Hiding the\n * node is what makes it presentational on both platforms —\n * RN maps `aria-hidden` to `accessibilityElementsHidden` on\n * iOS and `importantForAccessibility=\"no-hide-descendants\"` on\n * Android. `alt=\"\"` stays because it is what silences the\n * warning: gluestack checks `typeof alt !== 'string'`.\n *\n * ⚠️ `Gallery` HAS THE SAME MISSING `alt`, one file away, and is\n * NOT fixed here — it was outside what this change was opened\n * for. Recorded in the session report rather than swept in.\n */\n <Image\n src={src}\n alt=\"\"\n aria-hidden\n style={{width: px, height: px} as any}\n objectFit=\"cover\"\n />\n ) : showInitials ? (\n <Text\n color={initialsColor}\n fontSize={fontSize}\n fontWeight=\"700\"\n lineHeight={Math.round(fontSize * 1.2)}\n textAlign=\"center\"\n >\n {resolvedInitials}\n </Text>\n ) : showIcon ? (\n <Icon name={icon as never} size={iconSize} color=\"gray.500\" />\n ) : null}\n </Box>\n\n {/* Ring overlay (solid active ring) */}\n {ring && (\n <Box\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n borderRadius={radius}\n borderWidth={ringW}\n borderStyle=\"solid\"\n borderColor={ringColor}\n />\n )}\n\n {/* Badge OR presence dot (badge wins the corner) */}\n {badge != null ? (\n <Box position=\"absolute\" bottom={-2} right={-2} zIndex={2}>\n {badge}\n </Box>\n ) : status !== \"none\" ? (\n <Box\n position=\"absolute\"\n bottom={0}\n right={0}\n zIndex={2}\n width={dot}\n height={dot}\n borderRadius={dot}\n bgColor={statusColor}\n borderWidth={2}\n borderColor=\"surface-card\"\n />\n ) : null}\n </Box>\n );\n}\n\n/**\n * AvatarStack — overlapping row of avatars with a \"+N\" overflow tile.\n * Each avatar gets a surface-coloured cut-out ring so it reads cleanly\n * against the one behind it.\n *\n * <AvatarStack items={members} max={4} activeIndex={0} />\n */\nexport function AvatarStack(props: IAvatarStackProps) {\n const {mergedProps} = useComponentDefaults<IAvatarStackProps>(\"AvatarStack\", props);\n const {items, max = 4, size = \"md\", overlap = 0.35, activeIndex, ringColor = \"brand\", testID, ...rest} = mergedProps;\n\n const px = resolveSize(size);\n const clampedOverlap = Math.min(Math.max(overlap, 0), 0.9);\n const overlapPx = Math.round(px * clampedOverlap);\n const strokeW = px >= 56 ? 3 : 2;\n\n const visible = items.slice(0, max);\n const overflow = items.length - visible.length;\n\n const cell = (key: string, node: React.ReactNode, i: number) => (\n <Box\n key={key}\n marginLeft={i === 0 ? 0 : -overlapPx}\n zIndex={items.length - i}\n borderRadius={9999}\n borderWidth={strokeW}\n borderColor=\"surface-card\"\n bgColor=\"surface-card\"\n >\n {node}\n </Box>\n );\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" {...rest} {...(a11yProps as any)}>\n {visible.map((item, i) =>\n cell(\n `avatar-${i}`,\n <Avatar\n {...item}\n size={size}\n ring={i === activeIndex || item.ring}\n ringColor={item.ringColor ?? ringColor}\n />,\n i,\n ),\n )}\n {overflow > 0 && cell(\"avatar-overflow\", <Avatar initials={`+${overflow}`} size={size} color=\"ink.400\" />, visible.length)}\n </Box>\n );\n}\n\nexport default Avatar;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Avatar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IAvatarProps, IAvatarStackProps, AvatarSize} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size resolution ─────────────────────────────────────────── */\nconst SIZE_PX: Record<string, number> = {xs: 24, sm: 32, md: 40, lg: 56, xl: 72};\n\nfunction resolveSize(size: AvatarSize | undefined): number {\n if (typeof size === \"number\") return size;\n return SIZE_PX[size ?? \"md\"] ?? 40;\n}\n\n/* ─── Status dot → semantic token ─────────────────────────────── */\nconst STATUS_TOKENS: Record<string, string> = {\n online: \"success\",\n offline: \"gray.400\",\n away: \"warning\",\n busy: \"danger\",\n};\n\n/* ─── Deterministic monogram palette (all confirmed theme tokens) ─ */\nconst MONOGRAM_PALETTE = [\"brand\", \"primary.800\", \"success\", \"danger\", \"ink.700\"];\n\nfunction hashIndex(input: string, mod: number): number {\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (h * 31 + input.charCodeAt(i)) >>> 0;\n return mod > 0 ? h % mod : 0;\n}\n\nfunction deriveInitials(name?: string, initials?: string): string {\n if (initials) return initials.slice(0, 3).toUpperCase();\n if (!name) return \"\";\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase();\n return (parts[0]!.charAt(0) + parts[parts.length - 1]!.charAt(0)).toUpperCase();\n}\n\n/**\n * Avatar — image / monogram / icon identity tile.\n *\n * Pure presentational and cross-platform: composed from the `Box` + `Text` +\n * `Image` + `Icon` primitives, so it renders identically on web and native\n * with no platform split. Tappability is the caller's concern (wrap in a\n * Pressable / Button).\n *\n * <Avatar src=\"https://…/me.jpg\" size=\"lg\" />\n * <Avatar name=\"Fouad K\" status=\"online\" />\n * <Avatar initials=\"C\" masked /> // identity-masked (Flex)\n * <Avatar name=\"Acme\" shape=\"rounded\" badge={<Icon name=\"briefcase\" />} />\n */\nexport function Avatar(props: IAvatarProps) {\n const {mergedProps} = useComponentDefaults<IAvatarProps>(\"Avatar\", props);\n const {\n src,\n name,\n initials,\n icon,\n size = \"md\",\n shape = \"circle\",\n color,\n status = \"none\",\n ring = false,\n ringColor = \"brand\",\n masked = false,\n maskFillColor = \"indigo.600\",\n badge,\n alt,\n testID,\n ...rest\n } = mergedProps;\n\n const px = resolveSize(size);\n const radius = shape === \"circle\" ? px / 2 : Math.round(px * 0.28);\n const fontSize = Math.max(10, Math.round(px * 0.4));\n const iconSize = Math.round(px * 0.5);\n const dot = Math.max(8, Math.round(px * 0.28));\n const ringW = px >= 56 ? 3 : 2;\n\n const resolvedInitials = deriveInitials(name, initials);\n const hasImage = !!src;\n const showInitials = !hasImage && resolvedInitials.length > 0;\n const showIcon = !hasImage && !showInitials && icon != null;\n\n const monogramBg =\n color ?? (MONOGRAM_PALETTE[hashIndex(name ?? resolvedInitials, MONOGRAM_PALETTE.length)] ?? \"brand\");\n const surfaceBg = masked ? maskFillColor : hasImage ? \"gray.100\" : monogramBg;\n const initialsColor = \"#FFFFFF\";\n\n const statusColor = STATUS_TOKENS[status] ?? \"gray.400\";\n const ariaLabel = alt ?? name ?? \"avatar\";\n\n const a11yProps = {\n role: \"img\",\n \"aria-label\": ariaLabel,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n position=\"relative\"\n width={px}\n height={px}\n {...rest}\n {...(a11yProps as any)}\n >\n {/* Surface (clips the image / centres the monogram).\n overflow:hidden only when an image is present — clipping the\n monogram <Text> cuts off the glyph tops on native. */}\n <Box\n width=\"100%\"\n height=\"100%\"\n borderRadius={radius}\n overflow={hasImage && !masked ? \"hidden\" : \"visible\"}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={surfaceBg}\n >\n {masked ? (\n <Icon name=\"user\" size={iconSize} color=\"#FFFFFF\" />\n ) : hasImage ? (\n /*\n * width/height via style: the Image primitive types dimensions\n * differently per platform (web string vs native number).\n *\n * ⛔ `alt` IS REQUIRED HERE AND WAS MISSING — every Avatar with\n * a `src` warned, on every render. gluestack's own image creator\n * does `if (typeof alt !== 'string') console.warn('Please pass\n * alt prop to Image component')`, so the check is on the TYPE,\n * not on emptiness: a missing prop warns and an empty string\n * does not. Measured in AlphaMatch on 5 October 2026 — 21\n * warnings in a single sign-in from `AMTabBar`'s Me slot alone,\n * which is one Avatar.\n *\n * ⛔ AND IT IS EMPTY ON PURPOSE, NOT `ariaLabel`. The Box above\n * already carries `role=\"img\"` and `aria-label={ariaLabel}`, so\n * this image is PRESENTATION inside an element that is already\n * named; repeating the label here would announce the person's\n * name twice. Empty is the standing answer for a decorative\n * image, and it is this library's own: `PhoneInput` passes\n * `alt={countryISO ?? \"\"}` for exactly this reason.\n *\n * ⛔ `aria-hidden` IS THE OTHER HALF, AND `alt=\"\"` ALONE WAS NOT\n * ENOUGH — found by Codex, 5 October 2026. gluestack does not\n * only read `alt`; it also forces\n * `role={props.role || 'img'}`, so an empty alt leaves a\n * SECOND, NAMELESS image role sitting under the labelled Box.\n * On the web an `<img alt=\"\">` is decorative and harmless; on\n * React Native that role becomes `accessibilityRole=\"image\"`\n * and a screen reader can land on an unnamed image. Hiding the\n * node is what makes it presentational on both platforms —\n * RN maps `aria-hidden` to `accessibilityElementsHidden` on\n * iOS and `importantForAccessibility=\"no-hide-descendants\"` on\n * Android. `alt=\"\"` stays because it is what silences the\n * warning: gluestack checks `typeof alt !== 'string'`.\n *\n * ⚠️ `Gallery` HAS THE SAME MISSING `alt`, one file away, and is\n * NOT fixed here — it was outside what this change was opened\n * for. Recorded in the session report rather than swept in.\n */\n <Image\n src={src}\n alt=\"\"\n aria-hidden\n style={{width: px, height: px} as any}\n objectFit=\"cover\"\n />\n ) : showInitials ? (\n <Text\n color={initialsColor}\n fontSize={fontSize}\n fontWeight=\"700\"\n lineHeight={Math.round(fontSize * 1.2)}\n textAlign=\"center\"\n >\n {resolvedInitials}\n </Text>\n ) : showIcon ? (\n <Icon name={icon as never} size={iconSize} color=\"gray.500\" />\n ) : null}\n </Box>\n\n {/* Ring overlay (solid active ring) */}\n {ring && (\n <Box\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n borderRadius={radius}\n borderWidth={ringW}\n borderStyle=\"solid\"\n borderColor={ringColor}\n />\n )}\n\n {/* Badge OR presence dot (badge wins the corner) */}\n {badge != null ? (\n <Box position=\"absolute\" bottom={-2} right={-2} zIndex={2}>\n {badge}\n </Box>\n ) : status !== \"none\" ? (\n <Box\n position=\"absolute\"\n bottom={0}\n right={0}\n zIndex={2}\n width={dot}\n height={dot}\n borderRadius={dot}\n bgColor={statusColor}\n borderWidth={2}\n borderColor=\"surface-card\"\n />\n ) : null}\n </Box>\n );\n}\n\n/**\n * AvatarStack — overlapping row of avatars with a \"+N\" overflow tile.\n * Each avatar gets a surface-coloured cut-out ring so it reads cleanly\n * against the one behind it.\n *\n * <AvatarStack items={members} max={4} activeIndex={0} />\n */\nexport function AvatarStack(props: IAvatarStackProps) {\n const {mergedProps} = useComponentDefaults<IAvatarStackProps>(\"AvatarStack\", props);\n const {items, max = 4, size = \"md\", overlap = 0.35, activeIndex, ringColor = \"brand\", testID, ...rest} = mergedProps;\n\n const px = resolveSize(size);\n const clampedOverlap = Math.min(Math.max(overlap, 0), 0.9);\n const overlapPx = Math.round(px * clampedOverlap);\n const strokeW = px >= 56 ? 3 : 2;\n\n const visible = items.slice(0, max);\n const overflow = items.length - visible.length;\n\n const cell = (key: string, node: React.ReactNode, i: number) => (\n <Box\n key={key}\n marginLeft={i === 0 ? 0 : -overlapPx}\n zIndex={items.length - i}\n borderRadius={9999}\n borderWidth={strokeW}\n borderColor=\"surface-card\"\n bgColor=\"surface-card\"\n >\n {node}\n </Box>\n );\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" {...rest} {...(a11yProps as any)}>\n {visible.map((item, i) =>\n cell(\n `avatar-${i}`,\n <Avatar\n {...item}\n size={size}\n ring={i === activeIndex || item.ring}\n ringColor={item.ringColor ?? ringColor}\n />,\n i,\n ),\n )}\n {overflow > 0 && cell(\"avatar-overflow\", <Avatar initials={`+${overflow}`} size={size} color=\"ink.400\" />, visible.length)}\n </Box>\n );\n}\n\nexport default Avatar;\n"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ require('react');
|
|
|
9
9
|
var locale = require('../../hooks/locale.cjs');
|
|
10
10
|
require('../../contexts/DialogContext.cjs');
|
|
11
11
|
require('../../contexts/PermissionsContext.cjs');
|
|
12
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
12
13
|
var reactNative = require('react-native');
|
|
13
14
|
var KitsThemeProvider_native = require('../../contexts/Theme/KitsThemeProvider.cjs');
|
|
14
15
|
var index_native = require('../../primitives/Icon/index.cjs');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.cjs","sources":["../../../../src/components/Banner/banner.native.tsx"],"sourcesContent":["import React from \"react\";\nimport { Flex, Text, Icon } from \"../../_compat\";\nimport {\n AlertTriangle,\n ArrowLeft,\n ArrowRight,\n CheckCircle2,\n Info,\n CircleX,\n X,\n} from \"lucide-react-native\";\nimport { useSeverityColors } from \"../../hooks/useSeverityColors\";\nimport { useKitsTheme } from \"../../contexts/Theme\";\nimport { useLanguage } from \"../../hooks\";\nimport type { BannerAction, IBannerProps, BannerStatus } from \"@lmb-it/kitsconcerto-types\";\nimport type { Severity } from \"@lmb-it/kitsconcerto-types\";\nimport { Pressable } from \"react-native\";\n\nconst icons: Record<string, any> = {\n error: CircleX,\n success: CheckCircle2,\n warning: AlertTriangle,\n info: Info,\n};\n\nfunction statusToSeverity(status: BannerStatus): Severity {\n if (status === \"error\") return \"danger\";\n return status;\n}\n\nconst Banner: React.FC<IBannerProps> = ({\n status: statusProp,\n headerTitle,\n headerIcon = true,\n title,\n description,\n withIcon = true,\n actions = [],\n onDismiss,\n children,\n className,\n textDirection,\n}) => {\n const { theme } = useKitsTheme();\n const { t, isRTL, isKeyExists } = useLanguage();\n const hasActions = actions.length > 0;\n const status = statusProp ?? (hasActions ? \"error\" : \"info\");\n const sev = useSeverityColors(statusToSeverity(status));\n\n /*\n * ⛔ THE HEADING IS THE CONSUMER'S TO WRITE. This read\n * `hasActions ? \"Action required…\" : headerTitle`, so a caller that passed\n * a translated `headerTitle` AND any actions had it thrown away and an\n * ENGLISH LITERAL rendered instead — with no prop, theme value or locale\n * key able to reach it.\n *\n * ⛔ FOUND IN AN ARABIC APP, 19 September 2026: AlphaMatch's Me tab showed\n * \"Action required\" in English on an otherwise fully Arabic screen, while\n * the app's OWN translated string for it sat unused one call away. Grepping\n * the app for the English text finds only its locale file, which is exactly\n * why it reads as an app bug and is not one.\n *\n * ⚠️ THE FALLBACK IS LOCALISED, BUT ONLY WHERE A TRANSLATION EXISTS.\n * `isKeyExists` is checked first so a language without the key keeps\n * today's English rather than rendering the raw key at a user — 38 of this\n * library's 40 locale files have not been given this string, and a visible\n * `actionRequired` would be a worse defect than the one being fixed.\n *\n * ⚠️ THE COUNT SUFFIX BELONGS TO THE FALLBACK, NOT TO THE CONSUMER. A title\n * someone wrote is a complete sentence; appending \"(3)\" to it is the\n * library talking over them.\n */\n const actionRequiredLabel = isKeyExists?.(\"actionRequired\")\n ? t(\"actionRequired\")\n : \"Action required\";\n const computedHeaderTitle = hasActions\n ? headerTitle ??\n `${actionRequiredLabel}${actions.length > 1 ? ` (${actions.length})` : \"\"}`\n : headerTitle;\n\n const hasHeader = !!computedHeaderTitle;\n const hasBody = !!(title || description || children);\n\n /*\n * ⛔ THE DIRECTION DEFAULTS TO THE ACTIVE LANGUAGE, NOT TO ENGLISH. This\n * prop defaulted to `\"ltr\"`, so every caller that did not pass it — which\n * was all of them — got a left-to-right banner in an Arabic app, and none\n * of them could find out. A library shipping to an RTL product reads the\n * direction itself; the prop stays, for the caller that needs to override.\n */\n const resolvedDirection = textDirection ?? (isRTL ? \"rtl\" : \"ltr\");\n const rowDirection = resolvedDirection === \"rtl\" ? \"row-reverse\" : \"row\";\n\n const headerIconNode = (() => {\n if (!headerIcon) return null;\n if (status === \"brand\" && theme.config.logo) return <>{theme.config.logo}</>;\n if (hasActions) return <Icon name={AlertTriangle} color={sev.solidText} size=\"sm\" />;\n const IconComp = icons[status];\n return IconComp ? <Icon name={IconComp} color={sev.solidText} size=\"sm\" /> : null;\n })();\n\n const bodyIconNode = (() => {\n if (!withIcon) return null;\n if (status === \"brand\" && theme.config.logo) return <>{theme.config.logo}</>;\n const IconComp = icons[status];\n return IconComp ? <Icon name={IconComp} color={sev.iconFg} size=\"sm\" /> : null;\n })();\n\n const renderActionRow = (bannerAction: BannerAction, index: number) => (\n <Flex\n key={bannerAction.id}\n flexDirection={rowDirection}\n alignItems=\"flex-start\"\n gap={10}\n style={{\n padding: 12,\n borderTopWidth: index > 0 ? 1 : 0,\n borderTopColor: sev.border,\n }}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n backgroundColor: \"#fff\",\n borderWidth: 1,\n borderColor: sev.border,\n flexShrink: 0,\n }}\n >\n {bannerAction.icon ?? <Icon name={AlertTriangle} color={sev.iconFg} size=\"sm\" />}\n </Flex>\n <Flex flexDirection=\"column\" gap={2} style={{ flex: 1 }}>\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.text }}>\n {bannerAction.label}\n </Text>\n {bannerAction.detail && (\n <Text size=\"xs\" style={{ color: sev.text, lineHeight: 17 }}>\n {bannerAction.detail}\n </Text>\n )}\n </Flex>\n {bannerAction.cta && (\n <Pressable\n onPress={bannerAction.onCta}\n style={{\n backgroundColor: sev.solid,\n borderRadius: 999,\n paddingHorizontal: 12,\n paddingVertical: 7,\n // ⛔ `rowDirection`, NOT a hardcoded \"row\". This was the\n // one row in the component that ignored the direction\n // every other row obeyed, so even a caller that DID\n // pass textDirection=\"rtl\" got this pill backwards.\n flexDirection: rowDirection,\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n }}\n >\n <Text\n fontWeight=\"bold\"\n size=\"xs\"\n style={{ color: sev.solidText }}\n >\n {bannerAction.cta}\n </Text>\n {/* ⛔ THE ARROW MEANS \"ONWARDS\", SO IT FOLLOWS THE READER.\n It was always ArrowRight, which in Arabic points back\n the way the eye came — on the one control the banner\n exists to get pressed. */}\n {resolvedDirection === \"rtl\" ? (\n <ArrowLeft size={12} color={sev.solidText} />\n ) : (\n <ArrowRight size={12} color={sev.solidText} />\n )}\n </Pressable>\n )}\n </Flex>\n );\n\n return (\n <Flex\n flexDirection=\"column\"\n className={className}\n style={{\n borderRadius: 8,\n overflow: \"hidden\",\n writingDirection: resolvedDirection,\n }}\n >\n {/* Header bar */}\n {hasHeader && (\n <Flex\n flexDirection={rowDirection}\n alignItems=\"center\"\n gap={6}\n style={{\n backgroundColor: sev.solid,\n paddingVertical: 8,\n paddingHorizontal: 12,\n }}\n >\n {headerIconNode}\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.solidText, flex: 1 }}>\n {computedHeaderTitle}\n </Text>\n {onDismiss && (\n <Pressable\n accessibilityLabel=\"Dismiss\"\n onPress={onDismiss}\n style={{\n width: 24,\n height: 24,\n borderRadius: 999,\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <X size={14} color={sev.solidText} />\n </Pressable>\n )}\n </Flex>\n )}\n\n {/* Body section */}\n {hasActions ? (\n <Flex\n flexDirection=\"column\"\n style={{\n backgroundColor: sev.bgTint,\n }}\n >\n {actions.map(renderActionRow)}\n </Flex>\n ) : hasBody && (\n <Flex\n flexDirection={rowDirection}\n alignItems=\"center\"\n gap={12}\n style={{\n backgroundColor: sev.bgTint,\n padding: 12,\n justifyContent: \"space-between\",\n }}\n >\n <Flex flexDirection=\"column\" gap={4} style={{ flex: 1 }}>\n {(withIcon || title) && (\n <Flex flexDirection={rowDirection} alignItems=\"center\" gap={6}>\n {bodyIconNode}\n {title && (\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.text }}>\n {title}\n </Text>\n )}\n </Flex>\n )}\n {description && (\n <Text size=\"xs\" style={{ color: sev.text }}>\n {description}\n </Text>\n )}\n {children}\n </Flex>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport default Banner;\n"],"names":["CircleX","CheckCircle2","AlertTriangle","Info","useKitsTheme","useLanguage","useSeverityColors","jsx","Fragment","Icon","index","jsxs","Flex","Text","Pressable","ArrowLeft","ArrowRight","X"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"banner.cjs","sources":["../../../../src/components/Banner/banner.native.tsx"],"sourcesContent":["import React from \"react\";\nimport { Flex, Text, Icon } from \"../../_compat\";\nimport {\n AlertTriangle,\n ArrowLeft,\n ArrowRight,\n CheckCircle2,\n Info,\n CircleX,\n X,\n} from \"lucide-react-native\";\nimport { useSeverityColors } from \"../../hooks/useSeverityColors\";\nimport { useKitsTheme } from \"../../contexts/Theme\";\nimport { useLanguage } from \"../../hooks\";\nimport type { BannerAction, IBannerProps, BannerStatus } from \"@lmb-it/kitsconcerto-types\";\nimport type { Severity } from \"@lmb-it/kitsconcerto-types\";\nimport { Pressable } from \"react-native\";\n\nconst icons: Record<string, any> = {\n error: CircleX,\n success: CheckCircle2,\n warning: AlertTriangle,\n info: Info,\n};\n\nfunction statusToSeverity(status: BannerStatus): Severity {\n if (status === \"error\") return \"danger\";\n return status;\n}\n\nconst Banner: React.FC<IBannerProps> = ({\n status: statusProp,\n headerTitle,\n headerIcon = true,\n title,\n description,\n withIcon = true,\n actions = [],\n onDismiss,\n children,\n className,\n textDirection,\n}) => {\n const { theme } = useKitsTheme();\n const { t, isRTL, isKeyExists } = useLanguage();\n const hasActions = actions.length > 0;\n const status = statusProp ?? (hasActions ? \"error\" : \"info\");\n const sev = useSeverityColors(statusToSeverity(status));\n\n /*\n * ⛔ THE HEADING IS THE CONSUMER'S TO WRITE. This read\n * `hasActions ? \"Action required…\" : headerTitle`, so a caller that passed\n * a translated `headerTitle` AND any actions had it thrown away and an\n * ENGLISH LITERAL rendered instead — with no prop, theme value or locale\n * key able to reach it.\n *\n * ⛔ FOUND IN AN ARABIC APP, 19 September 2026: AlphaMatch's Me tab showed\n * \"Action required\" in English on an otherwise fully Arabic screen, while\n * the app's OWN translated string for it sat unused one call away. Grepping\n * the app for the English text finds only its locale file, which is exactly\n * why it reads as an app bug and is not one.\n *\n * ⚠️ THE FALLBACK IS LOCALISED, BUT ONLY WHERE A TRANSLATION EXISTS.\n * `isKeyExists` is checked first so a language without the key keeps\n * today's English rather than rendering the raw key at a user — 38 of this\n * library's 40 locale files have not been given this string, and a visible\n * `actionRequired` would be a worse defect than the one being fixed.\n *\n * ⚠️ THE COUNT SUFFIX BELONGS TO THE FALLBACK, NOT TO THE CONSUMER. A title\n * someone wrote is a complete sentence; appending \"(3)\" to it is the\n * library talking over them.\n */\n const actionRequiredLabel = isKeyExists?.(\"actionRequired\")\n ? t(\"actionRequired\")\n : \"Action required\";\n const computedHeaderTitle = hasActions\n ? headerTitle ??\n `${actionRequiredLabel}${actions.length > 1 ? ` (${actions.length})` : \"\"}`\n : headerTitle;\n\n const hasHeader = !!computedHeaderTitle;\n const hasBody = !!(title || description || children);\n\n /*\n * ⛔ THE DIRECTION DEFAULTS TO THE ACTIVE LANGUAGE, NOT TO ENGLISH. This\n * prop defaulted to `\"ltr\"`, so every caller that did not pass it — which\n * was all of them — got a left-to-right banner in an Arabic app, and none\n * of them could find out. A library shipping to an RTL product reads the\n * direction itself; the prop stays, for the caller that needs to override.\n */\n const resolvedDirection = textDirection ?? (isRTL ? \"rtl\" : \"ltr\");\n const rowDirection = resolvedDirection === \"rtl\" ? \"row-reverse\" : \"row\";\n\n const headerIconNode = (() => {\n if (!headerIcon) return null;\n if (status === \"brand\" && theme.config.logo) return <>{theme.config.logo}</>;\n if (hasActions) return <Icon name={AlertTriangle} color={sev.solidText} size=\"sm\" />;\n const IconComp = icons[status];\n return IconComp ? <Icon name={IconComp} color={sev.solidText} size=\"sm\" /> : null;\n })();\n\n const bodyIconNode = (() => {\n if (!withIcon) return null;\n if (status === \"brand\" && theme.config.logo) return <>{theme.config.logo}</>;\n const IconComp = icons[status];\n return IconComp ? <Icon name={IconComp} color={sev.iconFg} size=\"sm\" /> : null;\n })();\n\n const renderActionRow = (bannerAction: BannerAction, index: number) => (\n <Flex\n key={bannerAction.id}\n flexDirection={rowDirection}\n alignItems=\"flex-start\"\n gap={10}\n style={{\n padding: 12,\n borderTopWidth: index > 0 ? 1 : 0,\n borderTopColor: sev.border,\n }}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n backgroundColor: \"#fff\",\n borderWidth: 1,\n borderColor: sev.border,\n flexShrink: 0,\n }}\n >\n {bannerAction.icon ?? <Icon name={AlertTriangle} color={sev.iconFg} size=\"sm\" />}\n </Flex>\n <Flex flexDirection=\"column\" gap={2} style={{ flex: 1 }}>\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.text }}>\n {bannerAction.label}\n </Text>\n {bannerAction.detail && (\n <Text size=\"xs\" style={{ color: sev.text, lineHeight: 17 }}>\n {bannerAction.detail}\n </Text>\n )}\n </Flex>\n {bannerAction.cta && (\n <Pressable\n onPress={bannerAction.onCta}\n style={{\n backgroundColor: sev.solid,\n borderRadius: 999,\n paddingHorizontal: 12,\n paddingVertical: 7,\n // ⛔ `rowDirection`, NOT a hardcoded \"row\". This was the\n // one row in the component that ignored the direction\n // every other row obeyed, so even a caller that DID\n // pass textDirection=\"rtl\" got this pill backwards.\n flexDirection: rowDirection,\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n }}\n >\n <Text\n fontWeight=\"bold\"\n size=\"xs\"\n style={{ color: sev.solidText }}\n >\n {bannerAction.cta}\n </Text>\n {/* ⛔ THE ARROW MEANS \"ONWARDS\", SO IT FOLLOWS THE READER.\n It was always ArrowRight, which in Arabic points back\n the way the eye came — on the one control the banner\n exists to get pressed. */}\n {resolvedDirection === \"rtl\" ? (\n <ArrowLeft size={12} color={sev.solidText} />\n ) : (\n <ArrowRight size={12} color={sev.solidText} />\n )}\n </Pressable>\n )}\n </Flex>\n );\n\n return (\n <Flex\n flexDirection=\"column\"\n className={className}\n style={{\n borderRadius: 8,\n overflow: \"hidden\",\n writingDirection: resolvedDirection,\n }}\n >\n {/* Header bar */}\n {hasHeader && (\n <Flex\n flexDirection={rowDirection}\n alignItems=\"center\"\n gap={6}\n style={{\n backgroundColor: sev.solid,\n paddingVertical: 8,\n paddingHorizontal: 12,\n }}\n >\n {headerIconNode}\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.solidText, flex: 1 }}>\n {computedHeaderTitle}\n </Text>\n {onDismiss && (\n <Pressable\n accessibilityLabel=\"Dismiss\"\n onPress={onDismiss}\n style={{\n width: 24,\n height: 24,\n borderRadius: 999,\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <X size={14} color={sev.solidText} />\n </Pressable>\n )}\n </Flex>\n )}\n\n {/* Body section */}\n {hasActions ? (\n <Flex\n flexDirection=\"column\"\n style={{\n backgroundColor: sev.bgTint,\n }}\n >\n {actions.map(renderActionRow)}\n </Flex>\n ) : hasBody && (\n <Flex\n flexDirection={rowDirection}\n alignItems=\"center\"\n gap={12}\n style={{\n backgroundColor: sev.bgTint,\n padding: 12,\n justifyContent: \"space-between\",\n }}\n >\n <Flex flexDirection=\"column\" gap={4} style={{ flex: 1 }}>\n {(withIcon || title) && (\n <Flex flexDirection={rowDirection} alignItems=\"center\" gap={6}>\n {bodyIconNode}\n {title && (\n <Text fontWeight=\"bold\" size=\"sm\" style={{ color: sev.text }}>\n {title}\n </Text>\n )}\n </Flex>\n )}\n {description && (\n <Text size=\"xs\" style={{ color: sev.text }}>\n {description}\n </Text>\n )}\n {children}\n </Flex>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport default Banner;\n"],"names":["CircleX","CheckCircle2","AlertTriangle","Info","useKitsTheme","useLanguage","useSeverityColors","jsx","Fragment","Icon","index","jsxs","Flex","Text","Pressable","ArrowLeft","ArrowRight","X"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import 'react';
|
|
|
5
5
|
import { useLanguage } from '../../hooks/locale.js';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
7
|
import '../../contexts/PermissionsContext.js';
|
|
8
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
8
9
|
import { Pressable } from 'react-native';
|
|
9
10
|
import { useKitsTheme } from '../../contexts/Theme/KitsThemeProvider.js';
|
|
10
11
|
import { Icon } from '../../primitives/Icon/index.js';
|