@innovui/react-native 0.0.0-stage → 0.1.0

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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -2
  3. package/dist/components/_shared/anchored-overlay.js +74 -0
  4. package/dist/components/_shared/anchored-overlay.js.map +1 -0
  5. package/dist/components/_shared/backdrop.js +25 -0
  6. package/dist/components/_shared/backdrop.js.map +1 -0
  7. package/dist/components/_shared/overlay-anchor.js +31 -0
  8. package/dist/components/_shared/overlay-anchor.js.map +1 -0
  9. package/dist/components/_shared/overlay-state.js +31 -0
  10. package/dist/components/_shared/overlay-state.js.map +1 -0
  11. package/dist/components/_shared/status.d.ts +5 -0
  12. package/dist/components/_shared/status.js +98 -0
  13. package/dist/components/_shared/status.js.map +1 -0
  14. package/dist/components/_shared/use-token.js +15 -0
  15. package/dist/components/_shared/use-token.js.map +1 -0
  16. package/dist/components/accordion/accordion.d.ts +43 -0
  17. package/dist/components/accordion/accordion.js +90 -0
  18. package/dist/components/accordion/accordion.js.map +1 -0
  19. package/dist/components/accordion/index.d.ts +2 -0
  20. package/dist/components/alert/alert.d.ts +25 -0
  21. package/dist/components/alert/alert.js +61 -0
  22. package/dist/components/alert/alert.js.map +1 -0
  23. package/dist/components/alert/index.d.ts +2 -0
  24. package/dist/components/avatar/avatar.d.ts +17 -0
  25. package/dist/components/avatar/avatar.js +51 -0
  26. package/dist/components/avatar/avatar.js.map +1 -0
  27. package/dist/components/avatar/index.d.ts +2 -0
  28. package/dist/components/badge/badge.d.ts +16 -0
  29. package/dist/components/badge/badge.js +57 -0
  30. package/dist/components/badge/badge.js.map +1 -0
  31. package/dist/components/badge/index.d.ts +2 -0
  32. package/dist/components/banner/banner.d.ts +23 -0
  33. package/dist/components/banner/banner.js +50 -0
  34. package/dist/components/banner/banner.js.map +1 -0
  35. package/dist/components/banner/index.d.ts +2 -0
  36. package/dist/components/breadcrumb/breadcrumb.d.ts +22 -0
  37. package/dist/components/breadcrumb/breadcrumb.js +54 -0
  38. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  39. package/dist/components/breadcrumb/index.d.ts +2 -0
  40. package/dist/components/button/button.d.ts +21 -0
  41. package/dist/components/button/button.js +89 -0
  42. package/dist/components/button/button.js.map +1 -0
  43. package/dist/components/button/index.d.ts +2 -0
  44. package/dist/components/card/card.d.ts +17 -0
  45. package/dist/components/card/card.js +28 -0
  46. package/dist/components/card/card.js.map +1 -0
  47. package/dist/components/card/index.d.ts +2 -0
  48. package/dist/components/checkbox/checkbox.d.ts +18 -0
  49. package/dist/components/checkbox/checkbox.js +64 -0
  50. package/dist/components/checkbox/checkbox.js.map +1 -0
  51. package/dist/components/checkbox/index.d.ts +2 -0
  52. package/dist/components/combobox/combobox.d.ts +40 -0
  53. package/dist/components/combobox/combobox.js +101 -0
  54. package/dist/components/combobox/combobox.js.map +1 -0
  55. package/dist/components/combobox/index.d.ts +2 -0
  56. package/dist/components/container/container.d.ts +17 -0
  57. package/dist/components/container/container.js +42 -0
  58. package/dist/components/container/container.js.map +1 -0
  59. package/dist/components/container/index.d.ts +2 -0
  60. package/dist/components/date-picker/calendar.d.ts +38 -0
  61. package/dist/components/date-picker/calendar.js +137 -0
  62. package/dist/components/date-picker/calendar.js.map +1 -0
  63. package/dist/components/date-picker/date-picker.d.ts +24 -0
  64. package/dist/components/date-picker/date-picker.js +52 -0
  65. package/dist/components/date-picker/date-picker.js.map +1 -0
  66. package/dist/components/date-picker/date-presets.d.ts +15 -0
  67. package/dist/components/date-picker/date-presets.js +52 -0
  68. package/dist/components/date-picker/date-presets.js.map +1 -0
  69. package/dist/components/date-picker/date-range-picker.d.ts +24 -0
  70. package/dist/components/date-picker/date-range-picker.js +78 -0
  71. package/dist/components/date-picker/date-range-picker.js.map +1 -0
  72. package/dist/components/date-picker/date-sheet.js +33 -0
  73. package/dist/components/date-picker/date-sheet.js.map +1 -0
  74. package/dist/components/date-picker/date-trigger.js +14 -0
  75. package/dist/components/date-picker/date-trigger.js.map +1 -0
  76. package/dist/components/date-picker/dates.d.ts +8 -0
  77. package/dist/components/date-picker/dates.js +40 -0
  78. package/dist/components/date-picker/dates.js.map +1 -0
  79. package/dist/components/date-picker/index.d.ts +6 -0
  80. package/dist/components/divider/divider.d.ts +11 -0
  81. package/dist/components/divider/divider.js +16 -0
  82. package/dist/components/divider/divider.js.map +1 -0
  83. package/dist/components/divider/index.d.ts +2 -0
  84. package/dist/components/drawer/drawer.d.ts +34 -0
  85. package/dist/components/drawer/drawer.js +144 -0
  86. package/dist/components/drawer/drawer.js.map +1 -0
  87. package/dist/components/drawer/index.d.ts +2 -0
  88. package/dist/components/field/field.d.ts +31 -0
  89. package/dist/components/field/field.js +52 -0
  90. package/dist/components/field/field.js.map +1 -0
  91. package/dist/components/field/index.d.ts +2 -0
  92. package/dist/components/grid/grid.d.ts +35 -0
  93. package/dist/components/grid/grid.js +64 -0
  94. package/dist/components/grid/grid.js.map +1 -0
  95. package/dist/components/grid/index.d.ts +2 -0
  96. package/dist/components/icon-button/icon-button.d.ts +23 -0
  97. package/dist/components/icon-button/icon-button.js +48 -0
  98. package/dist/components/icon-button/icon-button.js.map +1 -0
  99. package/dist/components/icon-button/index.d.ts +2 -0
  100. package/dist/components/input/index.d.ts +2 -0
  101. package/dist/components/input/input.d.ts +22 -0
  102. package/dist/components/input/input.js +86 -0
  103. package/dist/components/input/input.js.map +1 -0
  104. package/dist/components/link/index.d.ts +2 -0
  105. package/dist/components/link/link.d.ts +13 -0
  106. package/dist/components/link/link.js +20 -0
  107. package/dist/components/link/link.js.map +1 -0
  108. package/dist/components/list/index.d.ts +2 -0
  109. package/dist/components/list/list.d.ts +26 -0
  110. package/dist/components/list/list.js +45 -0
  111. package/dist/components/list/list.js.map +1 -0
  112. package/dist/components/menu/index.d.ts +2 -0
  113. package/dist/components/menu/menu.d.ts +47 -0
  114. package/dist/components/menu/menu.js +81 -0
  115. package/dist/components/menu/menu.js.map +1 -0
  116. package/dist/components/modal/index.d.ts +2 -0
  117. package/dist/components/modal/modal.d.ts +41 -0
  118. package/dist/components/modal/modal.js +92 -0
  119. package/dist/components/modal/modal.js.map +1 -0
  120. package/dist/components/pagination/index.d.ts +2 -0
  121. package/dist/components/pagination/pagination.d.ts +21 -0
  122. package/dist/components/pagination/pagination.js +99 -0
  123. package/dist/components/pagination/pagination.js.map +1 -0
  124. package/dist/components/popover/index.d.ts +2 -0
  125. package/dist/components/popover/popover.d.ts +29 -0
  126. package/dist/components/popover/popover.js +54 -0
  127. package/dist/components/popover/popover.js.map +1 -0
  128. package/dist/components/radio/index.d.ts +2 -0
  129. package/dist/components/radio/radio.d.ts +16 -0
  130. package/dist/components/radio/radio.js +37 -0
  131. package/dist/components/radio/radio.js.map +1 -0
  132. package/dist/components/segmented-control/index.d.ts +2 -0
  133. package/dist/components/segmented-control/segmented-control.d.ts +23 -0
  134. package/dist/components/segmented-control/segmented-control.js +53 -0
  135. package/dist/components/segmented-control/segmented-control.js.map +1 -0
  136. package/dist/components/select/field-trigger.d.ts +6 -0
  137. package/dist/components/select/field-trigger.js +90 -0
  138. package/dist/components/select/field-trigger.js.map +1 -0
  139. package/dist/components/select/index.d.ts +2 -0
  140. package/dist/components/select/select.d.ts +35 -0
  141. package/dist/components/select/select.js +98 -0
  142. package/dist/components/select/select.js.map +1 -0
  143. package/dist/components/skeleton/index.d.ts +2 -0
  144. package/dist/components/skeleton/skeleton.d.ts +17 -0
  145. package/dist/components/skeleton/skeleton.js +53 -0
  146. package/dist/components/skeleton/skeleton.js.map +1 -0
  147. package/dist/components/slider/index.d.ts +2 -0
  148. package/dist/components/slider/slider.d.ts +26 -0
  149. package/dist/components/slider/slider.js +102 -0
  150. package/dist/components/slider/slider.js.map +1 -0
  151. package/dist/components/spinner/index.d.ts +2 -0
  152. package/dist/components/spinner/spinner.d.ts +13 -0
  153. package/dist/components/spinner/spinner.js +47 -0
  154. package/dist/components/spinner/spinner.js.map +1 -0
  155. package/dist/components/stack/index.d.ts +2 -0
  156. package/dist/components/stack/stack.d.ts +17 -0
  157. package/dist/components/stack/stack.js +60 -0
  158. package/dist/components/stack/stack.js.map +1 -0
  159. package/dist/components/stepper/index.d.ts +2 -0
  160. package/dist/components/stepper/stepper.d.ts +20 -0
  161. package/dist/components/stepper/stepper.js +61 -0
  162. package/dist/components/stepper/stepper.js.map +1 -0
  163. package/dist/components/switch/index.d.ts +2 -0
  164. package/dist/components/switch/switch.d.ts +15 -0
  165. package/dist/components/switch/switch.js +51 -0
  166. package/dist/components/switch/switch.js.map +1 -0
  167. package/dist/components/table/index.d.ts +2 -0
  168. package/dist/components/table/table.d.ts +42 -0
  169. package/dist/components/table/table.js +83 -0
  170. package/dist/components/table/table.js.map +1 -0
  171. package/dist/components/tabs/index.d.ts +2 -0
  172. package/dist/components/tabs/tabs.d.ts +35 -0
  173. package/dist/components/tabs/tabs.js +82 -0
  174. package/dist/components/tabs/tabs.js.map +1 -0
  175. package/dist/components/tag/index.d.ts +2 -0
  176. package/dist/components/tag/tag.d.ts +18 -0
  177. package/dist/components/tag/tag.js +37 -0
  178. package/dist/components/tag/tag.js.map +1 -0
  179. package/dist/components/textarea/index.d.ts +2 -0
  180. package/dist/components/textarea/textarea.d.ts +16 -0
  181. package/dist/components/textarea/textarea.js +46 -0
  182. package/dist/components/textarea/textarea.js.map +1 -0
  183. package/dist/components/toast/index.d.ts +2 -0
  184. package/dist/components/toast/toast.d.ts +41 -0
  185. package/dist/components/toast/toast.js +167 -0
  186. package/dist/components/toast/toast.js.map +1 -0
  187. package/dist/components/tooltip/index.d.ts +2 -0
  188. package/dist/components/tooltip/tooltip.d.ts +28 -0
  189. package/dist/components/tooltip/tooltip.js +62 -0
  190. package/dist/components/tooltip/tooltip.js.map +1 -0
  191. package/dist/components/upload/index.d.ts +2 -0
  192. package/dist/components/upload/upload.d.ts +65 -0
  193. package/dist/components/upload/upload.js +130 -0
  194. package/dist/components/upload/upload.js.map +1 -0
  195. package/dist/index.d.ts +87 -0
  196. package/dist/index.js +46 -0
  197. package/dist/tokens/generated.d.ts +371 -0
  198. package/dist/tokens/generated.js +373 -0
  199. package/dist/tokens/generated.js.map +1 -0
  200. package/dist/utils/cn.d.ts +6 -0
  201. package/dist/utils/cn.js +11 -0
  202. package/dist/utils/cn.js.map +1 -0
  203. package/package.json +61 -3
  204. package/theme.css +191 -0
@@ -0,0 +1,64 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { useToken } from "../_shared/use-token.js";
3
+ import { useState } from "react";
4
+ import { Pressable, Text, View } from "react-native";
5
+ import Svg, { Path } from "react-native-svg";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/components/checkbox/checkbox.tsx
8
+ function Checkbox({ label, checked, defaultChecked = false, onCheckedChange, indeterminate = false, error, disabled, className, accessibilityState, ...props }) {
9
+ const [uncontrolled, setUncontrolled] = useState(defaultChecked);
10
+ const isChecked = checked ?? uncontrolled;
11
+ const isDisabled = Boolean(disabled);
12
+ const filled = isChecked || indeterminate;
13
+ const indicator = useToken("--color-selection-indicator-selected");
14
+ return /* @__PURE__ */ jsxs(Pressable, {
15
+ accessibilityRole: "checkbox",
16
+ accessibilityState: {
17
+ ...accessibilityState,
18
+ checked: indeterminate ? "mixed" : isChecked,
19
+ disabled: isDisabled
20
+ },
21
+ disabled: isDisabled,
22
+ onPress: () => {
23
+ const next = indeterminate ? true : !isChecked;
24
+ setUncontrolled(next);
25
+ onCheckedChange?.(next);
26
+ },
27
+ className: cn("min-h-11 flex-row items-center gap-3 self-start", className),
28
+ ...props,
29
+ children: [/* @__PURE__ */ jsx(View, {
30
+ className: cn("size-5 items-center justify-center rounded border-2 border-selection-border-unselected bg-selection-bg-unselected", filled && "border-selection-border-selected bg-selection-bg-selected", isDisabled && "border-selection-border-disabled bg-selection-bg-disabled", error && "border-status-error-border"),
31
+ children: indeterminate ? /* @__PURE__ */ jsx(Svg, {
32
+ width: 14,
33
+ height: 14,
34
+ viewBox: "0 0 16 16",
35
+ children: /* @__PURE__ */ jsx(Path, {
36
+ d: "M3 8h10",
37
+ stroke: indicator,
38
+ strokeWidth: 2,
39
+ strokeLinecap: "round",
40
+ fill: "none"
41
+ })
42
+ }) : isChecked ? /* @__PURE__ */ jsx(Svg, {
43
+ width: 14,
44
+ height: 14,
45
+ viewBox: "0 0 16 16",
46
+ children: /* @__PURE__ */ jsx(Path, {
47
+ d: "M3 8.5 6.5 12 13 4.5",
48
+ stroke: indicator,
49
+ strokeWidth: 2,
50
+ strokeLinecap: "round",
51
+ strokeLinejoin: "round",
52
+ fill: "none"
53
+ })
54
+ }) : null
55
+ }), typeof label === "string" ? /* @__PURE__ */ jsx(Text, {
56
+ className: cn("text-sm font-medium text-selection-text-label", isDisabled && "text-selection-text-disabled"),
57
+ children: label
58
+ }) : label]
59
+ });
60
+ }
61
+ //#endregion
62
+ export { Checkbox };
63
+
64
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../../src/components/checkbox/checkbox.tsx"],"sourcesContent":["/// <reference types=\"uniwind/types\" />\n\nimport { type ReactNode, useState } from 'react'\nimport { Pressable, type PressableProps, Text, View } from 'react-native'\nimport Svg, { Path } from 'react-native-svg'\nimport { cn } from '../../utils/cn'\nimport { useToken } from '../_shared/use-token'\n\nexport type CheckboxProps = Omit<PressableProps, 'children' | 'style' | 'onPress'> & {\n className?: string\n label?: ReactNode\n /** Controlado. Sem ele, o componente guarda o próprio estado (começa em `defaultChecked`). */\n checked?: boolean\n defaultChecked?: boolean\n /** Chamado com o novo valor a cada toque. */\n onCheckedChange?: (checked: boolean) => void\n /** Seleção parcial: aparece com o traço e é anunciada como \"misto\". */\n indeterminate?: boolean\n error?: boolean\n}\n\nexport function Checkbox({\n label,\n checked,\n defaultChecked = false,\n onCheckedChange,\n indeterminate = false,\n error,\n disabled,\n className,\n accessibilityState,\n ...props\n}: CheckboxProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultChecked)\n const isChecked = checked ?? uncontrolled\n const isDisabled = Boolean(disabled)\n const filled = isChecked || indeterminate\n const indicator = useToken('--color-selection-indicator-selected')\n\n return (\n <Pressable\n accessibilityRole=\"checkbox\"\n accessibilityState={{\n ...accessibilityState,\n checked: indeterminate ? 'mixed' : isChecked,\n disabled: isDisabled,\n }}\n disabled={isDisabled}\n onPress={() => {\n // Em indeterminate, o toque marca (como no input nativo).\n const next = indeterminate ? true : !isChecked\n setUncontrolled(next)\n onCheckedChange?.(next)\n }}\n className={cn('min-h-11 flex-row items-center gap-3 self-start', className)}\n {...props}\n >\n <View\n className={cn(\n 'size-5 items-center justify-center rounded border-2 border-selection-border-unselected bg-selection-bg-unselected',\n filled && 'border-selection-border-selected bg-selection-bg-selected',\n isDisabled && 'border-selection-border-disabled bg-selection-bg-disabled',\n error && 'border-status-error-border',\n )}\n >\n {indeterminate ? (\n <Svg width={14} height={14} viewBox=\"0 0 16 16\">\n <Path\n d=\"M3 8h10\"\n stroke={indicator}\n strokeWidth={2}\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </Svg>\n ) : isChecked ? (\n <Svg width={14} height={14} viewBox=\"0 0 16 16\">\n <Path\n d=\"M3 8.5 6.5 12 13 4.5\"\n stroke={indicator}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </Svg>\n ) : null}\n </View>\n {typeof label === 'string' ? (\n <Text\n className={cn(\n 'text-sm font-medium text-selection-text-label',\n isDisabled && 'text-selection-text-disabled',\n )}\n >\n {label}\n </Text>\n ) : (\n label\n )}\n </Pressable>\n )\n}\n"],"mappings":";;;;;;;AAqBA,SAAgB,SAAS,EACvB,OACA,SACA,iBAAiB,OACjB,iBACA,gBAAgB,OAChB,OACA,UACA,WACA,oBACA,GAAG,SACa;CAChB,MAAM,CAAC,cAAc,mBAAmB,SAAS,cAAc;CAC/D,MAAM,YAAY,WAAW;CAC7B,MAAM,aAAa,QAAQ,QAAQ;CACnC,MAAM,SAAS,aAAa;CAC5B,MAAM,YAAY,SAAS,sCAAsC;CAEjE,OACE,qBAAC,WAAD;EACE,mBAAkB;EAClB,oBAAoB;GAClB,GAAG;GACH,SAAS,gBAAgB,UAAU;GACnC,UAAU;EACZ;EACA,UAAU;EACV,eAAe;GAEb,MAAM,OAAO,gBAAgB,OAAO,CAAC;GACrC,gBAAgB,IAAI;GACpB,kBAAkB,IAAI;EACxB;EACA,WAAW,GAAG,mDAAmD,SAAS;EAC1E,GAAI;EAfN,UAAA,CAiBE,oBAAC,MAAD;GACE,WAAW,GACT,qHACA,UAAU,6DACV,cAAc,6DACd,SAAS,4BACX;GAEC,UAAA,gBACC,oBAAC,KAAD;IAAK,OAAO;IAAI,QAAQ;IAAI,SAAQ;IAClC,UAAA,oBAAC,MAAD;KACE,GAAE;KACF,QAAQ;KACR,aAAa;KACb,eAAc;KACd,MAAK;IACN,CAAA;GACE,CAAA,IACH,YACF,oBAAC,KAAD;IAAK,OAAO;IAAI,QAAQ;IAAI,SAAQ;IAClC,UAAA,oBAAC,MAAD;KACE,GAAE;KACF,QAAQ;KACR,aAAa;KACb,eAAc;KACd,gBAAe;KACf,MAAK;IACN,CAAA;GACE,CAAA,IACH;EACA,CAAA,GACL,OAAO,UAAU,WAChB,oBAAC,MAAD;GACE,WAAW,GACT,iDACA,cAAc,8BAChB;GAEC,UAAA;EACG,CAAA,IAEN,KAEO;;AAEf"}
@@ -0,0 +1,2 @@
1
+ import { Checkbox, CheckboxProps } from "./checkbox.js";
2
+ export { Checkbox, type CheckboxProps };
@@ -0,0 +1,40 @@
1
+ import { FieldSize } from "../select/field-trigger.js";
2
+ //#region src/components/combobox/combobox.d.ts
3
+ export type ComboboxOption = {
4
+ /** Valor guardado e devolvido em `onValueChange`. */
5
+ value: string;
6
+ /** Texto mostrado na lista e no gatilho; também é onde a busca procura. */
7
+ label: string;
8
+ disabled?: boolean;
9
+ };
10
+ export type ComboboxProps = {
11
+ options: ComboboxOption[];
12
+ /** Valor selecionado (modo controlado). */
13
+ value?: string;
14
+ defaultValue?: string;
15
+ /** Chamado com o `value` da opção escolhida. */
16
+ onValueChange?: (value: string) => void;
17
+ /** Texto do gatilho sem valor. */
18
+ placeholder?: string;
19
+ /** Placeholder do campo de busca dentro da lista. */
20
+ searchPlaceholder?: string;
21
+ /** Texto quando a busca não acha nada. */
22
+ emptyMessage?: string;
23
+ disabled?: boolean;
24
+ readOnly?: boolean;
25
+ error?: boolean;
26
+ size?: FieldSize;
27
+ className?: string;
28
+ accessibilityLabel?: string;
29
+ accessibilityHint?: string;
30
+ testID?: string;
31
+ };
32
+ /**
33
+ * Campo de escolha com busca. No native o gatilho é um botão (como o Select) e a busca fica num
34
+ * TextInput no topo da lista, que abre já focado: digitar no próprio gatilho não funciona com a
35
+ * lista numa camada acima dele. Diferenças do web: sem navegação por teclado e sem limpar o valor
36
+ * apagando o texto (`onValueChange` só recebe valores de opções).
37
+ */
38
+ export declare function Combobox({ options, value, defaultValue, onValueChange, placeholder, searchPlaceholder, emptyMessage, size, error, disabled, readOnly, className, accessibilityLabel, accessibilityHint, testID }: ComboboxProps): import("react").JSX.Element;
39
+ //#endregion
40
+ //# sourceMappingURL=combobox.d.ts.map
@@ -0,0 +1,101 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { CheckIcon } from "../_shared/status.js";
3
+ import { useToken } from "../_shared/use-token.js";
4
+ import { AnchoredOverlay, useAnchor } from "../_shared/anchored-overlay.js";
5
+ import { FieldTrigger } from "../select/field-trigger.js";
6
+ import { useState } from "react";
7
+ import { Pressable, ScrollView, Text, TextInput, View } from "react-native";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/components/combobox/combobox.tsx
10
+ const fold = (text) => text.normalize("NFD").replace(/\p{M}/gu, "").toLowerCase();
11
+ /**
12
+ * Campo de escolha com busca. No native o gatilho é um botão (como o Select) e a busca fica num
13
+ * TextInput no topo da lista, que abre já focado: digitar no próprio gatilho não funciona com a
14
+ * lista numa camada acima dele. Diferenças do web: sem navegação por teclado e sem limpar o valor
15
+ * apagando o texto (`onValueChange` só recebe valores de opções).
16
+ */
17
+ function Combobox({ options, value, defaultValue = "", onValueChange, placeholder = "Selecione...", searchPlaceholder = "Buscar...", emptyMessage = "Nenhum resultado", size, error, disabled, readOnly, className, accessibilityLabel, accessibilityHint, testID }) {
18
+ const [inner, setInner] = useState(defaultValue);
19
+ const [query, setQuery] = useState("");
20
+ const anchor = useAnchor();
21
+ const placeholderColor = useToken("--color-field-text-placeholder");
22
+ const checkColor = useToken("--color-select-option-text");
23
+ const selected = value ?? inner;
24
+ const selectedLabel = options.find((o) => o.value === selected)?.label;
25
+ const open = anchor.visible && !disabled && !readOnly;
26
+ const shown = query ? options.filter((o) => fold(o.label).includes(fold(query))) : options;
27
+ function close() {
28
+ anchor.close();
29
+ setQuery("");
30
+ }
31
+ function choose(option) {
32
+ if (value === void 0) setInner(option.value);
33
+ onValueChange?.(option.value);
34
+ close();
35
+ }
36
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FieldTrigger, {
37
+ anchorRef: anchor.ref,
38
+ icon: "chevron",
39
+ text: selectedLabel,
40
+ placeholder,
41
+ size,
42
+ error,
43
+ open,
44
+ disabled,
45
+ readOnly,
46
+ onPress: anchor.open,
47
+ className,
48
+ accessibilityLabel,
49
+ accessibilityHint,
50
+ testID
51
+ }), /* @__PURE__ */ jsxs(AnchoredOverlay, {
52
+ visible: open,
53
+ rect: anchor.rect,
54
+ onRequestClose: close,
55
+ matchAnchorWidth: true,
56
+ testID: testID ? `${testID}-list` : void 0,
57
+ className: "overflow-hidden rounded-md border border-select-dropdown-border bg-select-dropdown-bg shadow-md",
58
+ children: [/* @__PURE__ */ jsx(TextInput, {
59
+ autoFocus: true,
60
+ autoCorrect: false,
61
+ autoCapitalize: "none",
62
+ value: query,
63
+ onChangeText: setQuery,
64
+ placeholder: searchPlaceholder,
65
+ placeholderTextColor: placeholderColor,
66
+ accessibilityLabel: searchPlaceholder,
67
+ className: "h-11 border-b border-select-dropdown-border px-3 text-base text-field-text"
68
+ }), /* @__PURE__ */ jsx(ScrollView, {
69
+ className: "max-h-60 p-1",
70
+ keyboardShouldPersistTaps: "handled",
71
+ children: shown.length === 0 ? /* @__PURE__ */ jsx(Text, {
72
+ className: "px-3 py-2 text-base text-text-secondary",
73
+ children: emptyMessage
74
+ }) : shown.map((option) => {
75
+ const isSelected = option.value === selected;
76
+ return /* @__PURE__ */ jsxs(Pressable, {
77
+ role: "option",
78
+ accessibilityLabel: option.label,
79
+ accessibilityState: {
80
+ selected: isSelected,
81
+ disabled: Boolean(option.disabled)
82
+ },
83
+ disabled: option.disabled,
84
+ onPress: () => choose(option),
85
+ className: cn("flex-row items-center gap-2 rounded-sm px-3 py-2 active:bg-select-option-bg-hover", isSelected && "bg-select-option-bg-selected"),
86
+ children: [/* @__PURE__ */ jsx(Text, {
87
+ className: cn("flex-1 text-base text-select-option-text", option.disabled && "text-select-option-text-disabled"),
88
+ children: option.label
89
+ }), isSelected ? /* @__PURE__ */ jsx(View, {
90
+ className: "size-4 items-center justify-center",
91
+ children: /* @__PURE__ */ jsx(CheckIcon, { color: checkColor })
92
+ }) : null]
93
+ }, option.value);
94
+ })
95
+ })]
96
+ })] });
97
+ }
98
+ //#endregion
99
+ export { Combobox };
100
+
101
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","names":[],"sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["/// <reference types=\"uniwind/types\" />\n\nimport { useState } from 'react'\nimport { Pressable, ScrollView, Text, TextInput, View } from 'react-native'\nimport { cn } from '../../utils/cn'\nimport { AnchoredOverlay, useAnchor } from '../_shared/anchored-overlay'\nimport { CheckIcon } from '../_shared/status'\nimport { useToken } from '../_shared/use-token'\nimport { type FieldSize, FieldTrigger } from '../select/field-trigger'\n\nexport type ComboboxOption = {\n /** Valor guardado e devolvido em `onValueChange`. */\n value: string\n /** Texto mostrado na lista e no gatilho; também é onde a busca procura. */\n label: string\n disabled?: boolean\n}\n\nexport type ComboboxProps = {\n options: ComboboxOption[]\n /** Valor selecionado (modo controlado). */\n value?: string\n defaultValue?: string\n /** Chamado com o `value` da opção escolhida. */\n onValueChange?: (value: string) => void\n /** Texto do gatilho sem valor. */\n placeholder?: string\n /** Placeholder do campo de busca dentro da lista. */\n searchPlaceholder?: string\n /** Texto quando a busca não acha nada. */\n emptyMessage?: string\n disabled?: boolean\n readOnly?: boolean\n error?: boolean\n size?: FieldSize\n className?: string\n accessibilityLabel?: string\n accessibilityHint?: string\n testID?: string\n}\n\n// busca sem distinguir maiúsculas nem acentos: \"sao\" acha \"São Paulo\"\nconst fold = (text: string) => text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase()\n\n/**\n * Campo de escolha com busca. No native o gatilho é um botão (como o Select) e a busca fica num\n * TextInput no topo da lista, que abre já focado: digitar no próprio gatilho não funciona com a\n * lista numa camada acima dele. Diferenças do web: sem navegação por teclado e sem limpar o valor\n * apagando o texto (`onValueChange` só recebe valores de opções).\n */\nexport function Combobox({\n options,\n value,\n defaultValue = '',\n onValueChange,\n placeholder = 'Selecione...',\n searchPlaceholder = 'Buscar...',\n emptyMessage = 'Nenhum resultado',\n size,\n error,\n disabled,\n readOnly,\n className,\n accessibilityLabel,\n accessibilityHint,\n testID,\n}: ComboboxProps) {\n const [inner, setInner] = useState(defaultValue)\n const [query, setQuery] = useState('')\n const anchor = useAnchor()\n const placeholderColor = useToken('--color-field-text-placeholder')\n const checkColor = useToken('--color-select-option-text')\n const selected = value ?? inner\n const selectedLabel = options.find((o) => o.value === selected)?.label\n const open = anchor.visible && !disabled && !readOnly\n const shown = query ? options.filter((o) => fold(o.label).includes(fold(query))) : options\n\n function close() {\n anchor.close()\n setQuery('')\n }\n\n function choose(option: ComboboxOption) {\n if (value === undefined) setInner(option.value)\n onValueChange?.(option.value)\n close()\n }\n\n return (\n <>\n <FieldTrigger\n anchorRef={anchor.ref}\n icon=\"chevron\"\n text={selectedLabel}\n placeholder={placeholder}\n size={size}\n error={error}\n open={open}\n disabled={disabled}\n readOnly={readOnly}\n onPress={anchor.open}\n className={className}\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n testID={testID}\n />\n <AnchoredOverlay\n visible={open}\n rect={anchor.rect}\n onRequestClose={close}\n matchAnchorWidth\n testID={testID ? `${testID}-list` : undefined}\n className=\"overflow-hidden rounded-md border border-select-dropdown-border bg-select-dropdown-bg shadow-md\"\n >\n <TextInput\n autoFocus\n autoCorrect={false}\n autoCapitalize=\"none\"\n value={query}\n onChangeText={setQuery}\n placeholder={searchPlaceholder}\n placeholderTextColor={placeholderColor}\n accessibilityLabel={searchPlaceholder}\n className=\"h-11 border-b border-select-dropdown-border px-3 text-base text-field-text\"\n />\n <ScrollView className=\"max-h-60 p-1\" keyboardShouldPersistTaps=\"handled\">\n {shown.length === 0 ? (\n <Text className=\"px-3 py-2 text-base text-text-secondary\">{emptyMessage}</Text>\n ) : (\n shown.map((option) => {\n const isSelected = option.value === selected\n return (\n <Pressable\n key={option.value}\n role=\"option\"\n accessibilityLabel={option.label}\n accessibilityState={{ selected: isSelected, disabled: Boolean(option.disabled) }}\n disabled={option.disabled}\n onPress={() => choose(option)}\n className={cn(\n 'flex-row items-center gap-2 rounded-sm px-3 py-2 active:bg-select-option-bg-hover',\n isSelected && 'bg-select-option-bg-selected',\n )}\n >\n <Text\n className={cn(\n 'flex-1 text-base text-select-option-text',\n option.disabled && 'text-select-option-text-disabled',\n )}\n >\n {option.label}\n </Text>\n {isSelected ? (\n <View className=\"size-4 items-center justify-center\">\n <CheckIcon color={checkColor} />\n </View>\n ) : null}\n </Pressable>\n )\n })\n )}\n </ScrollView>\n </AnchoredOverlay>\n </>\n )\n}\n"],"mappings":";;;;;;;;;AA0CA,MAAM,QAAQ,SAAiB,KAAK,UAAU,KAAK,CAAC,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,YAAY;;;;;;;AAQxF,SAAgB,SAAS,EACvB,SACA,OACA,eAAe,IACf,eACA,cAAc,gBACd,oBAAoB,aACpB,eAAe,oBACf,MACA,OACA,UACA,UACA,WACA,oBACA,mBACA,UACgB;CAChB,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAC/C,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,SAAS,UAAU;CACzB,MAAM,mBAAmB,SAAS,gCAAgC;CAClE,MAAM,aAAa,SAAS,4BAA4B;CACxD,MAAM,WAAW,SAAS;CAC1B,MAAM,gBAAgB,QAAQ,MAAM,MAAM,EAAE,UAAU,QAAQ,CAAC,EAAE;CACjE,MAAM,OAAO,OAAO,WAAW,CAAC,YAAY,CAAC;CAC7C,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,KAAK,EAAE,KAAK,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,IAAI;CAEnF,SAAS,QAAQ;EACf,OAAO,MAAM;EACb,SAAS,EAAE;CACb;CAEA,SAAS,OAAO,QAAwB;EACtC,IAAI,UAAU,KAAA,GAAW,SAAS,OAAO,KAAK;EAC9C,gBAAgB,OAAO,KAAK;EAC5B,MAAM;CACR;CAEA,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD;EACE,WAAW,OAAO;EAClB,MAAK;EACL,MAAM;EACO;EACP;EACC;EACD;EACI;EACA;EACV,SAAS,OAAO;EACL;EACS;EACD;EACX;CACT,CAAA,GACD,qBAAC,iBAAD;EACE,SAAS;EACT,MAAM,OAAO;EACb,gBAAgB;EAChB,kBAAA;EACA,QAAQ,SAAS,GAAG,OAAO,SAAS,KAAA;EACpC,WAAU;EANZ,UAAA,CAQE,oBAAC,WAAD;GACE,WAAA;GACA,aAAa;GACb,gBAAe;GACf,OAAO;GACP,cAAc;GACd,aAAa;GACb,sBAAsB;GACtB,oBAAoB;GACpB,WAAU;EACX,CAAA,GACD,oBAAC,YAAD;GAAY,WAAU;GAAe,2BAA0B;GAC5D,UAAA,MAAM,WAAW,IAChB,oBAAC,MAAD;IAAM,WAAU;IAA2C,UAAA;GAAmB,CAAA,IAE9E,MAAM,KAAK,WAAW;IACpB,MAAM,aAAa,OAAO,UAAU;IACpC,OACE,qBAAC,WAAD;KAEE,MAAK;KACL,oBAAoB,OAAO;KAC3B,oBAAoB;MAAE,UAAU;MAAY,UAAU,QAAQ,OAAO,QAAQ;KAAE;KAC/E,UAAU,OAAO;KACjB,eAAe,OAAO,MAAM;KAC5B,WAAW,GACT,qFACA,cAAc,8BAChB;KAVF,UAAA,CAYE,oBAAC,MAAD;MACE,WAAW,GACT,4CACA,OAAO,YAAY,kCACrB;MAEC,UAAA,OAAO;KACJ,CAAA,GACL,aACC,oBAAC,MAAD;MAAM,WAAU;MACd,UAAA,oBAAC,WAAD,EAAW,OAAO,WAAa,CAAA;KAC3B,CAAA,IACJ,IACK;IAxBJ,GAAA,OAAO,KAwBH;GAEf,CAAC;EAEO,CAAA,CACG;CACjB,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -0,0 +1,2 @@
1
+ import { Combobox, ComboboxOption, ComboboxProps } from "./combobox.js";
2
+ export { Combobox, type ComboboxOption, type ComboboxProps };
@@ -0,0 +1,17 @@
1
+ import { ViewProps } from "react-native";
2
+ import { VariantProps } from "class-variance-authority";
3
+ //#region src/components/container/container.d.ts
4
+ declare const containerVariants: (props?: ({
5
+ size?: "lg" | "md" | "sm" | "xl" | null | undefined;
6
+ tablet?: boolean | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ export type ContainerProps = ViewProps & Pick<VariantProps<typeof containerVariants>, 'size'> & {
9
+ className?: string;
10
+ };
11
+ /**
12
+ * Centraliza o conteúdo com largura máxima e margem lateral (16px no mobile, 24px a partir de
13
+ * 768px de largura de janela).
14
+ */
15
+ export declare function Container({ className, size, ...props }: ContainerProps): import("react").JSX.Element;
16
+ //#endregion
17
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { View, useWindowDimensions } from "react-native";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
5
+ //#region src/components/container/container.tsx
6
+ const TABLET_MIN_WIDTH = 768;
7
+ const containerVariants = cva("mx-auto w-full", {
8
+ variants: {
9
+ size: {
10
+ sm: "max-w-[640px]",
11
+ md: "max-w-[960px]",
12
+ lg: "max-w-[1200px]",
13
+ xl: "max-w-[1440px]"
14
+ },
15
+ tablet: {
16
+ true: "px-6",
17
+ false: "px-4"
18
+ }
19
+ },
20
+ defaultVariants: {
21
+ size: "lg",
22
+ tablet: false
23
+ }
24
+ });
25
+ /**
26
+ * Centraliza o conteúdo com largura máxima e margem lateral (16px no mobile, 24px a partir de
27
+ * 768px de largura de janela).
28
+ */
29
+ function Container({ className, size, ...props }) {
30
+ const { width } = useWindowDimensions();
31
+ return /* @__PURE__ */ jsx(View, {
32
+ className: cn(containerVariants({
33
+ size,
34
+ tablet: width >= TABLET_MIN_WIDTH
35
+ }), className),
36
+ ...props
37
+ });
38
+ }
39
+ //#endregion
40
+ export { Container };
41
+
42
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","names":[],"sources":["../../../src/components/container/container.tsx"],"sourcesContent":["/// <reference types=\"uniwind/types\" />\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { useWindowDimensions, View, type ViewProps } from 'react-native'\nimport { cn } from '../../utils/cn'\n\nconst TABLET_MIN_WIDTH = 768\n\nconst containerVariants = cva('mx-auto w-full', {\n variants: {\n size: {\n sm: 'max-w-[640px]',\n md: 'max-w-[960px]',\n lg: 'max-w-[1200px]',\n xl: 'max-w-[1440px]',\n },\n // sem variante `tablet:` no Uniwind: o breakpoint vem de useWindowDimensions\n tablet: { true: 'px-6', false: 'px-4' },\n },\n defaultVariants: { size: 'lg', tablet: false },\n})\n\nexport type ContainerProps = ViewProps &\n Pick<VariantProps<typeof containerVariants>, 'size'> & { className?: string }\n\n/**\n * Centraliza o conteúdo com largura máxima e margem lateral (16px no mobile, 24px a partir de\n * 768px de largura de janela).\n */\nexport function Container({ className, size, ...props }: ContainerProps) {\n const { width } = useWindowDimensions()\n\n return (\n <View\n className={cn(containerVariants({ size, tablet: width >= TABLET_MIN_WIDTH }), className)}\n {...props}\n />\n )\n}\n"],"mappings":";;;;;AAMA,MAAM,mBAAmB;AAEzB,MAAM,oBAAoB,IAAI,kBAAkB;CAC9C,UAAU;EACR,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EAEA,QAAQ;GAAE,MAAM;GAAQ,OAAO;EAAO;CACxC;CACA,iBAAiB;EAAE,MAAM;EAAM,QAAQ;CAAM;AAC/C,CAAC;;;;;AASD,SAAgB,UAAU,EAAE,WAAW,MAAM,GAAG,SAAyB;CACvE,MAAM,EAAE,UAAU,oBAAoB;CAEtC,OACE,oBAAC,MAAD;EACE,WAAW,GAAG,kBAAkB;GAAE;GAAM,QAAQ,SAAS;EAAiB,CAAC,GAAG,SAAS;EACvF,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,2 @@
1
+ import { Container, ContainerProps } from "./container.js";
2
+ export { Container, type ContainerProps };
@@ -0,0 +1,38 @@
1
+ import { DateRange } from "./dates.js";
2
+ //#region src/components/date-picker/calendar.d.ts
3
+ type CalendarCommon = {
4
+ /** Primeiro dia que pode ser escolhido. */
5
+ minDate?: Date;
6
+ /** Último dia que pode ser escolhido. */
7
+ maxDate?: Date;
8
+ /** Idioma dos nomes de mês e dia (BCP 47). */
9
+ locale?: string;
10
+ /** Primeiro dia da semana: 0 = domingo (padrão), 1 = segunda. */
11
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
12
+ previousMonthLabel?: string;
13
+ nextMonthLabel?: string;
14
+ className?: string;
15
+ testID?: string;
16
+ };
17
+ export type CalendarProps = CalendarCommon & ({
18
+ /** `single` (padrão) escolhe um dia; `range` escolhe um período (início e fim). */
19
+ mode?: 'single';
20
+ /** Dia selecionado (modo controlado). */
21
+ value?: Date;
22
+ defaultValue?: Date;
23
+ onValueChange?: (date: Date) => void;
24
+ } | {
25
+ mode: 'range';
26
+ /** Período selecionado (modo controlado). Sem `to`, só o início foi escolhido. */
27
+ value?: DateRange;
28
+ defaultValue?: DateRange;
29
+ /** Chamado a cada toque: primeiro com só o início, depois com o período completo. */
30
+ onValueChange?: (range: DateRange) => void;
31
+ });
32
+ /**
33
+ * Calendário de um mês para escolher um dia ou um período, em RN puro (sem dependência nativa).
34
+ * Sem navegação por teclado nem `autoFocus` (não se aplicam ao native).
35
+ */
36
+ export declare function Calendar({ minDate, maxDate, locale, weekStartsOn, previousMonthLabel, nextMonthLabel, className, testID, ...selection }: CalendarProps): import("react").JSX.Element;
37
+ //#endregion
38
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1,137 @@
1
+ import { cn } from "../../utils/cn.js";
2
+ import { ChevronRightIcon } from "../_shared/status.js";
3
+ import { useToken } from "../_shared/use-token.js";
4
+ import { addDays, addMonths, clamp, isSameDay, monthWeeks, pickRange, startOfDay, toISODate } from "./dates.js";
5
+ import { useState } from "react";
6
+ import { Pressable, Text, View } from "react-native";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/components/date-picker/calendar.tsx
9
+ /**
10
+ * Calendário de um mês para escolher um dia ou um período, em RN puro (sem dependência nativa).
11
+ * Sem navegação por teclado nem `autoFocus` (não se aplicam ao native).
12
+ */
13
+ function Calendar({ minDate, maxDate, locale = "pt-BR", weekStartsOn = 0, previousMonthLabel = "Mês anterior", nextMonthLabel = "Próximo mês", className, testID, ...selection }) {
14
+ const [inner, setInner] = useState(selection.defaultValue);
15
+ const current = selection.value ?? inner;
16
+ const isRange = selection.mode === "range";
17
+ const range = isRange ? current : void 0;
18
+ const from = isRange ? range?.from : current;
19
+ const to = isRange ? range?.to : from;
20
+ const today = startOfDay(/* @__PURE__ */ new Date());
21
+ const [cursor, setCursor] = useState(() => clamp(startOfDay(from ?? today), minDate, maxDate));
22
+ const chevronColor = useToken("--color-text-primary");
23
+ const monthTitle = new Intl.DateTimeFormat(locale, {
24
+ month: "long",
25
+ year: "numeric"
26
+ }).format(cursor);
27
+ const fullDate = new Intl.DateTimeFormat(locale, {
28
+ weekday: "long",
29
+ day: "numeric",
30
+ month: "long",
31
+ year: "numeric"
32
+ });
33
+ const weekdayShort = new Intl.DateTimeFormat(locale, { weekday: "short" });
34
+ const weeks = monthWeeks(cursor.getFullYear(), cursor.getMonth(), weekStartsOn);
35
+ const headings = (weeks[0] ?? []).map((_, i) => {
36
+ const day = addDays(new Date(2023, 0, 1), weekStartsOn + i);
37
+ return weekdayShort.format(day);
38
+ });
39
+ const isDisabled = (d) => minDate !== void 0 && d < startOfDay(minDate) || maxDate !== void 0 && d > startOfDay(maxDate);
40
+ const canGoPrevious = !minDate || new Date(cursor.getFullYear(), cursor.getMonth(), 0) >= startOfDay(minDate);
41
+ const canGoNext = !maxDate || new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1) <= startOfDay(maxDate);
42
+ function choose(day) {
43
+ if (selection.mode === "range") {
44
+ const next = pickRange(range, day);
45
+ if (selection.value === void 0) setInner(next);
46
+ selection.onValueChange?.(next);
47
+ } else {
48
+ if (selection.value === void 0) setInner(day);
49
+ selection.onValueChange?.(day);
50
+ }
51
+ }
52
+ const isEdge = (day, edge) => edge !== void 0 && isSameDay(day, edge);
53
+ const hasSpan = isRange && from !== void 0 && to !== void 0 && !isSameDay(from, to);
54
+ const inBand = (day) => from !== void 0 && to !== void 0 && day > from && day < to;
55
+ return /* @__PURE__ */ jsxs(View, {
56
+ testID,
57
+ className: cn("w-70", className),
58
+ children: [
59
+ /* @__PURE__ */ jsxs(View, {
60
+ className: "mb-2 flex-row items-center justify-between",
61
+ children: [
62
+ /* @__PURE__ */ jsx(Pressable, {
63
+ accessibilityRole: "button",
64
+ accessibilityLabel: previousMonthLabel,
65
+ accessibilityState: { disabled: !canGoPrevious },
66
+ disabled: !canGoPrevious,
67
+ onPress: () => setCursor(clamp(addMonths(cursor, -1), minDate, maxDate)),
68
+ className: "size-9 items-center justify-center rounded-full active:bg-button-secondary-bg-hover disabled:opacity-40",
69
+ children: /* @__PURE__ */ jsx(View, {
70
+ className: "rotate-180",
71
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { color: chevronColor })
72
+ })
73
+ }),
74
+ /* @__PURE__ */ jsx(Text, {
75
+ accessibilityRole: "header",
76
+ accessibilityLiveRegion: "polite",
77
+ className: "text-sm font-medium capitalize text-text-primary",
78
+ children: monthTitle
79
+ }),
80
+ /* @__PURE__ */ jsx(Pressable, {
81
+ accessibilityRole: "button",
82
+ accessibilityLabel: nextMonthLabel,
83
+ accessibilityState: { disabled: !canGoNext },
84
+ disabled: !canGoNext,
85
+ onPress: () => setCursor(clamp(addMonths(cursor, 1), minDate, maxDate)),
86
+ className: "size-9 items-center justify-center rounded-full active:bg-button-secondary-bg-hover disabled:opacity-40",
87
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { color: chevronColor })
88
+ })
89
+ ]
90
+ }),
91
+ /* @__PURE__ */ jsx(View, {
92
+ className: "flex-row",
93
+ children: headings.map((heading, i) => /* @__PURE__ */ jsx(View, {
94
+ accessible: false,
95
+ className: "h-8 flex-1 items-center justify-center",
96
+ children: /* @__PURE__ */ jsx(Text, {
97
+ className: "text-xs font-medium capitalize text-text-secondary",
98
+ children: heading
99
+ })
100
+ }, i))
101
+ }),
102
+ weeks.map((week) => /* @__PURE__ */ jsx(View, {
103
+ className: "flex-row",
104
+ children: week.map((day, i) => {
105
+ if (!day) return /* @__PURE__ */ jsx(View, { className: "h-9 flex-1" }, `empty-${i}`);
106
+ const isFrom = isEdge(day, from);
107
+ const isTo = isEdge(day, to);
108
+ const edge = isFrom || isTo;
109
+ const isToday = isSameDay(day, today);
110
+ const disabled = isDisabled(day);
111
+ return /* @__PURE__ */ jsx(View, {
112
+ className: cn("h-9 flex-1 items-center", hasSpan && (inBand(day) || edge) && "bg-button-secondary-bg", hasSpan && isFrom && "rounded-l-full", hasSpan && isTo && "rounded-r-full"),
113
+ children: /* @__PURE__ */ jsx(Pressable, {
114
+ accessibilityRole: "button",
115
+ accessibilityLabel: fullDate.format(day),
116
+ accessibilityState: {
117
+ selected: edge || inBand(day),
118
+ disabled
119
+ },
120
+ disabled,
121
+ onPress: () => choose(day),
122
+ className: cn("size-9 items-center justify-center rounded-full active:bg-bg-tertiary", inBand(day) && "active:bg-button-secondary-bg-hover", edge && "bg-button-primary-bg active:bg-button-primary-bg-active"),
123
+ children: /* @__PURE__ */ jsx(Text, {
124
+ className: cn("text-sm text-text-primary", isToday && "font-semibold text-text-brand", edge && "font-medium text-button-primary-text", disabled && "text-text-disabled"),
125
+ children: day.getDate()
126
+ })
127
+ })
128
+ }, toISODate(day));
129
+ })
130
+ }, toISODate(week.find((d) => d) ?? cursor)))
131
+ ]
132
+ });
133
+ }
134
+ //#endregion
135
+ export { Calendar };
136
+
137
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","names":[],"sources":["../../../src/components/date-picker/calendar.tsx"],"sourcesContent":["/// <reference types=\"uniwind/types\" />\n\nimport { useState } from 'react'\nimport { Pressable, Text, View } from 'react-native'\nimport { cn } from '../../utils/cn'\nimport { ChevronRightIcon } from '../_shared/status'\nimport { useToken } from '../_shared/use-token'\nimport {\n addDays,\n addMonths,\n clamp,\n type DateRange,\n isSameDay,\n monthWeeks,\n pickRange,\n startOfDay,\n toISODate,\n} from './dates'\n\ntype CalendarCommon = {\n /** Primeiro dia que pode ser escolhido. */\n minDate?: Date\n /** Último dia que pode ser escolhido. */\n maxDate?: Date\n /** Idioma dos nomes de mês e dia (BCP 47). */\n locale?: string\n /** Primeiro dia da semana: 0 = domingo (padrão), 1 = segunda. */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n previousMonthLabel?: string\n nextMonthLabel?: string\n className?: string\n testID?: string\n}\n\nexport type CalendarProps = CalendarCommon &\n (\n | {\n /** `single` (padrão) escolhe um dia; `range` escolhe um período (início e fim). */\n mode?: 'single'\n /** Dia selecionado (modo controlado). */\n value?: Date\n defaultValue?: Date\n onValueChange?: (date: Date) => void\n }\n | {\n mode: 'range'\n /** Período selecionado (modo controlado). Sem `to`, só o início foi escolhido. */\n value?: DateRange\n defaultValue?: DateRange\n /** Chamado a cada toque: primeiro com só o início, depois com o período completo. */\n onValueChange?: (range: DateRange) => void\n }\n )\n\n/**\n * Calendário de um mês para escolher um dia ou um período, em RN puro (sem dependência nativa).\n * Sem navegação por teclado nem `autoFocus` (não se aplicam ao native).\n */\nexport function Calendar({\n minDate,\n maxDate,\n locale = 'pt-BR',\n weekStartsOn = 0,\n previousMonthLabel = 'Mês anterior',\n nextMonthLabel = 'Próximo mês',\n className,\n testID,\n ...selection\n}: CalendarProps) {\n const [inner, setInner] = useState(selection.defaultValue)\n const current = selection.value ?? inner\n const isRange = selection.mode === 'range'\n const range = isRange ? (current as DateRange | undefined) : undefined\n const from = isRange ? range?.from : (current as Date | undefined)\n const to = isRange ? range?.to : from\n const today = startOfDay(new Date())\n // o mês exibido: começa no valor (ou hoje) e muda pelas setas\n const [cursor, setCursor] = useState(() => clamp(startOfDay(from ?? today), minDate, maxDate))\n const chevronColor = useToken('--color-text-primary')\n\n const monthTitle = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(\n cursor,\n )\n // equivale a dateStyle: 'full', mas com opções explícitas (mais compatível com o Hermes)\n const fullDate = new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n })\n const weekdayShort = new Intl.DateTimeFormat(locale, { weekday: 'short' })\n const weeks = monthWeeks(cursor.getFullYear(), cursor.getMonth(), weekStartsOn)\n const headings = (weeks[0] ?? []).map((_, i) => {\n const day = addDays(new Date(2023, 0, 1), weekStartsOn + i) // 1/jan/2023 foi domingo\n return weekdayShort.format(day)\n })\n\n const isDisabled = (d: Date) =>\n (minDate !== undefined && d < startOfDay(minDate)) ||\n (maxDate !== undefined && d > startOfDay(maxDate))\n const canGoPrevious =\n !minDate || new Date(cursor.getFullYear(), cursor.getMonth(), 0) >= startOfDay(minDate)\n const canGoNext =\n !maxDate || new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1) <= startOfDay(maxDate)\n\n function choose(day: Date) {\n if (selection.mode === 'range') {\n const next = pickRange(range, day)\n if (selection.value === undefined) setInner(next)\n selection.onValueChange?.(next)\n } else {\n if (selection.value === undefined) setInner(day)\n selection.onValueChange?.(day)\n }\n }\n\n const isEdge = (day: Date, edge?: Date) => edge !== undefined && isSameDay(day, edge)\n // período com mais de um dia: só nele há faixa (um dia só fica como um círculo)\n const hasSpan = isRange && from !== undefined && to !== undefined && !isSameDay(from, to)\n const inBand = (day: Date) => from !== undefined && to !== undefined && day > from && day < to\n\n return (\n <View testID={testID} className={cn('w-70', className)}>\n <View className=\"mb-2 flex-row items-center justify-between\">\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={previousMonthLabel}\n accessibilityState={{ disabled: !canGoPrevious }}\n disabled={!canGoPrevious}\n onPress={() => setCursor(clamp(addMonths(cursor, -1), minDate, maxDate))}\n className=\"size-9 items-center justify-center rounded-full active:bg-button-secondary-bg-hover disabled:opacity-40\"\n >\n <View className=\"rotate-180\">\n <ChevronRightIcon color={chevronColor} />\n </View>\n </Pressable>\n <Text\n accessibilityRole=\"header\"\n accessibilityLiveRegion=\"polite\"\n className=\"text-sm font-medium capitalize text-text-primary\"\n >\n {monthTitle}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={nextMonthLabel}\n accessibilityState={{ disabled: !canGoNext }}\n disabled={!canGoNext}\n onPress={() => setCursor(clamp(addMonths(cursor, 1), minDate, maxDate))}\n className=\"size-9 items-center justify-center rounded-full active:bg-button-secondary-bg-hover disabled:opacity-40\"\n >\n <ChevronRightIcon color={chevronColor} />\n </Pressable>\n </View>\n <View className=\"flex-row\">\n {headings.map((heading, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: a posição na semana é a identidade\n <View key={i} accessible={false} className=\"h-8 flex-1 items-center justify-center\">\n <Text className=\"text-xs font-medium capitalize text-text-secondary\">{heading}</Text>\n </View>\n ))}\n </View>\n {weeks.map((week) => (\n <View key={toISODate(week.find((d) => d) ?? cursor)} className=\"flex-row\">\n {week.map((day, i) => {\n if (!day) {\n // biome-ignore lint/suspicious/noArrayIndexKey: células vazias não têm identidade\n return <View key={`empty-${i}`} className=\"h-9 flex-1\" />\n }\n const isFrom = isEdge(day, from)\n const isTo = isEdge(day, to)\n const edge = isFrom || isTo\n const isToday = isSameDay(day, today)\n const disabled = isDisabled(day)\n return (\n <View\n key={toISODate(day)}\n className={cn(\n 'h-9 flex-1 items-center',\n // faixa contínua entre o início e o fim, com as pontas arredondadas\n hasSpan && (inBand(day) || edge) && 'bg-button-secondary-bg',\n hasSpan && isFrom && 'rounded-l-full',\n hasSpan && isTo && 'rounded-r-full',\n )}\n >\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={fullDate.format(day)}\n accessibilityState={{\n selected: edge || inBand(day),\n disabled,\n }}\n disabled={disabled}\n onPress={() => choose(day)}\n className={cn(\n 'size-9 items-center justify-center rounded-full active:bg-bg-tertiary',\n inBand(day) && 'active:bg-button-secondary-bg-hover',\n edge && 'bg-button-primary-bg active:bg-button-primary-bg-active',\n )}\n >\n <Text\n className={cn(\n 'text-sm text-text-primary',\n isToday && 'font-semibold text-text-brand',\n edge && 'font-medium text-button-primary-text',\n disabled && 'text-text-disabled',\n )}\n >\n {day.getDate()}\n </Text>\n </Pressable>\n </View>\n )\n })}\n </View>\n ))}\n </View>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { FieldSize } from "../select/field-trigger.js";
2
+ import { CalendarProps } from "./calendar.js";
3
+ //#region src/components/date-picker/date-picker.d.ts
4
+ export type DatePickerProps = Pick<CalendarProps, 'minDate' | 'maxDate' | 'locale' | 'weekStartsOn'> & {
5
+ /** Dia selecionado (modo controlado). */
6
+ value?: Date;
7
+ defaultValue?: Date;
8
+ /** Chamado com o dia escolhido. */
9
+ onValueChange?: (date: Date) => void;
10
+ placeholder?: string;
11
+ size?: FieldSize;
12
+ disabled?: boolean;
13
+ /** Mostra a data mas não deixa trocar. */
14
+ readOnly?: boolean;
15
+ error?: boolean;
16
+ className?: string;
17
+ accessibilityLabel?: string;
18
+ accessibilityHint?: string;
19
+ testID?: string;
20
+ };
21
+ /** Campo de data: um gatilho que mostra o dia escolhido e abre um Calendar num painel modal. */
22
+ export declare function DatePicker({ value, defaultValue, onValueChange, minDate, maxDate, locale, weekStartsOn, placeholder, size, error, disabled, readOnly, className, accessibilityLabel, accessibilityHint, testID }: DatePickerProps): import("react").JSX.Element;
23
+ //#endregion
24
+ //# sourceMappingURL=date-picker.d.ts.map
@@ -0,0 +1,52 @@
1
+ import { Calendar } from "./calendar.js";
2
+ import { DateSheet } from "./date-sheet.js";
3
+ import { DateTrigger } from "./date-trigger.js";
4
+ import { useState } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/components/date-picker/date-picker.tsx
7
+ /** Campo de data: um gatilho que mostra o dia escolhido e abre um Calendar num painel modal. */
8
+ function DatePicker({ value, defaultValue, onValueChange, minDate, maxDate, locale = "pt-BR", weekStartsOn, placeholder = "dd/mm/aaaa", size, error, disabled, readOnly, className, accessibilityLabel, accessibilityHint, testID }) {
9
+ const [inner, setInner] = useState(defaultValue);
10
+ const [open, setOpen] = useState(false);
11
+ const selected = value ?? inner;
12
+ const text = selected ? new Intl.DateTimeFormat(locale, {
13
+ day: "2-digit",
14
+ month: "2-digit",
15
+ year: "numeric"
16
+ }).format(selected) : void 0;
17
+ const visible = open && !readOnly && !disabled;
18
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(DateTrigger, {
19
+ text,
20
+ placeholder,
21
+ size,
22
+ error,
23
+ open: visible,
24
+ disabled,
25
+ readOnly,
26
+ onPress: () => setOpen(true),
27
+ className,
28
+ accessibilityLabel,
29
+ accessibilityHint,
30
+ testID
31
+ }), /* @__PURE__ */ jsx(DateSheet, {
32
+ visible,
33
+ onRequestClose: () => setOpen(false),
34
+ testID: testID ? `${testID}-sheet` : void 0,
35
+ children: /* @__PURE__ */ jsx(Calendar, {
36
+ value: selected,
37
+ minDate,
38
+ maxDate,
39
+ locale,
40
+ weekStartsOn,
41
+ onValueChange: (day) => {
42
+ if (value === void 0) setInner(day);
43
+ onValueChange?.(day);
44
+ setOpen(false);
45
+ }
46
+ })
47
+ })] });
48
+ }
49
+ //#endregion
50
+ export { DatePicker };
51
+
52
+ //# sourceMappingURL=date-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker.js","names":[],"sources":["../../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import { useState } from 'react'\nimport type { FieldSize } from '../select/field-trigger'\nimport { Calendar, type CalendarProps } from './calendar'\nimport { DateSheet } from './date-sheet'\nimport { DateTrigger } from './date-trigger'\n\nexport type DatePickerProps = Pick<\n CalendarProps,\n 'minDate' | 'maxDate' | 'locale' | 'weekStartsOn'\n> & {\n /** Dia selecionado (modo controlado). */\n value?: Date\n defaultValue?: Date\n /** Chamado com o dia escolhido. */\n onValueChange?: (date: Date) => void\n placeholder?: string\n size?: FieldSize\n disabled?: boolean\n /** Mostra a data mas não deixa trocar. */\n readOnly?: boolean\n error?: boolean\n className?: string\n accessibilityLabel?: string\n accessibilityHint?: string\n testID?: string\n}\n\n/** Campo de data: um gatilho que mostra o dia escolhido e abre um Calendar num painel modal. */\nexport function DatePicker({\n value,\n defaultValue,\n onValueChange,\n minDate,\n maxDate,\n locale = 'pt-BR',\n weekStartsOn,\n placeholder = 'dd/mm/aaaa',\n size,\n error,\n disabled,\n readOnly,\n className,\n accessibilityLabel,\n accessibilityHint,\n testID,\n}: DatePickerProps) {\n const [inner, setInner] = useState(defaultValue)\n const [open, setOpen] = useState(false)\n const selected = value ?? inner\n const text = selected\n ? new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric' }).format(\n selected,\n )\n : undefined\n const visible = open && !readOnly && !disabled\n\n return (\n <>\n <DateTrigger\n text={text}\n placeholder={placeholder}\n size={size}\n error={error}\n open={visible}\n disabled={disabled}\n readOnly={readOnly}\n onPress={() => setOpen(true)}\n className={className}\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n testID={testID}\n />\n <DateSheet\n visible={visible}\n onRequestClose={() => setOpen(false)}\n testID={testID ? `${testID}-sheet` : undefined}\n >\n <Calendar\n value={selected}\n minDate={minDate}\n maxDate={maxDate}\n locale={locale}\n weekStartsOn={weekStartsOn}\n onValueChange={(day) => {\n if (value === undefined) setInner(day)\n onValueChange?.(day)\n setOpen(false)\n }}\n />\n </DateSheet>\n </>\n )\n}\n"],"mappings":";;;;;;;AA4BA,SAAgB,WAAW,EACzB,OACA,cACA,eACA,SACA,SACA,SAAS,SACT,cACA,cAAc,cACd,MACA,OACA,UACA,UACA,WACA,oBACA,mBACA,UACkB;CAClB,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAC/C,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,WAAW,SAAS;CAC1B,MAAM,OAAO,WACT,IAAI,KAAK,eAAe,QAAQ;EAAE,KAAK;EAAW,OAAO;EAAW,MAAM;CAAU,CAAC,CAAC,CAAC,OACrF,QACF,IACA,KAAA;CACJ,MAAM,UAAU,QAAQ,CAAC,YAAY,CAAC;CAEtC,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,aAAD;EACQ;EACO;EACP;EACC;EACP,MAAM;EACI;EACA;EACV,eAAe,QAAQ,IAAI;EAChB;EACS;EACD;EACX;CACT,CAAA,GACD,oBAAC,WAAD;EACW;EACT,sBAAsB,QAAQ,KAAK;EACnC,QAAQ,SAAS,GAAG,OAAO,UAAU,KAAA;EAErC,UAAA,oBAAC,UAAD;GACE,OAAO;GACE;GACA;GACD;GACM;GACd,gBAAgB,QAAQ;IACtB,IAAI,UAAU,KAAA,GAAW,SAAS,GAAG;IACrC,gBAAgB,GAAG;IACnB,QAAQ,KAAK;GACf;EACD,CAAA;CACQ,CAAA,CACX,EAAA,CAAA;AAEN"}
@@ -0,0 +1,15 @@
1
+ import { DateRange } from "./dates.js";
2
+ //#region src/components/date-picker/date-presets.d.ts
3
+ export type DatePreset = {
4
+ /** Texto do atalho. */
5
+ label: string;
6
+ /** Período que o atalho escolhe, com início e fim. */
7
+ range: Required<DateRange>;
8
+ };
9
+ /**
10
+ * Atalhos comuns de período, contados a partir de `today`: hoje, últimos 7 e 30 dias (incluindo
11
+ * hoje), este mês e mês passado. Passe só os que quiser, ou monte os seus, em `presets`.
12
+ */
13
+ export declare function getDatePresets(today?: Date): DatePreset[];
14
+ //#endregion
15
+ //# sourceMappingURL=date-presets.d.ts.map