@herca/rn-kit 0.1.7 → 0.1.9
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/README.md +12 -7
- package/lib/module/Accordion/README.md +1 -0
- package/lib/module/Alert/README.md +1 -0
- package/lib/module/Avatar/README_AVATAR.md +1 -1
- package/lib/module/Avatar/README_AVATARGROUP.md +3 -1
- package/lib/module/BottomSheet/README.md +1 -1
- package/lib/module/Button/README.md +3 -1
- package/lib/module/Calendar/README.md +1 -0
- package/lib/module/CheckBox/README_CHECKBOXLIST.md +1 -0
- package/lib/module/Chip/README.md +2 -1
- package/lib/module/Color/README.md +97 -46
- package/lib/module/DatePicker/{README.md → README_DATEPICKER.md} +1 -0
- package/lib/module/DatePicker/README_MONTHPICKER.md +90 -0
- package/lib/module/DatePicker/README_TIMEPICKER.md +83 -0
- package/lib/module/DatePicker/README_YEARPICKER.md +106 -0
- package/lib/module/Drawing/Drawing.js +16 -4
- package/lib/module/Drawing/Drawing.js.map +1 -1
- package/lib/module/DropDown/README.md +107 -0
- package/lib/module/Label/README.md +65 -0
- package/lib/module/RadioButton/README.md +2 -1
- package/lib/module/Step/Step.js.map +1 -1
- package/lib/module/Tab/README.md +74 -0
- package/lib/module/Tab/Tab.js +97 -0
- package/lib/module/Tab/Tab.js.map +1 -0
- package/lib/module/Tab/TabItem.js +9 -0
- package/lib/module/Tab/TabItem.js.map +1 -0
- package/lib/module/Tab/type.js +4 -0
- package/lib/module/Tab/type.js.map +1 -0
- package/lib/module/Ui/README_DEVIDER.md +62 -0
- package/lib/module/Ui/README_FOOTER.md +0 -0
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/Drawing/Drawing.d.ts.map +1 -1
- package/lib/typescript/src/Step/Step.d.ts.map +1 -1
- package/lib/typescript/src/Tab/Tab.d.ts +5 -0
- package/lib/typescript/src/Tab/Tab.d.ts.map +1 -0
- package/lib/typescript/src/Tab/TabItem.d.ts +3 -0
- package/lib/typescript/src/Tab/TabItem.d.ts.map +1 -0
- package/lib/typescript/src/Tab/type.d.ts +11 -0
- package/lib/typescript/src/Tab/type.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +8 -2
- package/src/Accordion/README.md +1 -0
- package/src/Alert/README.md +1 -0
- package/src/Avatar/README_AVATAR.md +1 -1
- package/src/Avatar/README_AVATARGROUP.md +3 -1
- package/src/BottomSheet/README.md +1 -1
- package/src/Button/README.md +3 -1
- package/src/Calendar/README.md +1 -0
- package/src/CheckBox/README_CHECKBOXLIST.md +1 -0
- package/src/Chip/README.md +2 -1
- package/src/Color/README.md +97 -46
- package/src/DatePicker/{README.md → README_DATEPICKER.md} +1 -0
- package/src/DatePicker/README_MONTHPICKER.md +90 -0
- package/src/DatePicker/README_TIMEPICKER.md +83 -0
- package/src/DatePicker/README_YEARPICKER.md +106 -0
- package/src/Drawing/Drawing.tsx +14 -0
- package/src/DropDown/README.md +107 -0
- package/src/Label/README.md +65 -0
- package/src/RadioButton/README.md +2 -1
- package/src/Step/Step.tsx +0 -1
- package/src/Tab/README.md +74 -0
- package/src/Tab/Tab.tsx +112 -0
- package/src/Tab/TabItem.tsx +6 -0
- package/src/Tab/type.tsx +11 -0
- package/src/Ui/README_DEVIDER.md +62 -0
- package/src/Ui/README_FOOTER.md +0 -0
- package/src/index.tsx +8 -0
package/README.md
CHANGED
|
@@ -82,6 +82,8 @@ const App = () => {
|
|
|
82
82
|
<Provider>
|
|
83
83
|
<YoyrCode>
|
|
84
84
|
</Provider>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
85
87
|
```
|
|
86
88
|
---
|
|
87
89
|
|
|
@@ -102,16 +104,16 @@ import { Button } from '@herca/rn-kit';
|
|
|
102
104
|
Komponen untuk mengumpulkan input dari pengguna.
|
|
103
105
|
|
|
104
106
|
- [Button](./src/Button/README.md)
|
|
105
|
-
- [Checkbox](./src/
|
|
106
|
-
- [Checkbox](./src/
|
|
107
|
+
- [Checkbox](./src/CheckBox/README_CHECKBOX.md)
|
|
108
|
+
- [Checkbox List](./src/CheckBox/README_CHECKBOXLIST.md)
|
|
107
109
|
- [Chip-(Select)](./src/Chip/README.md)
|
|
108
|
-
- [DatePicker](./src/DatePicker/
|
|
110
|
+
- [DatePicker](./src/DatePicker/README_DATEPICKER.md)
|
|
109
111
|
- [DropDown](./src/DropDown/README.md)
|
|
110
112
|
- [Input](./src/Input/README.md)
|
|
111
|
-
- [Input Month](./src/
|
|
113
|
+
- [Input Month](./src/Datepicker/README_MONTHPICKER.md)
|
|
112
114
|
- [Input Password](./src/InputPassword/README.md)
|
|
113
|
-
- [Input Time](./src/
|
|
114
|
-
- [Input Year](./src/
|
|
115
|
+
- [Input Time](./src/Datepicker/README_TIMEPICKER.md)
|
|
116
|
+
- [Input Year](./src/Datepicker/README_YEARPICKER.md)
|
|
115
117
|
- [Radio Button](./src/RadioButton/README.md)
|
|
116
118
|
- [Select](./src/Select/README.md)
|
|
117
119
|
- [Switch](./src/Switch/README.md)
|
|
@@ -134,6 +136,7 @@ Komponen untuk menyembunyikan atau menampilkan konten.
|
|
|
134
136
|
|
|
135
137
|
- [Accordion](./src/Accordion/README.md)
|
|
136
138
|
- [Step](./src/Step/README.md)
|
|
139
|
+
- [Tab](./src/Tab/README.md)
|
|
137
140
|
|
|
138
141
|
---
|
|
139
142
|
|
|
@@ -155,9 +158,11 @@ Komponen untuk menampilkan informasi atau elemen visual.
|
|
|
155
158
|
- [AvatarGroup](./src/Alert/README_AVATARGROUP.md)
|
|
156
159
|
- [Calendar](./src/Calendar/README.md)
|
|
157
160
|
- [Color](./src/Color/README.md)
|
|
161
|
+
- [Container](./src/Ui/README_CONTAINER.md)
|
|
158
162
|
- [Card](./src/Ui/README_CARD.md)
|
|
163
|
+
- [Devider](./src/Ui/README_DEVIDER.md)
|
|
159
164
|
- [Drawing](./src/Drawing/README.md)
|
|
160
|
-
- [Footer](./src/
|
|
165
|
+
- [Footer](./src/Ui/README_FOOTER.md)
|
|
161
166
|
- [List](./src/List/README.md)
|
|
162
167
|
- [Timeline](./src/Timeline/README.md)
|
|
163
168
|
- [Typography](./src/Typography/README.md)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# 📂 Accordion
|
|
2
2
|
|
|
3
3
|
Komponen **Accordion** digunakan untuk menyembunyikan atau menampilkan konten secara dinamis. Biasanya digunakan untuk struktur seperti FAQ atau daftar konten bertingkat.
|
|
4
|
+
|
|
4
5
|
<img src="../../assets/doc/Accordion/Accordion.gif" alt="Deskripsi Alt" width="200" />
|
|
5
6
|
|
|
6
7
|
## 📦 USAGE
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# 📢 Alert Component
|
|
2
2
|
|
|
3
3
|
Komponen `Alert` digunakan untuk menampilkan pesan notifikasi dengan ikon, judul, dan pesan yang dapat dikustomisasi warnanya sesuai konteks (seperti *success*, *info*, *warning*, dll).
|
|
4
|
+
|
|
4
5
|
<img src="../../assets/doc/Alert/Alert.png" alt="Deskripsi Alt" width="200" />
|
|
5
6
|
|
|
6
7
|
## ✨ Fitur
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
# AvatarGroup Component (React Native)
|
|
3
3
|
|
|
4
4
|
The `AvatarGroup` component displays a group of user avatars. It supports image avatars, initials-based avatars, and a fallback icon. If there are more avatars than the maximum visible count, it displays a "+X" bubble.
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
<img src="../../assets/doc/Avatar/AvatarGroup.png" width=200>
|
|
7
|
+
|
|
6
8
|
---
|
|
7
9
|
|
|
8
10
|
## 📦 Props
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# ⬆️ BottomSheet Component
|
|
2
2
|
|
|
3
3
|
Komponen `BottomSheet` adalah modal bawah (slide-up) untuk menampilkan konten dinamis, form, konfirmasi, dll, dengan berbagai fitur interaktif seperti gesture drag, keyboard-aware, dan customizable height.
|
|
4
|
-

|
|
5
4
|
|
|
5
|
+
<img src="../../assets/doc/BottomSheet/BottomSheet.gif" width=200>
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
## 📦 Props
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
# 🔘 Komponen Button (React Native)
|
|
3
3
|
|
|
4
4
|
Komponen `Button` ini adalah tombol serbaguna untuk aplikasi React Native. Mendukung berbagai ukuran, varian, warna, dan status seperti `disabled` dan `loading`.
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
<img src="../../assets/doc/Button/Button.png" width=200>
|
|
6
8
|
|
|
7
9
|
---
|
|
8
10
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# 📆 Komponen Kalender Kustom (React Native)
|
|
2
2
|
|
|
3
3
|
Komponen kalender ini dibuat menggunakan React Native dan memungkinkan pengguna untuk memilih tanggal tunggal maupun rentang tanggal, serta mendukung fitur penandaan dan pembatasan tanggal.
|
|
4
|
+
<img src="../../assets/doc/Calendar/Calendar.png" width=200>
|
|
4
5
|
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# 📦 Komponen `Chip` – React Native
|
|
2
2
|
|
|
3
3
|
Komponen `Chip` digunakan untuk menampilkan daftar pilihan seperti tag, filter, atau kategori dalam bentuk tombol kecil (chip). Komponen ini mendukung pilihan tunggal maupun jamak, arah horizontal/vertikal, dan gaya warna yang dapat disesuaikan.
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
<img src="../../assets/doc/Chip/Chip.png" width=200>
|
|
5
6
|
|
|
6
7
|
---
|
|
7
8
|
|
|
@@ -1,54 +1,105 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# Color Palette
|
|
2
|
+
|
|
3
|
+
Berikut adalah definisi warna yang digunakan di design system React Native Anda. Palette mencakup warna dasar (*base*), skala abu‐abu (*gray*), kategori semantik (*primary*, *success*, *danger*, *warning*, *info*, *orange*, *purple*), serta utilitas lain seperti `divider` dan `disabled`.
|
|
4
|
+
|
|
5
|
+
Warna tersimpan dalam objek `Color` dengan struktur hierarkis seperti contoh berikut:
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
Color.primary[500] // -> "#4D46FF"
|
|
9
|
+
Color.gray[200] // -> "#EBEBEB"
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Struktur Objek Color
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
const Color = {
|
|
18
|
+
base: { ... },
|
|
19
|
+
gray: { ... },
|
|
20
|
+
primary: { ... },
|
|
21
|
+
warning: { ... },
|
|
22
|
+
danger: { ... },
|
|
23
|
+
success: { ... },
|
|
24
|
+
info: { ... },
|
|
25
|
+
orange: { ... },
|
|
26
|
+
purple: { ... },
|
|
27
|
+
divider: { ... },
|
|
28
|
+
disabled: { ... },
|
|
29
|
+
shadow: { ... },
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Skema Skala Warna
|
|
34
|
+
|
|
35
|
+
* **0–1000** (atau 0–950) – Semakin besar angka, semakin gelap warna.
|
|
36
|
+
* **50** – Latar paling terang (sering dipakai untuk *background* highlight).
|
|
37
|
+
* **500** – Warna utama (brand color dan teks link normal).
|
|
38
|
+
* **700/800/900** – Warna paling gelap untuk teks di atas latar berkait.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Tabel Ringkasan
|
|
43
|
+
|
|
44
|
+
| Kategori | Contoh Penggunaan | Keterangan |
|
|
45
|
+
| ---------- | --------------------- | ------------------------------------------- |
|
|
46
|
+
| `base` | `Color.base.white100` | Warna putih/ hitam utama UI dasar. |
|
|
47
|
+
| `gray` | `Color.gray[700]` | Teks, ikon sekunder, border netral. |
|
|
48
|
+
| `primary` | `Color.primary[500]` | Aksi utama, tombol brand, ikon utama. |
|
|
49
|
+
| `success` | `Color.success[500]` | Status berhasil: label “Success”, badge OK. |
|
|
50
|
+
| `danger` | `Color.danger[500]` | Error, status gagal. |
|
|
51
|
+
| `warning` | `Color.warning[500]` | Peringatan. |
|
|
52
|
+
| `info` | `Color.info[500]` | Informasi tambahan. |
|
|
53
|
+
| `orange` | `Color.orange[500]` | Aksen/ badge khusus. |
|
|
54
|
+
| `purple` | `Color.purple[500]` | Aksen sekunder/ grafik. |
|
|
55
|
+
| `divider` | `Color.divider[25]` | Garis pemisah tipis. |
|
|
56
|
+
| `disabled` | `Color.disabled[25]` | Kontrol non‐aktif. |
|
|
57
|
+
|
|
58
|
+
> Anda bisa menambahkan `shadow` palette jika diperlukan gradasi drop shadow.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## TypeScript Helper
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
export type ColorVariantType =
|
|
66
|
+
| 'default'
|
|
67
|
+
| 'success'
|
|
68
|
+
| 'danger'
|
|
69
|
+
| 'primary'
|
|
70
|
+
| 'warning'
|
|
71
|
+
| 'info'
|
|
72
|
+
| 'purple'
|
|
73
|
+
| 'orange';
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Tipe ini dipakai di komponen lain (mis. `Label`) untuk membatasi nama variant.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Contoh Implementasi
|
|
3
81
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Warna dasar utama:
|
|
7
|
-
|
|
8
|
-
white100: putih solid
|
|
9
|
-
|
|
10
|
-
white60: putih transparan 60%
|
|
11
|
-
|
|
12
|
-
black100: hitam solid
|
|
13
|
-
|
|
14
|
-
black60: hitam transparan 60%
|
|
15
|
-
|
|
16
|
-
### ⚪ Gray (abu-abu)
|
|
17
|
-
Gradasi abu-abu dari terang (gray.50) hingga gelap (gray.950), cocok untuk teks, latar, border, dsb.
|
|
18
|
-
|
|
19
|
-
### 🔵 Primary
|
|
20
|
-
Gradasi warna utama (biru), digunakan untuk tombol, highlight, atau elemen penting lainnya.
|
|
21
|
-
|
|
22
|
-
### 🟠 Warning
|
|
23
|
-
Warna peringatan, digunakan untuk menandai hal-hal seperti alert, notifikasi kuning, dll.
|
|
24
|
-
|
|
25
|
-
### 🔴 Danger
|
|
26
|
-
Warna untuk kondisi berbahaya atau error (merah).
|
|
27
|
-
|
|
28
|
-
### 🟢 Success
|
|
29
|
-
Digunakan untuk kondisi berhasil atau sukses (hijau).
|
|
30
|
-
|
|
31
|
-
### 🔷 Info
|
|
32
|
-
Warna tambahan untuk informasi, notifikasi, atau status sekunder.
|
|
33
|
-
|
|
34
|
-
### 🟧 Orange
|
|
35
|
-
Warna oranye, alternatif dari primary/warning.
|
|
82
|
+
```tsx
|
|
83
|
+
import Color from '@/components/Color/Color';
|
|
36
84
|
|
|
37
|
-
|
|
38
|
-
|
|
85
|
+
const MyButton = () => (
|
|
86
|
+
<View style={{ backgroundColor: Color.primary[500], padding: 12 }}>
|
|
87
|
+
<Text style={{ color: Color.base.white100 }}>Click Me</Text>
|
|
88
|
+
</View>
|
|
89
|
+
);
|
|
90
|
+
```
|
|
39
91
|
|
|
40
|
-
|
|
41
|
-
divider.25: Warna pembatas antar elemen UI.
|
|
92
|
+
---
|
|
42
93
|
|
|
43
|
-
|
|
44
|
-
disabled.25: Warna untuk elemen non-aktif.
|
|
94
|
+
## Tips Penggunaan
|
|
45
95
|
|
|
46
|
-
|
|
96
|
+
* Gunakan warna **50** untuk latar lembut (highlight, badge background).
|
|
97
|
+
* Gunakan warna **500** untuk elemen interaktif utama.
|
|
98
|
+
* Gunakan warna **700+** untuk teks di atas warna **50–300**.
|
|
99
|
+
* Gunakan `rgba(..., 0.x)` jika memerlukan translusi.
|
|
47
100
|
|
|
48
|
-
|
|
49
|
-
import Color from '@herca/rn-kit';
|
|
101
|
+
---
|
|
50
102
|
|
|
51
|
-
|
|
52
|
-
<Text style={{ color: Color.gray[900] }}>Teks</Text>
|
|
103
|
+
## Lisensi
|
|
53
104
|
|
|
54
|
-
|
|
105
|
+
Bagian dari library internal Anda; ikuti lisensi proyek.
|
|
@@ -4,6 +4,7 @@ Komponen `DatePicker` adalah antarmuka pemilih tanggal yang dibungkus dalam sebu
|
|
|
4
4
|
|
|
5
5
|
Komponen ini extend dari Calendar, jadi kalian bisa menggunakan semua props yang ada di Calendar [Calendar](../Calendar/README.md)
|
|
6
6
|
|
|
7
|
+
<img src="../../assets/doc/Datepicker/Datepicker.gif" width=200>
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
## ✨ Fitur
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# MonthPicker
|
|
2
|
+
|
|
3
|
+
Komponen **MonthPicker** adalah komponen pemilih bulan berbasis **React Native** yang dapat menampilkan pilihan bulan dalam tiga mode berbeda: **single**, **range**, dan **multiple**. Komponen ini dirancang untuk dipakai di dalam komponen **BottomSheet** dengan tampilan yang konsisten terhadap desain sistem.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## API Reference
|
|
10
|
+
|
|
11
|
+
| Prop | Tipe | Default | Deskripsi |
|
|
12
|
+
| ---------- | ------------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `isOpen` | `boolean` | `false` | Menentukan apakah **BottomSheet** terbuka atau tertutup. |
|
|
14
|
+
| `onClose` | `() => void` | `undefined` | Callback yang dipanggil saat pengguna menekan tombol **Batal** atau menutup **BottomSheet**. |
|
|
15
|
+
| `onChange` | `(value: number[] \| { startDate: number \| null; endDate: number \| null }) => void` | `undefined` | Callback yang dipanggil ketika pengguna menekan tombol **Pilih**. Parameter yang dikirim tergantung pada `mode`. |
|
|
16
|
+
| `mode` | `'single' \| 'range' \| 'multiple'` | `'single'` | Menentukan cara pemilihan bulan. |
|
|
17
|
+
|
|
18
|
+
### Bentuk *value* yang Dikirim oleh `onChange`
|
|
19
|
+
|
|
20
|
+
| `mode` | Bentuk *value* |
|
|
21
|
+
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
22
|
+
| `single` | `number[]` – array yang berisi satu elemen bulan terpilih. Contoh: `[5]` untuk Mei. |
|
|
23
|
+
| `range` | `{ startDate: number \| null; endDate: number \| null }` – objek berisi bulan mulai & akhir. Contoh: `{ startDate: 1, endDate: 3 }` untuk Jan–Mar. |
|
|
24
|
+
| `multiple` | `number[]` – array berisi daftar bulan terpilih. Contoh: `[2, 4, 8]` untuk Feb, Apr, Agt. |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Contoh Penggunaan
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import { useState } from 'react';
|
|
32
|
+
import { View, Button } from 'react-native';
|
|
33
|
+
import MonthPicker from '@/components/MonthPicker/MonthPicker';
|
|
34
|
+
|
|
35
|
+
export default function Example() {
|
|
36
|
+
const [open, setOpen] = useState(false);
|
|
37
|
+
const [months, setMonths] = useState<number[]>([]);
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<View style={{ flex: 1 }}>
|
|
41
|
+
<Button title="Pilih Bulan" onPress={() => setOpen(true)} />
|
|
42
|
+
|
|
43
|
+
<MonthPicker
|
|
44
|
+
isOpen={open}
|
|
45
|
+
mode="multiple"
|
|
46
|
+
onClose={() => setOpen(false)}
|
|
47
|
+
onChange={(value) => {
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
setMonths(value);
|
|
50
|
+
}
|
|
51
|
+
setOpen(false);
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
</View>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Detail
|
|
62
|
+
|
|
63
|
+
1. **Single Mode**
|
|
64
|
+
|
|
65
|
+
* Klik satu bulan untuk menandai pilihan.
|
|
66
|
+
* Menekan **Pilih** mengirimkan array dengan satu elemen.
|
|
67
|
+
2. **Range Mode**
|
|
68
|
+
|
|
69
|
+
* Klik bulan pertama untuk menentukan `startDate`.
|
|
70
|
+
* Klik bulan kedua untuk menentukan `endDate`.
|
|
71
|
+
* Jika `startDate` sudah terisi dan `endDate` belum, tetapi pengguna memilih bulan yang lebih kecil dari `startDate`, maka komponen otomatis menukar posisi dan mengisi `endDate` dengan nilai awal `startDate`.
|
|
72
|
+
3. **Multiple Mode**
|
|
73
|
+
|
|
74
|
+
* Klik untuk toggle seleksi pada tiap bulan. Bulan yang dipilih disimpan dalam array `multipleValue`.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Kustomisasi Tampilan
|
|
79
|
+
|
|
80
|
+
* **Warna**: Warna latar dan border untuk opsi terpilih mengikuti `Color.primary` pada design system. Anda dapat menyesuaikannya dengan mengubah style `optionSelected` di dalam `MonthPicker`.
|
|
81
|
+
* **Jumlah Kolom**: Saat ini komponen menampilkan `numColumns={3}` pada `FlatList`. Ubah nilai ini untuk menyesuaikan grid.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Tips
|
|
86
|
+
|
|
87
|
+
* Pastikan memanggil `onClose` setelah memproses hasil `onChange` agar **BottomSheet** tertutup.
|
|
88
|
+
* Komponen ini tidak menangani validasi kombinasi bulan secara otomatis (mis. range satu tahun penuh). Tambahkan logika tambahan di tempat Anda memakainya apabila diperlukan.
|
|
89
|
+
|
|
90
|
+
---
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# TimePickerWheel
|
|
2
|
+
|
|
3
|
+
**TimePickerWheel** adalah komponen pemilih waktu berbentuk *wheel* (picker bergulir) untuk **React Native**. Komponen ini menampilkan dua kolom (jam & menit) yang dapat digulir secara vertikal, dibungkus di dalam komponen **BottomSheet**.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API Reference
|
|
8
|
+
|
|
9
|
+
| Prop | Tipe | Default | Deskripsi |
|
|
10
|
+
| ---------- | --------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------- |
|
|
11
|
+
| `isOpen` | `boolean` | `false` | Menentukan apakah **BottomSheet** terbuka. |
|
|
12
|
+
| `onClose` | `() => void` | `-` | Callback saat pengguna menutup **BottomSheet** atau menekan tombol **Batal**. |
|
|
13
|
+
| `onChange` | `(value: { hour: number; minute: number }) => void` | `-` | Callback saat pengguna menekan tombol **Pilih**. Objek yang dikirim berisi `hour` & `minute`. |
|
|
14
|
+
|
|
15
|
+
### Bentuk *value* `onChange`
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
{
|
|
19
|
+
hour: number; // 0–23
|
|
20
|
+
minute: number; // 0–59
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Cara Kerja Singkat
|
|
27
|
+
|
|
28
|
+
1. **Wheel Padding** – Komponen menambahkan elemen *dummy* di atas & bawah daftar agar item tengah selalu berada di posisi highlight.
|
|
29
|
+
2. **Highlight** – Baris tengah diberi `backgroundColor` khusus (`Color.primary[50]`) untuk menonjolkan pilihan aktif.
|
|
30
|
+
3. **Snapping** – Properti `snapToInterval={ITEM_HEIGHT}` memastikan scroll *wheel* berhenti tepat di setiap item.
|
|
31
|
+
4. **Sync & Loop** – Setelah scroll selesai, komponen menghitung indeks nyata (0‑23 untuk jam, 0‑59 untuk menit) agar wheel terasa tak terbatas.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Contoh Penggunaan
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { useState } from 'react';
|
|
39
|
+
import { View, Button } from 'react-native';
|
|
40
|
+
import TimePickerWheel from '@/components/TimePickerWheel/TimePickerWheel';
|
|
41
|
+
|
|
42
|
+
export default function Example() {
|
|
43
|
+
const [open, setOpen] = useState(false);
|
|
44
|
+
const [time, setTime] = useState<{ hour: number; minute: number } | null>(
|
|
45
|
+
null
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const formatted = time ? `${time.hour.toString().padStart(2, '0')}:${time.minute.toString().padStart(2, '0')}` : '—';
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<View style={{ flex: 1 }}>
|
|
52
|
+
<Button title={`Pilih Waktu (${formatted})`} onPress={() => setOpen(true)} />
|
|
53
|
+
|
|
54
|
+
<TimePickerWheel
|
|
55
|
+
isOpen={open}
|
|
56
|
+
onClose={() => setOpen(false)}
|
|
57
|
+
onChange={(value) => {
|
|
58
|
+
setTime(value);
|
|
59
|
+
setOpen(false);
|
|
60
|
+
}}
|
|
61
|
+
/>
|
|
62
|
+
</View>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Kustomisasi Tampilan
|
|
70
|
+
|
|
71
|
+
* **Jumlah Items Terlihat** (`VISIBLE_ITEMS`): Default 5. Ubah nilai konstanta untuk menambah/kurangi tinggi wheel.
|
|
72
|
+
* **Tinggi Item** (`ITEM_HEIGHT`): Default 40. Pengaturan ini mempengaruhi `snapToInterval`.
|
|
73
|
+
* **Warna & Tipografi**: Edit style `selectedItemText`, `itemText`, dan `highlight` untuk menyesuaikan brand guideline.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Tips Implementasi
|
|
78
|
+
|
|
79
|
+
* Selalu panggil `onClose` setelah menangani hasil `onChange` agar **BottomSheet** menutup.
|
|
80
|
+
* Jika Anda ingin menetapkan waktu awal sebelum picker dibuka, setel `selectedHour` & `selectedMinute` memakai `useState` lalu buka picker.
|
|
81
|
+
* Komponen ini tidak membatasi kombinasi jam‑menit (mis. langkah 5 menit). Tambahkan logika tambahan jika diperlukan.
|
|
82
|
+
|
|
83
|
+
---
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# YearPicker
|
|
2
|
+
|
|
3
|
+
**YearPicker** adalah komponen pemilih tahun berbasis **React Native**. Dibandingkan dengan *MonthPicker*, komponen ini mendukung navigasi halaman (pagination) untuk deretan tahun dan dapat digunakan dalam tiga mode:
|
|
4
|
+
|
|
5
|
+
* **single** – memilih satu tahun.
|
|
6
|
+
* **range** – memilih rentang tahun.
|
|
7
|
+
* **multiple** – memilih beberapa tahun sekaligus.
|
|
8
|
+
|
|
9
|
+
Semua outputnya dibungkus dalam komponen **BottomSheet** untuk konsistensi UI.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## API Reference
|
|
14
|
+
|
|
15
|
+
| Prop | Tipe | Default | Deskripsi |
|
|
16
|
+
| ---------- | ------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------ |
|
|
17
|
+
| `isOpen` | `boolean` | `false` | Menentukan apakah **BottomSheet** terbuka. |
|
|
18
|
+
| `onClose` | `() => void` | `-` | Dipanggil saat pengguna menutup picker atau menekan **Batal**. |
|
|
19
|
+
| `onChange` | `(value: number[] \| { startDate: number \| null; endDate: number \| null }) => void` | `-` | Dipanggil setelah pengguna menekan **Pilih**. Bentuk *value* bergantung pada `mode`. |
|
|
20
|
+
| `mode` | `'single' \| 'range' \| 'multiple'` | `'single'` | Menentukan mode pemilihan. |
|
|
21
|
+
|
|
22
|
+
### Bentuk *value* `onChange`
|
|
23
|
+
|
|
24
|
+
| `mode` | *value* |
|
|
25
|
+
| ---------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
26
|
+
| `single` | `number[]` – satu elemen, contoh `[2023]`. |
|
|
27
|
+
| `range` | `{ startDate: number \| null; endDate: number \| null }` – objek rentang, contoh `{ startDate: 2010, endDate: 2015 }`. |
|
|
28
|
+
| `multiple` | `number[]` – daftar tahun, contoh `[2018, 2020, 2022]`. |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Cara Kerja Singkat
|
|
33
|
+
|
|
34
|
+
1. **Daftar Tahun**
|
|
35
|
+
|
|
36
|
+
* Komponen membuat rentang tahun ±60 tahun ke belakang & depan dari tahun saat ini (total 121 tahun).
|
|
37
|
+
2. **Pagination**
|
|
38
|
+
|
|
39
|
+
* `pageSize` default 9 (3 kolom × 3 baris). Tombol panah mengubah `pageIndex` untuk melihat kelompok tahun selanjutnya atau sebelumnya.
|
|
40
|
+
3. **Seleksi & Highlight**
|
|
41
|
+
|
|
42
|
+
* Tahun yang dipilih diberi latar `Color.primary[50]` dan border `Color.primary[300]`.
|
|
43
|
+
4. **Logika Mode**
|
|
44
|
+
|
|
45
|
+
* *Single*: klik satu tahun.
|
|
46
|
+
* *Range*: klik awal & akhir; otomatis menukar jika urutan terbalik.
|
|
47
|
+
* *Multiple*: toggle checklist per tahun.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Contoh Penggunaan
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { useState } from 'react';
|
|
55
|
+
import { View, Button } from 'react-native';
|
|
56
|
+
import YearPicker from '@/components/YearPicker/YearPicker';
|
|
57
|
+
|
|
58
|
+
export default function YearPickerExample() {
|
|
59
|
+
const [open, setOpen] = useState(false);
|
|
60
|
+
const [yearRange, setYearRange] = useState<{ startDate: number | null; endDate: number | null }>({ startDate: null, endDate: null });
|
|
61
|
+
|
|
62
|
+
const label = yearRange.startDate && yearRange.endDate ? `${yearRange.startDate}–${yearRange.endDate}` : '—';
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<View style={{ flex: 1 }}>
|
|
66
|
+
<Button title={`Pilih Rentang Tahun (${label})`} onPress={() => setOpen(true)} />
|
|
67
|
+
|
|
68
|
+
<YearPicker
|
|
69
|
+
isOpen={open}
|
|
70
|
+
mode="range"
|
|
71
|
+
onClose={() => setOpen(false)}
|
|
72
|
+
onChange={(value) => {
|
|
73
|
+
if (!Array.isArray(value)) {
|
|
74
|
+
setYearRange(value);
|
|
75
|
+
}
|
|
76
|
+
setOpen(false);
|
|
77
|
+
}}
|
|
78
|
+
/>
|
|
79
|
+
</View>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Kustomisasi Tampilan & Perilaku
|
|
87
|
+
|
|
88
|
+
| Konstanta / Style | Fungsi | Cara Ubah |
|
|
89
|
+
| ----------------- | ------------------------------------------------ | ---------------------------------------- |
|
|
90
|
+
| `pageSize` | Jumlah tahun ditampilkan per halaman (grid 3×N). | Sesuaikan untuk menambah baris. |
|
|
91
|
+
| `buttonNav` | Style tombol panah. | Edit warna & radius pada file `styles`. |
|
|
92
|
+
| `optionSelected` | Warna highlight. | Ganti `backgroundColor` & `borderColor`. |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Tips Implementasi
|
|
97
|
+
|
|
98
|
+
* Ingin memulai dengan tahun tertentu? Setel `singleValue`, `rangeValue`, atau `multipleValue` melalui `useState` sebelum `isOpen` di-set `true`.
|
|
99
|
+
* Anda dapat memfilter rentang tahun dengan memodifikasi konstanta `total` & `start` di dalam `useMemo(years)`.
|
|
100
|
+
* Pastikan memanggil `onClose` setelah `onChange` untuk menutup picker.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Lisensi
|
|
105
|
+
|
|
106
|
+
Bagian dari library internal Anda; ikuti lisensi proyek.
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { StyleSheet, View, Text } from 'react-native';
|
|
4
|
-
import
|
|
4
|
+
import SignatureView from 'react-native-signature-canvas';
|
|
5
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
6
|
export default function Drawing() {
|
|
6
|
-
return /*#__PURE__*/
|
|
7
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
7
8
|
style: styles.container,
|
|
8
|
-
children: /*#__PURE__*/_jsx(Text, {
|
|
9
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
9
10
|
children: "Sedang di bangun"
|
|
10
|
-
})
|
|
11
|
+
}), /*#__PURE__*/_jsx(SignatureView, {
|
|
12
|
+
autoClear: true,
|
|
13
|
+
descriptionText: "Sign here",
|
|
14
|
+
clearText: "Clear",
|
|
15
|
+
confirmText: 'Processing...',
|
|
16
|
+
penColor: "#000000",
|
|
17
|
+
backgroundColor: "rgba(255,255,255,0)",
|
|
18
|
+
webviewProps: {
|
|
19
|
+
cacheEnabled: true,
|
|
20
|
+
androidLayerType: 'hardware'
|
|
21
|
+
}
|
|
22
|
+
})]
|
|
11
23
|
});
|
|
12
24
|
}
|
|
13
25
|
const styles = StyleSheet.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StyleSheet","View","Text","jsx","_jsx","Drawing","style","styles","container","children","create","flex","preview","width","height","
|
|
1
|
+
{"version":3,"names":["StyleSheet","View","Text","SignatureView","jsx","_jsx","jsxs","_jsxs","Drawing","style","styles","container","children","autoClear","descriptionText","clearText","confirmText","penColor","backgroundColor","webviewProps","cacheEnabled","androidLayerType","create","flex","preview","width","height","justifyContent","alignItems","marginTop"],"sourceRoot":"../../../src","sources":["Drawing/Drawing.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACrD,OAAOC,aAAa,MAAM,+BAA+B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAE1D,eAAe,SAASC,OAAOA,CAAA,EAAG;EAEhC,oBACED,KAAA,CAACN,IAAI;IAACQ,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAC,QAAA,gBAC5BP,IAAA,CAACH,IAAI;MAAAU,QAAA,EAAC;IAAgB,CAAM,CAAC,eAC7BP,IAAA,CAACF,aAAa;MACZU,SAAS,EAAE,IAAK;MAChBC,eAAe,EAAC,WAAW;MAC3BC,SAAS,EAAC,OAAO;MACjBC,WAAW,EAAE,eAAgB;MAC7BC,QAAQ,EAAC,SAAS;MAClBC,eAAe,EAAC,qBAAqB;MACrCC,YAAY,EAAE;QACZC,YAAY,EAAE,IAAI;QAClBC,gBAAgB,EAAE;MACpB;IAAE,CACH,CAAC;EAAA,CACE,CAAC;AAEX;AAEA,MAAMX,MAAM,GAAGV,UAAU,CAACsB,MAAM,CAAC;EAC/BX,SAAS,EAAE;IACTY,IAAI,EAAE;EACR,CAAC;EACDC,OAAO,EAAE;IACPC,KAAK,EAAE,GAAG;IACVC,MAAM,EAAE,GAAG;IACXR,eAAe,EAAE,SAAS;IAC1BS,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE,QAAQ;IACpBC,SAAS,EAAE;EACb;AACF,CAAC,CAAC","ignoreList":[]}
|