@nikala-ui/core 0.10.1 → 0.11.0-nightly.b01fa01

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.
Files changed (106) hide show
  1. package/package.json +1 -1
  2. package/registry/banner.json +1 -1
  3. package/registry/bubble.json +18 -0
  4. package/registry/button-group.json +20 -0
  5. package/registry/button.json +1 -1
  6. package/registry/checkbox.json +4 -1
  7. package/registry/combobox.json +1 -1
  8. package/registry/command.json +3 -2
  9. package/registry/context-menu.json +1 -1
  10. package/registry/create-app-updater.json +13 -0
  11. package/registry/create-chat-scroll.json +13 -0
  12. package/registry/create-document-tabs.json +13 -0
  13. package/registry/create-drop-zone.json +13 -0
  14. package/registry/create-global-shortcut.json +13 -0
  15. package/registry/create-pagination.json +13 -0
  16. package/registry/create-tauri-window.json +13 -0
  17. package/registry/dialog.json +1 -1
  18. package/registry/dropdown-menu.json +3 -2
  19. package/registry/dropzone.json +21 -0
  20. package/registry/field.json +1 -1
  21. package/registry/footer.json +18 -0
  22. package/registry/forgot-password-01.json +28 -0
  23. package/registry/form-message.json +3 -2
  24. package/registry/hero-01.json +22 -0
  25. package/registry/icon-button.json +1 -1
  26. package/registry/index.json +432 -5
  27. package/registry/login-01.json +28 -0
  28. package/registry/marker.json +17 -0
  29. package/registry/marquee.json +17 -0
  30. package/registry/message.json +17 -0
  31. package/registry/navbar.json +19 -0
  32. package/registry/navigation-menu.json +22 -0
  33. package/registry/number-input.json +1 -1
  34. package/registry/otp-verification-01.json +26 -0
  35. package/registry/pagination.json +22 -0
  36. package/registry/popover.json +4 -1
  37. package/registry/rating.json +19 -0
  38. package/registry/register-01.json +31 -0
  39. package/registry/resizable.json +1 -1
  40. package/registry/review-card.json +23 -0
  41. package/registry/scroll-area.json +1 -1
  42. package/registry/select.json +3 -2
  43. package/registry/sheet.json +1 -1
  44. package/registry/sidebar.json +24 -0
  45. package/registry/spinner.json +1 -1
  46. package/registry/stat.json +19 -0
  47. package/registry/status.json +1 -1
  48. package/registry/switch.json +4 -1
  49. package/registry/table.json +17 -0
  50. package/registry/tabs.json +4 -1
  51. package/registry/theme-manager.json +4 -3
  52. package/registry/timeline.json +18 -0
  53. package/registry/titlebar-tabs.json +24 -0
  54. package/registry/titlebar.json +26 -0
  55. package/registry/toggle-group.json +21 -0
  56. package/registry/updater-modal.json +26 -0
  57. package/src/registry/blocks/forgot-password-01.tsx +141 -0
  58. package/src/registry/blocks/hero-01.tsx +28 -0
  59. package/src/registry/blocks/login-01.tsx +231 -0
  60. package/src/registry/blocks/otp-verification-01.tsx +170 -0
  61. package/src/registry/blocks/register-01.tsx +318 -0
  62. package/src/registry/components/ui/banner.tsx +0 -2
  63. package/src/registry/components/ui/bubble.tsx +142 -0
  64. package/src/registry/components/ui/button-group.tsx +42 -0
  65. package/src/registry/components/ui/button.tsx +1 -1
  66. package/src/registry/components/ui/checkbox.tsx +1 -1
  67. package/src/registry/components/ui/combobox.tsx +83 -18
  68. package/src/registry/components/ui/command.tsx +101 -105
  69. package/src/registry/components/ui/context-menu.tsx +67 -22
  70. package/src/registry/components/ui/dialog.tsx +42 -32
  71. package/src/registry/components/ui/dropdown-menu.tsx +69 -31
  72. package/src/registry/components/ui/dropzone.tsx +189 -0
  73. package/src/registry/components/ui/field.tsx +7 -3
  74. package/src/registry/components/ui/footer.tsx +247 -0
  75. package/src/registry/components/ui/form-message.tsx +2 -2
  76. package/src/registry/components/ui/icon-button.tsx +1 -1
  77. package/src/registry/components/ui/marker.tsx +102 -0
  78. package/src/registry/components/ui/marquee.tsx +118 -0
  79. package/src/registry/components/ui/message.tsx +168 -0
  80. package/src/registry/components/ui/navbar.tsx +375 -0
  81. package/src/registry/components/ui/navigation-menu.tsx +358 -0
  82. package/src/registry/components/ui/number-input.tsx +3 -3
  83. package/src/registry/components/ui/pagination.tsx +258 -0
  84. package/src/registry/components/ui/popover.tsx +1 -1
  85. package/src/registry/components/ui/rating.tsx +185 -0
  86. package/src/registry/components/ui/resizable.tsx +3 -1
  87. package/src/registry/components/ui/review-card.tsx +195 -0
  88. package/src/registry/components/ui/scroll-area.tsx +13 -3
  89. package/src/registry/components/ui/select.tsx +16 -19
  90. package/src/registry/components/ui/sheet.tsx +58 -53
  91. package/src/registry/components/ui/sidebar.tsx +692 -0
  92. package/src/registry/components/ui/spinner.tsx +1 -1
  93. package/src/registry/components/ui/stat.tsx +245 -0
  94. package/src/registry/components/ui/status.tsx +7 -5
  95. package/src/registry/components/ui/switch.tsx +1 -1
  96. package/src/registry/components/ui/table.tsx +160 -0
  97. package/src/registry/components/ui/tabs.tsx +1 -1
  98. package/src/registry/components/ui/theme-toggle.tsx +80 -79
  99. package/src/registry/components/ui/timeline.tsx +350 -0
  100. package/src/registry/components/ui/titlebar-tabs.tsx +412 -0
  101. package/src/registry/components/ui/titlebar.tsx +399 -0
  102. package/src/registry/components/ui/toggle-group.tsx +203 -0
  103. package/src/registry/components/ui/updater-modal.tsx +254 -0
  104. package/src/registry/index.ts +3 -3
  105. package/src/registry/metadata.ts +184 -5
  106. package/src/registry/providers/theme-transitions.ts +81 -50
@@ -74,6 +74,30 @@
74
74
  "tailwind-merge"
75
75
  ]
76
76
  },
77
+ {
78
+ "name": "bubble",
79
+ "title": "Bubble",
80
+ "description": "Chat message bubble container supporting variants, grouped consecutive bubbles, and emoji reactions.",
81
+ "type": "registry:ui",
82
+ "dependencies": [
83
+ "clsx",
84
+ "tailwind-merge",
85
+ "class-variance-authority"
86
+ ]
87
+ },
88
+ {
89
+ "name": "button-group",
90
+ "title": "Button Group",
91
+ "description": "Groups related buttons into a connected horizontal or vertical control.",
92
+ "type": "registry:ui",
93
+ "dependencies": [
94
+ "clsx",
95
+ "tailwind-merge"
96
+ ],
97
+ "registryDependencies": [
98
+ "button"
99
+ ]
100
+ },
77
101
  {
78
102
  "name": "button",
79
103
  "title": "Button",
@@ -106,6 +130,9 @@
106
130
  "dependencies": [
107
131
  "clsx",
108
132
  "tailwind-merge"
133
+ ],
134
+ "registryDependencies": [
135
+ "create-controllable-signal"
109
136
  ]
110
137
  },
111
138
  {
@@ -149,7 +176,8 @@
149
176
  "kbd",
150
177
  "input-group",
151
178
  "list",
152
- "scroll-area"
179
+ "scroll-area",
180
+ "create-keybindings"
153
181
  ]
154
182
  },
155
183
  {
@@ -194,7 +222,22 @@
194
222
  "@kobalte/core"
195
223
  ],
196
224
  "registryDependencies": [
197
- "scroll-area"
225
+ "scroll-area",
226
+ "create-click-outside"
227
+ ]
228
+ },
229
+ {
230
+ "name": "dropzone",
231
+ "title": "Dropzone",
232
+ "description": "A compound drag-and-drop file upload container with file list previews and validation feedback.",
233
+ "type": "registry:ui",
234
+ "dependencies": [
235
+ "clsx",
236
+ "tailwind-merge",
237
+ "lucide-solid"
238
+ ],
239
+ "registryDependencies": [
240
+ "create-drop-zone"
198
241
  ]
199
242
  },
200
243
  {
@@ -220,13 +263,25 @@
220
263
  "label"
221
264
  ]
222
265
  },
266
+ {
267
+ "name": "footer",
268
+ "title": "Footer",
269
+ "description": "A responsive, accessible, and structured bottom navigation layout suite supporting multi-column link directories, brand sections, and newsletter inputs.",
270
+ "type": "registry:ui",
271
+ "dependencies": [
272
+ "clsx",
273
+ "tailwind-merge",
274
+ "class-variance-authority"
275
+ ]
276
+ },
223
277
  {
224
278
  "name": "form-message",
225
279
  "title": "Form Message",
226
280
  "description": "Validation message helper connected to createForm errors and touched state.",
227
281
  "type": "registry:ui",
228
282
  "registryDependencies": [
229
- "field"
283
+ "field",
284
+ "create-form"
230
285
  ]
231
286
  },
232
287
  {
@@ -332,6 +387,63 @@
332
387
  "tailwind-merge"
333
388
  ]
334
389
  },
390
+ {
391
+ "name": "marker",
392
+ "title": "Marker",
393
+ "description": "System chat events, date dividers, and live typing indicator badges.",
394
+ "type": "registry:ui",
395
+ "dependencies": [
396
+ "clsx",
397
+ "tailwind-merge"
398
+ ]
399
+ },
400
+ {
401
+ "name": "marquee",
402
+ "title": "Marquee",
403
+ "description": "A smooth, GPU-accelerated infinite scrolling ticker component for logo clouds, testimonials, and live ribbons.",
404
+ "type": "registry:ui",
405
+ "dependencies": [
406
+ "clsx",
407
+ "tailwind-merge"
408
+ ]
409
+ },
410
+ {
411
+ "name": "message",
412
+ "title": "Message",
413
+ "description": "A structured chat and conversation message layout with avatars, alignment, headers, footers, and actions.",
414
+ "type": "registry:ui",
415
+ "dependencies": [
416
+ "clsx",
417
+ "tailwind-merge"
418
+ ]
419
+ },
420
+ {
421
+ "name": "navbar",
422
+ "title": "Navbar",
423
+ "description": "A responsive, accessible, and composable top navigation header suite supporting nested dropdown flyouts, floating card containers, and mobile navigation drawers.",
424
+ "type": "registry:ui",
425
+ "dependencies": [
426
+ "clsx",
427
+ "tailwind-merge",
428
+ "class-variance-authority",
429
+ "lucide-solid"
430
+ ]
431
+ },
432
+ {
433
+ "name": "navigation-menu",
434
+ "title": "Navigation Menu",
435
+ "description": "A responsive and accessible top header navigation menu with mega-menu dropdowns and link previews.",
436
+ "type": "registry:ui",
437
+ "dependencies": [
438
+ "clsx",
439
+ "tailwind-merge",
440
+ "class-variance-authority",
441
+ "lucide-solid"
442
+ ],
443
+ "registryDependencies": [
444
+ "create-click-outside"
445
+ ]
446
+ },
335
447
  {
336
448
  "name": "number-input",
337
449
  "title": "Number Input",
@@ -349,6 +461,21 @@
349
461
  "create-long-press"
350
462
  ]
351
463
  },
464
+ {
465
+ "name": "pagination",
466
+ "title": "Pagination",
467
+ "description": "An accessible multi-page navigation bar with previous, next, page numbers, and ellipsis controls.",
468
+ "type": "registry:ui",
469
+ "dependencies": [
470
+ "clsx",
471
+ "tailwind-merge",
472
+ "class-variance-authority",
473
+ "lucide-solid"
474
+ ],
475
+ "registryDependencies": [
476
+ "create-pagination"
477
+ ]
478
+ },
352
479
  {
353
480
  "name": "pin-input",
354
481
  "title": "Pin Input",
@@ -369,6 +496,9 @@
369
496
  "tailwind-merge",
370
497
  "@kobalte/core",
371
498
  "lucide-solid"
499
+ ],
500
+ "registryDependencies": [
501
+ "create-click-outside"
372
502
  ]
373
503
  },
374
504
  {
@@ -393,6 +523,18 @@
393
523
  "@kobalte/core"
394
524
  ]
395
525
  },
526
+ {
527
+ "name": "rating",
528
+ "title": "Rating",
529
+ "description": "An accessible star rating component supporting interactive inputs, hover preview states, and read-only score badges.",
530
+ "type": "registry:ui",
531
+ "dependencies": [
532
+ "clsx",
533
+ "tailwind-merge",
534
+ "class-variance-authority",
535
+ "lucide-solid"
536
+ ]
537
+ },
396
538
  {
397
539
  "name": "resizable",
398
540
  "title": "Resizable",
@@ -407,6 +549,22 @@
407
549
  "create-resize-observer"
408
550
  ]
409
551
  },
552
+ {
553
+ "name": "review-card",
554
+ "title": "Review Card",
555
+ "description": "A versatile, structured card component for customer testimonials, product ratings, verified buyer badges, and social proof.",
556
+ "type": "registry:ui",
557
+ "dependencies": [
558
+ "clsx",
559
+ "tailwind-merge",
560
+ "class-variance-authority",
561
+ "lucide-solid"
562
+ ],
563
+ "registryDependencies": [
564
+ "avatar",
565
+ "rating"
566
+ ]
567
+ },
410
568
  {
411
569
  "name": "scroll-area",
412
570
  "title": "Scroll Area",
@@ -432,7 +590,8 @@
432
590
  "@kobalte/core"
433
591
  ],
434
592
  "registryDependencies": [
435
- "scroll-area"
593
+ "scroll-area",
594
+ "create-click-outside"
436
595
  ]
437
596
  },
438
597
  {
@@ -460,6 +619,23 @@
460
619
  "scroll-area"
461
620
  ]
462
621
  },
622
+ {
623
+ "name": "sidebar",
624
+ "title": "Sidebar",
625
+ "description": "A composable, collapsible, and accessible application sidebar navigation suite with icon mode, mobile drawer, and keyboard shortcuts.",
626
+ "type": "registry:ui",
627
+ "dependencies": [
628
+ "clsx",
629
+ "tailwind-merge",
630
+ "class-variance-authority",
631
+ "lucide-solid"
632
+ ],
633
+ "registryDependencies": [
634
+ "tooltip",
635
+ "skeleton",
636
+ "separator"
637
+ ]
638
+ },
463
639
  {
464
640
  "name": "skeleton",
465
641
  "title": "Skeleton",
@@ -492,6 +668,18 @@
492
668
  "class-variance-authority"
493
669
  ]
494
670
  },
671
+ {
672
+ "name": "stat",
673
+ "title": "Stat",
674
+ "description": "Display key performance indicators, statistics, financial data, and metrics with trends and icons.",
675
+ "type": "registry:ui",
676
+ "dependencies": [
677
+ "clsx",
678
+ "tailwind-merge",
679
+ "class-variance-authority",
680
+ "lucide-solid"
681
+ ]
682
+ },
495
683
  {
496
684
  "name": "status",
497
685
  "title": "Status",
@@ -508,6 +696,19 @@
508
696
  "title": "Switch",
509
697
  "description": "A control that allows the user to toggle between checked and unchecked states.",
510
698
  "type": "registry:ui",
699
+ "dependencies": [
700
+ "clsx",
701
+ "tailwind-merge"
702
+ ],
703
+ "registryDependencies": [
704
+ "create-controllable-signal"
705
+ ]
706
+ },
707
+ {
708
+ "name": "table",
709
+ "title": "Table",
710
+ "description": "A responsive and accessible data table component with headers, rows, cells, and footer summaries.",
711
+ "type": "registry:ui",
511
712
  "dependencies": [
512
713
  "clsx",
513
714
  "tailwind-merge"
@@ -521,6 +722,9 @@
521
722
  "dependencies": [
522
723
  "clsx",
523
724
  "tailwind-merge"
725
+ ],
726
+ "registryDependencies": [
727
+ "create-controllable-signal"
524
728
  ]
525
729
  },
526
730
  {
@@ -546,7 +750,55 @@
546
750
  ],
547
751
  "registryDependencies": [
548
752
  "button",
549
- "dropdown-menu"
753
+ "dropdown-menu",
754
+ "create-color-mode"
755
+ ]
756
+ },
757
+ {
758
+ "name": "timeline",
759
+ "title": "Timeline",
760
+ "description": "A responsive chronological display for event streams, activity logs, order tracking, and multi-step workflows.",
761
+ "type": "registry:ui",
762
+ "dependencies": [
763
+ "clsx",
764
+ "tailwind-merge",
765
+ "class-variance-authority"
766
+ ]
767
+ },
768
+ {
769
+ "name": "titlebar-tabs",
770
+ "title": "Titlebar Tabs",
771
+ "description": "Native draggable tab bar integrated directly inside desktop titlebars for multi-document applications.",
772
+ "type": "registry:ui",
773
+ "dependencies": [
774
+ "clsx",
775
+ "tailwind-merge",
776
+ "class-variance-authority",
777
+ "lucide-solid"
778
+ ],
779
+ "registryDependencies": [
780
+ "button",
781
+ "tooltip",
782
+ "create-document-tabs"
783
+ ]
784
+ },
785
+ {
786
+ "name": "titlebar",
787
+ "title": "Titlebar",
788
+ "description": "A native-feeling custom titlebar for frameless desktop windows supporting macOS Traffic Lights and Windows 11 controls.",
789
+ "type": "registry:ui",
790
+ "dependencies": [
791
+ "clsx",
792
+ "tailwind-merge",
793
+ "class-variance-authority",
794
+ "lucide-solid"
795
+ ],
796
+ "registryDependencies": [
797
+ "titlebar-tabs",
798
+ "button",
799
+ "tooltip",
800
+ "create-tauri-window",
801
+ "create-document-tabs"
550
802
  ]
551
803
  },
552
804
  {
@@ -562,6 +814,20 @@
562
814
  "@kobalte/core"
563
815
  ]
564
816
  },
817
+ {
818
+ "name": "toggle-group",
819
+ "title": "Toggle Group",
820
+ "description": "A set of two-state buttons that can be toggled on or off with single or multiple selection modes.",
821
+ "type": "registry:ui",
822
+ "dependencies": [
823
+ "clsx",
824
+ "tailwind-merge",
825
+ "class-variance-authority"
826
+ ],
827
+ "registryDependencies": [
828
+ "create-controllable-signal"
829
+ ]
830
+ },
565
831
  {
566
832
  "name": "toggle",
567
833
  "title": "Toggle",
@@ -584,6 +850,125 @@
584
850
  "@kobalte/core"
585
851
  ]
586
852
  },
853
+ {
854
+ "name": "updater-modal",
855
+ "title": "Updater Modal",
856
+ "description": "An automated application auto-updater dialog for Tauri v2 with release notes preview, download progress bar, and relaunch actions.",
857
+ "type": "registry:ui",
858
+ "dependencies": [
859
+ "clsx",
860
+ "tailwind-merge",
861
+ "lucide-solid"
862
+ ],
863
+ "registryDependencies": [
864
+ "dialog",
865
+ "button",
866
+ "badge",
867
+ "progress",
868
+ "alert",
869
+ "create-app-updater"
870
+ ]
871
+ },
872
+ {
873
+ "name": "forgot-password-01",
874
+ "title": "Forgot Password 01 — Account Recovery Flow",
875
+ "description": "A sleek password recovery block with email instructions submission and success confirmation states.",
876
+ "type": "registry:block",
877
+ "dependencies": [
878
+ "clsx",
879
+ "tailwind-merge",
880
+ "lucide-solid"
881
+ ],
882
+ "registryDependencies": [
883
+ "card",
884
+ "input",
885
+ "label",
886
+ "button",
887
+ "alert",
888
+ "form",
889
+ "field",
890
+ "form-message"
891
+ ]
892
+ },
893
+ {
894
+ "name": "hero-01",
895
+ "title": "Hero 01 — Simple Centered with Actions",
896
+ "description": "A clean centered hero section with badge pill, high-contrast headline, and dual CTA buttons.",
897
+ "type": "registry:block",
898
+ "dependencies": [
899
+ "clsx",
900
+ "tailwind-merge",
901
+ "lucide-solid"
902
+ ],
903
+ "registryDependencies": [
904
+ "button",
905
+ "badge"
906
+ ]
907
+ },
908
+ {
909
+ "name": "login-01",
910
+ "title": "Login 01 — Split Screen with Social Auth & Testimonial",
911
+ "description": "A modern split-screen authentication page block with OAuth providers, email sign-in form, and brand testimonial visual.",
912
+ "type": "registry:block",
913
+ "dependencies": [
914
+ "clsx",
915
+ "tailwind-merge",
916
+ "lucide-solid"
917
+ ],
918
+ "registryDependencies": [
919
+ "button",
920
+ "input",
921
+ "label",
922
+ "checkbox",
923
+ "separator",
924
+ "form",
925
+ "field",
926
+ "form-message"
927
+ ]
928
+ },
929
+ {
930
+ "name": "otp-verification-01",
931
+ "title": "OTP Verification 01 — Two-Factor Security Code",
932
+ "description": "A clean 2-Factor Authentication block with a 6-digit PIN input, countdown resend timer, and security notifications.",
933
+ "type": "registry:block",
934
+ "dependencies": [
935
+ "clsx",
936
+ "tailwind-merge",
937
+ "lucide-solid"
938
+ ],
939
+ "registryDependencies": [
940
+ "card",
941
+ "pin-input",
942
+ "button",
943
+ "alert",
944
+ "badge",
945
+ "form"
946
+ ]
947
+ },
948
+ {
949
+ "name": "register-01",
950
+ "title": "Register 01 — Sign-Up Card with Password Strength",
951
+ "description": "A comprehensive sign-up card featuring social logins, live password strength meter with validation checklist, and terms agreement.",
952
+ "type": "registry:block",
953
+ "dependencies": [
954
+ "clsx",
955
+ "tailwind-merge",
956
+ "lucide-solid"
957
+ ],
958
+ "registryDependencies": [
959
+ "card",
960
+ "input",
961
+ "label",
962
+ "button",
963
+ "checkbox",
964
+ "progress",
965
+ "badge",
966
+ "separator",
967
+ "form",
968
+ "field",
969
+ "form-message"
970
+ ]
971
+ },
587
972
  {
588
973
  "name": "create-controllable-signal",
589
974
  "title": "createControllableSignal",
@@ -823,5 +1208,47 @@
823
1208
  "title": "createScrollIntoView",
824
1209
  "description": "SolidJS reactive primitive for scrolling a target element into view smooth or auto behavior",
825
1210
  "type": "registry:hook"
1211
+ },
1212
+ {
1213
+ "name": "create-drop-zone",
1214
+ "title": "createDropZone",
1215
+ "description": "SolidJS reactive primitive for file drag & drop operations, validation, and file chooser dialogs",
1216
+ "type": "registry:hook"
1217
+ },
1218
+ {
1219
+ "name": "create-pagination",
1220
+ "title": "createPagination",
1221
+ "description": "SolidJS reactive primitive for computing pagination state, dynamic page ranges with ellipses, and navigation controls",
1222
+ "type": "registry:hook"
1223
+ },
1224
+ {
1225
+ "name": "create-chat-scroll",
1226
+ "title": "createChatScroll",
1227
+ "description": "SolidJS reactive primitive for automated chat container scrolling with manual scroll-up detection",
1228
+ "type": "registry:hook"
1229
+ },
1230
+ {
1231
+ "name": "create-tauri-window",
1232
+ "title": "createTauriWindow",
1233
+ "description": "SolidJS reactive primitive for interacting with and controlling Tauri v2 application window states",
1234
+ "type": "registry:hook"
1235
+ },
1236
+ {
1237
+ "name": "create-global-shortcut",
1238
+ "title": "createGlobalShortcut",
1239
+ "description": "SolidJS reactive primitive for registering OS-level global keyboard shortcuts via Tauri v2 plugin",
1240
+ "type": "registry:hook"
1241
+ },
1242
+ {
1243
+ "name": "create-app-updater",
1244
+ "title": "createAppUpdater",
1245
+ "description": "SolidJS reactive primitive for controlling and observing Tauri v2 application updates",
1246
+ "type": "registry:hook"
1247
+ },
1248
+ {
1249
+ "name": "create-document-tabs",
1250
+ "title": "createDocumentTabs",
1251
+ "description": "SolidJS reactive primitive for managing multi-document tabs, editor buffers, and browser tab stacks with adjacent activation and pinned state",
1252
+ "type": "registry:hook"
826
1253
  }
827
1254
  ]
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "login-01",
3
+ "title": "Login 01 — Split Screen with Social Auth & Testimonial",
4
+ "description": "A modern split-screen authentication page block with OAuth providers, email sign-in form, and brand testimonial visual.",
5
+ "type": "registry:block",
6
+ "dependencies": [
7
+ "clsx",
8
+ "tailwind-merge",
9
+ "lucide-solid"
10
+ ],
11
+ "registryDependencies": [
12
+ "button",
13
+ "input",
14
+ "label",
15
+ "checkbox",
16
+ "separator",
17
+ "form",
18
+ "field",
19
+ "form-message"
20
+ ],
21
+ "files": [
22
+ {
23
+ "path": "blocks/login-01.tsx",
24
+ "content": "import { createSignal, Show, type Component } from \"solid-js\";\nimport { createForm } from \"@nikala-ui/hooks\";\nimport { Form } from \"../components/ui/form\";\nimport { Field, FieldLabel } from \"../components/ui/field\";\nimport { FormMessage } from \"../components/ui/form-message\";\nimport { Button } from \"../components/ui/button\";\nimport { Input } from \"../components/ui/input\";\nimport { Checkbox } from \"../components/ui/checkbox\";\nimport { Label } from \"../components/ui/label\";\nimport { Separator } from \"../components/ui/separator\";\nimport { Eye, EyeOff, Sparkles, ArrowRight } from \"lucide-solid\";\n\nexport const Login01: Component = () => {\n const [showPassword, setShowPassword] = createSignal(false);\n\n const form = createForm({\n initialValues: {\n email: \"\",\n password: \"\",\n rememberMe: true,\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n if (!values.email) {\n errors.email = \"Email is required\";\n } else if (!values.email.includes(\"@\")) {\n errors.email = \"Please enter a valid email address\";\n }\n if (!values.password) {\n errors.password = \"Password is required\";\n }\n return errors;\n },\n onSubmit: async (values) => {\n // Simulate API request\n await new Promise((resolve) => setTimeout(resolve, 1200));\n },\n });\n\n const isFormValid = () =>\n form.values().email.trim() !== \"\" &&\n form.values().email.includes(\"@\") &&\n form.values().password.trim() !== \"\";\n\n return (\n <div class=\"@container w-full min-h-[560px] @5xl:min-h-[700px] grid grid-cols-1 @5xl:grid-cols-2 bg-background text-foreground rounded-lg border border-border overflow-hidden shadow-xs\">\n {/* Left Column: Login Form */}\n <div class=\"flex flex-col justify-between p-6 @md:p-10 @5xl:p-12 w-full\">\n {/* Brand Header */}\n <div class=\"flex items-center gap-2.5\">\n <div class=\"size-8 rounded-lg bg-primary flex items-center justify-center text-primary-foreground font-bold text-sm shadow-2xs shrink-0\">\n N\n </div>\n <span class=\"font-bold text-lg tracking-tight\">Nikala UI</span>\n </div>\n\n {/* Form Container */}\n <div class=\"mx-auto w-full max-w-sm my-auto py-6 @md:py-8\">\n <div class=\"space-y-1.5 text-left mb-6\">\n <h1 class=\"text-2xl @md:text-3xl font-bold tracking-tight text-foreground\">\n Welcome back\n </h1>\n <p class=\"text-xs @md:text-sm text-muted-foreground\">\n Enter your credentials to access your account dashboard\n </p>\n </div>\n\n {/* Social OAuth Buttons */}\n <div class=\"grid grid-cols-1 @xs:grid-cols-2 gap-2.5 mb-6\">\n <Button variant=\"outline\" class=\"w-full justify-center text-xs @md:text-sm h-9\">\n <svg class=\"size-4 mr-2 shrink-0\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z\" />\n </svg>\n GitHub\n </Button>\n <Button variant=\"outline\" class=\"w-full justify-center text-xs @md:text-sm h-9\">\n <svg class=\"size-4 mr-2 shrink-0\" viewBox=\"0 0 24 24\">\n <path\n fill=\"#4285F4\"\n d=\"M23.745 12.27c0-.7-.06-1.4-.19-2.07H12v4.51h6.6c-.29 1.52-1.14 2.82-2.4 3.68v3.05h3.88c2.27-2.09 3.66-5.17 3.66-9.17z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 24c3.24 0 5.95-1.08 7.93-2.91l-3.88-3.05c-1.08.72-2.45 1.16-4.05 1.16-3.12 0-5.77-2.1-6.72-4.93H1.25v3.15C3.26 21.36 7.33 24 12 24z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.28 14.27c-.25-.72-.38-1.49-.38-2.27s.13-1.55.38-2.27V6.58H1.25C.45 8.18 0 10.03 0 12s.45 3.82 1.25 5.42l4.03-3.15z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 4.75c1.77 0 3.35.61 4.6 1.8l3.42-3.42C17.95 1.19 15.24 0 12 0 7.33 0 3.26 2.64 1.25 6.58l4.03 3.15c.95-2.83 3.6-4.98 6.72-4.98z\"\n />\n </svg>\n Google\n </Button>\n </div>\n\n <div class=\"relative mb-6\">\n <div class=\"absolute inset-0 flex items-center\">\n <Separator />\n </div>\n <div class=\"relative flex justify-center text-xs uppercase\">\n <span class=\"bg-background px-3 text-muted-foreground font-medium text-[11px]\">\n Or continue with email\n </span>\n </div>\n </div>\n\n {/* Form with Nikala UI Form & Field ecosystem */}\n <Form onSubmit={form.handleSubmit} loading={form.isSubmitting()} class=\"space-y-4\">\n <Field>\n <FieldLabel for=\"login-email\" class=\"text-xs @md:text-sm\">Email address</FieldLabel>\n <Input\n id=\"login-email\"\n type=\"email\"\n placeholder=\"name@company.com\"\n value={form.values().email}\n onInput={form.handleChange(\"email\")}\n onBlur={form.handleBlur(\"email\")}\n autocomplete=\"email\"\n />\n <FormMessage form={form} name=\"email\" />\n </Field>\n\n <Field>\n <div class=\"flex items-center justify-between\">\n <FieldLabel for=\"login-password\" class=\"text-xs @md:text-sm\">Password</FieldLabel>\n <a\n href=\"/blocks/forgot-password-01\"\n class=\"text-[11px] @md:text-xs text-primary font-medium hover:underline\"\n >\n Forgot password?\n </a>\n </div>\n <div class=\"relative\">\n <Input\n id=\"login-password\"\n type={showPassword() ? \"text\" : \"password\"}\n placeholder=\"••••••••\"\n value={form.values().password}\n onInput={form.handleChange(\"password\")}\n onBlur={form.handleBlur(\"password\")}\n autocomplete=\"current-password\"\n class=\"pr-10\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword())}\n class=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors p-1 cursor-pointer\"\n aria-label={showPassword() ? \"Hide password\" : \"Show password\"}\n >\n <Show when={showPassword()} fallback={<Eye class=\"size-4\" />}>\n <EyeOff class=\"size-4\" />\n </Show>\n </button>\n </div>\n <FormMessage form={form} name=\"password\" />\n </Field>\n\n <div class=\"flex items-center space-x-2 pt-1\">\n <Checkbox\n id=\"remember\"\n checked={form.values().rememberMe}\n onChange={(checked) => form.setFieldValue(\"rememberMe\", checked)}\n />\n <Label\n for=\"remember\"\n class=\"text-xs font-normal text-muted-foreground cursor-pointer select-none\"\n >\n Remember me for 30 days\n </Label>\n </div>\n\n <Button\n type=\"submit\"\n class=\"w-full mt-2 font-medium\"\n disabled={form.isSubmitting() || !isFormValid()}\n >\n <Show when={form.isSubmitting()} fallback={<>Sign In <ArrowRight class=\"ml-2 size-4\" /></>}>\n Signing in...\n </Show>\n </Button>\n </Form>\n\n <p class=\"text-center text-xs text-muted-foreground mt-6\">\n Don't have an account?{\" \"}\n <a href=\"/blocks/register-01\" class=\"text-primary font-semibold hover:underline\">\n Sign up\n </a>\n </p>\n </div>\n\n {/* Footer info */}\n <div class=\"text-center @md:text-left text-xs text-muted-foreground pt-4 @md:pt-0\">\n By signing in, you agree to our{\" \"}\n <a href=\"#terms\" class=\"underline hover:text-foreground\">Terms of Service</a>{\" \"}\n and{\" \"}\n <a href=\"#privacy\" class=\"underline hover:text-foreground\">Privacy Policy</a>.\n </div>\n </div>\n\n {/* Right Column: Hero Visual & Art / Testimonial Showcase */}\n <div class=\"hidden @5xl:flex relative flex-col justify-between p-10 bg-muted/40 border-l border-border overflow-hidden\">\n <div class=\"absolute inset-0 bg-gradient-to-tr from-primary/10 via-transparent to-primary/5 pointer-events-none\" />\n\n <div class=\"relative z-10 flex items-center gap-2 text-sm font-semibold text-foreground/80\">\n <Sparkles class=\"size-4 text-primary\" />\n <span>Production Ready SolidJS UI</span>\n </div>\n\n <div class=\"relative z-10 max-w-md space-y-6\">\n <blockquote class=\"text-xl @md:text-2xl font-semibold tracking-tight text-foreground leading-snug\">\n \"Nikala UI transformed the way our team builds web applications with SolidJS. Fine-grained reactivity meets Tailwind v4 simplicity.\"\n </blockquote>\n <div class=\"space-y-1\">\n <p class=\"text-sm font-semibold text-foreground\">Davit Kakhidze</p>\n <p class=\"text-xs text-muted-foreground\">Head of Engineering at Studio</p>\n </div>\n </div>\n\n <div class=\"relative z-10 flex items-center justify-between text-xs text-muted-foreground\">\n <span>Honoring Niko Pirosmani</span>\n <span>© 2026 Nikala UI</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Login01;\n",
25
+ "type": "registry:block"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "marker",
3
+ "title": "Marker",
4
+ "description": "System chat events, date dividers, and live typing indicator badges.",
5
+ "type": "registry:ui",
6
+ "dependencies": [
7
+ "clsx",
8
+ "tailwind-merge"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "ui/marker.tsx",
13
+ "content": "import {\n splitProps,\n type Component,\n type JSX,\n type ParentComponent,\n Show,\n} from \"solid-js\";\nimport { cn } from \"@/lib/cn\";\n\n/* --- 1. Marker Root --- */\nexport interface MarkerProps extends JSX.HTMLAttributes<HTMLDivElement> {\n class?: string;\n}\n\nexport const Marker: ParentComponent<MarkerProps> = (props) => {\n const [local, rest] = splitProps(props, [\"class\", \"children\"]);\n\n return (\n <div\n role=\"status\"\n class={cn(\"flex w-full items-center justify-center my-3 text-center select-none\", local.class)}\n {...rest}\n >\n {local.children}\n </div>\n );\n};\n\n/* --- 2. MarkerContent --- */\nexport interface MarkerContentProps extends JSX.HTMLAttributes<HTMLDivElement> {\n class?: string;\n}\n\nexport const MarkerContent: ParentComponent<MarkerContentProps> = (props) => {\n const [local, rest] = splitProps(props, [\"class\", \"children\"]);\n\n return (\n <div\n class={cn(\n \"inline-flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-3 py-1 text-xs text-muted-foreground shadow-2xs backdrop-blur-xs\",\n local.class\n )}\n {...rest}\n >\n {local.children}\n </div>\n );\n};\n\n/* --- 3. MarkerDate (Date Divider) --- */\nexport interface MarkerDateProps extends JSX.HTMLAttributes<HTMLDivElement> {\n date?: string;\n class?: string;\n}\n\nexport const MarkerDate: ParentComponent<MarkerDateProps> = (props) => {\n const [local, rest] = splitProps(props, [\"date\", \"class\", \"children\"]);\n\n return (\n <div\n class={cn(\"relative flex w-full items-center justify-center my-4\", local.class)}\n {...rest}\n >\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-border/50\" />\n </div>\n <div class=\"relative flex items-center gap-1 bg-background px-3 py-0.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground rounded-md border border-border/40\">\n {local.children || local.date}\n </div>\n </div>\n );\n};\n\n/* --- 4. MarkerTyping (Live Typing Indicator) --- */\nexport interface MarkerTypingProps extends JSX.HTMLAttributes<HTMLDivElement> {\n name?: string;\n class?: string;\n}\n\nexport const MarkerTyping: Component<MarkerTypingProps> = (props) => {\n const [local, rest] = splitProps(props, [\"name\", \"class\"]);\n\n return (\n <div\n role=\"status\"\n aria-label={`${local.name || \"Someone\"} is typing`}\n class={cn(\"flex w-full items-center gap-2 text-xs text-muted-foreground my-2\", local.class)}\n {...rest}\n >\n <Show when={local.name}>\n <span class=\"font-medium text-foreground\">{local.name}</span> is typing\n </Show>\n\n {/* 3 Animated Bouncing Dots */}\n <span class=\"inline-flex items-center gap-1 px-2 py-1 rounded-md bg-muted/60 border border-border/40\">\n <span class=\"size-1.5 rounded-lg bg-foreground/60 animate-bounce [animation-delay:-0.3s]\" />\n <span class=\"size-1.5 rounded-lg bg-foreground/60 animate-bounce [animation-delay:-0.15s]\" />\n <span class=\"size-1.5 rounded-lg bg-foreground/60 animate-bounce\" />\n </span>\n </div>\n );\n};\n",
14
+ "type": "registry:ui"
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "marquee",
3
+ "title": "Marquee",
4
+ "description": "A smooth, GPU-accelerated infinite scrolling ticker component for logo clouds, testimonials, and live ribbons.",
5
+ "type": "registry:ui",
6
+ "dependencies": [
7
+ "clsx",
8
+ "tailwind-merge"
9
+ ],
10
+ "files": [
11
+ {
12
+ "path": "ui/marquee.tsx",
13
+ "content": "import {\n splitProps,\n createMemo,\n Index,\n type JSX,\n type ParentComponent,\n} from \"solid-js\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface MarqueeProps extends JSX.HTMLAttributes<HTMLDivElement> {\n class?: string;\n reverse?: boolean;\n pauseOnHover?: boolean;\n vertical?: boolean;\n repeat?: number;\n duration?: number | string;\n gap?: string;\n fadeEdges?: boolean;\n}\n\nexport const Marquee: ParentComponent<MarqueeProps> = (props) => {\n const [local, rest] = splitProps(props, [\n \"class\",\n \"reverse\",\n \"pauseOnHover\",\n \"vertical\",\n \"repeat\",\n \"duration\",\n \"gap\",\n \"fadeEdges\",\n \"children\",\n ]);\n\n const repeatCount = () => local.repeat ?? 4;\n const durationValue = () =>\n typeof local.duration === \"number\"\n ? `${local.duration}s`\n : local.duration || \"40s\";\n const gapValue = () => local.gap || \"1rem\";\n\n const repeatArray = createMemo(() =>\n Array.from({ length: repeatCount() }, (_, i) => i)\n );\n\n return (\n <>\n <style>{`\n @keyframes nikala-marquee {\n from {\n transform: translateX(0);\n }\n to {\n transform: translateX(calc(-100% - var(--marquee-gap, 1rem)));\n }\n }\n @keyframes nikala-marquee-vertical {\n from {\n transform: translateY(0);\n }\n to {\n transform: translateY(calc(-100% - var(--marquee-gap, 1rem)));\n }\n }\n .nikala-marquee-track {\n animation: nikala-marquee var(--marquee-duration, 40s) linear infinite;\n }\n .nikala-marquee-track-vertical {\n animation: nikala-marquee-vertical var(--marquee-duration, 40s) linear infinite;\n }\n [data-reverse=\"true\"] .nikala-marquee-track,\n [data-reverse=\"true\"] .nikala-marquee-track-vertical {\n animation-direction: reverse;\n }\n [data-pause=\"true\"]:hover .nikala-marquee-track,\n [data-pause=\"true\"]:hover .nikala-marquee-track-vertical {\n animation-play-state: paused;\n }\n `}</style>\n <div\n data-reverse={local.reverse ? \"true\" : \"false\"}\n data-pause={local.pauseOnHover ? \"true\" : \"false\"}\n style={{\n \"--marquee-duration\": durationValue(),\n \"--marquee-gap\": gapValue(),\n }}\n class={cn(\n \"group flex overflow-hidden p-2 select-none\",\n local.vertical ? \"flex-col h-full\" : \"flex-row w-full\",\n local.fadeEdges &&\n (local.vertical\n ? \"[mask-image:linear-gradient(to_bottom,transparent,black_10%,black_90%,transparent)]\"\n : \"[mask-image:linear-gradient(to_right,transparent,black_10%,black_90%,transparent)]\"),\n local.class\n )}\n {...rest}\n >\n <Index each={repeatArray()}>\n {() => (\n <div\n class={cn(\n \"flex shrink-0 justify-around items-center\",\n local.vertical\n ? \"flex-col min-h-full nikala-marquee-track-vertical\"\n : \"flex-row min-w-full nikala-marquee-track\"\n )}\n style={{\n gap: gapValue(),\n [local.vertical ? \"margin-bottom\" : \"margin-right\"]: gapValue(),\n }}\n >\n {local.children}\n </div>\n )}\n </Index>\n </div>\n </>\n );\n};\n",
14
+ "type": "registry:ui"
15
+ }
16
+ ]
17
+ }