@sakaniui/react 0.8.7 → 0.8.8

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://www.sakaniui.com/manifest.schema.json",
3
- "schemaVersion": 1,
3
+ "schemaVersion": 2,
4
4
  "name": "@sakaniui/react",
5
- "version": "0.8.7",
5
+ "version": "0.8.8",
6
6
  "description": "Machine-readable contract of the SakaniUI React library, generated from its TypeScript source.",
7
7
  "docs": "https://www.sakaniui.com",
8
8
  "guide": "https://www.sakaniui.com/llms-full.txt",
@@ -24,13 +24,15 @@
24
24
  "@sakaniui/react/icons": "Tabler icons: IconName and IconNameFilled, one module each (5184 outline, 1054 filled)."
25
25
  },
26
26
  "conventions": {
27
+ "version": "This manifest describes @sakaniui/react@0.8.8. Each component has `since`, the first release that contained it: if the project has an older version installed, a component or prop that is newer than that does not exist there.",
27
28
  "acceptsNativeProps": "Components forward native HTML attributes (className, style, aria-*, event handlers) to their root element unless a prop says otherwise; only the props that are specific to SakaniUI are listed here.",
28
29
  "accessibleName": "When `contract.requiresAccessibleName` is true, a required prop (aria-label, aria-labelledby or an alt text) is the only thing that names the control or image. Do not omit it.",
29
30
  "tokens": "Use only the token names listed under `tokens`. Colour tokens follow the theme (the `.dark` class flips them); do not hard-code colours.",
30
- "icons": "Icon props take the component itself (IconSettings), not an element (<IconSettings />)."
31
+ "icons": "Icon props take the component itself (IconSettings), not an element (<IconSettings />).",
32
+ "literals": "Prop `values` keep their real type: a number is a number (columns: 2), a string is a string (\"md\")."
31
33
  },
32
34
  "tokens": {
33
- "count": 182,
35
+ "count": 231,
34
36
  "groups": {
35
37
  "bp": {
36
38
  "--bp-sm": "640px",
@@ -235,12 +237,68 @@
235
237
  "--transition-fast": "var(--motion-fast) var(--ease-in-out)",
236
238
  "--transition-slow": "var(--motion-slow) var(--ease-in-out)",
237
239
  "--transition-hover": "var(--motion-slow) var(--ease-out)"
240
+ },
241
+ "glass": {
242
+ "--glass-bg": "rgba(255, 255, 255, 0.64)",
243
+ "--glass-bg-overlay": "rgba(255, 255, 255, 0.76)",
244
+ "--glass-bg-chrome": "rgba(255, 255, 255, 0.52)",
245
+ "--glass-bg-subtle": "rgba(16, 15, 12, 0.05)",
246
+ "--glass-bg-subtle-hover": "rgba(16, 15, 12, 0.09)",
247
+ "--glass-border": "rgba(255, 255, 255, 0.55)",
248
+ "--glass-border-strong": "rgba(255, 255, 255, 0.75)",
249
+ "--glass-highlight": "inset 0 1px 0 0 rgba(255, 255, 255, 0.7)",
250
+ "--glass-fg-muted": "var(--color-neutral-600)",
251
+ "--glass-blur": "blur(16px) saturate(160%)",
252
+ "--glass-blur-overlay": "blur(24px) saturate(180%)"
253
+ },
254
+ "surface": {
255
+ "--surface-bg": "var(--color-bg-surface)",
256
+ "--surface-bg-overlay": "var(--color-bg-surface)",
257
+ "--surface-bg-chrome": "transparent",
258
+ "--surface-bg-subtle": "var(--color-bg-subtle)",
259
+ "--surface-bg-subtle-hover": "var(--color-bg-muted)",
260
+ "--surface-border": "var(--color-border-subtle)",
261
+ "--surface-border-strong": "var(--color-border-default)",
262
+ "--surface-highlight": "0 0 #0000",
263
+ "--surface-blur": "none",
264
+ "--surface-blur-overlay": "none",
265
+ "--surface-fg-muted": "var(--color-fg-muted)"
266
+ },
267
+ "liquid": {
268
+ "--liquid-tint-regular": "rgba(255, 255, 255, 0.66)",
269
+ "--liquid-tint-clear": "rgba(255, 255, 255, 0.28)",
270
+ "--liquid-tint-subtle": "rgba(16, 15, 12, 0.05)",
271
+ "--liquid-overlay-tint": "var(--liquid-tint-subtle)",
272
+ "--liquid-panel-tint": "rgba(255, 255, 255, 0.76)",
273
+ "--liquid-refraction-regular": "0.55",
274
+ "--liquid-refraction-clear": "0.8",
275
+ "--liquid-depth-regular": "16",
276
+ "--liquid-depth-clear": "20",
277
+ "--liquid-dispersion-regular": "0.3",
278
+ "--liquid-dispersion-clear": "0.4",
279
+ "--liquid-frost-regular": "4",
280
+ "--liquid-frost-clear": "1",
281
+ "--liquid-light-intensity-regular": "0.7",
282
+ "--liquid-light-intensity-clear": "0.8",
283
+ "--liquid-light-angle": "-45",
284
+ "--liquid-fallback-blur": "blur(14px) saturate(180%)",
285
+ "--liquid-lx": "sin(calc(var(--liquid-light-angle) * 1deg))",
286
+ "--liquid-ly": "calc(-1 * cos(calc(var(--liquid-light-angle) * 1deg)))",
287
+ "--liquid-rim": "rgba(255, 255, 255, 0.5)",
288
+ "--liquid-rim-soft": "rgba(255, 255, 255, 0.47)",
289
+ "--liquid-rim-far-soft": "rgba(255, 255, 255, 0.27)",
290
+ "--liquid-rim-far": "rgba(255, 255, 255, 0.25)",
291
+ "--liquid-edge-shade": "inset calc(var(--liquid-lx) * -4px) calc(var(--liquid-ly) * -4px) 8px 1px rgba(0, 0, 0, 0.1), inset calc(var(--liquid-lx) * 4px) calc(var(--liquid-ly) * 4px) 8px 1px rgba(255, 255, 255, 0.07)",
292
+ "--liquid-shadow-regular": "0 6px 12px -6px rgba(16, 15, 12, 0.16), 0 2px 4px rgba(16, 15, 12, 0.08)",
293
+ "--liquid-shadow-clear": "0 3px 8px -4px rgba(16, 15, 12, 0.16), 0 1px 3px rgba(16, 15, 12, 0.08)",
294
+ "--liquid-glare": "rgba(255, 255, 255, 0.35)"
238
295
  }
239
296
  }
240
297
  },
241
298
  "counts": {
242
- "components": 123,
243
- "blocks": 42
299
+ "components": 126,
300
+ "blocks": 42,
301
+ "utilities": 6
244
302
  },
245
303
  "components": [
246
304
  {
@@ -248,8 +306,7 @@
248
306
  "kind": "component",
249
307
  "category": "Composite",
250
308
  "import": "@sakaniui/react",
251
- "source": "src/components/Accordion/Accordion.tsx",
252
- "summary": "Collapsible content sections. Matches Figma \"Accordion Item\" set (Closed|Open) plus the \"Accordion\" wrapper component.",
309
+ "summary": "Collapsible content sections.",
253
310
  "props": [
254
311
  {
255
312
  "name": "className",
@@ -260,15 +317,15 @@
260
317
  "contract": {
261
318
  "requiredProps": [],
262
319
  "requiresAccessibleName": false
263
- }
320
+ },
321
+ "since": "0.1.0"
264
322
  },
265
323
  {
266
324
  "name": "AccordionItem",
267
325
  "kind": "component",
268
326
  "category": "Composite",
269
327
  "import": "@sakaniui/react",
270
- "source": "src/components/Accordion/Accordion.tsx",
271
- "summary": "Collapsible content sections. Matches Figma \"Accordion Item\" set (Closed|Open) plus the \"Accordion\" wrapper component.",
328
+ "summary": "One collapsible item of an Accordion; `open` / `defaultOpen` control it.",
272
329
  "props": [
273
330
  {
274
331
  "name": "title",
@@ -285,7 +342,7 @@
285
342
  "name": "defaultOpen",
286
343
  "type": "boolean",
287
344
  "required": false,
288
- "default": "false",
345
+ "default": false,
289
346
  "description": "Uncontrolled initial open state."
290
347
  },
291
348
  {
@@ -299,15 +356,15 @@
299
356
  "title"
300
357
  ],
301
358
  "requiresAccessibleName": false
302
- }
359
+ },
360
+ "since": "0.1.0"
303
361
  },
304
362
  {
305
363
  "name": "ActivityFeed",
306
364
  "kind": "component",
307
365
  "category": "Application",
308
366
  "import": "@sakaniui/react",
309
- "source": "src/components/ApplicationComponents/ActivityFeed/ActivityFeed.tsx",
310
- "summary": "Timeline of recent activity. Matches Figma \"Activity Feed\": Style: Default — icon-in-circle rail with a connector stub between dots, content wraps onto multiple lines if long.",
367
+ "summary": "Timeline of recent activity.",
311
368
  "props": [
312
369
  {
313
370
  "name": "items",
@@ -335,28 +392,28 @@
335
392
  "items"
336
393
  ],
337
394
  "requiresAccessibleName": false
338
- }
395
+ },
396
+ "since": "0.1.0"
339
397
  },
340
398
  {
341
399
  "name": "ActivityFeedHighlight",
342
400
  "kind": "component",
343
401
  "category": "Application",
344
402
  "import": "@sakaniui/react",
345
- "source": "src/components/ApplicationComponents/ActivityFeed/ActivityFeed.tsx",
346
- "summary": "Timeline of recent activity. Matches Figma \"Activity Feed\": Style: Default — icon-in-circle rail with a connector stub between dots, content wraps onto multiple lines if long.",
403
+ "summary": "Emphasised inline text (a name, a file, a page) inside an ActivityFeed item description.",
347
404
  "props": [],
348
405
  "contract": {
349
406
  "requiredProps": [],
350
407
  "requiresAccessibleName": false
351
- }
408
+ },
409
+ "since": "0.1.0"
352
410
  },
353
411
  {
354
412
  "name": "Alert",
355
413
  "kind": "component",
356
414
  "category": "Composite",
357
415
  "import": "@sakaniui/react",
358
- "source": "src/components/Alert/Alert.tsx",
359
- "summary": "Inline status message. Matches Figma \"Alert\" set: Color (Info|Success|Warning|Danger|Neutral), Title/Description toggles.",
416
+ "summary": "Inline status message.",
360
417
  "props": [
361
418
  {
362
419
  "name": "color",
@@ -369,8 +426,7 @@
369
426
  "danger",
370
427
  "neutral"
371
428
  ],
372
- "default": "info",
373
- "description": "Figma Color axis. Defaults to \"info\"."
429
+ "default": "info"
374
430
  },
375
431
  {
376
432
  "name": "title",
@@ -397,14 +453,14 @@
397
453
  "contract": {
398
454
  "requiredProps": [],
399
455
  "requiresAccessibleName": false
400
- }
456
+ },
457
+ "since": "0.1.0"
401
458
  },
402
459
  {
403
460
  "name": "Announcement",
404
461
  "kind": "component",
405
462
  "category": "Application",
406
463
  "import": "@sakaniui/react",
407
- "source": "src/components/ApplicationComponents/Announcement/Announcement.tsx",
408
464
  "summary": "Full-width announcement bar.",
409
465
  "props": [
410
466
  {
@@ -455,15 +511,15 @@
455
511
  "message"
456
512
  ],
457
513
  "requiresAccessibleName": false
458
- }
514
+ },
515
+ "since": "0.1.0"
459
516
  },
460
517
  {
461
518
  "name": "AreaChart",
462
519
  "kind": "component",
463
520
  "category": "Charts",
464
521
  "import": "@sakaniui/react",
465
- "source": "src/components/AreaChart/AreaChart.tsx",
466
- "summary": "Recharts wrapper styled with Sakani chart tokens. Matches Figma \"Area Chart\" (type: Default | Stacked | Step | Linear, each with an optional second series).",
522
+ "summary": "An area chart (Recharts) styled with Sakani chart tokens; `variant` is \"default\", \"stacked\", \"step\" or \"linear\".",
467
523
  "props": [
468
524
  {
469
525
  "name": "data",
@@ -517,14 +573,14 @@
517
573
  "data"
518
574
  ],
519
575
  "requiresAccessibleName": false
520
- }
576
+ },
577
+ "since": "0.1.0"
521
578
  },
522
579
  {
523
580
  "name": "Avatar",
524
581
  "kind": "component",
525
582
  "category": "Core",
526
583
  "import": "@sakaniui/react",
527
- "source": "src/components/Avatar/Avatar.tsx",
528
584
  "summary": "User/entity avatar.",
529
585
  "props": [
530
586
  {
@@ -537,8 +593,7 @@
537
593
  "lg",
538
594
  "xl"
539
595
  ],
540
- "default": "md",
541
- "description": "Figma AV axis. Defaults to \"md\"."
596
+ "default": "md"
542
597
  },
543
598
  {
544
599
  "name": "src",
@@ -574,15 +629,15 @@
574
629
  "contract": {
575
630
  "requiredProps": [],
576
631
  "requiresAccessibleName": false
577
- }
632
+ },
633
+ "since": "0.1.0"
578
634
  },
579
635
  {
580
636
  "name": "AvatarGroup",
581
637
  "kind": "component",
582
638
  "category": "Core",
583
639
  "import": "@sakaniui/react",
584
- "source": "src/components/AvatarGroup/AvatarGroup.tsx",
585
- "summary": "Overlapping stack of avatars with an optional \"+N\" overflow chip. Figma \"Avatar Group\" is a single composed component; this renders a flexible group from Avatar children with a ring gap so they read as a stack.",
640
+ "summary": "Overlapping stack of avatars with an optional \"+N\" overflow chip.",
586
641
  "props": [
587
642
  {
588
643
  "name": "size",
@@ -601,7 +656,7 @@
601
656
  "name": "max",
602
657
  "type": "number",
603
658
  "required": false,
604
- "default": "4",
659
+ "default": 4,
605
660
  "description": "Max avatars to show before collapsing into a +N chip."
606
661
  },
607
662
  {
@@ -621,15 +676,15 @@
621
676
  "avatars"
622
677
  ],
623
678
  "requiresAccessibleName": false
624
- }
679
+ },
680
+ "since": "0.1.0"
625
681
  },
626
682
  {
627
683
  "name": "AvatarUpload",
628
684
  "kind": "component",
629
685
  "category": "Application",
630
686
  "import": "@sakaniui/react",
631
- "source": "src/components/ApplicationComponents/AvatarUpload/AvatarUpload.tsx",
632
- "summary": "Profile photo picker. Matches Figma \"Avatar Upload\": Orientation: Vertical — big (64px) avatar with a camera badge overlapping its bottom-right corner, text or a \"Change photo\" link below.",
687
+ "summary": "Profile photo picker.",
633
688
  "props": [
634
689
  {
635
690
  "name": "src",
@@ -692,14 +747,14 @@
692
747
  "contract": {
693
748
  "requiredProps": [],
694
749
  "requiresAccessibleName": false
695
- }
750
+ },
751
+ "since": "0.1.0"
696
752
  },
697
753
  {
698
754
  "name": "Badge",
699
755
  "kind": "component",
700
756
  "category": "Core",
701
757
  "import": "@sakaniui/react",
702
- "source": "src/components/Badge/Badge.tsx",
703
758
  "summary": "Compact label for status, category, or count.",
704
759
  "props": [
705
760
  {
@@ -715,7 +770,7 @@
715
770
  "accent"
716
771
  ],
717
772
  "default": "neutral",
718
- "description": "Color scheme. Maps to Figma BD axis. Defaults to \"neutral\"."
773
+ "description": "Color scheme. Defaults to \"neutral\"."
719
774
  },
720
775
  {
721
776
  "name": "emphasis",
@@ -726,7 +781,7 @@
726
781
  "solid"
727
782
  ],
728
783
  "default": "subtle",
729
- "description": "Fill strength. Maps to Figma Emphasis axis. Defaults to \"subtle\"."
784
+ "description": "Fill strength. Defaults to \"subtle\"."
730
785
  },
731
786
  {
732
787
  "name": "leftIcon",
@@ -747,14 +802,14 @@
747
802
  "contract": {
748
803
  "requiredProps": [],
749
804
  "requiresAccessibleName": false
750
- }
805
+ },
806
+ "since": "0.1.0"
751
807
  },
752
808
  {
753
809
  "name": "Balance",
754
810
  "kind": "component",
755
811
  "category": "Application",
756
812
  "import": "@sakaniui/react",
757
- "source": "src/components/ApplicationComponents/Balance/Balance.tsx",
758
813
  "summary": "Prominent balance display.",
759
814
  "props": [
760
815
  {
@@ -801,15 +856,15 @@
801
856
  "value"
802
857
  ],
803
858
  "requiresAccessibleName": false
804
- }
859
+ },
860
+ "since": "0.1.0"
805
861
  },
806
862
  {
807
863
  "name": "BarChart",
808
864
  "kind": "component",
809
865
  "category": "Charts",
810
866
  "import": "@sakaniui/react",
811
- "source": "src/components/BarChart/BarChart.tsx",
812
- "summary": "Recharts wrapper styled with Sakani chart tokens.",
867
+ "summary": "A bar chart (Recharts) styled with Sakani chart tokens; `variant` is \"default\", \"horizontal\", \"stacked\", \"active\", \"multiple\" or \"negative\".",
813
868
  "props": [
814
869
  {
815
870
  "name": "data",
@@ -860,15 +915,15 @@
860
915
  "data"
861
916
  ],
862
917
  "requiresAccessibleName": false
863
- }
918
+ },
919
+ "since": "0.1.0"
864
920
  },
865
921
  {
866
922
  "name": "BlogBlockquote",
867
923
  "kind": "component",
868
924
  "category": "Marketing",
869
925
  "import": "@sakaniui/react",
870
- "source": "src/components/MarketingComponents/BlogBlockquote/BlogBlockquote.tsx",
871
- "summary": "Matches Figma \"Blog Blockquote\" (Marketing primitives set, first of the category): a left vertical Divider rail + quote text.",
926
+ "summary": "A blog pull quote: a vertical rail beside the quote text. Passing `author` switches to the attributed card style.",
872
927
  "props": [
873
928
  {
874
929
  "name": "quote",
@@ -892,15 +947,15 @@
892
947
  "quote"
893
948
  ],
894
949
  "requiresAccessibleName": false
895
- }
950
+ },
951
+ "since": "0.3.0"
896
952
  },
897
953
  {
898
954
  "name": "BlogFeatureText",
899
955
  "kind": "component",
900
956
  "category": "Marketing",
901
957
  "import": "@sakaniui/react",
902
- "source": "src/components/MarketingComponents/BlogFeatureText/BlogFeatureText.tsx",
903
- "summary": "Matches Figma \"Blog Feature Text\" (Marketing primitives set): a brand-colored accent rule + a pulled-out heading/md line of body copy.",
958
+ "summary": "A pulled-out line of blog body copy beside a brand-coloured accent rule; `align` is \"left\" (vertical rule) or \"top\".",
904
959
  "props": [
905
960
  {
906
961
  "name": "text",
@@ -915,8 +970,7 @@
915
970
  "left",
916
971
  "top"
917
972
  ],
918
- "default": "left",
919
- "description": "Figma Align axis. Defaults to \"left\"."
973
+ "default": "left"
920
974
  },
921
975
  {
922
976
  "name": "className",
@@ -929,15 +983,15 @@
929
983
  "text"
930
984
  ],
931
985
  "requiresAccessibleName": false
932
- }
986
+ },
987
+ "since": "0.3.0"
933
988
  },
934
989
  {
935
990
  "name": "BlogImage",
936
991
  "kind": "component",
937
992
  "category": "Marketing",
938
993
  "import": "@sakaniui/react",
939
- "source": "src/components/MarketingComponents/BlogImage/BlogImage.tsx",
940
- "summary": "Matches Figma \"Blog Image\" (Marketing primitives set, 4 previews: Style (Default/With Caption) x Size (Large/Small)).",
994
+ "summary": "A blog article image with an optional caption (shown when `caption` is set); `size` is \"large\" or \"small\".",
941
995
  "props": [
942
996
  {
943
997
  "name": "src",
@@ -958,8 +1012,7 @@
958
1012
  "large",
959
1013
  "small"
960
1014
  ],
961
- "default": "large",
962
- "description": "Figma Size axis. Defaults to \"large\"."
1015
+ "default": "large"
963
1016
  },
964
1017
  {
965
1018
  "name": "caption",
@@ -978,15 +1031,15 @@
978
1031
  "src"
979
1032
  ],
980
1033
  "requiresAccessibleName": false
981
- }
1034
+ },
1035
+ "since": "0.3.0"
982
1036
  },
983
1037
  {
984
1038
  "name": "BlogListingCard",
985
1039
  "kind": "component",
986
1040
  "category": "Marketing",
987
1041
  "import": "@sakaniui/react",
988
- "source": "src/components/MarketingComponents/BlogListingCard/BlogListingCard.tsx",
989
- "summary": "Matches Figma \"Blog Listing Card\" (Marketing primitives set, 2 style previews: Default, Horizontal).",
1042
+ "summary": "A blog post card with image, category, read time, title, excerpt and author. `layout` is \"default\" (image on top) or \"horizontal\" (square image on the left).",
990
1043
  "props": [
991
1044
  {
992
1045
  "name": "image",
@@ -1032,8 +1085,7 @@
1032
1085
  "default",
1033
1086
  "horizontal"
1034
1087
  ],
1035
- "default": "default",
1036
- "description": "Figma Style axis. Defaults to \"default\"."
1088
+ "default": "default"
1037
1089
  },
1038
1090
  {
1039
1091
  "name": "className",
@@ -1051,15 +1103,15 @@
1051
1103
  "author"
1052
1104
  ],
1053
1105
  "requiresAccessibleName": false
1054
- }
1106
+ },
1107
+ "since": "0.3.0"
1055
1108
  },
1056
1109
  {
1057
1110
  "name": "BlogListingFeaturedCard",
1058
1111
  "kind": "component",
1059
1112
  "category": "Marketing",
1060
1113
  "import": "@sakaniui/react",
1061
- "source": "src/components/MarketingComponents/BlogListingFeaturedCard/BlogListingFeaturedCard.tsx",
1062
- "summary": "Matches Figma \"Blog Listing Featured Card\" (Marketing primitives set, 2 orientations: Horizontal, Vertical).",
1114
+ "summary": "A featured blog post card with image, optional badge, title, excerpt, author and a call to action; `orientation` is \"vertical\" or \"horizontal\".",
1063
1115
  "props": [
1064
1116
  {
1065
1117
  "name": "image",
@@ -1075,8 +1127,7 @@
1075
1127
  "name": "badgeLabel",
1076
1128
  "type": "string",
1077
1129
  "required": false,
1078
- "default": "Featured",
1079
- "description": "Defaults to \"Featured\", matching this card's own purpose."
1130
+ "default": "Featured"
1080
1131
  },
1081
1132
  {
1082
1133
  "name": "title",
@@ -1112,8 +1163,7 @@
1112
1163
  "vertical",
1113
1164
  "horizontal"
1114
1165
  ],
1115
- "default": "horizontal",
1116
- "description": "Figma Orientation axis. Defaults to \"horizontal\"."
1166
+ "default": "horizontal"
1117
1167
  },
1118
1168
  {
1119
1169
  "name": "className",
@@ -1129,14 +1179,14 @@
1129
1179
  "author"
1130
1180
  ],
1131
1181
  "requiresAccessibleName": false
1132
- }
1182
+ },
1183
+ "since": "0.3.0"
1133
1184
  },
1134
1185
  {
1135
1186
  "name": "BoardCard",
1136
1187
  "kind": "component",
1137
1188
  "category": "Composite",
1138
1189
  "import": "@sakaniui/react",
1139
- "source": "src/components/BoardCard/BoardCard.tsx",
1140
1190
  "summary": "Flexible board/list card.",
1141
1191
  "props": [
1142
1192
  {
@@ -1226,14 +1276,14 @@
1226
1276
  "title"
1227
1277
  ],
1228
1278
  "requiresAccessibleName": false
1229
- }
1279
+ },
1280
+ "since": "0.1.0"
1230
1281
  },
1231
1282
  {
1232
1283
  "name": "BoardColumn",
1233
1284
  "kind": "component",
1234
1285
  "category": "Composite",
1235
1286
  "import": "@sakaniui/react",
1236
- "source": "src/components/BoardColumn/BoardColumn.tsx",
1237
1287
  "summary": "One Kanban column.",
1238
1288
  "props": [
1239
1289
  {
@@ -1292,15 +1342,15 @@
1292
1342
  "title"
1293
1343
  ],
1294
1344
  "requiresAccessibleName": false
1295
- }
1345
+ },
1346
+ "since": "0.1.0"
1296
1347
  },
1297
1348
  {
1298
1349
  "name": "Breadcrumb",
1299
1350
  "kind": "component",
1300
1351
  "category": "Composite",
1301
1352
  "import": "@sakaniui/react",
1302
- "source": "src/components/Breadcrumb/Breadcrumb.tsx",
1303
- "summary": "Navigation trail. Matches Figma \"Breadcrumb\" set (1–6 crumbs) x Type: Text — plain inline links, gap 6, chevron 16px. crumbs fg/muted, current crumb fg/default + medium, underline on link hover.",
1353
+ "summary": "A navigation trail of one to six crumbs; `variant` is \"text\" (inline links) or \"button\".",
1304
1354
  "props": [
1305
1355
  {
1306
1356
  "name": "items",
@@ -1328,15 +1378,15 @@
1328
1378
  "items"
1329
1379
  ],
1330
1380
  "requiresAccessibleName": false
1331
- }
1381
+ },
1382
+ "since": "0.1.0"
1332
1383
  },
1333
1384
  {
1334
1385
  "name": "Button",
1335
1386
  "kind": "component",
1336
1387
  "category": "Core",
1337
1388
  "import": "@sakaniui/react",
1338
- "source": "src/components/Button/Button.tsx",
1339
- "summary": "The primary action primitive for the SakaniUI. Maps 1:1 with the Figma \"Button\" component set (45 variants).",
1389
+ "summary": "The primary action primitive for the SakaniUI.",
1340
1390
  "props": [
1341
1391
  {
1342
1392
  "name": "variant",
@@ -1380,7 +1430,7 @@
1380
1430
  "name": "loading",
1381
1431
  "type": "boolean",
1382
1432
  "required": false,
1383
- "default": "false",
1433
+ "default": false,
1384
1434
  "description": "Render the button in a loading state (disables interaction)."
1385
1435
  },
1386
1436
  {
@@ -1395,14 +1445,14 @@
1395
1445
  "children"
1396
1446
  ],
1397
1447
  "requiresAccessibleName": false
1398
- }
1448
+ },
1449
+ "since": "0.1.0"
1399
1450
  },
1400
1451
  {
1401
1452
  "name": "Calendar",
1402
1453
  "kind": "component",
1403
1454
  "category": "Composite",
1404
1455
  "import": "@sakaniui/react",
1405
- "source": "src/components/Calendar/Calendar.tsx",
1406
1456
  "summary": "Month calendar / date picker.",
1407
1457
  "props": [
1408
1458
  {
@@ -1446,8 +1496,7 @@
1446
1496
  "arrows",
1447
1497
  "dropdowns"
1448
1498
  ],
1449
- "default": "arrows",
1450
- "description": "Header style (Figma: Calendar Header Type). Defaults to \"arrows\"."
1499
+ "default": "arrows"
1451
1500
  },
1452
1501
  {
1453
1502
  "name": "defaultMonth",
@@ -1474,15 +1523,15 @@
1474
1523
  "contract": {
1475
1524
  "requiredProps": [],
1476
1525
  "requiresAccessibleName": false
1477
- }
1526
+ },
1527
+ "since": "0.1.0"
1478
1528
  },
1479
1529
  {
1480
1530
  "name": "Card",
1481
1531
  "kind": "component",
1482
1532
  "category": "Composite",
1483
1533
  "import": "@sakaniui/react",
1484
- "source": "src/components/Card/Card.tsx",
1485
- "summary": "Container surface. Matches Figma \"Card\" set: Variant (Default|Hover|Two buttons|Three buttons), Title/Description/CTA toggles.",
1534
+ "summary": "Container surface.",
1486
1535
  "props": [
1487
1536
  {
1488
1537
  "name": "title",
@@ -1498,19 +1547,17 @@
1498
1547
  "name": "actions",
1499
1548
  "type": "ReactNode",
1500
1549
  "required": false,
1501
- "description": "Footer action buttons (maps to Figma CTA / Two buttons variants). Hugs left."
1550
+ "description": "Hugs left."
1502
1551
  },
1503
1552
  {
1504
1553
  "name": "leadingAction",
1505
1554
  "type": "ReactNode",
1506
- "required": false,
1507
- "description": "A standalone action opposite `actions` (maps to Figma's Three buttons Ghost button) -- providing it switches the footer to space-between."
1555
+ "required": false
1508
1556
  },
1509
1557
  {
1510
1558
  "name": "interactive",
1511
1559
  "type": "boolean",
1512
- "required": false,
1513
- "description": "Enables the hover elevation (Figma: Hover)."
1560
+ "required": false
1514
1561
  },
1515
1562
  {
1516
1563
  "name": "className",
@@ -1521,15 +1568,15 @@
1521
1568
  "contract": {
1522
1569
  "requiredProps": [],
1523
1570
  "requiresAccessibleName": false
1524
- }
1571
+ },
1572
+ "since": "0.1.0"
1525
1573
  },
1526
1574
  {
1527
1575
  "name": "CardMetaItem",
1528
1576
  "kind": "component",
1529
1577
  "category": "Composite",
1530
1578
  "import": "@sakaniui/react",
1531
- "source": "src/components/CardMetaItem/CardMetaItem.tsx",
1532
- "summary": "Icon + value pair used in the BoardCard footer (due date, comments, attachments, links, subtask progress). Matches the Figma \"Card Meta Item\" component, whose `icon` (instance-swap) and `label` (text) map to these props.",
1579
+ "summary": "Icon + value pair used in the BoardCard footer (due date, comments, attachments, links, subtask progress).",
1533
1580
  "props": [
1534
1581
  {
1535
1582
  "name": "icon",
@@ -1548,15 +1595,15 @@
1548
1595
  "icon"
1549
1596
  ],
1550
1597
  "requiresAccessibleName": false
1551
- }
1598
+ },
1599
+ "since": "0.1.0"
1552
1600
  },
1553
1601
  {
1554
1602
  "name": "CartItem",
1555
1603
  "kind": "component",
1556
1604
  "category": "E-commerce",
1557
1605
  "import": "@sakaniui/react",
1558
- "source": "src/components/ECommerceComponents/CartItem/CartItem.tsx",
1559
- "summary": "Matches Figma \"Cart Item\" (E-commerce set): thumbnail + name/variant/ quantity stepper -> price + remove button, right-aligned.",
1606
+ "summary": "A cart row: thumbnail, name and variant, quantity stepper, price and a remove button. Passing `compareAtPrice` shows the sale treatment.",
1560
1607
  "props": [
1561
1608
  {
1562
1609
  "name": "image",
@@ -1604,7 +1651,7 @@
1604
1651
  "name": "minQuantity",
1605
1652
  "type": "number",
1606
1653
  "required": false,
1607
- "default": "1"
1654
+ "default": 1
1608
1655
  },
1609
1656
  {
1610
1657
  "name": "maxQuantity",
@@ -1625,8 +1672,7 @@
1625
1672
  {
1626
1673
  "name": "formatPrice",
1627
1674
  "type": "((amount: number) => string)",
1628
- "required": false,
1629
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
1675
+ "required": false
1630
1676
  },
1631
1677
  {
1632
1678
  "name": "className",
@@ -1642,15 +1688,15 @@
1642
1688
  "quantity"
1643
1689
  ],
1644
1690
  "requiresAccessibleName": false
1645
- }
1691
+ },
1692
+ "since": "0.3.0"
1646
1693
  },
1647
1694
  {
1648
1695
  "name": "ChatComposer",
1649
1696
  "kind": "component",
1650
1697
  "category": "Chat",
1651
1698
  "import": "@sakaniui/react",
1652
- "source": "src/components/ChatComposer/ChatComposer-simple.tsx",
1653
- "summary": "",
1699
+ "summary": "Message input for a chat thread: attach, text input, emoji and send, with default, typing, uploading and disabled states.",
1654
1700
  "props": [
1655
1701
  {
1656
1702
  "name": "state",
@@ -1694,7 +1740,7 @@
1694
1740
  "name": "uploadProgress",
1695
1741
  "type": "number",
1696
1742
  "required": false,
1697
- "default": "0"
1743
+ "default": 0
1698
1744
  },
1699
1745
  {
1700
1746
  "name": "onCancelUpload",
@@ -1710,15 +1756,15 @@
1710
1756
  "contract": {
1711
1757
  "requiredProps": [],
1712
1758
  "requiresAccessibleName": false
1713
- }
1759
+ },
1760
+ "since": "0.1.0"
1714
1761
  },
1715
1762
  {
1716
1763
  "name": "Checkbox",
1717
1764
  "kind": "component",
1718
1765
  "category": "Forms",
1719
1766
  "import": "@sakaniui/react",
1720
- "source": "src/components/Checkbox/Checkbox.tsx",
1721
- "summary": "Matches Figma \"Checkbox\" set: Unchecked | Checked | Indeterminate | Disabled, with Title/Description toggles (label + description props).",
1767
+ "summary": "Checkbox with optional label and description; supports checked, indeterminate and disabled states.",
1722
1768
  "props": [
1723
1769
  {
1724
1770
  "name": "label",
@@ -1740,15 +1786,15 @@
1740
1786
  "contract": {
1741
1787
  "requiredProps": [],
1742
1788
  "requiresAccessibleName": false
1743
- }
1789
+ },
1790
+ "since": "0.1.0"
1744
1791
  },
1745
1792
  {
1746
1793
  "name": "CheckoutSteps",
1747
1794
  "kind": "component",
1748
1795
  "category": "E-commerce",
1749
1796
  "import": "@sakaniui/react",
1750
- "source": "src/components/ECommerceComponents/CheckoutSteps/CheckoutSteps.tsx",
1751
- "summary": "Matches Figma \"Checkout Steps\" (E-commerce set): a fixed-width horizontal breadcrumb of 24px circles joined by fixed 32px connector lines -- Cart / Shipping / Payment / Confirmation by default.",
1797
+ "summary": "A horizontal checkout breadcrumb of numbered steps (Cart, Shipping, Payment, Confirmation by default). `currentStep` marks earlier steps completed and later ones upcoming.",
1752
1798
  "props": [
1753
1799
  {
1754
1800
  "name": "steps",
@@ -1773,14 +1819,14 @@
1773
1819
  "currentStep"
1774
1820
  ],
1775
1821
  "requiresAccessibleName": false
1776
- }
1822
+ },
1823
+ "since": "0.3.0"
1777
1824
  },
1778
1825
  {
1779
1826
  "name": "CodeSnippet",
1780
1827
  "kind": "component",
1781
1828
  "category": "Application",
1782
1829
  "import": "@sakaniui/react",
1783
- "source": "src/components/ApplicationComponents/CodeSnippet/CodeSnippet.tsx",
1784
1830
  "summary": "Code block.",
1785
1831
  "props": [
1786
1832
  {
@@ -1803,7 +1849,7 @@
1803
1849
  "name": "editable",
1804
1850
  "type": "boolean",
1805
1851
  "required": false,
1806
- "default": "false",
1852
+ "default": false,
1807
1853
  "description": "Lets people type directly into the block. Defaults to false (read-only)."
1808
1854
  },
1809
1855
  {
@@ -1829,15 +1875,15 @@
1829
1875
  "code"
1830
1876
  ],
1831
1877
  "requiresAccessibleName": false
1832
- }
1878
+ },
1879
+ "since": "0.1.0"
1833
1880
  },
1834
1881
  {
1835
1882
  "name": "ColorSwatch",
1836
1883
  "kind": "component",
1837
1884
  "category": "E-commerce",
1838
1885
  "import": "@sakaniui/react",
1839
- "source": "src/components/ECommerceComponents/ColorSwatch/ColorSwatch.tsx",
1840
- "summary": "Matches Figma \"Color Swatch\" (E-commerce set): a 24px filled circle in a 32px hit target.",
1886
+ "summary": "A round colour choice for product variants. `selected` marks the chosen one; `available={false}` marks it out of stock.",
1841
1887
  "props": [
1842
1888
  {
1843
1889
  "name": "color",
@@ -1855,13 +1901,13 @@
1855
1901
  "name": "selected",
1856
1902
  "type": "boolean",
1857
1903
  "required": false,
1858
- "default": "false"
1904
+ "default": false
1859
1905
  },
1860
1906
  {
1861
1907
  "name": "available",
1862
1908
  "type": "boolean",
1863
1909
  "required": false,
1864
- "default": "true",
1910
+ "default": true,
1865
1911
  "description": "Defaults to true. False renders a disabled, unclickable swatch."
1866
1912
  },
1867
1913
  {
@@ -1881,14 +1927,14 @@
1881
1927
  "label"
1882
1928
  ],
1883
1929
  "requiresAccessibleName": false
1884
- }
1930
+ },
1931
+ "since": "0.3.0"
1885
1932
  },
1886
1933
  {
1887
1934
  "name": "Combobox",
1888
1935
  "kind": "component",
1889
1936
  "category": "Composite",
1890
1937
  "import": "@sakaniui/react",
1891
- "source": "src/components/Combobox/Combobox.tsx",
1892
1938
  "summary": "Searchable select with single or multi-select.",
1893
1939
  "props": [
1894
1940
  {
@@ -1946,8 +1992,7 @@
1946
1992
  {
1947
1993
  "name": "loading",
1948
1994
  "type": "boolean",
1949
- "required": false,
1950
- "description": "Shows the panel's loading state (Figma: Panel State=Loading)."
1995
+ "required": false
1951
1996
  },
1952
1997
  {
1953
1998
  "name": "value",
@@ -1971,14 +2016,14 @@
1971
2016
  "options"
1972
2017
  ],
1973
2018
  "requiresAccessibleName": false
1974
- }
2019
+ },
2020
+ "since": "0.1.0"
1975
2021
  },
1976
2022
  {
1977
2023
  "name": "ConversationItem",
1978
2024
  "kind": "component",
1979
2025
  "category": "Chat",
1980
2026
  "import": "@sakaniui/react",
1981
- "source": "src/components/ConversationItem/ConversationItem.tsx",
1982
2027
  "summary": "One row in a chat conversation list.",
1983
2028
  "props": [
1984
2029
  {
@@ -2040,14 +2085,14 @@
2040
2085
  "name"
2041
2086
  ],
2042
2087
  "requiresAccessibleName": false
2043
- }
2088
+ },
2089
+ "since": "0.1.0"
2044
2090
  },
2045
2091
  {
2046
2092
  "name": "Divider",
2047
2093
  "kind": "component",
2048
2094
  "category": "Core",
2049
2095
  "import": "@sakaniui/react",
2050
- "source": "src/components/Divider/Divider.tsx",
2051
2096
  "summary": "Visual separator. Horizontal (default) or vertical. Optional label sits centred in the line — common for \"or\" dividers in auth forms.",
2052
2097
  "props": [
2053
2098
  {
@@ -2076,15 +2121,15 @@
2076
2121
  "contract": {
2077
2122
  "requiredProps": [],
2078
2123
  "requiresAccessibleName": false
2079
- }
2124
+ },
2125
+ "since": "0.1.0"
2080
2126
  },
2081
2127
  {
2082
2128
  "name": "DonutChart",
2083
2129
  "kind": "component",
2084
2130
  "category": "Charts",
2085
2131
  "import": "@sakaniui/react",
2086
- "source": "src/components/DonutChart/DonutChart.tsx",
2087
- "summary": "Recharts wrapper styled with Sakani chart tokens. Matches Figma \"Donut Chart\" (Size sm|md|lg|xl, with center value + caption). Segments cycle through the 5 chart tokens so they re-theme in dark mode.",
2132
+ "summary": "A donut chart (Recharts) styled with Sakani chart tokens, with an optional centre value and caption.",
2088
2133
  "props": [
2089
2134
  {
2090
2135
  "name": "data",
@@ -2106,14 +2151,12 @@
2106
2151
  {
2107
2152
  "name": "centerValue",
2108
2153
  "type": "string",
2109
- "required": false,
2110
- "description": "Big number shown in the center (Figma: value)."
2154
+ "required": false
2111
2155
  },
2112
2156
  {
2113
2157
  "name": "centerCaption",
2114
2158
  "type": "string",
2115
- "required": false,
2116
- "description": "Small caption under the center value (Figma: caption)."
2159
+ "required": false
2117
2160
  },
2118
2161
  {
2119
2162
  "name": "height",
@@ -2132,14 +2175,14 @@
2132
2175
  "data"
2133
2176
  ],
2134
2177
  "requiresAccessibleName": false
2135
- }
2178
+ },
2179
+ "since": "0.1.0"
2136
2180
  },
2137
2181
  {
2138
2182
  "name": "EmptyState",
2139
2183
  "kind": "component",
2140
2184
  "category": "Data",
2141
2185
  "import": "@sakaniui/react",
2142
- "source": "src/components/EmptyState/EmptyState.tsx",
2143
2186
  "summary": "Reusable empty/error content for tables, lists, and cards.",
2144
2187
  "props": [
2145
2188
  {
@@ -2189,14 +2232,14 @@
2189
2232
  "contract": {
2190
2233
  "requiredProps": [],
2191
2234
  "requiresAccessibleName": false
2192
- }
2235
+ },
2236
+ "since": "0.1.0"
2193
2237
  },
2194
2238
  {
2195
2239
  "name": "Expenses",
2196
2240
  "kind": "component",
2197
2241
  "category": "Application",
2198
2242
  "import": "@sakaniui/react",
2199
- "source": "src/components/ApplicationComponents/Expenses/Expenses.tsx",
2200
2243
  "summary": "Spending-by-category list.",
2201
2244
  "props": [
2202
2245
  {
@@ -2218,7 +2261,6 @@
2218
2261
  "name": "formatAmount",
2219
2262
  "type": "((amount: number) => string)",
2220
2263
  "required": false,
2221
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })",
2222
2264
  "description": "Defaults to USD currency, 2 decimals (e.g. \"$840.20\")."
2223
2265
  },
2224
2266
  {
@@ -2232,35 +2274,35 @@
2232
2274
  "categories"
2233
2275
  ],
2234
2276
  "requiresAccessibleName": false
2235
- }
2277
+ },
2278
+ "since": "0.1.0"
2236
2279
  },
2237
2280
  {
2238
2281
  "name": "FacebookIcon",
2239
2282
  "kind": "component",
2240
2283
  "category": "Marketing",
2241
2284
  "import": "@sakaniui/react",
2242
- "source": "src/components/MarketingComponents/TeamCard/TeamSocialIcons.tsx",
2243
- "summary": "tsx).",
2285
+ "summary": "Facebook glyph drawn in currentColor, for the `socialLinks` of TeamCard.",
2244
2286
  "props": [
2245
2287
  {
2246
2288
  "name": "size",
2247
2289
  "type": "number",
2248
2290
  "required": false,
2249
- "default": "16"
2291
+ "default": 16
2250
2292
  }
2251
2293
  ],
2252
2294
  "contract": {
2253
2295
  "requiredProps": [],
2254
2296
  "requiresAccessibleName": false
2255
- }
2297
+ },
2298
+ "since": "0.3.0"
2256
2299
  },
2257
2300
  {
2258
2301
  "name": "FeaturedIcon",
2259
2302
  "kind": "component",
2260
2303
  "category": "Marketing",
2261
2304
  "import": "@sakaniui/react",
2262
- "source": "src/components/MarketingComponents/FeaturedIcon/FeaturedIcon.tsx",
2263
- "summary": "Matches Figma \"Featured Icon\" (Marketing primitives set): a rounded icon chip used to headline a feature/benefit callout.",
2305
+ "summary": "A rounded icon chip to headline a feature or benefit, in sm, md or lg and subtle, solid, outline or light styles.",
2264
2306
  "props": [
2265
2307
  {
2266
2308
  "name": "icon",
@@ -2276,8 +2318,7 @@
2276
2318
  "md",
2277
2319
  "lg"
2278
2320
  ],
2279
- "default": "md",
2280
- "description": "Figma Size axis. Defaults to \"md\"."
2321
+ "default": "md"
2281
2322
  },
2282
2323
  {
2283
2324
  "name": "variant",
@@ -2289,8 +2330,7 @@
2289
2330
  "outline",
2290
2331
  "light"
2291
2332
  ],
2292
- "default": "light",
2293
- "description": "Figma Style axis (renamed to avoid colliding with the DOM `style` prop). Defaults to \"light\"."
2333
+ "default": "light"
2294
2334
  },
2295
2335
  {
2296
2336
  "name": "className",
@@ -2303,15 +2343,15 @@
2303
2343
  "icon"
2304
2344
  ],
2305
2345
  "requiresAccessibleName": false
2306
- }
2346
+ },
2347
+ "since": "0.3.0"
2307
2348
  },
2308
2349
  {
2309
2350
  "name": "FileUpload",
2310
2351
  "kind": "component",
2311
2352
  "category": "Composite",
2312
2353
  "import": "@sakaniui/react",
2313
- "source": "src/components/FileUpload/FileUpload.tsx",
2314
- "summary": "Dropzone for file uploads. Matches Figma \"File Upload\": dashed dropzone (radius-md), upload icon, \"Click to upload or drag and drop\" (label/md fg/default) + hint (body/xs fg/muted), plus an uploaded-file row.",
2354
+ "summary": "Dropzone for file uploads.",
2315
2355
  "props": [
2316
2356
  {
2317
2357
  "name": "accept",
@@ -2347,14 +2387,14 @@
2347
2387
  "contract": {
2348
2388
  "requiredProps": [],
2349
2389
  "requiresAccessibleName": false
2350
- }
2390
+ },
2391
+ "since": "0.1.0"
2351
2392
  },
2352
2393
  {
2353
2394
  "name": "FilterChip",
2354
2395
  "kind": "component",
2355
2396
  "category": "Data",
2356
2397
  "import": "@sakaniui/react",
2357
- "source": "src/components/FilterChip/FilterChip.tsx",
2358
2398
  "summary": "Toolbar filter pill.",
2359
2399
  "props": [
2360
2400
  {
@@ -2389,15 +2429,15 @@
2389
2429
  "contract": {
2390
2430
  "requiredProps": [],
2391
2431
  "requiresAccessibleName": false
2392
- }
2432
+ },
2433
+ "since": "0.1.0"
2393
2434
  },
2394
2435
  {
2395
2436
  "name": "FirstPageHeading",
2396
2437
  "kind": "component",
2397
2438
  "category": "Marketing",
2398
2439
  "import": "@sakaniui/react",
2399
- "source": "src/components/MarketingComponents/FirstPageHeading/FirstPageHeading.tsx",
2400
- "summary": "Matches Figma \"First Page Heading\" (Marketing primitives set, 16 previews: Align (Center/Left) x CTAs/Badge/Avatars (each True/False)). Align stays a real, explicit prop (Figma's own axis) -- a genuine layout choice.",
2440
+ "summary": "The heading that opens a page: title and description with optional badge, call-to-action buttons and avatars; `align` is \"left\" or \"center\".",
2401
2441
  "props": [
2402
2442
  {
2403
2443
  "name": "title",
@@ -2445,8 +2485,7 @@
2445
2485
  "left",
2446
2486
  "center"
2447
2487
  ],
2448
- "default": "center",
2449
- "description": "Figma Align axis. Defaults to \"center\"."
2488
+ "default": "center"
2450
2489
  },
2451
2490
  {
2452
2491
  "name": "className",
@@ -2459,15 +2498,15 @@
2459
2498
  "title"
2460
2499
  ],
2461
2500
  "requiresAccessibleName": false
2462
- }
2501
+ },
2502
+ "since": "0.3.0"
2463
2503
  },
2464
2504
  {
2465
2505
  "name": "FunnelChart",
2466
2506
  "kind": "component",
2467
2507
  "category": "Charts",
2468
2508
  "import": "@sakaniui/react",
2469
- "source": "src/components/FunnelChart/FunnelChart.tsx",
2470
- "summary": "Matches Figma's new \"Other charts\" set (\"Funnel chart\" / \"Funnel chart hover\") exactly: stages run left to right (not top to bottom), narrowing via smooth curved transitions rather than straight diagonal edges.",
2509
+ "summary": "A funnel chart whose stages run left to right and narrow through curved transitions, in sizes sm to xl.",
2471
2510
  "props": [
2472
2511
  {
2473
2512
  "name": "data",
@@ -2497,35 +2536,35 @@
2497
2536
  "data"
2498
2537
  ],
2499
2538
  "requiresAccessibleName": false
2500
- }
2539
+ },
2540
+ "since": "0.1.0"
2501
2541
  },
2502
2542
  {
2503
2543
  "name": "GithubIcon",
2504
2544
  "kind": "component",
2505
2545
  "category": "Marketing",
2506
2546
  "import": "@sakaniui/react",
2507
- "source": "src/components/MarketingComponents/ProfileCard/SocialIcons.tsx",
2508
- "summary": "svg) -- lucide-react ships no brand/logo icons in the version this library uses.",
2547
+ "summary": "GitHub brand mark drawn in currentColor, for social links.",
2509
2548
  "props": [
2510
2549
  {
2511
2550
  "name": "size",
2512
2551
  "type": "number",
2513
2552
  "required": false,
2514
- "default": "16"
2553
+ "default": 16
2515
2554
  }
2516
2555
  ],
2517
2556
  "contract": {
2518
2557
  "requiredProps": [],
2519
2558
  "requiresAccessibleName": false
2520
- }
2559
+ },
2560
+ "since": "0.3.0"
2521
2561
  },
2522
2562
  {
2523
2563
  "name": "HeatmapChart",
2524
2564
  "kind": "component",
2525
2565
  "category": "Charts",
2526
2566
  "import": "@sakaniui/react",
2527
- "source": "src/components/HeatmapChart/HeatmapChart.tsx",
2528
- "summary": "Matches Figma's new \"Other charts\" set (\"Heatmap chart\" / \"Heatmap chart hover\").",
2567
+ "summary": "A heatmap: a grid of coloured cells with optional row and column labels, in sizes sm to xl.",
2529
2568
  "props": [
2530
2569
  {
2531
2570
  "name": "data",
@@ -2547,8 +2586,7 @@
2547
2586
  "name": "valueLabel",
2548
2587
  "type": "string",
2549
2588
  "required": false,
2550
- "default": "Value",
2551
- "description": "Legend label for the tooltip's value row (Figma: \"Revenue\")."
2589
+ "default": "Value"
2552
2590
  },
2553
2591
  {
2554
2592
  "name": "size",
@@ -2573,15 +2611,28 @@
2573
2611
  "data"
2574
2612
  ],
2575
2613
  "requiresAccessibleName": false
2576
- }
2614
+ },
2615
+ "since": "0.1.0"
2616
+ },
2617
+ {
2618
+ "name": "HoverGroup",
2619
+ "kind": "component",
2620
+ "category": "Utilities",
2621
+ "import": "@sakaniui/react",
2622
+ "summary": "Flowing hover highlight: one element that glides between the items of a group instead of each item fading its own background in and out.",
2623
+ "props": [],
2624
+ "contract": {
2625
+ "requiredProps": [],
2626
+ "requiresAccessibleName": false
2627
+ },
2628
+ "since": "0.3.21"
2577
2629
  },
2578
2630
  {
2579
2631
  "name": "IconButton",
2580
2632
  "kind": "component",
2581
2633
  "category": "Core",
2582
2634
  "import": "@sakaniui/react",
2583
- "source": "src/components/IconButton/IconButton.tsx",
2584
- "summary": "Icon-only button. Matches Figma \"Icon Button\": variant (IB axis): primary | secondary | outline | ghost | destructive size: sm (32) | md (40) | lg (48) — square, radius-sm State handled via CSS (:hover, :disabled).",
2635
+ "summary": "Icon-only button.",
2585
2636
  "props": [
2586
2637
  {
2587
2638
  "name": "icon",
@@ -2626,14 +2677,14 @@
2626
2677
  "aria-label"
2627
2678
  ],
2628
2679
  "requiresAccessibleName": true
2629
- }
2680
+ },
2681
+ "since": "0.1.0"
2630
2682
  },
2631
2683
  {
2632
2684
  "name": "InlineHint",
2633
2685
  "kind": "component",
2634
2686
  "category": "Application",
2635
2687
  "import": "@sakaniui/react",
2636
- "source": "src/components/ApplicationComponents/InlineHint/InlineHint.tsx",
2637
2688
  "summary": "Small inline helper text with a colored accent bar.",
2638
2689
  "props": [
2639
2690
  {
@@ -2662,27 +2713,25 @@
2662
2713
  "message"
2663
2714
  ],
2664
2715
  "requiresAccessibleName": false
2665
- }
2716
+ },
2717
+ "since": "0.1.0"
2666
2718
  },
2667
2719
  {
2668
2720
  "name": "Input",
2669
2721
  "kind": "component",
2670
2722
  "category": "Forms",
2671
2723
  "import": "@sakaniui/react",
2672
- "source": "src/components/Input/Input.tsx",
2673
2724
  "summary": "Text input with optional label (Title), help text (Description), and leading/trailing icons.",
2674
2725
  "props": [
2675
2726
  {
2676
2727
  "name": "label",
2677
2728
  "type": "string",
2678
- "required": false,
2679
- "description": "Field label (Figma: Title)."
2729
+ "required": false
2680
2730
  },
2681
2731
  {
2682
2732
  "name": "description",
2683
2733
  "type": "string",
2684
- "required": false,
2685
- "description": "Help text under the field (Figma: Description)."
2734
+ "required": false
2686
2735
  },
2687
2736
  {
2688
2737
  "name": "error",
@@ -2699,8 +2748,7 @@
2699
2748
  "md",
2700
2749
  "lg"
2701
2750
  ],
2702
- "default": "md",
2703
- "description": "Figma Size axis. Defaults to \"md\"."
2751
+ "default": "md"
2704
2752
  },
2705
2753
  {
2706
2754
  "name": "unstyled",
@@ -2722,35 +2770,35 @@
2722
2770
  "contract": {
2723
2771
  "requiredProps": [],
2724
2772
  "requiresAccessibleName": false
2725
- }
2773
+ },
2774
+ "since": "0.1.0"
2726
2775
  },
2727
2776
  {
2728
2777
  "name": "InstagramIcon",
2729
2778
  "kind": "component",
2730
2779
  "category": "Marketing",
2731
2780
  "import": "@sakaniui/react",
2732
- "source": "src/components/MarketingComponents/TeamCard/TeamSocialIcons.tsx",
2733
- "summary": "tsx).",
2781
+ "summary": "Instagram glyph drawn in currentColor, for the `socialLinks` of TeamCard.",
2734
2782
  "props": [
2735
2783
  {
2736
2784
  "name": "size",
2737
2785
  "type": "number",
2738
2786
  "required": false,
2739
- "default": "16"
2787
+ "default": 16
2740
2788
  }
2741
2789
  ],
2742
2790
  "contract": {
2743
2791
  "requiredProps": [],
2744
2792
  "requiresAccessibleName": false
2745
- }
2793
+ },
2794
+ "since": "0.3.0"
2746
2795
  },
2747
2796
  {
2748
2797
  "name": "JobListing",
2749
2798
  "kind": "component",
2750
2799
  "category": "Marketing",
2751
2800
  "import": "@sakaniui/react",
2752
- "source": "src/components/MarketingComponents/JobListing/JobListing.tsx",
2753
- "summary": "Matches Figma \"Job Listing\" (Marketing primitives set, 2 styles: Card, Row).",
2801
+ "summary": "A job opening with title, description, department, employment type and location, plus an apply button. `layout` is \"row\" or \"card\".",
2754
2802
  "props": [
2755
2803
  {
2756
2804
  "name": "title",
@@ -2786,7 +2834,7 @@
2786
2834
  "remote"
2787
2835
  ],
2788
2836
  "default": "remote",
2789
- "description": "Drives LocationDot's color. Defaults to \"remote\", matching Figma's own Job Listing instances."
2837
+ "description": "Drives LocationDot's color."
2790
2838
  },
2791
2839
  {
2792
2840
  "name": "onApply",
@@ -2807,8 +2855,7 @@
2807
2855
  "row",
2808
2856
  "card"
2809
2857
  ],
2810
- "default": "card",
2811
- "description": "Figma Style axis. Defaults to \"card\"."
2858
+ "default": "card"
2812
2859
  },
2813
2860
  {
2814
2861
  "name": "className",
@@ -2825,14 +2872,14 @@
2825
2872
  "location"
2826
2873
  ],
2827
2874
  "requiresAccessibleName": false
2828
- }
2875
+ },
2876
+ "since": "0.3.0"
2829
2877
  },
2830
2878
  {
2831
2879
  "name": "Kbd",
2832
2880
  "kind": "component",
2833
2881
  "category": "Core",
2834
2882
  "import": "@sakaniui/react",
2835
- "source": "src/components/Kbd/Kbd.tsx",
2836
2883
  "summary": "Keyboard shortcut display. Renders a <kbd> element styled as a key cap. Use inline inside prose or next to menu items to hint shortcuts.",
2837
2884
  "props": [
2838
2885
  {
@@ -2844,14 +2891,14 @@
2844
2891
  "contract": {
2845
2892
  "requiredProps": [],
2846
2893
  "requiresAccessibleName": false
2847
- }
2894
+ },
2895
+ "since": "0.1.0"
2848
2896
  },
2849
2897
  {
2850
2898
  "name": "Label",
2851
2899
  "kind": "component",
2852
2900
  "category": "Core",
2853
2901
  "import": "@sakaniui/react",
2854
- "source": "src/components/Label/Label.tsx",
2855
2902
  "summary": "Form field label with optional required asterisk. Wraps a native <label> so htmlFor wiring works correctly.",
2856
2903
  "props": [
2857
2904
  {
@@ -2864,14 +2911,14 @@
2864
2911
  "contract": {
2865
2912
  "requiredProps": [],
2866
2913
  "requiresAccessibleName": false
2867
- }
2914
+ },
2915
+ "since": "0.1.0"
2868
2916
  },
2869
2917
  {
2870
2918
  "name": "LineChart",
2871
2919
  "kind": "component",
2872
2920
  "category": "Charts",
2873
2921
  "import": "@sakaniui/react",
2874
- "source": "src/components/LineChart/LineChart.tsx",
2875
2922
  "summary": "Recharts wrapper styled with Sakani chart tokens.",
2876
2923
  "props": [
2877
2924
  {
@@ -2951,14 +2998,14 @@
2951
2998
  "series"
2952
2999
  ],
2953
3000
  "requiresAccessibleName": false
2954
- }
3001
+ },
3002
+ "since": "0.1.0"
2955
3003
  },
2956
3004
  {
2957
3005
  "name": "Link",
2958
3006
  "kind": "component",
2959
3007
  "category": "Core",
2960
3008
  "import": "@sakaniui/react",
2961
- "source": "src/components/Link/Link.tsx",
2962
3009
  "summary": "Inline anchor with hover/visited states and optional external icon. Use for navigation and inline references — not for page-level CTAs (use Button).",
2963
3010
  "props": [
2964
3011
  {
@@ -2971,35 +3018,153 @@
2971
3018
  "contract": {
2972
3019
  "requiredProps": [],
2973
3020
  "requiresAccessibleName": false
2974
- }
3021
+ },
3022
+ "since": "0.1.0"
2975
3023
  },
2976
3024
  {
2977
3025
  "name": "LinkedinIcon",
2978
3026
  "kind": "component",
2979
3027
  "category": "Marketing",
2980
3028
  "import": "@sakaniui/react",
2981
- "source": "src/components/MarketingComponents/TeamCard/TeamSocialIcons.tsx",
2982
- "summary": "tsx).",
3029
+ "summary": "LinkedIn glyph drawn in currentColor, for the `socialLinks` of TeamCard.",
2983
3030
  "props": [
2984
3031
  {
2985
3032
  "name": "size",
2986
3033
  "type": "number",
2987
3034
  "required": false,
2988
- "default": "16"
3035
+ "default": 16
2989
3036
  }
2990
3037
  ],
2991
3038
  "contract": {
2992
3039
  "requiredProps": [],
2993
3040
  "requiresAccessibleName": false
2994
- }
3041
+ },
3042
+ "since": "0.3.0"
3043
+ },
3044
+ {
3045
+ "name": "LiquidBackdrop",
3046
+ "kind": "component",
3047
+ "category": "Utilities",
3048
+ "import": "@sakaniui/react",
3049
+ "summary": "The image behind the glass, shared by every LiquidGlass inside it. Pass `src`.",
3050
+ "props": [
3051
+ {
3052
+ "name": "src",
3053
+ "type": "string",
3054
+ "required": true,
3055
+ "description": "The image behind the glass, cover-fitted."
3056
+ },
3057
+ {
3058
+ "name": "position",
3059
+ "type": "string",
3060
+ "required": false,
3061
+ "default": "center",
3062
+ "description": "background-position of the image. Default 'center'."
3063
+ },
3064
+ {
3065
+ "name": "veil",
3066
+ "type": "string",
3067
+ "required": false,
3068
+ "description": "Any CSS color, var() included."
3069
+ }
3070
+ ],
3071
+ "contract": {
3072
+ "requiredProps": [
3073
+ "src"
3074
+ ],
3075
+ "requiresAccessibleName": false
3076
+ },
3077
+ "since": "0.4.0"
3078
+ },
3079
+ {
3080
+ "name": "LiquidGlass",
3081
+ "kind": "component",
3082
+ "category": "Utilities",
3083
+ "import": "@sakaniui/react",
3084
+ "summary": "Apple-style liquid glass material (the Liquid surface mode): bends the backdrop at the edge with refraction, dispersion, rim light and depth. Use it inside a LiquidBackdrop when the image behind the UI is known.",
3085
+ "props": [
3086
+ {
3087
+ "name": "variant",
3088
+ "type": "\"regular\" | \"clear\"",
3089
+ "required": false,
3090
+ "values": [
3091
+ "regular",
3092
+ "clear"
3093
+ ],
3094
+ "default": "regular",
3095
+ "description": "regular: text-safe tint (panels, sidebars, modals). clear: icons and large labels only."
3096
+ },
3097
+ {
3098
+ "name": "tint",
3099
+ "type": "\"subtle\" | \"none\" | \"auto\" | \"regular\" | \"clear\"",
3100
+ "required": false,
3101
+ "values": [
3102
+ "subtle",
3103
+ "none",
3104
+ "auto",
3105
+ "regular",
3106
+ "clear"
3107
+ ],
3108
+ "default": "auto",
3109
+ "description": "How much of the backdrop shows through. Default 'auto' (follows `variant`)."
3110
+ },
3111
+ {
3112
+ "name": "radius",
3113
+ "type": "number",
3114
+ "required": false,
3115
+ "default": 20,
3116
+ "description": "Corner radius in px. Default 20."
3117
+ },
3118
+ {
3119
+ "name": "refraction",
3120
+ "type": "\"off\" | \"auto\"",
3121
+ "required": false,
3122
+ "values": [
3123
+ "off",
3124
+ "auto"
3125
+ ],
3126
+ "default": "auto",
3127
+ "description": "'off' forces the frosted fallback."
3128
+ },
3129
+ {
3130
+ "name": "effect",
3131
+ "type": "Partial<LiquidGlassEffect>",
3132
+ "required": false,
3133
+ "description": "Defaults come from the variant's --liquid-* tokens."
3134
+ },
3135
+ {
3136
+ "name": "source",
3137
+ "type": "boolean",
3138
+ "required": false,
3139
+ "default": true,
3140
+ "description": "Inside a <LiquidBackdrop>: true (default) refracts the backdrop image; false bends whatever is painted below instead (UI under a slider knob)."
3141
+ },
3142
+ {
3143
+ "name": "bake",
3144
+ "type": "boolean | \"auto\"",
3145
+ "required": false,
3146
+ "default": "auto",
3147
+ "description": "'auto' (default): inside a LiquidBackdrop, lenses over 300×300 bake their glass once (fast; for surfaces that stay put). false: always live (a big lens that moves)."
3148
+ },
3149
+ {
3150
+ "name": "interactive",
3151
+ "type": "boolean",
3152
+ "required": false,
3153
+ "description": "Squish slightly when pressed (buttons, toolbar pills)."
3154
+ }
3155
+ ],
3156
+ "contract": {
3157
+ "requiredProps": [],
3158
+ "requiresAccessibleName": false
3159
+ },
3160
+ "since": "0.4.0"
2995
3161
  },
2996
3162
  {
2997
3163
  "name": "List",
2998
3164
  "kind": "component",
2999
3165
  "category": "Marketing",
3000
3166
  "import": "@sakaniui/react",
3001
- "source": "src/components/MarketingComponents/List/List.tsx",
3002
- "summary": "Matches Figma \"List\" (Marketing primitives set, 3 styles: Check, Bullet, Arrow).",
3167
+ "summary": "A list of text items with a leading marker; `style` is \"check\", \"bullet\" or \"arrow\".",
3003
3168
  "props": [
3004
3169
  {
3005
3170
  "name": "items",
@@ -3015,8 +3180,7 @@
3015
3180
  "bullet",
3016
3181
  "arrow"
3017
3182
  ],
3018
- "default": "check",
3019
- "description": "Figma Style axis. Defaults to \"check\"."
3183
+ "default": "check"
3020
3184
  },
3021
3185
  {
3022
3186
  "name": "className",
@@ -3029,15 +3193,15 @@
3029
3193
  "items"
3030
3194
  ],
3031
3195
  "requiresAccessibleName": false
3032
- }
3196
+ },
3197
+ "since": "0.3.0"
3033
3198
  },
3034
3199
  {
3035
3200
  "name": "ListItem",
3036
3201
  "kind": "component",
3037
3202
  "category": "Composite",
3038
3203
  "import": "@sakaniui/react",
3039
- "source": "src/components/ListItem/ListItem.tsx",
3040
- "summary": "Row for lists/menus. Matches Figma \"List Item\": State (Default|Hover|Selected), Title/Description toggles.",
3204
+ "summary": "Row for lists/menus. Supports leading (icon/avatar) and trailing (badge/action) slots.",
3041
3205
  "props": [
3042
3206
  {
3043
3207
  "name": "title",
@@ -3085,15 +3249,15 @@
3085
3249
  "title"
3086
3250
  ],
3087
3251
  "requiresAccessibleName": false
3088
- }
3252
+ },
3253
+ "since": "0.1.0"
3089
3254
  },
3090
3255
  {
3091
3256
  "name": "LocationDot",
3092
3257
  "kind": "component",
3093
3258
  "category": "Marketing",
3094
3259
  "import": "@sakaniui/react",
3095
- "source": "src/components/MarketingComponents/LocationDot/LocationDot.tsx",
3096
- "summary": "Matches Figma \"Location Dot\" (Marketing primitives set, shared across any marketing component that shows a location -- JobListing is the first consumer).g. a real office location (\"Lagos, Nigeria\").g.",
3260
+ "summary": "A status dot and location label; `status` \"active\" is green (a real office), \"remote\" is gray.",
3097
3261
  "props": [
3098
3262
  {
3099
3263
  "name": "location",
@@ -3108,8 +3272,7 @@
3108
3272
  "active",
3109
3273
  "remote"
3110
3274
  ],
3111
- "default": "active",
3112
- "description": "Figma Status axis. Defaults to \"active\"."
3275
+ "default": "active"
3113
3276
  },
3114
3277
  {
3115
3278
  "name": "className",
@@ -3122,15 +3285,15 @@
3122
3285
  "location"
3123
3286
  ],
3124
3287
  "requiresAccessibleName": false
3125
- }
3288
+ },
3289
+ "since": "0.3.0"
3126
3290
  },
3127
3291
  {
3128
3292
  "name": "Marquee",
3129
3293
  "kind": "component",
3130
3294
  "category": "Marketing",
3131
3295
  "import": "@sakaniui/react",
3132
- "source": "src/components/MarketingComponents/Marquee/Marquee.tsx",
3133
- "summary": "Matches Figma \"Marquee\" (Marketing primitives set, 2 content previews: Logos, Text).",
3296
+ "summary": "An infinitely scrolling horizontal row of items (logos or text) with adjustable `speed` and `gap`.",
3134
3297
  "props": [
3135
3298
  {
3136
3299
  "name": "items",
@@ -3141,14 +3304,14 @@
3141
3304
  "name": "speed",
3142
3305
  "type": "number",
3143
3306
  "required": false,
3144
- "default": "40",
3307
+ "default": 40,
3145
3308
  "description": "Scroll speed in pixels/second at rest (pre-hover). Defaults to 40."
3146
3309
  },
3147
3310
  {
3148
3311
  "name": "gap",
3149
3312
  "type": "number",
3150
3313
  "required": true,
3151
- "description": "Gap between items, in px. Figma uses 32 for Logos, 12 for Text -- no shared default assumption, so this must be passed explicitly."
3314
+ "description": "Gap between items, in px."
3152
3315
  },
3153
3316
  {
3154
3317
  "name": "className",
@@ -3162,15 +3325,15 @@
3162
3325
  "gap"
3163
3326
  ],
3164
3327
  "requiresAccessibleName": false
3165
- }
3328
+ },
3329
+ "since": "0.3.0"
3166
3330
  },
3167
3331
  {
3168
3332
  "name": "Menu",
3169
3333
  "kind": "component",
3170
3334
  "category": "Overlays",
3171
3335
  "import": "@sakaniui/react",
3172
- "source": "src/components/Menu/Menu.tsx",
3173
- "summary": "Dropdown menu container. Matches the Figma \"Menu\" component: mirrors Combobox Panel exactly — radius 6, padding 4, gap 2, bg/surface, border/default, shadow/lg.",
3336
+ "summary": "Dropdown menu container.",
3174
3337
  "props": [
3175
3338
  {
3176
3339
  "name": "aria-label",
@@ -3182,8 +3345,8 @@
3182
3345
  "name": "minWidth",
3183
3346
  "type": "number",
3184
3347
  "required": false,
3185
- "default": "208",
3186
- "description": "Minimum width in px. Defaults to 208 (matches Figma)."
3348
+ "default": 208,
3349
+ "description": "Minimum width in px."
3187
3350
  },
3188
3351
  {
3189
3352
  "name": "className",
@@ -3194,27 +3357,27 @@
3194
3357
  "contract": {
3195
3358
  "requiredProps": [],
3196
3359
  "requiresAccessibleName": false
3197
- }
3360
+ },
3361
+ "since": "0.1.0"
3198
3362
  },
3199
3363
  {
3200
3364
  "name": "MenuDivider",
3201
3365
  "kind": "component",
3202
3366
  "category": "Overlays",
3203
3367
  "import": "@sakaniui/react",
3204
- "source": "src/components/Menu/Menu.tsx",
3205
- "summary": "Dropdown menu container. Matches the Figma \"Menu\" component: mirrors Combobox Panel exactly — radius 6, padding 4, gap 2, bg/surface, border/default, shadow/lg.",
3368
+ "summary": "A divider that separates groups of items inside a Menu.",
3206
3369
  "props": [],
3207
3370
  "contract": {
3208
3371
  "requiredProps": [],
3209
3372
  "requiresAccessibleName": false
3210
- }
3373
+ },
3374
+ "since": "0.1.0"
3211
3375
  },
3212
3376
  {
3213
3377
  "name": "MenuItem",
3214
3378
  "kind": "component",
3215
3379
  "category": "Overlays",
3216
3380
  "import": "@sakaniui/react",
3217
- "source": "src/components/MenuItem/MenuItem.tsx",
3218
3381
  "summary": "One row of a dropdown Menu.",
3219
3382
  "props": [
3220
3383
  {
@@ -3228,7 +3391,7 @@
3228
3391
  "checked"
3229
3392
  ],
3230
3393
  "default": "default",
3231
- "description": "Visual state. Maps to Figma State axis."
3394
+ "description": "Visual state."
3232
3395
  },
3233
3396
  {
3234
3397
  "name": "icon",
@@ -3256,14 +3419,14 @@
3256
3419
  "contract": {
3257
3420
  "requiredProps": [],
3258
3421
  "requiresAccessibleName": false
3259
- }
3422
+ },
3423
+ "since": "0.1.0"
3260
3424
  },
3261
3425
  {
3262
3426
  "name": "MessageBubble",
3263
3427
  "kind": "component",
3264
3428
  "category": "Chat",
3265
3429
  "import": "@sakaniui/react",
3266
- "source": "src/components/MessageBubble/MessageBubble.tsx",
3267
3430
  "summary": "A chat message.",
3268
3431
  "props": [
3269
3432
  {
@@ -3348,15 +3511,15 @@
3348
3511
  "contract": {
3349
3512
  "requiredProps": [],
3350
3513
  "requiresAccessibleName": false
3351
- }
3514
+ },
3515
+ "since": "0.1.0"
3352
3516
  },
3353
3517
  {
3354
3518
  "name": "Metric",
3355
3519
  "kind": "component",
3356
3520
  "category": "Marketing",
3357
3521
  "import": "@sakaniui/react",
3358
- "source": "src/components/MarketingComponents/Metric/Metric.tsx",
3359
- "summary": "Matches Figma \"Metric\" (Marketing primitives set, 2 styles: Simple, With Trend).",
3522
+ "summary": "A value with a label; passing `trend` adds a trend chip.",
3360
3523
  "props": [
3361
3524
  {
3362
3525
  "name": "value",
@@ -3386,15 +3549,15 @@
3386
3549
  "label"
3387
3550
  ],
3388
3551
  "requiresAccessibleName": false
3389
- }
3552
+ },
3553
+ "since": "0.3.0"
3390
3554
  },
3391
3555
  {
3392
3556
  "name": "MobileNavigationMenu",
3393
3557
  "kind": "component",
3394
3558
  "category": "Marketing",
3395
3559
  "import": "@sakaniui/react",
3396
- "source": "src/components/MarketingComponents/MobileNavigationMenu/MobileNavigationMenu.tsx",
3397
- "summary": "Matches Figma \"Mobile Navigation Menu\" (Marketing primitives set, 2 states: Closed, Open).",
3560
+ "summary": "A mobile navigation menu: a toggle that opens a list of links and an optional call-to-action. Controlled with `open` or uncontrolled with `defaultOpen`.",
3398
3561
  "props": [
3399
3562
  {
3400
3563
  "name": "label",
@@ -3427,7 +3590,7 @@
3427
3590
  "name": "defaultOpen",
3428
3591
  "type": "boolean",
3429
3592
  "required": false,
3430
- "default": "false"
3593
+ "default": false
3431
3594
  },
3432
3595
  {
3433
3596
  "name": "onOpenChange",
@@ -3446,14 +3609,14 @@
3446
3609
  "links"
3447
3610
  ],
3448
3611
  "requiresAccessibleName": false
3449
- }
3612
+ },
3613
+ "since": "0.3.0"
3450
3614
  },
3451
3615
  {
3452
3616
  "name": "Modal",
3453
3617
  "kind": "component",
3454
3618
  "category": "Application",
3455
3619
  "import": "@sakaniui/react",
3456
- "source": "src/components/ApplicationComponents/Modal/Modal.tsx",
3457
3620
  "summary": "Confirmation dialog.",
3458
3621
  "props": [
3459
3622
  {
@@ -3506,8 +3669,7 @@
3506
3669
  {
3507
3670
  "name": "onCancel",
3508
3671
  "type": "(() => void)",
3509
- "required": false,
3510
- "description": "Defaults to `onClose`."
3672
+ "required": false
3511
3673
  },
3512
3674
  {
3513
3675
  "name": "onConfirm",
@@ -3523,13 +3685,13 @@
3523
3685
  "name": "closeOnEscape",
3524
3686
  "type": "boolean",
3525
3687
  "required": false,
3526
- "default": "true"
3688
+ "default": true
3527
3689
  },
3528
3690
  {
3529
3691
  "name": "closeOnBackdropClick",
3530
3692
  "type": "boolean",
3531
3693
  "required": false,
3532
- "default": "true"
3694
+ "default": true
3533
3695
  },
3534
3696
  {
3535
3697
  "name": "children",
@@ -3541,15 +3703,14 @@
3541
3703
  "name": "hideHeader",
3542
3704
  "type": "boolean",
3543
3705
  "required": false,
3544
- "default": "false",
3545
- "description": "Hides the title+close-X header row entirely, so `children` owns the whole top of the card (e.g. MultistepModalBlock's own steps-row + title + description, which Figma draws with no header bar or close control at all). `title` is still required and used as the dialog's aria-label in this mode, since there's no #modal-title element to point aria-labelledby at."
3706
+ "default": false,
3707
+ "description": "`title` is still required and used as the dialog's aria-label in this mode, since there's no #modal-title element to point aria-labelledby at."
3546
3708
  },
3547
3709
  {
3548
3710
  "name": "hideFooterDivider",
3549
3711
  "type": "boolean",
3550
3712
  "required": false,
3551
- "default": "false",
3552
- "description": "Hides the Divider between the body and the footer buttons (Figma's Multistep Modal has no such rule)."
3713
+ "default": false
3553
3714
  },
3554
3715
  {
3555
3716
  "name": "footerJustify",
@@ -3560,7 +3721,7 @@
3560
3721
  "between"
3561
3722
  ],
3562
3723
  "default": "end",
3563
- "description": "Footer button alignment. 'end' (default) clusters Cancel/Confirm at the right, matching the base Modal's Figma spec. 'between' spreads them across the full width (Figma: Multistep Modal's Back / Continue footer), so the footer <div> fills the card instead of just wrapping its two buttons."
3724
+ "description": "Footer button alignment."
3564
3725
  },
3565
3726
  {
3566
3727
  "name": "className",
@@ -3575,15 +3736,15 @@
3575
3736
  "title"
3576
3737
  ],
3577
3738
  "requiresAccessibleName": false
3578
- }
3739
+ },
3740
+ "since": "0.1.0"
3579
3741
  },
3580
3742
  {
3581
3743
  "name": "NotificationItem",
3582
3744
  "kind": "component",
3583
3745
  "category": "Application",
3584
3746
  "import": "@sakaniui/react",
3585
- "source": "src/components/ApplicationComponents/NotificationItem/NotificationItem.tsx",
3586
- "summary": "Matches Figma \"Notification Item\" (3 style previews -- Unread, Read, Dismissable -- collapsed into composable props, same judgment already applied throughout this Application set):",
3747
+ "summary": "A notification row with icon, title and timestamp; `read` toggles the unread style, with optional description, dismiss and action buttons.",
3587
3748
  "props": [
3588
3749
  {
3589
3750
  "name": "icon",
@@ -3605,7 +3766,7 @@
3605
3766
  "name": "read",
3606
3767
  "type": "boolean",
3607
3768
  "required": false,
3608
- "default": "false",
3769
+ "default": false,
3609
3770
  "description": "Simple row only -- false (default) shows the unread background + dot."
3610
3771
  },
3611
3772
  {
@@ -3647,15 +3808,15 @@
3647
3808
  "title"
3648
3809
  ],
3649
3810
  "requiresAccessibleName": false
3650
- }
3811
+ },
3812
+ "since": "0.1.0"
3651
3813
  },
3652
3814
  {
3653
3815
  "name": "Pagination",
3654
3816
  "kind": "component",
3655
3817
  "category": "Composite",
3656
3818
  "import": "@sakaniui/react",
3657
- "source": "src/components/Pagination/Pagination.tsx",
3658
- "summary": "Page navigation. Matches Figma \"Pagination\": prev/next arrows + numbered page buttons (32px, radius-sm, bg/surface, border/subtle), active page filled accent.",
3819
+ "summary": "Page navigation. Collapses long ranges with ellipses; the numbers between them come in fixed blocks the highlight moves across (see buildRange).",
3659
3820
  "props": [
3660
3821
  {
3661
3822
  "name": "total",
@@ -3678,7 +3839,7 @@
3678
3839
  "name": "siblings",
3679
3840
  "type": "number",
3680
3841
  "required": false,
3681
- "default": "1",
3842
+ "default": 1,
3682
3843
  "description": "Sets how many page numbers show between the ellipses: blocks of siblings * 2 + 1 (3 by default). Total slots are siblings * 2 + 5."
3683
3844
  },
3684
3845
  {
@@ -3694,14 +3855,14 @@
3694
3855
  "onPageChange"
3695
3856
  ],
3696
3857
  "requiresAccessibleName": false
3697
- }
3858
+ },
3859
+ "since": "0.1.0"
3698
3860
  },
3699
3861
  {
3700
3862
  "name": "PieChart",
3701
3863
  "kind": "component",
3702
3864
  "category": "Charts",
3703
3865
  "import": "@sakaniui/react",
3704
- "source": "src/components/PieChart/PieChart.tsx",
3705
3866
  "summary": "Recharts wrapper styled with Sakani chart tokens.",
3706
3867
  "props": [
3707
3868
  {
@@ -3761,15 +3922,15 @@
3761
3922
  "data"
3762
3923
  ],
3763
3924
  "requiresAccessibleName": false
3764
- }
3925
+ },
3926
+ "since": "0.1.0"
3765
3927
  },
3766
3928
  {
3767
3929
  "name": "PlaceholderLogo",
3768
3930
  "kind": "component",
3769
3931
  "category": "Marketing",
3770
3932
  "import": "@sakaniui/react",
3771
- "source": "src/components/MarketingComponents/PlaceholderLogo/PlaceholderLogo.tsx",
3772
- "summary": "Matches Figma \"Placeholder Logo\" (Marketing primitives set, 3 sizes: sm 22 / md 40 / lg 46) -- a bg/surface + border/subtle + radius/lg square slot for a company/brand mark, same \"empty-state avatar\" role Avatar's own Icon type fills for a person.",
3933
+ "summary": "A square slot for a company or brand mark in sm, md or lg; pass `logo` to replace the default mark.",
3773
3934
  "props": [
3774
3935
  {
3775
3936
  "name": "size",
@@ -3780,14 +3941,13 @@
3780
3941
  "md",
3781
3942
  "lg"
3782
3943
  ],
3783
- "default": "md",
3784
- "description": "Figma Size axis. Defaults to \"md\"."
3944
+ "default": "md"
3785
3945
  },
3786
3946
  {
3787
3947
  "name": "logo",
3788
3948
  "type": "ReactNode",
3789
3949
  "required": false,
3790
- "description": "Custom logo/icon slot. Defaults to the Sakani mark, matching Figma."
3950
+ "description": "Custom logo/icon slot."
3791
3951
  },
3792
3952
  {
3793
3953
  "name": "label",
@@ -3804,15 +3964,15 @@
3804
3964
  "contract": {
3805
3965
  "requiredProps": [],
3806
3966
  "requiresAccessibleName": false
3807
- }
3967
+ },
3968
+ "since": "0.3.0"
3808
3969
  },
3809
3970
  {
3810
3971
  "name": "Popover",
3811
3972
  "kind": "component",
3812
3973
  "category": "Composite",
3813
3974
  "import": "@sakaniui/react",
3814
- "source": "src/components/Popover/Popover.tsx",
3815
- "summary": "Floating panel anchored to a trigger. Matches Figma \"Popover\" (Buttons 1-3), with title/description toggles.",
3975
+ "summary": "Floating panel anchored to a trigger.",
3816
3976
  "props": [
3817
3977
  {
3818
3978
  "name": "trigger",
@@ -3859,15 +4019,15 @@
3859
4019
  "trigger"
3860
4020
  ],
3861
4021
  "requiresAccessibleName": false
3862
- }
4022
+ },
4023
+ "since": "0.1.0"
3863
4024
  },
3864
4025
  {
3865
4026
  "name": "PriceDisplay",
3866
4027
  "kind": "component",
3867
4028
  "category": "E-commerce",
3868
4029
  "import": "@sakaniui/react",
3869
- "source": "src/components/ECommerceComponents/PriceDisplay/PriceDisplay.tsx",
3870
- "summary": "Matches Figma \"Price Display\" (E-commerce set).",
4030
+ "summary": "A product price. Pass `compareAtPrice` for a struck-through original price with the current price in the danger colour; `showBadge` adds the sale badge.",
3871
4031
  "props": [
3872
4032
  {
3873
4033
  "name": "price",
@@ -3884,14 +4044,13 @@
3884
4044
  "name": "showBadge",
3885
4045
  "type": "boolean",
3886
4046
  "required": false,
3887
- "default": "false",
4047
+ "default": false,
3888
4048
  "description": "Shows a \"Save X%\" badge, computed from price vs. compareAtPrice. No-op without compareAtPrice."
3889
4049
  },
3890
4050
  {
3891
4051
  "name": "formatPrice",
3892
4052
  "type": "((amount: number) => string)",
3893
- "required": false,
3894
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
4053
+ "required": false
3895
4054
  },
3896
4055
  {
3897
4056
  "name": "className",
@@ -3904,15 +4063,15 @@
3904
4063
  "price"
3905
4064
  ],
3906
4065
  "requiresAccessibleName": false
3907
- }
4066
+ },
4067
+ "since": "0.3.0"
3908
4068
  },
3909
4069
  {
3910
4070
  "name": "ProductCard",
3911
4071
  "kind": "component",
3912
4072
  "category": "E-commerce",
3913
4073
  "import": "@sakaniui/react",
3914
- "source": "src/components/ECommerceComponents/ProductCard/ProductCard.tsx",
3915
- "summary": "Matches Figma \"Product Card\" (E-commerce set): image (wishlist button + sale badge overlay) -> rating -> name/price -> description -> color swatches -> \"Add Item\" button.",
4074
+ "summary": "An e-commerce product card: image with wishlist button and sale badge, rating, name, price, description, colour swatches and an add button. `compareAtPrice` shows the sale treatment.",
3916
4075
  "props": [
3917
4076
  {
3918
4077
  "name": "image",
@@ -3970,13 +4129,13 @@
3970
4129
  "name": "inStock",
3971
4130
  "type": "boolean",
3972
4131
  "required": false,
3973
- "default": "true"
4132
+ "default": true
3974
4133
  },
3975
4134
  {
3976
4135
  "name": "wishlisted",
3977
4136
  "type": "boolean",
3978
4137
  "required": false,
3979
- "default": "false"
4138
+ "default": false
3980
4139
  },
3981
4140
  {
3982
4141
  "name": "onWishlistToggle",
@@ -3997,8 +4156,7 @@
3997
4156
  {
3998
4157
  "name": "formatPrice",
3999
4158
  "type": "((amount: number) => string)",
4000
- "required": false,
4001
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
4159
+ "required": false
4002
4160
  },
4003
4161
  {
4004
4162
  "name": "className",
@@ -4013,15 +4171,15 @@
4013
4171
  "price"
4014
4172
  ],
4015
4173
  "requiresAccessibleName": false
4016
- }
4174
+ },
4175
+ "since": "0.3.0"
4017
4176
  },
4018
4177
  {
4019
4178
  "name": "ProductGallery",
4020
4179
  "kind": "component",
4021
4180
  "category": "E-commerce",
4022
4181
  "import": "@sakaniui/react",
4023
- "source": "src/components/ECommerceComponents/ProductGallery/ProductGallery.tsx",
4024
- "summary": "Matches Figma \"Product Gallery\" (E-commerce set): a main image plus selectable thumbnails, click a thumb to make it the main image.",
4182
+ "summary": "A main product image with selectable thumbnails; `thumbsPosition` is \"bottom\" or \"left\". Controlled or uncontrolled via `activeIndex` / `defaultActiveIndex`.",
4025
4183
  "props": [
4026
4184
  {
4027
4185
  "name": "images",
@@ -4048,7 +4206,7 @@
4048
4206
  "name": "defaultActiveIndex",
4049
4207
  "type": "number",
4050
4208
  "required": false,
4051
- "default": "0"
4209
+ "default": 0
4052
4210
  },
4053
4211
  {
4054
4212
  "name": "onActiveIndexChange",
@@ -4066,15 +4224,15 @@
4066
4224
  "images"
4067
4225
  ],
4068
4226
  "requiresAccessibleName": false
4069
- }
4227
+ },
4228
+ "since": "0.3.0"
4070
4229
  },
4071
4230
  {
4072
4231
  "name": "ProfileCard",
4073
4232
  "kind": "component",
4074
4233
  "category": "Marketing",
4075
4234
  "import": "@sakaniui/react",
4076
- "source": "src/components/MarketingComponents/ProfileCard/ProfileCard.tsx",
4077
- "summary": "Matches Figma \"Profile Card\" (Marketing primitives set, 2 styles: Compact, Detailed).",
4235
+ "summary": "A person card with avatar, name and role, plus an optional bio and social links (the detailed layout follows the data you pass).",
4078
4236
  "props": [
4079
4237
  {
4080
4238
  "name": "name",
@@ -4120,15 +4278,15 @@
4120
4278
  "role"
4121
4279
  ],
4122
4280
  "requiresAccessibleName": false
4123
- }
4281
+ },
4282
+ "since": "0.3.0"
4124
4283
  },
4125
4284
  {
4126
4285
  "name": "Progress",
4127
4286
  "kind": "component",
4128
4287
  "category": "Core",
4129
4288
  "import": "@sakaniui/react",
4130
- "source": "src/components/Progress/Progress.tsx",
4131
- "summary": "Linear progress bar.g.",
4289
+ "summary": "Linear progress bar.",
4132
4290
  "props": [
4133
4291
  {
4134
4292
  "name": "value",
@@ -4163,14 +4321,14 @@
4163
4321
  "contract": {
4164
4322
  "requiredProps": [],
4165
4323
  "requiresAccessibleName": false
4166
- }
4324
+ },
4325
+ "since": "0.1.0"
4167
4326
  },
4168
4327
  {
4169
4328
  "name": "ProgressItem",
4170
4329
  "kind": "component",
4171
4330
  "category": "Application",
4172
4331
  "import": "@sakaniui/react",
4173
- "source": "src/components/ApplicationComponents/ProgressItem/ProgressItem.tsx",
4174
4332
  "summary": "One row of a numbered step list.",
4175
4333
  "props": [
4176
4334
  {
@@ -4192,7 +4350,7 @@
4192
4350
  "name": "completed",
4193
4351
  "type": "boolean",
4194
4352
  "required": false,
4195
- "default": "false",
4353
+ "default": false,
4196
4354
  "description": "Shows a checkmark in the circle instead of `step`."
4197
4355
  },
4198
4356
  {
@@ -4209,7 +4367,7 @@
4209
4367
  "name": "isLast",
4210
4368
  "type": "boolean",
4211
4369
  "required": false,
4212
- "default": "false",
4370
+ "default": false,
4213
4371
  "description": "Hides the trailing connector -- the last row in a list."
4214
4372
  },
4215
4373
  {
@@ -4224,14 +4382,14 @@
4224
4382
  "title"
4225
4383
  ],
4226
4384
  "requiresAccessibleName": false
4227
- }
4385
+ },
4386
+ "since": "0.1.0"
4228
4387
  },
4229
4388
  {
4230
4389
  "name": "ProgressStat",
4231
4390
  "kind": "component",
4232
4391
  "category": "Application",
4233
4392
  "import": "@sakaniui/react",
4234
- "source": "src/components/ApplicationComponents/ProgressStat/ProgressStat.tsx",
4235
4393
  "summary": "Label + value row above a progress bar.",
4236
4394
  "props": [
4237
4395
  {
@@ -4264,15 +4422,15 @@
4264
4422
  "progress"
4265
4423
  ],
4266
4424
  "requiresAccessibleName": false
4267
- }
4425
+ },
4426
+ "since": "0.1.0"
4268
4427
  },
4269
4428
  {
4270
4429
  "name": "QuantitySelector",
4271
4430
  "kind": "component",
4272
4431
  "category": "E-commerce",
4273
4432
  "import": "@sakaniui/react",
4274
- "source": "src/components/ECommerceComponents/QuantitySelector/QuantitySelector.tsx",
4275
- "summary": "Matches Figma \"Quantity Selector\" (E-commerce set): a 3-cell stepper -- decrement / value / increment, separated by 1px dividers, only the outer frame rounded/bordered.",
4433
+ "summary": "A decrement / value / increment stepper for quantity, bounded by `min` and `max`.",
4276
4434
  "props": [
4277
4435
  {
4278
4436
  "name": "quantity",
@@ -4288,7 +4446,7 @@
4288
4446
  "name": "min",
4289
4447
  "type": "number",
4290
4448
  "required": false,
4291
- "default": "1"
4449
+ "default": 1
4292
4450
  },
4293
4451
  {
4294
4452
  "name": "max",
@@ -4313,14 +4471,14 @@
4313
4471
  "quantity"
4314
4472
  ],
4315
4473
  "requiresAccessibleName": false
4316
- }
4474
+ },
4475
+ "since": "0.3.0"
4317
4476
  },
4318
4477
  {
4319
4478
  "name": "RadarChart",
4320
4479
  "kind": "component",
4321
4480
  "category": "Charts",
4322
4481
  "import": "@sakaniui/react",
4323
- "source": "src/components/RadarChart/RadarChart.tsx",
4324
4482
  "summary": "Recharts wrapper styled with Sakani chart tokens.",
4325
4483
  "props": [
4326
4484
  {
@@ -4377,14 +4535,14 @@
4377
4535
  "data"
4378
4536
  ],
4379
4537
  "requiresAccessibleName": false
4380
- }
4538
+ },
4539
+ "since": "0.1.0"
4381
4540
  },
4382
4541
  {
4383
4542
  "name": "RadialChart",
4384
4543
  "kind": "component",
4385
4544
  "category": "Charts",
4386
4545
  "import": "@sakaniui/react",
4387
- "source": "src/components/RadialChart/RadialChart.tsx",
4388
4546
  "summary": "Recharts wrapper styled with Sakani chart tokens.",
4389
4547
  "props": [
4390
4548
  {
@@ -4441,15 +4599,15 @@
4441
4599
  "data"
4442
4600
  ],
4443
4601
  "requiresAccessibleName": false
4444
- }
4602
+ },
4603
+ "since": "0.1.0"
4445
4604
  },
4446
4605
  {
4447
4606
  "name": "Radio",
4448
4607
  "kind": "component",
4449
4608
  "category": "Forms",
4450
4609
  "import": "@sakaniui/react",
4451
- "source": "src/components/Radio/Radio.tsx",
4452
- "summary": "Single radio button. Matches Figma \"Radio\" set: Unchecked | Hover | Checked | Disabled, with Title/Description toggles.",
4610
+ "summary": "Single radio button.",
4453
4611
  "props": [
4454
4612
  {
4455
4613
  "name": "label",
@@ -4465,15 +4623,15 @@
4465
4623
  "contract": {
4466
4624
  "requiredProps": [],
4467
4625
  "requiresAccessibleName": false
4468
- }
4626
+ },
4627
+ "since": "0.1.0"
4469
4628
  },
4470
4629
  {
4471
4630
  "name": "RichSeparator",
4472
4631
  "kind": "component",
4473
4632
  "category": "Application",
4474
4633
  "import": "@sakaniui/react",
4475
- "source": "src/components/ApplicationComponents/RichSeparator/RichSeparator.tsx",
4476
- "summary": "Two divider lines flanking arbitrary centered content.",
4634
+ "summary": "Two divider lines flanking arbitrary centered content. `label` is a convenience shorthand for the common Text case, styled as that same overline automatically.",
4477
4635
  "props": [
4478
4636
  {
4479
4637
  "name": "children",
@@ -4496,15 +4654,15 @@
4496
4654
  "contract": {
4497
4655
  "requiredProps": [],
4498
4656
  "requiresAccessibleName": false
4499
- }
4657
+ },
4658
+ "since": "0.1.0"
4500
4659
  },
4501
4660
  {
4502
4661
  "name": "RichTextHeading",
4503
4662
  "kind": "component",
4504
4663
  "category": "Marketing",
4505
4664
  "import": "@sakaniui/react",
4506
- "source": "src/components/MarketingComponents/RichTextHeading/RichTextHeading.tsx",
4507
- "summary": "Matches Figma \"Rich Text Heading\" (Marketing primitives set, 2 levels: H2, H3).",
4665
+ "summary": "A heading for rich-text content; `level` is \"h2\" or \"h3\" and sets the real HTML tag.",
4508
4666
  "props": [
4509
4667
  {
4510
4668
  "name": "level",
@@ -4514,8 +4672,7 @@
4514
4672
  "h2",
4515
4673
  "h3"
4516
4674
  ],
4517
- "default": "h2",
4518
- "description": "Figma Level axis. Defaults to \"h2\"."
4675
+ "default": "h2"
4519
4676
  },
4520
4677
  {
4521
4678
  "name": "className",
@@ -4526,15 +4683,15 @@
4526
4683
  "contract": {
4527
4684
  "requiredProps": [],
4528
4685
  "requiresAccessibleName": false
4529
- }
4686
+ },
4687
+ "since": "0.3.0"
4530
4688
  },
4531
4689
  {
4532
4690
  "name": "RichTextParagraph",
4533
4691
  "kind": "component",
4534
4692
  "category": "Marketing",
4535
4693
  "import": "@sakaniui/react",
4536
- "source": "src/components/MarketingComponents/RichTextParagraph/RichTextParagraph.tsx",
4537
- "summary": "Matches Figma \"Rich Text Paragraph\" (Marketing primitives set, 2 style previews: Default, With Link).",
4694
+ "summary": "A muted body paragraph for rich-text content; it can contain inline links.",
4538
4695
  "props": [
4539
4696
  {
4540
4697
  "name": "className",
@@ -4545,15 +4702,15 @@
4545
4702
  "contract": {
4546
4703
  "requiredProps": [],
4547
4704
  "requiresAccessibleName": false
4548
- }
4705
+ },
4706
+ "since": "0.3.0"
4549
4707
  },
4550
4708
  {
4551
4709
  "name": "SectionHeading",
4552
4710
  "kind": "component",
4553
4711
  "category": "Marketing",
4554
4712
  "import": "@sakaniui/react",
4555
- "source": "src/components/MarketingComponents/SectionHeading/SectionHeading.tsx",
4556
- "summary": "Matches Figma \"Section Heading\" (Marketing primitives set, 2 alignments: Center, Left). `align` stays a real, explicit prop (Figma's own axis) -- a genuine layout choice, not derivable from the heading's own content.",
4713
+ "summary": "A section heading with an optional eyebrow badge and subtitle; `align` is \"left\" or \"center\" and `titleAs` sets the heading tag.",
4557
4714
  "props": [
4558
4715
  {
4559
4716
  "name": "eyebrow",
@@ -4579,8 +4736,7 @@
4579
4736
  "left",
4580
4737
  "center"
4581
4738
  ],
4582
- "default": "center",
4583
- "description": "Figma Align axis. Defaults to \"center\"."
4739
+ "default": "center"
4584
4740
  },
4585
4741
  {
4586
4742
  "name": "titleAs",
@@ -4606,15 +4762,15 @@
4606
4762
  "title"
4607
4763
  ],
4608
4764
  "requiresAccessibleName": false
4609
- }
4765
+ },
4766
+ "since": "0.3.0"
4610
4767
  },
4611
4768
  {
4612
4769
  "name": "SegmentedControl",
4613
4770
  "kind": "component",
4614
4771
  "category": "Composite",
4615
4772
  "import": "@sakaniui/react",
4616
- "source": "src/components/SegmentedControl/SegmentedControl.tsx",
4617
- "summary": "iOS-style toggle group. Matches Figma \"Segmented Control\" (2-6 buttons). Figma spec: track bg/subtle, radius-lg, padding 4, gap 2; active segment bg/surface, radius-md, label/md fg/default; inactive fg/muted.",
4773
+ "summary": "An iOS-style toggle group (segmented control).",
4618
4774
  "props": [
4619
4775
  {
4620
4776
  "name": "options",
@@ -4653,15 +4809,15 @@
4653
4809
  "options"
4654
4810
  ],
4655
4811
  "requiresAccessibleName": false
4656
- }
4812
+ },
4813
+ "since": "0.1.0"
4657
4814
  },
4658
4815
  {
4659
4816
  "name": "Select",
4660
4817
  "kind": "component",
4661
4818
  "category": "Forms",
4662
4819
  "import": "@sakaniui/react",
4663
- "source": "src/components/Select/Select.tsx",
4664
- "summary": "Single-select dropdown. Matches the Figma \"Select\" component: Size (sm|md|lg) x State (Default|Open|Disabled|Filled), Title/Description toggles.",
4820
+ "summary": "Single-select dropdown.",
4665
4821
  "props": [
4666
4822
  {
4667
4823
  "name": "label",
@@ -4738,21 +4894,21 @@
4738
4894
  "options"
4739
4895
  ],
4740
4896
  "requiresAccessibleName": false
4741
- }
4897
+ },
4898
+ "since": "0.1.0"
4742
4899
  },
4743
4900
  {
4744
4901
  "name": "Sidebar",
4745
4902
  "kind": "component",
4746
4903
  "category": "Composite/Sidebar",
4747
4904
  "import": "@sakaniui/react",
4748
- "source": "src/components/Sidebar/Sidebar.tsx",
4749
4905
  "summary": "Sidebar (container)",
4750
4906
  "props": [
4751
4907
  {
4752
4908
  "name": "collapsed",
4753
4909
  "type": "boolean",
4754
4910
  "required": false,
4755
- "default": "false"
4911
+ "default": false
4756
4912
  },
4757
4913
  {
4758
4914
  "name": "className",
@@ -4763,28 +4919,28 @@
4763
4919
  "contract": {
4764
4920
  "requiredProps": [],
4765
4921
  "requiresAccessibleName": false
4766
- }
4922
+ },
4923
+ "since": "0.1.0"
4767
4924
  },
4768
4925
  {
4769
4926
  "name": "SidebarDivider",
4770
4927
  "kind": "component",
4771
4928
  "category": "Composite/Sidebar",
4772
4929
  "import": "@sakaniui/react",
4773
- "source": "src/components/SidebarDivider/SidebarDivider.tsx",
4774
- "summary": "Horizontal rule between sections. Matches Figma \"Sidebar Divider\": border/subtle, full width, small vertical margin.",
4930
+ "summary": "Horizontal rule between sections.",
4775
4931
  "props": [],
4776
4932
  "contract": {
4777
4933
  "requiredProps": [],
4778
4934
  "requiresAccessibleName": false
4779
- }
4935
+ },
4936
+ "since": "0.1.0"
4780
4937
  },
4781
4938
  {
4782
4939
  "name": "SidebarFooter",
4783
4940
  "kind": "component",
4784
4941
  "category": "Composite/Sidebar",
4785
4942
  "import": "@sakaniui/react",
4786
- "source": "src/components/SidebarFooter/SidebarFooter.tsx",
4787
- "summary": "Bottom user/actions area. Matches Figma \"Sidebar Footer\": Type (User | User + Menu | Actions) x Collapsed.",
4943
+ "summary": "Bottom user/actions area. The user avatar uses the system Avatar component.",
4788
4944
  "props": [
4789
4945
  {
4790
4946
  "name": "type",
@@ -4838,28 +4994,28 @@
4838
4994
  "contract": {
4839
4995
  "requiredProps": [],
4840
4996
  "requiresAccessibleName": false
4841
- }
4997
+ },
4998
+ "since": "0.1.0"
4842
4999
  },
4843
5000
  {
4844
5001
  "name": "SidebarGroupLabel",
4845
5002
  "kind": "component",
4846
5003
  "category": "Composite/Sidebar",
4847
5004
  "import": "@sakaniui/react",
4848
- "source": "src/components/SidebarGroupLabel/SidebarGroupLabel.tsx",
4849
- "summary": "Section heading. Matches Figma \"Sidebar Group Label\": padding 8/10/4, overline text style, fg/subtle, uppercase.",
5005
+ "summary": "Section heading.",
4850
5006
  "props": [],
4851
5007
  "contract": {
4852
5008
  "requiredProps": [],
4853
5009
  "requiresAccessibleName": false
4854
- }
5010
+ },
5011
+ "since": "0.1.0"
4855
5012
  },
4856
5013
  {
4857
5014
  "name": "SidebarHeader",
4858
5015
  "kind": "component",
4859
5016
  "category": "Composite/Sidebar",
4860
5017
  "import": "@sakaniui/react",
4861
- "source": "src/components/SidebarHeader/SidebarHeader.tsx",
4862
- "summary": "Matches Figma \"Sidebar Header\": Type (Brand | Workspace | Brand + Toggle) x Collapsed. Figma spec: padding 6/4, gap 10, title label/md-strong (fg/default), subtitle caption (fg/muted).",
5018
+ "summary": "The top of a sidebar: brand, workspace switcher or brand with a collapse toggle; supports a collapsed state.",
4863
5019
  "props": [
4864
5020
  {
4865
5021
  "name": "type",
@@ -4902,7 +5058,6 @@
4902
5058
  "name": "toggleIcon",
4903
5059
  "type": "IconComponent",
4904
5060
  "required": false,
4905
- "default": "createIcon(\"layout-sidebar-left-collapse\", [\"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12\",\"M9 4v16\",\"M15 10l-2 2l2 2\"])",
4906
5061
  "description": "Icon for the toggle button. Defaults to PanelLeftClose."
4907
5062
  }
4908
5063
  ],
@@ -4911,14 +5066,14 @@
4911
5066
  "title"
4912
5067
  ],
4913
5068
  "requiresAccessibleName": false
4914
- }
5069
+ },
5070
+ "since": "0.1.0"
4915
5071
  },
4916
5072
  {
4917
5073
  "name": "SidebarItem",
4918
5074
  "kind": "component",
4919
5075
  "category": "Composite/Sidebar",
4920
5076
  "import": "@sakaniui/react",
4921
- "source": "src/components/SidebarItem/SidebarItem.tsx",
4922
5077
  "summary": "Primary nav item.",
4923
5078
  "props": [
4924
5079
  {
@@ -4940,8 +5095,8 @@
4940
5095
  "name": "activeIndicator",
4941
5096
  "type": "boolean",
4942
5097
  "required": false,
4943
- "default": "true",
4944
- "description": "Only matters when `active`. true (default) = bg/surface card + shadow + left accent bar (\"Active - Indicator\"). false = flat bg/subtle tint, no bar, no shadow (\"Active - Default\"). Works the same collapsed or not — Figma now defines both flavors in both layouts."
5098
+ "default": true,
5099
+ "description": "Only matters when `active`. true (default) = bg/surface card + shadow + left accent bar (\"Active - Indicator\"). false = flat bg/subtle tint, no bar, no shadow (\"Active - Default\")."
4945
5100
  },
4946
5101
  {
4947
5102
  "name": "disabled",
@@ -4967,7 +5122,7 @@
4967
5122
  "name": "expanded",
4968
5123
  "type": "boolean",
4969
5124
  "required": false,
4970
- "description": "Only matters when `hasSubmenu`. Rotates the chevron 90° (pointing down) to show the section is open; the resting state points right, toward a closed section — matches Figma's collapsible \"Navigation group\" / \"Project group\" headers (node 2307:42338, e.g. 2308:18305 \"Projects\" expanded vs 2308:18387 \"Website refresh\" collapsed). Not a navigation disclosure like `active` — the caller owns the open/closed state and toggles this alongside conditionally rendering the children."
5125
+ "description": "Only matters when `hasSubmenu`. Not a navigation disclosure like `active` — the caller owns the open/closed state and toggles this alongside conditionally rendering the children."
4971
5126
  },
4972
5127
  {
4973
5128
  "name": "onClick",
@@ -4983,7 +5138,7 @@
4983
5138
  "name": "nativeTooltip",
4984
5139
  "type": "boolean",
4985
5140
  "required": false,
4986
- "default": "true",
5141
+ "default": true,
4987
5142
  "description": "Native title-attribute tooltip on collapse. Defaults to true; set false when the caller already wraps this in its own Tooltip component to avoid the two competing on hover."
4988
5143
  }
4989
5144
  ],
@@ -4992,15 +5147,15 @@
4992
5147
  "label"
4993
5148
  ],
4994
5149
  "requiresAccessibleName": false
4995
- }
5150
+ },
5151
+ "since": "0.1.0"
4996
5152
  },
4997
5153
  {
4998
5154
  "name": "SidebarPromo",
4999
5155
  "kind": "component",
5000
5156
  "category": "Composite/Sidebar",
5001
5157
  "import": "@sakaniui/react",
5002
- "source": "src/components/SidebarPromo/SidebarPromo.tsx",
5003
- "summary": "Upsell / announcement card. Matches Figma \"Sidebar Promo\": Type (Upgrade | Announcement).",
5158
+ "summary": "Upsell / announcement card.",
5004
5159
  "props": [
5005
5160
  {
5006
5161
  "name": "type",
@@ -5041,8 +5196,7 @@
5041
5196
  {
5042
5197
  "name": "icon",
5043
5198
  "type": "IconComponent",
5044
- "required": false,
5045
- "default": "createIcon(\"sparkles\", [\"M16 18a2 2 0 0 1 2 2a2 2 0 0 1 2 -2a2 2 0 0 1 -2 -2a2 2 0 0 1 -2 2m0 -12a2 2 0 0 1 2 2a2 2 0 0 1 2 -2a2 2 0 0 1 -2 -2a2 2 0 0 1 -2 2m-7 12a6 6 0 0 1 6 -6a6 6 0 0 1 -6 -6a6 6 0 0 1 -6 6a6 6 0 0 1 6 6\"])"
5199
+ "required": false
5046
5200
  }
5047
5201
  ],
5048
5202
  "contract": {
@@ -5050,15 +5204,15 @@
5050
5204
  "title"
5051
5205
  ],
5052
5206
  "requiresAccessibleName": false
5053
- }
5207
+ },
5208
+ "since": "0.1.0"
5054
5209
  },
5055
5210
  {
5056
5211
  "name": "SidebarSearch",
5057
5212
  "kind": "component",
5058
5213
  "category": "Composite/Sidebar",
5059
5214
  "import": "@sakaniui/react",
5060
- "source": "src/components/SidebarSearch/SidebarSearch.tsx",
5061
- "summary": "Matches Figma \"Sidebar Search\": Type (Field | Command) x Collapsed. Figma spec: 36px height, bg/subtle, border/subtle, radius-sm, padding 8/8/8/10, search icon (Lucide), placeholder body/sm fg/subtle.",
5215
+ "summary": "A sidebar search; `type` is \"field\" or \"command\" (shows a keyboard-shortcut hint), and it supports a collapsed state.",
5062
5216
  "props": [
5063
5217
  {
5064
5218
  "name": "type",
@@ -5100,15 +5254,15 @@
5100
5254
  "contract": {
5101
5255
  "requiredProps": [],
5102
5256
  "requiresAccessibleName": false
5103
- }
5257
+ },
5258
+ "since": "0.1.0"
5104
5259
  },
5105
5260
  {
5106
5261
  "name": "SidebarSubItem",
5107
5262
  "kind": "component",
5108
5263
  "category": "Composite/Sidebar",
5109
5264
  "import": "@sakaniui/react",
5110
- "source": "src/components/SidebarSubItem/SidebarSubItem.tsx",
5111
- "summary": "Nested nav item. Matches Figma \"Sidebar Sub Item\": State (Default|Hover|Active|Disabled). Figma spec: radius-sm, padding 0/10, label/sm. Default/Hover fg/muted, Active fg/default.",
5265
+ "summary": "A nested navigation item under a SidebarItem, with active and disabled states.",
5112
5266
  "props": [
5113
5267
  {
5114
5268
  "name": "label",
@@ -5141,15 +5295,15 @@
5141
5295
  "label"
5142
5296
  ],
5143
5297
  "requiresAccessibleName": false
5144
- }
5298
+ },
5299
+ "since": "0.1.0"
5145
5300
  },
5146
5301
  {
5147
5302
  "name": "SizeSelector",
5148
5303
  "kind": "component",
5149
5304
  "category": "E-commerce",
5150
5305
  "import": "@sakaniui/react",
5151
- "source": "src/components/ECommerceComponents/SizeSelector/SizeSelector.tsx",
5152
- "summary": "Matches Figma \"Size Selector\" (E-commerce set): a 40px label circle.",
5306
+ "summary": "A round size option with `selected` and `available` states.",
5153
5307
  "props": [
5154
5308
  {
5155
5309
  "name": "size",
@@ -5161,13 +5315,13 @@
5161
5315
  "name": "selected",
5162
5316
  "type": "boolean",
5163
5317
  "required": false,
5164
- "default": "false"
5318
+ "default": false
5165
5319
  },
5166
5320
  {
5167
5321
  "name": "available",
5168
5322
  "type": "boolean",
5169
5323
  "required": false,
5170
- "default": "true",
5324
+ "default": true,
5171
5325
  "description": "Defaults to true. False renders a disabled, unclickable button."
5172
5326
  },
5173
5327
  {
@@ -5186,14 +5340,14 @@
5186
5340
  "size"
5187
5341
  ],
5188
5342
  "requiresAccessibleName": false
5189
- }
5343
+ },
5344
+ "since": "0.3.0"
5190
5345
  },
5191
5346
  {
5192
5347
  "name": "Skeleton",
5193
5348
  "kind": "component",
5194
5349
  "category": "Core",
5195
5350
  "import": "@sakaniui/react",
5196
- "source": "src/components/Skeleton/Skeleton.tsx",
5197
5351
  "summary": "Placeholder loading shape — shimmer animation on a muted background. Use to represent content that is loading before data arrives.",
5198
5352
  "props": [
5199
5353
  {
@@ -5228,15 +5382,15 @@
5228
5382
  "contract": {
5229
5383
  "requiredProps": [],
5230
5384
  "requiresAccessibleName": false
5231
- }
5385
+ },
5386
+ "since": "0.1.0"
5232
5387
  },
5233
5388
  {
5234
5389
  "name": "Slider",
5235
5390
  "kind": "component",
5236
5391
  "category": "Forms",
5237
5392
  "import": "@sakaniui/react",
5238
- "source": "src/components/Slider/Slider.tsx",
5239
- "summary": "Range slider. Figma \"Slider\" is a single component; this implements a functional controlled/uncontrolled range input styled to the token system.",
5393
+ "summary": "Range slider.",
5240
5394
  "props": [
5241
5395
  {
5242
5396
  "name": "label",
@@ -5253,26 +5407,26 @@
5253
5407
  "name": "min",
5254
5408
  "type": "number",
5255
5409
  "required": false,
5256
- "default": "0"
5410
+ "default": 0
5257
5411
  },
5258
5412
  {
5259
5413
  "name": "max",
5260
5414
  "type": "number",
5261
5415
  "required": false,
5262
- "default": "100"
5416
+ "default": 100
5263
5417
  }
5264
5418
  ],
5265
5419
  "contract": {
5266
5420
  "requiredProps": [],
5267
5421
  "requiresAccessibleName": false
5268
- }
5422
+ },
5423
+ "since": "0.1.0"
5269
5424
  },
5270
5425
  {
5271
5426
  "name": "SpendingBalance",
5272
5427
  "kind": "component",
5273
5428
  "category": "Application",
5274
5429
  "import": "@sakaniui/react",
5275
- "source": "src/components/ApplicationComponents/SpendingBalance/SpendingBalance.tsx",
5276
5430
  "summary": "Amount spent against a limit, with a bar and a remaining/over-limit footer.",
5277
5431
  "props": [
5278
5432
  {
@@ -5295,7 +5449,6 @@
5295
5449
  "name": "formatAmount",
5296
5450
  "type": "((amount: number) => string)",
5297
5451
  "required": false,
5298
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })",
5299
5452
  "description": "Defaults to USD currency, 2 decimals (e.g. \"$1,240.00\")."
5300
5453
  },
5301
5454
  {
@@ -5310,14 +5463,14 @@
5310
5463
  "limit"
5311
5464
  ],
5312
5465
  "requiresAccessibleName": false
5313
- }
5466
+ },
5467
+ "since": "0.1.0"
5314
5468
  },
5315
5469
  {
5316
5470
  "name": "Spinner",
5317
5471
  "kind": "component",
5318
5472
  "category": "Core",
5319
5473
  "import": "@sakaniui/react",
5320
- "source": "src/components/Spinner/Spinner.tsx",
5321
5474
  "summary": "Animated loading indicator. Inherits currentColor so it works on any background. Use inside buttons (loading state) or as a standalone page/section loader.",
5322
5475
  "props": [
5323
5476
  {
@@ -5347,15 +5500,15 @@
5347
5500
  "contract": {
5348
5501
  "requiredProps": [],
5349
5502
  "requiresAccessibleName": false
5350
- }
5503
+ },
5504
+ "since": "0.1.0"
5351
5505
  },
5352
5506
  {
5353
5507
  "name": "StarRating",
5354
5508
  "kind": "component",
5355
5509
  "category": "E-commerce",
5356
5510
  "import": "@sakaniui/react",
5357
- "source": "src/components/ECommerceComponents/StarRating/StarRating.tsx",
5358
- "summary": "g.9 (2,300 reviews)\".",
5511
+ "summary": "Five stars with an optional numeric rating and review count (e.g. \"4.9 (2,300 reviews)\"); `showLabel` hides the text and `orientation` sets the layout.",
5359
5512
  "props": [
5360
5513
  {
5361
5514
  "name": "rating",
@@ -5372,7 +5525,7 @@
5372
5525
  "name": "showLabel",
5373
5526
  "type": "boolean",
5374
5527
  "required": false,
5375
- "default": "true",
5528
+ "default": true,
5376
5529
  "description": "Shows the numeric rating + review count text next to the stars. Defaults to true."
5377
5530
  },
5378
5531
  {
@@ -5385,13 +5538,12 @@
5385
5538
  "horizontal-reverse"
5386
5539
  ],
5387
5540
  "default": "horizontal",
5388
- "description": "Figma Orientation axis. Only meaningful while showLabel is true. Defaults to \"horizontal\"."
5541
+ "description": "Only meaningful while showLabel is true. Defaults to \"horizontal\"."
5389
5542
  },
5390
5543
  {
5391
5544
  "name": "formatReviewCount",
5392
5545
  "type": "((count: number) => string)",
5393
- "required": false,
5394
- "default": "(count: number) => count.toLocaleString('en-US')"
5546
+ "required": false
5395
5547
  },
5396
5548
  {
5397
5549
  "name": "className",
@@ -5404,15 +5556,15 @@
5404
5556
  "rating"
5405
5557
  ],
5406
5558
  "requiresAccessibleName": false
5407
- }
5559
+ },
5560
+ "since": "0.3.0"
5408
5561
  },
5409
5562
  {
5410
5563
  "name": "StatCard",
5411
5564
  "kind": "component",
5412
5565
  "category": "Composite",
5413
5566
  "import": "@sakaniui/react",
5414
- "source": "src/components/StatCard/StatCard.tsx",
5415
- "summary": "Dashboard metric card. Matches Figma \"Stat Card\": Style (Minimal | Icon | Featured) x Trend (Up | Down | Flat), with Icon / Menu / Trend / Sparkline toggles.",
5567
+ "summary": "Dashboard metric card.",
5416
5568
  "props": [
5417
5569
  {
5418
5570
  "name": "title",
@@ -5427,14 +5579,12 @@
5427
5579
  {
5428
5580
  "name": "description",
5429
5581
  "type": "string",
5430
- "required": false,
5431
- "description": "Supporting line under the delta (Figma: description)."
5582
+ "required": false
5432
5583
  },
5433
5584
  {
5434
5585
  "name": "sparkline",
5435
5586
  "type": "number[]",
5436
- "required": false,
5437
- "description": "Data points for the inline sparkline (Figma: Sparkline toggle)."
5587
+ "required": false
5438
5588
  },
5439
5589
  {
5440
5590
  "name": "delta",
@@ -5464,8 +5614,7 @@
5464
5614
  "danger",
5465
5615
  "neutral",
5466
5616
  "accent"
5467
- ],
5468
- "description": "Overrides the trend-derived badge color (e.g. a \"down\" delta that Figma still wants shown as warning, not danger, for a given card)."
5617
+ ]
5469
5618
  },
5470
5619
  {
5471
5620
  "name": "variant",
@@ -5507,15 +5656,15 @@
5507
5656
  "value"
5508
5657
  ],
5509
5658
  "requiresAccessibleName": false
5510
- }
5659
+ },
5660
+ "since": "0.1.0"
5511
5661
  },
5512
5662
  {
5513
5663
  "name": "Stepper",
5514
5664
  "kind": "component",
5515
5665
  "category": "Composite",
5516
5666
  "import": "@sakaniui/react",
5517
- "source": "src/components/Stepper/Stepper.tsx",
5518
- "summary": "Progress stepper. Matches Figma \"Stepper\" (Steps 2-6) + \"Stepper Step\" (Completed | Current | Upcoming).",
5667
+ "summary": "Progress stepper.",
5519
5668
  "props": [
5520
5669
  {
5521
5670
  "name": "steps",
@@ -5551,15 +5700,15 @@
5551
5700
  "current"
5552
5701
  ],
5553
5702
  "requiresAccessibleName": false
5554
- }
5703
+ },
5704
+ "since": "0.1.0"
5555
5705
  },
5556
5706
  {
5557
5707
  "name": "StepperStep",
5558
5708
  "kind": "component",
5559
5709
  "category": "Composite",
5560
5710
  "import": "@sakaniui/react",
5561
- "source": "src/components/Stepper/Stepper.tsx",
5562
- "summary": "Progress stepper. Matches Figma \"Stepper\" (Steps 2-6) + \"Stepper Step\" (Completed | Current | Upcoming).",
5711
+ "summary": "One step of a Stepper; `state` is \"completed\", \"current\" or \"upcoming\".",
5563
5712
  "props": [
5564
5713
  {
5565
5714
  "name": "index",
@@ -5600,7 +5749,7 @@
5600
5749
  "name": "delay",
5601
5750
  "type": "number",
5602
5751
  "required": false,
5603
- "default": "0",
5752
+ "default": 0,
5604
5753
  "description": "ms to wait before this step's state change plays (the stepper uses it to sequence a multi-step move)."
5605
5754
  },
5606
5755
  {
@@ -5617,15 +5766,15 @@
5617
5766
  "label"
5618
5767
  ],
5619
5768
  "requiresAccessibleName": false
5620
- }
5769
+ },
5770
+ "since": "0.1.0"
5621
5771
  },
5622
5772
  {
5623
5773
  "name": "StockMarket",
5624
5774
  "kind": "component",
5625
5775
  "category": "Application",
5626
5776
  "import": "@sakaniui/react",
5627
- "source": "src/components/ApplicationComponents/StockMarket/StockMarket.tsx",
5628
- "summary": "Matches Figma \"Stock Market\" -- its 3 style previews collapse to 2 real axes, both derived rather than manual props (same judgment applied throughout this Application set): Positive vs.",
5777
+ "summary": "A stock row or card: logo, symbol, name, price and change, with an optional chart and period label.",
5629
5778
  "props": [
5630
5779
  {
5631
5780
  "name": "logo",
@@ -5655,9 +5804,7 @@
5655
5804
  {
5656
5805
  "name": "formatAmount",
5657
5806
  "type": "((amount: number) => string)",
5658
- "required": false,
5659
- "default": "(amount: number) =>\n Math.abs(amount).toLocaleString('en-US', { style: 'currency', currency: 'USD' })",
5660
- "description": "Defaults to USD currency, 2 decimals."
5807
+ "required": false
5661
5808
  },
5662
5809
  {
5663
5810
  "name": "chart",
@@ -5691,15 +5838,15 @@
5691
5838
  "change"
5692
5839
  ],
5693
5840
  "requiresAccessibleName": false
5694
- }
5841
+ },
5842
+ "since": "0.1.0"
5695
5843
  },
5696
5844
  {
5697
5845
  "name": "StockStatus",
5698
5846
  "kind": "component",
5699
5847
  "category": "E-commerce",
5700
5848
  "import": "@sakaniui/react",
5701
- "source": "src/components/ECommerceComponents/StockStatus/StockStatus.tsx",
5702
- "summary": "Matches Figma \"Stock Status\" (E-commerce set): a subtle-emphasis Badge in success/warning/danger.",
5849
+ "summary": "A stock availability badge (success, warning or danger) derived from `quantity` and `lowStockThreshold`.",
5703
5850
  "props": [
5704
5851
  {
5705
5852
  "name": "quantity",
@@ -5710,7 +5857,7 @@
5710
5857
  "name": "lowStockThreshold",
5711
5858
  "type": "number",
5712
5859
  "required": false,
5713
- "default": "5",
5860
+ "default": 5,
5714
5861
  "description": "At or below this (and above 0), shows \"Only N left\" in warning. Defaults to 5."
5715
5862
  },
5716
5863
  {
@@ -5730,15 +5877,15 @@
5730
5877
  "quantity"
5731
5878
  ],
5732
5879
  "requiresAccessibleName": false
5733
- }
5880
+ },
5881
+ "since": "0.3.0"
5734
5882
  },
5735
5883
  {
5736
5884
  "name": "SubFeature",
5737
5885
  "kind": "component",
5738
5886
  "category": "Marketing",
5739
5887
  "import": "@sakaniui/react",
5740
- "source": "src/components/MarketingComponents/SubFeature/SubFeature.tsx",
5741
- "summary": "Matches Figma \"Sub Feature\" (Marketing primitives set, 2 independent axes: Layout (Horizontal/Vertical) x Left border (True/False)).",
5888
+ "summary": "A feature item with icon, title and description; `layout` is \"vertical\" or \"horizontal\" and `leftBorder` adds a rail.",
5742
5889
  "props": [
5743
5890
  {
5744
5891
  "name": "icon",
@@ -5763,15 +5910,13 @@
5763
5910
  "vertical",
5764
5911
  "horizontal"
5765
5912
  ],
5766
- "default": "horizontal",
5767
- "description": "Figma Layout axis. Defaults to \"horizontal\"."
5913
+ "default": "horizontal"
5768
5914
  },
5769
5915
  {
5770
5916
  "name": "leftBorder",
5771
5917
  "type": "boolean",
5772
5918
  "required": false,
5773
- "default": "false",
5774
- "description": "Figma \"Left border\" axis. Defaults to false."
5919
+ "default": false
5775
5920
  },
5776
5921
  {
5777
5922
  "name": "className",
@@ -5786,15 +5931,15 @@
5786
5931
  "description"
5787
5932
  ],
5788
5933
  "requiresAccessibleName": false
5789
- }
5934
+ },
5935
+ "since": "0.3.0"
5790
5936
  },
5791
5937
  {
5792
5938
  "name": "Switch",
5793
5939
  "kind": "component",
5794
5940
  "category": "Forms",
5795
5941
  "import": "@sakaniui/react",
5796
- "source": "src/components/Switch/Switch.tsx",
5797
- "summary": "Toggle switch. Matches Figma \"Switch\" set (SW axis): Off | On | Disabled. Track spec from Figma: 36x20, radius-full, bg/muted (off) / accent/default (on).",
5942
+ "summary": "Toggle switch.",
5798
5943
  "props": [
5799
5944
  {
5800
5945
  "name": "label",
@@ -5817,20 +5962,20 @@
5817
5962
  "stretch"
5818
5963
  ],
5819
5964
  "default": "default",
5820
- "description": "`stretch` adds a liquid motion: the thumb stretches as it travels, then settles to a circle. `default` is the plain switch. Figma: Switch, Type axis."
5965
+ "description": "`stretch` adds a liquid motion: the thumb stretches as it travels, then settles to a circle. `default` is the plain switch."
5821
5966
  }
5822
5967
  ],
5823
5968
  "contract": {
5824
5969
  "requiredProps": [],
5825
5970
  "requiresAccessibleName": false
5826
- }
5971
+ },
5972
+ "since": "0.1.0"
5827
5973
  },
5828
5974
  {
5829
5975
  "name": "Table",
5830
5976
  "kind": "component",
5831
5977
  "category": "Composite",
5832
5978
  "import": "@sakaniui/react",
5833
- "source": "src/components/Table/Table.tsx",
5834
5979
  "summary": "Data table.",
5835
5980
  "props": [
5836
5981
  {
@@ -5878,8 +6023,8 @@
5878
6023
  "name": "bordered",
5879
6024
  "type": "boolean",
5880
6025
  "required": false,
5881
- "default": "true",
5882
- "description": "Draws the table's own container border/radius. Defaults to true; set false when nesting inside a card that already has its own border (Figma: some Table instances sit borderless inside a Panel)."
6026
+ "default": true,
6027
+ "description": "Draws the table's own container border/radius."
5883
6028
  },
5884
6029
  {
5885
6030
  "name": "responsive",
@@ -5890,8 +6035,7 @@
5890
6035
  "stacked",
5891
6036
  "auto"
5892
6037
  ],
5893
- "default": "auto",
5894
- "description": "Matches Figma's \"Responsive\" variant (Default / Stacked). - 'auto' (default): renders as a normal table, and switches to the stacked card layout automatically below --bp-sm (640px). - 'default' / 'stacked': force one layout regardless of viewport — useful for Storybook, tests, or a deliberately narrow container."
6038
+ "default": "auto"
5895
6039
  },
5896
6040
  {
5897
6041
  "name": "className",
@@ -5905,15 +6049,15 @@
5905
6049
  "rows"
5906
6050
  ],
5907
6051
  "requiresAccessibleName": false
5908
- }
6052
+ },
6053
+ "since": "0.1.0"
5909
6054
  },
5910
6055
  {
5911
6056
  "name": "Tabs",
5912
6057
  "kind": "component",
5913
6058
  "category": "Composite",
5914
6059
  "import": "@sakaniui/react",
5915
- "source": "src/components/Tabs/Tabs.tsx",
5916
- "summary": "Horizontal tab navigation. Matches Figma \"Tabs\" set (2–6 tabs).",
6060
+ "summary": "Horizontal tab navigation.",
5917
6061
  "props": [
5918
6062
  {
5919
6063
  "name": "items",
@@ -5941,14 +6085,14 @@
5941
6085
  "name": "bordered",
5942
6086
  "type": "boolean",
5943
6087
  "required": false,
5944
- "default": "true",
6088
+ "default": true,
5945
6089
  "description": "Bottom border under the whole track. Defaults to true."
5946
6090
  },
5947
6091
  {
5948
6092
  "name": "fill",
5949
6093
  "type": "boolean",
5950
6094
  "required": false,
5951
- "default": "false",
6095
+ "default": false,
5952
6096
  "description": "Stretch every tab to share the row's width equally, like a segmented control, instead of each tab hugging its own label. Defaults to false."
5953
6097
  },
5954
6098
  {
@@ -5962,15 +6106,15 @@
5962
6106
  "items"
5963
6107
  ],
5964
6108
  "requiresAccessibleName": false
5965
- }
6109
+ },
6110
+ "since": "0.1.0"
5966
6111
  },
5967
6112
  {
5968
6113
  "name": "Tags",
5969
6114
  "kind": "component",
5970
6115
  "category": "Application",
5971
6116
  "import": "@sakaniui/react",
5972
- "source": "src/components/ApplicationComponents/Tags/Tags.tsx",
5973
- "summary": "Matches Figma \"Tags\" -- a wrapped row of pill tags.",
6117
+ "summary": "A wrapped row of pill tags. Passing `onRemove` makes every tag removable.",
5974
6118
  "props": [
5975
6119
  {
5976
6120
  "name": "tags",
@@ -5994,15 +6138,15 @@
5994
6138
  "tags"
5995
6139
  ],
5996
6140
  "requiresAccessibleName": false
5997
- }
6141
+ },
6142
+ "since": "0.1.0"
5998
6143
  },
5999
6144
  {
6000
6145
  "name": "TeamCard",
6001
6146
  "kind": "component",
6002
6147
  "category": "Marketing",
6003
6148
  "import": "@sakaniui/react",
6004
- "source": "src/components/MarketingComponents/TeamCard/TeamCard.tsx",
6005
- "summary": "Matches Figma \"Team Card\" (Marketing primitives set, 2 styles: Card, Card details).",
6149
+ "summary": "A team member card with photo, name, role, location and social links; passing `bio` switches to the detailed style.",
6006
6150
  "props": [
6007
6151
  {
6008
6152
  "name": "image",
@@ -6065,15 +6209,15 @@
6065
6209
  "location"
6066
6210
  ],
6067
6211
  "requiresAccessibleName": false
6068
- }
6212
+ },
6213
+ "since": "0.3.0"
6069
6214
  },
6070
6215
  {
6071
6216
  "name": "Textarea",
6072
6217
  "kind": "component",
6073
6218
  "category": "Forms",
6074
6219
  "import": "@sakaniui/react",
6075
- "source": "src/components/Textarea/Textarea.tsx",
6076
- "summary": "Multi-line text input. Matches Figma \"Textarea\" parent component: State (Default|Focus|Error|Disabled|Filled), Title/Description toggles.",
6220
+ "summary": "Multi-line text input.",
6077
6221
  "props": [
6078
6222
  {
6079
6223
  "name": "label",
@@ -6094,15 +6238,15 @@
6094
6238
  "contract": {
6095
6239
  "requiredProps": [],
6096
6240
  "requiresAccessibleName": false
6097
- }
6241
+ },
6242
+ "since": "0.1.0"
6098
6243
  },
6099
6244
  {
6100
6245
  "name": "Ticker",
6101
6246
  "kind": "component",
6102
6247
  "category": "Application",
6103
6248
  "import": "@sakaniui/react",
6104
- "source": "src/components/ApplicationComponents/Ticker/Ticker.tsx",
6105
- "summary": "Matches Figma \"Ticker\" -- a row of symbol/change pairs with fade-out edges.",
6249
+ "summary": "A scrolling row of symbol and change pairs with faded edges; pauses on hover and stops under prefers-reduced-motion.",
6106
6250
  "props": [
6107
6251
  {
6108
6252
  "name": "items",
@@ -6113,14 +6257,13 @@
6113
6257
  "name": "speed",
6114
6258
  "type": "number",
6115
6259
  "required": false,
6116
- "default": "40",
6260
+ "default": 40,
6117
6261
  "description": "Scroll speed in pixels/second. Defaults to 40."
6118
6262
  },
6119
6263
  {
6120
6264
  "name": "formatChange",
6121
6265
  "type": "((changePercent: number) => string)",
6122
- "required": false,
6123
- "default": "(changePercent: number) =>\n `${changePercent >= 0 ? '+' : ''}${changePercent}%`"
6266
+ "required": false
6124
6267
  },
6125
6268
  {
6126
6269
  "name": "className",
@@ -6133,15 +6276,15 @@
6133
6276
  "items"
6134
6277
  ],
6135
6278
  "requiresAccessibleName": false
6136
- }
6279
+ },
6280
+ "since": "0.1.0"
6137
6281
  },
6138
6282
  {
6139
6283
  "name": "Toast",
6140
6284
  "kind": "component",
6141
6285
  "category": "Composite",
6142
6286
  "import": "@sakaniui/react",
6143
- "source": "src/components/Toast/Toast.tsx",
6144
- "summary": "Transient notification. Matches Figma \"Toast\" set: Status (Success|Error|Info), Title/Description toggles.",
6287
+ "summary": "Transient notification.",
6145
6288
  "props": [
6146
6289
  {
6147
6290
  "name": "status",
@@ -6152,8 +6295,7 @@
6152
6295
  "success",
6153
6296
  "error"
6154
6297
  ],
6155
- "default": "info",
6156
- "description": "Figma Status axis. Defaults to \"info\"."
6298
+ "default": "info"
6157
6299
  },
6158
6300
  {
6159
6301
  "name": "title",
@@ -6180,27 +6322,25 @@
6180
6322
  "contract": {
6181
6323
  "requiredProps": [],
6182
6324
  "requiresAccessibleName": false
6183
- }
6325
+ },
6326
+ "since": "0.1.0"
6184
6327
  },
6185
6328
  {
6186
6329
  "name": "Tooltip",
6187
6330
  "kind": "component",
6188
6331
  "category": "Core",
6189
6332
  "import": "@sakaniui/react",
6190
- "source": "src/components/Tooltip/Tooltip.tsx",
6191
6333
  "summary": "Hover/focus tooltip with a title, optional subtitle, a caret (tail), and 8 pointer positions.",
6192
6334
  "props": [
6193
6335
  {
6194
6336
  "name": "title",
6195
6337
  "type": "string",
6196
- "required": true,
6197
- "description": "Tooltip title (Figma: Title)."
6338
+ "required": true
6198
6339
  },
6199
6340
  {
6200
6341
  "name": "subtitle",
6201
6342
  "type": "string",
6202
- "required": false,
6203
- "description": "Optional supporting line (Figma: Subtitle)."
6343
+ "required": false
6204
6344
  },
6205
6345
  {
6206
6346
  "name": "pointer",
@@ -6217,7 +6357,7 @@
6217
6357
  "center-right"
6218
6358
  ],
6219
6359
  "default": "top-center",
6220
- "description": "Pointer position. Maps to Figma Pointer axis. Defaults to \"top-center\"."
6360
+ "description": "Pointer position. Defaults to \"top-center\"."
6221
6361
  },
6222
6362
  {
6223
6363
  "name": "children",
@@ -6237,15 +6377,15 @@
6237
6377
  "children"
6238
6378
  ],
6239
6379
  "requiresAccessibleName": false
6240
- }
6380
+ },
6381
+ "since": "0.1.0"
6241
6382
  },
6242
6383
  {
6243
6384
  "name": "TopBar",
6244
6385
  "kind": "component",
6245
6386
  "category": "Navigation",
6246
6387
  "import": "@sakaniui/react",
6247
- "source": "src/components/TopBar/TopBar.tsx",
6248
- "summary": "Application top bar — sits beside the Sidebar (1440 − 248 = 1192 default, but stretches to fill).",
6388
+ "summary": "The application top bar, placed beside the Sidebar; `type` is \"search\", \"minimal\", \"breadcrumb\", \"tabs\" or \"chat\", and `density` is \"sm\" or \"md\".",
6249
6389
  "props": [
6250
6390
  {
6251
6391
  "name": "type",
@@ -6280,7 +6420,7 @@
6280
6420
  "name": "showToggle",
6281
6421
  "type": "boolean",
6282
6422
  "required": false,
6283
- "default": "true",
6423
+ "default": true,
6284
6424
  "description": "Show the sidebar toggle. Defaults to true."
6285
6425
  },
6286
6426
  {
@@ -6292,28 +6432,27 @@
6292
6432
  "name": "toggleIcon",
6293
6433
  "type": "IconComponent",
6294
6434
  "required": false,
6295
- "default": "createIcon(\"layout-sidebar\", [\"M4 6a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12\",\"M9 4l0 16\"])",
6296
6435
  "description": "Icon for the sidebar toggle button. Defaults to PanelLeft."
6297
6436
  },
6298
6437
  {
6299
6438
  "name": "showActions",
6300
6439
  "type": "boolean",
6301
6440
  "required": false,
6302
- "default": "true",
6441
+ "default": true,
6303
6442
  "description": "Show help + notification icons. Defaults to true."
6304
6443
  },
6305
6444
  {
6306
6445
  "name": "showHelp",
6307
6446
  "type": "boolean",
6308
6447
  "required": false,
6309
- "default": "true",
6448
+ "default": true,
6310
6449
  "description": "Show the help icon within the actions group. Defaults to true."
6311
6450
  },
6312
6451
  {
6313
6452
  "name": "hasUnread",
6314
6453
  "type": "boolean",
6315
6454
  "required": false,
6316
- "default": "false"
6455
+ "default": false
6317
6456
  },
6318
6457
  {
6319
6458
  "name": "rightSlot",
@@ -6331,7 +6470,7 @@
6331
6470
  "name": "accountOpen",
6332
6471
  "type": "boolean",
6333
6472
  "required": false,
6334
- "default": "false",
6473
+ "default": false,
6335
6474
  "description": "Flips the account chevron when the menu it opens is open. Defaults to false."
6336
6475
  },
6337
6476
  {
@@ -6367,14 +6506,14 @@
6367
6506
  "contract": {
6368
6507
  "requiredProps": [],
6369
6508
  "requiresAccessibleName": false
6370
- }
6509
+ },
6510
+ "since": "0.1.0"
6371
6511
  },
6372
6512
  {
6373
6513
  "name": "TopBarMobile",
6374
6514
  "kind": "component",
6375
6515
  "category": "Navigation",
6376
6516
  "import": "@sakaniui/react",
6377
- "source": "src/components/TopBarMobile/TopBarMobile.tsx",
6378
6517
  "summary": "Mobile app bar (390×56).",
6379
6518
  "props": [
6380
6519
  {
@@ -6430,15 +6569,15 @@
6430
6569
  "contract": {
6431
6570
  "requiredProps": [],
6432
6571
  "requiresAccessibleName": false
6433
- }
6572
+ },
6573
+ "since": "0.1.0"
6434
6574
  },
6435
6575
  {
6436
6576
  "name": "Transactions",
6437
6577
  "kind": "component",
6438
6578
  "category": "Application",
6439
6579
  "import": "@sakaniui/react",
6440
- "source": "src/components/ApplicationComponents/Transactions/Transactions.tsx",
6441
- "summary": "Matches Figma \"Transactions\" -- both style previews collapse to one derived axis, same judgment applied throughout this Application set: the Empty state renders whenever `transactions` is empty, rather than a separate manual prop that could disagree with th...",
6580
+ "summary": "A list of transactions; shows an empty state when `transactions` is empty.",
6442
6581
  "props": [
6443
6582
  {
6444
6583
  "name": "transactions",
@@ -6448,8 +6587,7 @@
6448
6587
  {
6449
6588
  "name": "formatAmount",
6450
6589
  "type": "((amount: number) => string)",
6451
- "required": false,
6452
- "default": "(amount: number) =>\n `${amount >= 0 ? '+' : '-'}${Math.abs(amount).toLocaleString('en-US', { style: 'currency', currency: 'USD' })}`"
6590
+ "required": false
6453
6591
  },
6454
6592
  {
6455
6593
  "name": "emptyTitle",
@@ -6474,21 +6612,21 @@
6474
6612
  "transactions"
6475
6613
  ],
6476
6614
  "requiresAccessibleName": false
6477
- }
6615
+ },
6616
+ "since": "0.1.0"
6478
6617
  },
6479
6618
  {
6480
6619
  "name": "WishlistButton",
6481
6620
  "kind": "component",
6482
6621
  "category": "E-commerce",
6483
6622
  "import": "@sakaniui/react",
6484
- "source": "src/components/ECommerceComponents/WishlistButton/WishlistButton.tsx",
6485
- "summary": "Matches Figma \"Wishlist Button\" (E-commerce set): a 36px bg/surface square, radius-md, shadow-xs, no border.",
6623
+ "summary": "A square heart toggle for saving a product; `saved` fills the heart.",
6486
6624
  "props": [
6487
6625
  {
6488
6626
  "name": "saved",
6489
6627
  "type": "boolean",
6490
6628
  "required": false,
6491
- "default": "false"
6629
+ "default": false
6492
6630
  },
6493
6631
  {
6494
6632
  "name": "onToggle",
@@ -6511,35 +6649,35 @@
6511
6649
  "contract": {
6512
6650
  "requiredProps": [],
6513
6651
  "requiresAccessibleName": false
6514
- }
6652
+ },
6653
+ "since": "0.3.0"
6515
6654
  },
6516
6655
  {
6517
6656
  "name": "XIcon",
6518
6657
  "kind": "component",
6519
6658
  "category": "Marketing",
6520
6659
  "import": "@sakaniui/react",
6521
- "source": "src/components/MarketingComponents/ProfileCard/SocialIcons.tsx",
6522
- "summary": "svg) -- lucide-react ships no brand/logo icons in the version this library uses.",
6660
+ "summary": "X (Twitter) brand mark drawn in currentColor, for social links.",
6523
6661
  "props": [
6524
6662
  {
6525
6663
  "name": "size",
6526
6664
  "type": "number",
6527
6665
  "required": false,
6528
- "default": "16"
6666
+ "default": 16
6529
6667
  }
6530
6668
  ],
6531
6669
  "contract": {
6532
6670
  "requiredProps": [],
6533
6671
  "requiresAccessibleName": false
6534
- }
6672
+ },
6673
+ "since": "0.3.0"
6535
6674
  },
6536
6675
  {
6537
6676
  "name": "AccountOverviewBlock",
6538
6677
  "kind": "block",
6539
6678
  "category": "Blocks/Application",
6540
6679
  "import": "@sakaniui/react/blocks",
6541
- "source": "src/blocks/AccountOverviewBlock/AccountOverviewBlock.tsx",
6542
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
6680
+ "summary": "Account Overview block (Application): a composition example. Copy it into your project and edit it.",
6543
6681
  "props": [
6544
6682
  {
6545
6683
  "name": "state",
@@ -6560,15 +6698,15 @@
6560
6698
  "contract": {
6561
6699
  "requiredProps": [],
6562
6700
  "requiresAccessibleName": false
6563
- }
6701
+ },
6702
+ "since": "0.1.0"
6564
6703
  },
6565
6704
  {
6566
6705
  "name": "ActivityLogBlock",
6567
6706
  "kind": "block",
6568
6707
  "category": "Blocks/Application",
6569
6708
  "import": "@sakaniui/react/blocks",
6570
- "source": "src/blocks/ActivityLogBlock/ActivityLogBlock.tsx",
6571
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
6709
+ "summary": "Activity Log block (Application): a composition example. Copy it into your project and edit it.",
6572
6710
  "props": [
6573
6711
  {
6574
6712
  "name": "state",
@@ -6589,15 +6727,15 @@
6589
6727
  "contract": {
6590
6728
  "requiredProps": [],
6591
6729
  "requiresAccessibleName": false
6592
- }
6730
+ },
6731
+ "since": "0.1.0"
6593
6732
  },
6594
6733
  {
6595
6734
  "name": "AddCardFormBlock",
6596
6735
  "kind": "block",
6597
6736
  "category": "Blocks/Billing",
6598
6737
  "import": "@sakaniui/react/blocks",
6599
- "source": "src/blocks/Billing/AddCardFormBlock/AddCardFormBlock.tsx",
6600
- "summary": "A COMPOSITION EXAMPLE, not a configurable component.) in place of the simulated one here -- a real integration should never send a raw PAN/CVC to your own backend at all.",
6738
+ "summary": "Add Card Form block (Billing): a composition example. Copy it into your project and edit it.",
6601
6739
  "props": [
6602
6740
  {
6603
6741
  "name": "initialValue",
@@ -6631,15 +6769,15 @@
6631
6769
  "contract": {
6632
6770
  "requiredProps": [],
6633
6771
  "requiresAccessibleName": false
6634
- }
6772
+ },
6773
+ "since": "0.3.0"
6635
6774
  },
6636
6775
  {
6637
6776
  "name": "AppHeaderBlock",
6638
6777
  "kind": "block",
6639
6778
  "category": "Blocks/Application",
6640
6779
  "import": "@sakaniui/react/blocks",
6641
- "source": "src/blocks/AppHeaderBlock/AppHeaderBlock.tsx",
6642
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
6780
+ "summary": "App Header block (Application): a composition example. Copy it into your project and edit it.",
6643
6781
  "props": [
6644
6782
  {
6645
6783
  "name": "breadcrumbs",
@@ -6674,27 +6812,25 @@
6674
6812
  "title"
6675
6813
  ],
6676
6814
  "requiresAccessibleName": false
6677
- }
6815
+ },
6816
+ "since": "0.1.0"
6678
6817
  },
6679
6818
  {
6680
6819
  "name": "BillingAddressBlock",
6681
6820
  "kind": "block",
6682
6821
  "category": "Blocks/Billing",
6683
6822
  "import": "@sakaniui/react/blocks",
6684
- "source": "src/blocks/Billing/BillingAddressBlock/BillingAddressBlock.tsx",
6685
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onSave` to your real API call in place of the simulated one here.",
6823
+ "summary": "Billing Address block (Billing): a composition example. Copy it into your project and edit it.",
6686
6824
  "props": [
6687
6825
  {
6688
6826
  "name": "initialValue",
6689
6827
  "type": "Partial<BillingAddressValue>",
6690
- "required": false,
6691
- "description": "Seeds the fields -- presence/absence is what distinguishes Figma's own Default vs. Filled previews."
6828
+ "required": false
6692
6829
  },
6693
6830
  {
6694
6831
  "name": "countries",
6695
6832
  "type": "SelectOption[]",
6696
- "required": false,
6697
- "default": "[\n { label: '🇳🇬 Nigeria', value: 'NG' },\n { label: '🇺🇸 United States', value: 'US' },\n { label: '🇬🇧 United Kingdom', value: 'GB' },\n { label: '🇰🇪 Kenya', value: 'KE' },\n { label: '🇿🇦 South Africa', value: 'ZA' },\n]"
6833
+ "required": false
6698
6834
  },
6699
6835
  {
6700
6836
  "name": "initialStatus",
@@ -6723,15 +6859,15 @@
6723
6859
  "contract": {
6724
6860
  "requiredProps": [],
6725
6861
  "requiresAccessibleName": false
6726
- }
6862
+ },
6863
+ "since": "0.3.0"
6727
6864
  },
6728
6865
  {
6729
6866
  "name": "BillingHistoryBlock",
6730
6867
  "kind": "block",
6731
6868
  "category": "Blocks/Billing",
6732
6869
  "import": "@sakaniui/react/blocks",
6733
- "source": "src/blocks/Billing/BillingHistoryBlock/BillingHistoryBlock.tsx",
6734
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onDownload` to your real invoice PDF endpoint in place of the callback here.",
6870
+ "summary": "Billing History block (Billing): a composition example. Copy it into your project and edit it.",
6735
6871
  "props": [
6736
6872
  {
6737
6873
  "name": "invoices",
@@ -6743,7 +6879,7 @@
6743
6879
  "name": "loading",
6744
6880
  "type": "boolean",
6745
6881
  "required": false,
6746
- "default": "false",
6882
+ "default": false,
6747
6883
  "description": "Shows the Skeleton loading state in place of `invoices` -- unlike Empty (derived from `invoices.length === 0`), there's no data yet at this point to derive it from."
6748
6884
  },
6749
6885
  {
@@ -6755,15 +6891,15 @@
6755
6891
  "contract": {
6756
6892
  "requiredProps": [],
6757
6893
  "requiresAccessibleName": false
6758
- }
6894
+ },
6895
+ "since": "0.3.0"
6759
6896
  },
6760
6897
  {
6761
6898
  "name": "BlogListingBlock",
6762
6899
  "kind": "block",
6763
6900
  "category": "Blocks/Marketing",
6764
6901
  "import": "@sakaniui/react/blocks",
6765
- "source": "src/blocks/BlogListingBlock/BlogListingBlock.tsx",
6766
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire \"Read article\"/card clicks to your real routing in place of the callbacks here.",
6902
+ "summary": "Blog Listing block (Marketing): a composition example. Copy it into your project and edit it.",
6767
6903
  "props": [
6768
6904
  {
6769
6905
  "name": "eyebrow",
@@ -6805,15 +6941,15 @@
6805
6941
  "posts"
6806
6942
  ],
6807
6943
  "requiresAccessibleName": false
6808
- }
6944
+ },
6945
+ "since": "0.3.0"
6809
6946
  },
6810
6947
  {
6811
6948
  "name": "CareersBlock",
6812
6949
  "kind": "block",
6813
6950
  "category": "Blocks/Marketing",
6814
6951
  "import": "@sakaniui/react/blocks",
6815
- "source": "src/blocks/CareersBlock/CareersBlock.tsx",
6816
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire \"Apply now\" to your real ATS/ application flow in place of the callback here.",
6952
+ "summary": "Careers block (Marketing): a composition example. Copy it into your project and edit it.",
6817
6953
  "props": [
6818
6954
  {
6819
6955
  "name": "eyebrow",
@@ -6849,15 +6985,15 @@
6849
6985
  "jobs"
6850
6986
  ],
6851
6987
  "requiresAccessibleName": false
6852
- }
6988
+ },
6989
+ "since": "0.3.0"
6853
6990
  },
6854
6991
  {
6855
6992
  "name": "ChatInterfaceBlock",
6856
6993
  "kind": "block",
6857
6994
  "category": "Blocks/Chat",
6858
6995
  "import": "@sakaniui/react/blocks",
6859
- "source": "src/blocks/ChatInterfaceBlock/ChatInterfaceBlock.tsx",
6860
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file and edit it: change the nav groups, swap the conversations, edit the thread.",
6996
+ "summary": "Chat Interface block (Chat): a composition example. Copy it into your project and edit it.",
6861
6997
  "props": [
6862
6998
  {
6863
6999
  "name": "state",
@@ -6879,15 +7015,15 @@
6879
7015
  "contract": {
6880
7016
  "requiredProps": [],
6881
7017
  "requiresAccessibleName": false
6882
- }
7018
+ },
7019
+ "since": "0.1.0"
6883
7020
  },
6884
7021
  {
6885
7022
  "name": "CheckoutFlowBlock",
6886
7023
  "kind": "block",
6887
7024
  "category": "Blocks/E-commerce",
6888
7025
  "import": "@sakaniui/react/blocks",
6889
- "source": "src/blocks/CheckoutFlowBlock/CheckoutFlowBlock.tsx",
6890
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire the form submissions to your real shipping/payment APIs in place of the simulated flow here.",
7026
+ "summary": "Checkout Flow block (E-commerce): a composition example. Copy it into your project and edit it.",
6891
7027
  "props": [
6892
7028
  {
6893
7029
  "name": "items",
@@ -6898,8 +7034,7 @@
6898
7034
  "name": "shippingCost",
6899
7035
  "type": "number",
6900
7036
  "required": false,
6901
- "default": "0",
6902
- "description": "0 (default) renders \"Free\" in the summary, matching Figma."
7037
+ "default": 0
6903
7038
  },
6904
7039
  {
6905
7040
  "name": "initialStep",
@@ -6919,8 +7054,7 @@
6919
7054
  {
6920
7055
  "name": "formatPrice",
6921
7056
  "type": "((amount: number) => string)",
6922
- "required": false,
6923
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
7057
+ "required": false
6924
7058
  },
6925
7059
  {
6926
7060
  "name": "className",
@@ -6933,15 +7067,15 @@
6933
7067
  "items"
6934
7068
  ],
6935
7069
  "requiresAccessibleName": false
6936
- }
7070
+ },
7071
+ "since": "0.3.0"
6937
7072
  },
6938
7073
  {
6939
7074
  "name": "CRMDashboardBlock",
6940
7075
  "kind": "block",
6941
7076
  "category": "Blocks/Application",
6942
7077
  "import": "@sakaniui/react/blocks",
6943
- "source": "src/blocks/CRMDashboardBlock/CRMDashboardBlock.tsx",
6944
- "summary": "A full-page CRM leads view assembled entirely from Sakani components: Sidebar (icon rail) · TopBar · Breadcrumb · Tabs · Checkbox · Select · Slider · Input · FilterChip · Button · Table · Pagination · Badge · Avatar.",
7078
+ "summary": "CRM Dashboard block (Application): a composition example. Copy it into your project and edit it.",
6945
7079
  "props": [
6946
7080
  {
6947
7081
  "name": "className",
@@ -6958,15 +7092,15 @@
6958
7092
  "contract": {
6959
7093
  "requiredProps": [],
6960
7094
  "requiresAccessibleName": false
6961
- }
7095
+ },
7096
+ "since": "0.1.0"
6962
7097
  },
6963
7098
  {
6964
7099
  "name": "CtaBannerBlock",
6965
7100
  "kind": "block",
6966
7101
  "category": "Blocks/Marketing",
6967
7102
  "import": "@sakaniui/react/blocks",
6968
- "source": "src/blocks/CtaBannerBlock/CtaBannerBlock.tsx",
6969
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire the two actions to your real signup/repo links in place of the callbacks here.",
7103
+ "summary": "Cta Banner block (Marketing): a composition example. Copy it into your project and edit it.",
6970
7104
  "props": [
6971
7105
  {
6972
7106
  "name": "title",
@@ -6992,7 +7126,7 @@
6992
7126
  "name": "secondaryActionIcon",
6993
7127
  "type": "boolean",
6994
7128
  "required": false,
6995
- "default": "false",
7129
+ "default": false,
6996
7130
  "description": "Shows the GitHub icon before the secondary action's label."
6997
7131
  },
6998
7132
  {
@@ -7003,8 +7137,7 @@
7003
7137
  "neutral",
7004
7138
  "accent"
7005
7139
  ],
7006
- "default": "neutral",
7007
- "description": "Figma Style axis (renamed to avoid colliding with the DOM `style` prop). Defaults to \"neutral\"."
7140
+ "default": "neutral"
7008
7141
  },
7009
7142
  {
7010
7143
  "name": "className",
@@ -7019,15 +7152,15 @@
7019
7152
  "primaryAction"
7020
7153
  ],
7021
7154
  "requiresAccessibleName": false
7022
- }
7155
+ },
7156
+ "since": "0.3.0"
7023
7157
  },
7024
7158
  {
7025
7159
  "name": "CurrentPlanBlock",
7026
7160
  "kind": "block",
7027
7161
  "category": "Blocks/Billing",
7028
7162
  "import": "@sakaniui/react/blocks",
7029
- "source": "src/blocks/Billing/CurrentPlanBlock/CurrentPlanBlock.tsx",
7030
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire the action callbacks to your real subscription-management API in place of the ones here.",
7163
+ "summary": "Current Plan block (Billing): a composition example. Copy it into your project and edit it.",
7031
7164
  "props": [
7032
7165
  {
7033
7166
  "name": "planName",
@@ -7064,8 +7197,7 @@
7064
7197
  "name": "usageLabel",
7065
7198
  "type": "string",
7066
7199
  "required": false,
7067
- "default": "Projects used",
7068
- "description": "Usage row -- shown only in the \"active\" status, matching Figma."
7200
+ "default": "Projects used"
7069
7201
  },
7070
7202
  {
7071
7203
  "name": "usageValue",
@@ -7076,7 +7208,7 @@
7076
7208
  "name": "usagePercent",
7077
7209
  "type": "number",
7078
7210
  "required": false,
7079
- "default": "0",
7211
+ "default": 0,
7080
7212
  "description": "0–100, drives the Progress bar."
7081
7213
  },
7082
7214
  {
@@ -7114,7 +7246,7 @@
7114
7246
  "name": "loading",
7115
7247
  "type": "boolean",
7116
7248
  "required": false,
7117
- "default": "false",
7249
+ "default": false,
7118
7250
  "description": "Shows the Skeleton loading state in place of everything else -- there's no plan data yet at this point to derive a status from."
7119
7251
  },
7120
7252
  {
@@ -7129,15 +7261,15 @@
7129
7261
  "price"
7130
7262
  ],
7131
7263
  "requiresAccessibleName": false
7132
- }
7264
+ },
7265
+ "since": "0.3.0"
7133
7266
  },
7134
7267
  {
7135
7268
  "name": "DataTableBlock",
7136
7269
  "kind": "block",
7137
7270
  "category": "Blocks/Application",
7138
7271
  "import": "@sakaniui/react/blocks",
7139
- "source": "src/blocks/DataTableBlock/DataTableBlock.tsx",
7140
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: swap the sample data for your own, change the columns, add or remove toolbar controls.",
7272
+ "summary": "Data Table block (Application): a composition example. Copy it into your project and edit it.",
7141
7273
  "props": [
7142
7274
  {
7143
7275
  "name": "state",
@@ -7168,21 +7300,21 @@
7168
7300
  "contract": {
7169
7301
  "requiredProps": [],
7170
7302
  "requiresAccessibleName": false
7171
- }
7303
+ },
7304
+ "since": "0.1.0"
7172
7305
  },
7173
7306
  {
7174
7307
  "name": "EmailVerificationBlock",
7175
7308
  "kind": "block",
7176
7309
  "category": "Blocks/Authentication",
7177
7310
  "import": "@sakaniui/react/blocks",
7178
- "source": "src/blocks/EmailVerificationBlock/EmailVerificationBlock.tsx",
7179
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onVerify`/`onResend` to your real API calls in place of the simulated ones here.",
7311
+ "summary": "Email Verification block (Authentication): a composition example. Copy it into your project and edit it.",
7180
7312
  "props": [
7181
7313
  {
7182
7314
  "name": "email",
7183
7315
  "type": "string",
7184
7316
  "required": false,
7185
- "default": "sam@sakani.com"
7317
+ "default": "<email>"
7186
7318
  },
7187
7319
  {
7188
7320
  "name": "initialStatus",
@@ -7218,15 +7350,15 @@
7218
7350
  "contract": {
7219
7351
  "requiredProps": [],
7220
7352
  "requiresAccessibleName": false
7221
- }
7353
+ },
7354
+ "since": "0.3.0"
7222
7355
  },
7223
7356
  {
7224
7357
  "name": "FaqBlock",
7225
7358
  "kind": "block",
7226
7359
  "category": "Blocks/Marketing",
7227
7360
  "import": "@sakaniui/react/blocks",
7228
- "source": "src/blocks/FaqBlock/FaqBlock.tsx",
7229
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7361
+ "summary": "Faq block (Marketing): a composition example. Copy it into your project and edit it.",
7230
7362
  "props": [
7231
7363
  {
7232
7364
  "name": "eyebrow",
@@ -7246,14 +7378,13 @@
7246
7378
  },
7247
7379
  {
7248
7380
  "name": "columns",
7249
- "type": "\"1\" | \"2\"",
7381
+ "type": "1 | 2",
7250
7382
  "required": false,
7251
7383
  "values": [
7252
- "1",
7253
- "2"
7384
+ 1,
7385
+ 2
7254
7386
  ],
7255
- "default": "1",
7256
- "description": "Figma Layout axis: 1 = Single, 2 = Two-Column. Defaults to 1."
7387
+ "default": 1
7257
7388
  },
7258
7389
  {
7259
7390
  "name": "className",
@@ -7267,15 +7398,15 @@
7267
7398
  "items"
7268
7399
  ],
7269
7400
  "requiresAccessibleName": false
7270
- }
7401
+ },
7402
+ "since": "0.3.0"
7271
7403
  },
7272
7404
  {
7273
7405
  "name": "FeatureGridBlock",
7274
7406
  "kind": "block",
7275
7407
  "category": "Blocks/Marketing",
7276
7408
  "import": "@sakaniui/react/blocks",
7277
- "source": "src/blocks/FeatureGridBlock/FeatureGridBlock.tsx",
7278
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7409
+ "summary": "Feature Grid block (Marketing): a composition example. Copy it into your project and edit it.",
7279
7410
  "props": [
7280
7411
  {
7281
7412
  "name": "features",
@@ -7286,7 +7417,7 @@
7286
7417
  "name": "columns",
7287
7418
  "type": "number",
7288
7419
  "required": false,
7289
- "description": "Number of columns. Defaults to `features.length` (Figma's own examples never wrap)."
7420
+ "description": "Number of columns."
7290
7421
  },
7291
7422
  {
7292
7423
  "name": "className",
@@ -7299,15 +7430,15 @@
7299
7430
  "features"
7300
7431
  ],
7301
7432
  "requiresAccessibleName": false
7302
- }
7433
+ },
7434
+ "since": "0.3.0"
7303
7435
  },
7304
7436
  {
7305
7437
  "name": "FileUploadPanelBlock",
7306
7438
  "kind": "block",
7307
7439
  "category": "Blocks/Application",
7308
7440
  "import": "@sakaniui/react/blocks",
7309
- "source": "src/blocks/FileUploadPanelBlock/FileUploadPanelBlock.tsx",
7310
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7441
+ "summary": "File Upload Panel block (Application): a composition example. Copy it into your project and edit it.",
7311
7442
  "props": [
7312
7443
  {
7313
7444
  "name": "state",
@@ -7329,15 +7460,15 @@
7329
7460
  "contract": {
7330
7461
  "requiredProps": [],
7331
7462
  "requiresAccessibleName": false
7332
- }
7463
+ },
7464
+ "since": "0.1.0"
7333
7465
  },
7334
7466
  {
7335
7467
  "name": "ForgotPasswordBlock",
7336
7468
  "kind": "block",
7337
7469
  "category": "Blocks/Authentication",
7338
7470
  "import": "@sakaniui/react/blocks",
7339
- "source": "src/blocks/ForgotPasswordBlock/ForgotPasswordBlock.tsx",
7340
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onSubmit`/`onResend` to your real API calls in place of the simulated ones here.",
7471
+ "summary": "Forgot Password block (Authentication): a composition example. Copy it into your project and edit it.",
7341
7472
  "props": [
7342
7473
  {
7343
7474
  "name": "initialStatus",
@@ -7383,15 +7514,15 @@
7383
7514
  "contract": {
7384
7515
  "requiredProps": [],
7385
7516
  "requiresAccessibleName": false
7386
- }
7517
+ },
7518
+ "since": "0.3.0"
7387
7519
  },
7388
7520
  {
7389
7521
  "name": "FormModalBlock",
7390
7522
  "kind": "block",
7391
7523
  "category": "Blocks/Application",
7392
7524
  "import": "@sakaniui/react/blocks",
7393
- "source": "src/blocks/FormModalBlock/FormModalBlock.tsx",
7394
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: swap the fields for your own form.",
7525
+ "summary": "Form Modal block (Application): a composition example. Copy it into your project and edit it.",
7395
7526
  "props": [
7396
7527
  {
7397
7528
  "name": "open",
@@ -7415,15 +7546,15 @@
7415
7546
  "onClose"
7416
7547
  ],
7417
7548
  "requiresAccessibleName": false
7418
- }
7549
+ },
7550
+ "since": "0.1.0"
7419
7551
  },
7420
7552
  {
7421
7553
  "name": "HeroBlock",
7422
7554
  "kind": "block",
7423
7555
  "category": "Blocks/Marketing",
7424
7556
  "import": "@sakaniui/react/blocks",
7425
- "source": "src/blocks/HeroBlock/HeroBlock.tsx",
7426
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire the two actions to your real signup/repo links in place of the callbacks here.",
7557
+ "summary": "Hero block (Marketing): a composition example. Copy it into your project and edit it.",
7427
7558
  "props": [
7428
7559
  {
7429
7560
  "name": "eyebrow",
@@ -7455,7 +7586,7 @@
7455
7586
  "name": "secondaryActionIcon",
7456
7587
  "type": "boolean",
7457
7588
  "required": false,
7458
- "default": "false",
7589
+ "default": false,
7459
7590
  "description": "Shows the GitHub icon before the secondary action's label."
7460
7591
  },
7461
7592
  {
@@ -7488,8 +7619,7 @@
7488
7619
  "centered",
7489
7620
  "split"
7490
7621
  ],
7491
- "default": "centered",
7492
- "description": "Figma Layout axis. Defaults to \"centered\"."
7622
+ "default": "centered"
7493
7623
  },
7494
7624
  {
7495
7625
  "name": "className",
@@ -7505,15 +7635,15 @@
7505
7635
  "image"
7506
7636
  ],
7507
7637
  "requiresAccessibleName": false
7508
- }
7638
+ },
7639
+ "since": "0.3.0"
7509
7640
  },
7510
7641
  {
7511
7642
  "name": "InlineCtaBlock",
7512
7643
  "kind": "block",
7513
7644
  "category": "Blocks/Application",
7514
7645
  "import": "@sakaniui/react/blocks",
7515
- "source": "src/blocks/InlineCtaBlock/InlineCtaBlock.tsx",
7516
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7646
+ "summary": "Inline Cta block (Application): a composition example. Copy it into your project and edit it.",
7517
7647
  "props": [
7518
7648
  {
7519
7649
  "name": "variant",
@@ -7563,15 +7693,15 @@
7563
7693
  "actionLabel"
7564
7694
  ],
7565
7695
  "requiresAccessibleName": false
7566
- }
7696
+ },
7697
+ "since": "0.1.0"
7567
7698
  },
7568
7699
  {
7569
7700
  "name": "KanbanBoardBlock",
7570
7701
  "kind": "block",
7571
7702
  "category": "Blocks/Data & Content",
7572
7703
  "import": "@sakaniui/react/blocks",
7573
- "source": "src/blocks/KanbanBoardBlock/KanbanBoardBlock.tsx",
7574
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file and edit it: change the columns, swap the sample tasks, adjust the card content. Assembled entirely from Sakani components.",
7704
+ "summary": "Kanban Board block (Data & Content): a composition example. Copy it into your project and edit it.",
7575
7705
  "props": [
7576
7706
  {
7577
7707
  "name": "state",
@@ -7600,15 +7730,15 @@
7600
7730
  "contract": {
7601
7731
  "requiredProps": [],
7602
7732
  "requiresAccessibleName": false
7603
- }
7733
+ },
7734
+ "since": "0.1.0"
7604
7735
  },
7605
7736
  {
7606
7737
  "name": "LiquidDashboardBlock",
7607
7738
  "kind": "block",
7608
7739
  "category": "Blocks/Application",
7609
7740
  "import": "@sakaniui/react/blocks",
7610
- "source": "src/blocks/LiquidDashboardBlock/LiquidDashboardBlock.tsx",
7611
- "summary": "A full dashboard on a photograph, built the way the Sakani glass docs describe it: 1.",
7741
+ "summary": "A composition example: a full dashboard over a photograph, with the photo as a LiquidBackdrop so every liquid-glass lens refracts it.",
7612
7742
  "props": [
7613
7743
  {
7614
7744
  "name": "backgroundImage",
@@ -7639,15 +7769,15 @@
7639
7769
  "backgroundImage"
7640
7770
  ],
7641
7771
  "requiresAccessibleName": false
7642
- }
7772
+ },
7773
+ "since": "0.4.0"
7643
7774
  },
7644
7775
  {
7645
7776
  "name": "LoginBlock",
7646
7777
  "kind": "block",
7647
7778
  "category": "Blocks/Authentication",
7648
7779
  "import": "@sakaniui/react/blocks",
7649
- "source": "src/blocks/LoginBlock/LoginBlock.tsx",
7650
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onSubmit` to your real auth call in place of the simulated one here.",
7780
+ "summary": "Login block (Authentication): a composition example. Copy it into your project and edit it.",
7651
7781
  "props": [
7652
7782
  {
7653
7783
  "name": "initialStatus",
@@ -7698,15 +7828,15 @@
7698
7828
  "contract": {
7699
7829
  "requiredProps": [],
7700
7830
  "requiresAccessibleName": false
7701
- }
7831
+ },
7832
+ "since": "0.3.0"
7702
7833
  },
7703
7834
  {
7704
7835
  "name": "LogoCloudBlock",
7705
7836
  "kind": "block",
7706
7837
  "category": "Blocks/Marketing",
7707
7838
  "import": "@sakaniui/react/blocks",
7708
- "source": "src/blocks/LogoCloudBlock/LogoCloudBlock.tsx",
7709
- "summary": "A COMPOSITION EXAMPLE, not a configurable component.tsx for your own actual customers' logos.",
7839
+ "summary": "Logo Cloud block (Marketing): a composition example. Copy it into your project and edit it.",
7710
7840
  "props": [
7711
7841
  {
7712
7842
  "name": "label",
@@ -7717,8 +7847,7 @@
7717
7847
  {
7718
7848
  "name": "brands",
7719
7849
  "type": "LogoCloudBrand[]",
7720
- "required": false,
7721
- "default": "['vercel', 'netlify', 'github', 'figma', 'notion', 'linear', 'stripe']"
7850
+ "required": false
7722
7851
  },
7723
7852
  {
7724
7853
  "name": "variant",
@@ -7728,8 +7857,7 @@
7728
7857
  "color",
7729
7858
  "monochrome"
7730
7859
  ],
7731
- "default": "monochrome",
7732
- "description": "Figma Style axis (renamed to avoid colliding with the DOM `style` prop). Defaults to \"monochrome\"."
7860
+ "default": "monochrome"
7733
7861
  },
7734
7862
  {
7735
7863
  "name": "className",
@@ -7740,15 +7868,15 @@
7740
7868
  "contract": {
7741
7869
  "requiredProps": [],
7742
7870
  "requiresAccessibleName": false
7743
- }
7871
+ },
7872
+ "since": "0.3.0"
7744
7873
  },
7745
7874
  {
7746
7875
  "name": "MultistepModalBlock",
7747
7876
  "kind": "block",
7748
7877
  "category": "Blocks/Application",
7749
7878
  "import": "@sakaniui/react/blocks",
7750
- "source": "src/blocks/MultistepModalBlock/MultistepModalBlock.tsx",
7751
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: swap the steps/content for your own flow.",
7879
+ "summary": "Multistep Modal block (Application): a composition example. Copy it into your project and edit it.",
7752
7880
  "props": [
7753
7881
  {
7754
7882
  "name": "open",
@@ -7764,7 +7892,7 @@
7764
7892
  "name": "initialStep",
7765
7893
  "type": "number",
7766
7894
  "required": false,
7767
- "default": "0",
7895
+ "default": 0,
7768
7896
  "description": "Which step to open on — for demoing a mid-flow state. Defaults to the first step."
7769
7897
  },
7770
7898
  {
@@ -7779,15 +7907,15 @@
7779
7907
  "onClose"
7780
7908
  ],
7781
7909
  "requiresAccessibleName": false
7782
- }
7910
+ },
7911
+ "since": "0.1.0"
7783
7912
  },
7784
7913
  {
7785
7914
  "name": "NotificationPanelBlock",
7786
7915
  "kind": "block",
7787
- "category": "New comment on your design",
7916
+ "category": "Blocks",
7788
7917
  "import": "@sakaniui/react/blocks",
7789
- "source": "src/blocks/NotificationPanelBlock/NotificationPanelBlock.tsx",
7790
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7918
+ "summary": "Notification Panel block: a composition example. Copy it into your project and edit it.",
7791
7919
  "props": [
7792
7920
  {
7793
7921
  "name": "items",
@@ -7810,15 +7938,15 @@
7810
7938
  "items"
7811
7939
  ],
7812
7940
  "requiresAccessibleName": false
7813
- }
7941
+ },
7942
+ "since": "0.1.0"
7814
7943
  },
7815
7944
  {
7816
7945
  "name": "OnboardingProgressBlock",
7817
7946
  "kind": "block",
7818
7947
  "category": "Blocks/Application",
7819
7948
  "import": "@sakaniui/react/blocks",
7820
- "source": "src/blocks/OnboardingProgressBlock/OnboardingProgressBlock.tsx",
7821
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
7949
+ "summary": "Onboarding Progress block (Application): a composition example. Copy it into your project and edit it.",
7822
7950
  "props": [
7823
7951
  {
7824
7952
  "name": "title",
@@ -7852,15 +7980,15 @@
7852
7980
  "items"
7853
7981
  ],
7854
7982
  "requiresAccessibleName": false
7855
- }
7983
+ },
7984
+ "since": "0.3.0"
7856
7985
  },
7857
7986
  {
7858
7987
  "name": "OrderConfirmationBlock",
7859
7988
  "kind": "block",
7860
7989
  "category": "Blocks/E-commerce",
7861
7990
  "import": "@sakaniui/react/blocks",
7862
- "source": "src/blocks/OrderConfirmationBlock/OrderConfirmationBlock.tsx",
7863
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire the \"Continue shopping\"/\"Track order\" actions to your real navigation in place of the no-op callbacks here.",
7991
+ "summary": "Order Confirmation block (E-commerce): a composition example. Copy it into your project and edit it.",
7864
7992
  "props": [
7865
7993
  {
7866
7994
  "name": "orderNumber",
@@ -7896,8 +8024,7 @@
7896
8024
  {
7897
8025
  "name": "formatPrice",
7898
8026
  "type": "((amount: number) => string)",
7899
- "required": false,
7900
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
8027
+ "required": false
7901
8028
  },
7902
8029
  {
7903
8030
  "name": "className",
@@ -7912,15 +8039,15 @@
7912
8039
  "total"
7913
8040
  ],
7914
8041
  "requiresAccessibleName": false
7915
- }
8042
+ },
8043
+ "since": "0.3.0"
7916
8044
  },
7917
8045
  {
7918
8046
  "name": "PaymentMethodBlock",
7919
8047
  "kind": "block",
7920
8048
  "category": "Blocks/Billing",
7921
8049
  "import": "@sakaniui/react/blocks",
7922
- "source": "src/blocks/Billing/PaymentMethodBlock/PaymentMethodBlock.tsx",
7923
- "summary": "A COMPOSITION EXAMPLE, not a configurable component.) update/add flows.",
8050
+ "summary": "Payment Method block (Billing): a composition example. Copy it into your project and edit it.",
7924
8051
  "props": [
7925
8052
  {
7926
8053
  "name": "card",
@@ -7942,7 +8069,7 @@
7942
8069
  "name": "loading",
7943
8070
  "type": "boolean",
7944
8071
  "required": false,
7945
- "default": "false",
8072
+ "default": false,
7946
8073
  "description": "Shows the Skeleton loading state in place of everything else -- there's no card data yet at this point to derive a status from."
7947
8074
  },
7948
8075
  {
@@ -7954,15 +8081,15 @@
7954
8081
  "contract": {
7955
8082
  "requiredProps": [],
7956
8083
  "requiresAccessibleName": false
7957
- }
8084
+ },
8085
+ "since": "0.3.0"
7958
8086
  },
7959
8087
  {
7960
8088
  "name": "PricingTableBlock",
7961
8089
  "kind": "block",
7962
8090
  "category": "Blocks/Marketing",
7963
8091
  "import": "@sakaniui/react/blocks",
7964
- "source": "src/blocks/PricingTableBlock/PricingTableBlock.tsx",
7965
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire each plan's CTA to your real checkout/contact flow in place of the callbacks here.",
8092
+ "summary": "Pricing Table block (Marketing): a composition example. Copy it into your project and edit it.",
7966
8093
  "props": [
7967
8094
  {
7968
8095
  "name": "eyebrow",
@@ -7998,15 +8125,15 @@
7998
8125
  "plans"
7999
8126
  ],
8000
8127
  "requiresAccessibleName": false
8001
- }
8128
+ },
8129
+ "since": "0.3.0"
8002
8130
  },
8003
8131
  {
8004
8132
  "name": "ProductDetailBlock",
8005
8133
  "kind": "block",
8006
8134
  "category": "Blocks/E-commerce",
8007
8135
  "import": "@sakaniui/react/blocks",
8008
- "source": "src/blocks/ProductDetailBlock/ProductDetailBlock.tsx",
8009
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire \"Add to cart\" to your real cart state/API in place of the callback here.",
8136
+ "summary": "Product Detail block (E-commerce): a composition example. Copy it into your project and edit it.",
8010
8137
  "props": [
8011
8138
  {
8012
8139
  "name": "name",
@@ -8064,8 +8191,7 @@
8064
8191
  {
8065
8192
  "name": "defaultColor",
8066
8193
  "type": "string",
8067
- "required": false,
8068
- "description": "Defaults to the first available option in each list."
8194
+ "required": false
8069
8195
  },
8070
8196
  {
8071
8197
  "name": "defaultSize",
@@ -8076,7 +8202,7 @@
8076
8202
  "name": "minQuantity",
8077
8203
  "type": "number",
8078
8204
  "required": false,
8079
- "default": "1"
8205
+ "default": 1
8080
8206
  },
8081
8207
  {
8082
8208
  "name": "maxQuantity",
@@ -8087,7 +8213,7 @@
8087
8213
  "name": "defaultSaved",
8088
8214
  "type": "boolean",
8089
8215
  "required": false,
8090
- "default": "false"
8216
+ "default": false
8091
8217
  },
8092
8218
  {
8093
8219
  "name": "onAddToCart",
@@ -8097,8 +8223,7 @@
8097
8223
  {
8098
8224
  "name": "formatPrice",
8099
8225
  "type": "((amount: number) => string)",
8100
- "required": false,
8101
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
8226
+ "required": false
8102
8227
  },
8103
8228
  {
8104
8229
  "name": "className",
@@ -8116,15 +8241,15 @@
8116
8241
  "description"
8117
8242
  ],
8118
8243
  "requiresAccessibleName": false
8119
- }
8244
+ },
8245
+ "since": "0.3.0"
8120
8246
  },
8121
8247
  {
8122
8248
  "name": "ProductGridBlock",
8123
8249
  "kind": "block",
8124
8250
  "category": "Blocks/E-commerce",
8125
8251
  "import": "@sakaniui/react/blocks",
8126
- "source": "src/blocks/ProductGridBlock/ProductGridBlock.tsx",
8127
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire \"Add Item\"/wishlist/sort to your real cart/catalog state in place of the callbacks here.",
8252
+ "summary": "Product Grid block (E-commerce): a composition example. Copy it into your project and edit it.",
8128
8253
  "props": [
8129
8254
  {
8130
8255
  "name": "eyebrow",
@@ -8152,7 +8277,7 @@
8152
8277
  "name": "showFilterBar",
8153
8278
  "type": "boolean",
8154
8279
  "required": false,
8155
- "default": "false",
8280
+ "default": false,
8156
8281
  "description": "Adds the \"N products\" count + Sort button row above the grid -- see the file doc for why this stays a real prop rather than being derived."
8157
8282
  },
8158
8283
  {
@@ -8170,8 +8295,8 @@
8170
8295
  "name": "columns",
8171
8296
  "type": "number",
8172
8297
  "required": false,
8173
- "default": "4",
8174
- "description": "Number of columns at full width. Defaults to 4, matching Figma."
8298
+ "default": 4,
8299
+ "description": "Number of columns at full width."
8175
8300
  },
8176
8301
  {
8177
8302
  "name": "className",
@@ -8185,15 +8310,15 @@
8185
8310
  "products"
8186
8311
  ],
8187
8312
  "requiresAccessibleName": false
8188
- }
8313
+ },
8314
+ "since": "0.3.0"
8189
8315
  },
8190
8316
  {
8191
8317
  "name": "ProfileSettingsBlock",
8192
8318
  "kind": "block",
8193
8319
  "category": "Blocks/Application",
8194
8320
  "import": "@sakaniui/react/blocks",
8195
- "source": "src/blocks/ProfileSettingsBlock/ProfileSettingsBlock.tsx",
8196
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
8321
+ "summary": "Profile Settings block (Application): a composition example. Copy it into your project and edit it.",
8197
8322
  "props": [
8198
8323
  {
8199
8324
  "name": "name",
@@ -8226,15 +8351,15 @@
8226
8351
  "contract": {
8227
8352
  "requiredProps": [],
8228
8353
  "requiresAccessibleName": false
8229
- }
8354
+ },
8355
+ "since": "0.1.0"
8230
8356
  },
8231
8357
  {
8232
8358
  "name": "ResetPasswordBlock",
8233
8359
  "kind": "block",
8234
8360
  "category": "Blocks/Authentication",
8235
8361
  "import": "@sakaniui/react/blocks",
8236
- "source": "src/blocks/ResetPasswordBlock/ResetPasswordBlock.tsx",
8237
- "summary": "A COMPOSITION EXAMPLE, not a configurable component.",
8362
+ "summary": "Reset Password block (Authentication): a composition example. Copy it into your project and edit it.",
8238
8363
  "props": [
8239
8364
  {
8240
8365
  "name": "initialStatus",
@@ -8274,15 +8399,15 @@
8274
8399
  "contract": {
8275
8400
  "requiredProps": [],
8276
8401
  "requiresAccessibleName": false
8277
- }
8402
+ },
8403
+ "since": "0.3.0"
8278
8404
  },
8279
8405
  {
8280
8406
  "name": "SectionFooterBlock",
8281
8407
  "kind": "block",
8282
8408
  "category": "Blocks/Application",
8283
8409
  "import": "@sakaniui/react/blocks",
8284
- "source": "src/blocks/SectionFooterBlock/SectionFooterBlock.tsx",
8285
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
8410
+ "summary": "Section Footer block (Application): a composition example. Copy it into your project and edit it.",
8286
8411
  "props": [
8287
8412
  {
8288
8413
  "name": "text",
@@ -8293,8 +8418,7 @@
8293
8418
  {
8294
8419
  "name": "links",
8295
8420
  "type": "SectionFooterLink[]",
8296
- "required": false,
8297
- "default": "[\n { label: 'Docs', href: '#' },\n { label: 'Status', href: '#' },\n { label: 'Support', href: '#' },\n]"
8421
+ "required": false
8298
8422
  },
8299
8423
  {
8300
8424
  "name": "variant",
@@ -8315,15 +8439,15 @@
8315
8439
  "contract": {
8316
8440
  "requiredProps": [],
8317
8441
  "requiresAccessibleName": false
8318
- }
8442
+ },
8443
+ "since": "0.3.0"
8319
8444
  },
8320
8445
  {
8321
8446
  "name": "ShoppingCartBlock",
8322
8447
  "kind": "block",
8323
8448
  "category": "Blocks/E-commerce",
8324
8449
  "import": "@sakaniui/react/blocks",
8325
- "source": "src/blocks/ShoppingCartBlock/ShoppingCartBlock.tsx",
8326
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire \"Checkout\"/\"Continue shopping\" to your real cart/checkout flow in place of the callbacks here.",
8450
+ "summary": "Shopping Cart block (E-commerce): a composition example. Copy it into your project and edit it.",
8327
8451
  "props": [
8328
8452
  {
8329
8453
  "name": "items",
@@ -8334,8 +8458,7 @@
8334
8458
  "name": "shippingCost",
8335
8459
  "type": "number",
8336
8460
  "required": false,
8337
- "default": "0",
8338
- "description": "0 (default) renders \"Free\" in the summary, matching Figma."
8461
+ "default": 0
8339
8462
  },
8340
8463
  {
8341
8464
  "name": "onCheckout",
@@ -8350,8 +8473,7 @@
8350
8473
  {
8351
8474
  "name": "formatPrice",
8352
8475
  "type": "((amount: number) => string)",
8353
- "required": false,
8354
- "default": "(amount: number) =>\n amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' })"
8476
+ "required": false
8355
8477
  },
8356
8478
  {
8357
8479
  "name": "className",
@@ -8364,15 +8486,15 @@
8364
8486
  "items"
8365
8487
  ],
8366
8488
  "requiresAccessibleName": false
8367
- }
8489
+ },
8490
+ "since": "0.3.0"
8368
8491
  },
8369
8492
  {
8370
8493
  "name": "SignUpBlock",
8371
8494
  "kind": "block",
8372
8495
  "category": "Blocks/Authentication",
8373
8496
  "import": "@sakaniui/react/blocks",
8374
- "source": "src/blocks/SignUpBlock/SignUpBlock.tsx",
8375
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onSubmit` to your real registration call in place of the simulated one here.",
8497
+ "summary": "Sign Up block (Authentication): a composition example. Copy it into your project and edit it.",
8376
8498
  "props": [
8377
8499
  {
8378
8500
  "name": "initialStatus",
@@ -8412,15 +8534,15 @@
8412
8534
  "contract": {
8413
8535
  "requiredProps": [],
8414
8536
  "requiresAccessibleName": false
8415
- }
8537
+ },
8538
+ "since": "0.3.0"
8416
8539
  },
8417
8540
  {
8418
8541
  "name": "TeamSectionBlock",
8419
8542
  "kind": "block",
8420
8543
  "category": "Blocks/Marketing",
8421
8544
  "import": "@sakaniui/react/blocks",
8422
- "source": "src/blocks/TeamSectionBlock/TeamSectionBlock.tsx",
8423
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
8545
+ "summary": "Team Section block (Marketing): a composition example. Copy it into your project and edit it.",
8424
8546
  "props": [
8425
8547
  {
8426
8548
  "name": "eyebrow",
@@ -8456,15 +8578,15 @@
8456
8578
  "members"
8457
8579
  ],
8458
8580
  "requiresAccessibleName": false
8459
- }
8581
+ },
8582
+ "since": "0.3.0"
8460
8583
  },
8461
8584
  {
8462
8585
  "name": "TestimonialBlock",
8463
8586
  "kind": "block",
8464
8587
  "category": "Blocks/Marketing",
8465
8588
  "import": "@sakaniui/react/blocks",
8466
- "source": "src/blocks/TestimonialBlock/TestimonialBlock.tsx",
8467
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly.",
8589
+ "summary": "Testimonial block (Marketing): a composition example. Copy it into your project and edit it.",
8468
8590
  "props": [
8469
8591
  {
8470
8592
  "name": "testimonials",
@@ -8482,15 +8604,15 @@
8482
8604
  "testimonials"
8483
8605
  ],
8484
8606
  "requiresAccessibleName": false
8485
- }
8607
+ },
8608
+ "since": "0.3.0"
8486
8609
  },
8487
8610
  {
8488
8611
  "name": "TwoFactorAuthBlock",
8489
8612
  "kind": "block",
8490
8613
  "category": "Blocks/Authentication",
8491
8614
  "import": "@sakaniui/react/blocks",
8492
- "source": "src/blocks/TwoFactorAuthBlock/TwoFactorAuthBlock.tsx",
8493
- "summary": "A COMPOSITION EXAMPLE, not a configurable component. Copy this file into your project and edit it directly: wire `onVerify`/`onUseBackupCode` to your real API calls in place of the simulated ones here.",
8615
+ "summary": "Two Factor Auth block (Authentication): a composition example. Copy it into your project and edit it.",
8494
8616
  "props": [
8495
8617
  {
8496
8618
  "name": "initialStatus",
@@ -8526,7 +8648,40 @@
8526
8648
  "contract": {
8527
8649
  "requiredProps": [],
8528
8650
  "requiresAccessibleName": false
8529
- }
8651
+ },
8652
+ "since": "0.3.0"
8653
+ }
8654
+ ],
8655
+ "utilities": [
8656
+ {
8657
+ "name": "DEFAULT_CHECKOUT_STEPS",
8658
+ "kind": "constant",
8659
+ "import": "@sakaniui/react"
8660
+ },
8661
+ {
8662
+ "name": "getContrastColor",
8663
+ "kind": "helper",
8664
+ "import": "@sakaniui/react"
8665
+ },
8666
+ {
8667
+ "name": "iconStrokeWidth",
8668
+ "kind": "helper",
8669
+ "import": "@sakaniui/react"
8670
+ },
8671
+ {
8672
+ "name": "syncLiquidBackdrop",
8673
+ "kind": "helper",
8674
+ "import": "@sakaniui/react"
8675
+ },
8676
+ {
8677
+ "name": "useHoverHighlight",
8678
+ "kind": "hook",
8679
+ "import": "@sakaniui/react"
8680
+ },
8681
+ {
8682
+ "name": "useLiquidGlass",
8683
+ "kind": "hook",
8684
+ "import": "@sakaniui/react"
8530
8685
  }
8531
8686
  ]
8532
8687
  }