@nori-ui/core 1.6.0 → 1.7.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 (179) hide show
  1. package/dist/{chunk-7UKRN73P.js → chunk-2XJCLPNH.js} +3 -3
  2. package/dist/{chunk-7UKRN73P.js.map → chunk-2XJCLPNH.js.map} +1 -1
  3. package/dist/{chunk-5PSC5HT4.js → chunk-3B345SQU.js} +5 -5
  4. package/dist/{chunk-5PSC5HT4.js.map → chunk-3B345SQU.js.map} +1 -1
  5. package/dist/{chunk-JSAG5YO7.js → chunk-3IIIHZHT.js} +3 -3
  6. package/dist/{chunk-JSAG5YO7.js.map → chunk-3IIIHZHT.js.map} +1 -1
  7. package/dist/{chunk-DDGMLLS3.js → chunk-3W3XYULK.js} +3 -3
  8. package/dist/{chunk-DDGMLLS3.js.map → chunk-3W3XYULK.js.map} +1 -1
  9. package/dist/{chunk-WYPGQVDV.js → chunk-5YHT252H.js} +3 -3
  10. package/dist/{chunk-WYPGQVDV.js.map → chunk-5YHT252H.js.map} +1 -1
  11. package/dist/{chunk-ZMSIYLSI.js → chunk-7FSFJA33.js} +3 -3
  12. package/dist/{chunk-ZMSIYLSI.js.map → chunk-7FSFJA33.js.map} +1 -1
  13. package/dist/{chunk-YZ27OS2R.js → chunk-C32XGHWO.js} +3 -3
  14. package/dist/{chunk-YZ27OS2R.js.map → chunk-C32XGHWO.js.map} +1 -1
  15. package/dist/{chunk-UJWCEGQY.js → chunk-C5HQPXRI.js} +3 -3
  16. package/dist/{chunk-UJWCEGQY.js.map → chunk-C5HQPXRI.js.map} +1 -1
  17. package/dist/{chunk-XALU6LOT.js → chunk-EN4CLDGZ.js} +3 -3
  18. package/dist/{chunk-XALU6LOT.js.map → chunk-EN4CLDGZ.js.map} +1 -1
  19. package/dist/{chunk-6AD6KCVB.js → chunk-F5UKI7XD.js} +3 -3
  20. package/dist/{chunk-6AD6KCVB.js.map → chunk-F5UKI7XD.js.map} +1 -1
  21. package/dist/chunk-GTAXVTLF.js +43 -0
  22. package/dist/chunk-GTAXVTLF.js.map +1 -0
  23. package/dist/{chunk-NNFJKRXZ.js → chunk-H2LHWJ52.js} +3 -3
  24. package/dist/{chunk-NNFJKRXZ.js.map → chunk-H2LHWJ52.js.map} +1 -1
  25. package/dist/{chunk-PZS4A4VQ.js → chunk-HXCETKCC.js} +3 -3
  26. package/dist/{chunk-PZS4A4VQ.js.map → chunk-HXCETKCC.js.map} +1 -1
  27. package/dist/chunk-IGBXSBF7.js +71 -0
  28. package/dist/chunk-IGBXSBF7.js.map +1 -0
  29. package/dist/{chunk-JXLEMBDB.js → chunk-IIVTPN62.js} +3 -3
  30. package/dist/{chunk-JXLEMBDB.js.map → chunk-IIVTPN62.js.map} +1 -1
  31. package/dist/{chunk-PNP7L4TA.js → chunk-ISCJST4P.js} +3 -3
  32. package/dist/{chunk-PNP7L4TA.js.map → chunk-ISCJST4P.js.map} +1 -1
  33. package/dist/{chunk-TLS54G6Y.js → chunk-IWM2XDXH.js} +3 -3
  34. package/dist/{chunk-TLS54G6Y.js.map → chunk-IWM2XDXH.js.map} +1 -1
  35. package/dist/chunk-J5LK2XHE.js +118 -0
  36. package/dist/chunk-J5LK2XHE.js.map +1 -0
  37. package/dist/chunk-KFFGDET3.js +27 -0
  38. package/dist/chunk-KFFGDET3.js.map +1 -0
  39. package/dist/{chunk-MRJWPRCX.js → chunk-L6VYDM7S.js} +3 -3
  40. package/dist/{chunk-MRJWPRCX.js.map → chunk-L6VYDM7S.js.map} +1 -1
  41. package/dist/chunk-M4BI63P6.js +188 -0
  42. package/dist/chunk-M4BI63P6.js.map +1 -0
  43. package/dist/{chunk-RUWD35UI.js → chunk-MK57AOTI.js} +4 -4
  44. package/dist/{chunk-RUWD35UI.js.map → chunk-MK57AOTI.js.map} +1 -1
  45. package/dist/{chunk-3BDDPFCI.js → chunk-MOAIQHR7.js} +3 -3
  46. package/dist/{chunk-3BDDPFCI.js.map → chunk-MOAIQHR7.js.map} +1 -1
  47. package/dist/{chunk-5XEGZFG5.js → chunk-MYBBBLYE.js} +3 -3
  48. package/dist/{chunk-5XEGZFG5.js.map → chunk-MYBBBLYE.js.map} +1 -1
  49. package/dist/{chunk-WP2Z2ATO.js → chunk-O6M3F7BZ.js} +5 -5
  50. package/dist/{chunk-WP2Z2ATO.js.map → chunk-O6M3F7BZ.js.map} +1 -1
  51. package/dist/{chunk-FEPTH5RV.js → chunk-OELY6K44.js} +3 -3
  52. package/dist/{chunk-FEPTH5RV.js.map → chunk-OELY6K44.js.map} +1 -1
  53. package/dist/{chunk-BZLT6R62.js → chunk-OIHX5B4R.js} +3 -3
  54. package/dist/{chunk-BZLT6R62.js.map → chunk-OIHX5B4R.js.map} +1 -1
  55. package/dist/{chunk-QJVS2VXS.js → chunk-PGYEIXCO.js} +4 -4
  56. package/dist/{chunk-QJVS2VXS.js.map → chunk-PGYEIXCO.js.map} +1 -1
  57. package/dist/{chunk-UZD77M3J.js → chunk-PJTCO76H.js} +3 -3
  58. package/dist/{chunk-UZD77M3J.js.map → chunk-PJTCO76H.js.map} +1 -1
  59. package/dist/{chunk-4PUPKWEP.js → chunk-PJXVLE24.js} +4 -4
  60. package/dist/{chunk-4PUPKWEP.js.map → chunk-PJXVLE24.js.map} +1 -1
  61. package/dist/{chunk-WGT345SV.js → chunk-PLQPBMG2.js} +3 -3
  62. package/dist/{chunk-WGT345SV.js.map → chunk-PLQPBMG2.js.map} +1 -1
  63. package/dist/{chunk-OMU4R4Y5.js → chunk-PQW5LKAI.js} +3 -3
  64. package/dist/{chunk-OMU4R4Y5.js.map → chunk-PQW5LKAI.js.map} +1 -1
  65. package/dist/{chunk-Y5TJ7CAX.js → chunk-RI4Y2C5U.js} +3 -3
  66. package/dist/{chunk-Y5TJ7CAX.js.map → chunk-RI4Y2C5U.js.map} +1 -1
  67. package/dist/{chunk-3OIWAS2P.js → chunk-SF6WPUC5.js} +3 -3
  68. package/dist/{chunk-3OIWAS2P.js.map → chunk-SF6WPUC5.js.map} +1 -1
  69. package/dist/{chunk-MKSDYRWQ.js → chunk-STX5UKYT.js} +3 -3
  70. package/dist/{chunk-MKSDYRWQ.js.map → chunk-STX5UKYT.js.map} +1 -1
  71. package/dist/{chunk-2RL6WCFC.js → chunk-TSWPHJIU.js} +4 -4
  72. package/dist/{chunk-2RL6WCFC.js.map → chunk-TSWPHJIU.js.map} +1 -1
  73. package/dist/{chunk-SFNDR6DI.js → chunk-U2ZKY2CP.js} +3 -3
  74. package/dist/{chunk-SFNDR6DI.js.map → chunk-U2ZKY2CP.js.map} +1 -1
  75. package/dist/{chunk-PABG3IJ6.js → chunk-UKDDK42K.js} +3 -3
  76. package/dist/{chunk-PABG3IJ6.js.map → chunk-UKDDK42K.js.map} +1 -1
  77. package/dist/{chunk-VYRJ7OE5.js → chunk-USFXANEU.js} +3 -3
  78. package/dist/{chunk-VYRJ7OE5.js.map → chunk-USFXANEU.js.map} +1 -1
  79. package/dist/{chunk-CCUXO2HN.js → chunk-V5QSMDZL.js} +3 -3
  80. package/dist/{chunk-CCUXO2HN.js.map → chunk-V5QSMDZL.js.map} +1 -1
  81. package/dist/{chunk-NF7XG2FG.js → chunk-V75O7QQO.js} +3 -3
  82. package/dist/{chunk-NF7XG2FG.js.map → chunk-V75O7QQO.js.map} +1 -1
  83. package/dist/{chunk-NRYWNOG5.js → chunk-VL2WNGPF.js} +3 -3
  84. package/dist/{chunk-NRYWNOG5.js.map → chunk-VL2WNGPF.js.map} +1 -1
  85. package/dist/{chunk-JQQ3FBN7.js → chunk-VLZANXRZ.js} +3 -3
  86. package/dist/{chunk-JQQ3FBN7.js.map → chunk-VLZANXRZ.js.map} +1 -1
  87. package/dist/{chunk-2HMQDJ22.js → chunk-VOF3S5I4.js} +3 -3
  88. package/dist/{chunk-2HMQDJ22.js.map → chunk-VOF3S5I4.js.map} +1 -1
  89. package/dist/chunk-XQNVWHMN.js +60 -0
  90. package/dist/chunk-XQNVWHMN.js.map +1 -0
  91. package/dist/{chunk-JZ774T7U.js → chunk-ZGFXKYA5.js} +3 -3
  92. package/dist/{chunk-JZ774T7U.js.map → chunk-ZGFXKYA5.js.map} +1 -1
  93. package/dist/client.cjs +451 -2
  94. package/dist/client.cjs.map +1 -1
  95. package/dist/client.d.cts +6 -0
  96. package/dist/client.d.ts +6 -0
  97. package/dist/client.js +52 -46
  98. package/dist/client.js.map +1 -1
  99. package/dist/components/Accordion/index.js +2 -2
  100. package/dist/components/Alert/index.js +2 -2
  101. package/dist/components/AlertDialog/index.js +2 -2
  102. package/dist/components/AspectRatio/index.cjs +67 -0
  103. package/dist/components/AspectRatio/index.cjs.map +1 -0
  104. package/dist/components/AspectRatio/index.d.cts +30 -0
  105. package/dist/components/AspectRatio/index.d.ts +30 -0
  106. package/dist/components/AspectRatio/index.js +5 -0
  107. package/dist/components/AspectRatio/index.js.map +1 -0
  108. package/dist/components/Avatar/index.js +2 -2
  109. package/dist/components/Badge/index.js +2 -2
  110. package/dist/components/Box/index.js +4 -4
  111. package/dist/components/Breadcrumb/index.js +3 -3
  112. package/dist/components/Button/index.js +2 -2
  113. package/dist/components/ButtonGroup/index.cjs +83 -0
  114. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  115. package/dist/components/ButtonGroup/index.d.cts +45 -0
  116. package/dist/components/ButtonGroup/index.d.ts +45 -0
  117. package/dist/components/ButtonGroup/index.js +5 -0
  118. package/dist/components/ButtonGroup/index.js.map +1 -0
  119. package/dist/components/Calendar/index.js +3 -3
  120. package/dist/components/Card/index.js +2 -2
  121. package/dist/components/Checkbox/index.js +2 -2
  122. package/dist/components/Collapsible/index.cjs +512 -0
  123. package/dist/components/Collapsible/index.cjs.map +1 -0
  124. package/dist/components/Collapsible/index.d.cts +50 -0
  125. package/dist/components/Collapsible/index.d.ts +50 -0
  126. package/dist/components/Collapsible/index.js +7 -0
  127. package/dist/components/Collapsible/index.js.map +1 -0
  128. package/dist/components/Combobox/index.js +3 -3
  129. package/dist/components/ContextMenu/index.js +4 -4
  130. package/dist/components/DataTable/index.js +3 -3
  131. package/dist/components/DatePicker/index.js +5 -5
  132. package/dist/components/Dialog/index.js +2 -2
  133. package/dist/components/DropdownMenu/index.js +3 -3
  134. package/dist/components/Empty/index.cjs +385 -0
  135. package/dist/components/Empty/index.cjs.map +1 -0
  136. package/dist/components/Empty/index.d.cts +32 -0
  137. package/dist/components/Empty/index.d.ts +32 -0
  138. package/dist/components/Empty/index.js +7 -0
  139. package/dist/components/Empty/index.js.map +1 -0
  140. package/dist/components/FloatButton/index.js +3 -3
  141. package/dist/components/HStack/index.js +4 -4
  142. package/dist/components/InputGroup/index.js +2 -2
  143. package/dist/components/Item/index.cjs +443 -0
  144. package/dist/components/Item/index.cjs.map +1 -0
  145. package/dist/components/Item/index.d.cts +40 -0
  146. package/dist/components/Item/index.d.ts +40 -0
  147. package/dist/components/Item/index.js +7 -0
  148. package/dist/components/Item/index.js.map +1 -0
  149. package/dist/components/Kbd/index.cjs +396 -0
  150. package/dist/components/Kbd/index.cjs.map +1 -0
  151. package/dist/components/Kbd/index.d.cts +22 -0
  152. package/dist/components/Kbd/index.d.ts +22 -0
  153. package/dist/components/Kbd/index.js +7 -0
  154. package/dist/components/Kbd/index.js.map +1 -0
  155. package/dist/components/Pagination/index.js +4 -4
  156. package/dist/components/Popover/index.js +2 -2
  157. package/dist/components/Progress/index.js +2 -2
  158. package/dist/components/Radio/index.js +2 -2
  159. package/dist/components/SegmentedControl/index.js +2 -2
  160. package/dist/components/Select/index.js +2 -2
  161. package/dist/components/Separator/index.js +2 -2
  162. package/dist/components/Sheet/index.js +2 -2
  163. package/dist/components/Skeleton/index.js +2 -2
  164. package/dist/components/Slider/index.js +2 -2
  165. package/dist/components/Switch/index.js +2 -2
  166. package/dist/components/Table/index.js +2 -2
  167. package/dist/components/Tabs/index.js +2 -2
  168. package/dist/components/Text/index.js +2 -2
  169. package/dist/components/TextArea/index.js +3 -3
  170. package/dist/components/TextInput/index.js +2 -2
  171. package/dist/components/Toggle/index.js +2 -2
  172. package/dist/components/Tooltip/index.js +2 -2
  173. package/dist/components/VStack/index.js +4 -4
  174. package/dist/index.cjs +451 -2
  175. package/dist/index.cjs.map +1 -1
  176. package/dist/index.d.cts +6 -0
  177. package/dist/index.d.ts +6 -0
  178. package/dist/index.js +50 -44
  179. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ import { px } from './chunk-5A2QOOVN.js';
2
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { __name } from './chunk-WCQVDF3K.js';
5
+ import { View, Text } from 'react-native';
6
+ import { jsxs, jsx } from 'nativewind/jsx-runtime';
7
+
8
+ var Empty = /* @__PURE__ */ __name(({ icon, title, description, action, className, testID }) => {
9
+ const colors = useThemeColors();
10
+ const containerStyle = {
11
+ flexDirection: "column",
12
+ alignItems: "center",
13
+ justifyContent: "center",
14
+ gap: px(colors.spacing["3"]),
15
+ paddingVertical: px(colors.spacing["8"]),
16
+ paddingHorizontal: px(colors.spacing["4"])
17
+ };
18
+ return /* @__PURE__ */ jsxs(
19
+ View,
20
+ {
21
+ ...testID !== void 0 ? { testID } : {},
22
+ className: cn("flex-col items-center justify-center gap-3 py-8 px-4", className),
23
+ style: containerStyle,
24
+ children: [
25
+ icon != null ? /* @__PURE__ */ jsx(View, { style: { marginBottom: px(colors.spacing["1"]) }, children: icon }) : null,
26
+ /* @__PURE__ */ jsx(
27
+ Text,
28
+ {
29
+ style: {
30
+ color: colors.semantic.text.default,
31
+ fontFamily: colors.fontFamily.body,
32
+ fontSize: px(colors.fontSize.md),
33
+ fontWeight: colors.fontWeight.semibold,
34
+ textAlign: "center"
35
+ },
36
+ children: title
37
+ }
38
+ ),
39
+ description != null ? /* @__PURE__ */ jsx(
40
+ Text,
41
+ {
42
+ style: {
43
+ color: colors.semantic.text.muted,
44
+ fontFamily: colors.fontFamily.body,
45
+ fontSize: px(colors.fontSize.sm),
46
+ lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),
47
+ textAlign: "center"
48
+ },
49
+ children: description
50
+ }
51
+ ) : null,
52
+ action != null ? /* @__PURE__ */ jsx(View, { style: { marginTop: px(colors.spacing["1"]) }, children: action }) : null
53
+ ]
54
+ }
55
+ );
56
+ }, "Empty");
57
+
58
+ export { Empty };
59
+ //# sourceMappingURL=chunk-XQNVWHMN.js.map
60
+ //# sourceMappingURL=chunk-XQNVWHMN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Empty/Empty.tsx"],"names":["RNText"],"mappings":";;;;;;;AAoCO,IAAM,KAAA,2BAAS,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO,KAAkB;AAC1F,EAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC3B,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACvC,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GAC7C;AAEA,EAAA,uBACI,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC/E,KAAA,EAAO,cAAA;AAAA,MAEN,QAAA,EAAA;AAAA,QAAA,IAAA,IAAQ,IAAA,mBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAE,EAAI,gBAAK,CAAA,GAAU,IAAA;AAAA,wBAExF,GAAA;AAAA,UAACA,IAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO;AAAA,cACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAA;AAAA,cAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,cAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,cAC/B,UAAA,EAAY,OAAO,UAAA,CAAW,QAAA;AAAA,cAC9B,SAAA,EAAW;AAAA,aACf;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACL;AAAA,QAEC,eAAe,IAAA,mBACZ,GAAA;AAAA,UAACA,IAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO;AAAA,cACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA;AAAA,cAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,cAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,cAC/B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA;AAAA,cACpE,SAAA,EAAW;AAAA,aACf;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACL,GACA,IAAA;AAAA,QAEH,MAAA,IAAU,IAAA,mBAAO,GAAA,CAAC,IAAA,EAAA,EAAK,OAAO,EAAE,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,QAAQ,GAAG,CAAC,CAAA,EAAE,EAAI,kBAAO,CAAA,GAAU;AAAA;AAAA;AAAA,GAC7F;AAER,CAAA,EAjDqB,OAAA","file":"chunk-XQNVWHMN.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type EmptyProps = {\n /** Optional icon or illustration rendered above the title. */\n icon?: ReactNode;\n /** Required heading text. */\n title: string;\n /** Optional secondary description below the title. */\n description?: string;\n /** Optional action slot — typically a `<Button>`. */\n action?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Empty-state container for zero-results views, onboarding prompts, and error\n * placeholders. Renders a centered column: optional icon → title → optional\n * description → optional action.\n *\n * ```tsx\n * <Empty\n * icon={<MyIcon size={48} />}\n * title=\"No results found\"\n * description=\"Try adjusting your search or filters.\"\n * action={<Button onPress={onReset}>Clear filters</Button>}\n * />\n * ```\n */\nexport const Empty = ({ icon, title, description, action, className, testID }: EmptyProps) => {\n const colors = useThemeColors();\n\n const containerStyle: ViewStyle = {\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['8']),\n paddingHorizontal: px(colors.spacing['4']),\n };\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col items-center justify-center gap-3 py-8 px-4', className)}\n style={containerStyle}\n >\n {icon != null ? <View style={{ marginBottom: px(colors.spacing['1']) }}>{icon}</View> : null}\n\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n fontWeight: colors.fontWeight.semibold as '600',\n textAlign: 'center',\n }}\n >\n {title}\n </RNText>\n\n {description != null ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n textAlign: 'center',\n }}\n >\n {description}\n </RNText>\n ) : null}\n\n {action != null ? <View style={{ marginTop: px(colors.spacing['1']) }}>{action}</View> : null}\n </View>\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { px } from './chunk-5A2QOOVN.js';
2
- import { cn } from './chunk-CHXHRJNZ.js';
3
2
  import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { Text as Text$1 } from 'react-native';
6
6
  import { jsx } from 'nativewind/jsx-runtime';
@@ -72,5 +72,5 @@ var Text = /* @__PURE__ */ __name(({ variant = "body-md", className, testID, chi
72
72
  }, "Text");
73
73
 
74
74
  export { Text };
75
- //# sourceMappingURL=chunk-JZ774T7U.js.map
76
- //# sourceMappingURL=chunk-JZ774T7U.js.map
75
+ //# sourceMappingURL=chunk-ZGFXKYA5.js.map
76
+ //# sourceMappingURL=chunk-ZGFXKYA5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Text/Text.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-JZ774T7U.js","sourcesContent":["'use client';\n\nimport type { TextProps as RNTextProps, TextStyle } from 'react-native';\nimport { Text as RNText } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TextVariant = 'body-xs' | 'body-sm' | 'body-md' | 'body-lg' | 'heading-1' | 'heading-2' | 'heading-3';\n\nexport type TextProps = RNTextProps & {\n variant?: TextVariant;\n className?: string;\n testID?: string;\n};\n\nconst VARIANT_CLASSES: Record<TextVariant, string> = {\n 'body-xs': 'text-xs leading-normal',\n 'body-sm': 'text-sm leading-normal',\n 'body-md': 'text-md leading-normal',\n 'body-lg': 'text-lg leading-relaxed',\n 'heading-1': 'text-4xl leading-tight font-bold',\n 'heading-2': 'text-3xl leading-tight font-semibold',\n 'heading-3': 'text-2xl leading-tight font-semibold',\n};\n\nconst HEADING_VARIANTS: Readonly<Set<TextVariant>> = new Set(['heading-1', 'heading-2', 'heading-3']);\n\n// Per-variant resolution from the active theme. Keys here name the\n// fontSize / fontWeight / lineHeight tokens the variant pulls from. The\n// fontFamily is picked separately (display for headings, body otherwise).\ntype VariantKeys = {\n fontSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n fontWeight: 'regular' | 'medium' | 'semibold' | 'bold';\n lineHeight: 'tight' | 'normal' | 'relaxed';\n};\nconst VARIANT_KEYS: Record<TextVariant, VariantKeys> = {\n 'body-xs': { fontSize: 'xs', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-sm': { fontSize: 'sm', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-md': { fontSize: 'md', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-lg': { fontSize: 'lg', fontWeight: 'regular', lineHeight: 'relaxed' },\n 'heading-1': { fontSize: '4xl', fontWeight: 'bold', lineHeight: 'tight' },\n 'heading-2': {\n fontSize: '3xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n 'heading-3': {\n fontSize: '2xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n};\n\n/**\n * Typography primitive. Renders a react-native <Text>; on web via RN-Web\n * it becomes a <div role=\"...\"> with the appropriate className.\n *\n * Inline style is sourced from the active `<NoriProvider theme={...}>`:\n * font family (display for headings, body for body variants), fontSize,\n * fontWeight, lineHeight all flow through. Override the whole variant by\n * passing a custom theme; override a single instance by passing `style`.\n *\n * The `className` path keeps the Tailwind dark-mode color flip — inline\n * style provides the typographic substance, className provides the color.\n */\nexport const Text = ({ variant = 'body-md', className, testID, children, ...rest }: TextProps) => {\n const colors = useThemeColors();\n const isHeading = HEADING_VARIANTS.has(variant);\n const role = isHeading ? 'header' : rest.accessibilityRole;\n\n const keys = VARIANT_KEYS[variant];\n const sizePx = px(colors.fontSize[keys.fontSize]);\n const lhMultiplier = Number(colors.lineHeight[keys.lineHeight]);\n const themedStyle: TextStyle = {\n // Inline color is the ONLY color source. The Tailwind preset uses\n // `darkMode: ['class', '[data-theme=\"dark\"]']` — that requires a\n // DOM, so on native the `dark:` variant never fires and a\n // className-only color path would always emit the LIGHT variant\n // (near-black), invisible on a dark surface. Sourcing color from\n // `useThemeColors()` means it follows the OS scheme AND honors a\n // forced `colorScheme` override on the provider.\n color: colors.semantic.text.default,\n fontFamily: isHeading ? colors.fontFamily.display : colors.fontFamily.body,\n fontSize: sizePx,\n // RN expects lineHeight in px, not unitless. Tokens carry it as a\n // ratio (1.2 / 1.4 / 1.6) — multiply against the variant fontSize.\n lineHeight: sizePx * lhMultiplier,\n // The fontWeight token returns string literals like \"500\" / \"700\"\n // which match RN's TextStyle.fontWeight enum.\n fontWeight: colors.fontWeight[keys.fontWeight] as TextStyle['fontWeight'],\n };\n\n // Caller-provided style wins (last in the array). The themed style is\n // the source of truth, the user's `style` prop the override.\n const styleProp = (rest as { style?: TextStyle | TextStyle[] }).style;\n\n return (\n <RNText\n testID={testID}\n {...rest}\n {...(role !== undefined ? { accessibilityRole: role } : {})}\n className={cn(VARIANT_CLASSES[variant], className)}\n style={[themedStyle, styleProp]}\n >\n {children}\n </RNText>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Text/Text.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-ZGFXKYA5.js","sourcesContent":["'use client';\n\nimport type { TextProps as RNTextProps, TextStyle } from 'react-native';\nimport { Text as RNText } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TextVariant = 'body-xs' | 'body-sm' | 'body-md' | 'body-lg' | 'heading-1' | 'heading-2' | 'heading-3';\n\nexport type TextProps = RNTextProps & {\n variant?: TextVariant;\n className?: string;\n testID?: string;\n};\n\nconst VARIANT_CLASSES: Record<TextVariant, string> = {\n 'body-xs': 'text-xs leading-normal',\n 'body-sm': 'text-sm leading-normal',\n 'body-md': 'text-md leading-normal',\n 'body-lg': 'text-lg leading-relaxed',\n 'heading-1': 'text-4xl leading-tight font-bold',\n 'heading-2': 'text-3xl leading-tight font-semibold',\n 'heading-3': 'text-2xl leading-tight font-semibold',\n};\n\nconst HEADING_VARIANTS: Readonly<Set<TextVariant>> = new Set(['heading-1', 'heading-2', 'heading-3']);\n\n// Per-variant resolution from the active theme. Keys here name the\n// fontSize / fontWeight / lineHeight tokens the variant pulls from. The\n// fontFamily is picked separately (display for headings, body otherwise).\ntype VariantKeys = {\n fontSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n fontWeight: 'regular' | 'medium' | 'semibold' | 'bold';\n lineHeight: 'tight' | 'normal' | 'relaxed';\n};\nconst VARIANT_KEYS: Record<TextVariant, VariantKeys> = {\n 'body-xs': { fontSize: 'xs', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-sm': { fontSize: 'sm', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-md': { fontSize: 'md', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-lg': { fontSize: 'lg', fontWeight: 'regular', lineHeight: 'relaxed' },\n 'heading-1': { fontSize: '4xl', fontWeight: 'bold', lineHeight: 'tight' },\n 'heading-2': {\n fontSize: '3xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n 'heading-3': {\n fontSize: '2xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n};\n\n/**\n * Typography primitive. Renders a react-native <Text>; on web via RN-Web\n * it becomes a <div role=\"...\"> with the appropriate className.\n *\n * Inline style is sourced from the active `<NoriProvider theme={...}>`:\n * font family (display for headings, body for body variants), fontSize,\n * fontWeight, lineHeight all flow through. Override the whole variant by\n * passing a custom theme; override a single instance by passing `style`.\n *\n * The `className` path keeps the Tailwind dark-mode color flip — inline\n * style provides the typographic substance, className provides the color.\n */\nexport const Text = ({ variant = 'body-md', className, testID, children, ...rest }: TextProps) => {\n const colors = useThemeColors();\n const isHeading = HEADING_VARIANTS.has(variant);\n const role = isHeading ? 'header' : rest.accessibilityRole;\n\n const keys = VARIANT_KEYS[variant];\n const sizePx = px(colors.fontSize[keys.fontSize]);\n const lhMultiplier = Number(colors.lineHeight[keys.lineHeight]);\n const themedStyle: TextStyle = {\n // Inline color is the ONLY color source. The Tailwind preset uses\n // `darkMode: ['class', '[data-theme=\"dark\"]']` — that requires a\n // DOM, so on native the `dark:` variant never fires and a\n // className-only color path would always emit the LIGHT variant\n // (near-black), invisible on a dark surface. Sourcing color from\n // `useThemeColors()` means it follows the OS scheme AND honors a\n // forced `colorScheme` override on the provider.\n color: colors.semantic.text.default,\n fontFamily: isHeading ? colors.fontFamily.display : colors.fontFamily.body,\n fontSize: sizePx,\n // RN expects lineHeight in px, not unitless. Tokens carry it as a\n // ratio (1.2 / 1.4 / 1.6) — multiply against the variant fontSize.\n lineHeight: sizePx * lhMultiplier,\n // The fontWeight token returns string literals like \"500\" / \"700\"\n // which match RN's TextStyle.fontWeight enum.\n fontWeight: colors.fontWeight[keys.fontWeight] as TextStyle['fontWeight'],\n };\n\n // Caller-provided style wins (last in the array). The themed style is\n // the source of truth, the user's `style` prop the override.\n const styleProp = (rest as { style?: TextStyle | TextStyle[] }).style;\n\n return (\n <RNText\n testID={testID}\n {...rest}\n {...(role !== undefined ? { accessibilityRole: role } : {})}\n className={cn(VARIANT_CLASSES[variant], className)}\n style={[themedStyle, styleProp]}\n >\n {children}\n </RNText>\n );\n};\n"]}
package/dist/client.cjs CHANGED
@@ -1805,6 +1805,24 @@ var AlertDialog = Object.assign(AlertDialogRoot, {
1805
1805
  Action: AlertDialogAction,
1806
1806
  Cancel: AlertDialogCancel
1807
1807
  });
1808
+ var BASE_STYLE = {
1809
+ overflow: "hidden"
1810
+ };
1811
+ var AspectRatio = /* @__PURE__ */ __name(({ ratio, children, className, testID }) => {
1812
+ const containerStyle = {
1813
+ ...BASE_STYLE,
1814
+ aspectRatio: ratio
1815
+ };
1816
+ return /* @__PURE__ */ jsxRuntime.jsx(
1817
+ reactNative.View,
1818
+ {
1819
+ ...testID !== void 0 ? { testID } : {},
1820
+ className: cn("overflow-hidden", className),
1821
+ style: containerStyle,
1822
+ children
1823
+ }
1824
+ );
1825
+ }, "AspectRatio");
1808
1826
  var SIZE_PX = {
1809
1827
  sm: 32,
1810
1828
  md: 40,
@@ -3530,7 +3548,7 @@ var SIZE_KEYS = {
3530
3548
  md: { padX: "4", font: "md" },
3531
3549
  lg: { padX: "5", font: "lg" }
3532
3550
  };
3533
- var BASE_STYLE = {
3551
+ var BASE_STYLE2 = {
3534
3552
  flexDirection: "row",
3535
3553
  alignItems: "center",
3536
3554
  justifyContent: "center"
@@ -3621,7 +3639,7 @@ var Button = /* @__PURE__ */ __name(({
3621
3639
  };
3622
3640
  const sizeFontSize = px(colors.fontSize[sizeKeys.font]);
3623
3641
  const inlineBase = [
3624
- BASE_STYLE,
3642
+ BASE_STYLE2,
3625
3643
  { backgroundColor: stateBg },
3626
3644
  sizeContainer,
3627
3645
  { opacity: isInoperative ? 0.6 : stateInteractionOpacity }
@@ -3701,6 +3719,39 @@ var Button = /* @__PURE__ */ __name(({
3701
3719
  }
3702
3720
  );
3703
3721
  }, "Button");
3722
+ var ButtonGroup = /* @__PURE__ */ __name(({ children, orientation = "horizontal", size, className, testID }) => {
3723
+ const isHorizontal = orientation === "horizontal";
3724
+ const containerStyle = {
3725
+ flexDirection: isHorizontal ? "row" : "column",
3726
+ // gap: 0 so buttons touch; shared-border effect comes from CSS on web
3727
+ // and from touching edges on native.
3728
+ gap: 0,
3729
+ alignSelf: "flex-start",
3730
+ overflow: "hidden"
3731
+ };
3732
+ const childArray = React.Children.toArray(children).filter(React.isValidElement);
3733
+ const total = childArray.length;
3734
+ const clonedChildren = childArray.map((child, index) => {
3735
+ const position = index === 0 ? "first" : index === total - 1 ? "last" : "middle";
3736
+ const extraProps = {
3737
+ "data-position": position,
3738
+ "data-group-orientation": orientation
3739
+ };
3740
+ if (size !== void 0) {
3741
+ extraProps["data-group-size"] = size;
3742
+ }
3743
+ return React.cloneElement(child, extraProps);
3744
+ });
3745
+ return /* @__PURE__ */ jsxRuntime.jsx(
3746
+ reactNative.View,
3747
+ {
3748
+ ...testID !== void 0 ? { testID } : {},
3749
+ className: cn(isHorizontal ? "flex-row" : "flex-col", "self-start overflow-hidden", className),
3750
+ style: containerStyle,
3751
+ children: clonedChildren
3752
+ }
3753
+ );
3754
+ }, "ButtonGroup");
3704
3755
 
3705
3756
  // src/components/Calendar/scroll/ScrollBody.tsx
3706
3757
  var ScrollBody = /* @__PURE__ */ __name((_props) => {
@@ -6613,6 +6664,182 @@ var Checkbox = /* @__PURE__ */ __name(({
6613
6664
  }
6614
6665
  );
6615
6666
  }, "Checkbox");
6667
+ var CollapsibleContext = React.createContext(null);
6668
+ var useCollapsibleContext = /* @__PURE__ */ __name((label) => {
6669
+ const ctx = React.useContext(CollapsibleContext);
6670
+ if (!ctx) {
6671
+ throw new Error(`<${label}> must be rendered inside a <Collapsible>.`);
6672
+ }
6673
+ return ctx;
6674
+ }, "useCollapsibleContext");
6675
+ var CollapsibleRoot = /* @__PURE__ */ __name(({
6676
+ open: controlledOpen,
6677
+ defaultOpen = false,
6678
+ onOpenChange,
6679
+ children,
6680
+ className,
6681
+ testID
6682
+ }) => {
6683
+ const baseId = React.useId();
6684
+ const [innerOpen, setInnerOpen] = React.useState(defaultOpen);
6685
+ const isControlled = controlledOpen !== void 0;
6686
+ const open = isControlled ? controlledOpen : innerOpen;
6687
+ const toggle = React.useCallback(() => {
6688
+ const next = !open;
6689
+ if (!isControlled) {
6690
+ setInnerOpen(next);
6691
+ }
6692
+ onOpenChange?.(next);
6693
+ }, [open, isControlled, onOpenChange]);
6694
+ const ctx = React.useMemo(
6695
+ () => ({
6696
+ open,
6697
+ toggle,
6698
+ contentId: `${baseId}-content`,
6699
+ triggerId: `${baseId}-trigger`
6700
+ }),
6701
+ [open, toggle, baseId]
6702
+ );
6703
+ return /* @__PURE__ */ jsxRuntime.jsx(CollapsibleContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
6704
+ reactNative.View,
6705
+ {
6706
+ ...testID !== void 0 ? { testID } : {},
6707
+ className: cn("flex-col", className),
6708
+ style: { flexDirection: "column" },
6709
+ children
6710
+ }
6711
+ ) });
6712
+ }, "CollapsibleRoot");
6713
+ var CollapsibleTrigger = /* @__PURE__ */ __name(({ children, className, testID }) => {
6714
+ const { open, toggle, contentId, triggerId } = useCollapsibleContext("Collapsible.Trigger");
6715
+ const colors = useThemeColors();
6716
+ const triggerStyle = {
6717
+ flexDirection: "row",
6718
+ alignItems: "center",
6719
+ paddingVertical: px(colors.spacing["2"]),
6720
+ paddingHorizontal: px(colors.spacing["1"])
6721
+ };
6722
+ return /* @__PURE__ */ jsxRuntime.jsx(
6723
+ reactNative.Pressable,
6724
+ {
6725
+ id: triggerId,
6726
+ ...testID !== void 0 ? { testID } : {},
6727
+ role: "button",
6728
+ accessibilityRole: "button",
6729
+ "aria-expanded": open,
6730
+ "aria-controls": contentId,
6731
+ onPress: toggle,
6732
+ className: cn("flex-row items-center py-2 px-1", className),
6733
+ style: triggerStyle,
6734
+ children: typeof children === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
6735
+ reactNative.Text,
6736
+ {
6737
+ style: {
6738
+ color: colors.semantic.text.default,
6739
+ fontFamily: colors.fontFamily.body,
6740
+ fontSize: px(colors.fontSize.sm),
6741
+ fontWeight: colors.fontWeight.medium
6742
+ },
6743
+ children
6744
+ }
6745
+ ) : children
6746
+ }
6747
+ );
6748
+ }, "CollapsibleTrigger");
6749
+ var CollapsibleContent = /* @__PURE__ */ __name(({ children, className, testID }) => {
6750
+ const { open, contentId, triggerId } = useCollapsibleContext("Collapsible.Content");
6751
+ const wrapperRef = React.useRef(null);
6752
+ const innerRef = React.useRef(null);
6753
+ React.useEffect(() => {
6754
+ if (reactNative.Platform.OS !== "web") {
6755
+ return;
6756
+ }
6757
+ const wrapper = wrapperRef.current;
6758
+ const inner = innerRef.current;
6759
+ if (!wrapper || !inner) {
6760
+ return;
6761
+ }
6762
+ const isFirstPaint = wrapper.dataset.noriPainted !== "1";
6763
+ wrapper.dataset.noriPainted = "1";
6764
+ wrapper.style.overflow = "hidden";
6765
+ wrapper.style.transitionProperty = "max-height, opacity";
6766
+ wrapper.style.transitionDuration = "200ms";
6767
+ wrapper.style.transitionTimingFunction = "cubic-bezier(0.16, 1, 0.3, 1)";
6768
+ if (open) {
6769
+ const target = inner.scrollHeight;
6770
+ if (isFirstPaint) {
6771
+ wrapper.style.maxHeight = `${target}px`;
6772
+ wrapper.style.opacity = "1";
6773
+ return;
6774
+ }
6775
+ wrapper.style.maxHeight = "0px";
6776
+ wrapper.style.opacity = "0";
6777
+ void wrapper.offsetHeight;
6778
+ requestAnimationFrame(() => {
6779
+ wrapper.style.maxHeight = `${target}px`;
6780
+ wrapper.style.opacity = "1";
6781
+ });
6782
+ } else {
6783
+ if (isFirstPaint) {
6784
+ wrapper.style.maxHeight = "0px";
6785
+ wrapper.style.opacity = "0";
6786
+ return;
6787
+ }
6788
+ const current = inner.scrollHeight;
6789
+ wrapper.style.maxHeight = `${current}px`;
6790
+ wrapper.style.opacity = "1";
6791
+ void wrapper.offsetHeight;
6792
+ requestAnimationFrame(() => {
6793
+ wrapper.style.maxHeight = "0px";
6794
+ wrapper.style.opacity = "0";
6795
+ });
6796
+ }
6797
+ }, [open]);
6798
+ if (reactNative.Platform.OS !== "web") {
6799
+ if (!open) {
6800
+ return null;
6801
+ }
6802
+ return /* @__PURE__ */ jsxRuntime.jsx(
6803
+ reactNative.View,
6804
+ {
6805
+ ...testID !== void 0 ? { testID } : {},
6806
+ id: contentId,
6807
+ "aria-labelledby": triggerId,
6808
+ className: cn("flex-col", className),
6809
+ style: { flexDirection: "column" },
6810
+ children
6811
+ }
6812
+ );
6813
+ }
6814
+ return /* @__PURE__ */ jsxRuntime.jsx(
6815
+ reactNative.View,
6816
+ {
6817
+ ref: (node) => {
6818
+ wrapperRef.current = node;
6819
+ },
6820
+ ...testID !== void 0 ? { testID } : {},
6821
+ id: contentId,
6822
+ "aria-labelledby": triggerId,
6823
+ "aria-hidden": !open,
6824
+ className: cn("overflow-hidden", className),
6825
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6826
+ reactNative.View,
6827
+ {
6828
+ ref: (node) => {
6829
+ innerRef.current = node;
6830
+ },
6831
+ className: "flex-col",
6832
+ style: { flexDirection: "column" },
6833
+ children
6834
+ }
6835
+ )
6836
+ }
6837
+ );
6838
+ }, "CollapsibleContent");
6839
+ var Collapsible = Object.assign(CollapsibleRoot, {
6840
+ Trigger: CollapsibleTrigger,
6841
+ Content: CollapsibleContent
6842
+ });
6616
6843
  var Combobox = /* @__PURE__ */ __name((props) => {
6617
6844
  return /* @__PURE__ */ jsxRuntime.jsx(Select, { searchable: true, ...props });
6618
6845
  }, "Combobox");
@@ -8211,6 +8438,55 @@ var Dialog = Object.assign(DialogRoot, {
8211
8438
  Footer: DialogFooter,
8212
8439
  Close: DialogClose
8213
8440
  });
8441
+ var Empty = /* @__PURE__ */ __name(({ icon, title, description, action, className, testID }) => {
8442
+ const colors = useThemeColors();
8443
+ const containerStyle = {
8444
+ flexDirection: "column",
8445
+ alignItems: "center",
8446
+ justifyContent: "center",
8447
+ gap: px(colors.spacing["3"]),
8448
+ paddingVertical: px(colors.spacing["8"]),
8449
+ paddingHorizontal: px(colors.spacing["4"])
8450
+ };
8451
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8452
+ reactNative.View,
8453
+ {
8454
+ ...testID !== void 0 ? { testID } : {},
8455
+ className: cn("flex-col items-center justify-center gap-3 py-8 px-4", className),
8456
+ style: containerStyle,
8457
+ children: [
8458
+ icon != null ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { marginBottom: px(colors.spacing["1"]) }, children: icon }) : null,
8459
+ /* @__PURE__ */ jsxRuntime.jsx(
8460
+ reactNative.Text,
8461
+ {
8462
+ style: {
8463
+ color: colors.semantic.text.default,
8464
+ fontFamily: colors.fontFamily.body,
8465
+ fontSize: px(colors.fontSize.md),
8466
+ fontWeight: colors.fontWeight.semibold,
8467
+ textAlign: "center"
8468
+ },
8469
+ children: title
8470
+ }
8471
+ ),
8472
+ description != null ? /* @__PURE__ */ jsxRuntime.jsx(
8473
+ reactNative.Text,
8474
+ {
8475
+ style: {
8476
+ color: colors.semantic.text.muted,
8477
+ fontFamily: colors.fontFamily.body,
8478
+ fontSize: px(colors.fontSize.sm),
8479
+ lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),
8480
+ textAlign: "center"
8481
+ },
8482
+ children: description
8483
+ }
8484
+ ) : null,
8485
+ action != null ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { marginTop: px(colors.spacing["1"]) }, children: action }) : null
8486
+ ]
8487
+ }
8488
+ );
8489
+ }, "Empty");
8214
8490
  var FieldContext = React.createContext(null);
8215
8491
  var useFieldContextStrict = /* @__PURE__ */ __name((caller) => {
8216
8492
  const ctx = React.useContext(FieldContext);
@@ -9494,6 +9770,173 @@ var InputGroup = Object.assign(InputGroupRoot, {
9494
9770
  Addon: InputGroupAddon,
9495
9771
  Input: InputGroupInput
9496
9772
  });
9773
+ var Item = /* @__PURE__ */ __name(({
9774
+ leading,
9775
+ title,
9776
+ description,
9777
+ trailing,
9778
+ chevron = false,
9779
+ onPress,
9780
+ disabled = false,
9781
+ className,
9782
+ testID
9783
+ }) => {
9784
+ const colors = useThemeColors();
9785
+ const isTappable = onPress !== void 0;
9786
+ const rowStyle = {
9787
+ flexDirection: "row",
9788
+ alignItems: "center",
9789
+ gap: px(colors.spacing["3"]),
9790
+ paddingVertical: px(colors.spacing["3"]),
9791
+ paddingHorizontal: px(colors.spacing["4"]),
9792
+ minHeight: 52,
9793
+ opacity: disabled ? 0.5 : 1
9794
+ };
9795
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
9796
+ leading != null ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { flexShrink: 0 }, children: leading }) : null,
9797
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: { flex: 1, flexDirection: "column", gap: 2 }, children: [
9798
+ typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
9799
+ reactNative.Text,
9800
+ {
9801
+ style: {
9802
+ color: colors.semantic.text.default,
9803
+ fontFamily: colors.fontFamily.body,
9804
+ fontSize: px(colors.fontSize.sm),
9805
+ fontWeight: colors.fontWeight.medium
9806
+ },
9807
+ numberOfLines: 1,
9808
+ children: title
9809
+ }
9810
+ ) : title,
9811
+ description != null ? typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
9812
+ reactNative.Text,
9813
+ {
9814
+ style: {
9815
+ color: colors.semantic.text.muted,
9816
+ fontFamily: colors.fontFamily.body,
9817
+ fontSize: px(colors.fontSize.xs)
9818
+ },
9819
+ numberOfLines: 1,
9820
+ children: description
9821
+ }
9822
+ ) : description : null
9823
+ ] }),
9824
+ trailing != null ? /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: { flexShrink: 0 }, children: trailing }) : null,
9825
+ chevron ? /* @__PURE__ */ jsxRuntime.jsx(
9826
+ reactNative.View,
9827
+ {
9828
+ style: { flexShrink: 0 },
9829
+ "aria-hidden": true,
9830
+ testID: testID != null ? `${testID}-chevron` : void 0,
9831
+ children: /* @__PURE__ */ jsxRuntime.jsx(
9832
+ reactNative.Text,
9833
+ {
9834
+ accessibilityElementsHidden: true,
9835
+ importantForAccessibility: "no-hide-descendants",
9836
+ style: {
9837
+ fontSize: 14,
9838
+ lineHeight: 16,
9839
+ color: colors.semantic.text.muted,
9840
+ // On web rn-web passes style through — transform
9841
+ // with a rotate is the lightest-weight approach
9842
+ // that avoids importing the full SVG icon set.
9843
+ transform: [{ rotate: "-90deg" }]
9844
+ },
9845
+ children: "\u2304"
9846
+ }
9847
+ )
9848
+ }
9849
+ ) : null
9850
+ ] });
9851
+ if (isTappable) {
9852
+ return /* @__PURE__ */ jsxRuntime.jsx(
9853
+ reactNative.Pressable,
9854
+ {
9855
+ ...testID !== void 0 ? { testID } : {},
9856
+ role: "button",
9857
+ accessibilityRole: "button",
9858
+ disabled,
9859
+ onPress: disabled ? void 0 : onPress,
9860
+ className: cn(
9861
+ "flex-row items-center",
9862
+ disabled ? "opacity-50" : "hover:bg-semantic-background-subtle active:bg-semantic-border-default",
9863
+ className
9864
+ ),
9865
+ style: rowStyle,
9866
+ children: content
9867
+ }
9868
+ );
9869
+ }
9870
+ return /* @__PURE__ */ jsxRuntime.jsx(
9871
+ reactNative.View,
9872
+ {
9873
+ ...testID !== void 0 ? { testID } : {},
9874
+ className: cn("flex-row items-center", className),
9875
+ style: rowStyle,
9876
+ children: content
9877
+ }
9878
+ );
9879
+ }, "Item");
9880
+ var Kbd = /* @__PURE__ */ __name(({ children, className }) => {
9881
+ const colors = useThemeColors();
9882
+ const isDark = useColorScheme() === "dark";
9883
+ const bgColor = isDark ? colors.color.neutral["800"] : colors.color.neutral["100"];
9884
+ const borderColor = isDark ? colors.color.neutral["600"] : colors.color.neutral["300"];
9885
+ const textColor = isDark ? colors.color.neutral["200"] : colors.color.neutral["700"];
9886
+ const containerStyle = {
9887
+ display: "flex",
9888
+ flexDirection: "row",
9889
+ alignItems: "center",
9890
+ justifyContent: "center",
9891
+ alignSelf: "center",
9892
+ backgroundColor: bgColor,
9893
+ borderWidth: 1,
9894
+ borderColor,
9895
+ borderRadius: px(colors.radius.sm),
9896
+ paddingHorizontal: px(colors.spacing["1"]),
9897
+ paddingVertical: 2,
9898
+ // Subtle bottom shadow gives the classic key look.
9899
+ ...reactNative.Platform.OS === "web" ? {
9900
+ boxShadow: `0 1px 0 ${borderColor}`,
9901
+ display: "inline-flex"
9902
+ } : {}
9903
+ };
9904
+ const textStyle = {
9905
+ color: textColor,
9906
+ // Monospace font for key labels.
9907
+ fontFamily: colors.fontFamily.mono ?? "monospace",
9908
+ fontSize: px(colors.fontSize.xs),
9909
+ fontWeight: colors.fontWeight.medium,
9910
+ lineHeight: px(colors.fontSize.xs) * Number(colors.lineHeight.normal)
9911
+ };
9912
+ const extraWebProps = reactNative.Platform.OS === "web" ? {
9913
+ // rn-web: 'none' skips the role attribute so the outer
9914
+ // View is just a plain <div>; we rely on the inner
9915
+ // <span> with data-kbd for semantic annotation.
9916
+ accessibilityRole: "none"
9917
+ } : {};
9918
+ return /* @__PURE__ */ jsxRuntime.jsx(
9919
+ reactNative.View,
9920
+ {
9921
+ ...extraWebProps,
9922
+ className: cn(
9923
+ "inline-flex flex-row items-center rounded-sm border px-1 py-0.5",
9924
+ isDark ? "bg-neutral-800 border-neutral-600 text-neutral-200" : "bg-neutral-100 border-neutral-300 text-neutral-700",
9925
+ className
9926
+ ),
9927
+ style: containerStyle,
9928
+ children: /* @__PURE__ */ jsxRuntime.jsx(
9929
+ reactNative.Text,
9930
+ {
9931
+ ...reactNative.Platform.OS === "web" ? { "data-kbd": "" } : {},
9932
+ accessibilityRole: "none",
9933
+ style: textStyle,
9934
+ children
9935
+ }
9936
+ )
9937
+ }
9938
+ );
9939
+ }, "Kbd");
9497
9940
  var Label = /* @__PURE__ */ __name(({ htmlFor, required = false, disabled = false, children, className, testID }) => {
9498
9941
  const colors = useThemeColors();
9499
9942
  const { t } = useTranslation();
@@ -13783,14 +14226,17 @@ __name(NoriProvider, "NoriProvider");
13783
14226
  exports.Accordion = Accordion;
13784
14227
  exports.Alert = Alert;
13785
14228
  exports.AlertDialog = AlertDialog;
14229
+ exports.AspectRatio = AspectRatio;
13786
14230
  exports.Avatar = Avatar;
13787
14231
  exports.Badge = Badge;
13788
14232
  exports.Box = Box;
13789
14233
  exports.Breadcrumb = Breadcrumb;
13790
14234
  exports.Button = Button;
14235
+ exports.ButtonGroup = ButtonGroup;
13791
14236
  exports.Calendar = Calendar;
13792
14237
  exports.Card = Card;
13793
14238
  exports.Checkbox = Checkbox;
14239
+ exports.Collapsible = Collapsible;
13794
14240
  exports.Combobox = Combobox;
13795
14241
  exports.ContextMenu = ContextMenu;
13796
14242
  exports.DataTable = DataTable;
@@ -13798,12 +14244,15 @@ exports.DatePicker = DatePicker;
13798
14244
  exports.Dialog = Dialog;
13799
14245
  exports.Drawer = Drawer;
13800
14246
  exports.DropdownMenu = DropdownMenu;
14247
+ exports.Empty = Empty;
13801
14248
  exports.Field = Field;
13802
14249
  exports.FloatButton = FloatButton;
13803
14250
  exports.HStack = HStack;
13804
14251
  exports.I18nProvider = I18nProvider;
13805
14252
  exports.Icon = Icon;
13806
14253
  exports.InputGroup = InputGroup;
14254
+ exports.Item = Item;
14255
+ exports.Kbd = Kbd;
13807
14256
  exports.Label = Label;
13808
14257
  exports.LocaleProvider = LocaleProvider;
13809
14258
  exports.MenuContent = MenuContent;