@olwiba/ui 0.2.24 → 0.2.26

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 (209) hide show
  1. package/content/docs/app/app-shell.mdx +71 -0
  2. package/content/docs/app/auth-section.mdx +73 -0
  3. package/content/docs/app/billing-panel.mdx +38 -0
  4. package/content/docs/app/empty-state.mdx +47 -0
  5. package/content/docs/app/error-page.mdx +31 -0
  6. package/content/docs/app/index.mdx +13 -0
  7. package/content/docs/app/meta.json +4 -0
  8. package/content/docs/app/onboarding-wizard.mdx +41 -0
  9. package/content/docs/app/settings-section.mdx +37 -0
  10. package/content/docs/app/team-members-panel.mdx +35 -0
  11. package/content/docs/app/update-banner.mdx +43 -0
  12. package/content/docs/components/activity-feed.mdx +42 -0
  13. package/content/docs/components/chart.mdx +47 -0
  14. package/content/docs/components/command-menu.mdx +41 -0
  15. package/content/docs/components/confirm-dialog.mdx +26 -0
  16. package/content/docs/components/context-menu.mdx +26 -0
  17. package/content/docs/components/data-table.mdx +40 -0
  18. package/content/docs/components/dock.mdx +26 -0
  19. package/content/docs/components/feature-card.mdx +26 -0
  20. package/content/docs/components/file-upload.mdx +35 -0
  21. package/content/docs/components/full-page-spinner.mdx +44 -0
  22. package/content/docs/components/glass-card.mdx +26 -0
  23. package/content/docs/components/image-card.mdx +26 -0
  24. package/content/docs/components/index.mdx +49 -0
  25. package/content/docs/components/load-more.mdx +34 -0
  26. package/content/docs/components/meta.json +35 -0
  27. package/content/docs/components/notifications-popover.mdx +34 -0
  28. package/content/docs/components/notify.mdx +40 -0
  29. package/content/docs/components/olwiba-ui-context.mdx +69 -0
  30. package/content/docs/components/page-header.mdx +42 -0
  31. package/content/docs/components/pricing-card.mdx +26 -0
  32. package/content/docs/components/register-hotkeys.mdx +50 -0
  33. package/content/docs/components/root-error-fallback.mdx +39 -0
  34. package/content/docs/components/spotlight.mdx +26 -0
  35. package/content/docs/components/stat-card.mdx +26 -0
  36. package/content/docs/components/suspensed.mdx +42 -0
  37. package/content/docs/components/testimonial-card.mdx +26 -0
  38. package/content/docs/components/theme-color-updater.mdx +40 -0
  39. package/content/docs/components/theme-switch-minimal.mdx +32 -0
  40. package/content/docs/components/version-banner.mdx +44 -0
  41. package/content/docs/email/action-email.mdx +62 -0
  42. package/content/docs/email/email-layout.mdx +58 -0
  43. package/content/docs/email/email-link-fallback.mdx +46 -0
  44. package/content/docs/email/index.mdx +32 -0
  45. package/content/docs/email/meta.json +10 -0
  46. package/content/docs/email/notice-email.mdx +51 -0
  47. package/content/docs/hooks/index.mdx +21 -0
  48. package/content/docs/hooks/meta.json +16 -0
  49. package/content/docs/hooks/use-confirm.mdx +81 -0
  50. package/content/docs/hooks/use-controlled-open.mdx +53 -0
  51. package/content/docs/hooks/use-copy-to-clipboard.mdx +26 -0
  52. package/content/docs/hooks/use-debounce.mdx +26 -0
  53. package/content/docs/hooks/use-intersection-observer.mdx +26 -0
  54. package/content/docs/hooks/use-local-storage.mdx +26 -0
  55. package/content/docs/hooks/use-media-query.mdx +26 -0
  56. package/content/docs/hooks/use-mounted.mdx +39 -0
  57. package/content/docs/hooks/use-pagination.mdx +26 -0
  58. package/content/docs/hooks/use-scrolled-past.mdx +44 -0
  59. package/content/docs/index.mdx +68 -0
  60. package/content/docs/marketing/contact-section.mdx +16 -0
  61. package/content/docs/marketing/cta-section.mdx +31 -0
  62. package/content/docs/marketing/faq-section.mdx +16 -0
  63. package/content/docs/marketing/features-section.mdx +23 -0
  64. package/content/docs/marketing/footer.mdx +16 -0
  65. package/content/docs/marketing/hero-section.mdx +16 -0
  66. package/content/docs/marketing/index.mdx +22 -0
  67. package/content/docs/marketing/meta.json +20 -0
  68. package/content/docs/marketing/navbar.mdx +16 -0
  69. package/content/docs/marketing/newsletter-section.mdx +16 -0
  70. package/content/docs/marketing/post-list.mdx +32 -0
  71. package/content/docs/marketing/pricing-section.mdx +16 -0
  72. package/content/docs/marketing/stats-section.mdx +16 -0
  73. package/content/docs/marketing/steps-section.mdx +60 -0
  74. package/content/docs/marketing/team-section.mdx +16 -0
  75. package/content/docs/marketing/testimonials-section.mdx +16 -0
  76. package/content/docs/mechanics/carousel.mdx +42 -0
  77. package/content/docs/mechanics/index.mdx +11 -0
  78. package/content/docs/mechanics/meta.json +4 -0
  79. package/content/docs/mechanics/sortable.mdx +44 -0
  80. package/content/docs/meta.json +4 -0
  81. package/content/docs/motion/animated-swap.mdx +75 -0
  82. package/content/docs/motion/count-up.mdx +31 -0
  83. package/content/docs/motion/fade-in.mdx +34 -0
  84. package/content/docs/motion/index.mdx +12 -0
  85. package/content/docs/motion/meta.json +4 -0
  86. package/content/docs/motion/page-transition.mdx +29 -0
  87. package/content/docs/motion/stagger-children.mdx +31 -0
  88. package/content/docs/overlays/index.mdx +9 -0
  89. package/content/docs/overlays/meta.json +4 -0
  90. package/content/docs/overlays/overlay.mdx +60 -0
  91. package/content/docs/overlays/underlay.mdx +56 -0
  92. package/dist/email/index.d.ts +8 -1
  93. package/dist/email/index.js +3 -3
  94. package/dist/email/index.js.map +1 -1
  95. package/dist/index.d.ts +51 -3
  96. package/dist/index.js +40 -16
  97. package/dist/index.js.map +1 -1
  98. package/docs-manifest.json +253 -0
  99. package/package.json +17 -9
  100. package/site/demos/action-email.tsx +6 -0
  101. package/site/demos/activity-feed.tsx +42 -0
  102. package/site/demos/animated-swap.tsx +42 -0
  103. package/site/demos/app-shell.tsx +47 -0
  104. package/site/demos/app-ui-page.tsx +9 -0
  105. package/site/demos/application-sidebar-block.tsx +9 -0
  106. package/site/demos/auth-section.tsx +15 -0
  107. package/site/demos/auth-split-block.tsx +9 -0
  108. package/site/demos/billing-page.tsx +157 -0
  109. package/site/demos/billing-panel.tsx +26 -0
  110. package/site/demos/carousel.tsx +34 -0
  111. package/site/demos/chart.tsx +55 -0
  112. package/site/demos/command-menu.tsx +39 -0
  113. package/site/demos/confirm-dialog.tsx +27 -0
  114. package/site/demos/contact-form-block.tsx +3 -0
  115. package/site/demos/contact-section.tsx +2 -0
  116. package/site/demos/context-menu.tsx +30 -0
  117. package/site/demos/count-up.tsx +23 -0
  118. package/site/demos/cta-section.tsx +6 -0
  119. package/site/demos/dashboard-overview-block.tsx +9 -0
  120. package/site/demos/dashboard-shell-block.tsx +10 -0
  121. package/site/demos/data-table.tsx +47 -0
  122. package/site/demos/demo-brand.tsx +23 -0
  123. package/site/demos/dock.tsx +20 -0
  124. package/site/demos/document-sidebar-block.tsx +9 -0
  125. package/site/demos/email-examples.tsx +58 -0
  126. package/site/demos/email-frame.tsx +50 -0
  127. package/site/demos/email-layout.tsx +6 -0
  128. package/site/demos/email-link-fallback.tsx +6 -0
  129. package/site/demos/email-previews.generated.ts +11 -0
  130. package/site/demos/empty-state-block.tsx +3 -0
  131. package/site/demos/empty-state.tsx +23 -0
  132. package/site/demos/error-page.tsx +5 -0
  133. package/site/demos/fade-in.tsx +18 -0
  134. package/site/demos/faq-section.tsx +6 -0
  135. package/site/demos/feature-card.tsx +13 -0
  136. package/site/demos/features-section.tsx +6 -0
  137. package/site/demos/file-upload.tsx +16 -0
  138. package/site/demos/footer.tsx +42 -0
  139. package/site/demos/full-page-spinner.tsx +9 -0
  140. package/site/demos/glass-card.tsx +14 -0
  141. package/site/demos/glow-effect.tsx +3 -0
  142. package/site/demos/gradient-background.tsx +3 -0
  143. package/site/demos/grid-pattern.tsx +3 -0
  144. package/site/demos/hero-section.tsx +6 -0
  145. package/site/demos/image-card.tsx +17 -0
  146. package/site/demos/login-block.tsx +9 -0
  147. package/site/demos/marketing-cta-block.tsx +3 -0
  148. package/site/demos/marketing-demo-data.tsx +114 -0
  149. package/site/demos/marketing-faq-block.tsx +3 -0
  150. package/site/demos/marketing-features-block.tsx +3 -0
  151. package/site/demos/marketing-footer-block.tsx +3 -0
  152. package/site/demos/marketing-hero-block.tsx +10 -0
  153. package/site/demos/marketing-nav-block.tsx +3 -0
  154. package/site/demos/marketing-newsletter-block.tsx +3 -0
  155. package/site/demos/marketing-page.tsx +52 -0
  156. package/site/demos/marketing-pricing-block.tsx +3 -0
  157. package/site/demos/marketing-stats-block.tsx +3 -0
  158. package/site/demos/marketing-team-block.tsx +3 -0
  159. package/site/demos/marketing-testimonials-block.tsx +3 -0
  160. package/site/demos/navbar.tsx +32 -0
  161. package/site/demos/newsletter-section.tsx +2 -0
  162. package/site/demos/noise-overlay.tsx +3 -0
  163. package/site/demos/not-found-block.tsx +3 -0
  164. package/site/demos/notice-email.tsx +6 -0
  165. package/site/demos/notifications-popover.tsx +27 -0
  166. package/site/demos/notify.tsx +44 -0
  167. package/site/demos/olwiba-ui-context.tsx +51 -0
  168. package/site/demos/onboarding-block.tsx +3 -0
  169. package/site/demos/onboarding-wizard.tsx +43 -0
  170. package/site/demos/overlay.tsx +72 -0
  171. package/site/demos/page-header.tsx +15 -0
  172. package/site/demos/page-transition.tsx +34 -0
  173. package/site/demos/post-list.tsx +24 -0
  174. package/site/demos/pricing-card.tsx +27 -0
  175. package/site/demos/pricing-section.tsx +6 -0
  176. package/site/demos/register-hotkeys.tsx +39 -0
  177. package/site/demos/root-error-fallback.tsx +28 -0
  178. package/site/demos/settings-layout-block.tsx +3 -0
  179. package/site/demos/settings-section.tsx +22 -0
  180. package/site/demos/sign-in-page.tsx +10 -0
  181. package/site/demos/sortable.tsx +30 -0
  182. package/site/demos/spotlight.tsx +29 -0
  183. package/site/demos/stagger-children.tsx +16 -0
  184. package/site/demos/stat-card.tsx +12 -0
  185. package/site/demos/stats-section.tsx +6 -0
  186. package/site/demos/steps-section.tsx +66 -0
  187. package/site/demos/suspensed.tsx +31 -0
  188. package/site/demos/team-members-panel.tsx +26 -0
  189. package/site/demos/team-section.tsx +2 -0
  190. package/site/demos/testimonial-card.tsx +17 -0
  191. package/site/demos/testimonials-section.tsx +6 -0
  192. package/site/demos/theme-color-updater.tsx +32 -0
  193. package/site/demos/theme-switch-minimal.tsx +10 -0
  194. package/site/demos/underlay.tsx +74 -0
  195. package/site/demos/update-banner.tsx +31 -0
  196. package/site/demos/use-copy-to-clipboard.tsx +21 -0
  197. package/site/demos/use-debounce.tsx +25 -0
  198. package/site/demos/use-intersection-observer.tsx +32 -0
  199. package/site/demos/use-local-storage.tsx +22 -0
  200. package/site/demos/use-media-query.tsx +31 -0
  201. package/site/demos/use-pagination.tsx +31 -0
  202. package/site/demos/user-profile-block.tsx +3 -0
  203. package/site/demos/version-banner.tsx +27 -0
  204. package/src/components/Chart.tsx +38 -7
  205. package/src/components/DataTable.tsx +56 -8
  206. package/src/components/Notify.tsx +32 -1
  207. package/src/email/EmailLinkFallback.tsx +7 -1
  208. package/src/email/index.ts +3 -0
  209. package/src/marketing/Footer.tsx +7 -1
package/dist/index.js CHANGED
@@ -962,6 +962,7 @@ function DataTable({
962
962
  selectable = false,
963
963
  onSelectionChange,
964
964
  pageSize = 10,
965
+ pagination,
965
966
  toolbar,
966
967
  onRowClick,
967
968
  emptyMessage = "No results.",
@@ -988,8 +989,11 @@ function DataTable({
988
989
  },
989
990
  getCoreRowModel: getCoreRowModel(),
990
991
  getSortedRowModel: getSortedRowModel(),
991
- ...pageSize > 0 ? { getPaginationRowModel: getPaginationRowModel() } : {},
992
- initialState: pageSize > 0 ? { pagination: { pageSize } } : void 0,
992
+ // Server-paginated tables must not slice: `data` is already the page, and
993
+ // running the client model over it would paginate a single page again.
994
+ ...pageSize > 0 && !pagination ? { getPaginationRowModel: getPaginationRowModel() } : {},
995
+ ...pagination ? { manualPagination: true } : {},
996
+ initialState: pageSize > 0 && !pagination ? { pagination: { pageSize } } : void 0,
993
997
  enableRowSelection: selectable
994
998
  });
995
999
  React21.useEffect(() => {
@@ -997,6 +1001,12 @@ function DataTable({
997
1001
  onSelectionChange(table.getSelectedRowModel().rows.map((r) => r.original));
998
1002
  }, [rowSelection]);
999
1003
  const rows = table.getRowModel().rows;
1004
+ const canPrevious = pagination ? pagination.hasPrevious ?? pagination.pageIndex > 0 : table.getCanPreviousPage();
1005
+ const canNext = pagination ? pagination.hasNext ?? (pagination.pageCount !== void 0 && pagination.pageIndex < pagination.pageCount - 1) : table.getCanNextPage();
1006
+ const goPrevious = () => pagination ? pagination.onPageChange(pagination.pageIndex - 1) : table.previousPage();
1007
+ const goNext = () => pagination ? pagination.onPageChange(pagination.pageIndex + 1) : table.nextPage();
1008
+ const showPager = pagination ? canPrevious || canNext : pageSize > 0 && table.getPageCount() > 1;
1009
+ const pageLabel = pagination ? pagination.pageCount !== void 0 ? `Page ${pagination.pageIndex + 1} of ${pagination.pageCount}` : `Page ${pagination.pageIndex + 1}` : `Page ${table.getState().pagination.pageIndex + 1} of ${table.getPageCount()}`;
1000
1010
  return /* @__PURE__ */ jsxs("div", { className: cn$1("space-y-4", className), children: [
1001
1011
  (searchKey || toolbar) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
1002
1012
  searchKey ? /* @__PURE__ */ jsxs("div", { className: "relative max-w-sm flex-1", children: [
@@ -1052,18 +1062,18 @@ function DataTable({
1052
1062
  row.id
1053
1063
  )) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: allColumns.length, className: "h-24 text-center text-muted-foreground", children: emptyMessage }) }) })
1054
1064
  ] }) }),
1055
- (selectable || pageSize > 0 && table.getPageCount() > 1) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
1065
+ (selectable || showPager) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
1056
1066
  /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
1057
1067
  selectable && `${table.getFilteredSelectedRowModel().rows.length} of ${table.getFilteredRowModel().rows.length} selected`,
1058
- selectable && pageSize > 0 && table.getPageCount() > 1 && " \xB7 ",
1059
- pageSize > 0 && table.getPageCount() > 1 && `Page ${table.getState().pagination.pageIndex + 1} of ${table.getPageCount()}`
1068
+ selectable && showPager && " \xB7 ",
1069
+ showPager && pageLabel
1060
1070
  ] }),
1061
- pageSize > 0 && table.getPageCount() > 1 && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
1062
- /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage(), children: [
1071
+ showPager && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
1072
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: goPrevious, disabled: !canPrevious, children: [
1063
1073
  /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" }),
1064
1074
  " Previous"
1065
1075
  ] }),
1066
- /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => table.nextPage(), disabled: !table.getCanNextPage(), children: [
1076
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: goNext, disabled: !canNext, children: [
1067
1077
  "Next ",
1068
1078
  /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
1069
1079
  ] })
@@ -4328,6 +4338,9 @@ function Chart({
4328
4338
  height = 300,
4329
4339
  grid = true,
4330
4340
  legend,
4341
+ stacked = false,
4342
+ xTickFormatter,
4343
+ yDomain,
4331
4344
  valueFormatter = (v) => String(v),
4332
4345
  className
4333
4346
  }) {
@@ -4370,12 +4383,13 @@ function Chart({
4370
4383
  if (type === "bar") {
4371
4384
  chart = /* @__PURE__ */ jsxs(BarChart, { data, barCategoryGap: "25%", children: [
4372
4385
  gridEl,
4373
- /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps }),
4374
- /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, tickFormatter: valueFormatter }),
4386
+ /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps, tickFormatter: xTickFormatter }),
4387
+ /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, domain: yDomain, tickFormatter: valueFormatter }),
4375
4388
  tooltip,
4376
4389
  series.map((s, i) => /* @__PURE__ */ jsx(
4377
4390
  Bar,
4378
4391
  {
4392
+ stackId: stacked ? "stack" : void 0,
4379
4393
  dataKey: s.key,
4380
4394
  name: s.label ?? s.key,
4381
4395
  fill: seriesColor(s, i),
@@ -4388,8 +4402,8 @@ function Chart({
4388
4402
  } else if (type === "area") {
4389
4403
  chart = /* @__PURE__ */ jsxs(AreaChart, { data, children: [
4390
4404
  gridEl,
4391
- /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps }),
4392
- /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, tickFormatter: valueFormatter }),
4405
+ /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps, tickFormatter: xTickFormatter }),
4406
+ /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, domain: yDomain, tickFormatter: valueFormatter }),
4393
4407
  tooltip,
4394
4408
  series.map((s, i) => /* @__PURE__ */ jsx(
4395
4409
  Area,
@@ -4397,10 +4411,11 @@ function Chart({
4397
4411
  type: "monotone",
4398
4412
  dataKey: s.key,
4399
4413
  name: s.label ?? s.key,
4414
+ stackId: stacked ? "stack" : void 0,
4400
4415
  stroke: seriesColor(s, i),
4401
4416
  strokeWidth: 2,
4402
4417
  fill: seriesColor(s, i),
4403
- fillOpacity: 0.12,
4418
+ fillOpacity: stacked ? 0.35 : 0.12,
4404
4419
  dot: false,
4405
4420
  activeDot: { r: 4 }
4406
4421
  },
@@ -4410,8 +4425,8 @@ function Chart({
4410
4425
  } else {
4411
4426
  chart = /* @__PURE__ */ jsxs(LineChart, { data, children: [
4412
4427
  gridEl,
4413
- /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps }),
4414
- /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, tickFormatter: valueFormatter }),
4428
+ /* @__PURE__ */ jsx(XAxis, { dataKey: xKey, ...axisProps, tickFormatter: xTickFormatter }),
4429
+ /* @__PURE__ */ jsx(YAxis, { ...axisProps, width: 48, domain: yDomain, tickFormatter: valueFormatter }),
4415
4430
  tooltip,
4416
4431
  series.map((s, i) => /* @__PURE__ */ jsx(
4417
4432
  Line,
@@ -4638,9 +4653,18 @@ function NotificationToast({
4638
4653
  ] })
4639
4654
  ] }) });
4640
4655
  }
4656
+ function defaultDuration(variant, hasAction) {
4657
+ if (variant === "error") return 1e4;
4658
+ if (variant === "warning") return 8e3;
4659
+ if (hasAction) return 8e3;
4660
+ return void 0;
4661
+ }
4641
4662
  function notify(options) {
4642
4663
  const { duration, ...toastProps } = options;
4643
- return toast.custom((id) => /* @__PURE__ */ jsx(NotificationToast, { ...toastProps, onDismiss: () => toast.dismiss(id) }), { duration });
4664
+ const resolved = duration ?? defaultDuration(toastProps.variant, Boolean(toastProps.action || toastProps.secondaryAction));
4665
+ return toast.custom((id) => /* @__PURE__ */ jsx(NotificationToast, { ...toastProps, onDismiss: () => toast.dismiss(id) }), {
4666
+ duration: resolved
4667
+ });
4644
4668
  }
4645
4669
  function NotificationsPopover({
4646
4670
  notifications,