@momo-kits/native-kits 0.158.1-beta.1-debug → 0.158.1-beta.2-debug
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/compose/build.gradle.kts +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +15 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +15 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +1 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +4 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +11 -9
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +56 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +32 -0
- package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +16 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +58 -0
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +60 -0
- package/gradle.properties +1 -1
- package/local.properties +2 -2
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -11
- package/.claude/skills/design-system/SKILL.md +0 -88
- package/.claude/skills/design-system/references/components/avatar.md +0 -134
- package/.claude/skills/design-system/references/components/badge.md +0 -127
- package/.claude/skills/design-system/references/components/bottom-tab.md +0 -177
- package/.claude/skills/design-system/references/components/bottomsheet.md +0 -170
- package/.claude/skills/design-system/references/components/button.md +0 -206
- package/.claude/skills/design-system/references/components/carousel.md +0 -117
- package/.claude/skills/design-system/references/components/checkbox.md +0 -98
- package/.claude/skills/design-system/references/components/chip.md +0 -146
- package/.claude/skills/design-system/references/components/collapse.md +0 -120
- package/.claude/skills/design-system/references/components/date-picker.md +0 -119
- package/.claude/skills/design-system/references/components/divider.md +0 -84
- package/.claude/skills/design-system/references/components/icon.md +0 -130
- package/.claude/skills/design-system/references/components/image.md +0 -81
- package/.claude/skills/design-system/references/components/information.md +0 -107
- package/.claude/skills/design-system/references/components/input-dropdown.md +0 -138
- package/.claude/skills/design-system/references/components/input-money.md +0 -157
- package/.claude/skills/design-system/references/components/input-otp.md +0 -132
- package/.claude/skills/design-system/references/components/input-phone-number.md +0 -140
- package/.claude/skills/design-system/references/components/input-search.md +0 -124
- package/.claude/skills/design-system/references/components/input-text-area.md +0 -133
- package/.claude/skills/design-system/references/components/input.md +0 -152
- package/.claude/skills/design-system/references/components/loader.md +0 -87
- package/.claude/skills/design-system/references/components/pagination.md +0 -105
- package/.claude/skills/design-system/references/components/popup-notify.md +0 -128
- package/.claude/skills/design-system/references/components/progress-info.md +0 -114
- package/.claude/skills/design-system/references/components/radio.md +0 -86
- package/.claude/skills/design-system/references/components/rating.md +0 -126
- package/.claude/skills/design-system/references/components/skeleton.md +0 -120
- package/.claude/skills/design-system/references/components/slider.md +0 -141
- package/.claude/skills/design-system/references/components/snackbar.md +0 -97
- package/.claude/skills/design-system/references/components/stepper.md +0 -100
- package/.claude/skills/design-system/references/components/steps.md +0 -91
- package/.claude/skills/design-system/references/components/suggest-action.md +0 -95
- package/.claude/skills/design-system/references/components/swipe.md +0 -121
- package/.claude/skills/design-system/references/components/switch.md +0 -98
- package/.claude/skills/design-system/references/components/tab-view.md +0 -120
- package/.claude/skills/design-system/references/components/tag.md +0 -118
- package/.claude/skills/design-system/references/components/text.md +0 -151
- package/.claude/skills/design-system/references/components/toast.md +0 -99
- package/.claude/skills/design-system/references/components/tooltip.md +0 -138
- package/.claude/skills/design-system/references/components/top-nav-miniapp.md +0 -94
- package/.claude/skills/design-system/references/components/top-nav.md +0 -226
- package/.claude/skills/design-system/references/components/uploader.md +0 -115
- package/.claude/skills/design-system/references/navigation/bottom-tab.md +0 -131
- package/.claude/skills/design-system/references/navigation/bottomsheet.md +0 -161
- package/.claude/skills/design-system/references/navigation/modal.md +0 -133
- package/.claude/skills/design-system/references/navigation/navigation-options.md +0 -225
- package/.claude/skills/design-system/references/navigation/navigator.md +0 -111
- package/.claude/skills/design-system/references/navigation/setup.md +0 -134
- package/.claude/skills/design-system/references/navigation/stack.md +0 -128
- package/.claude/skills/design-system/references/spec-convention.md +0 -80
- package/.claude/skills/design-system/references/tokens/colors.md +0 -131
- package/.claude/skills/design-system/references/tokens/spacing-radius.md +0 -144
- package/.claude/skills/design-system/references/tokens/theme.md +0 -125
- package/.claude/skills/design-system/references/tokens/typography.md +0 -135
- package/.claude/skills/design-system-kits/SKILL.md +0 -102
- package/.claude/skills/design-system-kits/references/code-convention.md +0 -118
- package/.claude/skills/design-system-kits/references/components/avatar.md +0 -45
- package/.claude/skills/design-system-kits/references/components/badge.md +0 -27
- package/.claude/skills/design-system-kits/references/components/button.md +0 -65
- package/.claude/skills/design-system-kits/references/components/carousel.md +0 -51
- package/.claude/skills/design-system-kits/references/components/checkbox.md +0 -39
- package/.claude/skills/design-system-kits/references/components/chip.md +0 -54
- package/.claude/skills/design-system-kits/references/components/collapse.md +0 -63
- package/.claude/skills/design-system-kits/references/components/date-picker.md +0 -36
- package/.claude/skills/design-system-kits/references/components/divider.md +0 -21
- package/.claude/skills/design-system-kits/references/components/icon.md +0 -382
- package/.claude/skills/design-system-kits/references/components/image.md +0 -62
- package/.claude/skills/design-system-kits/references/components/information.md +0 -61
- package/.claude/skills/design-system-kits/references/components/input-dropdown.md +0 -92
- package/.claude/skills/design-system-kits/references/components/input-money.md +0 -128
- package/.claude/skills/design-system-kits/references/components/input-otp.md +0 -85
- package/.claude/skills/design-system-kits/references/components/input-phone-number.md +0 -96
- package/.claude/skills/design-system-kits/references/components/input-search.md +0 -127
- package/.claude/skills/design-system-kits/references/components/input-text-area.md +0 -100
- package/.claude/skills/design-system-kits/references/components/input.md +0 -126
- package/.claude/skills/design-system-kits/references/components/loader.md +0 -41
- package/.claude/skills/design-system-kits/references/components/pagination.md +0 -47
- package/.claude/skills/design-system-kits/references/components/popup-notify.md +0 -69
- package/.claude/skills/design-system-kits/references/components/popup-promotion.md +0 -35
- package/.claude/skills/design-system-kits/references/components/progress-info.md +0 -55
- package/.claude/skills/design-system-kits/references/components/radio.md +0 -42
- package/.claude/skills/design-system-kits/references/components/rating.md +0 -36
- package/.claude/skills/design-system-kits/references/components/skeleton.md +0 -25
- package/.claude/skills/design-system-kits/references/components/slider.md +0 -53
- package/.claude/skills/design-system-kits/references/components/snackbar.md +0 -52
- package/.claude/skills/design-system-kits/references/components/stepper.md +0 -46
- package/.claude/skills/design-system-kits/references/components/steps.md +0 -57
- package/.claude/skills/design-system-kits/references/components/suggest-action.md +0 -44
- package/.claude/skills/design-system-kits/references/components/swipe.md +0 -44
- package/.claude/skills/design-system-kits/references/components/switch.md +0 -43
- package/.claude/skills/design-system-kits/references/components/tab-view.md +0 -56
- package/.claude/skills/design-system-kits/references/components/tag.md +0 -50
- package/.claude/skills/design-system-kits/references/components/text.md +0 -56
- package/.claude/skills/design-system-kits/references/components/toast.md +0 -51
- package/.claude/skills/design-system-kits/references/components/tooltip.md +0 -95
- package/.claude/skills/design-system-kits/references/components/uploader.md +0 -48
- package/.claude/skills/design-system-kits/references/design-spec-structure.md +0 -356
- package/.claude/skills/design-system-kits/references/design-spec-to-code.md +0 -596
- package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +0 -155
- package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +0 -94
- package/.claude/skills/design-system-kits/references/navigation/modal.md +0 -125
- package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +0 -430
- package/.claude/skills/design-system-kits/references/navigation/navigator.md +0 -177
- package/.claude/skills/design-system-kits/references/navigation/setup.md +0 -94
- package/.claude/skills/design-system-kits/references/navigation/stack.md +0 -152
- package/.claude/skills/design-system-kits/references/screen-layout-rule.md +0 -125
- package/.claude/skills/design-system-kits/references/tokens/colors.md +0 -183
- package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +0 -45
- package/.claude/skills/design-system-kits/references/tokens/theme.md +0 -97
- package/.claude/skills/design-system-kits/references/tokens/typography.md +0 -105
- package/.claude/skills/vibe-design/SKILL.md +0 -306
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# Carousel
|
|
2
|
-
|
|
3
|
-
> Horizontal scrollable content container — snap-to-item behavior for banners, galleries, onboarding. Pairs with Pagination.
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/carousel`
|
|
6
|
-
**Platform:** RN ✅ | Compose ❌ (use HorizontalPager)
|
|
7
|
-
**Completeness:** need_update — thiếu Figma
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Props
|
|
13
|
-
|
|
14
|
-
| Prop | Type | Values | Default | Description |
|
|
15
|
-
|------|------|--------|---------|-------------|
|
|
16
|
-
| `items` | array | — | required | Data array for carousel items |
|
|
17
|
-
| `renderItem` | function | — | required | Render function per item [VERIFY] |
|
|
18
|
-
| `autoPlay` | boolean | `true` \| `false` | `false` | Auto-advance between items |
|
|
19
|
-
| `autoPlayInterval` | number | milliseconds | `3000` | Interval between auto-advances [VERIFY] |
|
|
20
|
-
| `loop` | boolean | `true` \| `false` | `false` | Seamless wrap from last → first item [VERIFY] |
|
|
21
|
-
| `showPagination` | boolean | `true` \| `false` | `true` | Show PaginationDot below carousel [VERIFY] |
|
|
22
|
-
| `paginationType` | string | `"dot"` \| `"scroll"` | `"dot"` | Pagination variant (see Pagination component) [VERIFY] |
|
|
23
|
-
| `peek` | number | dp | `0` | Amount of adjacent item visible at edges (16-24dp recommended) [VERIFY] |
|
|
24
|
-
| `onChange` | function | — | — | Callback khi current item changes. `"onChange": "setState://currentBanner"` |
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## States
|
|
29
|
-
|
|
30
|
-
| State | Appearance |
|
|
31
|
-
|-------|-----------|
|
|
32
|
-
| **Idle** | Current item fully visible, pagination updated |
|
|
33
|
-
| **Scrolling** | Items move horizontally, pagination animates |
|
|
34
|
-
| **Auto-playing** | Items advance automatically at interval |
|
|
35
|
-
| **Paused** | Auto-play paused due to user touch interaction |
|
|
36
|
-
|
|
37
|
-
Auto-play pauses on user interaction, resumes after release.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Variant-to-Context Map
|
|
42
|
-
|
|
43
|
-
| Context | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
44
|
-
|---------|-------------|-----------|-------------------|
|
|
45
|
-
| **Promotional banners** | Featured content at screen top | Critical content every user must see | Banner khuyến mãi trên Home |
|
|
46
|
-
| **Image gallery** | Browse product/service images | Long lists → dùng FlatList | Ảnh merchant, ảnh sản phẩm |
|
|
47
|
-
| **Onboarding** | Step-by-step intro slides | Navigation between sections → dùng TabView | Welcome slides, feature intro |
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## SSR Pattern
|
|
52
|
-
|
|
53
|
-
### Banner Carousel with Pagination
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"id": "banner_section",
|
|
57
|
-
"type": "section",
|
|
58
|
-
"children": [
|
|
59
|
-
{
|
|
60
|
-
"component": "Carousel",
|
|
61
|
-
"props": {
|
|
62
|
-
"items": "{{data.banners}}",
|
|
63
|
-
"autoPlay": true,
|
|
64
|
-
"autoPlayInterval": 5000,
|
|
65
|
-
"loop": true,
|
|
66
|
-
"showPagination": true,
|
|
67
|
-
"paginationType": "dot",
|
|
68
|
-
"peek": 0
|
|
69
|
-
},
|
|
70
|
-
"onChange": "setState://currentBanner"
|
|
71
|
-
}
|
|
72
|
-
]
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Image Gallery with Scroll Pagination
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"component": "Carousel",
|
|
80
|
-
"props": {
|
|
81
|
-
"items": "{{data.merchantImages}}",
|
|
82
|
-
"autoPlay": false,
|
|
83
|
-
"showPagination": true,
|
|
84
|
-
"paginationType": "scroll",
|
|
85
|
-
"peek": 16
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Accessibility
|
|
93
|
-
|
|
94
|
-
- Items navigable via swipe gestures on assistive technology.
|
|
95
|
-
- Auto-play MUST pause khi screen reader active.
|
|
96
|
-
- Each item: descriptive accessible label.
|
|
97
|
-
- Announce current position: "Mục 2 trong 5".
|
|
98
|
-
- Provide way to pause auto-play without specific gesture.
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Usage Guidelines
|
|
103
|
-
|
|
104
|
-
### Do
|
|
105
|
-
- Dùng cho promotional banners, image galleries, onboarding slides.
|
|
106
|
-
- Always include pagination indicators.
|
|
107
|
-
- Peek adjacent items → signal scrollability.
|
|
108
|
-
- Keep 3-8 items — manageable count.
|
|
109
|
-
- Auto-play interval ≥3 seconds.
|
|
110
|
-
|
|
111
|
-
### Don't
|
|
112
|
-
- Không dùng cho long lists → dùng FlatList / LazyColumn.
|
|
113
|
-
- Không dùng cho section navigation → dùng **TabView** / **BottomTab**.
|
|
114
|
-
- Không set autoPlayInterval <3000ms — user cần time to read.
|
|
115
|
-
- Không hide pagination khi >1 item.
|
|
116
|
-
- Không nest carousels — scroll conflict.
|
|
117
|
-
- Không rely on carousel cho critical content — items may be missed.
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
# CheckBox
|
|
2
|
-
|
|
3
|
-
> Multi-selection control — chọn nhiều options hoặc indicate agreement. Supports indeterminate state.
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/foundation`
|
|
6
|
-
**Platform:** RN ✅ | Compose ✅
|
|
7
|
-
**Completeness:** need_update — thiếu Figma
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Props
|
|
13
|
-
|
|
14
|
-
| Prop | Type | Values | Default | Description |
|
|
15
|
-
|------|------|--------|---------|-------------|
|
|
16
|
-
| `checked` | boolean | `true` \| `false` | `false` | Checked state |
|
|
17
|
-
| `indeterminate` | boolean | `true` \| `false` | `false` | Partial selection state (select-all parent) [VERIFY] |
|
|
18
|
-
| `label` | string | — | — | Text label bên phải checkbox |
|
|
19
|
-
| `disabled` | boolean | `true` \| `false` | `false` | Non-interactive state |
|
|
20
|
-
| `onChange` | function | — | — | Callback khi toggle. `"onChange": "setState://option"` |
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## States
|
|
25
|
-
|
|
26
|
-
| State | Box Appearance | Icon | Label Color | Interactive |
|
|
27
|
-
|-------|---------------|------|------------|-------------|
|
|
28
|
-
| **Unchecked** | `Colors.black_04` border, no fill | none | `Colors.black_17` | true |
|
|
29
|
-
| **Checked** | `Colors.pink_03` fill | white checkmark | `Colors.black_17` | true |
|
|
30
|
-
| **Indeterminate** | `Colors.pink_03` fill | white minus | `Colors.black_17` | true |
|
|
31
|
-
| **Disabled Unchecked** | `Colors.black_08` border, no fill | none | `Colors.black_08` | false |
|
|
32
|
-
| **Disabled Checked** | `Colors.black_08` fill | white checkmark | `Colors.black_08` | false |
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Variant-to-Context Map
|
|
37
|
-
|
|
38
|
-
| Context | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
39
|
-
|---------|-------------|-----------|-------------------|
|
|
40
|
-
| **Multi-select** | Chọn nhiều options từ list | Chọn 1 exclusive → dùng Radio | Chọn nhiều dịch vụ, filter multi-category |
|
|
41
|
-
| **Agreement** | Consent/terms checkbox | — | "Tôi đồng ý điều khoản" trên form |
|
|
42
|
-
| **Select all** | Parent checkbox cho group (indeterminate khi partial) | — | "Chọn tất cả" trên danh sách |
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## SSR Pattern
|
|
47
|
-
|
|
48
|
-
### Agreement Checkbox
|
|
49
|
-
```json
|
|
50
|
-
{
|
|
51
|
-
"component": "CheckBox",
|
|
52
|
-
"props": {
|
|
53
|
-
"checked": "{{state.agreedToTerms}}",
|
|
54
|
-
"label": "Tôi đồng ý với Điều khoản sử dụng"
|
|
55
|
-
},
|
|
56
|
-
"onChange": "setState://agreedToTerms"
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Multi-select List
|
|
61
|
-
```json
|
|
62
|
-
{
|
|
63
|
-
"id": "service_options",
|
|
64
|
-
"type": "section",
|
|
65
|
-
"forEach": "{{data.services}}",
|
|
66
|
-
"render": {
|
|
67
|
-
"component": "CheckBox",
|
|
68
|
-
"props": {
|
|
69
|
-
"checked": "{{item.selected}}",
|
|
70
|
-
"label": "{{item.name}}"
|
|
71
|
-
},
|
|
72
|
-
"onChange": "setState://toggleService={{item.id}}"
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## Accessibility
|
|
80
|
-
|
|
81
|
-
- Screen readers announce: label, state (checked/unchecked/indeterminate), role (checkbox).
|
|
82
|
-
- Entire row (box + label) tappable.
|
|
83
|
-
- State changes announce immediately.
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## Usage Guidelines
|
|
88
|
-
|
|
89
|
-
### Do
|
|
90
|
-
- Dùng cho selecting multiple options từ list.
|
|
91
|
-
- Dùng cho agreement/consent checkboxes.
|
|
92
|
-
- Dùng indeterminate cho "select all" parent.
|
|
93
|
-
- Luôn provide visible label.
|
|
94
|
-
|
|
95
|
-
### Don't
|
|
96
|
-
- Không dùng cho single on/off toggle → dùng **Switch**.
|
|
97
|
-
- Không dùng cho mutually exclusive choices → dùng **Radio**.
|
|
98
|
-
- Không dùng cho filter controls trong toolbar → dùng **Chip**.
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
# Chip
|
|
2
|
-
|
|
3
|
-
> Interactive filter/selection pill — toggle giữa selected/unselected khi tap.
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/chip`
|
|
6
|
-
**Platform:** RN ✅ | Compose ✅
|
|
7
|
-
**Completeness:** need_update — thiếu Figma
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Props
|
|
13
|
-
|
|
14
|
-
| Prop | Type | Values | Default | Description |
|
|
15
|
-
|------|------|--------|---------|-------------|
|
|
16
|
-
| `label` | string | — | required | Display text. 1-3 words |
|
|
17
|
-
| `size` | string | `"small"` \| `"large"` | `"small"` | Chip size |
|
|
18
|
-
| `selected` | boolean | `true` \| `false` | `false` | Selection state |
|
|
19
|
-
| `disabled` | boolean | `true` \| `false` | `false` | Non-interactive state |
|
|
20
|
-
| `leftIcon` | string | icon name | — | Optional icon trước label |
|
|
21
|
-
| `rightIcon` | string | icon name \| `"close"` | — | Optional icon sau label. `"close"` cho removable chip |
|
|
22
|
-
| `onPress` | function | — | — | Tap handler — toggle selected state |
|
|
23
|
-
| `onPressRightIcon` | function | — | — | Right icon tap — remove/deselect [VERIFY] |
|
|
24
|
-
|
|
25
|
-
> **Lưu ý cho ui-composer:** Chip dùng package riêng `@momo-kits/chip`, không nằm trong `@momo-kits/foundation`.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Variants
|
|
30
|
-
|
|
31
|
-
| Variant | Background | Text Color | Icon Color | Usage |
|
|
32
|
-
|---------|-----------|-----------|-----------|-------|
|
|
33
|
-
| **Unselected** | `Colors.black_04` | `Colors.black_17` | `Colors.black_12` | Default resting state |
|
|
34
|
-
| **Selected** | `Colors.pink_09` | `Colors.pink_03` | `Colors.pink_03` | Active / chosen state |
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## States
|
|
39
|
-
|
|
40
|
-
| State | Background | Text Color | Icon Color | Opacity | Interactive |
|
|
41
|
-
|-------|-----------|-----------|-----------|---------|-------------|
|
|
42
|
-
| **Unselected** | `Colors.black_04` | `Colors.black_17` | `Colors.black_12` | 1 | true |
|
|
43
|
-
| **Selected** | `Colors.pink_09` | `Colors.pink_03` | `Colors.pink_03` | 1 | true |
|
|
44
|
-
| **Pressed** | same as current | same as current | same as current | 0.8 | true |
|
|
45
|
-
| **Disabled** | `Colors.black_04` | `Colors.black_08` | `Colors.black_08` | 0.5 | false |
|
|
46
|
-
|
|
47
|
-
Transition giữa unselected ↔ selected là immediate (no animation).
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Variant-to-Context Map
|
|
52
|
-
|
|
53
|
-
| Variant | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
54
|
-
|---------|-------------|-----------|-------------------|
|
|
55
|
-
| Unselected (default) | Chip chưa được chọn trong filter group | Chỉ có 1 chip đơn lẻ — không có group | Filter dịch vụ trên màn hình tìm kiếm (Tất cả / Chuyển tiền / Thanh toán) |
|
|
56
|
-
| Selected | User đã chọn — active filter đang apply | Không có toggle behavior — dùng Tag | Filter "Chuyển tiền" đang active trong lịch sử GD |
|
|
57
|
-
| Removable (rightIcon=close) | User remove selection bằng tap X | Label dài >3 từ — chip bị stretch | Địa chỉ đã chọn trong form giao hàng, tags đã pick |
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## SSR Pattern
|
|
62
|
-
|
|
63
|
-
### Horizontal Filter Bar
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"id": "filter_chips",
|
|
67
|
-
"type": "row",
|
|
68
|
-
"scrollable": true,
|
|
69
|
-
"spacing": "Spacing.XS",
|
|
70
|
-
"forEach": "{{data.filterOptions}}",
|
|
71
|
-
"render": {
|
|
72
|
-
"component": "Chip",
|
|
73
|
-
"props": {
|
|
74
|
-
"label": "{{item.label}}",
|
|
75
|
-
"size": "small",
|
|
76
|
-
"selected": "{{state.selectedFilter == $index}}"
|
|
77
|
-
},
|
|
78
|
-
"onPress": "setState://selectedFilter=$index"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Multi-select Wrap Group
|
|
84
|
-
```json
|
|
85
|
-
{
|
|
86
|
-
"id": "category_chips",
|
|
87
|
-
"type": "wrap",
|
|
88
|
-
"forEach": "{{data.categories}}",
|
|
89
|
-
"render": {
|
|
90
|
-
"component": "Chip",
|
|
91
|
-
"props": {
|
|
92
|
-
"label": "{{item.name}}",
|
|
93
|
-
"size": "large",
|
|
94
|
-
"selected": "{{item.selected}}",
|
|
95
|
-
"leftIcon": "{{item.icon}}"
|
|
96
|
-
},
|
|
97
|
-
"onPress": "setState://toggleCategory={{item.id}}"
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Removable Tags
|
|
103
|
-
```json
|
|
104
|
-
{
|
|
105
|
-
"id": "selected_tags",
|
|
106
|
-
"type": "wrap",
|
|
107
|
-
"forEach": "{{state.selectedItems}}",
|
|
108
|
-
"render": {
|
|
109
|
-
"component": "Chip",
|
|
110
|
-
"props": {
|
|
111
|
-
"label": "{{item.name}}",
|
|
112
|
-
"size": "small",
|
|
113
|
-
"selected": true,
|
|
114
|
-
"rightIcon": "close"
|
|
115
|
-
},
|
|
116
|
-
"onPressRightIcon": "setState://removeItem={{item.id}}"
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
## Accessibility
|
|
124
|
-
|
|
125
|
-
- Mỗi chip cần accessible label gồm: text + current state (selected/not).
|
|
126
|
-
- Role: `"button"` hoặc `"toggle"` — screen readers phải announce interactive nature.
|
|
127
|
-
- Khi selected state thay đổi: announce "Selected" hoặc "Deselected".
|
|
128
|
-
- Trong chip group: navigable as a group với clear boundaries.
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Usage Guidelines
|
|
133
|
-
|
|
134
|
-
### Do
|
|
135
|
-
- Dùng Chip để filter content theo category, type, attribute.
|
|
136
|
-
- Dùng cho multi-select — user pick từ set of options.
|
|
137
|
-
- Dùng cho removable selections (dismiss bằng X icon).
|
|
138
|
-
- Giữ label ngắn — 1-3 words.
|
|
139
|
-
- Group related chips trong horizontal scrollable row hoặc wrapping layout.
|
|
140
|
-
|
|
141
|
-
### Don't
|
|
142
|
-
- Không dùng cho static status display — dùng **Tag**.
|
|
143
|
-
- Không dùng cho navigation actions — dùng **Button**.
|
|
144
|
-
- Không dùng cho notification counts — dùng **Badge**.
|
|
145
|
-
- Không nest interactive elements bên trong Chip.
|
|
146
|
-
- Không dùng text label dài gây stretch chip.
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# Collapse
|
|
2
|
-
|
|
3
|
-
> Expandable/collapsible content section — header + chevron toggle to show/hide content. Progressive disclosure.
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/collapse`
|
|
6
|
-
**Platform:** RN ✅ | Compose ❌ (build with AnimatedVisibility)
|
|
7
|
-
**Completeness:** need_update — thiếu Figma
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Props
|
|
13
|
-
|
|
14
|
-
| Prop | Type | Values | Default | Description |
|
|
15
|
-
|------|------|--------|---------|-------------|
|
|
16
|
-
| `title` | string | — | required | Header text label |
|
|
17
|
-
| `expanded` | boolean | `true` \| `false` | `false` | Controlled expand/collapse state |
|
|
18
|
-
| `defaultExpanded` | boolean | `true` \| `false` | `false` | Initial state khi uncontrolled [VERIFY] |
|
|
19
|
-
| `disabled` | boolean | `true` \| `false` | `false` | Non-interactive — header not tappable |
|
|
20
|
-
| `showDivider` | boolean | `true` \| `false` | `false` | Show Divider between header and content [VERIFY] |
|
|
21
|
-
| `children` | element | — | required | Content to show/hide — any components |
|
|
22
|
-
| `onChange` | function | — | — | Callback khi toggle. `"onChange": "setState://expanded"` |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## States
|
|
27
|
-
|
|
28
|
-
| State | Header | Chevron | Content | Interactive |
|
|
29
|
-
|-------|--------|---------|---------|-------------|
|
|
30
|
-
| **Collapsed** | `Colors.black_17` text | Down (0°) | Hidden | true |
|
|
31
|
-
| **Expanded** | `Colors.black_17` text | Up (180°) | Visible | true |
|
|
32
|
-
| **Pressed** | Opacity 0.8 | — | — | true |
|
|
33
|
-
| **Disabled** | `Colors.black_08` text | `Colors.black_08` | Per current state | false |
|
|
34
|
-
|
|
35
|
-
Chevron rotates smoothly (180°) on toggle. Content animates with height transition.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Variant-to-Context Map
|
|
40
|
-
|
|
41
|
-
| Context | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
42
|
-
|---------|-------------|-----------|-------------------|
|
|
43
|
-
| **FAQ / Help** | Q&A sections, supplementary info | Primary content → show directly | FAQ trong Help center |
|
|
44
|
-
| **Advanced settings** | Secondary options user rarely needs | Critical settings → show always | Cài đặt nâng cao, tùy chọn bổ sung |
|
|
45
|
-
| **Accordion** | Multiple collapse sections, one open at a time | Independent sections | Chi tiết giao dịch, điều khoản |
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## SSR Pattern
|
|
50
|
-
|
|
51
|
-
### FAQ Section
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"id": "faq_section",
|
|
55
|
-
"type": "section",
|
|
56
|
-
"forEach": "{{data.faqs}}",
|
|
57
|
-
"render": {
|
|
58
|
-
"component": "Collapse",
|
|
59
|
-
"props": {
|
|
60
|
-
"title": "{{item.question}}",
|
|
61
|
-
"expanded": false
|
|
62
|
-
},
|
|
63
|
-
"children": [
|
|
64
|
-
{
|
|
65
|
-
"component": "Text",
|
|
66
|
-
"props": {
|
|
67
|
-
"content": "{{item.answer}}",
|
|
68
|
-
"typography": "body_default_regular"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Transaction Details Accordion
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"component": "Collapse",
|
|
80
|
-
"props": {
|
|
81
|
-
"title": "Chi tiết giao dịch",
|
|
82
|
-
"showDivider": true
|
|
83
|
-
},
|
|
84
|
-
"children": [
|
|
85
|
-
{
|
|
86
|
-
"component": "Text",
|
|
87
|
-
"props": {
|
|
88
|
-
"content": "{{data.transactionDetails}}",
|
|
89
|
-
"typography": "body_s_regular"
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Accessibility
|
|
99
|
-
|
|
100
|
-
- Header role: button. Announce title + state ("Chi tiết giao dịch, collapsed").
|
|
101
|
-
- Content hidden from accessibility tree khi collapsed.
|
|
102
|
-
- Full header row is tap target, not just chevron.
|
|
103
|
-
- State change announced on toggle.
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Usage Guidelines
|
|
108
|
-
|
|
109
|
-
### Do
|
|
110
|
-
- Dùng cho secondary/supplementary content — FAQ, advanced settings, details.
|
|
111
|
-
- Clear descriptive title — user knows what content is hidden.
|
|
112
|
-
- Start collapsed by default unless content is expected to be read immediately.
|
|
113
|
-
- Divider khi content is visually dense.
|
|
114
|
-
|
|
115
|
-
### Don't
|
|
116
|
-
- Không hide primary/critical content trong collapse.
|
|
117
|
-
- Không dùng cho navigation → dùng proper nav patterns.
|
|
118
|
-
- Không nest collapse deeply (collapse trong collapse) — confusing UX.
|
|
119
|
-
- Không dùng khi content chỉ 1-2 lines — show directly instead.
|
|
120
|
-
- Không remove chevron icon — user cần visual indicator.
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
# DatePicker
|
|
2
|
-
|
|
3
|
-
> Calendar-based date selection — single date, date range, or multiple dates. Month grid (RN) or format-driven (Compose).
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/date-picker` (RN) / built-in (Compose)
|
|
6
|
-
**Platform:** RN ✅ | Compose ✅
|
|
7
|
-
**Completeness:** need_update — thiếu Figma
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Variant Axes
|
|
13
|
-
|
|
14
|
-
| Axis | Options | Default |
|
|
15
|
-
|------|---------|---------|
|
|
16
|
-
| **Mode** | `single` · `range` · `multiple` | `single` |
|
|
17
|
-
| **Platform** | RN (calendar grid) · Compose (format-driven DD-MM-YYYY) | per platform |
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Props
|
|
22
|
-
|
|
23
|
-
| Prop | Type | Values | Default | Description |
|
|
24
|
-
|------|------|--------|---------|-------------|
|
|
25
|
-
| `mode` | string | `"single"` \| `"range"` \| `"multiple"` | `"single"` | Selection mode |
|
|
26
|
-
| `value` | varies | Date (single), `{ start, end }` (range), `[Date]` (multiple) | — | Current selected value |
|
|
27
|
-
| `minDate` | date | — | — | Earliest selectable date. Dates before → disabled |
|
|
28
|
-
| `maxDate` | date | — | — | Latest selectable date. Dates after → disabled |
|
|
29
|
-
| `format` | string | date format pattern | `"DD-MM-YYYY"` | Display format (Compose) [VERIFY] |
|
|
30
|
-
| `showTimePicker` | boolean | `true` \| `false` | `false` | Include time selection (Compose: HH:mm) [VERIFY] |
|
|
31
|
-
| `onChange` | function | — | — | Callback khi date selected. `"onChange": "setState://selectedDate"` |
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Day Cell States
|
|
36
|
-
|
|
37
|
-
| State | Background | Text Color | Description |
|
|
38
|
-
|-------|-----------|-----------|-------------|
|
|
39
|
-
| **Default** | Transparent | `Colors.black_17` | Normal selectable date |
|
|
40
|
-
| **Today** | Transparent | `Colors.pink_03` | Current date highlight |
|
|
41
|
-
| **Selected** | `Colors.pink_03` circle | `Colors.white` | User-chosen date |
|
|
42
|
-
| **Disabled** | Transparent | `Colors.black_08` | Outside min/max range |
|
|
43
|
-
| **Range start** | `Colors.pink_03` (left-rounded) | `Colors.white` | First date in range |
|
|
44
|
-
| **Range end** | `Colors.pink_03` (right-rounded) | `Colors.white` | Last date in range |
|
|
45
|
-
| **In range** | `Colors.pink_09` (light pink) | `Colors.pink_03` | Dates between start/end |
|
|
46
|
-
| **Other month** | Transparent | `Colors.black_08` | Adjacent month dates |
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Variant-to-Context Map
|
|
51
|
-
|
|
52
|
-
| Mode | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
53
|
-
|------|-------------|-----------|-------------------|
|
|
54
|
-
| **single** | Pick one specific date | Date range needed | Chọn ngày sinh, ngày hẹn |
|
|
55
|
-
| **range** | Select start + end date | Single date needed | Lọc lịch sử giao dịch, đặt phòng |
|
|
56
|
-
| **multiple** | Select multiple individual dates | Continuous range → dùng range mode | Chọn nhiều ngày nghỉ |
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## SSR Pattern
|
|
61
|
-
|
|
62
|
-
### Single Date Selection
|
|
63
|
-
```json
|
|
64
|
-
{
|
|
65
|
-
"component": "DatePicker",
|
|
66
|
-
"props": {
|
|
67
|
-
"mode": "single",
|
|
68
|
-
"value": "{{state.selectedDate}}",
|
|
69
|
-
"minDate": "{{data.today}}",
|
|
70
|
-
"maxDate": "{{data.maxBookingDate}}"
|
|
71
|
-
},
|
|
72
|
-
"onChange": "setState://selectedDate"
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Date Range Filter
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"component": "DatePicker",
|
|
80
|
-
"props": {
|
|
81
|
-
"mode": "range",
|
|
82
|
-
"value": {
|
|
83
|
-
"start": "{{state.startDate}}",
|
|
84
|
-
"end": "{{state.endDate}}"
|
|
85
|
-
},
|
|
86
|
-
"minDate": "{{data.earliestTransaction}}"
|
|
87
|
-
},
|
|
88
|
-
"onChange": "setState://dateRange"
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Accessibility
|
|
95
|
-
|
|
96
|
-
- Each day cell announces full date: "26 tháng 3 năm 2026".
|
|
97
|
-
- Selected dates announce selected state.
|
|
98
|
-
- Disabled dates: announced as disabled, not focusable/tappable.
|
|
99
|
-
- Navigation arrows: "Tháng trước", "Tháng sau".
|
|
100
|
-
- Range mode: announce context "Ngày bắt đầu: 20 tháng 3. Ngày kết thúc: 26 tháng 3."
|
|
101
|
-
- Today distinguishable: "Hôm nay, 20 tháng 3 năm 2026".
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Usage Guidelines
|
|
106
|
-
|
|
107
|
-
### Do
|
|
108
|
-
- Dùng cho date selection trong forms, booking, scheduling.
|
|
109
|
-
- Highlight today cho reference point.
|
|
110
|
-
- Disable dates outside valid range.
|
|
111
|
-
- Show selected date in text field bên ngoài calendar cho confirmation.
|
|
112
|
-
- Range mode cho check-in/check-out, date filters.
|
|
113
|
-
|
|
114
|
-
### Don't
|
|
115
|
-
- Không dùng cho time-only selection → dùng dedicated time picker.
|
|
116
|
-
- Không allow selection of disabled dates.
|
|
117
|
-
- Không show quá nhiều months — month-by-month navigation.
|
|
118
|
-
- Không hide current month/year — user cần context.
|
|
119
|
-
- Không dùng cho relative dates ("7 ngày gần nhất") → dùng **Chip** preset options.
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
# Divider
|
|
2
|
-
|
|
3
|
-
> Horizontal line separator — phân chia content sections hoặc list items.
|
|
4
|
-
|
|
5
|
-
**Package:** `@momo-kits/foundation`
|
|
6
|
-
**Platform:** RN ✅ | Compose ✅
|
|
7
|
-
**Completeness:** done
|
|
8
|
-
**Figma node:** [VERIFY]
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Props
|
|
13
|
-
|
|
14
|
-
| Prop | Type | Values | Default | Description |
|
|
15
|
-
|------|------|--------|---------|-------------|
|
|
16
|
-
| `color` | string | `Colors.*` token | `"Colors.black_04"` | Line color [VERIFY] |
|
|
17
|
-
|
|
18
|
-
> Divider là component đơn giản nhất — chỉ 1 prop optional. Full width of parent container by default.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## States
|
|
23
|
-
|
|
24
|
-
| State | Color | Description |
|
|
25
|
-
|-------|-------|-------------|
|
|
26
|
-
| **Default** | `Colors.black_04` | Static, non-interactive |
|
|
27
|
-
|
|
28
|
-
Divider chỉ có 1 state. Không interactive.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Variant-to-Context Map
|
|
33
|
-
|
|
34
|
-
| Context | Khi nào dùng | Tránh khi | Ví dụ trong MoMo |
|
|
35
|
-
|---------|-------------|-----------|-------------------|
|
|
36
|
-
| **List separator** | Phân cách items trong vertical list | Spacing đủ clear → không cần divider | Danh sách giao dịch, contacts list |
|
|
37
|
-
| **Section boundary** | Phân chia content sections | Chỉ có 1 section → không cần | Phân chia "Thông tin" và "Số tiền" trong confirm screen |
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## SSR Pattern
|
|
42
|
-
|
|
43
|
-
### List with Dividers
|
|
44
|
-
```json
|
|
45
|
-
{
|
|
46
|
-
"id": "transaction_list",
|
|
47
|
-
"type": "section",
|
|
48
|
-
"forEach": "{{data.transactions}}",
|
|
49
|
-
"render": [
|
|
50
|
-
{
|
|
51
|
-
"component": "ListItem",
|
|
52
|
-
"props": {
|
|
53
|
-
"title": "{{item.title}}",
|
|
54
|
-
"rightText": "{{item.amount}}"
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"component": "Divider",
|
|
59
|
-
"props": {}
|
|
60
|
-
}
|
|
61
|
-
]
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Accessibility
|
|
68
|
-
|
|
69
|
-
- Divider là decorative — ẩn khỏi screen readers.
|
|
70
|
-
- Không dùng divider để convey meaning — chỉ visual separator.
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Usage Guidelines
|
|
75
|
-
|
|
76
|
-
### Do
|
|
77
|
-
- Dùng để separate list items trong vertical list.
|
|
78
|
-
- Dùng sparingly — rely on spacing trước.
|
|
79
|
-
- Parent layout control spacing above/below divider.
|
|
80
|
-
|
|
81
|
-
### Don't
|
|
82
|
-
- Không dùng cho purely decorative khi spacing đủ.
|
|
83
|
-
- Không stack multiple dividers.
|
|
84
|
-
- Không đặt divider ở top/bottom container khi không cần separation.
|