michiu_ui 0.0.3

The michiu library handles layout and rendering.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
use crate::app::theme::Theme;
pub use michiu_ui::prelude::*;
use michiu_ui::{AlignContent, AlignItems, AlignSelf, FlexDirection, FlexWrap, JustifyContent};

#[derive(Clone, Copy)]
struct Gap(i32);
impl Default for Gap {
    fn default() -> Self {
        Gap(8)
    }
}

pub fn container() -> Element {
    let (gap, _) = create_signal(Gap::default());
    let (flex_direction, _) = create_signal(FlexDirection::default());
    let (flex_wrap, _) = create_signal(FlexWrap::default());
    let (align_self, _) = create_signal(AlignSelf::default());
    let (align_items, _) = create_signal(AlignItems::default());
    let (align_content, _) = create_signal(AlignContent::default());
    let (justify_content, _) = create_signal(JustifyContent::default());
    v_flex(ts().gap(12.0).p(12.0).max_width(1000.0).size_full())
        .provide(gap)
        .provide(flex_direction)
        .provide(flex_wrap)
        .provide(align_self)
        .provide(align_items)
        .provide(align_content)
        .provide(justify_content)
        .children([main_aria(), setting_aria()])
}

fn common_inner() -> [Element; 9] {
    let inner = |label: &'static str| {
        flex(ts()
            .border_solid(1.0)
            .r(4.0)
            .size((80.0, 40.0))
            .shrink_0()
            .justify_center()
            .border_color(dynamic(|t: &Theme| t.border)))
        .label(
            label,
            ts().text_color(dynamic(|t: &Theme| t.text)).font_size(14.0),
        )
    };

    [
        inner("1"),
        inner("2"),
        inner("3"),
        inner("4"),
        flex(ts()
            .border_solid(1.0)
            .r(4.0)
            .min_size((80.0, 40.0))
            .justify_center()
            .align_self(dynamic(|f: &AlignSelf| (*f).into()))
            .border_color(dynamic(|t: &Theme| t.border)))
        .label(
            "AlignSelf 5",
            ts().text_color(dynamic(|t: &Theme| t.text)).font_size(14.0),
        ),
        inner("6"),
        inner("7"),
        inner("8"),
        inner("9"),
    ]
}

fn main_aria() -> Element {
    v_flex(ts().gap(8.0).shrink().min_height(0.0).overflow_hidden())
        .label(
            "Results",
            ts().text_color(dynamic(|t: &Theme| t.text)).font_size(16.0),
        )
        .child(|| {
            flex(ts()
                .gap(use_provided::<Gap>().get().0)
                .flex_direction(use_provided::<FlexDirection>().get())
                .flex_wrap_internal(use_provided::<FlexWrap>().get())
                .align_self(use_provided::<AlignSelf>().get())
                .align_items(use_provided::<AlignItems>().get())
                .align_content(use_provided::<AlignContent>().get())
                .justify_content(use_provided::<JustifyContent>().get()))
            .style_d(|t: &Theme| {
                ts().p(8.0)
                    .r(4.0)
                    .min_size((400.0, 200.0))
                    .max_size((950.0, 400.0))
                    .resizable_right(true)
                    .resizable_bottom(true)
                    .border_dashed(1.0)
                    .border_color(t.border)
                    .overflow_y_hidden()
                    .scrollbar_always()
                    .scrollbar_mode(ScrollbarMode::Overlay)
                    .scrollbar(
                        ScrollbarStyle::new(10.0).v_thumb(
                            ts().m_y(4.0)
                                .p_r(5.0)
                                .width(7.0)
                                .r_full()
                                .bg_color(t.border)
                                .hovered(ts().bg_color(t.border_hover)),
                        ),
                    )
            })
            .children(common_inner())
        })
}

fn setting_aria() -> Element {
    v_flex(ts().gap(8.0).m_t(auto()).shrink_0())
        .label(
            "Setting",
            ts().text_color(dynamic(|t: &Theme| t.text)).font_size(16.0),
        )
        .child(table())
}

fn table() -> Element {
    let (gap, set_gap) = create_signal(String::from("8"));

    let label = ts().font_size(12.0).text_color(dynamic(|t: &Theme| t.text));

    let row_1 = ts()
        .w_full()
        .border_right(BorderStyle::Dashed, 1.0)
        .border_color(dynamic(|t: &Theme| t.border));

    let row_2 = ts().w_full();

    let col_1 = ts()
        .p_x(4.0)
        .h(40.0)
        .justify_start()
        .selected(ts().bg_color(dynamic(|t: &Theme| t.primary)));
    let col_2 = col_1
        .clone()
        .bg_color(dynamic(|t: &Theme| t.background_hover));

    h_flex_d(|t: &Theme| {
        ts().r(4.0)
            .justify_evenly()
            .border_dashed(1.0)
            .border_color(t.border)
            .overflow_x_scroll()
            .scrollbar_always()
            .scrollbar_mode(ScrollbarMode::Overlay)
            .scrollbar(
                ScrollbarStyle::new(10.0).h_thumb(
                    ts().m_x(4.0)
                        .p_b(5.0)
                        .h(7.0)
                        .r_full()
                        .bg_color(t.border)
                        .hovered(ts().bg_color(t.border_hover)),
                ),
            )
    })
    .children([
        v_flex(&row_1).children({
            let col_1 = ts().p_x(4.0).h(40.0).justify_start();
            let col_2 = col_1
                .clone()
                .bg_color(dynamic(|t: &Theme| t.background_hover));
            [
                flex(&col_1),
                flex(&col_2).label("Gap", &label),
                flex(&col_1).label("FlexDirection", &label),
                flex(&col_2).label("FlexWrap", &label),
                flex(&col_1).label("AlignSelf", &label),
                flex(&col_2).label("AlignItems", &label),
                flex(&col_1).label("AlignContent", &label),
                flex(&col_2).label("JustifyContent", &label),
            ]
        }),
        v_flex(&row_1).children({
            let default = ts()
                .p_x(4.0)
                .h(40.0)
                .justify_start()
                .hovered(ts().bg_color(dynamic(|t: &Theme| t.border)));
            [
                flex(default).label("Default", &label).on_click(move || {
                    use_provided_setter::<Gap>().set(Gap::default());
                    set_gap.set("8".to_string());
                    use_provided_setter::<FlexDirection>().set(FlexDirection::default());
                    use_provided_setter::<FlexWrap>().set(FlexWrap::default());
                    use_provided_setter::<AlignSelf>().set(AlignSelf::default());
                    use_provided_setter::<AlignItems>().set(AlignItems::default());
                    use_provided_setter::<AlignContent>().set(AlignContent::default());
                    use_provided_setter::<JustifyContent>().set(JustifyContent::default());
                }),
                flex(&col_2)
                    .input(move || {
                        InputContents::new((gap, set_gap))
                            .numeric_only(true)
                            .is_ime(false)
                            .placeholder("0 ~ 30")
                    })
                    .style(col_2.clone().merge(&label))
                    .on_char_input(move |_| {
                        let mut i = gap.get().parse::<i32>().unwrap_or(0);
                        i = i.clamp(0, 30);
                        let gap = if i <= 0 { String::new() } else { i.to_string() };
                        set_gap.set(gap);
                        use_provided_setter().set(Gap(i));
                    }),
                flex(&col_1)
                    .label("Row", &label)
                    .select(|| use_provided::<FlexDirection>().get() == FlexDirection::Row)
                    .on_click(|| {
                        use_provided_setter::<FlexDirection>().set(FlexDirection::Row);
                    }),
                flex(&col_2)
                    .label("NoWrap", &label)
                    .select(|| use_provided::<FlexWrap>().get() == FlexWrap::NoWrap)
                    .on_click(|| {
                        use_provided_setter::<FlexWrap>().set(FlexWrap::NoWrap);
                    }),
                flex(&col_1)
                    .label("Stretch", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::Stretch)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::Stretch);
                    }),
                flex(&col_2)
                    .label("Stretch", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::Stretch)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::Stretch);
                    }),
                flex(&col_1)
                    .label("Stretch", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::Stretch)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::Stretch);
                    }),
                flex(&col_2)
                    .label("Stretch", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::Stretch)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::Stretch);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("Column", &label)
                    .select(|| use_provided::<FlexDirection>().get() == FlexDirection::Column)
                    .on_click(|| {
                        use_provided_setter::<FlexDirection>().set(FlexDirection::Column);
                    }),
                flex(&col_2)
                    .label("Wrap", &label)
                    .select(|| use_provided::<FlexWrap>().get() == FlexWrap::Wrap)
                    .on_click(|| {
                        use_provided_setter::<FlexWrap>().set(FlexWrap::Wrap);
                    }),
                flex(&col_1)
                    .label("Start", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::Start)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::Start);
                    }),
                flex(&col_2)
                    .label("Start", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::Start)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::Start);
                    }),
                flex(&col_1)
                    .label("Start", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::Start)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::Start);
                    }),
                flex(&col_2)
                    .label("Start", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::Start)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::Start);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("RowReverse", &label)
                    .select(|| use_provided::<FlexDirection>().get() == FlexDirection::RowReverse)
                    .on_click(|| {
                        use_provided_setter::<FlexDirection>().set(FlexDirection::RowReverse);
                    }),
                flex(&col_2)
                    .label("WrapReverse", &label)
                    .select(|| use_provided::<FlexWrap>().get() == FlexWrap::WrapReverse)
                    .on_click(|| {
                        use_provided_setter::<FlexWrap>().set(FlexWrap::WrapReverse);
                    }),
                flex(&col_1)
                    .label("End", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::End)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::End);
                    }),
                flex(&col_2)
                    .label("End", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::End)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::End);
                    }),
                flex(&col_1)
                    .label("End", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::End)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::End);
                    }),
                flex(&col_2)
                    .label("End", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::End)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::End);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("ColumnReverse", &label)
                    .select(|| {
                        use_provided::<FlexDirection>().get() == FlexDirection::ColumnReverse
                    })
                    .on_click(|| {
                        use_provided_setter::<FlexDirection>().set(FlexDirection::ColumnReverse);
                    }),
                flex(&col_2)
                    .label("Balance", &label)
                    .select(|| use_provided::<FlexWrap>().get() == FlexWrap::Balance)
                    .on_click(|| {
                        use_provided_setter::<FlexWrap>().set(FlexWrap::Balance);
                    }),
                flex(&col_1)
                    .label("FlexStart", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::FlexStart)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::FlexStart);
                    }),
                flex(&col_2)
                    .label("FlexStart", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::FlexStart)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::FlexStart);
                    }),
                flex(&col_1)
                    .label("FlexStart", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::FlexStart)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::FlexStart);
                    }),
                flex(&col_2)
                    .label("FlexStart", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::FlexStart)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::FlexStart);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1),
                flex(&col_2)
                    .label("BalanceReverse", &label)
                    .select(|| use_provided::<FlexWrap>().get() == FlexWrap::BalanceReverse)
                    .on_click(|| {
                        use_provided_setter::<FlexWrap>().set(FlexWrap::BalanceReverse);
                    }),
                flex(&col_1)
                    .label("FlexEnd", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::FlexEnd)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::FlexEnd);
                    }),
                flex(&col_2)
                    .label("FlexEnd", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::FlexEnd)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::FlexEnd);
                    }),
                flex(&col_1)
                    .label("FlexEnd", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::FlexEnd)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::FlexEnd);
                    }),
                flex(&col_2)
                    .label("FlexEnd", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::FlexEnd)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::FlexEnd);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("Center", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::Center)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::Center);
                    }),
                flex(&col_2)
                    .label("Center", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::Center)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::Center);
                    }),
                flex(&col_1)
                    .label("Center", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::Center)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::Center);
                    }),
                flex(&col_2)
                    .label("Center", &label)
                    .select(|| use_provided::<JustifyContent>().get() == JustifyContent::Center)
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::Center);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("Baseline", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::Baseline)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::Baseline);
                    }),
                flex(&col_2)
                    .label("Baseline", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::Baseline)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::Baseline);
                    }),
                flex(&col_1)
                    .label("Between", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::SpaceBetween)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::SpaceBetween);
                    }),
                flex(&col_2)
                    .label("Between", &label)
                    .select(|| {
                        use_provided::<JustifyContent>().get() == JustifyContent::SpaceBetween
                    })
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::SpaceBetween);
                    }),
            ]
        }),
        v_flex(&row_1).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("SelfStart", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::SelfStart)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::SelfStart);
                    }),
                flex(&col_2)
                    .label("SelfStart", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::SelfStart)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::SelfStart);
                    }),
                flex(&col_1)
                    .label("Around", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::SpaceAround)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::SpaceAround);
                    }),
                flex(&col_2)
                    .label("Around", &label)
                    .select(|| {
                        use_provided::<JustifyContent>().get() == JustifyContent::SpaceAround
                    })
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::SpaceAround);
                    }),
            ]
        }),
        v_flex(&row_2).children({
            [
                flex(&col_1),
                flex(&col_2),
                flex(&col_1),
                flex(&col_2),
                flex(&col_1)
                    .label("SelfEnd", &label)
                    .select(|| use_provided::<AlignSelf>().get() == AlignSelf::SelfEnd)
                    .on_click(|| {
                        use_provided_setter::<AlignSelf>().set(AlignSelf::SelfEnd);
                    }),
                flex(&col_2)
                    .label("SelfEnd", &label)
                    .select(|| use_provided::<AlignItems>().get() == AlignItems::SelfEnd)
                    .on_click(|| {
                        use_provided_setter::<AlignItems>().set(AlignItems::SelfEnd);
                    }),
                flex(&col_1)
                    .label("Evenly", &label)
                    .select(|| use_provided::<AlignContent>().get() == AlignContent::SpaceEvenly)
                    .on_click(|| {
                        use_provided_setter::<AlignContent>().set(AlignContent::SpaceEvenly);
                    }),
                flex(&col_2)
                    .label("Evenly", &label)
                    .select(|| {
                        use_provided::<JustifyContent>().get() == JustifyContent::SpaceEvenly
                    })
                    .on_click(|| {
                        use_provided_setter::<JustifyContent>().set(JustifyContent::SpaceEvenly);
                    }),
            ]
        }),
    ])
}