@lmb-it/kitsconcerto-native 0.1.276 → 0.1.284
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Avatar/index.cjs +1 -0
- package/components/Avatar/index.cjs.map +1 -1
- package/components/Avatar/index.js +1 -0
- package/components/Avatar/index.js.map +1 -1
- package/components/Banner/banner.cjs +1 -0
- package/components/Banner/banner.cjs.map +1 -1
- package/components/Banner/banner.js +1 -0
- package/components/Banner/banner.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/BreadCrumb/index.cjs.map +1 -1
- package/components/BreadCrumb/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/Carousel/index.cjs +1 -0
- package/components/Carousel/index.cjs.map +1 -1
- package/components/Carousel/index.js +1 -0
- package/components/Carousel/index.js.map +1 -1
- package/components/ChatBubble/index.cjs +1 -0
- package/components/ChatBubble/index.cjs.map +1 -1
- package/components/ChatBubble/index.js +1 -0
- package/components/ChatBubble/index.js.map +1 -1
- package/components/Chip/index.cjs +1 -0
- package/components/Chip/index.cjs.map +1 -1
- package/components/Chip/index.js +1 -0
- package/components/Chip/index.js.map +1 -1
- package/components/DateSeparator/index.cjs +1 -0
- package/components/DateSeparator/index.cjs.map +1 -1
- package/components/DateSeparator/index.js +1 -0
- package/components/DateSeparator/index.js.map +1 -1
- package/components/DetailsList/index.cjs +1 -0
- package/components/DetailsList/index.cjs.map +1 -1
- package/components/DetailsList/index.js +1 -0
- package/components/DetailsList/index.js.map +1 -1
- package/components/EmptyState/index.cjs +1 -0
- package/components/EmptyState/index.cjs.map +1 -1
- package/components/EmptyState/index.js +1 -0
- package/components/EmptyState/index.js.map +1 -1
- package/components/Gallery/index.cjs +1 -0
- package/components/Gallery/index.cjs.map +1 -1
- package/components/Gallery/index.js +1 -0
- package/components/Gallery/index.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/MessageReceipt/index.cjs +1 -0
- package/components/MessageReceipt/index.cjs.map +1 -1
- package/components/MessageReceipt/index.js +1 -0
- package/components/MessageReceipt/index.js.map +1 -1
- package/components/ProgressBar/index.cjs +1 -0
- package/components/ProgressBar/index.cjs.map +1 -1
- package/components/ProgressBar/index.js +1 -0
- package/components/ProgressBar/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/StatCard/index.cjs +1 -0
- package/components/StatCard/index.cjs.map +1 -1
- package/components/StatCard/index.js +1 -0
- package/components/StatCard/index.js.map +1 -1
- package/components/Stepper/index.cjs +1 -0
- package/components/Stepper/index.cjs.map +1 -1
- package/components/Stepper/index.js +1 -0
- package/components/Stepper/index.js.map +1 -1
- package/components/Tabs/index.cjs +1 -0
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +1 -0
- package/components/Tabs/index.js.map +1 -1
- package/components/Timeline/index.cjs +1 -0
- package/components/Timeline/index.cjs.map +1 -1
- package/components/Timeline/index.js +1 -0
- package/components/Timeline/index.js.map +1 -1
- package/components/Translate/index.cjs +1 -0
- package/components/Translate/index.cjs.map +1 -1
- package/components/Translate/index.js +1 -0
- package/components/Translate/index.js.map +1 -1
- package/components/TypingIndicator/index.cjs +1 -0
- package/components/TypingIndicator/index.cjs.map +1 -1
- package/components/TypingIndicator/index.js +1 -0
- package/components/TypingIndicator/index.js.map +1 -1
- package/components/overlay/ConfirmDialog/index.cjs +1 -0
- package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
- package/components/overlay/ConfirmDialog/index.js +1 -0
- package/components/overlay/ConfirmDialog/index.js.map +1 -1
- package/components/overlay/Dialog/index.cjs +1 -0
- package/components/overlay/Dialog/index.cjs.map +1 -1
- package/components/overlay/Dialog/index.js +1 -0
- package/components/overlay/Dialog/index.js.map +1 -1
- package/contexts/BreadcrumbContext.cjs +33 -0
- package/contexts/BreadcrumbContext.cjs.map +1 -0
- package/contexts/BreadcrumbContext.js +28 -0
- package/contexts/BreadcrumbContext.js.map +1 -0
- package/form/controls/Checkbox/index.cjs +1 -0
- package/form/controls/Checkbox/index.cjs.map +1 -1
- package/form/controls/Checkbox/index.js +1 -0
- package/form/controls/Checkbox/index.js.map +1 -1
- package/form/controls/RadioButton/radio.cjs +1 -0
- package/form/controls/RadioButton/radio.cjs.map +1 -1
- package/form/controls/RadioButton/radio.js +1 -0
- package/form/controls/RadioButton/radio.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/index.cjs +1 -0
- package/form/file-pickers/index.cjs.map +1 -1
- package/form/file-pickers/index.js +1 -0
- package/form/file-pickers/index.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/inputs/ColorPicker/index.cjs +1 -0
- package/form/inputs/ColorPicker/index.cjs.map +1 -1
- package/form/inputs/ColorPicker/index.js +1 -0
- package/form/inputs/ColorPicker/index.js.map +1 -1
- package/form/inputs/Datepicker/index.cjs +1 -0
- package/form/inputs/Datepicker/index.cjs.map +1 -1
- package/form/inputs/Datepicker/index.js +1 -0
- package/form/inputs/Datepicker/index.js.map +1 -1
- package/form/inputs/InputLocation/index.cjs +1 -0
- package/form/inputs/InputLocation/index.cjs.map +1 -1
- package/form/inputs/InputLocation/index.js +1 -0
- package/form/inputs/InputLocation/index.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/CascadeSelect/index.cjs +1 -0
- package/form/selects/CascadeSelect/index.cjs.map +1 -1
- package/form/selects/CascadeSelect/index.js +1 -0
- package/form/selects/CascadeSelect/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
- package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.js +1 -0
- package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
- package/form-renderer/components/fields/Group/index.cjs +1 -0
- package/form-renderer/components/fields/Group/index.cjs.map +1 -1
- package/form-renderer/components/fields/Group/index.js +1 -0
- package/form-renderer/components/fields/Group/index.js.map +1 -1
- package/form-renderer/components/fields/Radios/index.cjs +1 -0
- package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
- package/form-renderer/components/fields/Radios/index.js +1 -0
- package/form-renderer/components/fields/Radios/index.js.map +1 -1
- package/form-renderer/components/fields/Select/index.cjs +1 -0
- package/form-renderer/components/fields/Select/index.cjs.map +1 -1
- package/form-renderer/components/fields/Select/index.js +1 -0
- package/form-renderer/components/fields/Select/index.js.map +1 -1
- package/hooks/main.cjs +1 -0
- package/hooks/main.cjs.map +1 -1
- package/hooks/main.js +1 -0
- package/hooks/main.js.map +1 -1
- package/hooks/useBreadcrumbTrail.cjs +21 -0
- package/hooks/useBreadcrumbTrail.cjs.map +1 -0
- package/hooks/useBreadcrumbTrail.js +16 -0
- package/hooks/useBreadcrumbTrail.js.map +1 -0
- package/index.cjs +5 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +144 -5
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DetailsList/index.tsx"],"sourcesContent":["import React, {type ReactNode, useState} from 'react';\nimport {\n Box,\n Flex,\n HStack,\n Heading,\n Text,\n Button,\n KitsInputText,\n KitsInputNumber,\n KitsInputTextarea,\n FormSelect,\n useLanguage,\n} from '../../_compat';\nimport type {IDetailListProps, IDetailItem} from '@lmb-it/kitsconcerto-types';\n\nconst DetailList = <T extends Record<string, any>>({\n title,\n description,\n data,\n items,\n headerActions,\n itemActions,\n}: IDetailListProps<T>) => {\n const {t} = useLanguage();\n const [editingField, setEditingField] = useState<keyof T | null>(null);\n const [draftValue, setDraftValue] = useState<any>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEdit = (item: IDetailItem<T>) => {\n setEditingField(item.name);\n setDraftValue(data[item.name]);\n };\n\n const handleCancel = () => {\n setEditingField(null);\n setDraftValue(null);\n };\n\n const handleSave = async (item: IDetailItem<T>) => {\n if (item.onSave) {\n setIsSaving(true);\n try {\n await item.onSave(item.name, draftValue);\n setEditingField(null);\n } finally {\n setIsSaving(false);\n }\n } else {\n setEditingField(null);\n }\n };\n\n const renderControl = (item: IDetailItem<T>) => {\n const commonProps = {\n value: draftValue,\n onChange: (e: any) => setDraftValue(e.target ? e.target.value : e.value),\n w: '100%',\n ...item.inputProps,\n };\n\n switch (item.type) {\n case 'number':\n return (\n <KitsInputNumber\n value={draftValue}\n onChange={(e) => setDraftValue(e.value)}\n style={{width: '100%'}}\n {...item.inputProps}\n />\n );\n case 'textarea':\n return <KitsInputTextarea {...commonProps} rows={3} autoResize/>;\n case 'select':\n return (\n <FormSelect\n shape=\"dropdown\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'multiselect':\n return (\n <FormSelect\n shape=\"multiselect\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'text':\n default:\n return <KitsInputText {...commonProps} />;\n }\n };\n\n // @ts-ignore\n // @ts-ignore\n return (\n <Box bgColor=\"var(--surface-0)\" p=\"1.5rem\" borderRadius=\"0.75rem\">\n {/* Header Area */}\n {(title || description || headerActions) && (\n <HStack justifyContent=\"space-between\" alignItems=\"flex-start\" mb=\"1.5rem\">\n <Box>\n {title && (\n typeof title === 'string'\n ? (\n <Heading as=\"h2\" fontSize=\"1.5rem\" fontWeight=\"600\"\n fontColor=\"var(--text-900)\"\n mb={description ? '0.5rem' : '0'}>\n {title}\n </Heading>\n )\n : title\n )}\n {description && (\n typeof description === 'string'\n ? (\n <Text as=\"p\" fontColor=\"var(--text-500)\" fontSize=\"0.875rem\">\n {description}\n </Text>\n )\n : description\n )}\n </Box>\n {headerActions && <Box>{headerActions}</Box>}\n </HStack>\n )}\n\n {/* List Area */}\n <Box as=\"ul\" p=\"0\" m=\"0\" style={{listStyle: 'none'}}>\n {items.map((item, index) => {\n const isEditing = editingField === item.name;\n const isLast = index === items.length - 1;\n\n return (\n <Flex\n key={item.name as string}\n as=\"li\"\n alignItems=\"center\"\n py=\"1rem\"\n // justifyContent={'center'}\n px=\"0.5rem\"\n style={{\n borderTop: '1px solid var(--surface-200)',\n borderBottom: isLast ? '1px solid var(--surface-200)' : 'none',\n }}\n flexWrap=\"wrap\"\n >\n <Flex w={['50%', null, '85%']} flexDirection={['column', 'row']}>\n {/* Label Column */}\n <Text\n m={0}\n w={['50%', null, '16.666%']}\n fontColor=\"var(--surface-500)\"\n fontWeight=\"500\"\n fontSize=\"0.875rem\"\n >\n {item.label}\n </Text>\n\n {/* Value / Edit Control Column */}\n <Box\n w={['100%', null, '66.666%']}\n fontColor=\"var(--text-900)\"\n lineHeight={item.type === 'textarea' ? 1.5 : undefined}\n >\n {isEditing\n ? renderControl(item)\n : item.body\n ? item.body(data[item.name], data)\n : (data[item.name] as ReactNode)}\n </Box>\n </Flex>\n\n {/* Actions Column */}\n <Flex\n w={['50%', null, '15%']}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"0.5rem\"\n >\n {itemActions && !isEditing && itemActions(item, data)}\n\n {item.editable && !isEditing && (\n <Button\n label={t(\"edit\")}\n icon=\"pencil\"\n severity=\"contrast\"\n outlined\n onClick={() => handleEdit(item)}\n />\n )}\n\n {isEditing && (\n <HStack gap=\"0.25rem\">\n <Button\n icon=\"pi pi-check\"\n severity=\"success\"\n loading={isSaving}\n onClick={() => handleSave(item)}\n aria-label={t(\"save\")}\n />\n <Button\n icon=\"pi pi-times\"\n severity=\"secondary\"\n disabled={isSaving}\n onClick={handleCancel}\n aria-label={t(\"cancel\")}\n />\n </HStack>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default DetailList\n"],"names":["useLanguage","useState","jsx","KitsInputNumber","KitsInputTextarea","FormSelect","KitsInputText","Box","jsxs","HStack","Heading","Text","index","Flex","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DetailsList/index.tsx"],"sourcesContent":["import React, {type ReactNode, useState} from 'react';\nimport {\n Box,\n Flex,\n HStack,\n Heading,\n Text,\n Button,\n KitsInputText,\n KitsInputNumber,\n KitsInputTextarea,\n FormSelect,\n useLanguage,\n} from '../../_compat';\nimport type {IDetailListProps, IDetailItem} from '@lmb-it/kitsconcerto-types';\n\nconst DetailList = <T extends Record<string, any>>({\n title,\n description,\n data,\n items,\n headerActions,\n itemActions,\n}: IDetailListProps<T>) => {\n const {t} = useLanguage();\n const [editingField, setEditingField] = useState<keyof T | null>(null);\n const [draftValue, setDraftValue] = useState<any>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEdit = (item: IDetailItem<T>) => {\n setEditingField(item.name);\n setDraftValue(data[item.name]);\n };\n\n const handleCancel = () => {\n setEditingField(null);\n setDraftValue(null);\n };\n\n const handleSave = async (item: IDetailItem<T>) => {\n if (item.onSave) {\n setIsSaving(true);\n try {\n await item.onSave(item.name, draftValue);\n setEditingField(null);\n } finally {\n setIsSaving(false);\n }\n } else {\n setEditingField(null);\n }\n };\n\n const renderControl = (item: IDetailItem<T>) => {\n const commonProps = {\n value: draftValue,\n onChange: (e: any) => setDraftValue(e.target ? e.target.value : e.value),\n w: '100%',\n ...item.inputProps,\n };\n\n switch (item.type) {\n case 'number':\n return (\n <KitsInputNumber\n value={draftValue}\n onChange={(e) => setDraftValue(e.value)}\n style={{width: '100%'}}\n {...item.inputProps}\n />\n );\n case 'textarea':\n return <KitsInputTextarea {...commonProps} rows={3} autoResize/>;\n case 'select':\n return (\n <FormSelect\n shape=\"dropdown\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'multiselect':\n return (\n <FormSelect\n shape=\"multiselect\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'text':\n default:\n return <KitsInputText {...commonProps} />;\n }\n };\n\n // @ts-ignore\n // @ts-ignore\n return (\n <Box bgColor=\"var(--surface-0)\" p=\"1.5rem\" borderRadius=\"0.75rem\">\n {/* Header Area */}\n {(title || description || headerActions) && (\n <HStack justifyContent=\"space-between\" alignItems=\"flex-start\" mb=\"1.5rem\">\n <Box>\n {title && (\n typeof title === 'string'\n ? (\n <Heading as=\"h2\" fontSize=\"1.5rem\" fontWeight=\"600\"\n fontColor=\"var(--text-900)\"\n mb={description ? '0.5rem' : '0'}>\n {title}\n </Heading>\n )\n : title\n )}\n {description && (\n typeof description === 'string'\n ? (\n <Text as=\"p\" fontColor=\"var(--text-500)\" fontSize=\"0.875rem\">\n {description}\n </Text>\n )\n : description\n )}\n </Box>\n {headerActions && <Box>{headerActions}</Box>}\n </HStack>\n )}\n\n {/* List Area */}\n <Box as=\"ul\" p=\"0\" m=\"0\" style={{listStyle: 'none'}}>\n {items.map((item, index) => {\n const isEditing = editingField === item.name;\n const isLast = index === items.length - 1;\n\n return (\n <Flex\n key={item.name as string}\n as=\"li\"\n alignItems=\"center\"\n py=\"1rem\"\n // justifyContent={'center'}\n px=\"0.5rem\"\n style={{\n borderTop: '1px solid var(--surface-200)',\n borderBottom: isLast ? '1px solid var(--surface-200)' : 'none',\n }}\n flexWrap=\"wrap\"\n >\n <Flex w={['50%', null, '85%']} flexDirection={['column', 'row']}>\n {/* Label Column */}\n <Text\n m={0}\n w={['50%', null, '16.666%']}\n fontColor=\"var(--surface-500)\"\n fontWeight=\"500\"\n fontSize=\"0.875rem\"\n >\n {item.label}\n </Text>\n\n {/* Value / Edit Control Column */}\n <Box\n w={['100%', null, '66.666%']}\n fontColor=\"var(--text-900)\"\n lineHeight={item.type === 'textarea' ? 1.5 : undefined}\n >\n {isEditing\n ? renderControl(item)\n : item.body\n ? item.body(data[item.name], data)\n : (data[item.name] as ReactNode)}\n </Box>\n </Flex>\n\n {/* Actions Column */}\n <Flex\n w={['50%', null, '15%']}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"0.5rem\"\n >\n {itemActions && !isEditing && itemActions(item, data)}\n\n {item.editable && !isEditing && (\n <Button\n label={t(\"edit\")}\n icon=\"pencil\"\n severity=\"contrast\"\n outlined\n onClick={() => handleEdit(item)}\n />\n )}\n\n {isEditing && (\n <HStack gap=\"0.25rem\">\n <Button\n icon=\"pi pi-check\"\n severity=\"success\"\n loading={isSaving}\n onClick={() => handleSave(item)}\n aria-label={t(\"save\")}\n />\n <Button\n icon=\"pi pi-times\"\n severity=\"secondary\"\n disabled={isSaving}\n onClick={handleCancel}\n aria-label={t(\"cancel\")}\n />\n </HStack>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default DetailList\n"],"names":["useLanguage","useState","jsx","KitsInputNumber","KitsInputTextarea","FormSelect","KitsInputText","Box","jsxs","HStack","Heading","Text","index","Flex","Button"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import 'axios';
|
|
|
14
14
|
import FormSelect from '../../form/selects/SelectContext.js';
|
|
15
15
|
import '../../contexts/DialogContext.js';
|
|
16
16
|
import '../../contexts/PermissionsContext.js';
|
|
17
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
17
18
|
|
|
18
19
|
const DetailList = ({
|
|
19
20
|
title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/DetailsList/index.tsx"],"sourcesContent":["import React, {type ReactNode, useState} from 'react';\nimport {\n Box,\n Flex,\n HStack,\n Heading,\n Text,\n Button,\n KitsInputText,\n KitsInputNumber,\n KitsInputTextarea,\n FormSelect,\n useLanguage,\n} from '../../_compat';\nimport type {IDetailListProps, IDetailItem} from '@lmb-it/kitsconcerto-types';\n\nconst DetailList = <T extends Record<string, any>>({\n title,\n description,\n data,\n items,\n headerActions,\n itemActions,\n}: IDetailListProps<T>) => {\n const {t} = useLanguage();\n const [editingField, setEditingField] = useState<keyof T | null>(null);\n const [draftValue, setDraftValue] = useState<any>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEdit = (item: IDetailItem<T>) => {\n setEditingField(item.name);\n setDraftValue(data[item.name]);\n };\n\n const handleCancel = () => {\n setEditingField(null);\n setDraftValue(null);\n };\n\n const handleSave = async (item: IDetailItem<T>) => {\n if (item.onSave) {\n setIsSaving(true);\n try {\n await item.onSave(item.name, draftValue);\n setEditingField(null);\n } finally {\n setIsSaving(false);\n }\n } else {\n setEditingField(null);\n }\n };\n\n const renderControl = (item: IDetailItem<T>) => {\n const commonProps = {\n value: draftValue,\n onChange: (e: any) => setDraftValue(e.target ? e.target.value : e.value),\n w: '100%',\n ...item.inputProps,\n };\n\n switch (item.type) {\n case 'number':\n return (\n <KitsInputNumber\n value={draftValue}\n onChange={(e) => setDraftValue(e.value)}\n style={{width: '100%'}}\n {...item.inputProps}\n />\n );\n case 'textarea':\n return <KitsInputTextarea {...commonProps} rows={3} autoResize/>;\n case 'select':\n return (\n <FormSelect\n shape=\"dropdown\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'multiselect':\n return (\n <FormSelect\n shape=\"multiselect\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'text':\n default:\n return <KitsInputText {...commonProps} />;\n }\n };\n\n // @ts-ignore\n // @ts-ignore\n return (\n <Box bgColor=\"var(--surface-0)\" p=\"1.5rem\" borderRadius=\"0.75rem\">\n {/* Header Area */}\n {(title || description || headerActions) && (\n <HStack justifyContent=\"space-between\" alignItems=\"flex-start\" mb=\"1.5rem\">\n <Box>\n {title && (\n typeof title === 'string'\n ? (\n <Heading as=\"h2\" fontSize=\"1.5rem\" fontWeight=\"600\"\n fontColor=\"var(--text-900)\"\n mb={description ? '0.5rem' : '0'}>\n {title}\n </Heading>\n )\n : title\n )}\n {description && (\n typeof description === 'string'\n ? (\n <Text as=\"p\" fontColor=\"var(--text-500)\" fontSize=\"0.875rem\">\n {description}\n </Text>\n )\n : description\n )}\n </Box>\n {headerActions && <Box>{headerActions}</Box>}\n </HStack>\n )}\n\n {/* List Area */}\n <Box as=\"ul\" p=\"0\" m=\"0\" style={{listStyle: 'none'}}>\n {items.map((item, index) => {\n const isEditing = editingField === item.name;\n const isLast = index === items.length - 1;\n\n return (\n <Flex\n key={item.name as string}\n as=\"li\"\n alignItems=\"center\"\n py=\"1rem\"\n // justifyContent={'center'}\n px=\"0.5rem\"\n style={{\n borderTop: '1px solid var(--surface-200)',\n borderBottom: isLast ? '1px solid var(--surface-200)' : 'none',\n }}\n flexWrap=\"wrap\"\n >\n <Flex w={['50%', null, '85%']} flexDirection={['column', 'row']}>\n {/* Label Column */}\n <Text\n m={0}\n w={['50%', null, '16.666%']}\n fontColor=\"var(--surface-500)\"\n fontWeight=\"500\"\n fontSize=\"0.875rem\"\n >\n {item.label}\n </Text>\n\n {/* Value / Edit Control Column */}\n <Box\n w={['100%', null, '66.666%']}\n fontColor=\"var(--text-900)\"\n lineHeight={item.type === 'textarea' ? 1.5 : undefined}\n >\n {isEditing\n ? renderControl(item)\n : item.body\n ? item.body(data[item.name], data)\n : (data[item.name] as ReactNode)}\n </Box>\n </Flex>\n\n {/* Actions Column */}\n <Flex\n w={['50%', null, '15%']}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"0.5rem\"\n >\n {itemActions && !isEditing && itemActions(item, data)}\n\n {item.editable && !isEditing && (\n <Button\n label={t(\"edit\")}\n icon=\"pencil\"\n severity=\"contrast\"\n outlined\n onClick={() => handleEdit(item)}\n />\n )}\n\n {isEditing && (\n <HStack gap=\"0.25rem\">\n <Button\n icon=\"pi pi-check\"\n severity=\"success\"\n loading={isSaving}\n onClick={() => handleSave(item)}\n aria-label={t(\"save\")}\n />\n <Button\n icon=\"pi pi-times\"\n severity=\"secondary\"\n disabled={isSaving}\n onClick={handleCancel}\n aria-label={t(\"cancel\")}\n />\n </HStack>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default DetailList\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/DetailsList/index.tsx"],"sourcesContent":["import React, {type ReactNode, useState} from 'react';\nimport {\n Box,\n Flex,\n HStack,\n Heading,\n Text,\n Button,\n KitsInputText,\n KitsInputNumber,\n KitsInputTextarea,\n FormSelect,\n useLanguage,\n} from '../../_compat';\nimport type {IDetailListProps, IDetailItem} from '@lmb-it/kitsconcerto-types';\n\nconst DetailList = <T extends Record<string, any>>({\n title,\n description,\n data,\n items,\n headerActions,\n itemActions,\n}: IDetailListProps<T>) => {\n const {t} = useLanguage();\n const [editingField, setEditingField] = useState<keyof T | null>(null);\n const [draftValue, setDraftValue] = useState<any>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const handleEdit = (item: IDetailItem<T>) => {\n setEditingField(item.name);\n setDraftValue(data[item.name]);\n };\n\n const handleCancel = () => {\n setEditingField(null);\n setDraftValue(null);\n };\n\n const handleSave = async (item: IDetailItem<T>) => {\n if (item.onSave) {\n setIsSaving(true);\n try {\n await item.onSave(item.name, draftValue);\n setEditingField(null);\n } finally {\n setIsSaving(false);\n }\n } else {\n setEditingField(null);\n }\n };\n\n const renderControl = (item: IDetailItem<T>) => {\n const commonProps = {\n value: draftValue,\n onChange: (e: any) => setDraftValue(e.target ? e.target.value : e.value),\n w: '100%',\n ...item.inputProps,\n };\n\n switch (item.type) {\n case 'number':\n return (\n <KitsInputNumber\n value={draftValue}\n onChange={(e) => setDraftValue(e.value)}\n style={{width: '100%'}}\n {...item.inputProps}\n />\n );\n case 'textarea':\n return <KitsInputTextarea {...commonProps} rows={3} autoResize/>;\n case 'select':\n return (\n <FormSelect\n shape=\"dropdown\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'multiselect':\n return (\n <FormSelect\n shape=\"multiselect\"\n {...commonProps}\n list={item.list || []}\n labelKey={item.labelKey}\n valueKey={item.valueKey}\n />\n );\n case 'text':\n default:\n return <KitsInputText {...commonProps} />;\n }\n };\n\n // @ts-ignore\n // @ts-ignore\n return (\n <Box bgColor=\"var(--surface-0)\" p=\"1.5rem\" borderRadius=\"0.75rem\">\n {/* Header Area */}\n {(title || description || headerActions) && (\n <HStack justifyContent=\"space-between\" alignItems=\"flex-start\" mb=\"1.5rem\">\n <Box>\n {title && (\n typeof title === 'string'\n ? (\n <Heading as=\"h2\" fontSize=\"1.5rem\" fontWeight=\"600\"\n fontColor=\"var(--text-900)\"\n mb={description ? '0.5rem' : '0'}>\n {title}\n </Heading>\n )\n : title\n )}\n {description && (\n typeof description === 'string'\n ? (\n <Text as=\"p\" fontColor=\"var(--text-500)\" fontSize=\"0.875rem\">\n {description}\n </Text>\n )\n : description\n )}\n </Box>\n {headerActions && <Box>{headerActions}</Box>}\n </HStack>\n )}\n\n {/* List Area */}\n <Box as=\"ul\" p=\"0\" m=\"0\" style={{listStyle: 'none'}}>\n {items.map((item, index) => {\n const isEditing = editingField === item.name;\n const isLast = index === items.length - 1;\n\n return (\n <Flex\n key={item.name as string}\n as=\"li\"\n alignItems=\"center\"\n py=\"1rem\"\n // justifyContent={'center'}\n px=\"0.5rem\"\n style={{\n borderTop: '1px solid var(--surface-200)',\n borderBottom: isLast ? '1px solid var(--surface-200)' : 'none',\n }}\n flexWrap=\"wrap\"\n >\n <Flex w={['50%', null, '85%']} flexDirection={['column', 'row']}>\n {/* Label Column */}\n <Text\n m={0}\n w={['50%', null, '16.666%']}\n fontColor=\"var(--surface-500)\"\n fontWeight=\"500\"\n fontSize=\"0.875rem\"\n >\n {item.label}\n </Text>\n\n {/* Value / Edit Control Column */}\n <Box\n w={['100%', null, '66.666%']}\n fontColor=\"var(--text-900)\"\n lineHeight={item.type === 'textarea' ? 1.5 : undefined}\n >\n {isEditing\n ? renderControl(item)\n : item.body\n ? item.body(data[item.name], data)\n : (data[item.name] as ReactNode)}\n </Box>\n </Flex>\n\n {/* Actions Column */}\n <Flex\n w={['50%', null, '15%']}\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"0.5rem\"\n >\n {itemActions && !isEditing && itemActions(item, data)}\n\n {item.editable && !isEditing && (\n <Button\n label={t(\"edit\")}\n icon=\"pencil\"\n severity=\"contrast\"\n outlined\n onClick={() => handleEdit(item)}\n />\n )}\n\n {isEditing && (\n <HStack gap=\"0.25rem\">\n <Button\n icon=\"pi pi-check\"\n severity=\"success\"\n loading={isSaving}\n onClick={() => handleSave(item)}\n aria-label={t(\"save\")}\n />\n <Button\n icon=\"pi pi-times\"\n severity=\"secondary\"\n disabled={isSaving}\n onClick={handleCancel}\n aria-label={t(\"cancel\")}\n />\n </HStack>\n )}\n </Flex>\n </Flex>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default DetailList\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var index_native = require('../../primitives/Icon/index.cjs');
|
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
9
|
require('../../contexts/PermissionsContext.cjs');
|
|
10
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
10
11
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
11
12
|
|
|
12
13
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IEmptyStateProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {bubble: 48, icon: 22, title: 15, desc: 12, gap: 8, pad: 20},\n md: {bubble: 64, icon: 30, title: 17, desc: 13, gap: 10, pad: 28},\n} as const;\n\n/**\n * EmptyState — centred placeholder for empty / zero-result screens\n * (no applications yet, no submissions, closed without hire, dissolved team).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pass `action` /\n * `secondaryAction` as `<Button>` nodes.\n *\n * <EmptyState icon=\"inbox\" title=\"No applications yet\"\n * description=\"Share your job to start receiving bids.\"\n * action={<Button label=\"Edit posting\" />} />\n */\nexport function EmptyState(rawProps: IEmptyStateProps) {\n const props = useComponentDefaults<IEmptyStateProps>(\"EmptyState\", rawProps).mergedProps;\n const {\n icon,\n illustration,\n title,\n description,\n action,\n secondaryAction,\n accentColor = \"brand\",\n size = \"md\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"status\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={cfg.gap}\n padding={cfg.pad}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {illustration != null ? (\n illustration\n ) : icon != null ? (\n <Box\n width={cfg.bubble}\n height={cfg.bubble}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor=\"gray.100\"\n marginBottom={2}\n >\n <Icon name={icon as never} size={cfg.icon} color={accentColor} />\n </Box>\n ) : null}\n\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\" textAlign=\"center\">\n {title}\n </Text>\n\n {description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" textAlign=\"center\" lineHeight={Math.round(cfg.desc * 1.45)}>\n {description}\n </Text>\n )}\n\n {(action != null || secondaryAction != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"center\" gap={10} marginTop={6} flexWrap=\"wrap\">\n {secondaryAction}\n {action}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IEmptyStateProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {bubble: 48, icon: 22, title: 15, desc: 12, gap: 8, pad: 20},\n md: {bubble: 64, icon: 30, title: 17, desc: 13, gap: 10, pad: 28},\n} as const;\n\n/**\n * EmptyState — centred placeholder for empty / zero-result screens\n * (no applications yet, no submissions, closed without hire, dissolved team).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pass `action` /\n * `secondaryAction` as `<Button>` nodes.\n *\n * <EmptyState icon=\"inbox\" title=\"No applications yet\"\n * description=\"Share your job to start receiving bids.\"\n * action={<Button label=\"Edit posting\" />} />\n */\nexport function EmptyState(rawProps: IEmptyStateProps) {\n const props = useComponentDefaults<IEmptyStateProps>(\"EmptyState\", rawProps).mergedProps;\n const {\n icon,\n illustration,\n title,\n description,\n action,\n secondaryAction,\n accentColor = \"brand\",\n size = \"md\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"status\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={cfg.gap}\n padding={cfg.pad}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {illustration != null ? (\n illustration\n ) : icon != null ? (\n <Box\n width={cfg.bubble}\n height={cfg.bubble}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor=\"gray.100\"\n marginBottom={2}\n >\n <Icon name={icon as never} size={cfg.icon} color={accentColor} />\n </Box>\n ) : null}\n\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\" textAlign=\"center\">\n {title}\n </Text>\n\n {description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" textAlign=\"center\" lineHeight={Math.round(cfg.desc * 1.45)}>\n {description}\n </Text>\n )}\n\n {(action != null || secondaryAction != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"center\" gap={10} marginTop={6} flexWrap=\"wrap\">\n {secondaryAction}\n {action}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { Icon } from '../../primitives/Icon/index.js';
|
|
|
5
5
|
import 'react';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
7
|
import '../../contexts/PermissionsContext.js';
|
|
8
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
8
9
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
9
10
|
|
|
10
11
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IEmptyStateProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {bubble: 48, icon: 22, title: 15, desc: 12, gap: 8, pad: 20},\n md: {bubble: 64, icon: 30, title: 17, desc: 13, gap: 10, pad: 28},\n} as const;\n\n/**\n * EmptyState — centred placeholder for empty / zero-result screens\n * (no applications yet, no submissions, closed without hire, dissolved team).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pass `action` /\n * `secondaryAction` as `<Button>` nodes.\n *\n * <EmptyState icon=\"inbox\" title=\"No applications yet\"\n * description=\"Share your job to start receiving bids.\"\n * action={<Button label=\"Edit posting\" />} />\n */\nexport function EmptyState(rawProps: IEmptyStateProps) {\n const props = useComponentDefaults<IEmptyStateProps>(\"EmptyState\", rawProps).mergedProps;\n const {\n icon,\n illustration,\n title,\n description,\n action,\n secondaryAction,\n accentColor = \"brand\",\n size = \"md\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"status\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={cfg.gap}\n padding={cfg.pad}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {illustration != null ? (\n illustration\n ) : icon != null ? (\n <Box\n width={cfg.bubble}\n height={cfg.bubble}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor=\"gray.100\"\n marginBottom={2}\n >\n <Icon name={icon as never} size={cfg.icon} color={accentColor} />\n </Box>\n ) : null}\n\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\" textAlign=\"center\">\n {title}\n </Text>\n\n {description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" textAlign=\"center\" lineHeight={Math.round(cfg.desc * 1.45)}>\n {description}\n </Text>\n )}\n\n {(action != null || secondaryAction != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"center\" gap={10} marginTop={6} flexWrap=\"wrap\">\n {secondaryAction}\n {action}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IEmptyStateProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {bubble: 48, icon: 22, title: 15, desc: 12, gap: 8, pad: 20},\n md: {bubble: 64, icon: 30, title: 17, desc: 13, gap: 10, pad: 28},\n} as const;\n\n/**\n * EmptyState — centred placeholder for empty / zero-result screens\n * (no applications yet, no submissions, closed without hire, dissolved team).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pass `action` /\n * `secondaryAction` as `<Button>` nodes.\n *\n * <EmptyState icon=\"inbox\" title=\"No applications yet\"\n * description=\"Share your job to start receiving bids.\"\n * action={<Button label=\"Edit posting\" />} />\n */\nexport function EmptyState(rawProps: IEmptyStateProps) {\n const props = useComponentDefaults<IEmptyStateProps>(\"EmptyState\", rawProps).mergedProps;\n const {\n icon,\n illustration,\n title,\n description,\n action,\n secondaryAction,\n accentColor = \"brand\",\n size = \"md\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n\n const a11yProps = {\n role: \"status\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={cfg.gap}\n padding={cfg.pad}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {illustration != null ? (\n illustration\n ) : icon != null ? (\n <Box\n width={cfg.bubble}\n height={cfg.bubble}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor=\"gray.100\"\n marginBottom={2}\n >\n <Icon name={icon as never} size={cfg.icon} color={accentColor} />\n </Box>\n ) : null}\n\n <Text fontSize={cfg.title} fontWeight=\"700\" color=\"text\" textAlign=\"center\">\n {title}\n </Text>\n\n {description != null && (\n <Text fontSize={cfg.desc} color=\"text-secondary\" textAlign=\"center\" lineHeight={Math.round(cfg.desc * 1.45)}>\n {description}\n </Text>\n )}\n\n {(action != null || secondaryAction != null) && (\n <Box flexDirection=\"row\" alignItems=\"center\" justifyContent=\"center\" gap={10} marginTop={6} flexWrap=\"wrap\">\n {secondaryAction}\n {action}\n </Box>\n )}\n </Box>\n );\n}\n\nexport default EmptyState;\n"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var index_native$1 = 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
|
function Gallery(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Gallery/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IGalleryProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * Gallery — responsive image grid with per-tile overlay slots, caption, and a\n * `selected` state (ring + check) for multiselect grids.\n *\n * Cross-platform and presentational (Box + Image + Text + Icon). Tappability is\n * the caller's concern — wrap tiles, or drive `selected` from your own handler.\n *\n * <Gallery columns={2} items={[\n * {src, title:'Rewire', meta:'12 May · Newtown', topLeft:<Chip label=\"VERIFIED\" size=\"sm\" />},\n * ]} />\n */\nexport function Gallery(rawProps: IGalleryProps) {\n const props = useComponentDefaults<IGalleryProps>(\"Gallery\", rawProps).mergedProps;\n const {items, columns = 2, gap = 8, aspectRatio = 1, radius = 12, testID, ...rest} = props;\n\n const cols = Math.max(1, Math.floor(columns));\n const widthPct = `${100 / cols}%`;\n const half = gap / 2;\n\n return (\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n marginLeft={-half}\n marginRight={-half}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {items.map((item, i) => (\n <Box key={i} width={widthPct} paddingLeft={half} paddingRight={half} paddingBottom={gap}>\n {/* image card */}\n <Box\n position=\"relative\"\n width=\"100%\"\n aspectRatio={aspectRatio}\n borderRadius={radius}\n overflow=\"hidden\"\n bgColor=\"gray.100\"\n borderWidth={item.selected ? 2 : 0}\n borderColor={item.selected ? \"brand\" : \"transparent\"}\n >\n {item.src != null && (\n /*\n * ⛔ `alt` WAS MISSING, SO EVERY TILE WITH AN IMAGE\n * WARNED — the same omission the Avatar carried, found\n * beside it on 5 October 2026. gluestack's image creator\n * does `if (typeof alt !== 'string') console.warn('Please\n * pass alt prop to Image component')`, so the check is on\n * the TYPE: a missing prop warns, an empty string does\n * not.\n *\n * ⛔ AND `IGalleryItem.alt` HAS EXISTED ALL ALONG,\n * published and documented as \"Accessibility label\", and\n * this component read it NOWHERE. A caller could set it,\n * tsc accepted it, and it reached nothing — so the fix is\n * to honour the contract that was already written down,\n * not to invent one.\n *\n * ⛔ `aria-hidden` IS CONDITIONAL HERE, WHERE THE\n * AVATAR'S IS UNCONDITIONAL — the two structures differ.\n * The Avatar's image sits inside a Box that already\n * carries `role=\"img\"` and `aria-label`, so it is ALWAYS\n * redundant. This tile's Box carries no role and no label\n * at all, so when a caller HAS described the image it is\n * the only thing that can say so and it must stay in the\n * tree.\n *\n * ⛔ AND WITH NO DESCRIPTION IT IS HIDDEN, NOT EXPOSED\n * EMPTY — found by Codex, 5 October 2026, and the first\n * draft of this fix had it backwards. gluestack forces\n * `role={props.role || 'img'}` whatever `alt` says, so\n * `alt=\"\"` alone leaves an EXPOSED, NAMELESS image node on\n * React Native. \"No labelled ancestor\" was the wrong\n * reason to leave it exposed: an image with no name cannot\n * speak for the tile either way.\n *\n * ⛔ AND IT DOES NOT FALL BACK TO `title`. The draft\n * did, and `title` is ALREADY rendered as a Text sibling a\n * few lines below — a screen reader would have read it\n * twice: \"image, Rewire\" then \"Rewire\". The caption\n * announces itself; the image either adds something the\n * caller wrote in `alt`, or it adds nothing and gets out\n * of the way.\n *\n * ⚠️ `alt=\"\"` STAYS IN BOTH BRANCHES because it is what\n * silences the warning: gluestack tests\n * `typeof alt !== 'string'`, so a missing prop warns and\n * an empty string does not.\n */\n <Image\n src={item.src}\n alt={item.alt ?? \"\"}\n aria-hidden={!item.alt}\n style={{width: \"100%\", height: \"100%\"} as any}\n objectFit=\"cover\"\n />\n )}\n\n {item.topLeft != null && (\n <Box position=\"absolute\" top={6} left={6}>\n {item.topLeft}\n </Box>\n )}\n {item.bottomRight != null && (\n <Box position=\"absolute\" bottom={6} right={6}>\n {item.bottomRight}\n </Box>\n )}\n {item.selected && (\n <Box\n position=\"absolute\"\n top={6}\n right={6}\n width={22}\n height={22}\n borderRadius={999}\n bgColor=\"brand\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderWidth={2}\n borderColor=\"#FFFFFF\"\n >\n <Icon name=\"check\" size={12} color=\"#FFFFFF\" />\n </Box>\n )}\n </Box>\n\n {(item.title != null || item.meta != null) && (\n <Box paddingTop={6} gap={2}>\n {item.title != null && (\n <Text fontSize={13} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n )}\n {item.meta != null && (\n <Text fontSize={11} color=\"text-secondary\">\n {item.meta}\n </Text>\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\nexport default Gallery;\n"],"names":["useComponentDefaults","jsx","Box","jsxs","Image","Icon","Text"],"mappings":";;;;;;;;;;;;AAgBO,SAAS,QAAQ,QAAA,EAAyB;AAC7C,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAAoC,SAAA,EAAW,QAAQ,CAAA,CAAE,WAAA;AACvE,EAAA,MAAM,EAAC,KAAA,EAAO,OAAA,GAAU,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,WAAA,GAAc,CAAA,EAAG,MAAA,GAAS,EAAA,EAAI,MAAA,EAAQ,GAAG,MAAI,GAAI,KAAA;AAErF,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAA,GAAM,IAAI,CAAA,CAAA,CAAA;AAC9B,EAAA,MAAM,OAAO,GAAA,GAAM,CAAA;AAEnB,EAAA,uBACIC,cAAA;AAAA,IAACC,aAAA;AAAA,IAAA;AAAA,MACG,aAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAS,MAAA;AAAA,MACT,YAAY,CAAC,IAAA;AAAA,MACb,aAAa,CAAC,IAAA;AAAA,MACb,GAAI,IAAA;AAAA,MACJ,GAAI,MAAA,GAAU,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAkB,EAAC;AAAA,MAEzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,sBACdC,eAAA,CAACD,aAAA,EAAA,EAAY,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,eAAe,GAAA,EAEhF,QAAA,EAAA;AAAA,wBAAAC,eAAA;AAAA,UAACD,aAAA;AAAA,UAAA;AAAA,YACG,QAAA,EAAS,UAAA;AAAA,YACT,KAAA,EAAM,MAAA;AAAA,YACN,WAAA;AAAA,YACA,YAAA,EAAc,MAAA;AAAA,YACd,QAAA,EAAS,QAAA;AAAA,YACT,OAAA,EAAQ,UAAA;AAAA,YACR,WAAA,EAAa,IAAA,CAAK,QAAA,GAAW,CAAA,GAAI,CAAA;AAAA,YACjC,WAAA,EAAa,IAAA,CAAK,QAAA,GAAW,OAAA,GAAU,aAAA;AAAA,YAEtC,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,GAAA,IAAO,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAgDTD,cAAA;AAAA,gBAACG,oBAAA;AAAA,gBAAA;AAAA,kBACG,KAAK,IAAA,CAAK,GAAA;AAAA,kBACV,GAAA,EAAK,KAAK,GAAA,IAAO,EAAA;AAAA,kBACjB,aAAA,EAAa,CAAC,IAAA,CAAK,GAAA;AAAA,kBACnB,KAAA,EAAO,EAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAM;AAAA,kBACrC,SAAA,EAAU;AAAA;AAAA,eACd;AAAA,cAGH,IAAA,CAAK,OAAA,IAAW,IAAA,oBACbH,cAAA,CAACC,aAAA,EAAA,EAAI,QAAA,EAAS,UAAA,EAAW,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,CAAA,EAClC,QAAA,EAAA,IAAA,CAAK,OAAA,EACV,CAAA;AAAA,cAEH,IAAA,CAAK,WAAA,IAAe,IAAA,oBACjBD,cAAA,CAACC,aAAA,EAAA,EAAI,QAAA,EAAS,UAAA,EAAW,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,CAAA,EACtC,QAAA,EAAA,IAAA,CAAK,WAAA,EACV,CAAA;AAAA,cAEH,KAAK,QAAA,oBACFD,cAAA;AAAA,gBAACC,aAAA;AAAA,gBAAA;AAAA,kBACG,QAAA,EAAS,UAAA;AAAA,kBACT,GAAA,EAAK,CAAA;AAAA,kBACL,KAAA,EAAO,CAAA;AAAA,kBACP,KAAA,EAAO,EAAA;AAAA,kBACP,MAAA,EAAQ,EAAA;AAAA,kBACR,YAAA,EAAc,GAAA;AAAA,kBACd,OAAA,EAAQ,OAAA;AAAA,kBACR,UAAA,EAAW,QAAA;AAAA,kBACX,cAAA,EAAe,QAAA;AAAA,kBACf,WAAA,EAAa,CAAA;AAAA,kBACb,WAAA,EAAY,SAAA;AAAA,kBAEZ,yCAACG,mBAAA,EAAA,EAAK,IAAA,EAAK,SAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,SAAA,EAAU;AAAA;AAAA;AACjD;AAAA;AAAA,SAER;AAAA,QAAA,CAEE,IAAA,CAAK,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA,qBACjCF,eAAA,CAACD,aAAA,EAAA,EAAI,UAAA,EAAY,CAAA,EAAG,GAAA,EAAK,CAAA,EACpB,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,IAAS,IAAA,oBACXD,cAAA,CAACK,sBAAA,EAAA,EAAK,QAAA,EAAU,EAAA,EAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAM,MAAA,EACtC,QAAA,EAAA,IAAA,CAAK,KAAA,EACV,CAAA;AAAA,UAEH,IAAA,CAAK,IAAA,IAAQ,IAAA,oBACVL,cAAA,CAACK,sBAAA,EAAA,EAAK,UAAU,EAAA,EAAI,KAAA,EAAM,gBAAA,EACrB,QAAA,EAAA,IAAA,CAAK,IAAA,EACV;AAAA,SAAA,EAER;AAAA,OAAA,EAAA,EA9GE,CAgHV,CACH;AAAA;AAAA,GACL;AAER;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Gallery/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IGalleryProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * Gallery — responsive image grid with per-tile overlay slots, caption, and a\n * `selected` state (ring + check) for multiselect grids.\n *\n * Cross-platform and presentational (Box + Image + Text + Icon). Tappability is\n * the caller's concern — wrap tiles, or drive `selected` from your own handler.\n *\n * <Gallery columns={2} items={[\n * {src, title:'Rewire', meta:'12 May · Newtown', topLeft:<Chip label=\"VERIFIED\" size=\"sm\" />},\n * ]} />\n */\nexport function Gallery(rawProps: IGalleryProps) {\n const props = useComponentDefaults<IGalleryProps>(\"Gallery\", rawProps).mergedProps;\n const {items, columns = 2, gap = 8, aspectRatio = 1, radius = 12, testID, ...rest} = props;\n\n const cols = Math.max(1, Math.floor(columns));\n const widthPct = `${100 / cols}%`;\n const half = gap / 2;\n\n return (\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n marginLeft={-half}\n marginRight={-half}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {items.map((item, i) => (\n <Box key={i} width={widthPct} paddingLeft={half} paddingRight={half} paddingBottom={gap}>\n {/* image card */}\n <Box\n position=\"relative\"\n width=\"100%\"\n aspectRatio={aspectRatio}\n borderRadius={radius}\n overflow=\"hidden\"\n bgColor=\"gray.100\"\n borderWidth={item.selected ? 2 : 0}\n borderColor={item.selected ? \"brand\" : \"transparent\"}\n >\n {item.src != null && (\n /*\n * ⛔ `alt` WAS MISSING, SO EVERY TILE WITH AN IMAGE\n * WARNED — the same omission the Avatar carried, found\n * beside it on 5 October 2026. gluestack's image creator\n * does `if (typeof alt !== 'string') console.warn('Please\n * pass alt prop to Image component')`, so the check is on\n * the TYPE: a missing prop warns, an empty string does\n * not.\n *\n * ⛔ AND `IGalleryItem.alt` HAS EXISTED ALL ALONG,\n * published and documented as \"Accessibility label\", and\n * this component read it NOWHERE. A caller could set it,\n * tsc accepted it, and it reached nothing — so the fix is\n * to honour the contract that was already written down,\n * not to invent one.\n *\n * ⛔ `aria-hidden` IS CONDITIONAL HERE, WHERE THE\n * AVATAR'S IS UNCONDITIONAL — the two structures differ.\n * The Avatar's image sits inside a Box that already\n * carries `role=\"img\"` and `aria-label`, so it is ALWAYS\n * redundant. This tile's Box carries no role and no label\n * at all, so when a caller HAS described the image it is\n * the only thing that can say so and it must stay in the\n * tree.\n *\n * ⛔ AND WITH NO DESCRIPTION IT IS HIDDEN, NOT EXPOSED\n * EMPTY — found by Codex, 5 October 2026, and the first\n * draft of this fix had it backwards. gluestack forces\n * `role={props.role || 'img'}` whatever `alt` says, so\n * `alt=\"\"` alone leaves an EXPOSED, NAMELESS image node on\n * React Native. \"No labelled ancestor\" was the wrong\n * reason to leave it exposed: an image with no name cannot\n * speak for the tile either way.\n *\n * ⛔ AND IT DOES NOT FALL BACK TO `title`. The draft\n * did, and `title` is ALREADY rendered as a Text sibling a\n * few lines below — a screen reader would have read it\n * twice: \"image, Rewire\" then \"Rewire\". The caption\n * announces itself; the image either adds something the\n * caller wrote in `alt`, or it adds nothing and gets out\n * of the way.\n *\n * ⚠️ `alt=\"\"` STAYS IN BOTH BRANCHES because it is what\n * silences the warning: gluestack tests\n * `typeof alt !== 'string'`, so a missing prop warns and\n * an empty string does not.\n */\n <Image\n src={item.src}\n alt={item.alt ?? \"\"}\n aria-hidden={!item.alt}\n style={{width: \"100%\", height: \"100%\"} as any}\n objectFit=\"cover\"\n />\n )}\n\n {item.topLeft != null && (\n <Box position=\"absolute\" top={6} left={6}>\n {item.topLeft}\n </Box>\n )}\n {item.bottomRight != null && (\n <Box position=\"absolute\" bottom={6} right={6}>\n {item.bottomRight}\n </Box>\n )}\n {item.selected && (\n <Box\n position=\"absolute\"\n top={6}\n right={6}\n width={22}\n height={22}\n borderRadius={999}\n bgColor=\"brand\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderWidth={2}\n borderColor=\"#FFFFFF\"\n >\n <Icon name=\"check\" size={12} color=\"#FFFFFF\" />\n </Box>\n )}\n </Box>\n\n {(item.title != null || item.meta != null) && (\n <Box paddingTop={6} gap={2}>\n {item.title != null && (\n <Text fontSize={13} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n )}\n {item.meta != null && (\n <Text fontSize={11} color=\"text-secondary\">\n {item.meta}\n </Text>\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\nexport default Gallery;\n"],"names":["useComponentDefaults","jsx","Box","jsxs","Image","Icon","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
|
function Gallery(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Gallery/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IGalleryProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * Gallery — responsive image grid with per-tile overlay slots, caption, and a\n * `selected` state (ring + check) for multiselect grids.\n *\n * Cross-platform and presentational (Box + Image + Text + Icon). Tappability is\n * the caller's concern — wrap tiles, or drive `selected` from your own handler.\n *\n * <Gallery columns={2} items={[\n * {src, title:'Rewire', meta:'12 May · Newtown', topLeft:<Chip label=\"VERIFIED\" size=\"sm\" />},\n * ]} />\n */\nexport function Gallery(rawProps: IGalleryProps) {\n const props = useComponentDefaults<IGalleryProps>(\"Gallery\", rawProps).mergedProps;\n const {items, columns = 2, gap = 8, aspectRatio = 1, radius = 12, testID, ...rest} = props;\n\n const cols = Math.max(1, Math.floor(columns));\n const widthPct = `${100 / cols}%`;\n const half = gap / 2;\n\n return (\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n marginLeft={-half}\n marginRight={-half}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {items.map((item, i) => (\n <Box key={i} width={widthPct} paddingLeft={half} paddingRight={half} paddingBottom={gap}>\n {/* image card */}\n <Box\n position=\"relative\"\n width=\"100%\"\n aspectRatio={aspectRatio}\n borderRadius={radius}\n overflow=\"hidden\"\n bgColor=\"gray.100\"\n borderWidth={item.selected ? 2 : 0}\n borderColor={item.selected ? \"brand\" : \"transparent\"}\n >\n {item.src != null && (\n /*\n * ⛔ `alt` WAS MISSING, SO EVERY TILE WITH AN IMAGE\n * WARNED — the same omission the Avatar carried, found\n * beside it on 5 October 2026. gluestack's image creator\n * does `if (typeof alt !== 'string') console.warn('Please\n * pass alt prop to Image component')`, so the check is on\n * the TYPE: a missing prop warns, an empty string does\n * not.\n *\n * ⛔ AND `IGalleryItem.alt` HAS EXISTED ALL ALONG,\n * published and documented as \"Accessibility label\", and\n * this component read it NOWHERE. A caller could set it,\n * tsc accepted it, and it reached nothing — so the fix is\n * to honour the contract that was already written down,\n * not to invent one.\n *\n * ⛔ `aria-hidden` IS CONDITIONAL HERE, WHERE THE\n * AVATAR'S IS UNCONDITIONAL — the two structures differ.\n * The Avatar's image sits inside a Box that already\n * carries `role=\"img\"` and `aria-label`, so it is ALWAYS\n * redundant. This tile's Box carries no role and no label\n * at all, so when a caller HAS described the image it is\n * the only thing that can say so and it must stay in the\n * tree.\n *\n * ⛔ AND WITH NO DESCRIPTION IT IS HIDDEN, NOT EXPOSED\n * EMPTY — found by Codex, 5 October 2026, and the first\n * draft of this fix had it backwards. gluestack forces\n * `role={props.role || 'img'}` whatever `alt` says, so\n * `alt=\"\"` alone leaves an EXPOSED, NAMELESS image node on\n * React Native. \"No labelled ancestor\" was the wrong\n * reason to leave it exposed: an image with no name cannot\n * speak for the tile either way.\n *\n * ⛔ AND IT DOES NOT FALL BACK TO `title`. The draft\n * did, and `title` is ALREADY rendered as a Text sibling a\n * few lines below — a screen reader would have read it\n * twice: \"image, Rewire\" then \"Rewire\". The caption\n * announces itself; the image either adds something the\n * caller wrote in `alt`, or it adds nothing and gets out\n * of the way.\n *\n * ⚠️ `alt=\"\"` STAYS IN BOTH BRANCHES because it is what\n * silences the warning: gluestack tests\n * `typeof alt !== 'string'`, so a missing prop warns and\n * an empty string does not.\n */\n <Image\n src={item.src}\n alt={item.alt ?? \"\"}\n aria-hidden={!item.alt}\n style={{width: \"100%\", height: \"100%\"} as any}\n objectFit=\"cover\"\n />\n )}\n\n {item.topLeft != null && (\n <Box position=\"absolute\" top={6} left={6}>\n {item.topLeft}\n </Box>\n )}\n {item.bottomRight != null && (\n <Box position=\"absolute\" bottom={6} right={6}>\n {item.bottomRight}\n </Box>\n )}\n {item.selected && (\n <Box\n position=\"absolute\"\n top={6}\n right={6}\n width={22}\n height={22}\n borderRadius={999}\n bgColor=\"brand\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderWidth={2}\n borderColor=\"#FFFFFF\"\n >\n <Icon name=\"check\" size={12} color=\"#FFFFFF\" />\n </Box>\n )}\n </Box>\n\n {(item.title != null || item.meta != null) && (\n <Box paddingTop={6} gap={2}>\n {item.title != null && (\n <Text fontSize={13} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n )}\n {item.meta != null && (\n <Text fontSize={11} color=\"text-secondary\">\n {item.meta}\n </Text>\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\nexport default Gallery;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Gallery/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IGalleryProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Image, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * Gallery — responsive image grid with per-tile overlay slots, caption, and a\n * `selected` state (ring + check) for multiselect grids.\n *\n * Cross-platform and presentational (Box + Image + Text + Icon). Tappability is\n * the caller's concern — wrap tiles, or drive `selected` from your own handler.\n *\n * <Gallery columns={2} items={[\n * {src, title:'Rewire', meta:'12 May · Newtown', topLeft:<Chip label=\"VERIFIED\" size=\"sm\" />},\n * ]} />\n */\nexport function Gallery(rawProps: IGalleryProps) {\n const props = useComponentDefaults<IGalleryProps>(\"Gallery\", rawProps).mergedProps;\n const {items, columns = 2, gap = 8, aspectRatio = 1, radius = 12, testID, ...rest} = props;\n\n const cols = Math.max(1, Math.floor(columns));\n const widthPct = `${100 / cols}%`;\n const half = gap / 2;\n\n return (\n <Box\n flexDirection=\"row\"\n flexWrap=\"wrap\"\n marginLeft={-half}\n marginRight={-half}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {items.map((item, i) => (\n <Box key={i} width={widthPct} paddingLeft={half} paddingRight={half} paddingBottom={gap}>\n {/* image card */}\n <Box\n position=\"relative\"\n width=\"100%\"\n aspectRatio={aspectRatio}\n borderRadius={radius}\n overflow=\"hidden\"\n bgColor=\"gray.100\"\n borderWidth={item.selected ? 2 : 0}\n borderColor={item.selected ? \"brand\" : \"transparent\"}\n >\n {item.src != null && (\n /*\n * ⛔ `alt` WAS MISSING, SO EVERY TILE WITH AN IMAGE\n * WARNED — the same omission the Avatar carried, found\n * beside it on 5 October 2026. gluestack's image creator\n * does `if (typeof alt !== 'string') console.warn('Please\n * pass alt prop to Image component')`, so the check is on\n * the TYPE: a missing prop warns, an empty string does\n * not.\n *\n * ⛔ AND `IGalleryItem.alt` HAS EXISTED ALL ALONG,\n * published and documented as \"Accessibility label\", and\n * this component read it NOWHERE. A caller could set it,\n * tsc accepted it, and it reached nothing — so the fix is\n * to honour the contract that was already written down,\n * not to invent one.\n *\n * ⛔ `aria-hidden` IS CONDITIONAL HERE, WHERE THE\n * AVATAR'S IS UNCONDITIONAL — the two structures differ.\n * The Avatar's image sits inside a Box that already\n * carries `role=\"img\"` and `aria-label`, so it is ALWAYS\n * redundant. This tile's Box carries no role and no label\n * at all, so when a caller HAS described the image it is\n * the only thing that can say so and it must stay in the\n * tree.\n *\n * ⛔ AND WITH NO DESCRIPTION IT IS HIDDEN, NOT EXPOSED\n * EMPTY — found by Codex, 5 October 2026, and the first\n * draft of this fix had it backwards. gluestack forces\n * `role={props.role || 'img'}` whatever `alt` says, so\n * `alt=\"\"` alone leaves an EXPOSED, NAMELESS image node on\n * React Native. \"No labelled ancestor\" was the wrong\n * reason to leave it exposed: an image with no name cannot\n * speak for the tile either way.\n *\n * ⛔ AND IT DOES NOT FALL BACK TO `title`. The draft\n * did, and `title` is ALREADY rendered as a Text sibling a\n * few lines below — a screen reader would have read it\n * twice: \"image, Rewire\" then \"Rewire\". The caption\n * announces itself; the image either adds something the\n * caller wrote in `alt`, or it adds nothing and gets out\n * of the way.\n *\n * ⚠️ `alt=\"\"` STAYS IN BOTH BRANCHES because it is what\n * silences the warning: gluestack tests\n * `typeof alt !== 'string'`, so a missing prop warns and\n * an empty string does not.\n */\n <Image\n src={item.src}\n alt={item.alt ?? \"\"}\n aria-hidden={!item.alt}\n style={{width: \"100%\", height: \"100%\"} as any}\n objectFit=\"cover\"\n />\n )}\n\n {item.topLeft != null && (\n <Box position=\"absolute\" top={6} left={6}>\n {item.topLeft}\n </Box>\n )}\n {item.bottomRight != null && (\n <Box position=\"absolute\" bottom={6} right={6}>\n {item.bottomRight}\n </Box>\n )}\n {item.selected && (\n <Box\n position=\"absolute\"\n top={6}\n right={6}\n width={22}\n height={22}\n borderRadius={999}\n bgColor=\"brand\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderWidth={2}\n borderColor=\"#FFFFFF\"\n >\n <Icon name=\"check\" size={12} color=\"#FFFFFF\" />\n </Box>\n )}\n </Box>\n\n {(item.title != null || item.meta != null) && (\n <Box paddingTop={6} gap={2}>\n {item.title != null && (\n <Text fontSize={13} fontWeight=\"700\" color=\"text\">\n {item.title}\n </Text>\n )}\n {item.meta != null && (\n <Text fontSize={11} color=\"text-secondary\">\n {item.meta}\n </Text>\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\nexport default Gallery;\n"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ var useRtlLineHeight = require('../../hooks/useRtlLineHeight.cjs');
|
|
|
87
87
|
var index_native = require('../../primitives/Icon/index.cjs');
|
|
88
88
|
require('../../contexts/DialogContext.cjs');
|
|
89
89
|
require('../../contexts/PermissionsContext.cjs');
|
|
90
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
90
91
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
91
92
|
|
|
92
93
|
function MessageComposer(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/MessageComposer/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {View, Text, TextInput, TouchableOpacity} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IMessageComposerProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * MessageComposer (native) — attach + multiline input + send, mirroring the\n * app's chat input bar (RN TextInput + TouchableOpacity, library Icon).\n */\nexport function MessageComposer(rawProps: IMessageComposerProps) {\n const props = useComponentDefaults<IMessageComposerProps>(\"MessageComposer\", rawProps).mergedProps;\n const {value, onChangeText, onSend, onAttach, placeholder = \"Message…\", sendDisabled, accentColor = \"brand\", locked, lockedLabel, attachDisabled, attachHint, onSelectionChange, selection, inputRef, testID} = props;\n\n const accent = resolveThemeTokenForNative(accentColor);\n const surface = resolveThemeTokenForNative(\"surface-card\");\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fieldBg = resolveThemeTokenForNative(\"gray.100\");\n const textColor = resolveThemeTokenForNative(\"text\");\n const muted = resolveThemeTokenForNative(\"text-secondary\");\n const disabledBg = resolveThemeTokenForNative(\"gray.300\");\n\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. These render RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural box — and NotoKufiArabic's is too short for its\n * own ascenders. In an RTL script that does not read as clipping, it reads\n * as a BAD TRANSLATION: ش/س, غ/ع and ة/ه differ only by marks above the\n * baseline. Both are undefined in LTR, so no English layout moves.\n *\n * ⚠️ THE INPUT ITSELF IS DELIBERATELY NOT TOUCHED. The TextInput below is\n * fontSize 14 with no lineHeight for the same reason, but it also carries\n * a hand-tuned single-line height floor and a comment about a two-frame\n * re-measure. Giving it a taller line box without being able to TYPE\n * Arabic into it and watch the field settle would be guessing at the one\n * control a person uses most. Recorded, not changed.\n */\n const rtlLockedLine = useRtlLineHeight(undefined, 13);\n const rtlHintLine = useRtlLineHeight(undefined, 11);\n\n if (locked) {\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n <View\n style={{\n flexGrow: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n backgroundColor: fieldBg,\n borderWidth: 1,\n borderColor: border,\n borderRadius: 999,\n paddingHorizontal: 16,\n paddingVertical: 11,\n }}\n >\n <Icon name=\"lock\" size={17} color={muted} />\n {lockedLabel != null && <Text style={{fontSize: 13, color: muted, ...(rtlLockedLine != null ? {lineHeight: rtlLockedLine} : {})}}>{lockedLabel}</Text>}\n </View>\n </View>\n );\n }\n\n const canSend = sendDisabled != null ? !sendDisabled : value.trim().length > 0;\n\n // Shared field + send (referenced by the default row AND the attach-disabled\n // branch — single source, so the input is never duplicated).\n //\n // onSelectionChange is adapted from RN's NativeSyntheticEvent shape to the\n // platform-agnostic {start, end} contract declared on IMessageComposerProps,\n // so consumers (e.g. @mention pickers) read the same shape on native and web.\n const field = (\n <TextInput\n ref={inputRef as React.Ref<TextInput>}\n style={{\n flex: 1,\n backgroundColor: fieldBg,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: 8,\n fontSize: 14,\n color: textColor,\n // Pin a single-line floor (= the 36px send button) so a\n // multiline RN TextInput doesn't measure a taller default on\n // frame 1 then settle on frame 2 — that re-measure re-flexes\n // the chat thread above it (a small shift-then-settle on open).\n // Still grows up to maxHeight when typing multiple lines.\n minHeight: 36,\n maxHeight: 120,\n }}\n placeholder={placeholder}\n placeholderTextColor={muted}\n value={value}\n onChangeText={onChangeText}\n selection={selection as {start: number; end?: number} | undefined}\n onSelectionChange={\n onSelectionChange\n ? e => onSelectionChange({start: e.nativeEvent.selection.start, end: e.nativeEvent.selection.end})\n : undefined\n }\n multiline\n />\n );\n\n const sendBtn = (\n <TouchableOpacity\n onPress={() => canSend && onSend?.()}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: canSend ? accent : disabledBg,\n }}\n >\n <Icon name=\"send\" size={18} color=\"#FFFFFF\" />\n </TouchableOpacity>\n );\n\n if (attachDisabled) {\n return (\n <View\n testID={testID}\n style={{\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {attachHint != null && (\n <View style={{flexDirection: \"row\", alignItems: \"center\", gap: 6, paddingHorizontal: 12, paddingBottom: 8}}>\n <Icon name=\"info\" size={12} color={muted} />\n <Text style={{fontSize: 11, color: muted, ...(rtlHintLine != null ? {lineHeight: rtlHintLine} : {})}}>{attachHint}</Text>\n </View>\n )}\n <View style={{flexDirection: \"row\", alignItems: \"flex-end\", gap: 8, paddingHorizontal: 12}}>\n {onAttach != null && (\n <View style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\", opacity: 0.5}}>\n <Icon name=\"paperclip\" size={20} color={muted} />\n </View>\n )}\n {field}\n {sendBtn}\n </View>\n </View>\n );\n }\n\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {onAttach != null && (\n <TouchableOpacity\n onPress={onAttach}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach\"\n style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\"}}\n >\n <Icon name=\"paperclip\" size={20} color={muted} />\n </TouchableOpacity>\n )}\n {field}\n {sendBtn}\n </View>\n );\n}\n\nexport default MessageComposer;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","useRtlLineHeight","jsx","View","jsxs","Icon","Text","TextInput","TouchableOpacity"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,SAAS,gBAAgB,QAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAA4C,iBAAA,EAAmB,QAAQ,CAAA,CAAE,WAAA;AACvF,EAAA,MAAM,EAAC,KAAA,EAAO,YAAA,EAAc,QAAQ,QAAA,EAAU,WAAA,GAAc,iBAAY,YAAA,EAAc,WAAA,GAAc,OAAA,EAAS,MAAA,EAAQ,aAAa,cAAA,EAAgB,UAAA,EAAY,mBAAmB,SAAA,EAAW,QAAA,EAAU,QAAM,GAAI,KAAA;AAEhN,EAAA,MAAM,MAAA,GAASC,iCAA2B,WAAW,CAAA;AACrD,EAAA,MAAM,OAAA,GAAUA,iCAA2B,cAAc,CAAA;AACzD,EAAA,MAAM,MAAA,GAASA,iCAA2B,gBAAgB,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAUA,iCAA2B,UAAU,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYA,iCAA2B,MAAM,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQA,iCAA2B,gBAAgB,CAAA;AACzD,EAAA,MAAM,UAAA,GAAaA,iCAA2B,UAAU,CAAA;AAiBxD,EAAA,MAAM,aAAA,GAAgBC,wBAAA,CAAiB,MAAA,EAAW,EAAE,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcA,wBAAA,CAAiB,MAAA,EAAW,EAAE,CAAA;AAElD,EAAA,IAAI,MAAA,EAAQ;AACR,IAAA,uBACIC,cAAA;AAAA,MAACC,gBAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACH,aAAA,EAAe,KAAA;AAAA,UACf,UAAA,EAAY,QAAA;AAAA,UACZ,iBAAA,EAAmB,EAAA;AAAA,UACnB,eAAA,EAAiB,EAAA;AAAA,UACjB,eAAA,EAAiB,OAAA;AAAA,UACjB,cAAA,EAAgB,CAAA;AAAA,UAChB,cAAA,EAAgB;AAAA,SACpB;AAAA,QAEA,QAAA,kBAAAC,eAAA;AAAA,UAACD,gBAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO;AAAA,cACH,QAAA,EAAU,CAAA;AAAA,cACV,aAAA,EAAe,KAAA;AAAA,cACf,UAAA,EAAY,QAAA;AAAA,cACZ,GAAA,EAAK,EAAA;AAAA,cACL,eAAA,EAAiB,OAAA;AAAA,cACjB,WAAA,EAAa,CAAA;AAAA,cACb,WAAA,EAAa,MAAA;AAAA,cACb,YAAA,EAAc,GAAA;AAAA,cACd,iBAAA,EAAmB,EAAA;AAAA,cACnB,eAAA,EAAiB;AAAA,aACrB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,cAAA,CAACG,qBAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA;AAAA,cACzC,WAAA,IAAe,wBAAQH,cAAA,CAACI,gBAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,IAAI,KAAA,EAAO,KAAA,EAAO,GAAI,aAAA,IAAiB,IAAA,GAAO,EAAC,UAAA,EAAY,aAAA,KAAiB,EAAC,IAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA;AACnJ;AAAA,KACJ;AAAA,EAER;AAEA,EAAA,MAAM,OAAA,GAAU,gBAAgB,IAAA,GAAO,CAAC,eAAe,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAQ7E,EAAA,MAAM,KAAA,mBACFJ,cAAA;AAAA,IAACK,qBAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO;AAAA,QACH,IAAA,EAAM,CAAA;AAAA,QACN,eAAA,EAAiB,OAAA;AAAA,QACjB,YAAA,EAAc,EAAA;AAAA,QACd,iBAAA,EAAmB,EAAA;AAAA,QACnB,eAAA,EAAiB,CAAA;AAAA,QACjB,QAAA,EAAU,EAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMP,SAAA,EAAW,EAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACf;AAAA,MACA,WAAA;AAAA,MACA,oBAAA,EAAsB,KAAA;AAAA,MACtB,KAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,mBACI,iBAAA,GACM,CAAA,CAAA,KAAK,iBAAA,CAAkB,EAAC,OAAO,CAAA,CAAE,WAAA,CAAY,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA,CAAE,WAAA,CAAY,SAAA,CAAU,GAAA,EAAI,CAAA,GAC/F,MAAA;AAAA,MAEV,SAAA,EAAS;AAAA;AAAA,GACb;AAGJ,EAAA,MAAM,OAAA,mBACFL,cAAA;AAAA,IAACM,4BAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA,IAAS;AAAA,MACnC,UAAU,CAAC,OAAA;AAAA,MACX,iBAAA,EAAkB,QAAA;AAAA,MAClB,kBAAA,EAAmB,MAAA;AAAA,MACnB,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc,EAAA;AAAA,QACd,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,eAAA,EAAiB,UAAU,MAAA,GAAS;AAAA,OACxC;AAAA,MAEA,yCAACH,iBAAA,EAAA,EAAK,IAAA,EAAK,QAAO,IAAA,EAAM,EAAA,EAAI,OAAM,SAAA,EAAU;AAAA;AAAA,GAChD;AAGJ,EAAA,IAAI,cAAA,EAAgB;AAChB,IAAA,uBACID,eAAA;AAAA,MAACD,gBAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACH,eAAA,EAAiB,EAAA;AAAA,UACjB,eAAA,EAAiB,OAAA;AAAA,UACjB,cAAA,EAAgB,CAAA;AAAA,UAChB,cAAA,EAAgB;AAAA,SACpB;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,UAAA,IAAc,IAAA,oBACXC,eAAA,CAACD,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,KAAK,CAAA,EAAG,iBAAA,EAAmB,EAAA,EAAI,aAAA,EAAe,GAAC,EACrG,QAAA,EAAA;AAAA,4BAAAD,cAAA,CAACG,qBAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA;AAAA,2CACzCC,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,QAAA,EAAU,EAAA,EAAI,OAAO,KAAA,EAAO,GAAI,WAAA,IAAe,IAAA,GAAO,EAAC,UAAA,EAAY,WAAA,KAAe,EAAC,IAAM,QAAA,EAAA,UAAA,EAAW;AAAA,WAAA,EACtH,CAAA;AAAA,0BAEJF,eAAA,CAACD,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,iBAAA,EAAmB,EAAA,EAAE,EACpF,QAAA,EAAA;AAAA,YAAA,QAAA,IAAY,IAAA,oBACTD,cAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,OAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,UAAU,OAAA,EAAS,GAAA,EAAG,EAC7F,QAAA,kBAAAD,cAAA,CAACG,iBAAA,EAAA,EAAK,IAAA,EAAK,aAAY,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EACnD,CAAA;AAAA,YAEH,KAAA;AAAA,YACA;AAAA,WAAA,EACL;AAAA;AAAA;AAAA,KACJ;AAAA,EAER;AAEA,EAAA,uBACID,eAAA;AAAA,IAACD,gBAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACH,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY,UAAA;AAAA,QACZ,GAAA,EAAK,CAAA;AAAA,QACL,iBAAA,EAAmB,EAAA;AAAA,QACnB,eAAA,EAAiB,EAAA;AAAA,QACjB,eAAA,EAAiB,OAAA;AAAA,QACjB,cAAA,EAAgB,CAAA;AAAA,QAChB,cAAA,EAAgB;AAAA,OACpB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,IAAY,IAAA,oBACTD,cAAA;AAAA,UAACM,4BAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,QAAA;AAAA,YACT,iBAAA,EAAkB,QAAA;AAAA,YAClB,kBAAA,EAAmB,QAAA;AAAA,YACnB,KAAA,EAAO,EAAC,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAQ;AAAA,YAE7E,yCAACH,iBAAA,EAAA,EAAK,IAAA,EAAK,aAAY,IAAA,EAAM,EAAA,EAAI,OAAO,KAAA,EAAO;AAAA;AAAA,SACnD;AAAA,QAEH,KAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACL;AAER;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/MessageComposer/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {View, Text, TextInput, TouchableOpacity} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IMessageComposerProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * MessageComposer (native) — attach + multiline input + send, mirroring the\n * app's chat input bar (RN TextInput + TouchableOpacity, library Icon).\n */\nexport function MessageComposer(rawProps: IMessageComposerProps) {\n const props = useComponentDefaults<IMessageComposerProps>(\"MessageComposer\", rawProps).mergedProps;\n const {value, onChangeText, onSend, onAttach, placeholder = \"Message…\", sendDisabled, accentColor = \"brand\", locked, lockedLabel, attachDisabled, attachHint, onSelectionChange, selection, inputRef, testID} = props;\n\n const accent = resolveThemeTokenForNative(accentColor);\n const surface = resolveThemeTokenForNative(\"surface-card\");\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fieldBg = resolveThemeTokenForNative(\"gray.100\");\n const textColor = resolveThemeTokenForNative(\"text\");\n const muted = resolveThemeTokenForNative(\"text-secondary\");\n const disabledBg = resolveThemeTokenForNative(\"gray.300\");\n\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. These render RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural box — and NotoKufiArabic's is too short for its\n * own ascenders. In an RTL script that does not read as clipping, it reads\n * as a BAD TRANSLATION: ش/س, غ/ع and ة/ه differ only by marks above the\n * baseline. Both are undefined in LTR, so no English layout moves.\n *\n * ⚠️ THE INPUT ITSELF IS DELIBERATELY NOT TOUCHED. The TextInput below is\n * fontSize 14 with no lineHeight for the same reason, but it also carries\n * a hand-tuned single-line height floor and a comment about a two-frame\n * re-measure. Giving it a taller line box without being able to TYPE\n * Arabic into it and watch the field settle would be guessing at the one\n * control a person uses most. Recorded, not changed.\n */\n const rtlLockedLine = useRtlLineHeight(undefined, 13);\n const rtlHintLine = useRtlLineHeight(undefined, 11);\n\n if (locked) {\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n <View\n style={{\n flexGrow: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n backgroundColor: fieldBg,\n borderWidth: 1,\n borderColor: border,\n borderRadius: 999,\n paddingHorizontal: 16,\n paddingVertical: 11,\n }}\n >\n <Icon name=\"lock\" size={17} color={muted} />\n {lockedLabel != null && <Text style={{fontSize: 13, color: muted, ...(rtlLockedLine != null ? {lineHeight: rtlLockedLine} : {})}}>{lockedLabel}</Text>}\n </View>\n </View>\n );\n }\n\n const canSend = sendDisabled != null ? !sendDisabled : value.trim().length > 0;\n\n // Shared field + send (referenced by the default row AND the attach-disabled\n // branch — single source, so the input is never duplicated).\n //\n // onSelectionChange is adapted from RN's NativeSyntheticEvent shape to the\n // platform-agnostic {start, end} contract declared on IMessageComposerProps,\n // so consumers (e.g. @mention pickers) read the same shape on native and web.\n const field = (\n <TextInput\n ref={inputRef as React.Ref<TextInput>}\n style={{\n flex: 1,\n backgroundColor: fieldBg,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: 8,\n fontSize: 14,\n color: textColor,\n // Pin a single-line floor (= the 36px send button) so a\n // multiline RN TextInput doesn't measure a taller default on\n // frame 1 then settle on frame 2 — that re-measure re-flexes\n // the chat thread above it (a small shift-then-settle on open).\n // Still grows up to maxHeight when typing multiple lines.\n minHeight: 36,\n maxHeight: 120,\n }}\n placeholder={placeholder}\n placeholderTextColor={muted}\n value={value}\n onChangeText={onChangeText}\n selection={selection as {start: number; end?: number} | undefined}\n onSelectionChange={\n onSelectionChange\n ? e => onSelectionChange({start: e.nativeEvent.selection.start, end: e.nativeEvent.selection.end})\n : undefined\n }\n multiline\n />\n );\n\n const sendBtn = (\n <TouchableOpacity\n onPress={() => canSend && onSend?.()}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: canSend ? accent : disabledBg,\n }}\n >\n <Icon name=\"send\" size={18} color=\"#FFFFFF\" />\n </TouchableOpacity>\n );\n\n if (attachDisabled) {\n return (\n <View\n testID={testID}\n style={{\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {attachHint != null && (\n <View style={{flexDirection: \"row\", alignItems: \"center\", gap: 6, paddingHorizontal: 12, paddingBottom: 8}}>\n <Icon name=\"info\" size={12} color={muted} />\n <Text style={{fontSize: 11, color: muted, ...(rtlHintLine != null ? {lineHeight: rtlHintLine} : {})}}>{attachHint}</Text>\n </View>\n )}\n <View style={{flexDirection: \"row\", alignItems: \"flex-end\", gap: 8, paddingHorizontal: 12}}>\n {onAttach != null && (\n <View style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\", opacity: 0.5}}>\n <Icon name=\"paperclip\" size={20} color={muted} />\n </View>\n )}\n {field}\n {sendBtn}\n </View>\n </View>\n );\n }\n\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {onAttach != null && (\n <TouchableOpacity\n onPress={onAttach}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach\"\n style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\"}}\n >\n <Icon name=\"paperclip\" size={20} color={muted} />\n </TouchableOpacity>\n )}\n {field}\n {sendBtn}\n </View>\n );\n}\n\nexport default MessageComposer;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","useRtlLineHeight","jsx","View","jsxs","Icon","Text","TextInput","TouchableOpacity"],"mappings":"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"}
|
|
@@ -85,6 +85,7 @@ import useRtlLineHeight from '../../hooks/useRtlLineHeight.js';
|
|
|
85
85
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
86
86
|
import '../../contexts/DialogContext.js';
|
|
87
87
|
import '../../contexts/PermissionsContext.js';
|
|
88
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
88
89
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
89
90
|
|
|
90
91
|
function MessageComposer(rawProps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/MessageComposer/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {View, Text, TextInput, TouchableOpacity} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IMessageComposerProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * MessageComposer (native) — attach + multiline input + send, mirroring the\n * app's chat input bar (RN TextInput + TouchableOpacity, library Icon).\n */\nexport function MessageComposer(rawProps: IMessageComposerProps) {\n const props = useComponentDefaults<IMessageComposerProps>(\"MessageComposer\", rawProps).mergedProps;\n const {value, onChangeText, onSend, onAttach, placeholder = \"Message…\", sendDisabled, accentColor = \"brand\", locked, lockedLabel, attachDisabled, attachHint, onSelectionChange, selection, inputRef, testID} = props;\n\n const accent = resolveThemeTokenForNative(accentColor);\n const surface = resolveThemeTokenForNative(\"surface-card\");\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fieldBg = resolveThemeTokenForNative(\"gray.100\");\n const textColor = resolveThemeTokenForNative(\"text\");\n const muted = resolveThemeTokenForNative(\"text-secondary\");\n const disabledBg = resolveThemeTokenForNative(\"gray.300\");\n\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. These render RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural box — and NotoKufiArabic's is too short for its\n * own ascenders. In an RTL script that does not read as clipping, it reads\n * as a BAD TRANSLATION: ش/س, غ/ع and ة/ه differ only by marks above the\n * baseline. Both are undefined in LTR, so no English layout moves.\n *\n * ⚠️ THE INPUT ITSELF IS DELIBERATELY NOT TOUCHED. The TextInput below is\n * fontSize 14 with no lineHeight for the same reason, but it also carries\n * a hand-tuned single-line height floor and a comment about a two-frame\n * re-measure. Giving it a taller line box without being able to TYPE\n * Arabic into it and watch the field settle would be guessing at the one\n * control a person uses most. Recorded, not changed.\n */\n const rtlLockedLine = useRtlLineHeight(undefined, 13);\n const rtlHintLine = useRtlLineHeight(undefined, 11);\n\n if (locked) {\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n <View\n style={{\n flexGrow: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n backgroundColor: fieldBg,\n borderWidth: 1,\n borderColor: border,\n borderRadius: 999,\n paddingHorizontal: 16,\n paddingVertical: 11,\n }}\n >\n <Icon name=\"lock\" size={17} color={muted} />\n {lockedLabel != null && <Text style={{fontSize: 13, color: muted, ...(rtlLockedLine != null ? {lineHeight: rtlLockedLine} : {})}}>{lockedLabel}</Text>}\n </View>\n </View>\n );\n }\n\n const canSend = sendDisabled != null ? !sendDisabled : value.trim().length > 0;\n\n // Shared field + send (referenced by the default row AND the attach-disabled\n // branch — single source, so the input is never duplicated).\n //\n // onSelectionChange is adapted from RN's NativeSyntheticEvent shape to the\n // platform-agnostic {start, end} contract declared on IMessageComposerProps,\n // so consumers (e.g. @mention pickers) read the same shape on native and web.\n const field = (\n <TextInput\n ref={inputRef as React.Ref<TextInput>}\n style={{\n flex: 1,\n backgroundColor: fieldBg,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: 8,\n fontSize: 14,\n color: textColor,\n // Pin a single-line floor (= the 36px send button) so a\n // multiline RN TextInput doesn't measure a taller default on\n // frame 1 then settle on frame 2 — that re-measure re-flexes\n // the chat thread above it (a small shift-then-settle on open).\n // Still grows up to maxHeight when typing multiple lines.\n minHeight: 36,\n maxHeight: 120,\n }}\n placeholder={placeholder}\n placeholderTextColor={muted}\n value={value}\n onChangeText={onChangeText}\n selection={selection as {start: number; end?: number} | undefined}\n onSelectionChange={\n onSelectionChange\n ? e => onSelectionChange({start: e.nativeEvent.selection.start, end: e.nativeEvent.selection.end})\n : undefined\n }\n multiline\n />\n );\n\n const sendBtn = (\n <TouchableOpacity\n onPress={() => canSend && onSend?.()}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: canSend ? accent : disabledBg,\n }}\n >\n <Icon name=\"send\" size={18} color=\"#FFFFFF\" />\n </TouchableOpacity>\n );\n\n if (attachDisabled) {\n return (\n <View\n testID={testID}\n style={{\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {attachHint != null && (\n <View style={{flexDirection: \"row\", alignItems: \"center\", gap: 6, paddingHorizontal: 12, paddingBottom: 8}}>\n <Icon name=\"info\" size={12} color={muted} />\n <Text style={{fontSize: 11, color: muted, ...(rtlHintLine != null ? {lineHeight: rtlHintLine} : {})}}>{attachHint}</Text>\n </View>\n )}\n <View style={{flexDirection: \"row\", alignItems: \"flex-end\", gap: 8, paddingHorizontal: 12}}>\n {onAttach != null && (\n <View style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\", opacity: 0.5}}>\n <Icon name=\"paperclip\" size={20} color={muted} />\n </View>\n )}\n {field}\n {sendBtn}\n </View>\n </View>\n );\n }\n\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {onAttach != null && (\n <TouchableOpacity\n onPress={onAttach}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach\"\n style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\"}}\n >\n <Icon name=\"paperclip\" size={20} color={muted} />\n </TouchableOpacity>\n )}\n {field}\n {sendBtn}\n </View>\n );\n}\n\nexport default MessageComposer;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/MessageComposer/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {View, Text, TextInput, TouchableOpacity} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport useRtlLineHeight from \"../../hooks/useRtlLineHeight\";\nimport type {IMessageComposerProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/**\n * MessageComposer (native) — attach + multiline input + send, mirroring the\n * app's chat input bar (RN TextInput + TouchableOpacity, library Icon).\n */\nexport function MessageComposer(rawProps: IMessageComposerProps) {\n const props = useComponentDefaults<IMessageComposerProps>(\"MessageComposer\", rawProps).mergedProps;\n const {value, onChangeText, onSend, onAttach, placeholder = \"Message…\", sendDisabled, accentColor = \"brand\", locked, lockedLabel, attachDisabled, attachHint, onSelectionChange, selection, inputRef, testID} = props;\n\n const accent = resolveThemeTokenForNative(accentColor);\n const surface = resolveThemeTokenForNative(\"surface-card\");\n const border = resolveThemeTokenForNative(\"surface-border\");\n const fieldBg = resolveThemeTokenForNative(\"gray.100\");\n const textColor = resolveThemeTokenForNative(\"text\");\n const muted = resolveThemeTokenForNative(\"text-secondary\");\n const disabledBg = resolveThemeTokenForNative(\"gray.300\");\n\n /*\n * ⛔ ARABIC CLIPS WITHOUT AN EXPLICIT LINE BOX. These render RAW\n * react-native <Text> with a fontSize and no lineHeight, so React Native\n * uses the FONT'S natural box — and NotoKufiArabic's is too short for its\n * own ascenders. In an RTL script that does not read as clipping, it reads\n * as a BAD TRANSLATION: ش/س, غ/ع and ة/ه differ only by marks above the\n * baseline. Both are undefined in LTR, so no English layout moves.\n *\n * ⚠️ THE INPUT ITSELF IS DELIBERATELY NOT TOUCHED. The TextInput below is\n * fontSize 14 with no lineHeight for the same reason, but it also carries\n * a hand-tuned single-line height floor and a comment about a two-frame\n * re-measure. Giving it a taller line box without being able to TYPE\n * Arabic into it and watch the field settle would be guessing at the one\n * control a person uses most. Recorded, not changed.\n */\n const rtlLockedLine = useRtlLineHeight(undefined, 13);\n const rtlHintLine = useRtlLineHeight(undefined, 11);\n\n if (locked) {\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n <View\n style={{\n flexGrow: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n backgroundColor: fieldBg,\n borderWidth: 1,\n borderColor: border,\n borderRadius: 999,\n paddingHorizontal: 16,\n paddingVertical: 11,\n }}\n >\n <Icon name=\"lock\" size={17} color={muted} />\n {lockedLabel != null && <Text style={{fontSize: 13, color: muted, ...(rtlLockedLine != null ? {lineHeight: rtlLockedLine} : {})}}>{lockedLabel}</Text>}\n </View>\n </View>\n );\n }\n\n const canSend = sendDisabled != null ? !sendDisabled : value.trim().length > 0;\n\n // Shared field + send (referenced by the default row AND the attach-disabled\n // branch — single source, so the input is never duplicated).\n //\n // onSelectionChange is adapted from RN's NativeSyntheticEvent shape to the\n // platform-agnostic {start, end} contract declared on IMessageComposerProps,\n // so consumers (e.g. @mention pickers) read the same shape on native and web.\n const field = (\n <TextInput\n ref={inputRef as React.Ref<TextInput>}\n style={{\n flex: 1,\n backgroundColor: fieldBg,\n borderRadius: 20,\n paddingHorizontal: 14,\n paddingVertical: 8,\n fontSize: 14,\n color: textColor,\n // Pin a single-line floor (= the 36px send button) so a\n // multiline RN TextInput doesn't measure a taller default on\n // frame 1 then settle on frame 2 — that re-measure re-flexes\n // the chat thread above it (a small shift-then-settle on open).\n // Still grows up to maxHeight when typing multiple lines.\n minHeight: 36,\n maxHeight: 120,\n }}\n placeholder={placeholder}\n placeholderTextColor={muted}\n value={value}\n onChangeText={onChangeText}\n selection={selection as {start: number; end?: number} | undefined}\n onSelectionChange={\n onSelectionChange\n ? e => onSelectionChange({start: e.nativeEvent.selection.start, end: e.nativeEvent.selection.end})\n : undefined\n }\n multiline\n />\n );\n\n const sendBtn = (\n <TouchableOpacity\n onPress={() => canSend && onSend?.()}\n disabled={!canSend}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: canSend ? accent : disabledBg,\n }}\n >\n <Icon name=\"send\" size={18} color=\"#FFFFFF\" />\n </TouchableOpacity>\n );\n\n if (attachDisabled) {\n return (\n <View\n testID={testID}\n style={{\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {attachHint != null && (\n <View style={{flexDirection: \"row\", alignItems: \"center\", gap: 6, paddingHorizontal: 12, paddingBottom: 8}}>\n <Icon name=\"info\" size={12} color={muted} />\n <Text style={{fontSize: 11, color: muted, ...(rtlHintLine != null ? {lineHeight: rtlHintLine} : {})}}>{attachHint}</Text>\n </View>\n )}\n <View style={{flexDirection: \"row\", alignItems: \"flex-end\", gap: 8, paddingHorizontal: 12}}>\n {onAttach != null && (\n <View style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\", opacity: 0.5}}>\n <Icon name=\"paperclip\" size={20} color={muted} />\n </View>\n )}\n {field}\n {sendBtn}\n </View>\n </View>\n );\n }\n\n return (\n <View\n testID={testID}\n style={{\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: surface,\n borderTopWidth: 1,\n borderTopColor: border,\n }}\n >\n {onAttach != null && (\n <TouchableOpacity\n onPress={onAttach}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach\"\n style={{width: 36, height: 36, alignItems: \"center\", justifyContent: \"center\"}}\n >\n <Icon name=\"paperclip\" size={20} color={muted} />\n </TouchableOpacity>\n )}\n {field}\n {sendBtn}\n </View>\n );\n}\n\nexport default MessageComposer;\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var index_native = require('../../primitives/Icon/index.cjs');
|
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
9
|
require('../../contexts/PermissionsContext.cjs');
|
|
10
|
+
require('../../contexts/BreadcrumbContext.cjs');
|
|
10
11
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
11
12
|
|
|
12
13
|
const ICON = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/MessageReceipt/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IMessageReceiptProps, MessageReceiptState} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst ICON: Record<MessageReceiptState, string> = {\n sent: \"check\",\n delivered: \"check-check\",\n seen: \"check-check\",\n failed: \"circle-alert\",\n};\n\n/**\n * MessageReceipt — outgoing-message delivery state: sent · delivered · seen ·\n * failed. Presentational and cross-platform (Icon + Text primitives, so it\n * renders identically on web and native). `label` is a resolved, already-\n * localized string supplied by the consumer — this primitive holds no copy.\n *\n * <MessageReceipt state=\"seen\" />\n * <MessageReceipt state=\"failed\" showLabel label=\"Not sent\" />\n */\nexport function MessageReceipt(rawProps: IMessageReceiptProps) {\n const props = useComponentDefaults<IMessageReceiptProps>(\"MessageReceipt\", rawProps).mergedProps;\n const {\n state,\n label,\n showLabel = false,\n color = \"text-secondary\",\n seenColor = \"brand\",\n failedColor = \"danger\",\n size = \"sm\",\n testID,\n ...rest\n } = props;\n\n const tone = state === \"seen\" ? seenColor : state === \"failed\" ? failedColor : color;\n const iconSize = size === \"md\" ? 16 : 14;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4} {...(rest as any)} {...a11y}>\n <Icon name={ICON[state]} size={iconSize} color={tone} />\n {showLabel && label != null && (\n <Text fontSize={size === \"md\" ? 12 : 11} fontWeight=\"600\" color={tone}>\n {label}\n </Text>\n )}\n </Box>\n );\n}\n\nexport default MessageReceipt;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/MessageReceipt/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IMessageReceiptProps, MessageReceiptState} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst ICON: Record<MessageReceiptState, string> = {\n sent: \"check\",\n delivered: \"check-check\",\n seen: \"check-check\",\n failed: \"circle-alert\",\n};\n\n/**\n * MessageReceipt — outgoing-message delivery state: sent · delivered · seen ·\n * failed. Presentational and cross-platform (Icon + Text primitives, so it\n * renders identically on web and native). `label` is a resolved, already-\n * localized string supplied by the consumer — this primitive holds no copy.\n *\n * <MessageReceipt state=\"seen\" />\n * <MessageReceipt state=\"failed\" showLabel label=\"Not sent\" />\n */\nexport function MessageReceipt(rawProps: IMessageReceiptProps) {\n const props = useComponentDefaults<IMessageReceiptProps>(\"MessageReceipt\", rawProps).mergedProps;\n const {\n state,\n label,\n showLabel = false,\n color = \"text-secondary\",\n seenColor = \"brand\",\n failedColor = \"danger\",\n size = \"sm\",\n testID,\n ...rest\n } = props;\n\n const tone = state === \"seen\" ? seenColor : state === \"failed\" ? failedColor : color;\n const iconSize = size === \"md\" ? 16 : 14;\n const a11y = testID ? ({testID, \"data-testid\": testID} as any) : {};\n\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={4} {...(rest as any)} {...a11y}>\n <Icon name={ICON[state]} size={iconSize} color={tone} />\n {showLabel && label != null && (\n <Text fontSize={size === \"md\" ? 12 : 11} fontWeight=\"600\" color={tone}>\n {label}\n </Text>\n )}\n </Box>\n );\n}\n\nexport default MessageReceipt;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Icon","Text"],"mappings":";;;;;;;;;;;;AAKA,MAAM,IAAA,GAA4C;AAAA,EAC9C,IAAA,EAAM,OAAA;AAAA,EACN,SAAA,EAAW,aAAA;AAAA,EACX,IAAA,EAAM,aAAA;AAAA,EACN,MAAA,EAAQ;AACZ,CAAA;AAWO,SAAS,eAAe,QAAA,EAAgC;AAC3D,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAA2C,gBAAA,EAAkB,QAAQ,CAAA,CAAE,WAAA;AACrF,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA,GAAQ,gBAAA;AAAA,IACR,SAAA,GAAY,OAAA;AAAA,IACZ,WAAA,GAAc,QAAA;AAAA,IACd,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,GAAG;AAAA,GACP,GAAI,KAAA;AAEJ,EAAA,MAAM,OAAO,KAAA,KAAU,MAAA,GAAS,SAAA,GAAY,KAAA,KAAU,WAAW,WAAA,GAAc,KAAA;AAC/E,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA;AACtC,EAAA,MAAM,OAAO,MAAA,GAAU,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAkB,EAAC;AAElE,EAAA,uBACIC,eAAA,CAACC,aAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,UAAA,EAAW,QAAA,EAAS,GAAA,EAAK,CAAA,EAAI,GAAI,IAAA,EAAe,GAAG,IAAA,EACxE,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,iBAAA,EAAA,EAAK,MAAM,IAAA,CAAK,KAAK,GAAG,IAAA,EAAM,QAAA,EAAU,OAAO,IAAA,EAAM,CAAA;AAAA,IACrD,SAAA,IAAa,KAAA,IAAS,IAAA,oBACnBD,cAAA,CAACE,0BAAK,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA,EAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAO,MAC5D,QAAA,EAAA,KAAA,EACL;AAAA,GAAA,EAER,CAAA;AAER;;;;"}
|
|
@@ -5,6 +5,7 @@ import { Icon } from '../../primitives/Icon/index.js';
|
|
|
5
5
|
import 'react';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
7
|
import '../../contexts/PermissionsContext.js';
|
|
8
|
+
import '../../contexts/BreadcrumbContext.js';
|
|
8
9
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
9
10
|
|
|
10
11
|
const ICON = {
|