melta-app 0.1.0
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/LICENSE +21 -0
- package/README.md +197 -0
- package/THIRD_PARTY_LICENSES.md +198 -0
- package/lib/module/components/ActionSheet.js +87 -0
- package/lib/module/components/ActionSheet.js.map +1 -0
- package/lib/module/components/Alert.js +93 -0
- package/lib/module/components/Alert.js.map +1 -0
- package/lib/module/components/Avatar.js +93 -0
- package/lib/module/components/Avatar.js.map +1 -0
- package/lib/module/components/BottomSheet.js +69 -0
- package/lib/module/components/BottomSheet.js.map +1 -0
- package/lib/module/components/Card.js +93 -0
- package/lib/module/components/Card.js.map +1 -0
- package/lib/module/components/Checkbox.js +115 -0
- package/lib/module/components/Checkbox.js.map +1 -0
- package/lib/module/components/EmptyState.js +70 -0
- package/lib/module/components/EmptyState.js.map +1 -0
- package/lib/module/components/Header.js +53 -0
- package/lib/module/components/Header.js.map +1 -0
- package/lib/module/components/Image.js +67 -0
- package/lib/module/components/Image.js.map +1 -0
- package/lib/module/components/Modal.js +95 -0
- package/lib/module/components/Modal.js.map +1 -0
- package/lib/module/components/Progress.js +113 -0
- package/lib/module/components/Progress.js.map +1 -0
- package/lib/module/components/Radio.js +134 -0
- package/lib/module/components/Radio.js.map +1 -0
- package/lib/module/components/Screen.js +57 -0
- package/lib/module/components/Screen.js.map +1 -0
- package/lib/module/components/Skeleton.js +169 -0
- package/lib/module/components/Skeleton.js.map +1 -0
- package/lib/module/components/Surface.js +49 -0
- package/lib/module/components/Surface.js.map +1 -0
- package/lib/module/components/TextField.js +84 -0
- package/lib/module/components/TextField.js.map +1 -0
- package/lib/module/components/Toast.js +105 -0
- package/lib/module/components/Toast.js.map +1 -0
- package/lib/module/components/Toggle.js +77 -0
- package/lib/module/components/Toggle.js.map +1 -0
- package/lib/module/components/action-sheet.styles.js +70 -0
- package/lib/module/components/action-sheet.styles.js.map +1 -0
- package/lib/module/components/alert.styles.js +80 -0
- package/lib/module/components/alert.styles.js.map +1 -0
- package/lib/module/components/avatar.styles.js +94 -0
- package/lib/module/components/avatar.styles.js.map +1 -0
- package/lib/module/components/bottom-sheet.styles.js +55 -0
- package/lib/module/components/bottom-sheet.styles.js.map +1 -0
- package/lib/module/components/card.styles.js +50 -0
- package/lib/module/components/card.styles.js.map +1 -0
- package/lib/module/components/checkbox.styles.js +55 -0
- package/lib/module/components/checkbox.styles.js.map +1 -0
- package/lib/module/components/empty-state.styles.js +60 -0
- package/lib/module/components/empty-state.styles.js.map +1 -0
- package/lib/module/components/header.styles.js +33 -0
- package/lib/module/components/header.styles.js.map +1 -0
- package/lib/module/components/image.styles.js +37 -0
- package/lib/module/components/image.styles.js.map +1 -0
- package/lib/module/components/index.js +26 -0
- package/lib/module/components/index.js.map +1 -0
- package/lib/module/components/modal.styles.js +68 -0
- package/lib/module/components/modal.styles.js.map +1 -0
- package/lib/module/components/progress.styles.js +55 -0
- package/lib/module/components/progress.styles.js.map +1 -0
- package/lib/module/components/radio.styles.js +96 -0
- package/lib/module/components/radio.styles.js.map +1 -0
- package/lib/module/components/screen.styles.js +38 -0
- package/lib/module/components/screen.styles.js.map +1 -0
- package/lib/module/components/skeleton.styles.js +114 -0
- package/lib/module/components/skeleton.styles.js.map +1 -0
- package/lib/module/components/surface.styles.js +37 -0
- package/lib/module/components/surface.styles.js.map +1 -0
- package/lib/module/components/textfield.styles.js +121 -0
- package/lib/module/components/textfield.styles.js.map +1 -0
- package/lib/module/components/toast.styles.js +81 -0
- package/lib/module/components/toast.styles.js.map +1 -0
- package/lib/module/components/toggle.styles.js +69 -0
- package/lib/module/components/toggle.styles.js.map +1 -0
- package/lib/module/contracts/contract-types.js +192 -0
- package/lib/module/contracts/contract-types.js.map +1 -0
- package/lib/module/icons/Icon.js +57 -0
- package/lib/module/icons/Icon.js.map +1 -0
- package/lib/module/icons/glyphs.js +257 -0
- package/lib/module/icons/glyphs.js.map +1 -0
- package/lib/module/icons/icon.styles.js +28 -0
- package/lib/module/icons/icon.styles.js.map +1 -0
- package/lib/module/icons/index.js +14 -0
- package/lib/module/icons/index.js.map +1 -0
- package/lib/module/index.js +20 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/primitives/Button.js +105 -0
- package/lib/module/primitives/Button.js.map +1 -0
- package/lib/module/primitives/Metric.js +68 -0
- package/lib/module/primitives/Metric.js.map +1 -0
- package/lib/module/primitives/Row.js +43 -0
- package/lib/module/primitives/Row.js.map +1 -0
- package/lib/module/primitives/Stack.js +39 -0
- package/lib/module/primitives/Stack.js.map +1 -0
- package/lib/module/primitives/Tag.js +160 -0
- package/lib/module/primitives/Tag.js.map +1 -0
- package/lib/module/primitives/Text.js +54 -0
- package/lib/module/primitives/Text.js.map +1 -0
- package/lib/module/primitives/_internal/focus-ring.js +57 -0
- package/lib/module/primitives/_internal/focus-ring.js.map +1 -0
- package/lib/module/primitives/button.styles.js +88 -0
- package/lib/module/primitives/button.styles.js.map +1 -0
- package/lib/module/primitives/index.js +11 -0
- package/lib/module/primitives/index.js.map +1 -0
- package/lib/module/primitives/metric.styles.js +54 -0
- package/lib/module/primitives/metric.styles.js.map +1 -0
- package/lib/module/primitives/row.styles.js +53 -0
- package/lib/module/primitives/row.styles.js.map +1 -0
- package/lib/module/primitives/stack.styles.js +37 -0
- package/lib/module/primitives/stack.styles.js.map +1 -0
- package/lib/module/primitives/tag.styles.js +56 -0
- package/lib/module/primitives/tag.styles.js.map +1 -0
- package/lib/module/primitives/text.styles.js +33 -0
- package/lib/module/primitives/text.styles.js.map +1 -0
- package/lib/module/theme/ThemeProvider.js +41 -0
- package/lib/module/theme/ThemeProvider.js.map +1 -0
- package/lib/module/theme/index.js +19 -0
- package/lib/module/theme/index.js.map +1 -0
- package/lib/module/theme/native-theme.js +201 -0
- package/lib/module/theme/native-theme.js.map +1 -0
- package/lib/module/theme/types.js +4 -0
- package/lib/module/theme/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/ActionSheet.d.ts +45 -0
- package/lib/typescript/src/components/ActionSheet.d.ts.map +1 -0
- package/lib/typescript/src/components/Alert.d.ts +43 -0
- package/lib/typescript/src/components/Alert.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar.d.ts +45 -0
- package/lib/typescript/src/components/Avatar.d.ts.map +1 -0
- package/lib/typescript/src/components/BottomSheet.d.ts +36 -0
- package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -0
- package/lib/typescript/src/components/Card.d.ts +46 -0
- package/lib/typescript/src/components/Card.d.ts.map +1 -0
- package/lib/typescript/src/components/Checkbox.d.ts +40 -0
- package/lib/typescript/src/components/Checkbox.d.ts.map +1 -0
- package/lib/typescript/src/components/EmptyState.d.ts +36 -0
- package/lib/typescript/src/components/EmptyState.d.ts.map +1 -0
- package/lib/typescript/src/components/Header.d.ts +34 -0
- package/lib/typescript/src/components/Header.d.ts.map +1 -0
- package/lib/typescript/src/components/Image.d.ts +41 -0
- package/lib/typescript/src/components/Image.d.ts.map +1 -0
- package/lib/typescript/src/components/Modal.d.ts +46 -0
- package/lib/typescript/src/components/Modal.d.ts.map +1 -0
- package/lib/typescript/src/components/Progress.d.ts +39 -0
- package/lib/typescript/src/components/Progress.d.ts.map +1 -0
- package/lib/typescript/src/components/Radio.d.ts +52 -0
- package/lib/typescript/src/components/Radio.d.ts.map +1 -0
- package/lib/typescript/src/components/Screen.d.ts +42 -0
- package/lib/typescript/src/components/Screen.d.ts.map +1 -0
- package/lib/typescript/src/components/Skeleton.d.ts +37 -0
- package/lib/typescript/src/components/Skeleton.d.ts.map +1 -0
- package/lib/typescript/src/components/Surface.d.ts +31 -0
- package/lib/typescript/src/components/Surface.d.ts.map +1 -0
- package/lib/typescript/src/components/TextField.d.ts +45 -0
- package/lib/typescript/src/components/TextField.d.ts.map +1 -0
- package/lib/typescript/src/components/Toast.d.ts +45 -0
- package/lib/typescript/src/components/Toast.d.ts.map +1 -0
- package/lib/typescript/src/components/Toggle.d.ts +39 -0
- package/lib/typescript/src/components/Toggle.d.ts.map +1 -0
- package/lib/typescript/src/components/action-sheet.styles.d.ts +65 -0
- package/lib/typescript/src/components/action-sheet.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/alert.styles.d.ts +61 -0
- package/lib/typescript/src/components/alert.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/avatar.styles.d.ts +60 -0
- package/lib/typescript/src/components/avatar.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/bottom-sheet.styles.d.ts +50 -0
- package/lib/typescript/src/components/bottom-sheet.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/card.styles.d.ts +27 -0
- package/lib/typescript/src/components/card.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/checkbox.styles.d.ts +55 -0
- package/lib/typescript/src/components/checkbox.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/empty-state.styles.d.ts +58 -0
- package/lib/typescript/src/components/empty-state.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/header.styles.d.ts +30 -0
- package/lib/typescript/src/components/header.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/image.styles.d.ts +28 -0
- package/lib/typescript/src/components/image.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/index.d.ts +23 -0
- package/lib/typescript/src/components/index.d.ts.map +1 -0
- package/lib/typescript/src/components/modal.styles.d.ts +66 -0
- package/lib/typescript/src/components/modal.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/progress.styles.d.ts +44 -0
- package/lib/typescript/src/components/progress.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/radio.styles.d.ts +91 -0
- package/lib/typescript/src/components/radio.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/screen.styles.d.ts +34 -0
- package/lib/typescript/src/components/screen.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/skeleton.styles.d.ts +105 -0
- package/lib/typescript/src/components/skeleton.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/surface.styles.d.ts +31 -0
- package/lib/typescript/src/components/surface.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/textfield.styles.d.ts +75 -0
- package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/toast.styles.d.ts +62 -0
- package/lib/typescript/src/components/toast.styles.d.ts.map +1 -0
- package/lib/typescript/src/components/toggle.styles.d.ts +53 -0
- package/lib/typescript/src/components/toggle.styles.d.ts.map +1 -0
- package/lib/typescript/src/contracts/contract-types.d.ts +193 -0
- package/lib/typescript/src/contracts/contract-types.d.ts.map +1 -0
- package/lib/typescript/src/icons/Icon.d.ts +40 -0
- package/lib/typescript/src/icons/Icon.d.ts.map +1 -0
- package/lib/typescript/src/icons/glyphs.d.ts +259 -0
- package/lib/typescript/src/icons/glyphs.d.ts.map +1 -0
- package/lib/typescript/src/icons/icon.styles.d.ts +20 -0
- package/lib/typescript/src/icons/icon.styles.d.ts.map +1 -0
- package/lib/typescript/src/icons/index.d.ts +12 -0
- package/lib/typescript/src/icons/index.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +12 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Button.d.ts +48 -0
- package/lib/typescript/src/primitives/Button.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Metric.d.ts +38 -0
- package/lib/typescript/src/primitives/Metric.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Row.d.ts +37 -0
- package/lib/typescript/src/primitives/Row.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Stack.d.ts +33 -0
- package/lib/typescript/src/primitives/Stack.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Tag.d.ts +43 -0
- package/lib/typescript/src/primitives/Tag.d.ts.map +1 -0
- package/lib/typescript/src/primitives/Text.d.ts +45 -0
- package/lib/typescript/src/primitives/Text.d.ts.map +1 -0
- package/lib/typescript/src/primitives/_internal/focus-ring.d.ts +31 -0
- package/lib/typescript/src/primitives/_internal/focus-ring.d.ts.map +1 -0
- package/lib/typescript/src/primitives/button.styles.d.ts +29 -0
- package/lib/typescript/src/primitives/button.styles.d.ts.map +1 -0
- package/lib/typescript/src/primitives/index.d.ts +8 -0
- package/lib/typescript/src/primitives/index.d.ts.map +1 -0
- package/lib/typescript/src/primitives/metric.styles.d.ts +43 -0
- package/lib/typescript/src/primitives/metric.styles.d.ts.map +1 -0
- package/lib/typescript/src/primitives/row.styles.d.ts +50 -0
- package/lib/typescript/src/primitives/row.styles.d.ts.map +1 -0
- package/lib/typescript/src/primitives/stack.styles.d.ts +34 -0
- package/lib/typescript/src/primitives/stack.styles.d.ts.map +1 -0
- package/lib/typescript/src/primitives/tag.styles.d.ts +32 -0
- package/lib/typescript/src/primitives/tag.styles.d.ts.map +1 -0
- package/lib/typescript/src/primitives/text.styles.d.ts +26 -0
- package/lib/typescript/src/primitives/text.styles.d.ts.map +1 -0
- package/lib/typescript/src/theme/ThemeProvider.d.ts +32 -0
- package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -0
- package/lib/typescript/src/theme/index.d.ts +15 -0
- package/lib/typescript/src/theme/index.d.ts.map +1 -0
- package/lib/typescript/src/theme/native-theme.d.ts +3 -0
- package/lib/typescript/src/theme/native-theme.d.ts.map +1 -0
- package/lib/typescript/src/theme/types.d.ts +121 -0
- package/lib/typescript/src/theme/types.d.ts.map +1 -0
- package/package.json +120 -0
- package/src/components/ActionSheet.tsx +112 -0
- package/src/components/Alert.tsx +84 -0
- package/src/components/Avatar.tsx +110 -0
- package/src/components/BottomSheet.tsx +81 -0
- package/src/components/Card.tsx +102 -0
- package/src/components/Checkbox.tsx +107 -0
- package/src/components/EmptyState.tsx +64 -0
- package/src/components/Header.tsx +51 -0
- package/src/components/Image.tsx +89 -0
- package/src/components/Modal.tsx +113 -0
- package/src/components/Progress.tsx +124 -0
- package/src/components/Radio.tsx +151 -0
- package/src/components/Screen.tsx +62 -0
- package/src/components/Skeleton.tsx +154 -0
- package/src/components/Surface.tsx +37 -0
- package/src/components/TextField.tsx +102 -0
- package/src/components/Toast.tsx +103 -0
- package/src/components/Toggle.tsx +94 -0
- package/src/components/action-sheet.styles.ts +102 -0
- package/src/components/alert.styles.ts +115 -0
- package/src/components/avatar.styles.ts +110 -0
- package/src/components/bottom-sheet.styles.ts +78 -0
- package/src/components/card.styles.ts +56 -0
- package/src/components/checkbox.styles.ts +83 -0
- package/src/components/empty-state.styles.ts +98 -0
- package/src/components/header.styles.ts +44 -0
- package/src/components/image.styles.ts +36 -0
- package/src/components/index.ts +23 -0
- package/src/components/modal.styles.ts +106 -0
- package/src/components/progress.styles.ts +74 -0
- package/src/components/radio.styles.ts +132 -0
- package/src/components/screen.styles.ts +44 -0
- package/src/components/skeleton.styles.ts +155 -0
- package/src/components/surface.styles.ts +50 -0
- package/src/components/textfield.styles.ts +135 -0
- package/src/components/toast.styles.ts +115 -0
- package/src/components/toggle.styles.ts +73 -0
- package/src/contracts/contract-types.ts +199 -0
- package/src/icons/Icon.tsx +65 -0
- package/src/icons/glyphs.ts +54 -0
- package/src/icons/icon.styles.ts +37 -0
- package/src/icons/index.ts +12 -0
- package/src/index.ts +24 -0
- package/src/primitives/Button.tsx +114 -0
- package/src/primitives/Metric.tsx +67 -0
- package/src/primitives/Row.tsx +54 -0
- package/src/primitives/Stack.tsx +42 -0
- package/src/primitives/Tag.tsx +126 -0
- package/src/primitives/Text.tsx +71 -0
- package/src/primitives/_internal/focus-ring.tsx +59 -0
- package/src/primitives/button.styles.ts +69 -0
- package/src/primitives/index.ts +8 -0
- package/src/primitives/metric.styles.ts +75 -0
- package/src/primitives/row.styles.ts +66 -0
- package/src/primitives/stack.styles.ts +47 -0
- package/src/primitives/tag.styles.ts +65 -0
- package/src/primitives/text.styles.ts +42 -0
- package/src/theme/ThemeProvider.tsx +60 -0
- package/src/theme/index.ts +18 -0
- package/src/theme/native-theme.ts +215 -0
- package/src/theme/types.ts +137 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Avatar — ユーザーアバター(Image / Initials / Status / Group)。
|
|
5
|
+
* contract: avatar(web 契約 v2.0.0 の app 実装)。dogfood 不足-4 の解消。
|
|
6
|
+
*
|
|
7
|
+
* - variant は props から暗黙決定: source があれば image、無ければ initials(name から生成)。
|
|
8
|
+
* contract の group variant は Avatar.Group(重ね表示コンテナ、-spacing.2 相当のオーバーラップ)。
|
|
9
|
+
* - status(online / away / offline)指定時は右下に statusDot(bg-surface の ring 付き)。
|
|
10
|
+
* - a11y: role img + accessibilityLabel=name(contract required)。
|
|
11
|
+
* - 決定ロジックは pure resolver(avatar.styles.ts)に分離 — recipe との機械照合対象。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { Children, useMemo } from "react";
|
|
15
|
+
import { Image as RNImage, Text as RNText, View } from "react-native";
|
|
16
|
+
import { useTheme } from "../theme/index.js";
|
|
17
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
18
|
+
import { resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
|
|
19
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
20
|
+
/** name → initials(先頭2文字。空白区切りなら各語の頭文字を優先: "Taro Tanaka" → "TT")。 */
|
|
21
|
+
function toInitials(name) {
|
|
22
|
+
const words = name.trim().split(/\s+/).filter(Boolean);
|
|
23
|
+
if (words.length >= 2) return (words[0][0] + words[1][0]).toUpperCase();
|
|
24
|
+
return name.trim().slice(0, 2).toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
export function Avatar({
|
|
27
|
+
name,
|
|
28
|
+
source,
|
|
29
|
+
size = "medium",
|
|
30
|
+
status,
|
|
31
|
+
style,
|
|
32
|
+
testID
|
|
33
|
+
}) {
|
|
34
|
+
const {
|
|
35
|
+
theme,
|
|
36
|
+
mode
|
|
37
|
+
} = useTheme();
|
|
38
|
+
const variant = source ? "image" : "initials";
|
|
39
|
+
const resolved = useMemo(() => resolveAvatarStyle(theme, mode, variant, size), [theme, mode, variant, size]);
|
|
40
|
+
const dotColor = status ? resolveAvatarStatusColor(theme, mode, status) : undefined;
|
|
41
|
+
|
|
42
|
+
// clip(overflow hidden)は内側の円に閉じ、statusDot は外側(クリップされない層)に置く。
|
|
43
|
+
// accessible 明示で「1つの読み上げ単位」にする(非 Touchable の View は暗黙では discoverable でない)
|
|
44
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
45
|
+
style: [{
|
|
46
|
+
width: resolved.container.width,
|
|
47
|
+
height: resolved.container.height
|
|
48
|
+
}, style],
|
|
49
|
+
accessible: true,
|
|
50
|
+
accessibilityRole: "image",
|
|
51
|
+
accessibilityLabel: name,
|
|
52
|
+
testID: testID,
|
|
53
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
54
|
+
style: resolved.container,
|
|
55
|
+
children: source ? /*#__PURE__*/_jsx(RNImage, {
|
|
56
|
+
source: source,
|
|
57
|
+
style: {
|
|
58
|
+
width: "100%",
|
|
59
|
+
height: "100%"
|
|
60
|
+
}
|
|
61
|
+
}) : /*#__PURE__*/_jsx(RNText, {
|
|
62
|
+
style: resolved.text,
|
|
63
|
+
children: toInitials(name)
|
|
64
|
+
})
|
|
65
|
+
}), status ? /*#__PURE__*/_jsx(View, {
|
|
66
|
+
style: [resolved.dot, {
|
|
67
|
+
backgroundColor: dotColor,
|
|
68
|
+
position: "absolute",
|
|
69
|
+
right: 0,
|
|
70
|
+
bottom: 0
|
|
71
|
+
}]
|
|
72
|
+
}) : null]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** 複数アバターの重ね表示(contract の group variant)。2枚目以降を負 margin で重ねる。 */
|
|
76
|
+
function AvatarGroup({
|
|
77
|
+
style,
|
|
78
|
+
testID,
|
|
79
|
+
children
|
|
80
|
+
}) {
|
|
81
|
+
const group = resolveAvatarGroupStyle();
|
|
82
|
+
return /*#__PURE__*/_jsx(View, {
|
|
83
|
+
style: [group.container, style],
|
|
84
|
+
testID: testID,
|
|
85
|
+
children: Children.map(children, (child, index) => /*#__PURE__*/_jsx(View, {
|
|
86
|
+
style: index > 0 ? group.overlap : null,
|
|
87
|
+
children: child
|
|
88
|
+
}))
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
Avatar.Group = AvatarGroup;
|
|
92
|
+
Avatar.__contract = CONTRACTS.avatar;
|
|
93
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Children","useMemo","Image","RNImage","Text","RNText","View","useTheme","CONTRACTS","resolveAvatarGroupStyle","resolveAvatarStatusColor","resolveAvatarStyle","jsx","_jsx","jsxs","_jsxs","toInitials","name","words","trim","split","filter","Boolean","length","toUpperCase","slice","Avatar","source","size","status","style","testID","theme","mode","variant","resolved","dotColor","undefined","width","container","height","accessible","accessibilityRole","accessibilityLabel","children","text","dot","backgroundColor","position","right","bottom","AvatarGroup","group","map","child","index","overlap","Group","__contract","avatar"],"sourceRoot":"../../../src","sources":["components/Avatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* BottomSheet — 画面下から出る汎用シート container(content は自由 slot)。
|
|
5
|
+
* contract: bottom-sheet(appFirst、feedback)。RN core Modal(transparent + slide)+
|
|
6
|
+
* 下端 sheet(上角のみ radius)。ActionSheet がリスト特化なのに対しこちらは容器。
|
|
7
|
+
*
|
|
8
|
+
* - grabber は装飾バー。a11y ツリーから除外する(importantForAccessibility="no" +
|
|
9
|
+
* accessibilityElementsHidden。recipe description 参照)。
|
|
10
|
+
* - スワイプで閉じるジェスチャは実装しない(overlay tap + Android back で閉じる、Phase 外)。
|
|
11
|
+
* - sheet は下端密着(bg-surface)のため、SafeAreaView を sheet の内側に置いて
|
|
12
|
+
* 下余白(ホームインジケータ)まで sheet 背景で覆いつつ content を安全域に収める。
|
|
13
|
+
* - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
|
|
14
|
+
* - style の決定は pure resolver(bottom-sheet.styles.ts)に分離 — recipe との機械照合対象。
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { useMemo } from "react";
|
|
18
|
+
import { Modal as RNModal, Pressable, SafeAreaView, Text as RNText, View } from "react-native";
|
|
19
|
+
import { useTheme } from "../theme/index.js";
|
|
20
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
21
|
+
import { resolveBottomSheetStyle } from "./bottom-sheet.styles.js";
|
|
22
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
|
+
export function BottomSheet({
|
|
24
|
+
visible,
|
|
25
|
+
onClose,
|
|
26
|
+
title,
|
|
27
|
+
testID,
|
|
28
|
+
children
|
|
29
|
+
}) {
|
|
30
|
+
const {
|
|
31
|
+
theme,
|
|
32
|
+
mode
|
|
33
|
+
} = useTheme();
|
|
34
|
+
const styles = useMemo(() => resolveBottomSheetStyle(theme, mode), [theme, mode]);
|
|
35
|
+
return /*#__PURE__*/_jsx(RNModal, {
|
|
36
|
+
visible: visible,
|
|
37
|
+
transparent: true,
|
|
38
|
+
animationType: "slide",
|
|
39
|
+
onRequestClose: onClose,
|
|
40
|
+
statusBarTranslucent: true,
|
|
41
|
+
children: /*#__PURE__*/_jsx(Pressable, {
|
|
42
|
+
style: styles.overlayStyle,
|
|
43
|
+
onPress: onClose,
|
|
44
|
+
accessible: false,
|
|
45
|
+
children: /*#__PURE__*/_jsx(View, {
|
|
46
|
+
style: styles.sheetStyle,
|
|
47
|
+
accessibilityViewIsModal: true,
|
|
48
|
+
onStartShouldSetResponder: () => true,
|
|
49
|
+
testID: testID,
|
|
50
|
+
children: /*#__PURE__*/_jsxs(SafeAreaView, {
|
|
51
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
52
|
+
style: styles.grabberStyle,
|
|
53
|
+
importantForAccessibility: "no",
|
|
54
|
+
accessibilityElementsHidden: true
|
|
55
|
+
}), title != null && /*#__PURE__*/_jsx(RNText, {
|
|
56
|
+
style: styles.titleStyle,
|
|
57
|
+
accessibilityRole: "header",
|
|
58
|
+
children: title
|
|
59
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
60
|
+
style: styles.contentStyle,
|
|
61
|
+
children: children
|
|
62
|
+
})]
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
BottomSheet.__contract = CONTRACTS.bottomSheet;
|
|
69
|
+
//# sourceMappingURL=BottomSheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","Modal","RNModal","Pressable","SafeAreaView","Text","RNText","View","useTheme","CONTRACTS","resolveBottomSheetStyle","jsx","_jsx","jsxs","_jsxs","BottomSheet","visible","onClose","title","testID","children","theme","mode","styles","transparent","animationType","onRequestClose","statusBarTranslucent","style","overlayStyle","onPress","accessible","sheetStyle","accessibilityViewIsModal","onStartShouldSetResponder","grabberStyle","importantForAccessibility","accessibilityElementsHidden","titleStyle","accessibilityRole","contentStyle","__contract","bottomSheet"],"sourceRoot":"../../../src","sources":["components/BottomSheet.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SACEC,KAAK,IAAIC,OAAO,EAChBC,SAAS,EACTC,YAAY,EACZC,IAAI,IAAIC,MAAM,EACdC,IAAI,QACC,cAAc;AACrB,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,uBAAuB,QAA+B,0BAAuB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAavF,OAAO,SAASC,WAAWA,CAAC;EAAEC,OAAO;EAAEC,OAAO;EAAEC,KAAK;EAAEC,MAAM;EAAEC;AAA2B,CAAC,EAAE;EAC3F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGd,QAAQ,CAAC,CAAC;EAElC,MAAMe,MAAM,GAAGvB,OAAO,CACpB,MAAMU,uBAAuB,CAACW,KAAK,EAAEC,IAAI,CAAC,EAC1C,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,oBACEV,IAAA,CAACV,OAAO;IACNc,OAAO,EAAEA,OAAQ;IACjBQ,WAAW;IACXC,aAAa,EAAC,OAAO;IACrBC,cAAc,EAAET,OAAQ;IACxBU,oBAAoB;IAAAP,QAAA,eAEpBR,IAAA,CAACT,SAAS;MAACyB,KAAK,EAAEL,MAAM,CAACM,YAAa;MAACC,OAAO,EAAEb,OAAQ;MAACc,UAAU,EAAE,KAAM;MAAAX,QAAA,eACzER,IAAA,CAACL,IAAI;QACHqB,KAAK,EAAEL,MAAM,CAACS,UAAW;QACzBC,wBAAwB;QACxBC,yBAAyB,EAAEA,CAAA,KAAM,IAAK;QACtCf,MAAM,EAAEA,MAAO;QAAAC,QAAA,eAEfN,KAAA,CAACV,YAAY;UAAAgB,QAAA,gBAEXR,IAAA,CAACL,IAAI;YACHqB,KAAK,EAAEL,MAAM,CAACY,YAAa;YAC3BC,yBAAyB,EAAC,IAAI;YAC9BC,2BAA2B;UAAA,CAC5B,CAAC,EACDnB,KAAK,IAAI,IAAI,iBACZN,IAAA,CAACN,MAAM;YAACsB,KAAK,EAAEL,MAAM,CAACe,UAAW;YAACC,iBAAiB,EAAC,QAAQ;YAAAnB,QAAA,EACzDF;UAAK,CACA,CACT,eACDN,IAAA,CAACL,IAAI;YAACqB,KAAK,EAAEL,MAAM,CAACiB,YAAa;YAAApB,QAAA,EAAEA;UAAQ,CAAO,CAAC;QAAA,CACvC;MAAC,CACX;IAAC,CACE;EAAC,CACL,CAAC;AAEd;AAEAL,WAAW,CAAC0B,UAAU,GAAGhC,SAAS,CAACiC,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Card — コンテンツコンテナ component(設計書 §1)。contract: card。
|
|
5
|
+
*
|
|
6
|
+
* - 土台の解決(bg/radius/elevation/border/padding)は pure resolver(card.styles.ts の
|
|
7
|
+
* resolveCardShape)に一元化し、非インタラクティブ(View)・インタラクティブ(Pressable) の
|
|
8
|
+
* 両分岐で共有する(DRY、形状二重定義を防ぐ)。recipe との機械照合は
|
|
9
|
+
* scripts/lib/card-conformance.test.ts が行う。
|
|
10
|
+
* - variant: basic/media は非インタラクティブ、action/link は Pressable。
|
|
11
|
+
* action/link は pressed 時 elevation.sm→md(§2 hover→pressed mapping)。
|
|
12
|
+
* focus-within は RN 非サポートとして Phase1 明示 drop(§2)。
|
|
13
|
+
* - 型で action/link は onPress 必須を強制(§4 の DU 精神。無言で非対話に落ちる事故を防ぐ)。
|
|
14
|
+
* - Card は Image/Metric に依存しない(§1)。media/header/footer/children に呼び出し側が差し込む。
|
|
15
|
+
* ツー活カードは D2I が slot に Image+Metric を compose する。
|
|
16
|
+
* - media variant は overflow:hidden で角丸に画像をクリップし、body だけにパディング(contract と整合)。
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { Pressable, View } from "react-native";
|
|
20
|
+
import { useTheme } from "../theme/index.js";
|
|
21
|
+
import { useFocusRing, FocusRing } from "../primitives/_internal/focus-ring.js";
|
|
22
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
23
|
+
import { CARD_INTERACTIVE, resolveCardShape, resolveCardBodyStyle } from "./card.styles.js";
|
|
24
|
+
|
|
25
|
+
// action/link(インタラクティブ)は onPress 必須、basic/media は onPress を取らない(§4 DU 精神)。
|
|
26
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
27
|
+
export function Card({
|
|
28
|
+
variant = "basic",
|
|
29
|
+
header,
|
|
30
|
+
footer,
|
|
31
|
+
media,
|
|
32
|
+
onPress,
|
|
33
|
+
accessibilityLabel,
|
|
34
|
+
style,
|
|
35
|
+
testID,
|
|
36
|
+
children
|
|
37
|
+
}) {
|
|
38
|
+
const {
|
|
39
|
+
theme,
|
|
40
|
+
mode
|
|
41
|
+
} = useTheme();
|
|
42
|
+
const {
|
|
43
|
+
focused,
|
|
44
|
+
focusHandlers
|
|
45
|
+
} = useFocusRing();
|
|
46
|
+
const interactive = CARD_INTERACTIVE[variant] && onPress != null;
|
|
47
|
+
const isMedia = variant === "media";
|
|
48
|
+
const inner = /*#__PURE__*/_jsxs(_Fragment, {
|
|
49
|
+
children: [media != null && /*#__PURE__*/_jsx(View, {
|
|
50
|
+
children: media
|
|
51
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
52
|
+
style: resolveCardBodyStyle(theme, variant),
|
|
53
|
+
children: [header, children, footer]
|
|
54
|
+
})]
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// media は内側 clip View で角丸クリップ(外枠の影を消さないため overflow は内側だけに置く、M-1)。
|
|
58
|
+
// borderRadius は外枠 radius.lg から border 分を引かず同値でクリップ(視覚差は実機で微調整可)。
|
|
59
|
+
const content = isMedia ? /*#__PURE__*/_jsx(View, {
|
|
60
|
+
style: {
|
|
61
|
+
borderRadius: theme.radius.lg,
|
|
62
|
+
overflow: "hidden"
|
|
63
|
+
},
|
|
64
|
+
children: inner
|
|
65
|
+
}) : inner;
|
|
66
|
+
if (!interactive) {
|
|
67
|
+
return /*#__PURE__*/_jsx(View, {
|
|
68
|
+
testID: testID,
|
|
69
|
+
style: [resolveCardShape(theme, mode, variant), style],
|
|
70
|
+
children: content
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// action/link: pressed 時 elevation.sm→md、focus 時 ring overlay。
|
|
75
|
+
return /*#__PURE__*/_jsxs(Pressable, {
|
|
76
|
+
...focusHandlers,
|
|
77
|
+
onPress: onPress,
|
|
78
|
+
accessibilityRole: "button",
|
|
79
|
+
accessibilityLabel: accessibilityLabel,
|
|
80
|
+
testID: testID,
|
|
81
|
+
style: ({
|
|
82
|
+
pressed
|
|
83
|
+
}) => [resolveCardShape(theme, mode, variant, pressed), style],
|
|
84
|
+
children: [content, /*#__PURE__*/_jsx(FocusRing, {
|
|
85
|
+
visible: focused,
|
|
86
|
+
radius: theme.radius.lg
|
|
87
|
+
})]
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Phase 2 conformance test 用の contract メタ(§2 A-3)。
|
|
92
|
+
Card.__contract = CONTRACTS.card;
|
|
93
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Pressable","View","useTheme","useFocusRing","FocusRing","CONTRACTS","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","Card","variant","header","footer","media","onPress","accessibilityLabel","style","testID","children","theme","mode","focused","focusHandlers","interactive","isMedia","inner","content","borderRadius","radius","lg","overflow","accessibilityRole","pressed","visible","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,SAAS,EAAEC,IAAI,QAAwC,cAAc;AAC9E,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,YAAY,EAAEC,SAAS,QAAQ,uCAAoC;AAC5E,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,oBAAoB,QAAQ,kBAAe;;AAaxF;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAOA,OAAO,SAASC,IAAIA,CAAC;EACnBC,OAAO,GAAG,OAAO;EACjBC,MAAM;EACNC,MAAM;EACNC,KAAK;EACLC,OAAO;EACPC,kBAAkB;EAClBC,KAAK;EACLC,MAAM;EACNC;AACS,CAAC,EAAE;EACZ,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGxB,QAAQ,CAAC,CAAC;EAClC,MAAM;IAAEyB,OAAO;IAAEC;EAAc,CAAC,GAAGzB,YAAY,CAAC,CAAC;EACjD,MAAM0B,WAAW,GAAGvB,gBAAgB,CAACU,OAAO,CAAC,IAAII,OAAO,IAAI,IAAI;EAChE,MAAMU,OAAO,GAAGd,OAAO,KAAK,OAAO;EAEnC,MAAMe,KAAK,gBACTnB,KAAA,CAAAE,SAAA;IAAAU,QAAA,GACGL,KAAK,IAAI,IAAI,iBAAIT,IAAA,CAACT,IAAI;MAAAuB,QAAA,EAAEL;IAAK,CAAO,CAAC,eACtCP,KAAA,CAACX,IAAI;MAACqB,KAAK,EAAEd,oBAAoB,CAACiB,KAAK,EAAET,OAAO,CAAE;MAAAQ,QAAA,GAC/CP,MAAM,EACNO,QAAQ,EACRN,MAAM;IAAA,CACH,CAAC;EAAA,CACP,CACH;;EAED;EACA;EACA,MAAMc,OAAO,GAAGF,OAAO,gBACrBpB,IAAA,CAACT,IAAI;IAACqB,KAAK,EAAE;MAAEW,YAAY,EAAER,KAAK,CAACS,MAAM,CAACC,EAAE;MAAEC,QAAQ,EAAE;IAAS,CAAE;IAAAZ,QAAA,EAAEO;EAAK,CAAO,CAAC,GAElFA,KACD;EAED,IAAI,CAACF,WAAW,EAAE;IAChB,oBACEnB,IAAA,CAACT,IAAI;MAACsB,MAAM,EAAEA,MAAO;MAACD,KAAK,EAAE,CAACf,gBAAgB,CAACkB,KAAK,EAAEC,IAAI,EAAEV,OAAO,CAAC,EAAEM,KAAK,CAAE;MAAAE,QAAA,EAC1EQ;IAAO,CACJ,CAAC;EAEX;;EAEA;EACA,oBACEpB,KAAA,CAACZ,SAAS;IAAA,GACJ4B,aAAa;IACjBR,OAAO,EAAEA,OAAQ;IACjBiB,iBAAiB,EAAC,QAAQ;IAC1BhB,kBAAkB,EAAEA,kBAAmB;IACvCE,MAAM,EAAEA,MAAO;IACfD,KAAK,EAAEA,CAAC;MAAEgB;IAAQ,CAAC,KAAK,CAAC/B,gBAAgB,CAACkB,KAAK,EAAEC,IAAI,EAAEV,OAAO,EAAEsB,OAAO,CAAC,EAAEhB,KAAK,CAAE;IAAAE,QAAA,GAEhFQ,OAAO,eACRtB,IAAA,CAACN,SAAS;MAACmC,OAAO,EAAEZ,OAAQ;MAACO,MAAM,EAAET,KAAK,CAACS,MAAM,CAACC;IAAG,CAAE,CAAC;EAAA,CAC/C,CAAC;AAEhB;;AAEA;AACApB,IAAI,CAACyB,UAAU,GAAGnC,SAAS,CAACoC,IAAI","ignoreList":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Checkbox — 複数選択フォームコントロール(form-input 第1弾)。contract: checkbox。
|
|
5
|
+
*
|
|
6
|
+
* - RN にネイティブ checkbox が無いため Pressable(行全体タップ)+ 描画で実装する。
|
|
7
|
+
* checkmark は rotate した View の L 字 border、indeterminate は横棒
|
|
8
|
+
* (react-native-svg 非依存 = 本体エントリの依存ゼロ維持。recipe description 参照)。
|
|
9
|
+
* - box は 20px(web の 16px より大きいのはタッチ前提)。実タッチ領域は hitSlop 12 で
|
|
10
|
+
* 44pt(20 + 12×2)を確保する。
|
|
11
|
+
* - label 必須(FORM_NO_LABEL_OMIT を props 型で強制)。label は Text primitive
|
|
12
|
+
* (base/text-default = recipe labelStyle と同値)。
|
|
13
|
+
* - states(contract → prop の写像): checked/unchecked → checked:boolean、
|
|
14
|
+
* indeterminate → indeterminate:boolean(variant "indeterminate"。a11y は "mixed")、
|
|
15
|
+
* error → error:boolean(borderColor 差分、checked より優先)、disabled → prop
|
|
16
|
+
* (opacity 0.5 + 非活性)。focus は Phase1 非対応(recipe にも focus 差分なし)。
|
|
17
|
+
* - 色・寸法の決定は pure resolver(checkbox.styles.ts)に分離。
|
|
18
|
+
* recipes/app/checkbox.recipe.json との機械照合は scripts/lib/checkbox-conformance.test.ts が行う。
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { useMemo } from "react";
|
|
22
|
+
import { Pressable, View } from "react-native";
|
|
23
|
+
import { Text } from "../primitives/Text.js";
|
|
24
|
+
import { useTheme } from "../theme/index.js";
|
|
25
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
26
|
+
import { CHECKBOX_SPEC, resolveCheckboxStyle } from "./checkbox.styles.js";
|
|
27
|
+
|
|
28
|
+
/** checkmark / 横棒の幾何値(recipe に token 化されていない描画トリック側の定数)。 */
|
|
29
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
30
|
+
const CHECKMARK = {
|
|
31
|
+
width: 10,
|
|
32
|
+
height: 6,
|
|
33
|
+
borderWidth: 2,
|
|
34
|
+
offsetY: -1
|
|
35
|
+
};
|
|
36
|
+
const INDETERMINATE_BAR = {
|
|
37
|
+
width: 10,
|
|
38
|
+
height: 2
|
|
39
|
+
};
|
|
40
|
+
export function Checkbox({
|
|
41
|
+
label,
|
|
42
|
+
checked,
|
|
43
|
+
onChange,
|
|
44
|
+
indeterminate = false,
|
|
45
|
+
disabled = false,
|
|
46
|
+
error = false,
|
|
47
|
+
testID
|
|
48
|
+
}) {
|
|
49
|
+
const {
|
|
50
|
+
theme,
|
|
51
|
+
mode
|
|
52
|
+
} = useTheme();
|
|
53
|
+
const resolved = useMemo(() => resolveCheckboxStyle(theme, mode, {
|
|
54
|
+
checked,
|
|
55
|
+
indeterminate,
|
|
56
|
+
error
|
|
57
|
+
}), [theme, mode, checked, indeterminate, error]);
|
|
58
|
+
return /*#__PURE__*/_jsxs(Pressable, {
|
|
59
|
+
onPress: () => onChange(!checked),
|
|
60
|
+
disabled: disabled,
|
|
61
|
+
hitSlop: CHECKBOX_SPEC.hitSlop,
|
|
62
|
+
accessibilityRole: "checkbox",
|
|
63
|
+
accessibilityState: {
|
|
64
|
+
checked: indeterminate ? "mixed" : checked,
|
|
65
|
+
disabled
|
|
66
|
+
},
|
|
67
|
+
accessibilityLabel: label,
|
|
68
|
+
testID: testID,
|
|
69
|
+
style: {
|
|
70
|
+
flexDirection: "row",
|
|
71
|
+
alignItems: "center",
|
|
72
|
+
gap: resolved.gap,
|
|
73
|
+
opacity: disabled ? CHECKBOX_SPEC.disabledOpacity : 1
|
|
74
|
+
},
|
|
75
|
+
children: [/*#__PURE__*/_jsx(View, {
|
|
76
|
+
style: [resolved.boxStyle, {
|
|
77
|
+
alignItems: "center",
|
|
78
|
+
justifyContent: "center"
|
|
79
|
+
}],
|
|
80
|
+
children: indeterminate ?
|
|
81
|
+
/*#__PURE__*/
|
|
82
|
+
// 横棒(一部選択)。markColor = text-on-accent(states.checked.markColor と同源)。
|
|
83
|
+
_jsx(View, {
|
|
84
|
+
style: {
|
|
85
|
+
width: INDETERMINATE_BAR.width,
|
|
86
|
+
height: INDETERMINATE_BAR.height,
|
|
87
|
+
backgroundColor: resolved.markColor
|
|
88
|
+
}
|
|
89
|
+
}) : checked ?
|
|
90
|
+
/*#__PURE__*/
|
|
91
|
+
// L 字 border を -45deg 回転させた checkmark(svg 非依存の描画トリック)。
|
|
92
|
+
_jsx(View, {
|
|
93
|
+
style: {
|
|
94
|
+
width: CHECKMARK.width,
|
|
95
|
+
height: CHECKMARK.height,
|
|
96
|
+
borderLeftWidth: CHECKMARK.borderWidth,
|
|
97
|
+
borderBottomWidth: CHECKMARK.borderWidth,
|
|
98
|
+
borderColor: resolved.markColor,
|
|
99
|
+
marginTop: CHECKMARK.offsetY,
|
|
100
|
+
transform: [{
|
|
101
|
+
rotate: "-45deg"
|
|
102
|
+
}]
|
|
103
|
+
}
|
|
104
|
+
}) : null
|
|
105
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
106
|
+
variant: "base",
|
|
107
|
+
color: "text-default",
|
|
108
|
+
children: label
|
|
109
|
+
})]
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Phase 2 conformance test 用の contract メタ(§2 A-3)。
|
|
114
|
+
Checkbox.__contract = CONTRACTS.checkbox;
|
|
115
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","CHECKBOX_SPEC","resolveCheckboxStyle","jsx","_jsx","jsxs","_jsxs","CHECKMARK","width","height","borderWidth","offsetY","INDETERMINATE_BAR","Checkbox","label","checked","onChange","indeterminate","disabled","error","testID","theme","mode","resolved","onPress","hitSlop","accessibilityRole","accessibilityState","accessibilityLabel","style","flexDirection","alignItems","gap","opacity","disabledOpacity","children","boxStyle","justifyContent","backgroundColor","markColor","borderLeftWidth","borderBottomWidth","borderColor","marginTop","transform","rotate","variant","color","__contract","checkbox"],"sourceRoot":"../../../src","sources":["components/Checkbox.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* EmptyState — データ無し時のプレースホルダー(設計書 §1)。contract: empty-state。
|
|
5
|
+
* Text + Button の compose(§1)。icon + title + description + 任意の action。
|
|
6
|
+
*
|
|
7
|
+
* - title は見出しとして読み上げ(Text role="heading")。
|
|
8
|
+
* - action は Button(contained) を内部 compose。
|
|
9
|
+
* - 中央寄せレイアウト。色は token(title=text-heading, description=text-muted)。
|
|
10
|
+
* - 色・寸法の決定は pure resolver(empty-state.styles.ts)に分離。Text へ渡すキーも
|
|
11
|
+
* EMPTY_STATE_SPEC(同ファイル)を SSOT として共有し、
|
|
12
|
+
* recipes/app/empty-state.recipe.json との機械照合は scripts/lib/empty-state-conformance.test.ts が行う。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useMemo } from "react";
|
|
16
|
+
import { View } from "react-native";
|
|
17
|
+
import { Text } from "../primitives/Text.js";
|
|
18
|
+
import { Button } from "../primitives/Button.js";
|
|
19
|
+
import { useTheme } from "../theme/index.js";
|
|
20
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
21
|
+
import { EMPTY_STATE_SPEC, resolveEmptyStateStyles } from "./empty-state.styles.js";
|
|
22
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
|
+
export function EmptyState({
|
|
24
|
+
icon,
|
|
25
|
+
title,
|
|
26
|
+
description,
|
|
27
|
+
action,
|
|
28
|
+
style,
|
|
29
|
+
testID
|
|
30
|
+
}) {
|
|
31
|
+
const {
|
|
32
|
+
theme,
|
|
33
|
+
mode
|
|
34
|
+
} = useTheme();
|
|
35
|
+
const styles = useMemo(() => resolveEmptyStateStyles(theme, mode), [theme, mode]);
|
|
36
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
37
|
+
testID: testID,
|
|
38
|
+
style: [styles.style, style],
|
|
39
|
+
children: [icon != null && /*#__PURE__*/_jsx(View, {
|
|
40
|
+
children: icon
|
|
41
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
42
|
+
variant: EMPTY_STATE_SPEC.titleFont,
|
|
43
|
+
role: "heading",
|
|
44
|
+
weight: EMPTY_STATE_SPEC.titleWeight,
|
|
45
|
+
color: EMPTY_STATE_SPEC.titleColor,
|
|
46
|
+
style: {
|
|
47
|
+
textAlign: styles.titleStyle.textAlign
|
|
48
|
+
},
|
|
49
|
+
children: title
|
|
50
|
+
}), description != null && /*#__PURE__*/_jsx(Text, {
|
|
51
|
+
variant: EMPTY_STATE_SPEC.descriptionFont,
|
|
52
|
+
color: EMPTY_STATE_SPEC.descriptionColor,
|
|
53
|
+
style: {
|
|
54
|
+
textAlign: styles.descriptionStyle.textAlign
|
|
55
|
+
},
|
|
56
|
+
children: description
|
|
57
|
+
}), action != null && /*#__PURE__*/_jsx(View, {
|
|
58
|
+
style: styles.actionStyle,
|
|
59
|
+
children: /*#__PURE__*/_jsx(Button, {
|
|
60
|
+
variant: "contained",
|
|
61
|
+
label: action.label,
|
|
62
|
+
onPress: action.onPress
|
|
63
|
+
})
|
|
64
|
+
})]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Phase 2 conformance test 用の contract メタ(§2 A-3)。
|
|
69
|
+
EmptyState.__contract = CONTRACTS.emptyState;
|
|
70
|
+
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","View","Text","Button","useTheme","CONTRACTS","EMPTY_STATE_SPEC","resolveEmptyStateStyles","jsx","_jsx","jsxs","_jsxs","EmptyState","icon","title","description","action","style","testID","theme","mode","styles","children","variant","titleFont","role","weight","titleWeight","color","titleColor","textAlign","titleStyle","descriptionFont","descriptionColor","descriptionStyle","actionStyle","label","onPress","__contract","emptyState"],"sourceRoot":"../../../src","sources":["components/EmptyState.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,MAAM,QAAQ,yBAAsB;AAC7C,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,gBAAgB,EAAEC,uBAAuB,QAAQ,yBAAsB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAWjF,OAAO,SAASC,UAAUA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,WAAW;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAwB,CAAC,EAAE;EAC/F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAClC,MAAMiB,MAAM,GAAGrB,OAAO,CAAC,MAAMO,uBAAuB,CAACY,KAAK,EAAEC,IAAI,CAAC,EAAE,CAACD,KAAK,EAAEC,IAAI,CAAC,CAAC;EACjF,oBACET,KAAA,CAACV,IAAI;IAACiB,MAAM,EAAEA,MAAO;IAACD,KAAK,EAAE,CAACI,MAAM,CAACJ,KAAK,EAAEA,KAAK,CAAE;IAAAK,QAAA,GAChDT,IAAI,IAAI,IAAI,iBAAIJ,IAAA,CAACR,IAAI;MAAAqB,QAAA,EAAET;IAAI,CAAO,CAAC,eACpCJ,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAACkB,SAAU;MACpCC,IAAI,EAAC,SAAS;MACdC,MAAM,EAAEpB,gBAAgB,CAACqB,WAAY;MACrCC,KAAK,EAAEtB,gBAAgB,CAACuB,UAAW;MACnCZ,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACU,UAAU,CAACD;MAAU,CAAE;MAAAR,QAAA,EAEjDR;IAAK,CACF,CAAC,EACNC,WAAW,IAAI,IAAI,iBAClBN,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAAC0B,eAAgB;MAC1CJ,KAAK,EAAEtB,gBAAgB,CAAC2B,gBAAiB;MACzChB,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACa,gBAAgB,CAACJ;MAAU,CAAE;MAAAR,QAAA,EAEvDP;IAAW,CACR,CACP,EACAC,MAAM,IAAI,IAAI,iBACbP,IAAA,CAACR,IAAI;MAACgB,KAAK,EAAEI,MAAM,CAACc,WAAY;MAAAb,QAAA,eAC9Bb,IAAA,CAACN,MAAM;QAACoB,OAAO,EAAC,WAAW;QAACa,KAAK,EAAEpB,MAAM,CAACoB,KAAM;QAACC,OAAO,EAAErB,MAAM,CAACqB;MAAQ,CAAE;IAAC,CACxE,CACP;EAAA,CACG,CAAC;AAEX;;AAEA;AACAzB,UAAU,CAAC0B,UAAU,GAAGjC,SAAS,CAACkC,UAAU","ignoreList":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Header — 画面ヘッダー primitive(title + leading? / trailing? slot + 下 border)。
|
|
5
|
+
* contract: header(app 先行定義、melta-contracts)。dogfood 不足-3 の解消。
|
|
6
|
+
* Screen の header slot に差して使う想定(単体でも使える)。
|
|
7
|
+
*
|
|
8
|
+
* - title は melta の Text(xl / bold / text-heading / heading role)で描画し、
|
|
9
|
+
* heading として読み上げられる(contract a11y required)。
|
|
10
|
+
* - titleWrapStyle の flex:1 で title が余白を占有し trailing を右端へ押す。
|
|
11
|
+
* - 決定ロジックは pure resolver(header.styles.ts)に分離 — recipe との機械照合対象。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { useMemo } from "react";
|
|
15
|
+
import { View } from "react-native";
|
|
16
|
+
import { useTheme } from "../theme/index.js";
|
|
17
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
18
|
+
import { Text } from "../primitives/Text.js";
|
|
19
|
+
import { resolveHeaderStyle } from "./header.styles.js";
|
|
20
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
21
|
+
export function Header({
|
|
22
|
+
title,
|
|
23
|
+
leading,
|
|
24
|
+
trailing,
|
|
25
|
+
style,
|
|
26
|
+
testID
|
|
27
|
+
}) {
|
|
28
|
+
const {
|
|
29
|
+
theme,
|
|
30
|
+
mode
|
|
31
|
+
} = useTheme();
|
|
32
|
+
const {
|
|
33
|
+
containerStyle,
|
|
34
|
+
titleWrapStyle
|
|
35
|
+
} = useMemo(() => resolveHeaderStyle(theme, mode), [theme, mode]);
|
|
36
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
37
|
+
style: [containerStyle, style],
|
|
38
|
+
testID: testID,
|
|
39
|
+
children: [leading, /*#__PURE__*/_jsx(View, {
|
|
40
|
+
style: titleWrapStyle,
|
|
41
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
42
|
+
variant: "xl",
|
|
43
|
+
weight: "bold",
|
|
44
|
+
color: "text-heading",
|
|
45
|
+
role: "heading",
|
|
46
|
+
numberOfLines: 1,
|
|
47
|
+
children: title
|
|
48
|
+
})
|
|
49
|
+
}), trailing]
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
Header.__contract = CONTRACTS.header;
|
|
53
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useMemo","View","useTheme","CONTRACTS","Text","resolveHeaderStyle","jsx","_jsx","jsxs","_jsxs","Header","title","leading","trailing","style","testID","theme","mode","containerStyle","titleWrapStyle","children","variant","weight","color","role","numberOfLines","__contract","header"],"sourceRoot":"../../../src","sources":["components/Header.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,kBAAkB,QAA0B,oBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAavE,OAAO,SAASC,MAAMA,CAAC;EAAEC,KAAK;EAAEC,OAAO;EAAEC,QAAQ;EAAEC,KAAK;EAAEC;AAAoB,CAAC,EAAE;EAC/E,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGf,QAAQ,CAAC,CAAC;EAElC,MAAM;IAAEgB,cAAc;IAAEC;EAAe,CAAC,GAAGnB,OAAO,CAChD,MAAMK,kBAAkB,CAACW,KAAK,EAAEC,IAAI,CAAC,EACrC,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,oBACER,KAAA,CAACR,IAAI;IAACa,KAAK,EAAE,CAACI,cAAc,EAAEJ,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAK,QAAA,GAClDR,OAAO,eACRL,IAAA,CAACN,IAAI;MAACa,KAAK,EAAEK,cAAe;MAAAC,QAAA,eAC1Bb,IAAA,CAACH,IAAI;QAACiB,OAAO,EAAC,IAAI;QAACC,MAAM,EAAC,MAAM;QAACC,KAAK,EAAC,cAAc;QAACC,IAAI,EAAC,SAAS;QAACC,aAAa,EAAE,CAAE;QAAAL,QAAA,EACnFT;MAAK,CACF;IAAC,CACH,CAAC,EACNE,QAAQ;EAAA,CACL,CAAC;AAEX;AAEAH,MAAM,CAACgB,UAAU,GAAGvB,SAAS,CAACwB,MAAM","ignoreList":[]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Image — 画像表示 component(設計書 §1)。contract: image(app 先行定義)。
|
|
5
|
+
*
|
|
6
|
+
* - Phase 1 は RN コア Image。expo-image は Phase 2(blurhash / 高度 cache 要件化時)。
|
|
7
|
+
* 差し替えコスト最小化のためここで包む(呼び出し側は melta-app の Image だけ見る)。
|
|
8
|
+
* - contentFit("cover"|"contain") → RN の resizeMode に変換。
|
|
9
|
+
* - onError 時に fallback(ReactNode)を表示。fallback 未指定なら何も出さない。
|
|
10
|
+
* - radius は token キーのみ(生数値不可、§5)。shape の解決は pure resolver
|
|
11
|
+
* (image.styles.ts)に分離。recipes/app/image.recipe.json との機械照合は
|
|
12
|
+
* scripts/lib/image-conformance.test.ts が行う。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useState } from "react";
|
|
16
|
+
import { Image as RNImage, View } from "react-native";
|
|
17
|
+
import { useTheme } from "../theme/index.js";
|
|
18
|
+
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
19
|
+
import { resolveImageShape } from "./image.styles.js";
|
|
20
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
21
|
+
export function Image({
|
|
22
|
+
source,
|
|
23
|
+
aspectRatio,
|
|
24
|
+
radius,
|
|
25
|
+
contentFit = "cover",
|
|
26
|
+
fallback,
|
|
27
|
+
accessibilityLabel,
|
|
28
|
+
style,
|
|
29
|
+
testID
|
|
30
|
+
}) {
|
|
31
|
+
const {
|
|
32
|
+
theme
|
|
33
|
+
} = useTheme();
|
|
34
|
+
const [errored, setErrored] = useState(false);
|
|
35
|
+
|
|
36
|
+
// shape は ImageStyle / ViewStyle 双方に有効な共通サブセット(resolver 参照)なので、
|
|
37
|
+
// RNImage と fallback View で同じ値を共用できる。
|
|
38
|
+
const shape = resolveImageShape(theme, {
|
|
39
|
+
aspectRatio,
|
|
40
|
+
radius
|
|
41
|
+
});
|
|
42
|
+
if (errored && fallback != null) {
|
|
43
|
+
// caller の style(width/height/flex 等の layout)を fallback にも反映する(通常画像と同寸法)。
|
|
44
|
+
// ImageStyle ⊃ ViewStyle ではないが layout プロパティは共通なので cast で流す
|
|
45
|
+
// (overflow:"scroll" 等 Image 固有値を caller が入れた稀ケースのみ無視される)。
|
|
46
|
+
return /*#__PURE__*/_jsx(View, {
|
|
47
|
+
style: [shape, style],
|
|
48
|
+
testID: testID,
|
|
49
|
+
accessible: accessibilityLabel != null,
|
|
50
|
+
accessibilityLabel: accessibilityLabel,
|
|
51
|
+
children: fallback
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return /*#__PURE__*/_jsx(RNImage, {
|
|
55
|
+
testID: testID,
|
|
56
|
+
source: source,
|
|
57
|
+
resizeMode: contentFit,
|
|
58
|
+
onError: () => setErrored(true),
|
|
59
|
+
accessible: accessibilityLabel != null,
|
|
60
|
+
accessibilityLabel: accessibilityLabel,
|
|
61
|
+
style: [shape, style]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Phase 2 conformance test 用の contract メタ(§2 A-3)。
|
|
66
|
+
Image.__contract = CONTRACTS.image;
|
|
67
|
+
//# sourceMappingURL=Image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useState","Image","RNImage","View","useTheme","CONTRACTS","resolveImageShape","jsx","_jsx","source","aspectRatio","radius","contentFit","fallback","accessibilityLabel","style","testID","theme","errored","setErrored","shape","accessible","children","resizeMode","onError","__contract","image"],"sourceRoot":"../../../src","sources":["components/Image.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAwB,OAAO;AAChD,SACEC,KAAK,IAAIC,OAAO,EAChBC,IAAI,QAKC,cAAc;AACrB,SAASC,QAAQ,QAAQ,mBAAU;AAEnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,iBAAiB,QAAQ,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAiBnD,OAAO,SAASP,KAAKA,CAAC;EACpBQ,MAAM;EACNC,WAAW;EACXC,MAAM;EACNC,UAAU,GAAG,OAAO;EACpBC,QAAQ;EACRC,kBAAkB;EAClBC,KAAK;EACLC;AACU,CAAC,EAAE;EACb,MAAM;IAAEC;EAAM,CAAC,GAAGb,QAAQ,CAAC,CAAC;EAC5B,MAAM,CAACc,OAAO,EAAEC,UAAU,CAAC,GAAGnB,QAAQ,CAAC,KAAK,CAAC;;EAE7C;EACA;EACA,MAAMoB,KAAK,GAAGd,iBAAiB,CAACW,KAAK,EAAE;IAAEP,WAAW;IAAEC;EAAO,CAAC,CAAC;EAE/D,IAAIO,OAAO,IAAIL,QAAQ,IAAI,IAAI,EAAE;IAC/B;IACA;IACA;IACA,oBACEL,IAAA,CAACL,IAAI;MACHY,KAAK,EAAE,CAACK,KAAK,EAAEL,KAAK,CAAqC;MACzDC,MAAM,EAAEA,MAAO;MACfK,UAAU,EAAEP,kBAAkB,IAAI,IAAK;MACvCA,kBAAkB,EAAEA,kBAAmB;MAAAQ,QAAA,EAEtCT;IAAQ,CACL,CAAC;EAEX;EAEA,oBACEL,IAAA,CAACN,OAAO;IACNc,MAAM,EAAEA,MAAO;IACfP,MAAM,EAAEA,MAA8B;IACtCc,UAAU,EAAEX,UAAW;IACvBY,OAAO,EAAEA,CAAA,KAAML,UAAU,CAAC,IAAI,CAAE;IAChCE,UAAU,EAAEP,kBAAkB,IAAI,IAAK;IACvCA,kBAAkB,EAAEA,kBAAmB;IACvCC,KAAK,EAAE,CAACK,KAAK,EAAEL,KAAK;EAAE,CACvB,CAAC;AAEN;;AAEA;AACAd,KAAK,CAACwB,UAAU,GAAGpB,SAAS,CAACqB,KAAK","ignoreList":[]}
|