superdesk-ui-framework 4.0.76 → 4.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@ interface IProps {
11
11
  type?: 'default' | 'primary' | 'highlight' | 'darker' | 'dark';
12
12
  state?: 'normal' | 'active'; // defaults to 'normal'
13
13
  value?: 'button' | 'submit' | 'reset'; // defaults to 'button'
14
- onClick(): void;
14
+ onClick(e: React.MouseEvent<HTMLButtonElement>): void;
15
15
  badgeValue?: string;
16
16
  }
17
17
 
@@ -9,6 +9,7 @@ interface IPropsPopupPositioner {
9
9
  getReferenceElement(): HTMLElement;
10
10
  placement: Placement;
11
11
  onClose(): void;
12
+ shouldCloseOnClick?: (event: MouseEvent) => boolean;
12
13
  closeOnHoverEnd?: boolean;
13
14
  'data-test-id'?: string;
14
15
  }
@@ -35,6 +36,10 @@ export class PopupPositioner extends React.PureComponent<IPropsPopupPositioner>
35
36
  return;
36
37
  }
37
38
 
39
+ if (this.props.shouldCloseOnClick != null && this.props.shouldCloseOnClick(event) === false) {
40
+ return;
41
+ }
42
+
38
43
  if (
39
44
  this.props.getReferenceElement().contains(event.target as Node) !== true &&
40
45
  this.wrapperEl.contains(event.target as Node) !== true
@@ -191,6 +196,7 @@ export function showPopup(
191
196
  Component: React.ComponentType<{closePopup(): void}>,
192
197
  closeOnHoverEnd?: boolean,
193
198
  onClose?: () => void,
199
+ shouldCloseOnClick?: (event: MouseEvent) => boolean,
194
200
  ): {close: () => void} {
195
201
  const el = document.createElement('div');
196
202
 
@@ -207,6 +213,7 @@ export function showPopup(
207
213
  getReferenceElement={() => referenceElement}
208
214
  placement={placement}
209
215
  onClose={closeFn}
216
+ shouldCloseOnClick={shouldCloseOnClick}
210
217
  closeOnHoverEnd={closeOnHoverEnd || false}
211
218
  >
212
219
  <Component closePopup={closeFn} />
@@ -8,6 +8,7 @@ export interface IPropsWithPopover {
8
8
  component: React.ComponentType<{closePopup(): void}>;
9
9
  closeOnHoverEnd?: boolean;
10
10
  onClose?: () => void;
11
+ shouldCloseOnClick?(event: MouseEvent): boolean;
11
12
  }
12
13
 
13
14
  /**
@@ -37,6 +38,7 @@ export class WithPopover extends React.PureComponent<IPropsWithPopover> {
37
38
  this.closePopup = undefined;
38
39
  this.props.onClose?.();
39
40
  },
41
+ this.props.shouldCloseOnClick,
40
42
  ).close;
41
43
  }
42
44
  }
Binary file
Binary file
@@ -24,10 +24,31 @@ interface IState {
24
24
  value9?: string;
25
25
  value10?: string;
26
26
  value11?: string;
27
+ value301?: string;
28
+ value302?: string;
29
+ value303?: string;
30
+ value304?: string;
31
+ value305?: string;
32
+ value306?: string;
33
+ value307?: string;
34
+ value308?: string;
35
+ value309?: string;
36
+ value310?: string;
37
+ value311?: string;
38
+ value312?: string;
39
+ value313?: string;
40
+ value314?: string;
41
+ value315?: string;
42
+ value316?: string;
43
+ value317?: string;
44
+ value318?: string;
45
+ value319?: string;
46
+ value320?: string;
47
+ value321?: string;
27
48
  }
28
49
 
29
50
  export default class RadioGroupDoc extends React.Component<{}, IState> {
30
- constructor(props) {
51
+ constructor(props: {}) {
31
52
  super(props);
32
53
 
33
54
  this.state = {
@@ -42,6 +63,27 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
42
63
  value9: undefined,
43
64
  value10: undefined,
44
65
  value11: undefined,
66
+ value301: undefined,
67
+ value302: undefined,
68
+ value303: undefined,
69
+ value304: undefined,
70
+ value305: undefined,
71
+ value306: undefined,
72
+ value307: undefined,
73
+ value308: undefined,
74
+ value309: undefined,
75
+ value310: undefined,
76
+ value311: undefined,
77
+ value312: undefined,
78
+ value313: undefined,
79
+ value314: undefined,
80
+ value315: undefined,
81
+ value316: undefined,
82
+ value317: undefined,
83
+ value318: undefined,
84
+ value319: undefined,
85
+ value320: undefined,
86
+ value321: undefined,
45
87
  };
46
88
  }
47
89
  render() {
@@ -184,7 +226,7 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
184
226
  {value: 'test8', label: 'Button style'},
185
227
  {value: 'test9', label: 'Button style disabled', disabled: true},
186
228
  ]}
187
- value={this.state.value3}
229
+ value={this.state.value3 ?? ''}
188
230
  onChange={(value) => this.setState(() => ({value3: value}))}
189
231
  />
190
232
  </div>
@@ -198,7 +240,7 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
198
240
  {value: 'test8', label: 'Button style'},
199
241
  {value: 'test9', label: 'Button style disabled', disabled: true},
200
242
  ]}
201
- value={this.state.value3}
243
+ value={this.state.value3 ?? ''}
202
244
  onChange={(value) => this.setState(() => ({value3: value}))}
203
245
  />
204
246
  </div>
@@ -210,7 +252,7 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
210
252
  {value: 'test11', label: 'I have an icon!', icon: 'grid-view'},
211
253
  {value: 'test12', label: 'Yeah, me too!', icon: 'kanban-view'},
212
254
  ]}
213
- value={this.state.value4}
255
+ value={this.state.value4 ?? ''}
214
256
  onChange={(value) => this.setState(() => ({value4: value}))}
215
257
  />
216
258
  </div>
@@ -224,7 +266,7 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
224
266
  {value: 'test11', label: 'I have an icon!', icon: 'grid-view'},
225
267
  {value: 'test12', label: 'Yeah, me too!', icon: 'kanban-view'},
226
268
  ]}
227
- value={this.state.value4}
269
+ value={this.state.value4 ?? ''}
228
270
  onChange={(value) => this.setState(() => ({value4: value}))}
229
271
  />
230
272
  </div>
@@ -244,7 +286,7 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
244
286
  {value: 'test11', label: 'I have an icon!', icon: 'grid-view', labelHidden: true},
245
287
  {value: 'test12', label: 'Yeah, me too!', icon: 'kanban-view', labelHidden: true},
246
288
  ]}
247
- value={this.state.value4}
289
+ value={this.state.value4 ?? ''}
248
290
  onChange={(value) => this.setState(() => ({value4: value}))}
249
291
  />
250
292
  </div>
@@ -306,39 +348,39 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
306
348
  <p className="docs-page__paragraph docs-page__paragraph--topMarginL">// Left (default)</p>
307
349
  <div className="form__row form__row--flex docs-page__test-helper-2">
308
350
  <RadioButtonGroup
309
- value={this.state.value3}
351
+ value={this.state.value301 ?? ''}
310
352
  options={[
311
353
  {value: 'test301', label: 'Option one'},
312
354
  {value: 'test302', label: 'Option two'},
313
355
  {value: 'test303', label: 'Option three'},
314
356
  ]}
315
- onChange={(value) => this.setState(() => ({value3: value}))}
357
+ onChange={(value) => this.setState(() => ({value301: value}))}
316
358
  />
317
359
  </div>
318
360
  <p className="docs-page__paragraph docs-page__paragraph--topMarginL">// Right</p>
319
361
  <div className="form__row form__row--flex docs-page__test-helper-2">
320
362
  <RadioButtonGroup
321
363
  group={{align: 'end'}}
322
- value={this.state.value4}
364
+ value={this.state.value304 ?? ''}
323
365
  options={[
324
366
  {value: 'test304', label: 'Option one'},
325
367
  {value: 'test305', label: 'Option two'},
326
368
  {value: 'test306', label: 'Option three'},
327
369
  ]}
328
- onChange={(value) => this.setState(() => ({value4: value}))}
370
+ onChange={(value) => this.setState(() => ({value304: value}))}
329
371
  />
330
372
  </div>
331
373
  <p className="docs-page__paragraph docs-page__paragraph--topMarginL">// Center</p>
332
374
  <div className="form__row form__row--flex docs-page__test-helper-2">
333
375
  <RadioButtonGroup
334
376
  group={{align: 'center', groupLabelledBy: 'someID'}}
335
- value={this.state.value5}
377
+ value={this.state.value307 ?? ''}
336
378
  options={[
337
379
  {value: 'test307', label: 'Option one'},
338
380
  {value: 'test308', label: 'Option two'},
339
381
  {value: 'test309', label: 'Option three'},
340
382
  ]}
341
- onChange={(value) => this.setState(() => ({value5: value}))}
383
+ onChange={(value) => this.setState(() => ({value307: value}))}
342
384
  />
343
385
  </div>
344
386
  <p className="docs-page__paragraph docs-page__paragraph--topMarginL">
@@ -346,39 +388,39 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
346
388
  </p>
347
389
  <div className="form__row form__row--flex docs-page__test-helper-2">
348
390
  <RadioButtonGroup
349
- value={this.state.value6}
391
+ value={this.state.value310 ?? ''}
350
392
  options={[
351
393
  {value: 'test310', label: 'One'},
352
394
  {value: 'test311', label: 'Two'},
353
395
  ]}
354
- onChange={(value) => this.setState(() => ({value6: value}))}
396
+ onChange={(value) => this.setState(() => ({value310: value}))}
355
397
  />
356
398
 
357
399
  <RadioButtonGroup
358
400
  group={{align: 'center'}}
359
- value={this.state.value6}
401
+ value={this.state.value312 ?? ''}
360
402
  options={[
361
403
  {value: 'test312', label: 'Three'},
362
404
  {value: 'test313', label: 'Four'},
363
405
  ]}
364
- onChange={(value) => this.setState(() => ({value6: value}))}
406
+ onChange={(value) => this.setState(() => ({value312: value}))}
365
407
  />
366
408
 
367
409
  <RadioButtonGroup
368
410
  group={{align: 'end'}}
369
- value={this.state.value6}
411
+ value={this.state.value314 ?? ''}
370
412
  options={[
371
413
  {value: 'test314', label: 'Five'},
372
414
  {value: 'test315', label: 'Six'},
373
415
  ]}
374
- onChange={(value) => this.setState(() => ({value6: value}))}
416
+ onChange={(value) => this.setState(() => ({value314: value}))}
375
417
  />
376
418
  </div>
377
419
  <p className="docs-page__paragraph docs-page__paragraph--topMarginL">// Grid</p>
378
420
  <div className="form__row form__row--flex docs-page__test-helper-2" style={{width: 500}}>
379
421
  <RadioButtonGroup
380
422
  group={{grid: true}}
381
- value={this.state.value7}
423
+ value={this.state.value316 ?? ''}
382
424
  options={[
383
425
  {value: 'test316', label: 'One'},
384
426
  {value: 'test317', label: 'Two'},
@@ -387,60 +429,60 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
387
429
  {value: 'test320', label: 'Five'},
388
430
  {value: 'test321', label: 'Six'},
389
431
  ]}
390
- onChange={(value) => this.setState(() => ({value7: value}))}
432
+ onChange={(value) => this.setState(() => ({value316: value}))}
391
433
  />
392
434
  </div>
393
435
  </Markup.ReactMarkupPreview>
394
436
  <Markup.ReactMarkupCode>
395
437
  {`
396
438
  // Left (default)
397
- <RadioButtonGroup value={value3} options={[
439
+ <RadioButtonGroup value={value301} options={[
398
440
  {value:'test301', label:'Option one'},
399
441
  {value:'test302', label:'Option two'},
400
442
  {value:'test303', label:'Option three'},
401
- ]} />
443
+ ]} onChange={(value) => this.setState(() => ({ value301: value }))} />
402
444
 
403
445
  // Right
404
- <RadioButtonGroup group={{align:'end'}} value={value4} options={[
446
+ <RadioButtonGroup group={{align:'end'}} value={value304} options={[
405
447
  {value:'test304', label:'Option one'},
406
448
  {value:'test305', label:'Option two'},
407
449
  {value:'test306', label:'Option three'},
408
- ]} />
450
+ ]} onChange={(value) => this.setState(() => ({ value304: value }))} />
409
451
 
410
452
  // Center
411
- <RadioButtonGroup group={{align:'center'}} value={value5} options={[
453
+ <RadioButtonGroup group={{align:'center'}} value={value307} options={[
412
454
  {value:'test307', label:'Option one'},
413
455
  {value:'test308', label:'Option two'},
414
456
  {value:'test309', label:'Option three'},
415
- ]} />
457
+ ]} onChange={(value) => this.setState(() => ({ value307: value }))} />
416
458
 
417
459
  // Left + Center + Right
418
460
  <div className='form__row form__row--flex'>
419
- <RadioButtonGroup value={value6} options={[
461
+ <RadioButtonGroup value={value310} options={[
420
462
  {value:'test310', label:'One'},
421
463
  {value:'test311', label:'Two'},
422
- ]} />
464
+ ]} onChange={(value) => this.setState(() => ({ value310: value }))} />
423
465
 
424
- <RadioButtonGroup group={{align:'center'}} value={value6} options={[
466
+ <RadioButtonGroup group={{align:'center'}} value={value312} options={[
425
467
  {value:'test312', label:'Three'},
426
468
  {value:'test313', label:'Four'},
427
- ]} />
469
+ ]} onChange={(value) => this.setState(() => ({ value312: value }))} />
428
470
 
429
- <RadioButtonGroup group={{align:'end'}} value={value6} options={[
471
+ <RadioButtonGroup group={{align:'end'}} value={value314} options={[
430
472
  {value:'test314', label:'Five'},
431
473
  {value:'test315', label:'Six'},
432
- ]} />
474
+ ]} onChange={(value) => this.setState(() => ({ value314: value }))} />
433
475
  </div>
434
476
 
435
477
  // Grid
436
- <RadioButtonGroup group={{grid:true}} value={value7} options={[
478
+ <RadioButtonGroup group={{grid:true}} value={value316} options={[
437
479
  {value:'test316', label:'One'},
438
480
  {value:'test317', label:'Two'},
439
481
  {value:'test318', label:'Three'},
440
482
  {value:'test319', label:'Four'},
441
483
  {value:'test320', label:'Five'},
442
484
  {value:'test321', label:'Six'},
443
- ]} />
485
+ ]} onChange={(value) => this.setState(() => ({ value316: value }))} />
444
486
  `}
445
487
  </Markup.ReactMarkupCode>
446
488
  </Markup.ReactMarkup>
@@ -462,6 +504,13 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
462
504
  default="/"
463
505
  description="Array of Radio options."
464
506
  />
507
+ <Prop
508
+ name="labelSide"
509
+ isRequired={false}
510
+ type="start | end"
511
+ default="end"
512
+ description="Position of label relative to the button."
513
+ />
465
514
  <Prop
466
515
  name="options label"
467
516
  isRequired={true}
@@ -484,18 +533,25 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
484
533
  description="Disables the Radio, preventing mouse events."
485
534
  />
486
535
  <Prop
487
- name="labelSide"
536
+ name="groupLabelledBy"
488
537
  isRequired={false}
489
- type="start | end"
490
- default="end"
491
- description="Position of label relative to the button."
538
+ type="string"
539
+ default="/"
540
+ description="Aria-labelledby for screen-reader support."
492
541
  />
493
542
  <Prop
494
- name="tabindex"
543
+ name="required"
495
544
  isRequired={false}
496
- type="number"
497
- default="/"
498
- description="Indicates an element can be focused on, and determines how that focus is handled."
545
+ type="boolean"
546
+ default="false"
547
+ description="Marks the radio group as required."
548
+ />
549
+ <Prop
550
+ name="orientation"
551
+ isRequired={false}
552
+ type="horizontal | vertical"
553
+ default="horizontal"
554
+ description="Orientation of the radio group."
499
555
  />
500
556
  <Prop
501
557
  name="groupLabelledBy"
@@ -504,6 +560,13 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
504
560
  default="/"
505
561
  description="Aria-labelledby for screen-reader support."
506
562
  />
563
+ <Prop
564
+ name="tabindex"
565
+ isRequired={false}
566
+ type="number"
567
+ default="/"
568
+ description="Indicates an element can be focused on, and determines how that focus is handled."
569
+ />
507
570
  </PropsList>
508
571
  <p className="docs-page__paragraph">RadioButtonGroup</p>
509
572
  <PropsList>
@@ -580,14 +643,14 @@ export default class RadioGroupDoc extends React.Component<{}, IState> {
580
643
  <Prop
581
644
  name="group grid"
582
645
  isRequired={false}
583
- type="bolean"
646
+ type="boolean"
584
647
  default="false"
585
648
  description="Lays out child elements in an uniform grid list."
586
649
  />
587
650
  <Prop
588
651
  name="group padded"
589
652
  isRequired={false}
590
- type="bolean"
653
+ type="boolean"
591
654
  default="false"
592
655
  description="Adds padding on the start and end (left and right) of the group."
593
656
  />
@@ -2,7 +2,7 @@
2
2
  <h2 class="docs-page__h2">Button Guidelines</h2>
3
3
  <p class="docs-page__paragraph docs-page__paragraph--large">Our design system uses three button types to create clear visual hierarchy: <strong>Primary</strong> for the most important action, <strong>Secondary</strong> for alternative actions, and <strong>Tertiary</strong> for low-priority or optional actions. Each type has distinct visual weight to guide users effectively through interfaces.</p>
4
4
 
5
- <h3 class="docs-page__h3">Primary Buttons</h3>
5
+ <h3 class="docs-page__h3 mt-5">Primary Buttons</h3>
6
6
  <p class="docs-page__paragraph mb-0 font-semibold">Purpose</p>
7
7
  <p class="docs-page__paragraph mt-0">Use for the most important action on a page or section. Primary buttons should guide users toward their main goal and stand out clearly from other elements.</p>
8
8
  <div class="docs-page__content-block d-flex flex-wrap gap-3">
@@ -85,7 +85,7 @@
85
85
  </figure>
86
86
  <figcaption class="docs-page__figure-caption">
87
87
  <p class="docs-page__caption-heading docs-page__caption-heading--do">Do.</p>
88
- <p class="docs-page__caption-text">Do use consistent spacing between buttons. The best approach is to use the <code>ButtonGroup</code> component, which automatically handles proper spacing and alignment. If you need custom layouts, use the <code>--gap-1</code> spacing variable instead of hardcoded values to maintain design system consistency.</p>
88
+ <p class="docs-page__caption-text">Use consistent spacing between buttons. The best approach is to use the <code>ButtonGroup</code> component, which automatically handles proper spacing and alignment. If you need custom layouts, use the <code>--gap-1</code> spacing variable instead of hardcoded values to maintain design system consistency.</p>
89
89
  </figcaption>
90
90
  </div>
91
91
  </div>
@@ -1,46 +1,55 @@
1
1
  <section class="docs-page__container">
2
- <h2 class="docs-page__h2">Checkbox &amp; Radio usage</h2>
3
- <p class="docs-page__paragraph">Same rules apply for checkboxes and radio buttons. Shown examples are mixed and apply to both.</p>
2
+ <h2 class="docs-page__h2">Checkbox & Radio Button Guidelines</h2>
3
+ <p class="docs-page__paragraph">
4
+ The same visual and layout rules apply to both checkboxes and radio buttons. Radio buttons must use the <code>RadioGroup</code> component, while checkboxes use the <code>Checkbox</code> component. When you have multiple checkboxes, use the <code>CheckGroup</code> component to organize them with consistent spacing and alignment.
5
+ </p>
4
6
  <div class="docs-page__content-block">
5
7
  <div class="docs-page__content-block-item">
6
8
  <figure class="docs-page__figure-media">
7
- <img src="/checkbox--do-01.png" alt="Checkbox - Do">
9
+ <img width="360" src="/checkbox--do-01.png" alt="Checkbox - Do">
8
10
  </figure>
9
11
  <figcaption class="docs-page__figure-caption">
10
12
  <p class="docs-page__caption-heading docs-page__caption-heading--do">Do.</p>
11
- <p class="docs-page__caption-text">List checkboxes or radio buttons in a vertical list with labels on the right side of the box.</p>
13
+ <p class="docs-page__caption-text">List checkboxes or radio buttons in a vertical list with labels on the right side of the box. Use <code>RadioGroup</code> for radio buttons (required for all radio button implementations) and wrap multiple <code>Checkbox</code> components in <code>CheckGroup</code> for consistent spacing and alignment.</p>
12
14
  </figcaption>
13
15
  </div>
14
16
  <div class="docs-page__content-block-item">
15
17
  <figure class="docs-page__figure-media">
16
- <img src="/radio--dont-02.png" alt="Checkbox - Don't">
18
+ <img width="360" src="/radio--dont-02.png" alt="Checkbox - Don't">
17
19
  </figure>
18
20
  <figcaption class="docs-page__figure-caption">
19
21
  <p class="docs-page__caption-heading docs-page__caption-heading--dont">Don't.</p>
20
- <p class="docs-page__caption-text">Don't separate checkboxes from labels in any way.</p>
22
+ <p class="docs-page__caption-text">Separate checkboxes or radio buttons from their labels in any way. While the components don't support this option by default, it might be possible with CSS overrides - don't do this. It breaks the visual connection and makes the interface harder to scan.</p>
21
23
  </figcaption>
22
24
  </div>
23
25
  </div>
24
26
  <div class="docs-page__content-block">
25
27
  <div class="docs-page__content-block-item">
26
28
  <figure class="docs-page__figure-media">
27
- <img src="/radio--dont-03.png" alt="Radio - Don't">
29
+ <img width="360" src="/radio--dont-03.png" alt="Radio - Don't">
28
30
  </figure>
29
31
  <figcaption class="docs-page__figure-caption">
30
32
  <p class="docs-page__caption-heading docs-page__caption-heading--dont">Don't.</p>
31
- <p class="docs-page__caption-text">Don't ever use labels on the left in a vertical list, it doesn't give a good visual overview of selected items to the user. Left side labels should be avoided in general, use them only in right-aligned text blocks.</p>
33
+ <p class="docs-page__caption-text">Use labels on the left in a vertical list - it doesn't give a good visual overview of selected items to the user. Left side labels should be avoided in general; use them only in right-aligned text blocks.</p>
32
34
  </figcaption>
33
35
  </div>
34
36
  <div class="docs-page__content-block-item">
35
37
  <figure class="docs-page__figure-media">
36
- <img src="/checkbox--dont-02.png" alt="Checkbox - Caution">
38
+ <img width="392" src="/checkbox--dont-02.png" alt="Checkbox - Caution">
37
39
  </figure>
38
40
  <figcaption class="docs-page__figure-caption">
39
41
  <p class="docs-page__caption-heading docs-page__caption-heading--caution">Caution.</p>
40
- <p class="docs-page__caption-text">It is OK to use horizontally aligned checkboxes and radio buttons in cases there are no more than 2-3 items and they fit in one line. In cases where the items occupy multiple lines use a vertical listing or consider using button-style checkboxes or radio buttons.</p>
42
+ <p class="docs-page__caption-text">It's acceptable to use horizontally aligned checkboxes and radio buttons when there are no more than 2-3 items and they fit on one line. When items would wrap to multiple lines, use vertical listing or consider using button-style alternatives.</p>
41
43
  </figcaption>
42
44
  </div>
43
45
  </div>
46
+
47
+ <h4 class="docs-page__h4 mt-5 mb-2">Component Usage</h4>
48
+ <ul class="docs-page__unordered-list mt-1 mb-5">
49
+ <li><strong>RadioGroup:</strong> Required for all radio button implementations - handles spacing, orientation, and group behavior automatically.</li>
50
+ <li><strong>Checkbox:</strong> Individual checkbox component for single or multiple checkbox implementations</li>
51
+ <li><strong>CheckGroup:</strong> Used to group multiple <code>Checkbox</code> components with consistent spacing and alignment</li>
52
+ </ul>
44
53
  <div class="docs-page__button-grid">
45
54
  <a class="docs-page__graphic-btn" href="#/components/checkbox" target="_blank">
46
55
  <figure class="docs-page__graphic-btn-graphic">