@lmb-it/kitsconcerto-native 0.1.274 → 0.1.276
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Avatar/index.cjs +1 -0
- package/components/Avatar/index.cjs.map +1 -1
- package/components/Avatar/index.js +1 -0
- package/components/Avatar/index.js.map +1 -1
- package/components/Banner/banner.cjs +1 -0
- package/components/Banner/banner.cjs.map +1 -1
- package/components/Banner/banner.js +1 -0
- package/components/Banner/banner.js.map +1 -1
- package/components/BottomTabBar/index.cjs +1 -0
- package/components/BottomTabBar/index.cjs.map +1 -1
- package/components/BottomTabBar/index.js +1 -0
- package/components/BottomTabBar/index.js.map +1 -1
- package/components/Button/Button.cjs +1 -0
- package/components/Button/Button.cjs.map +1 -1
- package/components/Button/Button.js +1 -0
- package/components/Button/Button.js.map +1 -1
- package/components/Carousel/index.cjs +1 -0
- package/components/Carousel/index.cjs.map +1 -1
- package/components/Carousel/index.js +1 -0
- package/components/Carousel/index.js.map +1 -1
- package/components/ChatBubble/index.cjs +1 -0
- package/components/ChatBubble/index.cjs.map +1 -1
- package/components/ChatBubble/index.js +1 -0
- package/components/ChatBubble/index.js.map +1 -1
- package/components/Chip/index.cjs +1 -0
- package/components/Chip/index.cjs.map +1 -1
- package/components/Chip/index.js +1 -0
- package/components/Chip/index.js.map +1 -1
- package/components/DateSeparator/index.cjs +1 -0
- package/components/DateSeparator/index.cjs.map +1 -1
- package/components/DateSeparator/index.js +1 -0
- package/components/DateSeparator/index.js.map +1 -1
- package/components/DetailsList/index.cjs +1 -0
- package/components/DetailsList/index.cjs.map +1 -1
- package/components/DetailsList/index.js +1 -0
- package/components/DetailsList/index.js.map +1 -1
- package/components/EmptyState/index.cjs +1 -0
- package/components/EmptyState/index.cjs.map +1 -1
- package/components/EmptyState/index.js +1 -0
- package/components/EmptyState/index.js.map +1 -1
- package/components/Gallery/index.cjs +1 -0
- package/components/Gallery/index.cjs.map +1 -1
- package/components/Gallery/index.js +1 -0
- package/components/Gallery/index.js.map +1 -1
- package/components/MessageComposer/index.cjs +1 -0
- package/components/MessageComposer/index.cjs.map +1 -1
- package/components/MessageComposer/index.js +1 -0
- package/components/MessageComposer/index.js.map +1 -1
- package/components/MessageReceipt/index.cjs +1 -0
- package/components/MessageReceipt/index.cjs.map +1 -1
- package/components/MessageReceipt/index.js +1 -0
- package/components/MessageReceipt/index.js.map +1 -1
- package/components/ProgressBar/index.cjs +1 -0
- package/components/ProgressBar/index.cjs.map +1 -1
- package/components/ProgressBar/index.js +1 -0
- package/components/ProgressBar/index.js.map +1 -1
- package/components/SegmentedControl/index.cjs +1 -0
- package/components/SegmentedControl/index.cjs.map +1 -1
- package/components/SegmentedControl/index.js +1 -0
- package/components/SegmentedControl/index.js.map +1 -1
- package/components/StatCard/index.cjs +1 -0
- package/components/StatCard/index.cjs.map +1 -1
- package/components/StatCard/index.js +1 -0
- package/components/StatCard/index.js.map +1 -1
- package/components/Stepper/index.cjs +1 -0
- package/components/Stepper/index.cjs.map +1 -1
- package/components/Stepper/index.js +1 -0
- package/components/Stepper/index.js.map +1 -1
- package/components/Tabs/index.cjs +1 -0
- package/components/Tabs/index.cjs.map +1 -1
- package/components/Tabs/index.js +1 -0
- package/components/Tabs/index.js.map +1 -1
- package/components/Timeline/index.cjs +1 -0
- package/components/Timeline/index.cjs.map +1 -1
- package/components/Timeline/index.js +1 -0
- package/components/Timeline/index.js.map +1 -1
- package/components/Translate/index.cjs +1 -0
- package/components/Translate/index.cjs.map +1 -1
- package/components/Translate/index.js +1 -0
- package/components/Translate/index.js.map +1 -1
- package/components/TypingIndicator/index.cjs +1 -0
- package/components/TypingIndicator/index.cjs.map +1 -1
- package/components/TypingIndicator/index.js +1 -0
- package/components/TypingIndicator/index.js.map +1 -1
- package/components/overlay/ConfirmDialog/index.cjs +1 -0
- package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
- package/components/overlay/ConfirmDialog/index.js +1 -0
- package/components/overlay/ConfirmDialog/index.js.map +1 -1
- package/components/overlay/Dialog/index.cjs +1 -0
- package/components/overlay/Dialog/index.cjs.map +1 -1
- package/components/overlay/Dialog/index.js +1 -0
- package/components/overlay/Dialog/index.js.map +1 -1
- package/contexts/PermissionsContext.cjs +2 -0
- package/contexts/PermissionsContext.cjs.map +1 -1
- package/contexts/PermissionsContext.js +3 -2
- package/contexts/PermissionsContext.js.map +1 -1
- package/form/controls/Checkbox/index.cjs +1 -0
- package/form/controls/Checkbox/index.cjs.map +1 -1
- package/form/controls/Checkbox/index.js +1 -0
- package/form/controls/Checkbox/index.js.map +1 -1
- package/form/controls/RadioButton/radio.cjs +1 -0
- package/form/controls/RadioButton/radio.cjs.map +1 -1
- package/form/controls/RadioButton/radio.js +1 -0
- package/form/controls/RadioButton/radio.js.map +1 -1
- package/form/controls/TriStateCheckbox/index.cjs +1 -0
- package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
- package/form/controls/TriStateCheckbox/index.js +1 -0
- package/form/controls/TriStateCheckbox/index.js.map +1 -1
- package/form/file-pickers/index.cjs +1 -0
- package/form/file-pickers/index.cjs.map +1 -1
- package/form/file-pickers/index.js +1 -0
- package/form/file-pickers/index.js.map +1 -1
- package/form/helpers/FormContainer/index.cjs +1 -0
- package/form/helpers/FormContainer/index.cjs.map +1 -1
- package/form/helpers/FormContainer/index.js +1 -0
- package/form/helpers/FormContainer/index.js.map +1 -1
- package/form/inputs/ColorPicker/index.cjs +1 -0
- package/form/inputs/ColorPicker/index.cjs.map +1 -1
- package/form/inputs/ColorPicker/index.js +1 -0
- package/form/inputs/ColorPicker/index.js.map +1 -1
- package/form/inputs/Datepicker/index.cjs +1 -0
- package/form/inputs/Datepicker/index.cjs.map +1 -1
- package/form/inputs/Datepicker/index.js +1 -0
- package/form/inputs/Datepicker/index.js.map +1 -1
- package/form/inputs/InputLocation/index.cjs +1 -0
- package/form/inputs/InputLocation/index.cjs.map +1 -1
- package/form/inputs/InputLocation/index.js +1 -0
- package/form/inputs/InputLocation/index.js.map +1 -1
- package/form/inputs/InputMask/index.cjs +1 -0
- package/form/inputs/InputMask/index.cjs.map +1 -1
- package/form/inputs/InputMask/index.js +1 -0
- package/form/inputs/InputMask/index.js.map +1 -1
- package/form/inputs/InputNumber/index.cjs +1 -0
- package/form/inputs/InputNumber/index.cjs.map +1 -1
- package/form/inputs/InputNumber/index.js +1 -0
- package/form/inputs/InputNumber/index.js.map +1 -1
- package/form/inputs/InputPassword/index.cjs +1 -0
- package/form/inputs/InputPassword/index.cjs.map +1 -1
- package/form/inputs/InputPassword/index.js +1 -0
- package/form/inputs/InputPassword/index.js.map +1 -1
- package/form/inputs/InputSwitch/index.cjs +1 -0
- package/form/inputs/InputSwitch/index.cjs.map +1 -1
- package/form/inputs/InputSwitch/index.js +1 -0
- package/form/inputs/InputSwitch/index.js.map +1 -1
- package/form/inputs/InputText/index.cjs +1 -0
- package/form/inputs/InputText/index.cjs.map +1 -1
- package/form/inputs/InputText/index.js +1 -0
- package/form/inputs/InputText/index.js.map +1 -1
- package/form/inputs/InputTextarea/index.cjs +1 -0
- package/form/inputs/InputTextarea/index.cjs.map +1 -1
- package/form/inputs/InputTextarea/index.js +1 -0
- package/form/inputs/InputTextarea/index.js.map +1 -1
- package/form/inputs/PhoneInput/index.cjs +1 -0
- package/form/inputs/PhoneInput/index.cjs.map +1 -1
- package/form/inputs/PhoneInput/index.js +1 -0
- package/form/inputs/PhoneInput/index.js.map +1 -1
- package/form/selects/AutoComplete/index.cjs +1 -0
- package/form/selects/AutoComplete/index.cjs.map +1 -1
- package/form/selects/AutoComplete/index.js +1 -0
- package/form/selects/AutoComplete/index.js.map +1 -1
- package/form/selects/CascadeSelect/index.cjs +1 -0
- package/form/selects/CascadeSelect/index.cjs.map +1 -1
- package/form/selects/CascadeSelect/index.js +1 -0
- package/form/selects/CascadeSelect/index.js.map +1 -1
- package/form/selects/Dropdown/index.cjs +1 -0
- package/form/selects/Dropdown/index.cjs.map +1 -1
- package/form/selects/Dropdown/index.js +1 -0
- package/form/selects/Dropdown/index.js.map +1 -1
- package/form/selects/ListBox/index.cjs +1 -0
- package/form/selects/ListBox/index.cjs.map +1 -1
- package/form/selects/ListBox/index.js +1 -0
- package/form/selects/ListBox/index.js.map +1 -1
- package/form/selects/MultiSelect/index.cjs +1 -0
- package/form/selects/MultiSelect/index.cjs.map +1 -1
- package/form/selects/MultiSelect/index.js +1 -0
- package/form/selects/MultiSelect/index.js.map +1 -1
- package/form/selects/TreeSelect/index.cjs +1 -0
- package/form/selects/TreeSelect/index.cjs.map +1 -1
- package/form/selects/TreeSelect/index.js +1 -0
- package/form/selects/TreeSelect/index.js.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.cjs +1 -0
- package/form/selects/helpers/SelectPopupOverlay.cjs.map +1 -1
- package/form/selects/helpers/SelectPopupOverlay.js +1 -0
- package/form/selects/helpers/SelectPopupOverlay.js.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.cjs +1 -0
- package/form-renderer/components/fields/FileUploader/index.cjs.map +1 -1
- package/form-renderer/components/fields/FileUploader/index.js +1 -0
- package/form-renderer/components/fields/FileUploader/index.js.map +1 -1
- package/form-renderer/components/fields/Group/index.cjs +1 -0
- package/form-renderer/components/fields/Group/index.cjs.map +1 -1
- package/form-renderer/components/fields/Group/index.js +1 -0
- package/form-renderer/components/fields/Group/index.js.map +1 -1
- package/form-renderer/components/fields/Radios/index.cjs +1 -0
- package/form-renderer/components/fields/Radios/index.cjs.map +1 -1
- package/form-renderer/components/fields/Radios/index.js +1 -0
- package/form-renderer/components/fields/Radios/index.js.map +1 -1
- package/form-renderer/components/fields/Select/index.cjs +1 -0
- package/form-renderer/components/fields/Select/index.cjs.map +1 -1
- package/form-renderer/components/fields/Select/index.js +1 -0
- package/form-renderer/components/fields/Select/index.js.map +1 -1
- package/hooks/main.cjs +1 -0
- package/hooks/main.cjs.map +1 -1
- package/hooks/main.js +1 -0
- package/hooks/main.js.map +1 -1
- package/index.cjs +3 -0
- package/index.cjs.map +1 -1
- package/index.d.ts +14 -2
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/primitives/Card/index.cjs +1 -0
- package/primitives/Card/index.cjs.map +1 -1
- package/primitives/Card/index.js +1 -0
- package/primitives/Card/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","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":[],"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,GAAQ,oBAAA,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,uBACI,IAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,UAAA,EAAW,QAAA,EAAS,GAAA,EAAK,CAAA,EAAI,GAAI,IAAA,EAAe,GAAG,IAAA,EACxE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAM,IAAA,CAAK,KAAK,GAAG,IAAA,EAAM,QAAA,EAAU,OAAO,IAAA,EAAM,CAAA;AAAA,IACrD,SAAA,IAAa,KAAA,IAAS,IAAA,oBACnB,GAAA,CAAC,QAAK,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 @@ var index = require('../../primitives/Box/index.cjs');
|
|
|
5
5
|
var index_native = require('../../primitives/Text/index.cjs');
|
|
6
6
|
require('react');
|
|
7
7
|
require('../../contexts/DialogContext.cjs');
|
|
8
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
8
9
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
9
10
|
|
|
10
11
|
function clamp(n, min, max) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/ProgressBar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IProgressBarProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * ProgressBar — determinate linear progress.\n *\n * Cross-platform and presentational (Box + Text). Used for the verification\n * tier progress (\"2 of 6 approved · 67%\"), AI confidence, and upload progress.\n *\n * <ProgressBar value={67} />\n * <ProgressBar value={2} max={6} showLabel formatLabel={(v,m)=>`${v} of ${m}`} />\n */\nexport function ProgressBar(rawProps: IProgressBarProps) {\n const props = useComponentDefaults<IProgressBarProps>(\"ProgressBar\", rawProps).mergedProps;\n const {\n value,\n max = 100,\n color = \"brand\",\n trackColor = \"gray.200\",\n thickness = 8,\n rounded = true,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const safeMax = max <= 0 ? 100 : max;\n const pct = clamp((value / safeMax) * 100, 0, 100);\n const radius = rounded ? 999 : 0;\n\n const caption = showLabel ? (formatLabel ? formatLabel(value, safeMax, Math.round(pct)) : `${Math.round(pct)}%`) : null;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": value,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": safeMax,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption != null && (\n <Text fontSize={12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box width=\"100%\" height={thickness} borderRadius={radius} bgColor={trackColor} overflow=\"hidden\">\n <Box width={`${pct}%`} height=\"100%\" borderRadius={radius} bgColor={color} />\n </Box>\n </Box>\n );\n}\n\nexport default ProgressBar;\n"],"names":["useComponentDefaults","jsxs","Box","Text","jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/ProgressBar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IProgressBarProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * ProgressBar — determinate linear progress.\n *\n * Cross-platform and presentational (Box + Text). Used for the verification\n * tier progress (\"2 of 6 approved · 67%\"), AI confidence, and upload progress.\n *\n * <ProgressBar value={67} />\n * <ProgressBar value={2} max={6} showLabel formatLabel={(v,m)=>`${v} of ${m}`} />\n */\nexport function ProgressBar(rawProps: IProgressBarProps) {\n const props = useComponentDefaults<IProgressBarProps>(\"ProgressBar\", rawProps).mergedProps;\n const {\n value,\n max = 100,\n color = \"brand\",\n trackColor = \"gray.200\",\n thickness = 8,\n rounded = true,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const safeMax = max <= 0 ? 100 : max;\n const pct = clamp((value / safeMax) * 100, 0, 100);\n const radius = rounded ? 999 : 0;\n\n const caption = showLabel ? (formatLabel ? formatLabel(value, safeMax, Math.round(pct)) : `${Math.round(pct)}%`) : null;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": value,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": safeMax,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption != null && (\n <Text fontSize={12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box width=\"100%\" height={thickness} borderRadius={radius} bgColor={trackColor} overflow=\"hidden\">\n <Box width={`${pct}%`} height=\"100%\" borderRadius={radius} bgColor={color} />\n </Box>\n </Box>\n );\n}\n\nexport default ProgressBar;\n"],"names":["useComponentDefaults","jsxs","Box","Text","jsx"],"mappings":";;;;;;;;;;AAKA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACzC;AAWO,SAAS,YAAY,QAAA,EAA6B;AACrD,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAAwC,aAAA,EAAe,QAAQ,CAAA,CAAE,WAAA;AAC/E,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,GAAA,GAAM,GAAA;AAAA,IACN,KAAA,GAAQ,OAAA;AAAA,IACR,UAAA,GAAa,UAAA;AAAA,IACb,SAAA,GAAY,CAAA;AAAA,IACZ,OAAA,GAAU,IAAA;AAAA,IACV,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAG;AAAA,GACP,GAAI,KAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,GAAA;AACjC,EAAA,MAAM,MAAM,KAAA,CAAO,KAAA,GAAQ,OAAA,GAAW,GAAA,EAAK,GAAG,GAAG,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,UAAU,GAAA,GAAM,CAAA;AAE/B,EAAA,MAAM,UAAU,SAAA,GAAa,WAAA,GAAc,WAAA,CAAY,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,GAAO,IAAA;AAEnH,EAAA,MAAM,SAAA,GAAY;AAAA,IACd,IAAA,EAAM,aAAA;AAAA,IACN,eAAA,EAAiB,KAAA;AAAA,IACjB,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,OAAA;AAAA,IACjB,GAAI,MAAA,GAAS,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAU;AAAC,GACpD;AAEA,EAAA,uBACIC,eAAA,CAACC,iBAAI,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAAI,GAAI,IAAA,EAAe,GAAI,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,OAAA,IAAW,IAAA,mCACPC,oBAAA,EAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAM,gBAAA,EACtC,QAAA,EAAA,OAAA,EACL,CAAA;AAAA,oBAEJC,cAAA,CAACF,aAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,MAAA,EAAQ,WAAW,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS,QAAA,EACrF,yCAACA,aAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,MAAA,EAAO,QAAO,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,CAAA,EAC/E;AAAA,GAAA,EACJ,CAAA;AAER;;;;"}
|
|
@@ -3,6 +3,7 @@ import Box from '../../primitives/Box/index.js';
|
|
|
3
3
|
import Text from '../../primitives/Text/index.js';
|
|
4
4
|
import 'react';
|
|
5
5
|
import '../../contexts/DialogContext.js';
|
|
6
|
+
import '../../contexts/PermissionsContext.js';
|
|
6
7
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
7
8
|
|
|
8
9
|
function clamp(n, min, max) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/ProgressBar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IProgressBarProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * ProgressBar — determinate linear progress.\n *\n * Cross-platform and presentational (Box + Text). Used for the verification\n * tier progress (\"2 of 6 approved · 67%\"), AI confidence, and upload progress.\n *\n * <ProgressBar value={67} />\n * <ProgressBar value={2} max={6} showLabel formatLabel={(v,m)=>`${v} of ${m}`} />\n */\nexport function ProgressBar(rawProps: IProgressBarProps) {\n const props = useComponentDefaults<IProgressBarProps>(\"ProgressBar\", rawProps).mergedProps;\n const {\n value,\n max = 100,\n color = \"brand\",\n trackColor = \"gray.200\",\n thickness = 8,\n rounded = true,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const safeMax = max <= 0 ? 100 : max;\n const pct = clamp((value / safeMax) * 100, 0, 100);\n const radius = rounded ? 999 : 0;\n\n const caption = showLabel ? (formatLabel ? formatLabel(value, safeMax, Math.round(pct)) : `${Math.round(pct)}%`) : null;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": value,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": safeMax,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption != null && (\n <Text fontSize={12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box width=\"100%\" height={thickness} borderRadius={radius} bgColor={trackColor} overflow=\"hidden\">\n <Box width={`${pct}%`} height=\"100%\" borderRadius={radius} bgColor={color} />\n </Box>\n </Box>\n );\n}\n\nexport default ProgressBar;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/ProgressBar/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IProgressBarProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * ProgressBar — determinate linear progress.\n *\n * Cross-platform and presentational (Box + Text). Used for the verification\n * tier progress (\"2 of 6 approved · 67%\"), AI confidence, and upload progress.\n *\n * <ProgressBar value={67} />\n * <ProgressBar value={2} max={6} showLabel formatLabel={(v,m)=>`${v} of ${m}`} />\n */\nexport function ProgressBar(rawProps: IProgressBarProps) {\n const props = useComponentDefaults<IProgressBarProps>(\"ProgressBar\", rawProps).mergedProps;\n const {\n value,\n max = 100,\n color = \"brand\",\n trackColor = \"gray.200\",\n thickness = 8,\n rounded = true,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const safeMax = max <= 0 ? 100 : max;\n const pct = clamp((value / safeMax) * 100, 0, 100);\n const radius = rounded ? 999 : 0;\n\n const caption = showLabel ? (formatLabel ? formatLabel(value, safeMax, Math.round(pct)) : `${Math.round(pct)}%`) : null;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": value,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": safeMax,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption != null && (\n <Text fontSize={12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box width=\"100%\" height={thickness} borderRadius={radius} bgColor={trackColor} overflow=\"hidden\">\n <Box width={`${pct}%`} height=\"100%\" borderRadius={radius} bgColor={color} />\n </Box>\n </Box>\n );\n}\n\nexport default ProgressBar;\n"],"names":[],"mappings":";;;;;;;;AAKA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACzC;AAWO,SAAS,YAAY,QAAA,EAA6B;AACrD,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAwC,aAAA,EAAe,QAAQ,CAAA,CAAE,WAAA;AAC/E,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,GAAA,GAAM,GAAA;AAAA,IACN,KAAA,GAAQ,OAAA;AAAA,IACR,UAAA,GAAa,UAAA;AAAA,IACb,SAAA,GAAY,CAAA;AAAA,IACZ,OAAA,GAAU,IAAA;AAAA,IACV,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAG;AAAA,GACP,GAAI,KAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,GAAA;AACjC,EAAA,MAAM,MAAM,KAAA,CAAO,KAAA,GAAQ,OAAA,GAAW,GAAA,EAAK,GAAG,GAAG,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,UAAU,GAAA,GAAM,CAAA;AAE/B,EAAA,MAAM,UAAU,SAAA,GAAa,WAAA,GAAc,WAAA,CAAY,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA,CAAA,GAAO,IAAA;AAEnH,EAAA,MAAM,SAAA,GAAY;AAAA,IACd,IAAA,EAAM,aAAA;AAAA,IACN,eAAA,EAAiB,KAAA;AAAA,IACjB,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,OAAA;AAAA,IACjB,GAAI,MAAA,GAAS,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAU;AAAC,GACpD;AAEA,EAAA,uBACI,IAAA,CAAC,OAAI,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAAI,GAAI,IAAA,EAAe,GAAI,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,OAAA,IAAW,IAAA,wBACP,IAAA,EAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAM,gBAAA,EACtC,QAAA,EAAA,OAAA,EACL,CAAA;AAAA,oBAEJ,GAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,MAAA,EAAQ,WAAW,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,QAAA,EAAS,QAAA,EACrF,8BAAC,GAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,MAAA,EAAO,QAAO,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,CAAA,EAC/E;AAAA,GAAA,EACJ,CAAA;AAER;;;;"}
|
|
@@ -86,6 +86,7 @@ require('../../apps/mobile/src/Core/Input/index.cjs');
|
|
|
86
86
|
require('../../apps/mobile/src/Core/Input/Field.cjs');
|
|
87
87
|
require('../../apps/mobile/src/Core/Input/Slot.cjs');
|
|
88
88
|
require('../../contexts/DialogContext.cjs');
|
|
89
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
89
90
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
90
91
|
var KitsThemeProvider_native = require('../../contexts/Theme/KitsThemeProvider.cjs');
|
|
91
92
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/SegmentedControl/index.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport type {ISegmentedControlProps} from \"@lmb-it/kitsconcerto-types\";\nimport {ResponsiveElement, useSeparator} from \"../../factory\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\n\nconst SIZE_MAP = {\n sm: {height: 30, fontSize: 11, px: 8, py: 4, descSize: 9.5, gap: 2},\n md: {height: 36, fontSize: 12.5, px: 12, py: 6, descSize: 10.5, gap: 4},\n lg: {height: 44, fontSize: 14, px: 16, py: 10, descSize: 11, gap: 4},\n} as const;\n\nexport function SegmentedControl<V extends string | number = string>(rawProps: ISegmentedControlProps<V>) {\n const {mergedProps: props, themeStyle} = useComponentDefaults<ISegmentedControlProps<V>>(\n \"SegmentedControl\",\n rawProps as any,\n );\n\n const {\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = true,\n disabled,\n id,\n testID,\n ...rest\n } = props;\n\n const {cssProps, nativeProps} = useSeparator<HTMLDivElement>(rest as any);\n const {resolveToken} = useKitsTheme();\n const sizeConfig = SIZE_MAP[size] ?? SIZE_MAP.md;\n\n const trackBg = resolveToken(\"surface-ground\");\n const borderColor = resolveToken(\"surface-border\");\n const inactiveText = resolveToken(\"text-secondary\");\n\n const containerCss = useMemo(\n () => ({\n ...themeStyle,\n ...cssProps,\n display: \"inline-flex\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n gap: 2,\n padding: 2,\n backgroundColor: trackBg,\n border: `1px solid ${borderColor}`,\n borderRadius: 8,\n ...(fullWidth ? {width: \"100%\"} : {}),\n ...(disabled ? {opacity: \"0.55\", pointerEvents: \"none\" as const} : {}),\n }),\n [themeStyle, cssProps, trackBg, borderColor, fullWidth, disabled],\n );\n\n return (\n <ResponsiveElement\n as=\"Box\"\n //@ts-ignore\n cssProps={containerCss}\n nativeProps={{...nativeProps, id, \"data-testid\": testID, role: \"tablist\"}}\n additionalStyles={{}}\n >\n {options.map(opt => {\n const selected = opt.value === value;\n const isDisabled = disabled || opt.disabled;\n const accent = opt.color ? resolveToken(opt.color) : resolveToken(\"primary\");\n\n const buttonCss = {\n flex: fullWidth ? 1 : undefined,\n minHeight: sizeConfig.height,\n paddingLeft: sizeConfig.px,\n paddingRight: sizeConfig.px,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: 6,\n border: \"none\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n background: selected ? accent : \"transparent\",\n color: selected ? \"#FFFFFF\" : inactiveText,\n fontFamily: \"inherit\",\n fontWeight: \"700\",\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.1\",\n transition: \"background-color 0.15s, color 0.15s, box-shadow 0.15s\",\n boxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.06)\" : \"none\",\n outline: \"none\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: sizeConfig.gap,\n textAlign: \"center\" as const,\n };\n\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={isDisabled}\n onClick={() => !isDisabled && onChange(opt.value)}\n style={buttonCss as any}\n >\n <span style={{lineHeight: \"1.1\"}}>{opt.label}</span>\n {opt.description && (\n <span\n style={{\n fontSize: sizeConfig.descSize,\n fontWeight: 600,\n opacity: selected ? 0.85 : 0.7,\n }}\n >\n {opt.description}\n </span>\n )}\n </button>\n );\n })}\n </ResponsiveElement>\n );\n}\n\nexport default SegmentedControl;\n"],"names":["useComponentDefaults","useSeparator","useKitsTheme","useMemo","jsx","ResponsiveElement","jsxs"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/SegmentedControl/index.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport type {ISegmentedControlProps} from \"@lmb-it/kitsconcerto-types\";\nimport {ResponsiveElement, useSeparator} from \"../../factory\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\n\nconst SIZE_MAP = {\n sm: {height: 30, fontSize: 11, px: 8, py: 4, descSize: 9.5, gap: 2},\n md: {height: 36, fontSize: 12.5, px: 12, py: 6, descSize: 10.5, gap: 4},\n lg: {height: 44, fontSize: 14, px: 16, py: 10, descSize: 11, gap: 4},\n} as const;\n\nexport function SegmentedControl<V extends string | number = string>(rawProps: ISegmentedControlProps<V>) {\n const {mergedProps: props, themeStyle} = useComponentDefaults<ISegmentedControlProps<V>>(\n \"SegmentedControl\",\n rawProps as any,\n );\n\n const {\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = true,\n disabled,\n id,\n testID,\n ...rest\n } = props;\n\n const {cssProps, nativeProps} = useSeparator<HTMLDivElement>(rest as any);\n const {resolveToken} = useKitsTheme();\n const sizeConfig = SIZE_MAP[size] ?? SIZE_MAP.md;\n\n const trackBg = resolveToken(\"surface-ground\");\n const borderColor = resolveToken(\"surface-border\");\n const inactiveText = resolveToken(\"text-secondary\");\n\n const containerCss = useMemo(\n () => ({\n ...themeStyle,\n ...cssProps,\n display: \"inline-flex\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n gap: 2,\n padding: 2,\n backgroundColor: trackBg,\n border: `1px solid ${borderColor}`,\n borderRadius: 8,\n ...(fullWidth ? {width: \"100%\"} : {}),\n ...(disabled ? {opacity: \"0.55\", pointerEvents: \"none\" as const} : {}),\n }),\n [themeStyle, cssProps, trackBg, borderColor, fullWidth, disabled],\n );\n\n return (\n <ResponsiveElement\n as=\"Box\"\n //@ts-ignore\n cssProps={containerCss}\n nativeProps={{...nativeProps, id, \"data-testid\": testID, role: \"tablist\"}}\n additionalStyles={{}}\n >\n {options.map(opt => {\n const selected = opt.value === value;\n const isDisabled = disabled || opt.disabled;\n const accent = opt.color ? resolveToken(opt.color) : resolveToken(\"primary\");\n\n const buttonCss = {\n flex: fullWidth ? 1 : undefined,\n minHeight: sizeConfig.height,\n paddingLeft: sizeConfig.px,\n paddingRight: sizeConfig.px,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: 6,\n border: \"none\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n background: selected ? accent : \"transparent\",\n color: selected ? \"#FFFFFF\" : inactiveText,\n fontFamily: \"inherit\",\n fontWeight: \"700\",\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.1\",\n transition: \"background-color 0.15s, color 0.15s, box-shadow 0.15s\",\n boxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.06)\" : \"none\",\n outline: \"none\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: sizeConfig.gap,\n textAlign: \"center\" as const,\n };\n\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={isDisabled}\n onClick={() => !isDisabled && onChange(opt.value)}\n style={buttonCss as any}\n >\n <span style={{lineHeight: \"1.1\"}}>{opt.label}</span>\n {opt.description && (\n <span\n style={{\n fontSize: sizeConfig.descSize,\n fontWeight: 600,\n opacity: selected ? 0.85 : 0.7,\n }}\n >\n {opt.description}\n </span>\n )}\n </button>\n );\n })}\n </ResponsiveElement>\n );\n}\n\nexport default SegmentedControl;\n"],"names":["useComponentDefaults","useSeparator","useKitsTheme","useMemo","jsx","ResponsiveElement","jsxs"],"mappings":"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"}
|
|
@@ -82,6 +82,7 @@ import '../../apps/mobile/src/Core/Input/index.js';
|
|
|
82
82
|
import '../../apps/mobile/src/Core/Input/Field.js';
|
|
83
83
|
import '../../apps/mobile/src/Core/Input/Slot.js';
|
|
84
84
|
import '../../contexts/DialogContext.js';
|
|
85
|
+
import '../../contexts/PermissionsContext.js';
|
|
85
86
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
86
87
|
import { useKitsTheme } from '../../contexts/Theme/KitsThemeProvider.js';
|
|
87
88
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/SegmentedControl/index.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport type {ISegmentedControlProps} from \"@lmb-it/kitsconcerto-types\";\nimport {ResponsiveElement, useSeparator} from \"../../factory\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\n\nconst SIZE_MAP = {\n sm: {height: 30, fontSize: 11, px: 8, py: 4, descSize: 9.5, gap: 2},\n md: {height: 36, fontSize: 12.5, px: 12, py: 6, descSize: 10.5, gap: 4},\n lg: {height: 44, fontSize: 14, px: 16, py: 10, descSize: 11, gap: 4},\n} as const;\n\nexport function SegmentedControl<V extends string | number = string>(rawProps: ISegmentedControlProps<V>) {\n const {mergedProps: props, themeStyle} = useComponentDefaults<ISegmentedControlProps<V>>(\n \"SegmentedControl\",\n rawProps as any,\n );\n\n const {\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = true,\n disabled,\n id,\n testID,\n ...rest\n } = props;\n\n const {cssProps, nativeProps} = useSeparator<HTMLDivElement>(rest as any);\n const {resolveToken} = useKitsTheme();\n const sizeConfig = SIZE_MAP[size] ?? SIZE_MAP.md;\n\n const trackBg = resolveToken(\"surface-ground\");\n const borderColor = resolveToken(\"surface-border\");\n const inactiveText = resolveToken(\"text-secondary\");\n\n const containerCss = useMemo(\n () => ({\n ...themeStyle,\n ...cssProps,\n display: \"inline-flex\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n gap: 2,\n padding: 2,\n backgroundColor: trackBg,\n border: `1px solid ${borderColor}`,\n borderRadius: 8,\n ...(fullWidth ? {width: \"100%\"} : {}),\n ...(disabled ? {opacity: \"0.55\", pointerEvents: \"none\" as const} : {}),\n }),\n [themeStyle, cssProps, trackBg, borderColor, fullWidth, disabled],\n );\n\n return (\n <ResponsiveElement\n as=\"Box\"\n //@ts-ignore\n cssProps={containerCss}\n nativeProps={{...nativeProps, id, \"data-testid\": testID, role: \"tablist\"}}\n additionalStyles={{}}\n >\n {options.map(opt => {\n const selected = opt.value === value;\n const isDisabled = disabled || opt.disabled;\n const accent = opt.color ? resolveToken(opt.color) : resolveToken(\"primary\");\n\n const buttonCss = {\n flex: fullWidth ? 1 : undefined,\n minHeight: sizeConfig.height,\n paddingLeft: sizeConfig.px,\n paddingRight: sizeConfig.px,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: 6,\n border: \"none\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n background: selected ? accent : \"transparent\",\n color: selected ? \"#FFFFFF\" : inactiveText,\n fontFamily: \"inherit\",\n fontWeight: \"700\",\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.1\",\n transition: \"background-color 0.15s, color 0.15s, box-shadow 0.15s\",\n boxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.06)\" : \"none\",\n outline: \"none\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: sizeConfig.gap,\n textAlign: \"center\" as const,\n };\n\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={isDisabled}\n onClick={() => !isDisabled && onChange(opt.value)}\n style={buttonCss as any}\n >\n <span style={{lineHeight: \"1.1\"}}>{opt.label}</span>\n {opt.description && (\n <span\n style={{\n fontSize: sizeConfig.descSize,\n fontWeight: 600,\n opacity: selected ? 0.85 : 0.7,\n }}\n >\n {opt.description}\n </span>\n )}\n </button>\n );\n })}\n </ResponsiveElement>\n );\n}\n\nexport default SegmentedControl;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/SegmentedControl/index.tsx"],"sourcesContent":["import React, {useMemo} from \"react\";\nimport type {ISegmentedControlProps} from \"@lmb-it/kitsconcerto-types\";\nimport {ResponsiveElement, useSeparator} from \"../../factory\";\nimport {useComponentDefaults} from \"../../hooks\";\nimport {useKitsTheme} from \"../../contexts/Theme\";\n\nconst SIZE_MAP = {\n sm: {height: 30, fontSize: 11, px: 8, py: 4, descSize: 9.5, gap: 2},\n md: {height: 36, fontSize: 12.5, px: 12, py: 6, descSize: 10.5, gap: 4},\n lg: {height: 44, fontSize: 14, px: 16, py: 10, descSize: 11, gap: 4},\n} as const;\n\nexport function SegmentedControl<V extends string | number = string>(rawProps: ISegmentedControlProps<V>) {\n const {mergedProps: props, themeStyle} = useComponentDefaults<ISegmentedControlProps<V>>(\n \"SegmentedControl\",\n rawProps as any,\n );\n\n const {\n options,\n value,\n onChange,\n size = \"md\",\n fullWidth = true,\n disabled,\n id,\n testID,\n ...rest\n } = props;\n\n const {cssProps, nativeProps} = useSeparator<HTMLDivElement>(rest as any);\n const {resolveToken} = useKitsTheme();\n const sizeConfig = SIZE_MAP[size] ?? SIZE_MAP.md;\n\n const trackBg = resolveToken(\"surface-ground\");\n const borderColor = resolveToken(\"surface-border\");\n const inactiveText = resolveToken(\"text-secondary\");\n\n const containerCss = useMemo(\n () => ({\n ...themeStyle,\n ...cssProps,\n display: \"inline-flex\" as const,\n flexDirection: \"row\" as const,\n alignItems: \"stretch\" as const,\n gap: 2,\n padding: 2,\n backgroundColor: trackBg,\n border: `1px solid ${borderColor}`,\n borderRadius: 8,\n ...(fullWidth ? {width: \"100%\"} : {}),\n ...(disabled ? {opacity: \"0.55\", pointerEvents: \"none\" as const} : {}),\n }),\n [themeStyle, cssProps, trackBg, borderColor, fullWidth, disabled],\n );\n\n return (\n <ResponsiveElement\n as=\"Box\"\n //@ts-ignore\n cssProps={containerCss}\n nativeProps={{...nativeProps, id, \"data-testid\": testID, role: \"tablist\"}}\n additionalStyles={{}}\n >\n {options.map(opt => {\n const selected = opt.value === value;\n const isDisabled = disabled || opt.disabled;\n const accent = opt.color ? resolveToken(opt.color) : resolveToken(\"primary\");\n\n const buttonCss = {\n flex: fullWidth ? 1 : undefined,\n minHeight: sizeConfig.height,\n paddingLeft: sizeConfig.px,\n paddingRight: sizeConfig.px,\n paddingTop: sizeConfig.py,\n paddingBottom: sizeConfig.py,\n borderRadius: 6,\n border: \"none\",\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n background: selected ? accent : \"transparent\",\n color: selected ? \"#FFFFFF\" : inactiveText,\n fontFamily: \"inherit\",\n fontWeight: \"700\",\n fontSize: sizeConfig.fontSize,\n lineHeight: \"1.1\",\n transition: \"background-color 0.15s, color 0.15s, box-shadow 0.15s\",\n boxShadow: selected ? \"0 1px 2px rgba(0,0,0,0.06)\" : \"none\",\n outline: \"none\",\n display: \"flex\",\n flexDirection: \"column\" as const,\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: sizeConfig.gap,\n textAlign: \"center\" as const,\n };\n\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n disabled={isDisabled}\n onClick={() => !isDisabled && onChange(opt.value)}\n style={buttonCss as any}\n >\n <span style={{lineHeight: \"1.1\"}}>{opt.label}</span>\n {opt.description && (\n <span\n style={{\n fontSize: sizeConfig.descSize,\n fontWeight: 600,\n opacity: selected ? 0.85 : 0.7,\n }}\n >\n {opt.description}\n </span>\n )}\n </button>\n );\n })}\n </ResponsiveElement>\n );\n}\n\nexport default SegmentedControl;\n"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var index = require('../../primitives/Box/index.cjs');
|
|
|
6
6
|
var index_native = require('../../primitives/Text/index.cjs');
|
|
7
7
|
var index_native$1 = require('../../primitives/Icon/index.cjs');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
9
10
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
10
11
|
|
|
11
12
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Text","Icon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":["useComponentDefaults","jsxs","Box","jsx","Text","Icon"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import Box from '../../primitives/Box/index.js';
|
|
|
4
4
|
import Text from '../../primitives/Text/index.js';
|
|
5
5
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
|
+
import '../../contexts/PermissionsContext.js';
|
|
7
8
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
8
9
|
|
|
9
10
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/StatCard/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStatCardProps, IStatGroupProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\nconst SIZE = {\n sm: {value: 16, label: 11, eyebrow: 9, hint: 10, pad: 10, icon: 14, gap: 2},\n md: {value: 20, label: 12, eyebrow: 10, hint: 11, pad: 12, icon: 16, gap: 3},\n} as const;\n\n/**\n * StatCard — a single KPI / metric tile (value + label, optional icon, hint,\n * eyebrow, and an accent \"highlighted\" treatment for featured tiles).\n *\n * Cross-platform and presentational (Box + Text + Icon). Pair several inside a\n * `StatGroup` to build the metric strips on the profile / career / portfolio\n * hubs (Earnings · Rating · Jobs · Tier).\n *\n * <StatCard value=\"128\" label=\"Jobs done\" />\n * <StatCard value=\"4.9\" label=\"Rating\" icon=\"star\" hint=\"128 reviews\" />\n * <StatCard value=\"Tier 2\" label=\"Verified\" icon=\"shield\" highlighted />\n */\nexport function StatCard(rawProps: IStatCardProps) {\n const props = useComponentDefaults<IStatCardProps>(\"StatCard\", rawProps).mergedProps;\n const {\n value,\n label,\n eyebrow,\n hint,\n icon,\n highlighted = false,\n accentColor = \"brand\",\n variant = \"card\",\n size = \"md\",\n align = \"left\",\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const isCard = variant === \"card\";\n const center = align === \"center\";\n const valueColor = highlighted ? accentColor : \"text\";\n\n const containerProps = isCard\n ? {\n padding: cfg.pad,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: highlighted ? accentColor : \"border\",\n bgColor: \"surface-card\",\n }\n : {};\n\n const a11yProps = {\n role: \"group\",\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n return (\n <Box\n flexDirection=\"column\"\n alignItems={center ? \"center\" : \"flex-start\"}\n gap={cfg.gap}\n {...containerProps}\n {...(rest as any)}\n {...(a11yProps as any)}\n >\n {eyebrow != null && (\n <Text fontSize={cfg.eyebrow} fontWeight=\"700\" color=\"text-secondary\" textTransform=\"uppercase\">\n {eyebrow}\n </Text>\n )}\n\n <Box flexDirection=\"row\" alignItems=\"center\" gap={5}>\n {icon != null && <Icon name={icon as never} size={cfg.icon} color={accentColor} />}\n <Text fontSize={cfg.value} fontWeight=\"800\" color={valueColor}>\n {value}\n </Text>\n </Box>\n\n {label != null && (\n <Text fontSize={cfg.label} fontWeight=\"500\" color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {label}\n </Text>\n )}\n\n {hint != null && (\n <Text fontSize={cfg.hint} color=\"text-secondary\" textAlign={center ? \"center\" : \"left\"}>\n {hint}\n </Text>\n )}\n </Box>\n );\n}\n\n/**\n * StatGroup — evenly-spaced row of `StatCard`s (the metric strip).\n *\n * <StatGroup items={[{value:'$1,820',label:'Earnings'}, …]} />\n */\nexport function StatGroup(rawProps: IStatGroupProps) {\n const props = useComponentDefaults<IStatGroupProps>(\"StatGroup\", rawProps).mergedProps;\n const {items, children, gap = 8, testID, ...rest} = props;\n\n const content = items\n ? items.map((item, i) => (\n <Box key={i} flex={1}>\n <StatCard {...item} />\n </Box>\n ))\n : React.Children.map(children, child => <Box flex={1}>{child}</Box>);\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"stretch\"\n gap={gap}\n {...(rest as any)}\n {...(testID ? ({testID, \"data-testid\": testID} as any) : {})}\n >\n {content}\n </Box>\n );\n}\n\nexport default StatCard;\n"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var index_native = require('../../primitives/Text/index.cjs');
|
|
|
6
6
|
var index_native$1 = require('../../primitives/Icon/index.cjs');
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
9
10
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
10
11
|
|
|
11
12
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":["useComponentDefaults","jsx","Box","Text","jsxs","Icon"],"mappings":";;;;;;;;;;AAMA,MAAM,IAAA,GAAO;AAAA,EACT,EAAA,EAAI,EAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA,EAAC;AAAA,EACjE,EAAA,EAAI,EAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA;AACpE,CAAA;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,GAAG,GAAG,CAAA;AACzC;AAgBO,SAAS,QAAQ,QAAA,EAAyB;AAC7C,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAAoC,SAAA,EAAW,QAAQ,CAAA,CAAE,WAAA;AACvE,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,UAAA,GAAa,UAAA;AAAA,IACb,aAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAG;AAAA,GACP,GAAI,KAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,KAAS,IAAA,GAAO,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC3C,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA,EAAG,GAAG,KAAK,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,WAAA;AACrB,EAAA,MAAM,YAAY,aAAA,IAAiB,WAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,GAAA;AAE1B,EAAA,MAAM,SAAA,GAAY;AAAA,IACd,IAAA,EAAM,aAAA;AAAA,IACN,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,CAAA;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,GAAI,MAAA,GAAS,EAAC,QAAQ,aAAA,EAAe,MAAA,KAAU;AAAC,GACpD;AAEA,EAAA,MAAM,OAAA,GAAU,SAAA,GACT,WAAA,GAAc,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA,GAAI,CAAA,KAAA,EAAQ,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,GAChE,IAAA;AAEN,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAC,MAAA,EAAQ,OAAK,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAGvD,EAAA,IAAI,OAAA,KAAY,KAAA,IAAS,OAAA,KAAY,MAAA,EAAQ;AACzC,IAAA,MAAM,SAAS,OAAA,KAAY,MAAA;AAC3B,IAAA,MAAM,WAAW,OAAA,CAAQ,GAAA;AAAA,MAAI,OACzB,MAAA,mBACIC,cAAA;AAAA,QAACC,aAAA;AAAA,QAAA;AAAA,UAEG,OAAO,GAAA,CAAI,GAAA;AAAA,UACX,QAAQ,GAAA,CAAI,GAAA;AAAA,UACZ,YAAA,EAAc,GAAA;AAAA,UACd,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,YAAA,GAAe;AAAA,SAAA;AAAA,QAJ7B;AAAA,OAKT,mBAEAD,cAAA;AAAA,QAACC,aAAA;AAAA,QAAA;AAAA,UAEG,IAAA,EAAM,CAAA;AAAA,UACN,QAAQ,GAAA,CAAI,GAAA;AAAA,UACZ,YAAA,EAAc,GAAA;AAAA,UACd,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,YAAA,GAAe;AAAA,SAAA;AAAA,QAJ7B;AAAA;AAKT,KAER;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,uBACID,cAAA,CAACC,aAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,UAAA,EAAW,QAAA,EAAS,GAAA,EAAK,MAAA,EAAS,GAAI,IAAA,EAAe,GAAI,SAAA,EAC7E,QAAA,EAAA,QAAA,EACL,CAAA;AAAA,IAER;AACA,IAAA,uCACKA,aAAA,EAAA,EAAI,aAAA,EAAc,UAAS,GAAA,EAAK,CAAA,EAAI,GAAI,IAAA,EACrC,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAACE,oBAAA,EAAA,EAAK,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,IAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAM,gBAAA,EAC3D,QAAA,EAAA,OAAA,EACL,CAAA;AAAA,sBACAF,cAAA,CAACC,aAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,UAAA,EAAW,UAAS,GAAA,EAAK,MAAA,EAAS,GAAI,SAAA,EAC1D,QAAA,EAAA,QAAA,EACL;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AAGA,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,IAAA,KAA2B;AAEhD,IAAA,MAAM,CAAA,GAAI,IAAA,KAAS,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AACpC,IAAA,MAAM,MAAM,IAAA,KAAS,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,IAAI,KAAA,GAAQ,CAAA;AAClD,IAAA,uBACID,cAAA;AAAA,MAACC,aAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAM,CAAA;AAAA,QACN,QAAQ,GAAA,CAAI,SAAA;AAAA,QACZ,SAAS,GAAA,GAAO,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,YAAY,UAAA,GAAc;AAAA;AAAA,KAC5D;AAAA,EAER,CAAA;AAEA,EAAA,uBACIE,eAAA,CAACF,iBAAI,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAAI,GAAI,IAAA,EAAe,GAAI,SAAA,EACvD,QAAA,EAAA;AAAA,IAAA,OAAA,oBACGD,cAAA,CAACE,oBAAA,EAAA,EAAK,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA,EAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAM,gBAAA,EAC3D,QAAA,EAAA,OAAA,EACL,CAAA;AAAA,oBAEJF,cAAA,CAACC,iBAAI,aAAA,EAAc,KAAA,EAAM,YAAW,YAAA,EAC/B,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK;AACd,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,GAAM,CAAA;AACvB,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,GAAM,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,uCACKA,aAAA,EAAA,EAAY,IAAA,EAAM,GAAG,aAAA,EAAc,QAAA,EAAS,YAAW,QAAA,EAEpD,QAAA,EAAA;AAAA,wBAAAE,eAAA,CAACF,iBAAI,aAAA,EAAc,KAAA,EAAM,UAAA,EAAW,QAAA,EAAS,WAAU,SAAA,EAClD,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,0BACfD,cAAA;AAAA,YAACC,aAAA;AAAA,YAAA;AAAA,cACG,KAAA,EAAO,IAAA;AAAA,cACP,MAAA,EAAQ,IAAA;AAAA,cACR,YAAA,EAAc,GAAA;AAAA,cACd,UAAA,EAAW,QAAA;AAAA,cACX,cAAA,EAAe,QAAA;AAAA,cACf,OAAA,EAAS,OAAO,SAAA,GAAY,cAAA;AAAA,cAC5B,WAAA,EAAa,OAAO,CAAA,GAAI,CAAA;AAAA,cACxB,WAAA,EAAa,SAAS,WAAA,GAAc,UAAA;AAAA,cAEnC,QAAA,EAAA,IAAA,mBACGD,cAAA,CAACI,mBAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA,EAAG,KAAA,EAAM,WAAU,CAAA,mBAEjEJ,cAAA;AAAA,gBAACE,oBAAA;AAAA,gBAAA;AAAA,kBACG,UAAU,GAAA,CAAI,QAAA;AAAA,kBACd,UAAA,EAAW,KAAA;AAAA,kBACX,KAAA,EAAO,SAAS,WAAA,GAAc,SAAA;AAAA,kBAE7B,QAAA,EAAA,CAAA,GAAI;AAAA;AAAA;AACT;AAAA,WAER;AAAA,UACC,IAAA,CAAK,GAAG,OAAO;AAAA,SAAA,EACpB,CAAA;AAAA,QACC,SAAS,IAAA,oBACNF,cAAA;AAAA,UAACE,oBAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,CAAA;AAAA,YACX,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA;AAAA,YAC/B,UAAA,EAAY,SAAS,KAAA,GAAQ,KAAA;AAAA,YAC7B,KAAA,EAAO,MAAA,IAAU,IAAA,GAAO,MAAA,GAAS,gBAAA;AAAA,YACjC,SAAA,EAAU,QAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACL,OAAA,EAAA,EArCE,CAuCV,CAAA;AAAA,IAER,CAAC,CAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":["useComponentDefaults","jsx","Box","Text","jsxs","Icon"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import Text from '../../primitives/Text/index.js';
|
|
|
4
4
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
5
5
|
import 'react';
|
|
6
6
|
import '../../contexts/DialogContext.js';
|
|
7
|
+
import '../../contexts/PermissionsContext.js';
|
|
7
8
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
8
9
|
|
|
9
10
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Stepper/index.tsx"],"sourcesContent":["import React from \"react\";\nimport type {IStepperProps} from \"@lmb-it/kitsconcerto-types\";\nimport {Box, Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n/* ─── Size config ─────────────────────────────────────────────── */\nconst SIZE = {\n sm: {bar: 4, dot: 6, node: 20, nodeFont: 10, gap: 6, connector: 2},\n md: {bar: 6, dot: 8, node: 28, nodeFont: 13, gap: 6, connector: 2},\n} as const;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(Math.max(n, min), max);\n}\n\n/**\n * Stepper — horizontal progress indicator for multi-step flows.\n *\n * Cross-platform and presentational (Box + Text + Icon). Three variants:\n * - `bar` (default) — segmented \"Step X of N\" progress bar used in every\n * onboarding/KYC wizard header.\n * - `dots` — compact dot row.\n * - `nodes` — numbered/checked circles with connectors and optional labels\n * (e.g. the \"Account · Legal · Career · KYC\" completion stepper).\n *\n * <Stepper total={4} current={1} showLabel />\n * <Stepper total={6} current={3} variant=\"dots\" />\n * <Stepper total={4} current={3} variant=\"nodes\" labels={['Account','Legal','Career','KYC']} />\n */\nexport function Stepper(rawProps: IStepperProps) {\n const props = useComponentDefaults<IStepperProps>(\"Stepper\", rawProps).mergedProps;\n const {\n total,\n current,\n variant = \"bar\",\n size = \"md\",\n labels,\n activeColor = \"brand\",\n trackColor = \"gray.200\",\n completeColor,\n gap,\n showLabel = false,\n formatLabel,\n testID,\n ...rest\n } = props;\n\n const cfg = SIZE[size === \"sm\" ? \"sm\" : \"md\"];\n const steps = Math.max(0, Math.floor(total));\n const cur = clamp(Math.floor(current), 0, steps);\n const reachedColor = activeColor;\n const doneColor = completeColor ?? activeColor;\n const segGap = gap ?? cfg.gap;\n\n const a11yProps = {\n role: \"progressbar\",\n \"aria-valuenow\": cur,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": steps,\n ...(testID ? {testID, \"data-testid\": testID} : {}),\n } as Record<string, unknown>;\n\n const caption = showLabel\n ? (formatLabel ? formatLabel(cur, steps) : `Step ${cur} of ${steps}`)\n : null;\n\n const indices = Array.from({length: steps}, (_, i) => i);\n\n /* ── bar / dots ─────────────────────────────────────────────── */\n if (variant === \"bar\" || variant === \"dots\") {\n const isDots = variant === \"dots\";\n const segments = indices.map(i =>\n isDots ? (\n <Box\n key={i}\n width={cfg.dot}\n height={cfg.dot}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ) : (\n <Box\n key={i}\n flex={1}\n height={cfg.bar}\n borderRadius={999}\n bgColor={i < cur ? reachedColor : trackColor}\n />\n ),\n );\n\n if (!caption) {\n return (\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(rest as any)} {...(a11yProps as any)}>\n {segments}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)}>\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n <Box flexDirection=\"row\" alignItems=\"center\" gap={segGap} {...(a11yProps as any)}>\n {segments}\n </Box>\n </Box>\n );\n }\n\n /* ── nodes ──────────────────────────────────────────────────── */\n const node = cfg.node;\n const half = (i: number, side: \"left\" | \"right\") => {\n // connector (j → j+1) is \"passed\" when j < cur-1\n const j = side === \"left\" ? i - 1 : i;\n const has = side === \"left\" ? i > 0 : i < steps - 1;\n return (\n <Box\n flex={1}\n height={cfg.connector}\n bgColor={has ? (j < cur - 1 ? doneColor : trackColor) : \"transparent\"}\n />\n );\n };\n\n return (\n <Box flexDirection=\"column\" gap={6} {...(rest as any)} {...(a11yProps as any)}>\n {caption && (\n <Text fontSize={size === \"sm\" ? 11 : 12} fontWeight=\"600\" color=\"text-secondary\">\n {caption}\n </Text>\n )}\n <Box flexDirection=\"row\" alignItems=\"flex-start\">\n {indices.map(i => {\n const done = i < cur - 1;\n const active = i === cur - 1;\n const label = labels?.[i];\n return (\n <Box key={i} flex={1} flexDirection=\"column\" alignItems=\"center\">\n {/* circle row with flanking connector halves */}\n <Box flexDirection=\"row\" alignItems=\"center\" alignSelf=\"stretch\">\n {half(i, \"left\")}\n <Box\n width={node}\n height={node}\n borderRadius={999}\n alignItems=\"center\"\n justifyContent=\"center\"\n bgColor={done ? doneColor : \"surface-card\"}\n borderWidth={done ? 0 : 2}\n borderColor={active ? activeColor : trackColor}\n >\n {done ? (\n <Icon name=\"check\" size={Math.round(node * 0.5)} color=\"#FFFFFF\" />\n ) : (\n <Text\n fontSize={cfg.nodeFont}\n fontWeight=\"700\"\n color={active ? activeColor : \"ink.400\"}\n >\n {i + 1}\n </Text>\n )}\n </Box>\n {half(i, \"right\")}\n </Box>\n {label != null && (\n <Text\n marginTop={6}\n fontSize={size === \"sm\" ? 10 : 11}\n fontWeight={active ? \"700\" : \"500\"}\n color={active || done ? \"text\" : \"text-secondary\"}\n textAlign=\"center\"\n >\n {label}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n}\n\nexport default Stepper;\n"],"names":[],"mappings":"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"}
|
|
@@ -86,6 +86,7 @@ require('../../apps/mobile/src/Core/Input/Slot.cjs');
|
|
|
86
86
|
var index_native$1 = require('../../primitives/Text/index.cjs');
|
|
87
87
|
var index_native = require('../../primitives/Icon/index.cjs');
|
|
88
88
|
require('../../contexts/DialogContext.cjs');
|
|
89
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
89
90
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
90
91
|
|
|
91
92
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,IAAA,GAAO;AAAA,EACT,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAE;AAAA,EAC1B,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAE;AAAA,EAC1B,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA;AAC5B,CAAA;AASO,SAAS,KAAgC,QAAA,EAAyB;AACrE,EAAA,MAAM,KAAA,GAAQA,4BAAA,CAAoC,MAAA,EAAQ,QAAQ,CAAA,CAAE,WAAA;AACpE,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,QAAA;AAAA,IAAU,IAAA,GAAO,IAAA;AAAA,IAAM,WAAA,GAAc,OAAA;AAAA,IAAS,UAAA,GAAa,IAAA;AAAA,IAAM,GAAA,GAAM,CAAA;AAAA,IAAG,MAAA;AAAA,IACxF,YAAA,GAAe,QAAA;AAAA,IACf,qBAAA,GAAwB,cAAA;AAAA,IACxB,oBAAA,GAAuB,cAAA;AAAA,IACvB,uBAAA,GAA0B,UAAA;AAAA,IAC1B,sBAAA,GAAyB,gBAAA;AAAA,IACzB,kBAAA,GAAqB,UAAA;AAAA,IACrB,iBAAA,GAAoB,gBAAA;AAAA,IACpB;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,EAAC,EAAA,EAAI,IAAA,CAAK,GAAG,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,GAAG,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,CAAA,EAAG,GAAG,WAAA,EAAW;AAC5E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,CAAQ,EAAA;AACxC,EAAA,MAAM,QAAA,GAAWC,iCAA2B,WAAW,CAAA;AACvD,EAAA,MAAM,UAAA,GAAaA,iCAA2B,kBAAkB,CAAA;AAChE,EAAA,MAAM,YAAA,GAAeA,iCAA2B,iBAAiB,CAAA;AACjE,EAAA,MAAM,QAAQ,YAAA,KAAiB,OAAA;AAC/B,EAAA,MAAM,aAAA,GAAgBA,iCAA2B,qBAAqB,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgBA,iCAA2B,oBAAoB,CAAA;AACrE,EAAA,MAAM,eAAA,GAAkBA,iCAA2B,uBAAuB,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkBA,iCAA2B,sBAAsB,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AAExB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAsB;AACtC,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,KAAQ,KAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA;AACnF,IAAA,MAAM,EAAA,GAAK,SAAS,SAAA,GAAY,YAAA;AAChC,IAAA,uBACIC,eAAA;AAAA,MAACC,4BAAA;AAAA,MAAA;AAAA,QAEG,aAAA,EAAe,IAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,MAAA,EAAM;AAAA,QACrC,KAAA,EAAO;AAAA,UACH,MAAA;AAAA,UACA,YAAA,EAAc,GAAA;AAAA,UACd,mBAAmB,GAAA,CAAI,EAAA;AAAA,UACvB,aAAA,EAAe,KAAA;AAAA,UACf,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,GAAA,EAAK,CAAA;AAAA,UACL,eAAA,EAAiB,SAAS,QAAA,GAAW,UAAA;AAAA,UACrC,OAAA,EAAS,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM;AAAA,SACnC;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,IAAQ,IAAA,oBAAQC,cAAA,CAACC,iBAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAe,IAAA,EAAM,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,0BACnFD,cAAA,CAACE,0BAAK,QAAA,EAAU,GAAA,CAAI,IAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAO,EAAA,EAC3C,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,IAAA,oBACpBF,cAAA;AAAA,YAACG,gBAAA;AAAA,YAAA;AAAA,cACG,KAAA,EAAO;AAAA,gBACH,MAAA,EAAQ,MAAA;AAAA,gBACR,QAAA,EAAU,MAAA;AAAA,gBACV,YAAA,EAAc,GAAA;AAAA,gBACd,iBAAA,EAAmB,CAAA;AAAA,gBACnB,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,QAAA;AAAA,gBAChB,eAAA,EAAiB,SAAS,aAAA,GAAgB;AAAA,eAC9C;AAAA,cAEA,QAAA,kBAAAH,cAAA,CAACE,sBAAA,EAAA,EAAK,QAAA,EAAU,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,UAAA,EAAW,KAAA,EAAM,KAAA,EAAO,MAAA,GAAS,aAAA,GAAgB,eAAA,EACxE,eAAK,KAAA,EACV;AAAA;AAAA;AACJ;AAAA,OAAA;AAAA,MArCC,IAAA,CAAK;AAAA,KAuCd;AAAA,EAER,CAAA;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACb,IAAA,sCACKC,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,aAAA,EAAe,OAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,KAAG,EAAG,MAAA,EAC7E,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EACzB,CAAA;AAAA,EAER;AAEA,EAAA,uBACIH,cAAA;AAAA,IAACI,sBAAA;AAAA,IAAA;AAAA,MACG,UAAA,EAAU,IAAA;AAAA,MACV,8BAAA,EAAgC,KAAA;AAAA,MAChC,yBAAA,EAA0B,SAAA;AAAA,MAC1B,qBAAA,EAAuB,EAAC,aAAA,EAAe,KAAA,EAAO,YAAY,QAAA,EAAU,GAAA,EAAK,iBAAiB,CAAA,EAAC;AAAA,MAC3F,MAAA;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,IAAI,UAAU;AAAA;AAAA,GACzB;AAER;;;;"}
|
package/components/Tabs/index.js
CHANGED
|
@@ -84,6 +84,7 @@ import '../../apps/mobile/src/Core/Input/Slot.js';
|
|
|
84
84
|
import Text from '../../primitives/Text/index.js';
|
|
85
85
|
import { Icon } from '../../primitives/Icon/index.js';
|
|
86
86
|
import '../../contexts/DialogContext.js';
|
|
87
|
+
import '../../contexts/PermissionsContext.js';
|
|
87
88
|
import useComponentDefaults from '../../hooks/useComponentDefaults.js';
|
|
88
89
|
|
|
89
90
|
const SIZE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var index_native = require('../../primitives/Text/index.cjs');
|
|
|
6
6
|
var index_native$1 = require('../../primitives/Icon/index.cjs');
|
|
7
7
|
require('react');
|
|
8
8
|
require('../../contexts/DialogContext.cjs');
|
|
9
|
+
require('../../contexts/PermissionsContext.cjs');
|
|
9
10
|
var useComponentDefaults = require('../../hooks/useComponentDefaults.cjs');
|
|
10
11
|
|
|
11
12
|
const SIZE = {
|