x
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
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
<div class="tw:p-6 tw:max-w-7xl tw:mx-auto tw:space-y-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>FORM CONTROLS:</strong> Inputs, selects, checks, and input groups<br> <strong>VARIANTS:</strong> Controls | Input groups </p> <p class="tw:mb-0 tw:text-sm"> Consolidated entry for form building blocks. Controls covers inputs, selects, labels, validation states, checks and switches; Input groups covers prefixed/suffixed and stepper composites. </p> </div> <div data-controller="tabs"> <div class="tabs" role="tablist"> <button class="tab" role="tab" aria-selected="true" data-tabs-target="tab" data-tabs-anchor="controls" data-action="click->tabs#select keydown->tabs#keydown" type="button">Controls</button> <button class="tab" role="tab" aria-selected="false" data-tabs-target="tab" data-tabs-anchor="input-groups" data-action="click->tabs#select keydown->tabs#keydown" type="button">Input groups</button> </div> <div class="tab-content"> <div class="tab-panel" role="tabpanel" data-tabs-target="panel"> <!-- Header / Introduction --> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>FORM CONTROLS:</strong> Complete reference for all form input components<br> <strong>VARIANTS:</strong> Text Input | Select | Textarea | Checkbox | Radio | Toggle | Validation </p> <p class="tw:mb-0 tw:text-sm"> Form controls are the primary way users enter data into your application. Use consistent styling, clear labels, and helpful validation feedback to guide users through forms efficiently. </p> </div> <!-- Section 1: Text Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Text Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Text Inputs:</strong> Basic single-line text entry fields. Use for names, emails, numbers, and other short text data. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="input-default">Default Input</label> <input type="text" class="form-control" id="input-default" placeholder="Enter text..."> </div> <div> <label class="form-label" for="input-filled">Filled Input</label> <input type="text" class="form-control" id="input-filled" value="Filled value"> </div> <div> <label class="form-label" for="input-disabled">Disabled Input</label> <input type="text" class="form-control" id="input-disabled" value="Cannot edit" disabled> </div> <div> <label class="form-label" for="input-readonly">Readonly Input</label> <input type="text" class="form-control" id="input-readonly" value="Read only value" readonly> </div> <div> <label class="form-label" for="input-locked">Locked Input</label> <div class="input-group has-icon-end"> <input type="text" class="form-control form-control-locked" id="input-locked" value="2026 — Year 7" readonly aria-describedby="input-locked-help"> <span class="input-group-icon input-group-icon-end"><i class="fa-regular fa-lock" aria-hidden="true"></i></span> </div> <p id="input-locked-help" class="form-text">Set by ApplicaaOne so schools can compare enquiries. Locked fields always explain why via helper text.</p> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="text" class="form-control" placeholder="..."></code><br> <code><div class="input-group has-icon-end"><input class="form-control form-control-locked" readonly aria-describedby="..."><span class="input-group-icon input-group-icon-end"><i class="fa-regular fa-lock"></i></span></div></code> </div> </div> <!-- Section 2: Input Sizes --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Input Sizes</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Sizes:</strong> Three size options to match your UI density. Default size works for most cases. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label form-label-sm" for="input-sm">Small Input</label> <input type="text" class="form-control form-control-sm" id="input-sm" placeholder="Small input"> </div> <div> <label class="form-label" for="input-md">Default Input</label> <input type="text" class="form-control" id="input-md" placeholder="Default input"> </div> <div> <label class="form-label form-label-lg" for="input-lg">Large Input</label> <input type="text" class="form-control form-control-lg" id="input-lg" placeholder="Large input"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-control form-control-sm"></code><br> <code><input class="form-control form-control-lg"></code> </div> </div> <!-- Section 3: Labels --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Form Labels</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Labels:</strong> Every form field must have a visible label. Use required/optional indicators to communicate field requirements clearly. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="label-standard">Standard Label</label> <input type="text" class="form-control" id="label-standard" placeholder="Enter value"> </div> <div> <label class="form-label form-label-required" for="label-required">Required Field</label> <input type="text" class="form-control" id="label-required" placeholder="This field is required" aria-required="true"> </div> <div> <label class="form-label form-label-optional" for="label-optional">Optional Field</label> <input type="text" class="form-control" id="label-optional" placeholder="This field is optional"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><label class="form-label">Label</label></code><br> <code><label class="form-label form-label-required">Required</label></code><br> <code><label class="form-label form-label-optional">Optional</label></code> </div> </div> <!-- Section 4: Helper Text & Validation --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Helper Text & Validation</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Feedback:</strong> Use helper text to provide guidance. Validation states visually indicate success or errors with colored borders and feedback messages. </p> </div> <div class="tw:space-y-6 tw:max-w-md"> <!-- Helper text --> <div> <label class="form-label" for="input-helper">With Helper Text</label> <input type="email" class="form-control" id="input-helper" placeholder="name@example.com" aria-describedby="helper-text"> <span class="form-text" id="helper-text">We'll never share your email with anyone else.</span> </div> <!-- Valid state --> <div> <label class="form-label" for="input-valid">Valid Input</label> <input type="text" class="form-control is-valid" id="input-valid" value="Correct value" aria-describedby="valid-feedback"> <span class="valid-feedback" id="valid-feedback">Looks good!</span> </div> <!-- Invalid state --> <div> <label class="form-label form-label-required" for="input-invalid">Invalid Input</label> <input type="text" class="form-control is-invalid" id="input-invalid" value="" aria-describedby="invalid-feedback"> <span class="invalid-feedback" id="invalid-feedback">Please enter a valid value. This field is required.</span> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-control is-valid"></code><br> <code><input class="form-control is-invalid"></code><br> <code><span class="form-text">Helper text</span></code><br> <code><span class="valid-feedback">Success message</span></code><br> <code><span class="invalid-feedback">Error message</span></code> </div> </div> <!-- Section 5: Select Dropdown --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Select Dropdown</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Select:</strong> Dropdown menus for choosing from a list of options. Use when there are more than 5 options or when options are dynamic. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="select-default">Default Select</label> <select class="form-select" id="select-default"> <option selected>Choose an option...</option> <option value="1">Option One</option> <option value="2">Option Two</option> <option value="3">Option Three</option> </select> </div> <div> <label class="form-label" for="select-disabled">Disabled Select</label> <select class="form-select" id="select-disabled" disabled> <option selected>Cannot change</option> <option value="1">Option One</option> </select> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Select Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <select class="form-select form-select-sm"> <option>Small select</option> </select> <select class="form-select"> <option>Default select</option> </select> <select class="form-select form-select-lg"> <option>Large select</option> </select> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Select with Validation</p> <div class="tw:space-y-3 tw:max-w-md"> <div> <select class="form-select is-valid"> <option selected>Valid selection</option> </select> <span class="valid-feedback">Great choice!</span> </div> <div> <select class="form-select is-invalid"> <option selected>Please select...</option> </select> <span class="invalid-feedback">Please make a selection.</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><select class="form-select">...</select></code><br> <code><select class="form-select form-select-sm">...</select></code> </div> </div> <!-- Section 6: Textarea --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Textarea</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Textarea:</strong> Multi-line text input for longer content like descriptions, comments, or messages. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="textarea-default">Default Textarea</label> <textarea class="form-control" id="textarea-default" rows="3" placeholder="Enter your message..."></textarea> </div> <div> <label class="form-label" for="textarea-disabled">Disabled Textarea</label> <textarea class="form-control" id="textarea-disabled" rows="3" disabled>Cannot edit this content.</textarea> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Textarea Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <textarea class="form-control form-control-sm" rows="2" placeholder="Small textarea"></textarea> <textarea class="form-control" rows="3" placeholder="Default textarea"></textarea> <textarea class="form-control form-control-lg" rows="4" placeholder="Large textarea"></textarea> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><textarea class="form-control" rows="3"></textarea></code> </div> </div> <!-- Section 7: Checkbox --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Checkbox</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Checkbox:</strong> Use for multiple selections where users can choose one or more options, or for boolean toggles like accepting terms. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check1"> <label class="form-check-label" for="check1">Default checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check2" checked> <label class="form-check-label" for="check2">Checked checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check3" disabled> <label class="form-check-label" for="check3">Disabled checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check4" checked disabled> <label class="form-check-label" for="check4">Disabled checked checkbox</label> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Inline Checkboxes</p> <div class="tw:flex tw:flex-wrap"> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check1" checked> <label class="form-check-label" for="inline-check1">Option 1</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check2"> <label class="form-check-label" for="inline-check2">Option 2</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check3"> <label class="form-check-label" for="inline-check3">Option 3</label> </div> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Checkbox with Validation</p> <div class="tw:space-y-2"> <div class="form-check"> <input class="form-check-input is-valid" type="checkbox" id="check-valid" checked> <label class="form-check-label" for="check-valid">Accepted terms</label> </div> <div class="form-check"> <input class="form-check-input is-invalid" type="checkbox" id="check-invalid"> <label class="form-check-label" for="check-invalid">You must accept the terms</label> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="form-check"></code><br> <code> <input class="form-check-input" type="checkbox" id="..."></code><br> <code> <label class="form-check-label" for="...">Label</label></code><br> <code></div></code> </div> </div> <!-- Section 8: Radio Buttons --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Radio Buttons</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Radio:</strong> Use for single selections where only one option can be chosen from a group. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio1" checked> <label class="form-check-label" for="radio1">Option one is selected</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio2"> <label class="form-check-label" for="radio2">Option two can be selected</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio3" disabled> <label class="form-check-label" for="radio3">Option three is disabled</label> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Inline Radio Buttons</p> <div class="tw:flex tw:flex-wrap"> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio1" checked> <label class="form-check-label" for="inline-radio1">One</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio2"> <label class="form-check-label" for="inline-radio2">Two</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio3"> <label class="form-check-label" for="inline-radio3">Three</label> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-check-input" type="radio" name="group" id="..."></code> </div> </div> <!-- Section 9: Toggle Switch --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Toggle Switch</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Toggle:</strong> Binary on/off controls for settings and preferences. Use instead of checkboxes when the action takes immediate effect. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch1"> <label class="form-check-label" for="switch1">Enable notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch2" checked> <label class="form-check-label" for="switch2">Dark mode enabled</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch3" disabled> <label class="form-check-label" for="switch3">Disabled toggle</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch4" checked disabled> <label class="form-check-label" for="switch4">Disabled on toggle</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch5"> <div> <label class="form-check-label" for="switch5">Compact view</label> <span class="form-text">Keep everything neat and tidy to show even more content</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="form-switch"></code><br> <code> <input class="form-check-input" type="checkbox" id="..."></code><br> <code> <label class="form-check-label" for="...">Label</label></code><br> <code></div></code> </div> </div> <!-- Section 10: Input Groups --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Input Groups</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Input Groups:</strong> Combine inputs with text addons, icons, or buttons for contextual input fields. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">With Text Addon</label> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="Username"> </div> </div> <div> <label class="form-label">With Suffix</label> <div class="input-group"> <input type="text" class="form-control" placeholder="Amount"> <span class="input-group-text">.00</span> </div> </div> <div> <label class="form-label">With Both</label> <div class="input-group"> <span class="input-group-text">$</span> <input type="text" class="form-control" placeholder="0"> <span class="input-group-text">.00</span> </div> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Input Group Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-sm"> <span class="input-group-text">Small</span> <input type="text" class="form-control" placeholder="Small input group"> </div> <div class="input-group"> <span class="input-group-text">Default</span> <input type="text" class="form-control" placeholder="Default input group"> </div> <div class="input-group input-group-lg"> <span class="input-group-text">Large</span> <input type="text" class="form-control" placeholder="Large input group"> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <span class="input-group-text">@</span></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 11: Plaintext Display --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Plaintext Display</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Plaintext:</strong> Display form values as plain text when in read-only mode while maintaining form layout alignment. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="plaintext-email">Email Address</label> <input type="text" readonly class="form-control-plaintext" id="plaintext-email" value="john.doe@example.com"> </div> <div> <label class="form-label" for="plaintext-name">Full Name</label> <input type="text" readonly class="form-control-plaintext" id="plaintext-name" value="John Doe"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="text" readonly class="form-control-plaintext" value="..."></code> </div> </div> <!-- Section 12: Common Form Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Common Form Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Real-world examples:</strong> Typical form layouts and patterns you'll use in your application. </p> </div> <div class="tw:space-y-8"> <!-- Login Form --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Login Form</p> <div class="card tw:max-w-sm"> <div class="card-body"> <h3 class="card-title">Sign In</h3> <div class="tw:space-y-3"> <div> <label class="form-label form-label-required" for="login-email">Email</label> <input type="email" class="form-control" id="login-email" placeholder="name@example.com"> </div> <div> <label class="form-label form-label-required" for="login-password">Password</label> <input type="password" class="form-control" id="login-password" placeholder="Enter password"> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="login-remember"> <label class="form-check-label" for="login-remember">Remember me</label> </div> <button type="submit" class="btn btn-primary btn-block">Sign In</button> </div> </div> </div> </div> <!-- Contact Form --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Contact Form</p> <div class="card tw:max-w-lg"> <div class="card-body"> <h3 class="card-title">Contact Us</h3> <div class="tw:space-y-3"> <div class="tw:grid tw:grid-cols-2 tw:gap-3"> <div> <label class="form-label form-label-required" for="contact-first">First Name</label> <input type="text" class="form-control" id="contact-first" placeholder="John"> </div> <div> <label class="form-label form-label-required" for="contact-last">Last Name</label> <input type="text" class="form-control" id="contact-last" placeholder="Doe"> </div> </div> <div> <label class="form-label form-label-required" for="contact-email">Email</label> <input type="email" class="form-control" id="contact-email" placeholder="john@example.com"> </div> <div> <label class="form-label" for="contact-subject">Subject</label> <select class="form-select" id="contact-subject"> <option selected>Choose a topic...</option> <option>General Inquiry</option> <option>Technical Support</option> <option>Billing Question</option> </select> </div> <div> <label class="form-label form-label-required" for="contact-message">Message</label> <textarea class="form-control" id="contact-message" rows="4" placeholder="How can we help?"></textarea> </div> <div class="tw:flex tw:gap-2"> <button type="submit" class="btn btn-primary">Send Message</button> <button type="button" class="btn btn-secondary">Cancel</button> </div> </div> </div> </div> </div> <!-- Settings Form with Toggles --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Settings with Toggles</p> <div class="card tw:max-w-md"> <div class="card-header">Notification Preferences</div> <div class="card-body"> <div class="tw:space-y-4"> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-email" checked> <label class="form-check-label" for="setting-email">Email notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-sms"> <label class="form-check-label" for="setting-sms">SMS notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-push" checked> <label class="form-check-label" for="setting-push">Push notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-marketing"> <label class="form-check-label" for="setting-marketing">Marketing emails</label> </div> </div> </div> <div class="card-footer"> <button type="button" class="btn btn-primary btn-sm">Save Preferences</button> </div> </div> </div> </div> </div> <!-- Section 13: Date & Time Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Date & Time Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Date & Time Inputs:</strong> Native <code>input[type=date]</code> and <code>input[type=time]</code> are valid uses of <code>.form-control</code>. The DS border, padding, border-radius, and focus ring apply cleanly. No custom calendar component is needed — the browser's native picker is used. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="input-date">Date input</label> <input type="date" class="form-control" id="input-date" value="2026-02-25"> </div> <div> <label class="form-label" for="input-time">Time input</label> <input type="time" class="form-control" id="input-time" value="09:00"> </div> <div> <label class="form-label" for="input-date-disabled">Date input (disabled)</label> <input type="date" class="form-control" id="input-date-disabled" value="2026-02-25" disabled> </div> </div> <div class="tw:mt-6"> <h3 class="h5 tw:mb-3">Date + time pair</h3> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Date + time pair:</strong> Use a <code>tw:flex tw:gap-2</code> wrapper to place a date and time input side by side. Give the time input a fixed width (<code>tw:w-32</code>) and let the date input grow (<code>tw:flex-1</code>). </p> </div> <div class="tw:max-w-md"> <label class="form-label" for="input-pair-date">Reminder date & time</label> <div class="tw:flex tw:gap-2"> <input type="date" class="form-control tw:flex-1" id="input-pair-date" value="2026-02-25"> <input type="time" class="form-control tw:w-32" id="input-pair-time" value="09:00"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="date" class="form-control tw:flex-1"></code><br> <code><input type="time" class="form-control tw:w-32"></code> </div> </div> </div> <!-- Quick Reference Footer --> <div class="tw:border-t tw:pt-6 tw:mt-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-semibold">Quick Reference</p> <p class="tw:mb-0 tw:text-xs tw:font-mono"> <strong>Text Input:</strong> .form-control<br> <strong>Select:</strong> .form-select<br> <strong>Sizes:</strong> .form-control-sm | .form-control-lg | .form-select-sm | .form-select-lg<br> <strong>Validation:</strong> .is-valid | .is-invalid<br> <strong>Labels:</strong> .form-label | .form-label-required | .form-label-optional | .form-label-sm | .form-label-lg<br> <strong>Feedback:</strong> .form-text | .valid-feedback | .invalid-feedback<br> <strong>Checkbox/Radio:</strong> .form-check > .form-check-input + .form-check-label<br> <strong>Inline:</strong> .form-check-inline<br> <strong>Toggle:</strong> .form-switch > .form-check-input + .form-check-label<br> <strong>Input Group:</strong> .input-group > .input-group-text + .form-control<br> <strong>Input Group Sizes:</strong> .input-group-sm | .input-group-lg<br> <strong>Plaintext:</strong> .form-control-plaintext<br> <strong>Date & Time:</strong> input[type=date] | input[type=time] (both valid with .form-control)<br> <strong>States:</strong> disabled attribute | readonly attribute </p> </div> </div> </div> <div class="tab-panel" role="tabpanel" data-tabs-target="panel"> <!-- Header / Introduction --> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>INPUT GROUPS:</strong> Extend form controls with text, icons, buttons, and steppers<br> <strong>VARIANTS:</strong> Text Addons | Icons | Stepper | Buttons | Combined </p> <p class="tw:mb-0 tw:text-sm"> Input groups allow you to attach additional context to form inputs through prefixes, suffixes, icons, and action buttons. Use them to improve clarity and reduce the number of separate form fields needed. </p> </div> <!-- Section 1: Text Addons (Existing) --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Text Addons (Prefix/Suffix)</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Text Addons:</strong> Attach static text labels to inputs for units, currencies, or contextual information. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">Username</label> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> </div> <div> <label class="form-label">Amount</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="0.00" step="0.01"> <span class="input-group-text">.00</span> </div> </div> <div> <label class="form-label">Website</label> <div class="input-group"> <span class="input-group-text">https://</span> <input type="text" class="form-control" placeholder="www.example.com"> </div> </div> <div> <label class="form-label">Weight</label> <div class="input-group"> <input type="number" class="form-control" placeholder="0"> <span class="input-group-text">kg</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <span class="input-group-text">£</span></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 2: Icon Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Icon Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Icon Inputs:</strong> Add Font Awesome icons inside inputs for visual cues. Icons can be decorative or interactive (clearable, password toggle). </p> </div> <div class="tw:space-y-6"> <!-- Search icon (left) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Icon</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> </div> </div> <!-- Email icon (left) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Email Input with Icon</p> <div class="tw:max-w-md"> <label class="form-label">Email Address</label> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-envelope"></i> <input type="email" class="form-control" placeholder="name@example.com"> </div> </div> </div> <!-- Calendar icon (right) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Date Picker with Icon</p> <div class="tw:max-w-md"> <label class="form-label">Date of Birth</label> <div class="input-group has-icon-end"> <input type="date" class="form-control"> <i class="input-group-icon input-group-icon-end fa-solid fa-calendar"></i> </div> </div> </div> <!-- Clearable input (interactive icon) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Clearable Input (Interactive Icon)</p> <div class="tw:max-w-md"> <label class="form-label">Search Query</label> <div class="input-group has-icon-end"> <input type="text" class="form-control" value="Some search text"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Clear"> <i class="fa-solid fa-xmark"></i> </button> </div> </div> </div> <!-- Password with toggle (interactive) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Password with Visibility Toggle</p> <div class="tw:max-w-md"> <label class="form-label">Password</label> <div class="input-group has-icon-end"> <input type="password" class="form-control" placeholder="Enter password"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Show password"> <i class="fa-solid fa-eye"></i> </button> </div> </div> </div> <!-- Both icons --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Both Icons</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start has-icon-end"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..." value="query"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Clear"> <i class="fa-solid fa-xmark"></i> </button> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group has-icon-start"></code><br> <code> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 3: Number Stepper --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Number Stepper</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Number Stepper:</strong> Attach up/down buttons to number inputs for easy incrementing/decrementing. Perfect for quantity selectors. </p> </div> <div class="tw:space-y-6"> <!-- Basic stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Basic Quantity Selector</p> <div class="tw:max-w-md"> <label class="form-label">Quantity</label> <div class="input-group"> <input type="number" class="form-control" value="1" min="1" max="99"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Stepper with prefix --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Age with Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Age</label> <div class="input-group"> <input type="number" class="form-control" value="25" min="0" max="120"> <span class="input-group-text">years</span> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-plus"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-minus"></i> </button> </div> </div> </div> </div> <!-- Disabled stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Disabled Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Count (Disabled)</label> <div class="input-group"> <input type="number" class="form-control" value="5" disabled> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" disabled> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" disabled> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <input type="number" class="form-control"></code><br> <code> <div class="input-group-stepper"></code><br> <code> <button class="input-group-stepper-btn">▲</button></code><br> <code> <button class="input-group-stepper-btn">▼</button></code><br> <code> </div></code><br> <code></div></code> </div> </div> <!-- Section 4: Button Addons --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Button Addons</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Button Addons:</strong> Attach action buttons directly to inputs for immediate actions like search, submit, or copy. </p> </div> <div class="tw:space-y-6"> <!-- Search with button --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Button</p> <div class="tw:max-w-md"> <div class="input-group"> <input type="search" class="form-control" placeholder="Search..."> <button type="submit" class="btn btn-primary">Search</button> </div> </div> </div> <!-- Email subscription --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Email Subscription</p> <div class="tw:max-w-md"> <label class="form-label">Newsletter</label> <div class="input-group"> <input type="email" class="form-control form-control-sm" placeholder="your@email.com"> <button type="submit" class="btn btn-success btn-sm">Subscribe</button> </div> </div> </div> <!-- Coupon code --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Coupon Code</p> <div class="tw:max-w-md"> <label class="form-label">Discount Code</label> <div class="input-group"> <input type="text" class="form-control" placeholder="Enter code"> <button type="button" class="btn btn-outline-primary">Apply</button> </div> </div> </div> <!-- Copy to clipboard --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Copy to Clipboard</p> <div class="tw:max-w-md"> <label class="form-label">Share Link</label> <div class="input-group"> <input type="text" class="form-control" value="https://example.com/share/abc123" readonly> <button type="button" class="btn btn-secondary">Copy</button> </div> </div> </div> <!-- Multiple buttons --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Multiple Buttons</p> <div class="tw:max-w-md"> <div class="input-group"> <span class="input-group-text">$</span> <input type="number" class="form-control" placeholder="0.00" step="0.01"> <button type="button" class="btn btn-outline-secondary">Clear</button> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <input class="form-control"></code><br> <code> <button class="btn btn-primary">Search</button></code><br> <code></div></code> </div> </div> <!-- Section 5: Combined Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Combined Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Combined:</strong> Mix and match different addon types for complex input patterns. </p> </div> <div class="tw:space-y-6"> <!-- Search with icon + button --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search: Icon + Button</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search products..."> <button type="submit" class="btn btn-primary">Go</button> </div> </div> </div> <!-- Currency with prefix + stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Price: Currency + Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Price</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control" value="10.00" step="0.01"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Phone number with country code --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Phone Number with Country</p> <div class="tw:max-w-md"> <label class="form-label">Phone</label> <div class="input-group"> <span class="input-group-text">+44</span> <input type="tel" class="form-control" placeholder="7700 900000"> <button type="button" class="btn btn-outline-secondary btn-icon" aria-label="Info"> <i class="fa-solid fa-circle-info"></i> </button> </div> </div> </div> <!-- Password with strength meter --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Password with Toggle + Button</p> <div class="tw:max-w-md"> <label class="form-label">New Password</label> <div class="input-group"> <div class="input-group has-icon-end"> <input type="password" class="form-control" placeholder="Enter password"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Show password"> <i class="fa-solid fa-eye"></i> </button> </div> <button type="button" class="btn btn-outline-primary">Generate</button> </div> </div> </div> </div> </div> <!-- Section 6: Size Variants --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Size Variants</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Sizes:</strong> All input group components support small, default, and large sizes. </p> </div> <div class="tw:space-y-6"> <!-- Small --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Small Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-sm"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group input-group-sm has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group input-group-sm"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Default --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Default Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Large --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Large Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-lg"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group input-group-lg has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group input-group-lg"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group input-group-sm">...</div></code><br> <code><div class="input-group input-group-lg">...</div></code> </div> </div> <!-- Section 7: Validation States --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Validation States</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Validation:</strong> Input groups work seamlessly with validation states. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">Search (Valid)</label> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control is-valid" value="Valid query"> </div> <span class="valid-feedback">Search query is valid.</span> </div> <div> <label class="form-label form-label-required">Price (Invalid)</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control is-invalid" value=""> </div> <span class="invalid-feedback">Please enter a price.</span> </div> </div> </div> <!-- Section 8: Common Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Common Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Real-world examples:</strong> Typical input group combinations used in applications. </p> </div> <div class="tw:space-y-8"> <!-- Search bar --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search Bar</p> <div class="card tw:max-w-2xl"> <div class="card-body"> <form> <div class="input-group input-group-lg has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search for products, orders, or help..."> <button type="submit" class="btn btn-primary">Search</button> </div> </form> </div> </div> </div> <!-- Product quantity selector --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Product Cart Item</p> <div class="card tw:max-w-sm"> <div class="card-body"> <div class="tw:flex tw:items-center tw:gap-3"> <div class="tw:w-16 tw:h-16 tw:bg-neutral-200 tw:rounded"></div> <div class="tw:flex-1"> <h3 class="tw:text-sm tw:font-semibold tw:mb-1">Product Name</h3> <p class="tw:text-xs text-muted">£29.99</p> </div> <div class="input-group" class="tw:w-[120px]"> <input type="number" class="form-control" value="2" min="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> </div> <!-- Filter panel --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Price Filter</p> <div class="card tw:max-w-md"> <div class="card-header">Filter by Price</div> <div class="card-body"> <div class="tw:grid tw:grid-cols-2 tw:gap-3"> <div> <label class="form-label form-label-sm">Min</label> <div class="input-group input-group-sm"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="0"> </div> </div> <div> <label class="form-label form-label-sm">Max</label> <div class="input-group input-group-sm"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="1000"> </div> </div> </div> <button type="submit" class="btn btn-primary btn-sm btn-block tw:mt-3">Apply Filter</button> </div> </div> </div> </div> </div> <!-- Quick Reference Footer --> <div class="tw:border-t tw:pt-6 tw:mt-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-semibold">Quick Reference</p> <p class="tw:mb-0 tw:text-xs tw:font-mono"> <strong>Container:</strong> .input-group<br> <strong>Text Addon:</strong> .input-group-text<br> <strong>Icon:</strong> .input-group-icon | .input-group-icon-start | .input-group-icon-end | .input-group-icon-clickable<br> <strong>Icon Modifiers:</strong> .has-icon-start | .has-icon-end (add to .input-group)<br> <strong>Stepper:</strong> .input-group-stepper > .input-group-stepper-btn<br> <strong>Button:</strong> .input-group > .btn<br> <strong>Sizes:</strong> .input-group-sm | .input-group-lg<br> <strong>Note:</strong> Use Font Awesome icons (.fa-solid, .fa-regular, etc.) </p> </div> </div> </div> </div> </div></div>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
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
<div class="tw:p-6 tw:max-w-7xl tw:mx-auto tw:space-y-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>FORM CONTROLS:</strong> Inputs, selects, checks, and input groups<br> <strong>VARIANTS:</strong> Controls | Input groups </p> <p class="tw:mb-0 tw:text-sm"> Consolidated entry for form building blocks. Controls covers inputs, selects, labels, validation states, checks and switches; Input groups covers prefixed/suffixed and stepper composites. </p> </div> <div data-controller="tabs"> <div class="tabs" role="tablist"> <button class="tab" role="tab" aria-selected="true" data-tabs-target="tab" data-tabs-anchor="controls" data-action="click->tabs#select keydown->tabs#keydown" type="button">Controls</button> <button class="tab" role="tab" aria-selected="false" data-tabs-target="tab" data-tabs-anchor="input-groups" data-action="click->tabs#select keydown->tabs#keydown" type="button">Input groups</button> </div> <div class="tab-content"> <div class="tab-panel" role="tabpanel" data-tabs-target="panel"> <!-- Header / Introduction --> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>FORM CONTROLS:</strong> Complete reference for all form input components<br> <strong>VARIANTS:</strong> Text Input | Select | Textarea | Checkbox | Radio | Toggle | Validation </p> <p class="tw:mb-0 tw:text-sm"> Form controls are the primary way users enter data into your application. Use consistent styling, clear labels, and helpful validation feedback to guide users through forms efficiently. </p> </div> <!-- Section 1: Text Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Text Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Text Inputs:</strong> Basic single-line text entry fields. Use for names, emails, numbers, and other short text data. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="input-default">Default Input</label> <input type="text" class="form-control" id="input-default" placeholder="Enter text..."> </div> <div> <label class="form-label" for="input-filled">Filled Input</label> <input type="text" class="form-control" id="input-filled" value="Filled value"> </div> <div> <label class="form-label" for="input-disabled">Disabled Input</label> <input type="text" class="form-control" id="input-disabled" value="Cannot edit" disabled> </div> <div> <label class="form-label" for="input-readonly">Readonly Input</label> <input type="text" class="form-control" id="input-readonly" value="Read only value" readonly> </div> <div> <label class="form-label" for="input-locked">Locked Input</label> <div class="input-group has-icon-end"> <input type="text" class="form-control form-control-locked" id="input-locked" value="2026 — Year 7" readonly aria-describedby="input-locked-help"> <span class="input-group-icon input-group-icon-end"><i class="fa-regular fa-lock" aria-hidden="true"></i></span> </div> <p id="input-locked-help" class="form-text">Set by ApplicaaOne so schools can compare enquiries. Locked fields always explain why via helper text.</p> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="text" class="form-control" placeholder="..."></code><br> <code><div class="input-group has-icon-end"><input class="form-control form-control-locked" readonly aria-describedby="..."><span class="input-group-icon input-group-icon-end"><i class="fa-regular fa-lock"></i></span></div></code> </div> </div> <!-- Section 2: Input Sizes --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Input Sizes</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Sizes:</strong> Three size options to match your UI density. Default size works for most cases. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label form-label-sm" for="input-sm">Small Input</label> <input type="text" class="form-control form-control-sm" id="input-sm" placeholder="Small input"> </div> <div> <label class="form-label" for="input-md">Default Input</label> <input type="text" class="form-control" id="input-md" placeholder="Default input"> </div> <div> <label class="form-label form-label-lg" for="input-lg">Large Input</label> <input type="text" class="form-control form-control-lg" id="input-lg" placeholder="Large input"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-control form-control-sm"></code><br> <code><input class="form-control form-control-lg"></code> </div> </div> <!-- Section 3: Labels --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Form Labels</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Labels:</strong> Every form field must have a visible label. Use required/optional indicators to communicate field requirements clearly. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="label-standard">Standard Label</label> <input type="text" class="form-control" id="label-standard" placeholder="Enter value"> </div> <div> <label class="form-label form-label-required" for="label-required">Required Field</label> <input type="text" class="form-control" id="label-required" placeholder="This field is required" aria-required="true"> </div> <div> <label class="form-label form-label-optional" for="label-optional">Optional Field</label> <input type="text" class="form-control" id="label-optional" placeholder="This field is optional"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><label class="form-label">Label</label></code><br> <code><label class="form-label form-label-required">Required</label></code><br> <code><label class="form-label form-label-optional">Optional</label></code> </div> </div> <!-- Section 4: Helper Text & Validation --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Helper Text & Validation</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Feedback:</strong> Use helper text to provide guidance. Validation states visually indicate success or errors with colored borders and feedback messages. </p> </div> <div class="tw:space-y-6 tw:max-w-md"> <!-- Helper text --> <div> <label class="form-label" for="input-helper">With Helper Text</label> <input type="email" class="form-control" id="input-helper" placeholder="name@example.com" aria-describedby="helper-text"> <span class="form-text" id="helper-text">We'll never share your email with anyone else.</span> </div> <!-- Valid state --> <div> <label class="form-label" for="input-valid">Valid Input</label> <input type="text" class="form-control is-valid" id="input-valid" value="Correct value" aria-describedby="valid-feedback"> <span class="valid-feedback" id="valid-feedback">Looks good!</span> </div> <!-- Invalid state --> <div> <label class="form-label form-label-required" for="input-invalid">Invalid Input</label> <input type="text" class="form-control is-invalid" id="input-invalid" value="" aria-describedby="invalid-feedback"> <span class="invalid-feedback" id="invalid-feedback">Please enter a valid value. This field is required.</span> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-control is-valid"></code><br> <code><input class="form-control is-invalid"></code><br> <code><span class="form-text">Helper text</span></code><br> <code><span class="valid-feedback">Success message</span></code><br> <code><span class="invalid-feedback">Error message</span></code> </div> </div> <!-- Section 5: Select Dropdown --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Select Dropdown</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Select:</strong> Dropdown menus for choosing from a list of options. Use when there are more than 5 options or when options are dynamic. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="select-default">Default Select</label> <select class="form-select" id="select-default"> <option selected>Choose an option...</option> <option value="1">Option One</option> <option value="2">Option Two</option> <option value="3">Option Three</option> </select> </div> <div> <label class="form-label" for="select-disabled">Disabled Select</label> <select class="form-select" id="select-disabled" disabled> <option selected>Cannot change</option> <option value="1">Option One</option> </select> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Select Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <select class="form-select form-select-sm"> <option>Small select</option> </select> <select class="form-select"> <option>Default select</option> </select> <select class="form-select form-select-lg"> <option>Large select</option> </select> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Select with Validation</p> <div class="tw:space-y-3 tw:max-w-md"> <div> <select class="form-select is-valid"> <option selected>Valid selection</option> </select> <span class="valid-feedback">Great choice!</span> </div> <div> <select class="form-select is-invalid"> <option selected>Please select...</option> </select> <span class="invalid-feedback">Please make a selection.</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><select class="form-select">...</select></code><br> <code><select class="form-select form-select-sm">...</select></code> </div> </div> <!-- Section 6: Textarea --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Textarea</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Textarea:</strong> Multi-line text input for longer content like descriptions, comments, or messages. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="textarea-default">Default Textarea</label> <textarea class="form-control" id="textarea-default" rows="3" placeholder="Enter your message..."></textarea> </div> <div> <label class="form-label" for="textarea-disabled">Disabled Textarea</label> <textarea class="form-control" id="textarea-disabled" rows="3" disabled>Cannot edit this content.</textarea> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Textarea Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <textarea class="form-control form-control-sm" rows="2" placeholder="Small textarea"></textarea> <textarea class="form-control" rows="3" placeholder="Default textarea"></textarea> <textarea class="form-control form-control-lg" rows="4" placeholder="Large textarea"></textarea> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><textarea class="form-control" rows="3"></textarea></code> </div> </div> <!-- Section 7: Checkbox --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Checkbox</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Checkbox:</strong> Use for multiple selections where users can choose one or more options, or for boolean toggles like accepting terms. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check1"> <label class="form-check-label" for="check1">Default checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check2" checked> <label class="form-check-label" for="check2">Checked checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check3" disabled> <label class="form-check-label" for="check3">Disabled checkbox</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="check4" checked disabled> <label class="form-check-label" for="check4">Disabled checked checkbox</label> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Inline Checkboxes</p> <div class="tw:flex tw:flex-wrap"> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check1" checked> <label class="form-check-label" for="inline-check1">Option 1</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check2"> <label class="form-check-label" for="inline-check2">Option 2</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="checkbox" id="inline-check3"> <label class="form-check-label" for="inline-check3">Option 3</label> </div> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Checkbox with Validation</p> <div class="tw:space-y-2"> <div class="form-check"> <input class="form-check-input is-valid" type="checkbox" id="check-valid" checked> <label class="form-check-label" for="check-valid">Accepted terms</label> </div> <div class="form-check"> <input class="form-check-input is-invalid" type="checkbox" id="check-invalid"> <label class="form-check-label" for="check-invalid">You must accept the terms</label> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="form-check"></code><br> <code> <input class="form-check-input" type="checkbox" id="..."></code><br> <code> <label class="form-check-label" for="...">Label</label></code><br> <code></div></code> </div> </div> <!-- Section 8: Radio Buttons --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Radio Buttons</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Radio:</strong> Use for single selections where only one option can be chosen from a group. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio1" checked> <label class="form-check-label" for="radio1">Option one is selected</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio2"> <label class="form-check-label" for="radio2">Option two can be selected</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="radioGroup" id="radio3" disabled> <label class="form-check-label" for="radio3">Option three is disabled</label> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Inline Radio Buttons</p> <div class="tw:flex tw:flex-wrap"> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio1" checked> <label class="form-check-label" for="inline-radio1">One</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio2"> <label class="form-check-label" for="inline-radio2">Two</label> </div> <div class="form-check-inline"> <input class="form-check-input" type="radio" name="inlineRadio" id="inline-radio3"> <label class="form-check-label" for="inline-radio3">Three</label> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input class="form-check-input" type="radio" name="group" id="..."></code> </div> </div> <!-- Section 9: Toggle Switch --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Toggle Switch</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Toggle:</strong> Binary on/off controls for settings and preferences. Use instead of checkboxes when the action takes immediate effect. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch1"> <label class="form-check-label" for="switch1">Enable notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch2" checked> <label class="form-check-label" for="switch2">Dark mode enabled</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch3" disabled> <label class="form-check-label" for="switch3">Disabled toggle</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch4" checked disabled> <label class="form-check-label" for="switch4">Disabled on toggle</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="switch5"> <div> <label class="form-check-label" for="switch5">Compact view</label> <span class="form-text">Keep everything neat and tidy to show even more content</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="form-switch"></code><br> <code> <input class="form-check-input" type="checkbox" id="..."></code><br> <code> <label class="form-check-label" for="...">Label</label></code><br> <code></div></code> </div> </div> <!-- Section 10: Input Groups --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Input Groups</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Input Groups:</strong> Combine inputs with text addons, icons, or buttons for contextual input fields. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">With Text Addon</label> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="Username"> </div> </div> <div> <label class="form-label">With Suffix</label> <div class="input-group"> <input type="text" class="form-control" placeholder="Amount"> <span class="input-group-text">.00</span> </div> </div> <div> <label class="form-label">With Both</label> <div class="input-group"> <span class="input-group-text">$</span> <input type="text" class="form-control" placeholder="0"> <span class="input-group-text">.00</span> </div> </div> </div> <div class="tw:mt-4"> <p class="tw:text-sm tw:font-semibold tw:mb-3">Input Group Sizes</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-sm"> <span class="input-group-text">Small</span> <input type="text" class="form-control" placeholder="Small input group"> </div> <div class="input-group"> <span class="input-group-text">Default</span> <input type="text" class="form-control" placeholder="Default input group"> </div> <div class="input-group input-group-lg"> <span class="input-group-text">Large</span> <input type="text" class="form-control" placeholder="Large input group"> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <span class="input-group-text">@</span></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 11: Plaintext Display --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Plaintext Display</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Plaintext:</strong> Display form values as plain text when in read-only mode while maintaining form layout alignment. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="plaintext-email">Email Address</label> <input type="text" readonly class="form-control-plaintext" id="plaintext-email" value="john.doe@example.com"> </div> <div> <label class="form-label" for="plaintext-name">Full Name</label> <input type="text" readonly class="form-control-plaintext" id="plaintext-name" value="John Doe"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="text" readonly class="form-control-plaintext" value="..."></code> </div> </div> <!-- Section 12: Common Form Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Common Form Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Real-world examples:</strong> Typical form layouts and patterns you'll use in your application. </p> </div> <div class="tw:space-y-8"> <!-- Login Form --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Login Form</p> <div class="card tw:max-w-sm"> <div class="card-body"> <h3 class="card-title">Sign In</h3> <div class="tw:space-y-3"> <div> <label class="form-label form-label-required" for="login-email">Email</label> <input type="email" class="form-control" id="login-email" placeholder="name@example.com"> </div> <div> <label class="form-label form-label-required" for="login-password">Password</label> <input type="password" class="form-control" id="login-password" placeholder="Enter password"> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" id="login-remember"> <label class="form-check-label" for="login-remember">Remember me</label> </div> <button type="submit" class="btn btn-primary btn-block">Sign In</button> </div> </div> </div> </div> <!-- Contact Form --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Contact Form</p> <div class="card tw:max-w-lg"> <div class="card-body"> <h3 class="card-title">Contact Us</h3> <div class="tw:space-y-3"> <div class="tw:grid tw:grid-cols-2 tw:gap-3"> <div> <label class="form-label form-label-required" for="contact-first">First Name</label> <input type="text" class="form-control" id="contact-first" placeholder="John"> </div> <div> <label class="form-label form-label-required" for="contact-last">Last Name</label> <input type="text" class="form-control" id="contact-last" placeholder="Doe"> </div> </div> <div> <label class="form-label form-label-required" for="contact-email">Email</label> <input type="email" class="form-control" id="contact-email" placeholder="john@example.com"> </div> <div> <label class="form-label" for="contact-subject">Subject</label> <select class="form-select" id="contact-subject"> <option selected>Choose a topic...</option> <option>General Inquiry</option> <option>Technical Support</option> <option>Billing Question</option> </select> </div> <div> <label class="form-label form-label-required" for="contact-message">Message</label> <textarea class="form-control" id="contact-message" rows="4" placeholder="How can we help?"></textarea> </div> <div class="tw:flex tw:gap-2"> <button type="submit" class="btn btn-primary">Send Message</button> <button type="button" class="btn btn-secondary">Cancel</button> </div> </div> </div> </div> </div> <!-- Settings Form with Toggles --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Settings with Toggles</p> <div class="card tw:max-w-md"> <div class="card-header">Notification Preferences</div> <div class="card-body"> <div class="tw:space-y-4"> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-email" checked> <label class="form-check-label" for="setting-email">Email notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-sms"> <label class="form-check-label" for="setting-sms">SMS notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-push" checked> <label class="form-check-label" for="setting-push">Push notifications</label> </div> <div class="form-switch"> <input class="form-check-input" type="checkbox" id="setting-marketing"> <label class="form-check-label" for="setting-marketing">Marketing emails</label> </div> </div> </div> <div class="card-footer"> <button type="button" class="btn btn-primary btn-sm">Save Preferences</button> </div> </div> </div> </div> </div> <!-- Section 13: Date & Time Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Date & Time Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Date & Time Inputs:</strong> Native <code>input[type=date]</code> and <code>input[type=time]</code> are valid uses of <code>.form-control</code>. The DS border, padding, border-radius, and focus ring apply cleanly. No custom calendar component is needed — the browser's native picker is used. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label" for="input-date">Date input</label> <input type="date" class="form-control" id="input-date" value="2026-02-25"> </div> <div> <label class="form-label" for="input-time">Time input</label> <input type="time" class="form-control" id="input-time" value="09:00"> </div> <div> <label class="form-label" for="input-date-disabled">Date input (disabled)</label> <input type="date" class="form-control" id="input-date-disabled" value="2026-02-25" disabled> </div> </div> <div class="tw:mt-6"> <h3 class="h5 tw:mb-3">Date + time pair</h3> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Date + time pair:</strong> Use a <code>tw:flex tw:gap-2</code> wrapper to place a date and time input side by side. Give the time input a fixed width (<code>tw:w-32</code>) and let the date input grow (<code>tw:flex-1</code>). </p> </div> <div class="tw:max-w-md"> <label class="form-label" for="input-pair-date">Reminder date & time</label> <div class="tw:flex tw:gap-2"> <input type="date" class="form-control tw:flex-1" id="input-pair-date" value="2026-02-25"> <input type="time" class="form-control tw:w-32" id="input-pair-time" value="09:00"> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><input type="date" class="form-control tw:flex-1"></code><br> <code><input type="time" class="form-control tw:w-32"></code> </div> </div> </div> <!-- Quick Reference Footer --> <div class="tw:border-t tw:pt-6 tw:mt-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-semibold">Quick Reference</p> <p class="tw:mb-0 tw:text-xs tw:font-mono"> <strong>Text Input:</strong> .form-control<br> <strong>Select:</strong> .form-select<br> <strong>Sizes:</strong> .form-control-sm | .form-control-lg | .form-select-sm | .form-select-lg<br> <strong>Validation:</strong> .is-valid | .is-invalid<br> <strong>Labels:</strong> .form-label | .form-label-required | .form-label-optional | .form-label-sm | .form-label-lg<br> <strong>Feedback:</strong> .form-text | .valid-feedback | .invalid-feedback<br> <strong>Checkbox/Radio:</strong> .form-check > .form-check-input + .form-check-label<br> <strong>Inline:</strong> .form-check-inline<br> <strong>Toggle:</strong> .form-switch > .form-check-input + .form-check-label<br> <strong>Input Group:</strong> .input-group > .input-group-text + .form-control<br> <strong>Input Group Sizes:</strong> .input-group-sm | .input-group-lg<br> <strong>Plaintext:</strong> .form-control-plaintext<br> <strong>Date & Time:</strong> input[type=date] | input[type=time] (both valid with .form-control)<br> <strong>States:</strong> disabled attribute | readonly attribute </p> </div> </div> </div> <div class="tab-panel" role="tabpanel" data-tabs-target="panel"> <!-- Header / Introduction --> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-mono"> <strong>INPUT GROUPS:</strong> Extend form controls with text, icons, buttons, and steppers<br> <strong>VARIANTS:</strong> Text Addons | Icons | Stepper | Buttons | Combined </p> <p class="tw:mb-0 tw:text-sm"> Input groups allow you to attach additional context to form inputs through prefixes, suffixes, icons, and action buttons. Use them to improve clarity and reduce the number of separate form fields needed. </p> </div> <!-- Section 1: Text Addons (Existing) --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Text Addons (Prefix/Suffix)</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Text Addons:</strong> Attach static text labels to inputs for units, currencies, or contextual information. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">Username</label> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> </div> <div> <label class="form-label">Amount</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="0.00" step="0.01"> <span class="input-group-text">.00</span> </div> </div> <div> <label class="form-label">Website</label> <div class="input-group"> <span class="input-group-text">https://</span> <input type="text" class="form-control" placeholder="www.example.com"> </div> </div> <div> <label class="form-label">Weight</label> <div class="input-group"> <input type="number" class="form-control" placeholder="0"> <span class="input-group-text">kg</span> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <span class="input-group-text">£</span></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 2: Icon Inputs --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Icon Inputs</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Icon Inputs:</strong> Add Font Awesome icons inside inputs for visual cues. Icons can be decorative or interactive (clearable, password toggle). </p> </div> <div class="tw:space-y-6"> <!-- Search icon (left) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Icon</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> </div> </div> <!-- Email icon (left) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Email Input with Icon</p> <div class="tw:max-w-md"> <label class="form-label">Email Address</label> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-envelope"></i> <input type="email" class="form-control" placeholder="name@example.com"> </div> </div> </div> <!-- Calendar icon (right) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Date Picker with Icon</p> <div class="tw:max-w-md"> <label class="form-label">Date of Birth</label> <div class="input-group has-icon-end"> <input type="date" class="form-control"> <i class="input-group-icon input-group-icon-end fa-solid fa-calendar"></i> </div> </div> </div> <!-- Clearable input (interactive icon) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Clearable Input (Interactive Icon)</p> <div class="tw:max-w-md"> <label class="form-label">Search Query</label> <div class="input-group has-icon-end"> <input type="text" class="form-control" value="Some search text"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Clear"> <i class="fa-solid fa-xmark"></i> </button> </div> </div> </div> <!-- Password with toggle (interactive) --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Password with Visibility Toggle</p> <div class="tw:max-w-md"> <label class="form-label">Password</label> <div class="input-group has-icon-end"> <input type="password" class="form-control" placeholder="Enter password"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Show password"> <i class="fa-solid fa-eye"></i> </button> </div> </div> </div> <!-- Both icons --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Both Icons</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start has-icon-end"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..." value="query"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Clear"> <i class="fa-solid fa-xmark"></i> </button> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group has-icon-start"></code><br> <code> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i></code><br> <code> <input class="form-control"></code><br> <code></div></code> </div> </div> <!-- Section 3: Number Stepper --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Number Stepper</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Number Stepper:</strong> Attach up/down buttons to number inputs for easy incrementing/decrementing. Perfect for quantity selectors. </p> </div> <div class="tw:space-y-6"> <!-- Basic stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Basic Quantity Selector</p> <div class="tw:max-w-md"> <label class="form-label">Quantity</label> <div class="input-group"> <input type="number" class="form-control" value="1" min="1" max="99"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Stepper with prefix --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Age with Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Age</label> <div class="input-group"> <input type="number" class="form-control" value="25" min="0" max="120"> <span class="input-group-text">years</span> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-plus"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-minus"></i> </button> </div> </div> </div> </div> <!-- Disabled stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Disabled Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Count (Disabled)</label> <div class="input-group"> <input type="number" class="form-control" value="5" disabled> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" disabled> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" disabled> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <input type="number" class="form-control"></code><br> <code> <div class="input-group-stepper"></code><br> <code> <button class="input-group-stepper-btn">▲</button></code><br> <code> <button class="input-group-stepper-btn">▼</button></code><br> <code> </div></code><br> <code></div></code> </div> </div> <!-- Section 4: Button Addons --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Button Addons</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Button Addons:</strong> Attach action buttons directly to inputs for immediate actions like search, submit, or copy. </p> </div> <div class="tw:space-y-6"> <!-- Search with button --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search with Button</p> <div class="tw:max-w-md"> <div class="input-group"> <input type="search" class="form-control" placeholder="Search..."> <button type="submit" class="btn btn-primary">Search</button> </div> </div> </div> <!-- Email subscription --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Email Subscription</p> <div class="tw:max-w-md"> <label class="form-label">Newsletter</label> <div class="input-group"> <input type="email" class="form-control form-control-sm" placeholder="your@email.com"> <button type="submit" class="btn btn-success btn-sm">Subscribe</button> </div> </div> </div> <!-- Coupon code --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Coupon Code</p> <div class="tw:max-w-md"> <label class="form-label">Discount Code</label> <div class="input-group"> <input type="text" class="form-control" placeholder="Enter code"> <button type="button" class="btn btn-outline-primary">Apply</button> </div> </div> </div> <!-- Copy to clipboard --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Copy to Clipboard</p> <div class="tw:max-w-md"> <label class="form-label">Share Link</label> <div class="input-group"> <input type="text" class="form-control" value="https://example.com/share/abc123" readonly> <button type="button" class="btn btn-secondary">Copy</button> </div> </div> </div> <!-- Multiple buttons --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Multiple Buttons</p> <div class="tw:max-w-md"> <div class="input-group"> <span class="input-group-text">$</span> <input type="number" class="form-control" placeholder="0.00" step="0.01"> <button type="button" class="btn btn-outline-secondary">Clear</button> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group"></code><br> <code> <input class="form-control"></code><br> <code> <button class="btn btn-primary">Search</button></code><br> <code></div></code> </div> </div> <!-- Section 5: Combined Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Combined Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Combined:</strong> Mix and match different addon types for complex input patterns. </p> </div> <div class="tw:space-y-6"> <!-- Search with icon + button --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search: Icon + Button</p> <div class="tw:max-w-md"> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search products..."> <button type="submit" class="btn btn-primary">Go</button> </div> </div> </div> <!-- Currency with prefix + stepper --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Price: Currency + Stepper</p> <div class="tw:max-w-md"> <label class="form-label">Price</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control" value="10.00" step="0.01"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Phone number with country code --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Phone Number with Country</p> <div class="tw:max-w-md"> <label class="form-label">Phone</label> <div class="input-group"> <span class="input-group-text">+44</span> <input type="tel" class="form-control" placeholder="7700 900000"> <button type="button" class="btn btn-outline-secondary btn-icon" aria-label="Info"> <i class="fa-solid fa-circle-info"></i> </button> </div> </div> </div> <!-- Password with strength meter --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Password with Toggle + Button</p> <div class="tw:max-w-md"> <label class="form-label">New Password</label> <div class="input-group"> <div class="input-group has-icon-end"> <input type="password" class="form-control" placeholder="Enter password"> <button type="button" class="input-group-icon input-group-icon-end input-group-icon-clickable" aria-label="Show password"> <i class="fa-solid fa-eye"></i> </button> </div> <button type="button" class="btn btn-outline-primary">Generate</button> </div> </div> </div> </div> </div> <!-- Section 6: Size Variants --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Size Variants</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Sizes:</strong> All input group components support small, default, and large sizes. </p> </div> <div class="tw:space-y-6"> <!-- Small --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Small Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-sm"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group input-group-sm has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group input-group-sm"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Default --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Default Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> <!-- Large --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Large Size</p> <div class="tw:space-y-3 tw:max-w-md"> <div class="input-group input-group-lg"> <span class="input-group-text">@</span> <input type="text" class="form-control" placeholder="username"> </div> <div class="input-group input-group-lg has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search..."> </div> <div class="input-group input-group-lg"> <input type="number" class="form-control" value="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> <div class="tw:mt-4 tw:text-sm tw:text-gray-600"> <code><div class="input-group input-group-sm">...</div></code><br> <code><div class="input-group input-group-lg">...</div></code> </div> </div> <!-- Section 7: Validation States --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Validation States</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Validation:</strong> Input groups work seamlessly with validation states. </p> </div> <div class="tw:space-y-4 tw:max-w-md"> <div> <label class="form-label">Search (Valid)</label> <div class="input-group has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control is-valid" value="Valid query"> </div> <span class="valid-feedback">Search query is valid.</span> </div> <div> <label class="form-label form-label-required">Price (Invalid)</label> <div class="input-group"> <span class="input-group-text">£</span> <input type="number" class="form-control is-invalid" value=""> </div> <span class="invalid-feedback">Please enter a price.</span> </div> </div> </div> <!-- Section 8: Common Patterns --> <div class="tw:border-t tw:pt-6"> <h2 class="h4 tw:mb-4">Common Patterns</h2> <div class="callout tw:mb-4"> <p class="tw:mb-0 tw:text-sm"> <strong>Real-world examples:</strong> Typical input group combinations used in applications. </p> </div> <div class="tw:space-y-8"> <!-- Search bar --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Search Bar</p> <div class="card tw:max-w-2xl"> <div class="card-body"> <form> <div class="input-group input-group-lg has-icon-start"> <i class="input-group-icon input-group-icon-start fa-solid fa-magnifying-glass"></i> <input type="search" class="form-control" placeholder="Search for products, orders, or help..."> <button type="submit" class="btn btn-primary">Search</button> </div> </form> </div> </div> </div> <!-- Product quantity selector --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Product Cart Item</p> <div class="card tw:max-w-sm"> <div class="card-body"> <div class="tw:flex tw:items-center tw:gap-3"> <div class="tw:w-16 tw:h-16 tw:bg-neutral-200 tw:rounded"></div> <div class="tw:flex-1"> <h3 class="tw:text-sm tw:font-semibold tw:mb-1">Product Name</h3> <p class="tw:text-xs text-muted">£29.99</p> </div> <div class="input-group" class="tw:w-[120px]"> <input type="number" class="form-control" value="2" min="1"> <div class="input-group-stepper"> <button type="button" class="input-group-stepper-btn" aria-label="Increase"> <i class="fa-solid fa-chevron-up"></i> </button> <button type="button" class="input-group-stepper-btn" aria-label="Decrease"> <i class="fa-solid fa-chevron-down"></i> </button> </div> </div> </div> </div> </div> </div> <!-- Filter panel --> <div> <p class="tw:text-sm tw:font-semibold tw:mb-3">Price Filter</p> <div class="card tw:max-w-md"> <div class="card-header">Filter by Price</div> <div class="card-body"> <div class="tw:grid tw:grid-cols-2 tw:gap-3"> <div> <label class="form-label form-label-sm">Min</label> <div class="input-group input-group-sm"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="0"> </div> </div> <div> <label class="form-label form-label-sm">Max</label> <div class="input-group input-group-sm"> <span class="input-group-text">£</span> <input type="number" class="form-control" placeholder="1000"> </div> </div> </div> <button type="submit" class="btn btn-primary btn-sm btn-block tw:mt-3">Apply Filter</button> </div> </div> </div> </div> </div> <!-- Quick Reference Footer --> <div class="tw:border-t tw:pt-6 tw:mt-8"> <div class="callout"> <p class="tw:mb-1 tw:text-sm tw:font-semibold">Quick Reference</p> <p class="tw:mb-0 tw:text-xs tw:font-mono"> <strong>Container:</strong> .input-group<br> <strong>Text Addon:</strong> .input-group-text<br> <strong>Icon:</strong> .input-group-icon | .input-group-icon-start | .input-group-icon-end | .input-group-icon-clickable<br> <strong>Icon Modifiers:</strong> .has-icon-start | .has-icon-end (add to .input-group)<br> <strong>Stepper:</strong> .input-group-stepper > .input-group-stepper-btn<br> <strong>Button:</strong> .input-group > .btn<br> <strong>Sizes:</strong> .input-group-sm | .input-group-lg<br> <strong>Note:</strong> Use Font Awesome icons (.fa-solid, .fa-regular, etc.) </p> </div> </div> </div> </div> </div></div>No notes provided.
No params configured.