@rojaostudio/ds 1.0.1 → 1.0.2

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 (134) hide show
  1. package/dist/components/accordion.js +43 -37
  2. package/dist/components/alert.js +35 -28
  3. package/dist/components/avatar.js +41 -34
  4. package/dist/components/badge.js +21 -14
  5. package/dist/components/blocker-card.js +11 -2
  6. package/dist/components/bottom-sheet.js +60 -53
  7. package/dist/components/breadcrumb.js +32 -22
  8. package/dist/components/button.js +18 -11
  9. package/dist/components/card.js +24 -9
  10. package/dist/components/chat-bubble.js +6 -5
  11. package/dist/components/checkbox.js +61 -48
  12. package/dist/components/chip-input.js +98 -81
  13. package/dist/components/chips.js +36 -29
  14. package/dist/components/choice-card.js +48 -42
  15. package/dist/components/choice-carousel.js +79 -74
  16. package/dist/components/choice-preview-card.js +17 -6
  17. package/dist/components/color-input.js +41 -35
  18. package/dist/components/combobox.js +97 -75
  19. package/dist/components/context-menu.js +17 -13
  20. package/dist/components/copilot-hint.js +40 -31
  21. package/dist/components/copy-field.js +8 -5
  22. package/dist/components/currency-input.js +40 -32
  23. package/dist/components/danger-zone.js +19 -9
  24. package/dist/components/data-table-header.js +185 -135
  25. package/dist/components/date-picker.js +114 -95
  26. package/dist/components/divider.js +11 -8
  27. package/dist/components/drawer.js +40 -28
  28. package/dist/components/dropzone.js +23 -20
  29. package/dist/components/empty-state.js +26 -23
  30. package/dist/components/fab.js +38 -26
  31. package/dist/components/filter-chip.js +20 -16
  32. package/dist/components/floating-stepper.js +42 -32
  33. package/dist/components/form-card-header.js +9 -1
  34. package/dist/components/icon-button.js +19 -13
  35. package/dist/components/image-crop-modal.js +69 -48
  36. package/dist/components/image-upload.js +172 -128
  37. package/dist/components/input.js +90 -62
  38. package/dist/components/insight-card.js +12 -1
  39. package/dist/components/label.js +12 -7
  40. package/dist/components/media-tile.js +11 -8
  41. package/dist/components/menu.js +28 -25
  42. package/dist/components/modal.js +43 -28
  43. package/dist/components/notice.js +34 -16
  44. package/dist/components/option-tile.js +55 -49
  45. package/dist/components/page-shell.js +13 -6
  46. package/dist/components/page-skeleton.js +32 -2
  47. package/dist/components/page-tabs.js +39 -26
  48. package/dist/components/pagination.js +38 -33
  49. package/dist/components/paywall-banner.js +19 -3
  50. package/dist/components/paywall.js +18 -8
  51. package/dist/components/phone-frame.js +5 -4
  52. package/dist/components/phone-input.js +50 -31
  53. package/dist/components/pix-icon.js +11 -6
  54. package/dist/components/popover.js +27 -23
  55. package/dist/components/pricing-card.js +16 -1
  56. package/dist/components/qr-display.js +16 -11
  57. package/dist/components/radio.js +73 -56
  58. package/dist/components/row-actions.js +61 -53
  59. package/dist/components/saving-bar-context.js +35 -29
  60. package/dist/components/saving-bar.js +36 -33
  61. package/dist/components/search.js +49 -44
  62. package/dist/components/section-card.js +43 -35
  63. package/dist/components/section-header.js +11 -1
  64. package/dist/components/select.js +83 -62
  65. package/dist/components/selectable-card.js +10 -3
  66. package/dist/components/setting-row.js +11 -1
  67. package/dist/components/settings-list.js +9 -5
  68. package/dist/components/skeleton.js +6 -5
  69. package/dist/components/slider.js +52 -38
  70. package/dist/components/spinner.js +18 -12
  71. package/dist/components/step-progress.js +11 -10
  72. package/dist/components/summary-bar.js +33 -28
  73. package/dist/components/table.js +20 -15
  74. package/dist/components/textarea.js +40 -24
  75. package/dist/components/themed.d.ts +1 -1
  76. package/dist/components/themed.js +2 -1
  77. package/dist/components/time-picker.js +117 -97
  78. package/dist/components/toaster.js +80 -74
  79. package/dist/components/toggle-card-compact.js +79 -71
  80. package/dist/components/toggle-card.js +61 -53
  81. package/dist/components/toggle-group.js +35 -29
  82. package/dist/components/toggle.js +46 -36
  83. package/dist/components/tooltip.js +30 -25
  84. package/dist/components/typing-indicator.js +10 -7
  85. package/dist/targets/native/components/accordion.js +31 -25
  86. package/dist/targets/native/components/alert.js +22 -16
  87. package/dist/targets/native/components/avatar.js +36 -29
  88. package/dist/targets/native/components/badge.js +4 -3
  89. package/dist/targets/native/components/button.js +11 -4
  90. package/dist/targets/native/components/card.js +2 -1
  91. package/dist/targets/native/components/checkbox.js +18 -15
  92. package/dist/targets/native/components/chips.js +19 -16
  93. package/dist/targets/native/components/choice-card.js +29 -23
  94. package/dist/targets/native/components/context-menu.js +13 -9
  95. package/dist/targets/native/components/currency-input.js +28 -25
  96. package/dist/targets/native/components/danger-zone.js +10 -4
  97. package/dist/targets/native/components/date-picker.js +86 -70
  98. package/dist/targets/native/components/divider.js +3 -2
  99. package/dist/targets/native/components/empty-state.js +6 -1
  100. package/dist/targets/native/components/fab.js +32 -26
  101. package/dist/targets/native/components/filter-chip.js +9 -8
  102. package/dist/targets/native/components/form-field.js +20 -10
  103. package/dist/targets/native/components/form-screen.js +50 -45
  104. package/dist/targets/native/components/google-icon.js +31 -25
  105. package/dist/targets/native/components/icon-button.js +6 -4
  106. package/dist/targets/native/components/icon.js +2 -1
  107. package/dist/targets/native/components/image-upload.js +59 -50
  108. package/dist/targets/native/components/input.js +41 -34
  109. package/dist/targets/native/components/list-item.js +29 -23
  110. package/dist/targets/native/components/menu.js +12 -10
  111. package/dist/targets/native/components/modal.js +41 -32
  112. package/dist/targets/native/components/paywall-banner.js +13 -4
  113. package/dist/targets/native/components/paywall.js +11 -1
  114. package/dist/targets/native/components/radio.js +19 -16
  115. package/dist/targets/native/components/search.js +41 -38
  116. package/dist/targets/native/components/select.js +71 -63
  117. package/dist/targets/native/components/sheet.js +36 -30
  118. package/dist/targets/native/components/skeleton.js +6 -5
  119. package/dist/targets/native/components/slider.js +51 -43
  120. package/dist/targets/native/components/spinner.js +2 -1
  121. package/dist/targets/native/components/stepper.js +14 -9
  122. package/dist/targets/native/components/switch.js +15 -14
  123. package/dist/targets/native/components/text.js +2 -1
  124. package/dist/targets/native/components/textarea.js +2 -1
  125. package/dist/targets/native/components/theme.js +2 -1
  126. package/dist/targets/native/components/toaster.js +24 -21
  127. package/dist/targets/native/index.d.ts +1 -1
  128. package/dist/targets/native/index.js +1 -3
  129. package/package.json +3 -6
  130. package/styles/base.css +3 -3
  131. package/brand/rojao-black-on-white.png +0 -0
  132. package/brand/rojao-black.png +0 -0
  133. package/brand/rojao-white-on-black.png +0 -0
  134. package/brand/rojao-white.png +0 -0
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import "../chunk-ORMEWXMH.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
3
4
  import { useId, useRef } from "react";
4
5
  import { Check } from "lucide-react";
5
6
  function OptionTile({
@@ -15,7 +16,7 @@ function OptionTile({
15
16
  fullSpan = false,
16
17
  className = ""
17
18
  }) {
18
- return /* @__PURE__ */ React.createElement(
19
+ return /* @__PURE__ */ jsxs(
19
20
  "button",
20
21
  {
21
22
  type: "button",
@@ -34,30 +35,32 @@ function OptionTile({
34
35
  disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer",
35
36
  fullSpan ? "col-span-full" : "",
36
37
  className
37
- ].filter(Boolean).join(" ")
38
- },
39
- selected && /* @__PURE__ */ React.createElement("span", { className: "absolute right-2 top-2 flex size-4 items-center justify-center rounded-full [background:var(--option-tile-check)] [color:var(--option-tile-check-icon)]" }, /* @__PURE__ */ React.createElement(Check, { size: 11, strokeWidth: 3 })),
40
- icon && /* @__PURE__ */ React.createElement(
41
- "span",
42
- {
43
- className: [
44
- "flex size-10 items-center justify-center rounded-(--radius-card) transition-colors [&_svg]:size-5",
45
- selected ? "[background:var(--option-tile-icon-bg-active)] [color:var(--option-tile-icon-active)]" : "[background:var(--option-tile-icon-bg)] [color:var(--option-tile-icon)]"
46
- ].join(" ")
47
- },
48
- icon
49
- ),
50
- /* @__PURE__ */ React.createElement(
51
- "span",
52
- {
53
- className: [
54
- icon ? "text-caption" : "text-label",
55
- "font-semibold leading-tight",
56
- selected ? "[color:var(--option-tile-label-active)]" : "[color:var(--option-tile-label)]"
57
- ].join(" ")
58
- },
59
- label
60
- )
38
+ ].filter(Boolean).join(" "),
39
+ children: [
40
+ selected && /* @__PURE__ */ jsx("span", { className: "absolute right-2 top-2 flex size-4 items-center justify-center rounded-full [background:var(--option-tile-check)] [color:var(--option-tile-check-icon)]", children: /* @__PURE__ */ jsx(Check, { size: 11, strokeWidth: 3 }) }),
41
+ icon && /* @__PURE__ */ jsx(
42
+ "span",
43
+ {
44
+ className: [
45
+ "flex size-10 items-center justify-center rounded-(--radius-card) transition-colors [&_svg]:size-5",
46
+ selected ? "[background:var(--option-tile-icon-bg-active)] [color:var(--option-tile-icon-active)]" : "[background:var(--option-tile-icon-bg)] [color:var(--option-tile-icon)]"
47
+ ].join(" "),
48
+ children: icon
49
+ }
50
+ ),
51
+ /* @__PURE__ */ jsx(
52
+ "span",
53
+ {
54
+ className: [
55
+ icon ? "text-caption" : "text-label",
56
+ "font-semibold leading-tight",
57
+ selected ? "[color:var(--option-tile-label-active)]" : "[color:var(--option-tile-label)]"
58
+ ].join(" "),
59
+ children: label
60
+ }
61
+ )
62
+ ]
63
+ }
61
64
  );
62
65
  }
63
66
  function OptionTileGrid(props) {
@@ -106,37 +109,40 @@ function OptionTileGrid(props) {
106
109
  break;
107
110
  }
108
111
  };
109
- const grid = /* @__PURE__ */ React.createElement(
112
+ const grid = /* @__PURE__ */ jsx(
110
113
  "div",
111
114
  {
112
115
  id: groupId,
113
116
  role: multiple ? "group" : "radiogroup",
114
117
  "aria-label": ariaLabel,
115
- className: ["grid gap-2", columns === 2 ? "grid-cols-2" : "grid-cols-2 sm:grid-cols-3", label ? "" : className].join(" ")
116
- },
117
- options.map((opt, i) => {
118
- const Icon = opt.icon;
119
- return /* @__PURE__ */ React.createElement(
120
- OptionTile,
121
- {
122
- key: opt.value,
123
- multiple,
124
- selected: isSel(opt.value),
125
- label: opt.label,
126
- icon: Icon ? /* @__PURE__ */ React.createElement(Icon, null) : void 0,
127
- fullSpan: opt.fullSpan,
128
- onClick: () => activate(opt.value),
129
- tabIndex: multiple ? 0 : i === activeIdx ? 0 : -1,
130
- onKeyDown: (e) => onKeyDown(e, i),
131
- buttonRef: (el) => {
132
- btns.current[i] = el;
133
- }
134
- }
135
- );
136
- })
118
+ className: ["grid gap-2", columns === 2 ? "grid-cols-2" : "grid-cols-2 sm:grid-cols-3", label ? "" : className].join(" "),
119
+ children: options.map((opt, i) => {
120
+ const Icon = opt.icon;
121
+ return /* @__PURE__ */ jsx(
122
+ OptionTile,
123
+ {
124
+ multiple,
125
+ selected: isSel(opt.value),
126
+ label: opt.label,
127
+ icon: Icon ? /* @__PURE__ */ jsx(Icon, {}) : void 0,
128
+ fullSpan: opt.fullSpan,
129
+ onClick: () => activate(opt.value),
130
+ tabIndex: multiple ? 0 : i === activeIdx ? 0 : -1,
131
+ onKeyDown: (e) => onKeyDown(e, i),
132
+ buttonRef: (el) => {
133
+ btns.current[i] = el;
134
+ }
135
+ },
136
+ opt.value
137
+ );
138
+ })
139
+ }
137
140
  );
138
141
  if (!label) return grid;
139
- return /* @__PURE__ */ React.createElement("div", { className: ["flex flex-col gap-2", className].join(" ") }, /* @__PURE__ */ React.createElement("span", { className: "text-label font-medium text-fg-primary" }, label), grid);
142
+ return /* @__PURE__ */ jsxs("div", { className: ["flex flex-col gap-2", className].join(" "), children: [
143
+ /* @__PURE__ */ jsx("span", { className: "text-label font-medium text-fg-primary", children: label }),
144
+ grid
145
+ ] });
140
146
  }
141
147
  export {
142
148
  OptionTile,
@@ -1,4 +1,5 @@
1
1
  import "../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  const WIDTH_CLS = {
3
4
  narrow: "max-w-screen-md",
4
5
  default: "max-w-screen-xl",
@@ -10,7 +11,7 @@ function PageShell({
10
11
  children,
11
12
  className = ""
12
13
  }) {
13
- return /* @__PURE__ */ React.createElement(
14
+ return /* @__PURE__ */ jsx(
14
15
  "div",
15
16
  {
16
17
  className: [
@@ -18,16 +19,22 @@ function PageShell({
18
19
  WIDTH_CLS[maxWidth],
19
20
  padded ? "px-4 sm:px-6 lg:px-8 py-6" : "",
20
21
  className
21
- ].filter(Boolean).join(" ")
22
- },
23
- children
22
+ ].filter(Boolean).join(" "),
23
+ children
24
+ }
24
25
  );
25
26
  }
26
27
  function PageShellHeader({ title, eyebrow, actions, className = "" }) {
27
- return /* @__PURE__ */ React.createElement("div", { className: ["flex items-start justify-between gap-4 mb-6", className].filter(Boolean).join(" ") }, /* @__PURE__ */ React.createElement("div", { className: "min-w-0" }, eyebrow && /* @__PURE__ */ React.createElement("p", { className: "text-caption font-medium text-fg-muted mb-1" }, eyebrow), /* @__PURE__ */ React.createElement("h1", { className: "text-heading-md font-semibold text-fg-primary truncate" }, title)), actions && /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 shrink-0" }, actions));
28
+ return /* @__PURE__ */ jsxs("div", { className: ["flex items-start justify-between gap-4 mb-6", className].filter(Boolean).join(" "), children: [
29
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
30
+ eyebrow && /* @__PURE__ */ jsx("p", { className: "text-caption font-medium text-fg-muted mb-1", children: eyebrow }),
31
+ /* @__PURE__ */ jsx("h1", { className: "text-heading-md font-semibold text-fg-primary truncate", children: title })
32
+ ] }),
33
+ actions && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 shrink-0", children: actions })
34
+ ] });
28
35
  }
29
36
  function PageShellBody({ children, className = "" }) {
30
- return /* @__PURE__ */ React.createElement("div", { className: ["space-y-6", className].filter(Boolean).join(" ") }, children);
37
+ return /* @__PURE__ */ jsx("div", { className: ["space-y-6", className].filter(Boolean).join(" "), children });
31
38
  }
32
39
  PageShell.Header = PageShellHeader;
33
40
  PageShell.Body = PageShellBody;
@@ -1,10 +1,40 @@
1
1
  import "../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { Skeleton } from "./skeleton.js";
3
4
  function PageSkeleton({ rows = 5, padded = true }) {
4
- return /* @__PURE__ */ React.createElement("div", { className: `space-y-6 ${padded ? "p-6" : ""}` }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-7 w-48" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-9 w-28" })), /* @__PURE__ */ React.createElement("div", { className: "border border-stroke-default rounded-(--radius-card) overflow-hidden" }, /* @__PURE__ */ React.createElement("div", { className: "bg-surface-raised border-b border-stroke-default px-4 py-3 flex gap-4" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-32" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-24" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-20" })), Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ React.createElement("div", { key: i, className: "px-4 py-3.5 flex gap-4 items-center border-b border-stroke-subtle last:border-0" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-40" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-28" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-16" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-20 ml-auto" })))));
5
+ return /* @__PURE__ */ jsxs("div", { className: `space-y-6 ${padded ? "p-6" : ""}`, children: [
6
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
7
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-48" }),
8
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-9 w-28" })
9
+ ] }),
10
+ /* @__PURE__ */ jsxs("div", { className: "border border-stroke-default rounded-(--radius-card) overflow-hidden", children: [
11
+ /* @__PURE__ */ jsxs("div", { className: "bg-surface-raised border-b border-stroke-default px-4 py-3 flex gap-4", children: [
12
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-32" }),
13
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
14
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-20" })
15
+ ] }),
16
+ Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "px-4 py-3.5 flex gap-4 items-center border-b border-stroke-subtle last:border-0", children: [
17
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-40" }),
18
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-28" }),
19
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-16" }),
20
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-20 ml-auto" })
21
+ ] }, i))
22
+ ] })
23
+ ] });
5
24
  }
6
25
  function CardsSkeleton({ count = 4, padded = true }) {
7
- return /* @__PURE__ */ React.createElement("div", { className: `space-y-6 ${padded ? "p-6" : ""}` }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-7 w-48" }), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-2 lg:grid-cols-4 gap-4" }, Array.from({ length: count }).map((_, i) => /* @__PURE__ */ React.createElement("div", { key: i, className: "border border-stroke-default rounded-(--radius-card) p-4 space-y-3" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-4 w-24" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-8 w-32" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-3 w-20" })))), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4" }, Array.from({ length: 2 }).map((_, i) => /* @__PURE__ */ React.createElement("div", { key: i, className: "border border-stroke-default rounded-(--radius-card) p-4 space-y-3" }, /* @__PURE__ */ React.createElement(Skeleton, { className: "h-5 w-32" }), /* @__PURE__ */ React.createElement(Skeleton, { className: "h-32 w-full" })))));
26
+ return /* @__PURE__ */ jsxs("div", { className: `space-y-6 ${padded ? "p-6" : ""}`, children: [
27
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-48" }),
28
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 lg:grid-cols-4 gap-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "border border-stroke-default rounded-(--radius-card) p-4 space-y-3", children: [
29
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-24" }),
30
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-8 w-32" }),
31
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-20" })
32
+ ] }, i)) }),
33
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-4", children: Array.from({ length: 2 }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "border border-stroke-default rounded-(--radius-card) p-4 space-y-3", children: [
34
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-32" }),
35
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-32 w-full" })
36
+ ] }, i)) })
37
+ ] });
8
38
  }
9
39
  export {
10
40
  CardsSkeleton,
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import "../chunk-ORMEWXMH.js";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
4
  import Link from "next/link";
4
5
  import { usePathname } from "next/navigation";
5
6
  function isActive(tab, pathname) {
@@ -18,37 +19,49 @@ function tabClass(active) {
18
19
  ].join(" ");
19
20
  }
20
21
  function TabContent({ tab, active }) {
21
- return /* @__PURE__ */ React.createElement(React.Fragment, null, tab.ghost && /* @__PURE__ */ React.createElement("span", { title: "Rota fantasma em valida\xE7\xE3o" }, "\u{1F47B}"), tab.label, tab.soon && /* @__PURE__ */ React.createElement("span", { className: "text-[10px] font-medium px-1.5 py-0.5 rounded [background:var(--page-tabs-soon-bg)] [color:var(--page-tabs-soon-text)]" }, "em breve"), tab.dot && /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[10px] font-medium leading-none [background:var(--page-tabs-dot-bg)] [color:var(--page-tabs-dot-text)]" }, /* @__PURE__ */ React.createElement("span", { className: "w-1.5 h-1.5 rounded-full shrink-0 [background:var(--page-tabs-dot-indicator)]" }), "aberto"), tab.count != null && tab.count > 0 && /* @__PURE__ */ React.createElement("span", { className: [
22
- "inline-flex items-center justify-center min-w-[18px] h-[18px] px-1",
23
- "rounded-full text-[11px] font-semibold",
24
- active ? "[background:var(--page-tabs-count-bg-active)] [color:var(--page-tabs-count-text-active)]" : "[background:var(--page-tabs-count-bg)] [color:var(--page-tabs-count-text)]"
25
- ].join(" ") }, tab.count > 99 ? "99+" : tab.count));
22
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
23
+ tab.ghost && /* @__PURE__ */ jsx("span", { title: "Rota fantasma em valida\xE7\xE3o", children: "\u{1F47B}" }),
24
+ tab.label,
25
+ tab.soon && /* @__PURE__ */ jsx("span", { className: "text-[10px] font-medium px-1.5 py-0.5 rounded [background:var(--page-tabs-soon-bg)] [color:var(--page-tabs-soon-text)]", children: "em breve" }),
26
+ tab.dot && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[10px] font-medium leading-none [background:var(--page-tabs-dot-bg)] [color:var(--page-tabs-dot-text)]", children: [
27
+ /* @__PURE__ */ jsx("span", { className: "w-1.5 h-1.5 rounded-full shrink-0 [background:var(--page-tabs-dot-indicator)]" }),
28
+ "aberto"
29
+ ] }),
30
+ tab.count != null && tab.count > 0 && /* @__PURE__ */ jsx("span", { className: [
31
+ "inline-flex items-center justify-center min-w-[18px] h-[18px] px-1",
32
+ "rounded-full text-[11px] font-semibold",
33
+ active ? "[background:var(--page-tabs-count-bg-active)] [color:var(--page-tabs-count-text-active)]" : "[background:var(--page-tabs-count-bg)] [color:var(--page-tabs-count-text)]"
34
+ ].join(" "), children: tab.count > 99 ? "99+" : tab.count })
35
+ ] });
26
36
  }
27
37
  function PageTabs({ tabs, trailing, value, onChange }) {
28
38
  const pathname = usePathname();
29
39
  const controlled = onChange !== void 0;
30
- return /* @__PURE__ */ React.createElement("div", { className: "flex items-center [background:var(--page-tabs-bg)] [border-bottom:1px_solid_var(--page-tabs-border)]" }, /* @__PURE__ */ React.createElement("nav", { className: "flex flex-1 overflow-x-auto scrollbar-none px-4 sm:px-6 lg:px-8", role: controlled ? "tablist" : void 0 }, tabs.map((tab) => {
31
- var _a, _b;
32
- const active = controlled ? tab.value === value : isActive(tab, pathname);
33
- if (controlled) {
34
- return /* @__PURE__ */ React.createElement(
35
- "button",
36
- {
37
- key: (_a = tab.value) != null ? _a : tab.label,
38
- type: "button",
39
- role: "tab",
40
- "aria-selected": active,
41
- onClick: () => {
42
- var _a2;
43
- return onChange == null ? void 0 : onChange((_a2 = tab.value) != null ? _a2 : "");
40
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center [background:var(--page-tabs-bg)] [border-bottom:1px_solid_var(--page-tabs-border)]", children: [
41
+ /* @__PURE__ */ jsx("nav", { className: "flex flex-1 overflow-x-auto scrollbar-none px-4 sm:px-6 lg:px-8", role: controlled ? "tablist" : void 0, children: tabs.map((tab) => {
42
+ var _a, _b;
43
+ const active = controlled ? tab.value === value : isActive(tab, pathname);
44
+ if (controlled) {
45
+ return /* @__PURE__ */ jsx(
46
+ "button",
47
+ {
48
+ type: "button",
49
+ role: "tab",
50
+ "aria-selected": active,
51
+ onClick: () => {
52
+ var _a2;
53
+ return onChange == null ? void 0 : onChange((_a2 = tab.value) != null ? _a2 : "");
54
+ },
55
+ className: tabClass(active),
56
+ children: /* @__PURE__ */ jsx(TabContent, { tab, active })
44
57
  },
45
- className: tabClass(active)
46
- },
47
- /* @__PURE__ */ React.createElement(TabContent, { tab, active })
48
- );
49
- }
50
- return /* @__PURE__ */ React.createElement(Link, { key: tab.href, href: (_b = tab.href) != null ? _b : "#", className: tabClass(active) }, /* @__PURE__ */ React.createElement(TabContent, { tab, active }));
51
- })), trailing && /* @__PURE__ */ React.createElement("div", { className: "hidden sm:flex shrink-0 items-center pr-4 sm:pr-6 lg:pr-8" }, trailing));
58
+ (_a = tab.value) != null ? _a : tab.label
59
+ );
60
+ }
61
+ return /* @__PURE__ */ jsx(Link, { href: (_b = tab.href) != null ? _b : "#", className: tabClass(active), children: /* @__PURE__ */ jsx(TabContent, { tab, active }) }, tab.href);
62
+ }) }),
63
+ trailing && /* @__PURE__ */ jsx("div", { className: "hidden sm:flex shrink-0 items-center pr-4 sm:pr-6 lg:pr-8", children: trailing })
64
+ ] });
52
65
  }
53
66
  export {
54
67
  PageTabs
@@ -1,4 +1,5 @@
1
1
  import "../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { forwardRef } from "react";
3
4
  import { ChevronLeft, ChevronRight } from "lucide-react";
4
5
  function range(start, end) {
@@ -41,39 +42,43 @@ const Pagination = forwardRef(function Pagination2({
41
42
  const items = getRange(page, totalPages, siblings, boundaries);
42
43
  const canPrev = page > 1;
43
44
  const canNext = page < totalPages;
44
- return /* @__PURE__ */ React.createElement("nav", { ref, role: "navigation", "aria-label": "Pagina\xE7\xE3o", className }, /* @__PURE__ */ React.createElement("ul", { className: "flex items-center gap-1" }, /* @__PURE__ */ React.createElement("li", null, /* @__PURE__ */ React.createElement(
45
- "button",
46
- {
47
- type: "button",
48
- disabled: !canPrev,
49
- onClick: () => canPrev && onChange(page - 1),
50
- "aria-label": "P\xE1gina anterior",
51
- className: [baseBtn, "text-fg-secondary hover:bg-surface-raised"].join(" ")
52
- },
53
- /* @__PURE__ */ React.createElement(ChevronLeft, { size: 16 })
54
- )), items.map((it, idx) => /* @__PURE__ */ React.createElement("li", { key: `${it}-${idx}` }, typeof it === "string" ? /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center justify-center min-w-9 h-9 text-fg-muted text-label" }, "\u2026") : /* @__PURE__ */ React.createElement(
55
- "button",
56
- {
57
- type: "button",
58
- onClick: () => onChange(it),
59
- "aria-current": it === page ? "page" : void 0,
60
- className: [
61
- baseBtn,
62
- it === page ? "bg-brand-primary text-brand-on-primary" : "text-fg-secondary hover:bg-surface-raised"
63
- ].join(" ")
64
- },
65
- it
66
- ))), /* @__PURE__ */ React.createElement("li", null, /* @__PURE__ */ React.createElement(
67
- "button",
68
- {
69
- type: "button",
70
- disabled: !canNext,
71
- onClick: () => canNext && onChange(page + 1),
72
- "aria-label": "Pr\xF3xima p\xE1gina",
73
- className: [baseBtn, "text-fg-secondary hover:bg-surface-raised"].join(" ")
74
- },
75
- /* @__PURE__ */ React.createElement(ChevronRight, { size: 16 })
76
- ))));
45
+ return /* @__PURE__ */ jsx("nav", { ref, role: "navigation", "aria-label": "Pagina\xE7\xE3o", className, children: /* @__PURE__ */ jsxs("ul", { className: "flex items-center gap-1", children: [
46
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
47
+ "button",
48
+ {
49
+ type: "button",
50
+ disabled: !canPrev,
51
+ onClick: () => canPrev && onChange(page - 1),
52
+ "aria-label": "P\xE1gina anterior",
53
+ className: [baseBtn, "text-fg-secondary hover:bg-surface-raised"].join(" "),
54
+ children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
55
+ }
56
+ ) }),
57
+ items.map((it, idx) => /* @__PURE__ */ jsx("li", { children: typeof it === "string" ? /* @__PURE__ */ jsx("span", { className: "inline-flex items-center justify-center min-w-9 h-9 text-fg-muted text-label", children: "\u2026" }) : /* @__PURE__ */ jsx(
58
+ "button",
59
+ {
60
+ type: "button",
61
+ onClick: () => onChange(it),
62
+ "aria-current": it === page ? "page" : void 0,
63
+ className: [
64
+ baseBtn,
65
+ it === page ? "bg-brand-primary text-brand-on-primary" : "text-fg-secondary hover:bg-surface-raised"
66
+ ].join(" "),
67
+ children: it
68
+ }
69
+ ) }, `${it}-${idx}`)),
70
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
71
+ "button",
72
+ {
73
+ type: "button",
74
+ disabled: !canNext,
75
+ onClick: () => canNext && onChange(page + 1),
76
+ "aria-label": "Pr\xF3xima p\xE1gina",
77
+ className: [baseBtn, "text-fg-secondary hover:bg-surface-raised"].join(" "),
78
+ children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
79
+ }
80
+ ) })
81
+ ] }) });
77
82
  });
78
83
  export {
79
84
  Pagination
@@ -1,4 +1,5 @@
1
1
  import "../chunk-ORMEWXMH.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
2
3
  import { Lock, AlertTriangle } from "lucide-react";
3
4
  const STYLES = {
4
5
  warn: {
@@ -19,7 +20,7 @@ const STYLES = {
19
20
  }
20
21
  };
21
22
  function DefaultLink({ href, className, children }) {
22
- return /* @__PURE__ */ React.createElement("a", { href, className }, children);
23
+ return /* @__PURE__ */ jsx("a", { href, className, children });
23
24
  }
24
25
  function PaywallBanner({
25
26
  variant,
@@ -34,8 +35,23 @@ function PaywallBanner({
34
35
  const s = STYLES[variant];
35
36
  const Icon = s.Icon;
36
37
  const ctaClass = ["text-caption font-semibold px-3 py-1.5 rounded-(--radius-card) shrink-0 transition-colors", s.cta].join(" ");
37
- const cta = ctaHref ? /* @__PURE__ */ React.createElement(LinkAs, { href: ctaHref, className: ctaClass }, ctaLabel, " \u2192") : onCta ? /* @__PURE__ */ React.createElement("button", { type: "button", onClick: onCta, className: ctaClass }, ctaLabel, " \u2192") : null;
38
- return /* @__PURE__ */ React.createElement("div", { className: ["rounded-(--radius-card) border px-4 py-3 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2", s.container, className].join(" ") }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start gap-2.5 min-w-0" }, /* @__PURE__ */ React.createElement(Icon, { size: 18, className: ["shrink-0 mt-0.5", s.iconColor].join(" ") }), /* @__PURE__ */ React.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React.createElement("p", { className: ["text-label font-semibold", s.title].join(" ") }, title), /* @__PURE__ */ React.createElement("div", { className: ["text-caption mt-0.5", s.desc].join(" ") }, description))), cta);
38
+ const cta = ctaHref ? /* @__PURE__ */ jsxs(LinkAs, { href: ctaHref, className: ctaClass, children: [
39
+ ctaLabel,
40
+ " \u2192"
41
+ ] }) : onCta ? /* @__PURE__ */ jsxs("button", { type: "button", onClick: onCta, className: ctaClass, children: [
42
+ ctaLabel,
43
+ " \u2192"
44
+ ] }) : null;
45
+ return /* @__PURE__ */ jsxs("div", { className: ["rounded-(--radius-card) border px-4 py-3 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2", s.container, className].join(" "), children: [
46
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2.5 min-w-0", children: [
47
+ /* @__PURE__ */ jsx(Icon, { size: 18, className: ["shrink-0 mt-0.5", s.iconColor].join(" ") }),
48
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
49
+ /* @__PURE__ */ jsx("p", { className: ["text-label font-semibold", s.title].join(" "), children: title }),
50
+ /* @__PURE__ */ jsx("div", { className: ["text-caption mt-0.5", s.desc].join(" "), children: description })
51
+ ] })
52
+ ] }),
53
+ cta
54
+ ] });
39
55
  }
40
56
  export {
41
57
  PaywallBanner
@@ -4,6 +4,7 @@ import {
4
4
  __spreadProps,
5
5
  __spreadValues
6
6
  } from "../chunk-ORMEWXMH.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { Lock, Sparkles } from "lucide-react";
8
9
  import { ICON_MAP } from "./empty-state.js";
9
10
  import { Modal } from "./modal.js";
@@ -27,26 +28,35 @@ function PaywallContent({
27
28
  var _a;
28
29
  const Icon = (_a = ICON_MAP[icon]) != null ? _a : Lock;
29
30
  const isTrial = reason === "trial_value";
30
- const cta = ctaHref && Link ? /* @__PURE__ */ React.createElement(Link, { href: ctaHref, className: CTA_CLASS, onClick: onCta }, ctaLabel) : ctaHref ? /* @__PURE__ */ React.createElement("a", { href: ctaHref, className: CTA_CLASS, onClick: onCta }, ctaLabel) : /* @__PURE__ */ React.createElement("button", { type: "button", className: CTA_CLASS, onClick: onCta }, ctaLabel);
31
- return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col items-center text-center px-2" }, /* @__PURE__ */ React.createElement("div", { className: "relative mb-4 text-fg-secondary" }, /* @__PURE__ */ React.createElement(Icon, { size: 52, strokeWidth: 1.25 }), /* @__PURE__ */ React.createElement("span", { className: `absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full ${isTrial ? "bg-amber-500 text-white" : "bg-brand-primary text-brand-on-primary"}` }, isTrial ? /* @__PURE__ */ React.createElement(Sparkles, { size: 12, strokeWidth: 2.5 }) : /* @__PURE__ */ React.createElement(Lock, { size: 12, strokeWidth: 2.5 }))), /* @__PURE__ */ React.createElement("span", { className: `inline-flex items-center rounded-full px-2.5 py-1 text-caption font-medium ${isTrial ? "bg-amber-100 text-amber-900" : "bg-surface-raised text-fg-secondary"}` }, planLineText(reason, planLabel)), /* @__PURE__ */ React.createElement("p", { className: "text-body font-semibold text-fg-primary mt-3 mb-1.5" }, title), description && /* @__PURE__ */ React.createElement("p", { className: "text-label text-fg-muted max-w-sm leading-relaxed mb-5" }, description), /* @__PURE__ */ React.createElement("div", { className: "w-full max-w-xs" }, cta));
31
+ const cta = ctaHref && Link ? /* @__PURE__ */ jsx(Link, { href: ctaHref, className: CTA_CLASS, onClick: onCta, children: ctaLabel }) : ctaHref ? /* @__PURE__ */ jsx("a", { href: ctaHref, className: CTA_CLASS, onClick: onCta, children: ctaLabel }) : /* @__PURE__ */ jsx("button", { type: "button", className: CTA_CLASS, onClick: onCta, children: ctaLabel });
32
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center text-center px-2", children: [
33
+ /* @__PURE__ */ jsxs("div", { className: "relative mb-4 text-fg-secondary", children: [
34
+ /* @__PURE__ */ jsx(Icon, { size: 52, strokeWidth: 1.25 }),
35
+ /* @__PURE__ */ jsx("span", { className: `absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full ${isTrial ? "bg-amber-500 text-white" : "bg-brand-primary text-brand-on-primary"}`, children: isTrial ? /* @__PURE__ */ jsx(Sparkles, { size: 12, strokeWidth: 2.5 }) : /* @__PURE__ */ jsx(Lock, { size: 12, strokeWidth: 2.5 }) })
36
+ ] }),
37
+ /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full px-2.5 py-1 text-caption font-medium ${isTrial ? "bg-amber-100 text-amber-900" : "bg-surface-raised text-fg-secondary"}`, children: planLineText(reason, planLabel) }),
38
+ /* @__PURE__ */ jsx("p", { className: "text-body font-semibold text-fg-primary mt-3 mb-1.5", children: title }),
39
+ description && /* @__PURE__ */ jsx("p", { className: "text-label text-fg-muted max-w-sm leading-relaxed mb-5", children: description }),
40
+ /* @__PURE__ */ jsx("div", { className: "w-full max-w-xs", children: cta })
41
+ ] });
32
42
  }
33
43
  function PaywallState(_a) {
34
44
  var _b = _a, { className = "" } = _b, content = __objRest(_b, ["className"]);
35
- return /* @__PURE__ */ React.createElement(
45
+ return /* @__PURE__ */ jsx(
36
46
  "div",
37
47
  {
38
- className: ["flex flex-col items-center justify-center min-h-[320px] flex-1 py-10", className].filter(Boolean).join(" ")
39
- },
40
- /* @__PURE__ */ React.createElement(PaywallContent, __spreadValues({}, content))
48
+ className: ["flex flex-col items-center justify-center min-h-[320px] flex-1 py-10", className].filter(Boolean).join(" "),
49
+ children: /* @__PURE__ */ jsx(PaywallContent, __spreadValues({}, content))
50
+ }
41
51
  );
42
52
  }
43
53
  function PaywallModal(_c) {
44
54
  var _d = _c, { open, onClose } = _d, content = __objRest(_d, ["open", "onClose"]);
45
- return /* @__PURE__ */ React.createElement(Modal, { open, onClose, size: "sm" }, /* @__PURE__ */ React.createElement("div", { className: "py-2" }, /* @__PURE__ */ React.createElement(PaywallContent, __spreadProps(__spreadValues({}, content), { onCta: () => {
55
+ return /* @__PURE__ */ jsx(Modal, { open, onClose, size: "sm", children: /* @__PURE__ */ jsx("div", { className: "py-2", children: /* @__PURE__ */ jsx(PaywallContent, __spreadProps(__spreadValues({}, content), { onCta: () => {
46
56
  var _a;
47
57
  (_a = content.onCta) == null ? void 0 : _a.call(content);
48
58
  onClose();
49
- } }))));
59
+ } })) }) });
50
60
  }
51
61
  export {
52
62
  PaywallContent,
@@ -1,6 +1,7 @@
1
1
  import "../chunk-ORMEWXMH.js";
2
+ import { jsx } from "react/jsx-runtime";
2
3
  function PhoneFrame({ children, className = "" }) {
3
- return /* @__PURE__ */ React.createElement(
4
+ return /* @__PURE__ */ jsx(
4
5
  "div",
5
6
  {
6
7
  className: [
@@ -8,9 +9,9 @@ function PhoneFrame({ children, className = "" }) {
8
9
  "relative rounded-[2.5rem] border-[6px] border-(--text-primary)",
9
10
  "bg-white overflow-hidden shadow-2xl",
10
11
  className
11
- ].filter(Boolean).join(" ")
12
- },
13
- /* @__PURE__ */ React.createElement("div", { className: "h-full overflow-y-auto overflow-x-hidden scrollbar-none" }, children)
12
+ ].filter(Boolean).join(" "),
13
+ children: /* @__PURE__ */ jsx("div", { className: "h-full overflow-y-auto overflow-x-hidden scrollbar-none", children })
14
+ }
14
15
  );
15
16
  }
16
17
  export {