@nori-ui/core 0.0.1
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.
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/chunk-6NDARMPP.js +389 -0
- package/dist/chunk-6NDARMPP.js.map +1 -0
- package/dist/chunk-7QVYU63E.js +6 -0
- package/dist/chunk-7QVYU63E.js.map +1 -0
- package/dist/chunk-BRCCWMGJ.js +3 -0
- package/dist/chunk-BRCCWMGJ.js.map +1 -0
- package/dist/chunk-FXKIWONG.js +80 -0
- package/dist/chunk-FXKIWONG.js.map +1 -0
- package/dist/chunk-JGH6Z5LM.js +213 -0
- package/dist/chunk-JGH6Z5LM.js.map +1 -0
- package/dist/chunk-NDEDMCHT.js +40 -0
- package/dist/chunk-NDEDMCHT.js.map +1 -0
- package/dist/chunk-RX7UULY3.js +19 -0
- package/dist/chunk-RX7UULY3.js.map +1 -0
- package/dist/chunk-SSTXLK5I.js +66 -0
- package/dist/chunk-SSTXLK5I.js.map +1 -0
- package/dist/chunk-XGM2K4TT.js +31 -0
- package/dist/chunk-XGM2K4TT.js.map +1 -0
- package/dist/client.cjs +861 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +157 -0
- package/dist/client.d.ts +157 -0
- package/dist/client.js +50 -0
- package/dist/client.js.map +1 -0
- package/dist/i18n/index.cjs +70 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/index.d.cts +60 -0
- package/dist/i18n/index.d.ts +60 -0
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/icons/index.cjs +56 -0
- package/dist/icons/index.cjs.map +1 -0
- package/dist/icons/index.d.cts +38 -0
- package/dist/icons/index.d.ts +38 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.cjs +820 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +187 -0
- package/dist/index.d.ts +187 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/slot/index.cjs +85 -0
- package/dist/slot/index.cjs.map +1 -0
- package/dist/slot/index.d.cts +13 -0
- package/dist/slot/index.d.ts +13 -0
- package/dist/slot/index.js +4 -0
- package/dist/slot/index.js.map +1 -0
- package/dist/stories/story-registry.cjs +612 -0
- package/dist/stories/story-registry.cjs.map +1 -0
- package/dist/stories/story-registry.d.cts +13 -0
- package/dist/stories/story-registry.d.ts +13 -0
- package/dist/stories/story-registry.js +105 -0
- package/dist/stories/story-registry.js.map +1 -0
- package/dist/theme/index.cjs +216 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/index.d.cts +1 -0
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.js +4 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/utils/cn.cjs +34 -0
- package/dist/utils/cn.cjs.map +1 -0
- package/dist/utils/cn.d.cts +4 -0
- package/dist/utils/cn.d.ts +4 -0
- package/dist/utils/cn.js +4 -0
- package/dist/utils/cn.js.map +1 -0
- package/package.json +122 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Manuel Bieh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @nori-ui/core
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/nori-ui/nori-ui/main/nori-ui.png" alt="nori-ui" width="180" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
A React Native + React Native Web component library. Ships ESM, CJS, and `.d.ts`
|
|
8
|
+
via `tsup`; RSC-safe default entry with a `./client` subpath for stateful
|
|
9
|
+
providers and hooks.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
yarn add @nori-ui/core
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Peer deps: `react@^19`, `react-dom@^19` (optional, web), `react-native@^0.83`
|
|
18
|
+
(optional, native), `nativewind@^4`, `react-native-css-interop`.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Server Components / RSC-safe entry:
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Button, Text, cn } from '@nori-ui/core';
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Client components / providers / hooks:
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
'use client';
|
|
32
|
+
import { NoriProvider, useTheme, useTranslation } from '@nori-ui/core/client';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Links
|
|
36
|
+
|
|
37
|
+
- Source: https://github.com/nori-ui/nori-ui
|
|
38
|
+
- Docs: https://github.com/nori-ui/nori-ui#readme
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
MIT.
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { defaultSemanticIcons } from './chunk-NDEDMCHT.js';
|
|
2
|
+
import { Slot } from './chunk-FXKIWONG.js';
|
|
3
|
+
import { cn } from './chunk-XGM2K4TT.js';
|
|
4
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
5
|
+
import { Pressable, Text as Text$1, View, ActivityIndicator, TextInput as TextInput$1 } from 'react-native';
|
|
6
|
+
import { jsx, jsxs } from 'nativewind/jsx-runtime';
|
|
7
|
+
import { forwardRef, createContext, useContext, useState, useCallback, useId } from 'react';
|
|
8
|
+
|
|
9
|
+
function Box({ className, children, ...rest }) {
|
|
10
|
+
return /* @__PURE__ */ jsx(View, { ...rest, className: cn(className), children });
|
|
11
|
+
}
|
|
12
|
+
__name(Box, "Box");
|
|
13
|
+
var SIZE_MAP = {
|
|
14
|
+
sm: 12,
|
|
15
|
+
md: 16,
|
|
16
|
+
lg: 24,
|
|
17
|
+
xl: 32
|
|
18
|
+
};
|
|
19
|
+
function Spinner({ label = "Loading", size = "md", testID, color, style, ...rest }) {
|
|
20
|
+
const px = typeof size === "number" ? size : SIZE_MAP[size];
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
ActivityIndicator,
|
|
23
|
+
{
|
|
24
|
+
...rest,
|
|
25
|
+
...testID !== void 0 ? { testID } : {},
|
|
26
|
+
accessibilityRole: "progressbar",
|
|
27
|
+
accessibilityLabel: label,
|
|
28
|
+
...color !== void 0 ? { color } : {},
|
|
29
|
+
size: px,
|
|
30
|
+
style: [{ width: px, height: px }, style]
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
__name(Spinner, "Spinner");
|
|
35
|
+
var VARIANT_CLASSES = {
|
|
36
|
+
primary: "bg-semantic-interactive-primary hover:bg-semantic-interactive-primaryHover active:bg-semantic-interactive-primaryPressed",
|
|
37
|
+
secondary: "bg-neutral-100 hover:bg-neutral-200 active:bg-neutral-300",
|
|
38
|
+
ghost: "bg-transparent hover:bg-neutral-100 active:bg-neutral-200",
|
|
39
|
+
destructive: "bg-semantic-interactive-destructive hover:opacity-90 active:opacity-80"
|
|
40
|
+
};
|
|
41
|
+
var SIZE_CLASSES = {
|
|
42
|
+
sm: "h-8 px-3 text-sm",
|
|
43
|
+
md: "h-10 px-4 text-md",
|
|
44
|
+
lg: "h-12 px-5 text-lg"
|
|
45
|
+
};
|
|
46
|
+
var ICON_SIZE = { sm: 14, md: 16, lg: 20 };
|
|
47
|
+
var BASE_CLASSES = "inline-flex flex-row items-center justify-center gap-2 rounded-md select-none";
|
|
48
|
+
var Button = forwardRef(/* @__PURE__ */ __name(function Button2({
|
|
49
|
+
children,
|
|
50
|
+
variant = "primary",
|
|
51
|
+
size = "md",
|
|
52
|
+
disabled,
|
|
53
|
+
loading,
|
|
54
|
+
leadingIcon: LeadingIcon,
|
|
55
|
+
trailingIcon: TrailingIcon,
|
|
56
|
+
asChild,
|
|
57
|
+
className,
|
|
58
|
+
onPress,
|
|
59
|
+
testID,
|
|
60
|
+
...rest
|
|
61
|
+
}, forwardedRef) {
|
|
62
|
+
const isInoperative = Boolean(disabled) || Boolean(loading);
|
|
63
|
+
const classes = cn(
|
|
64
|
+
BASE_CLASSES,
|
|
65
|
+
VARIANT_CLASSES[variant],
|
|
66
|
+
SIZE_CLASSES[size],
|
|
67
|
+
isInoperative ? "opacity-60" : void 0,
|
|
68
|
+
className
|
|
69
|
+
);
|
|
70
|
+
const handlePress = /* @__PURE__ */ __name((ev) => {
|
|
71
|
+
if (isInoperative) return;
|
|
72
|
+
onPress?.(ev);
|
|
73
|
+
}, "handlePress");
|
|
74
|
+
if (asChild) {
|
|
75
|
+
const slotProps = {
|
|
76
|
+
ref: forwardedRef,
|
|
77
|
+
className: classes,
|
|
78
|
+
onClick: handlePress,
|
|
79
|
+
...rest
|
|
80
|
+
};
|
|
81
|
+
if (isInoperative) slotProps["aria-disabled"] = true;
|
|
82
|
+
if (loading) slotProps["aria-busy"] = true;
|
|
83
|
+
if (testID !== void 0) slotProps["data-testid"] = testID;
|
|
84
|
+
return /* @__PURE__ */ jsx(Slot, { ...slotProps, children });
|
|
85
|
+
}
|
|
86
|
+
const pressableExtra = {};
|
|
87
|
+
if (isInoperative) pressableExtra["aria-disabled"] = true;
|
|
88
|
+
if (loading) pressableExtra["aria-busy"] = true;
|
|
89
|
+
return /* @__PURE__ */ jsxs(
|
|
90
|
+
Pressable,
|
|
91
|
+
{
|
|
92
|
+
ref: forwardedRef,
|
|
93
|
+
...testID !== void 0 ? { testID } : {},
|
|
94
|
+
role: "button",
|
|
95
|
+
accessibilityRole: "button",
|
|
96
|
+
accessibilityState: { disabled: isInoperative, busy: Boolean(loading) },
|
|
97
|
+
disabled: isInoperative,
|
|
98
|
+
onPress: handlePress,
|
|
99
|
+
className: classes,
|
|
100
|
+
...pressableExtra,
|
|
101
|
+
...rest,
|
|
102
|
+
children: [
|
|
103
|
+
loading ? /* @__PURE__ */ jsx(Spinner, { size: ICON_SIZE[size], label: "Loading" }) : LeadingIcon ? /* @__PURE__ */ jsx(LeadingIcon, { size: ICON_SIZE[size] }) : null,
|
|
104
|
+
/* @__PURE__ */ jsx(Text$1, { className: cn("font-medium", SIZE_CLASSES[size].includes("text-") ? void 0 : "text-md"), children }),
|
|
105
|
+
TrailingIcon ? /* @__PURE__ */ jsx(TrailingIcon, { size: ICON_SIZE[size] }) : null
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}, "Button"));
|
|
110
|
+
Button.displayName = "Button";
|
|
111
|
+
var SemanticIconsContext = createContext(defaultSemanticIcons);
|
|
112
|
+
SemanticIconsContext.displayName = "SemanticIconsContext";
|
|
113
|
+
function SemanticIconsProvider({ icons, children }) {
|
|
114
|
+
const merged = icons ? { ...defaultSemanticIcons, ...icons } : defaultSemanticIcons;
|
|
115
|
+
return /* @__PURE__ */ jsx(SemanticIconsContext.Provider, { value: merged, children });
|
|
116
|
+
}
|
|
117
|
+
__name(SemanticIconsProvider, "SemanticIconsProvider");
|
|
118
|
+
function useSemanticIcon(name) {
|
|
119
|
+
const icons = useContext(SemanticIconsContext);
|
|
120
|
+
return icons[name];
|
|
121
|
+
}
|
|
122
|
+
__name(useSemanticIcon, "useSemanticIcon");
|
|
123
|
+
function Checkbox({
|
|
124
|
+
checked,
|
|
125
|
+
defaultChecked = false,
|
|
126
|
+
indeterminate,
|
|
127
|
+
disabled,
|
|
128
|
+
onChange,
|
|
129
|
+
label,
|
|
130
|
+
className,
|
|
131
|
+
testID,
|
|
132
|
+
asChild,
|
|
133
|
+
children
|
|
134
|
+
}) {
|
|
135
|
+
const [inner, setInner] = useState(defaultChecked);
|
|
136
|
+
const isControlled = checked !== void 0;
|
|
137
|
+
const value = isControlled ? Boolean(checked) : inner;
|
|
138
|
+
const ariaChecked = indeterminate ? "mixed" : value ? "true" : "false";
|
|
139
|
+
const toggle = useCallback(() => {
|
|
140
|
+
if (disabled) return;
|
|
141
|
+
const next = !value;
|
|
142
|
+
if (!isControlled) setInner(next);
|
|
143
|
+
onChange?.(next);
|
|
144
|
+
}, [disabled, value, isControlled, onChange]);
|
|
145
|
+
const Check = useSemanticIcon("checkmark");
|
|
146
|
+
const commonProps = {
|
|
147
|
+
role: "checkbox",
|
|
148
|
+
"aria-checked": ariaChecked,
|
|
149
|
+
accessibilityRole: "checkbox",
|
|
150
|
+
accessibilityState: { checked: value, disabled: Boolean(disabled) },
|
|
151
|
+
testID
|
|
152
|
+
};
|
|
153
|
+
if (disabled) commonProps["aria-disabled"] = true;
|
|
154
|
+
if (label !== void 0) {
|
|
155
|
+
commonProps["aria-label"] = label;
|
|
156
|
+
commonProps.accessibilityLabel = label;
|
|
157
|
+
}
|
|
158
|
+
if (asChild) {
|
|
159
|
+
const slotProps = {
|
|
160
|
+
role: "checkbox",
|
|
161
|
+
"aria-checked": ariaChecked,
|
|
162
|
+
onClick: toggle
|
|
163
|
+
};
|
|
164
|
+
if (disabled) slotProps["aria-disabled"] = true;
|
|
165
|
+
if (label !== void 0) slotProps["aria-label"] = label;
|
|
166
|
+
if (testID !== void 0) slotProps["data-testid"] = testID;
|
|
167
|
+
if (className !== void 0) slotProps.className = className;
|
|
168
|
+
return /* @__PURE__ */ jsx(Slot, { ...slotProps, children });
|
|
169
|
+
}
|
|
170
|
+
const boxClasses = cn("w-5 h-5 rounded-sm border border-semantic-border-strong items-center justify-center");
|
|
171
|
+
return /* @__PURE__ */ jsxs(View, { className: cn("flex-row items-center gap-2", disabled ? "opacity-60" : void 0, className), children: [
|
|
172
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: toggle, ...commonProps, className: boxClasses, children: (value || indeterminate) && !disabled ? /* @__PURE__ */ jsx(Check, { size: 14, color: "currentColor" }) : null }),
|
|
173
|
+
children ?? (label !== void 0 ? /* @__PURE__ */ jsx(View, { children: label }) : null)
|
|
174
|
+
] });
|
|
175
|
+
}
|
|
176
|
+
__name(Checkbox, "Checkbox");
|
|
177
|
+
var ALIGN_CLASS = {
|
|
178
|
+
start: "items-start",
|
|
179
|
+
center: "items-center",
|
|
180
|
+
end: "items-end",
|
|
181
|
+
stretch: "items-stretch",
|
|
182
|
+
baseline: "items-baseline"
|
|
183
|
+
};
|
|
184
|
+
var JUSTIFY_CLASS = {
|
|
185
|
+
start: "justify-start",
|
|
186
|
+
center: "justify-center",
|
|
187
|
+
end: "justify-end",
|
|
188
|
+
between: "justify-between",
|
|
189
|
+
around: "justify-around",
|
|
190
|
+
evenly: "justify-evenly"
|
|
191
|
+
};
|
|
192
|
+
function HStack({ gap, align, justify, className, children, ...rest }) {
|
|
193
|
+
return /* @__PURE__ */ jsx(
|
|
194
|
+
View,
|
|
195
|
+
{
|
|
196
|
+
...rest,
|
|
197
|
+
className: cn(
|
|
198
|
+
"flex-row",
|
|
199
|
+
gap !== void 0 && gap !== 0 ? `gap-${gap}` : void 0,
|
|
200
|
+
align !== void 0 ? ALIGN_CLASS[align] : void 0,
|
|
201
|
+
justify !== void 0 ? JUSTIFY_CLASS[justify] : void 0,
|
|
202
|
+
className
|
|
203
|
+
),
|
|
204
|
+
children
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
__name(HStack, "HStack");
|
|
209
|
+
function Switch({
|
|
210
|
+
checked,
|
|
211
|
+
defaultChecked = false,
|
|
212
|
+
disabled,
|
|
213
|
+
onChange,
|
|
214
|
+
label,
|
|
215
|
+
className,
|
|
216
|
+
testID,
|
|
217
|
+
asChild,
|
|
218
|
+
children
|
|
219
|
+
}) {
|
|
220
|
+
const [inner, setInner] = useState(defaultChecked);
|
|
221
|
+
const isControlled = checked !== void 0;
|
|
222
|
+
const value = isControlled ? Boolean(checked) : inner;
|
|
223
|
+
const toggle = useCallback(() => {
|
|
224
|
+
if (disabled) return;
|
|
225
|
+
const next = !value;
|
|
226
|
+
if (!isControlled) setInner(next);
|
|
227
|
+
onChange?.(next);
|
|
228
|
+
}, [disabled, value, isControlled, onChange]);
|
|
229
|
+
const ariaChecked = value ? "true" : "false";
|
|
230
|
+
const commonProps = {
|
|
231
|
+
role: "switch",
|
|
232
|
+
"aria-checked": ariaChecked,
|
|
233
|
+
accessibilityRole: "switch",
|
|
234
|
+
accessibilityState: { checked: value, disabled: Boolean(disabled) },
|
|
235
|
+
testID
|
|
236
|
+
};
|
|
237
|
+
if (disabled) commonProps["aria-disabled"] = true;
|
|
238
|
+
if (label !== void 0) {
|
|
239
|
+
commonProps["aria-label"] = label;
|
|
240
|
+
commonProps.accessibilityLabel = label;
|
|
241
|
+
}
|
|
242
|
+
if (asChild) {
|
|
243
|
+
const slotProps = {
|
|
244
|
+
role: "switch",
|
|
245
|
+
"aria-checked": ariaChecked,
|
|
246
|
+
onClick: toggle
|
|
247
|
+
};
|
|
248
|
+
if (disabled) slotProps["aria-disabled"] = true;
|
|
249
|
+
if (label !== void 0) slotProps["aria-label"] = label;
|
|
250
|
+
if (testID !== void 0) slotProps["data-testid"] = testID;
|
|
251
|
+
if (className !== void 0) slotProps.className = className;
|
|
252
|
+
return /* @__PURE__ */ jsx(Slot, { ...slotProps, children });
|
|
253
|
+
}
|
|
254
|
+
const trackClasses = cn(
|
|
255
|
+
"w-10 h-6 rounded-full justify-center px-0.5 transition-colors",
|
|
256
|
+
value ? "bg-semantic-interactive-primary" : "bg-neutral-300",
|
|
257
|
+
disabled ? "opacity-60" : void 0
|
|
258
|
+
);
|
|
259
|
+
const thumbClasses = cn("w-5 h-5 rounded-full bg-white shadow-sm", value ? "self-end" : "self-start");
|
|
260
|
+
return /* @__PURE__ */ jsxs(View, { className: cn("flex-row items-center gap-2", className), children: [
|
|
261
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: toggle, ...commonProps, className: trackClasses, children: /* @__PURE__ */ jsx(View, { className: thumbClasses }) }),
|
|
262
|
+
label ? /* @__PURE__ */ jsx(Text$1, { className: "text-md text-semantic-text-default", children: label }) : null,
|
|
263
|
+
children
|
|
264
|
+
] });
|
|
265
|
+
}
|
|
266
|
+
__name(Switch, "Switch");
|
|
267
|
+
var VARIANT_CLASSES2 = {
|
|
268
|
+
"body-xs": "text-xs leading-normal",
|
|
269
|
+
"body-sm": "text-sm leading-normal",
|
|
270
|
+
"body-md": "text-md leading-normal",
|
|
271
|
+
"body-lg": "text-lg leading-relaxed",
|
|
272
|
+
"heading-1": "text-4xl leading-tight font-bold",
|
|
273
|
+
"heading-2": "text-3xl leading-tight font-semibold",
|
|
274
|
+
"heading-3": "text-2xl leading-tight font-semibold"
|
|
275
|
+
};
|
|
276
|
+
var HEADING_VARIANTS = /* @__PURE__ */ new Set(["heading-1", "heading-2", "heading-3"]);
|
|
277
|
+
function Text({ variant = "body-md", className, testID, children, ...rest }) {
|
|
278
|
+
const isHeading = HEADING_VARIANTS.has(variant);
|
|
279
|
+
const role = isHeading ? "header" : rest.accessibilityRole;
|
|
280
|
+
return /* @__PURE__ */ jsx(
|
|
281
|
+
Text$1,
|
|
282
|
+
{
|
|
283
|
+
testID,
|
|
284
|
+
...rest,
|
|
285
|
+
...role !== void 0 ? { accessibilityRole: role } : {},
|
|
286
|
+
className: cn(VARIANT_CLASSES2[variant], className),
|
|
287
|
+
children
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
__name(Text, "Text");
|
|
292
|
+
function TextInput({
|
|
293
|
+
label,
|
|
294
|
+
helperText,
|
|
295
|
+
error,
|
|
296
|
+
disabled,
|
|
297
|
+
leading,
|
|
298
|
+
trailing,
|
|
299
|
+
containerClassName,
|
|
300
|
+
className,
|
|
301
|
+
testID,
|
|
302
|
+
onChangeText,
|
|
303
|
+
multiline,
|
|
304
|
+
numberOfLines,
|
|
305
|
+
...rest
|
|
306
|
+
}) {
|
|
307
|
+
const reactId = useId();
|
|
308
|
+
const inputId = testID ?? `nori-ui-input-${reactId}`;
|
|
309
|
+
const describeId = `${inputId}-describe`;
|
|
310
|
+
const hasError = Boolean(error);
|
|
311
|
+
const describedBy = error || helperText ? describeId : void 0;
|
|
312
|
+
const inputExtras = {};
|
|
313
|
+
if (testID !== void 0) inputExtras.testID = testID;
|
|
314
|
+
if (label !== void 0) inputExtras.accessibilityLabel = label;
|
|
315
|
+
if (hasError) inputExtras["aria-invalid"] = true;
|
|
316
|
+
if (describedBy !== void 0) inputExtras["aria-describedby"] = describedBy;
|
|
317
|
+
if (multiline !== void 0) inputExtras.multiline = multiline;
|
|
318
|
+
if (numberOfLines !== void 0) inputExtras.numberOfLines = numberOfLines;
|
|
319
|
+
if (onChangeText !== void 0) inputExtras.onChangeText = onChangeText;
|
|
320
|
+
return /* @__PURE__ */ jsxs(View, { className: cn("flex flex-col gap-1", containerClassName), children: [
|
|
321
|
+
label !== void 0 ? /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "text-sm font-medium text-semantic-text-default", children: label }) : null,
|
|
322
|
+
/* @__PURE__ */ jsxs(
|
|
323
|
+
View,
|
|
324
|
+
{
|
|
325
|
+
className: cn(
|
|
326
|
+
"flex-row items-center rounded-md border px-3",
|
|
327
|
+
hasError ? "border-semantic-interactive-destructive" : "border-semantic-border-default",
|
|
328
|
+
disabled ? "opacity-60" : void 0
|
|
329
|
+
),
|
|
330
|
+
children: [
|
|
331
|
+
leading ? /* @__PURE__ */ jsx(View, { className: "mr-2", children: leading }) : null,
|
|
332
|
+
/* @__PURE__ */ jsx(
|
|
333
|
+
TextInput$1,
|
|
334
|
+
{
|
|
335
|
+
nativeID: inputId,
|
|
336
|
+
editable: !disabled,
|
|
337
|
+
className: cn("flex-1 py-2 text-md text-semantic-text-default outline-none", className),
|
|
338
|
+
...inputExtras,
|
|
339
|
+
...rest
|
|
340
|
+
}
|
|
341
|
+
),
|
|
342
|
+
trailing ? /* @__PURE__ */ jsx(View, { className: "ml-2", children: trailing }) : null
|
|
343
|
+
]
|
|
344
|
+
}
|
|
345
|
+
),
|
|
346
|
+
error ? /* @__PURE__ */ jsx(Text$1, { nativeID: describeId, className: "text-sm text-semantic-interactive-destructive", children: error }) : helperText ? /* @__PURE__ */ jsx(Text$1, { nativeID: describeId, className: "text-sm text-semantic-text-muted", children: helperText }) : null
|
|
347
|
+
] });
|
|
348
|
+
}
|
|
349
|
+
__name(TextInput, "TextInput");
|
|
350
|
+
function TextArea({ numberOfLines = 4, ...rest }) {
|
|
351
|
+
return /* @__PURE__ */ jsx(TextInput, { multiline: true, numberOfLines, ...rest });
|
|
352
|
+
}
|
|
353
|
+
__name(TextArea, "TextArea");
|
|
354
|
+
var ALIGN_CLASS2 = {
|
|
355
|
+
start: "items-start",
|
|
356
|
+
center: "items-center",
|
|
357
|
+
end: "items-end",
|
|
358
|
+
stretch: "items-stretch",
|
|
359
|
+
baseline: "items-baseline"
|
|
360
|
+
};
|
|
361
|
+
var JUSTIFY_CLASS2 = {
|
|
362
|
+
start: "justify-start",
|
|
363
|
+
center: "justify-center",
|
|
364
|
+
end: "justify-end",
|
|
365
|
+
between: "justify-between",
|
|
366
|
+
around: "justify-around",
|
|
367
|
+
evenly: "justify-evenly"
|
|
368
|
+
};
|
|
369
|
+
function VStack({ gap, align, justify, className, children, ...rest }) {
|
|
370
|
+
return /* @__PURE__ */ jsx(
|
|
371
|
+
View,
|
|
372
|
+
{
|
|
373
|
+
...rest,
|
|
374
|
+
className: cn(
|
|
375
|
+
"flex-col",
|
|
376
|
+
gap !== void 0 && gap !== 0 ? `gap-${gap}` : void 0,
|
|
377
|
+
align !== void 0 ? ALIGN_CLASS2[align] : void 0,
|
|
378
|
+
justify !== void 0 ? JUSTIFY_CLASS2[justify] : void 0,
|
|
379
|
+
className
|
|
380
|
+
),
|
|
381
|
+
children
|
|
382
|
+
}
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
__name(VStack, "VStack");
|
|
386
|
+
|
|
387
|
+
export { Box, Button, Checkbox, HStack, SemanticIconsProvider, Spinner, Switch, Text, TextArea, TextInput, VStack, useSemanticIcon };
|
|
388
|
+
//# sourceMappingURL=chunk-6NDARMPP.js.map
|
|
389
|
+
//# sourceMappingURL=chunk-6NDARMPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Box/Box.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Button/Button.tsx","../src/icons/semantic-context.tsx","../src/icons/use-semantic-icon.ts","../src/components/Checkbox/Checkbox.tsx","../src/components/HStack/HStack.tsx","../src/components/Switch/Switch.tsx","../src/components/Text/Text.tsx","../src/components/TextInput/TextInput.tsx","../src/components/TextArea/TextArea.tsx","../src/components/VStack/VStack.tsx"],"names":["jsx","Button","RNText","jsxs","View","Pressable","useState","useCallback","VARIANT_CLASSES","RNTextInput","ALIGN_CLASS","JUSTIFY_CLASS"],"mappings":";;;;;;;;AAaO,SAAS,IAAI,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,MAAK,EAAa;AAC5D,EAAA,uBACI,GAAA,CAAC,QAAM,GAAG,IAAA,EAAM,WAAW,EAAA,CAAG,SAAS,GAClC,QAAA,EACL,CAAA;AAER;AANgB,MAAA,CAAA,GAAA,EAAA,KAAA,CAAA;ACAhB,IAAM,QAAA,GAAyD;AAAA,EAC3D,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAaO,SAAS,OAAA,CAAQ,EAAE,KAAA,GAAQ,SAAA,EAAW,IAAA,GAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAK,EAAiB;AACrG,EAAA,MAAM,KAAK,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1D,EAAA,uBACIA,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACH,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,iBAAA,EAAkB,aAAA;AAAA,MAClB,kBAAA,EAAoB,KAAA;AAAA,MACnB,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,MACxC,IAAA,EAAM,EAAA;AAAA,MACN,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAA,IAAM,KAAK;AAAA;AAAA,GAC5C;AAER;AAbgB,MAAA,CAAA,OAAA,EAAA,SAAA,CAAA;ACJhB,IAAM,eAAA,GAAiD;AAAA,EACnD,OAAA,EACI,0HAAA;AAAA,EACJ,SAAA,EAAW,2DAAA;AAAA,EACX,KAAA,EAAO,2DAAA;AAAA,EACP,WAAA,EAAa;AACjB,CAAA;AAEA,IAAM,YAAA,GAA2C;AAAA,EAC7C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAEA,IAAM,YAAwC,EAAE,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAG;AAEvE,IAAM,YAAA,GAAe,+EAAA;AAEd,IAAM,MAAA,GAAS,UAAA,iBAAiC,MAAA,CAAA,SAASC,OAAAA,CAC5D;AAAA,EACI,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,EAAa,WAAA;AAAA,EACb,YAAA,EAAc,YAAA;AAAA,EACd,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACP,CAAA,EACA,YAAA,EACF;AACE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAQ,OAAO,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,EAAA;AAAA,IACZ,YAAA;AAAA,IACA,gBAAgB,OAAO,CAAA;AAAA,IACvB,aAAa,IAAI,CAAA;AAAA,IACjB,gBAAgB,YAAA,GAAe,MAAA;AAAA,IAC/B;AAAA,GACJ;AAEA,EAAA,MAAM,WAAA,2BAAuD,EAAA,KAAO;AAChE,IAAA,IAAI,aAAA,EAAe;AACnB,IAAA,OAAA,GAAU,EAAE,CAAA;AAAA,EAChB,CAAA,EAH4D,aAAA,CAAA;AAK5D,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,MAAM,SAAA,GAAqC;AAAA,MACvC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,OAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT,GAAG;AAAA,KACP;AACA,IAAA,IAAI,aAAA,EAAe,SAAA,CAAU,eAAe,CAAA,GAAI,IAAA;AAChD,IAAA,IAAI,OAAA,EAAS,SAAA,CAAU,WAAW,CAAA,GAAI,IAAA;AACtC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,SAAA,CAAU,aAAa,CAAA,GAAI,MAAA;AACrD,IAAA,uBAAOD,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAG,WAAY,QAAA,EAAS,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,iBAA0C,EAAC;AACjD,EAAA,IAAI,aAAA,EAAe,cAAA,CAAe,eAAe,CAAA,GAAI,IAAA;AACrD,EAAA,IAAI,OAAA,EAAS,cAAA,CAAe,WAAW,CAAA,GAAI,IAAA;AAE3C,EAAA,uBACI,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,YAAA;AAAA,MACJ,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,IAAA,EAAK,QAAA;AAAA,MACL,iBAAA,EAAkB,QAAA;AAAA,MAClB,oBAAoB,EAAE,QAAA,EAAU,eAAe,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA,EAAE;AAAA,MACtE,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,OAAA;AAAA,MACV,GAAG,cAAA;AAAA,MACH,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,OAAA,mBACGA,GAAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,SAAA,CAAU,IAAI,GAAG,KAAA,EAAM,SAAA,EAAU,CAAA,GAChD,WAAA,mBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,SAAA,CAAU,IAAI,GAAG,CAAA,GACpC,IAAA;AAAA,wBACJA,GAAAA,CAACE,MAAA,EAAA,EAAO,SAAA,EAAW,GAAG,aAAA,EAAe,YAAA,CAAa,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA,GAAI,MAAA,GAAY,SAAS,GAC5F,QAAA,EACL,CAAA;AAAA,QACC,YAAA,mBAAeF,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,SAAA,CAAU,IAAI,GAAG,CAAA,GAAK;AAAA;AAAA;AAAA,GAC9D;AAER,CAAA,EAxEuD,QAAA,CAwEtD;AACD,MAAA,CAAO,WAAA,GAAc,QAAA;AChHd,IAAM,oBAAA,GAAuB,cAA6B,oBAAoB,CAAA;AACrF,oBAAA,CAAqB,WAAA,GAAc,sBAAA;AAO5B,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA+B;AACnF,EAAA,MAAM,SAAwB,KAAA,GAAQ,EAAE,GAAG,oBAAA,EAAsB,GAAG,OAAM,GAAI,oBAAA;AAC9E,EAAA,uBAAOA,GAAAA,CAAC,oBAAA,CAAqB,UAArB,EAA8B,KAAA,EAAO,QAAS,QAAA,EAAS,CAAA;AACnE;AAHgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA;ACRT,SAAS,gBAA+C,IAAA,EAA2B;AACtF,EAAA,MAAM,KAAA,GAAQ,WAAW,oBAAoB,CAAA;AAC7C,EAAA,OAAO,MAAM,IAAI,CAAA;AACrB;AAHgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;ACoBT,SAAS,QAAA,CAAS;AAAA,EACrB,OAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAkB,cAAc,CAAA;AAC1D,EAAA,MAAM,eAAe,OAAA,KAAY,MAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,OAAO,CAAA,GAAI,KAAA;AAEhD,EAAA,MAAM,WAAA,GAA0C,aAAA,GAAgB,OAAA,GAAU,KAAA,GAAQ,MAAA,GAAS,OAAA;AAE3F,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,OAAO,CAAC,KAAA;AACd,IAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,IAAI,CAAA;AAChC,IAAA,QAAA,GAAW,IAAI,CAAA;AAAA,EACnB,GAAG,CAAC,QAAA,EAAU,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAC,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,gBAAgB,WAAW,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAuC;AAAA,IACzC,IAAA,EAAM,UAAA;AAAA,IACN,cAAA,EAAgB,WAAA;AAAA,IAChB,iBAAA,EAAmB,UAAA;AAAA,IACnB,oBAAoB,EAAE,OAAA,EAAS,OAAO,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,EAAE;AAAA,IAClE;AAAA,GACJ;AACA,EAAA,IAAI,QAAA,EAAU,WAAA,CAAY,eAAe,CAAA,GAAI,IAAA;AAC7C,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,WAAA,CAAY,YAAY,CAAA,GAAI,KAAA;AAC5B,IAAA,WAAA,CAAY,kBAAA,GAAqB,KAAA;AAAA,EACrC;AAEA,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,MAAM,SAAA,GAAqC;AAAA,MACvC,IAAA,EAAM,UAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACb;AACA,IAAA,IAAI,QAAA,EAAU,SAAA,CAAU,eAAe,CAAA,GAAI,IAAA;AAC3C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,SAAA,CAAU,YAAY,CAAA,GAAI,KAAA;AACnD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,SAAA,CAAU,aAAa,CAAA,GAAI,MAAA;AACrD,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,SAAA,GAAY,SAAA;AACnD,IAAA,uBAAOA,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAG,WAAY,QAAA,EAAS,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,UAAA,GAAa,GAAG,qFAAqF,CAAA;AAE3G,EAAA,uBACIG,IAAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,6BAAA,EAA+B,QAAA,GAAW,YAAA,GAAe,MAAA,EAAW,SAAS,CAAA,EAC7F,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAACK,WAAA,EAAU,OAAA,EAAS,QAAS,GAAG,WAAA,EAAa,WAAW,UAAA,EAClD,QAAA,EAAA,CAAA,KAAA,IAAS,kBAAkB,CAAC,QAAA,mBAAWL,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAM,EAAA,EAAI,KAAA,EAAM,cAAA,EAAe,CAAA,GAAK,IAAA,EACxF,CAAA;AAAA,IACC,QAAA,KAAa,UAAU,MAAA,mBAAYA,IAACI,IAAAA,EAAA,EAAM,iBAAM,CAAA,GAAU,IAAA;AAAA,GAAA,EAC/D,CAAA;AAER;AA/DgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;ACVhB,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAKO,SAAS,MAAA,CAAO,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,SAAA,EAAW,QAAA,EAAU,GAAG,IAAA,EAAK,EAAgB;AACvF,EAAA,uBACIJ,GAAAA;AAAA,IAACI,IAAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AAfgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;ACXT,SAAS,MAAA,CAAO;AAAA,EACnB,OAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAgB;AACZ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,SAAkB,cAAc,CAAA;AAC1D,EAAA,MAAM,eAAe,OAAA,KAAY,MAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,OAAO,CAAA,GAAI,KAAA;AAEhD,EAAA,MAAM,MAAA,GAASC,YAAY,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,OAAO,CAAC,KAAA;AACd,IAAA,IAAI,CAAC,YAAA,EAAc,QAAA,CAAS,IAAI,CAAA;AAChC,IAAA,QAAA,GAAW,IAAI,CAAA;AAAA,EACnB,GAAG,CAAC,QAAA,EAAU,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAC,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAgC,QAAQ,MAAA,GAAS,OAAA;AAEvD,EAAA,MAAM,WAAA,GAAuC;AAAA,IACzC,IAAA,EAAM,QAAA;AAAA,IACN,cAAA,EAAgB,WAAA;AAAA,IAChB,iBAAA,EAAmB,QAAA;AAAA,IACnB,oBAAoB,EAAE,OAAA,EAAS,OAAO,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA,EAAE;AAAA,IAClE;AAAA,GACJ;AACA,EAAA,IAAI,QAAA,EAAU,WAAA,CAAY,eAAe,CAAA,GAAI,IAAA;AAC7C,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,WAAA,CAAY,YAAY,CAAA,GAAI,KAAA;AAC5B,IAAA,WAAA,CAAY,kBAAA,GAAqB,KAAA;AAAA,EACrC;AAEA,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,MAAM,SAAA,GAAqC;AAAA,MACvC,IAAA,EAAM,QAAA;AAAA,MACN,cAAA,EAAgB,WAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACb;AACA,IAAA,IAAI,QAAA,EAAU,SAAA,CAAU,eAAe,CAAA,GAAI,IAAA;AAC3C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,SAAA,CAAU,YAAY,CAAA,GAAI,KAAA;AACnD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,SAAA,CAAU,aAAa,CAAA,GAAI,MAAA;AACrD,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,SAAA,CAAU,SAAA,GAAY,SAAA;AACnD,IAAA,uBAAOP,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAG,WAAY,QAAA,EAAS,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,YAAA,GAAe,EAAA;AAAA,IACjB,+DAAA;AAAA,IACA,QAAQ,iCAAA,GAAoC,gBAAA;AAAA,IAC5C,WAAW,YAAA,GAAe;AAAA,GAC9B;AACA,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,yCAAA,EAA2C,KAAA,GAAQ,aAAa,YAAY,CAAA;AAEpG,EAAA,uBACIG,KAACC,IAAAA,EAAA,EAAK,WAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA,EACxD,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAACK,SAAAA,EAAA,EAAU,OAAA,EAAS,QAAS,GAAG,WAAA,EAAa,SAAA,EAAW,YAAA,EACpD,0BAAAL,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAW,cAAc,CAAA,EACnC,CAAA;AAAA,IACC,KAAA,mBAAQJ,GAAAA,CAACE,MAAAA,EAAA,EAAO,SAAA,EAAU,oCAAA,EAAsC,iBAAM,CAAA,GAAY,IAAA;AAAA,IAClF;AAAA,GAAA,EACL,CAAA;AAER;AAlEgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;ACbhB,IAAMM,gBAAAA,GAA+C;AAAA,EACjD,SAAA,EAAW,wBAAA;AAAA,EACX,SAAA,EAAW,wBAAA;AAAA,EACX,SAAA,EAAW,wBAAA;AAAA,EACX,SAAA,EAAW,yBAAA;AAAA,EACX,WAAA,EAAa,kCAAA;AAAA,EACb,WAAA,EAAa,sCAAA;AAAA,EACb,WAAA,EAAa;AACjB,CAAA;AAEA,IAAM,mCAA+C,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,WAAA,EAAa,WAAW,CAAC,CAAA;AAQ7F,SAAS,IAAA,CAAK,EAAE,OAAA,GAAU,SAAA,EAAW,WAAW,MAAA,EAAQ,QAAA,EAAU,GAAG,IAAA,EAAK,EAAc;AAC3F,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,iBAAA;AACzC,EAAA,uBACIR,GAAAA;AAAA,IAACE,MAAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACC,GAAG,IAAA;AAAA,MACH,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,iBAAA,EAAmB,IAAA,KAAS,EAAC;AAAA,MACzD,SAAA,EAAW,EAAA,CAAGM,gBAAAA,CAAgB,OAAO,GAAG,SAAS,CAAA;AAAA,MAEhD;AAAA;AAAA,GACL;AAER;AAbgB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;ACGT,SAAS,SAAA,CAAU;AAAA,EACtB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,GAAG;AACP,CAAA,EAAmB;AACf,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,MAAM,OAAA,GAAU,MAAA,IAAU,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,GAAG,OAAO,CAAA,SAAA,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC9B,EAAA,MAAM,WAAA,GAAc,KAAA,IAAS,UAAA,GAAa,UAAA,GAAa,MAAA;AAEvD,EAAA,MAAM,cAAuC,EAAC;AAC9C,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,WAAA,CAAY,MAAA,GAAS,MAAA;AAC/C,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,WAAA,CAAY,kBAAA,GAAqB,KAAA;AAC1D,EAAA,IAAI,QAAA,EAAU,WAAA,CAAY,cAAc,CAAA,GAAI,IAAA;AAC5C,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,WAAA,CAAY,kBAAkB,CAAA,GAAI,WAAA;AACjE,EAAA,IAAI,SAAA,KAAc,MAAA,EAAW,WAAA,CAAY,SAAA,GAAY,SAAA;AACrD,EAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,WAAA,CAAY,aAAA,GAAgB,aAAA;AAC7D,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,WAAA,CAAY,YAAA,GAAe,YAAA;AAE3D,EAAA,uBACIL,KAACC,IAAAA,EAAA,EAAK,WAAW,EAAA,CAAG,qBAAA,EAAuB,kBAAkB,CAAA,EACxD,QAAA,EAAA;AAAA,IAAA,KAAA,KAAU,MAAA,mBACPJ,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAS,OAAA,EAAS,SAAA,EAAU,gDAAA,EAC9B,QAAA,EAAA,KAAA,EACL,CAAA,GACA,IAAA;AAAA,oBACJG,IAAAA;AAAA,MAACC,IAAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,8CAAA;AAAA,UACA,WAAW,yCAAA,GAA4C,gCAAA;AAAA,UACvD,WAAW,YAAA,GAAe;AAAA,SAC9B;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,mBAAUJ,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,mBAAQ,CAAA,GAAU,IAAA;AAAA,0BACrDJ,GAAAA;AAAA,YAACS,WAAA;AAAA,YAAA;AAAA,cACG,QAAA,EAAU,OAAA;AAAA,cACV,UAAU,CAAC,QAAA;AAAA,cACX,SAAA,EAAW,EAAA,CAAG,6DAAA,EAA+D,SAAS,CAAA;AAAA,cACrF,GAAG,WAAA;AAAA,cACH,GAAG;AAAA;AAAA,WACR;AAAA,UACC,QAAA,mBAAWT,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,oBAAS,CAAA,GAAU;AAAA;AAAA;AAAA,KAC3D;AAAA,IACC,KAAA,mBACGJ,GAAAA,CAACE,MAAAA,EAAA,EAAO,QAAA,EAAU,UAAA,EAAY,WAAU,+CAAA,EACnC,QAAA,EAAA,KAAA,EACL,IACA,UAAA,mBACAF,IAACE,MAAAA,EAAA,EAAO,UAAU,UAAA,EAAY,SAAA,EAAU,kCAAA,EACnC,QAAA,EAAA,UAAA,EACL,CAAA,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAjEgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;ACxBT,SAAS,SAAS,EAAE,aAAA,GAAgB,CAAA,EAAG,GAAG,MAAK,EAAkB;AACpE,EAAA,uBAAOF,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAS,IAAA,EAAC,aAAA,EAA+B,GAAG,IAAA,EAAM,CAAA;AACxE;AAFgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;ACIhB,IAAMU,YAAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAMC,cAAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAKO,SAAS,MAAA,CAAO,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,SAAA,EAAW,QAAA,EAAU,GAAG,IAAA,EAAK,EAAgB;AACvF,EAAA,uBACIX,GAAAA;AAAA,IAACI,IAAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAYM,YAAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAYC,cAAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AAfgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA","file":"chunk-6NDARMPP.js","sourcesContent":["import type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type BoxProps = ViewProps & {\n className?: string;\n testID?: string;\n};\n\n/**\n * Generic layout primitive. Wraps react-native's <View> with className support.\n * RSC-safe.\n */\nexport function Box({ className, children, ...rest }: BoxProps) {\n return (\n <View {...rest} className={cn(className)}>\n {children}\n </View>\n );\n}\n","import type { ActivityIndicatorProps } from 'react-native';\nimport { ActivityIndicator } from 'react-native';\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport type SpinnerProps = Omit<ActivityIndicatorProps, 'size'> & {\n /** Visible (a11y) label. Defaults to the i18n \"common.loading\" default (\"Loading\"). */\n label?: string;\n size?: SpinnerSize;\n testID?: string;\n className?: string;\n};\n\nconst SIZE_MAP: Record<Exclude<SpinnerSize, number>, number> = {\n sm: 12,\n md: 16,\n lg: 24,\n xl: 32,\n};\n\n/**\n * Loading indicator.\n *\n * a11y: rendered with `role=\"progressbar\"` and an `aria-label` so screen\n * readers announce it. Respects `prefers-reduced-motion` — on web, react-native-web's\n * ActivityIndicator will render without animation when the media query matches;\n * on native, React Native's ActivityIndicator honors the OS reduce-motion setting\n * automatically.\n *\n * RSC-safe: pure render, no hooks.\n */\nexport function Spinner({ label = 'Loading', size = 'md', testID, color, style, ...rest }: SpinnerProps) {\n const px = typeof size === 'number' ? size : SIZE_MAP[size];\n return (\n <ActivityIndicator\n {...rest}\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"progressbar\"\n accessibilityLabel={label}\n {...(color !== undefined ? { color } : {})}\n size={px}\n style={[{ width: px, height: px }, style]}\n />\n );\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport type { PressableProps } from 'react-native';\nimport { Pressable, Text as RNText } from 'react-native';\nimport { Slot } from '../../slot';\nimport { cn } from '../../utils/cn';\nimport { Spinner } from '../Spinner';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\ntype IconSlot = ComponentType<{ size?: number; color?: string }>;\n\nexport type ButtonProps = Omit<PressableProps, 'disabled' | 'children'> & {\n children?: ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: IconSlot;\n trailingIcon?: IconSlot;\n /** If true, the single child becomes the interactive element (Slot pattern). */\n asChild?: boolean;\n className?: string;\n testID?: string;\n};\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-semantic-interactive-primary hover:bg-semantic-interactive-primaryHover active:bg-semantic-interactive-primaryPressed',\n secondary: 'bg-neutral-100 hover:bg-neutral-200 active:bg-neutral-300',\n ghost: 'bg-transparent hover:bg-neutral-100 active:bg-neutral-200',\n destructive: 'bg-semantic-interactive-destructive hover:opacity-90 active:opacity-80',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-md',\n lg: 'h-12 px-5 text-lg',\n};\n\nconst ICON_SIZE: Record<ButtonSize, number> = { sm: 14, md: 16, lg: 20 };\n\nconst BASE_CLASSES = 'inline-flex flex-row items-center justify-center gap-2 rounded-md select-none';\n\nexport const Button = forwardRef<unknown, ButtonProps>(function Button(\n {\n children,\n variant = 'primary',\n size = 'md',\n disabled,\n loading,\n leadingIcon: LeadingIcon,\n trailingIcon: TrailingIcon,\n asChild,\n className,\n onPress,\n testID,\n ...rest\n },\n forwardedRef\n) {\n const isInoperative = Boolean(disabled) || Boolean(loading);\n const classes = cn(\n BASE_CLASSES,\n VARIANT_CLASSES[variant],\n SIZE_CLASSES[size],\n isInoperative ? 'opacity-60' : undefined,\n className\n );\n\n const handlePress: NonNullable<PressableProps['onPress']> = (ev) => {\n if (isInoperative) return;\n onPress?.(ev);\n };\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n ref: forwardedRef,\n className: classes,\n onClick: handlePress as unknown as (...args: unknown[]) => unknown,\n ...rest,\n };\n if (isInoperative) slotProps['aria-disabled'] = true;\n if (loading) slotProps['aria-busy'] = true;\n if (testID !== undefined) slotProps['data-testid'] = testID;\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const pressableExtra: Record<string, unknown> = {};\n if (isInoperative) pressableExtra['aria-disabled'] = true;\n if (loading) pressableExtra['aria-busy'] = true;\n\n return (\n <Pressable\n ref={forwardedRef as never}\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: isInoperative, busy: Boolean(loading) }}\n disabled={isInoperative}\n onPress={handlePress}\n className={classes}\n {...pressableExtra}\n {...rest}\n >\n {loading ? (\n <Spinner size={ICON_SIZE[size]} label=\"Loading\" />\n ) : LeadingIcon ? (\n <LeadingIcon size={ICON_SIZE[size]} />\n ) : null}\n <RNText className={cn('font-medium', SIZE_CLASSES[size].includes('text-') ? undefined : 'text-md')}>\n {children}\n </RNText>\n {TrailingIcon ? <TrailingIcon size={ICON_SIZE[size]} /> : null}\n </Pressable>\n );\n});\nButton.displayName = 'Button';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { createContext } from 'react';\nimport { defaultSemanticIcons, type SemanticIcons } from './default-semantic-icons';\n\nexport const SemanticIconsContext = createContext<SemanticIcons>(defaultSemanticIcons);\nSemanticIconsContext.displayName = 'SemanticIconsContext';\n\nexport type SemanticIconsProviderProps = {\n icons?: Partial<SemanticIcons>;\n children?: ReactNode;\n};\n\nexport function SemanticIconsProvider({ icons, children }: SemanticIconsProviderProps) {\n const merged: SemanticIcons = icons ? { ...defaultSemanticIcons, ...icons } : defaultSemanticIcons;\n return <SemanticIconsContext.Provider value={merged}>{children}</SemanticIconsContext.Provider>;\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport type { SemanticIcons } from './default-semantic-icons';\nimport { SemanticIconsContext } from './semantic-context';\n\nexport function useSemanticIcon<K extends keyof SemanticIcons>(name: K): SemanticIcons[K] {\n const icons = useContext(SemanticIconsContext);\n return icons[name];\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport { Pressable, View } from 'react-native';\nimport { useSemanticIcon } from '../../icons/use-semantic-icon';\nimport { Slot } from '../../slot';\nimport { cn } from '../../utils/cn';\n\nexport type CheckboxProps = {\n checked?: boolean;\n defaultChecked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (next: boolean) => void;\n label?: string;\n className?: string;\n testID?: string;\n asChild?: boolean;\n children?: ReactNode;\n};\n\n/**\n * Checkbox — supports controlled + uncontrolled state, indeterminate (aria-checked=\"mixed\"),\n * asChild (via Slot), and a visible label that doubles as the accessibility label.\n */\nexport function Checkbox({\n checked,\n defaultChecked = false,\n indeterminate,\n disabled,\n onChange,\n label,\n className,\n testID,\n asChild,\n children,\n}: CheckboxProps) {\n const [inner, setInner] = useState<boolean>(defaultChecked);\n const isControlled = checked !== undefined;\n const value = isControlled ? Boolean(checked) : inner;\n\n const ariaChecked: 'true' | 'false' | 'mixed' = indeterminate ? 'mixed' : value ? 'true' : 'false';\n\n const toggle = useCallback(() => {\n if (disabled) return;\n const next = !value;\n if (!isControlled) setInner(next);\n onChange?.(next);\n }, [disabled, value, isControlled, onChange]);\n\n const Check = useSemanticIcon('checkmark');\n\n const commonProps: Record<string, unknown> = {\n role: 'checkbox',\n 'aria-checked': ariaChecked,\n accessibilityRole: 'checkbox' as const,\n accessibilityState: { checked: value, disabled: Boolean(disabled) },\n testID,\n };\n if (disabled) commonProps['aria-disabled'] = true;\n if (label !== undefined) {\n commonProps['aria-label'] = label;\n commonProps.accessibilityLabel = label;\n }\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n role: 'checkbox',\n 'aria-checked': ariaChecked,\n onClick: toggle,\n };\n if (disabled) slotProps['aria-disabled'] = true;\n if (label !== undefined) slotProps['aria-label'] = label;\n if (testID !== undefined) slotProps['data-testid'] = testID;\n if (className !== undefined) slotProps.className = className;\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const boxClasses = cn('w-5 h-5 rounded-sm border border-semantic-border-strong items-center justify-center');\n\n return (\n <View className={cn('flex-row items-center gap-2', disabled ? 'opacity-60' : undefined, className)}>\n <Pressable onPress={toggle} {...commonProps} className={boxClasses}>\n {(value || indeterminate) && !disabled ? <Check size={14} color=\"currentColor\" /> : null}\n </Pressable>\n {children ?? (label !== undefined ? <View>{label}</View> : null)}\n </View>\n );\n}\n","import type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type StackGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12;\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n\nexport type HStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\n/**\n * Horizontal flex layout primitive. RSC-safe.\n */\nexport function HStack({ gap, align, justify, className, children, ...rest }: HStackProps) {\n return (\n <View\n {...rest}\n className={cn(\n 'flex-row',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {children}\n </View>\n );\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useCallback, useState } from 'react';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { cn } from '../../utils/cn';\n\nexport type SwitchProps = {\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n onChange?: (next: boolean) => void;\n label?: string;\n className?: string;\n testID?: string;\n asChild?: boolean;\n children?: ReactNode;\n};\n\n/**\n * Switch — a toggle control with role=\"switch\". Supports controlled + uncontrolled,\n * disabled state, asChild (via Slot), and a visible label that doubles as the\n * accessibility label.\n */\nexport function Switch({\n checked,\n defaultChecked = false,\n disabled,\n onChange,\n label,\n className,\n testID,\n asChild,\n children,\n}: SwitchProps) {\n const [inner, setInner] = useState<boolean>(defaultChecked);\n const isControlled = checked !== undefined;\n const value = isControlled ? Boolean(checked) : inner;\n\n const toggle = useCallback(() => {\n if (disabled) return;\n const next = !value;\n if (!isControlled) setInner(next);\n onChange?.(next);\n }, [disabled, value, isControlled, onChange]);\n\n const ariaChecked: 'true' | 'false' = value ? 'true' : 'false';\n\n const commonProps: Record<string, unknown> = {\n role: 'switch',\n 'aria-checked': ariaChecked,\n accessibilityRole: 'switch' as const,\n accessibilityState: { checked: value, disabled: Boolean(disabled) },\n testID,\n };\n if (disabled) commonProps['aria-disabled'] = true;\n if (label !== undefined) {\n commonProps['aria-label'] = label;\n commonProps.accessibilityLabel = label;\n }\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n role: 'switch',\n 'aria-checked': ariaChecked,\n onClick: toggle,\n };\n if (disabled) slotProps['aria-disabled'] = true;\n if (label !== undefined) slotProps['aria-label'] = label;\n if (testID !== undefined) slotProps['data-testid'] = testID;\n if (className !== undefined) slotProps.className = className;\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const trackClasses = cn(\n 'w-10 h-6 rounded-full justify-center px-0.5 transition-colors',\n value ? 'bg-semantic-interactive-primary' : 'bg-neutral-300',\n disabled ? 'opacity-60' : undefined\n );\n const thumbClasses = cn('w-5 h-5 rounded-full bg-white shadow-sm', value ? 'self-end' : 'self-start');\n\n return (\n <View className={cn('flex-row items-center gap-2', className)}>\n <Pressable onPress={toggle} {...commonProps} className={trackClasses}>\n <View className={thumbClasses} />\n </Pressable>\n {label ? <RNText className=\"text-md text-semantic-text-default\">{label}</RNText> : null}\n {children}\n </View>\n );\n}\n","import type { TextProps as RNTextProps } from 'react-native';\nimport { Text as RNText } from 'react-native';\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/**\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 * RSC-safe: pure render, no hooks.\n */\nexport function Text({ variant = 'body-md', className, testID, children, ...rest }: TextProps) {\n const isHeading = HEADING_VARIANTS.has(variant);\n const role = isHeading ? 'header' : rest.accessibilityRole;\n return (\n <RNText\n testID={testID}\n {...rest}\n {...(role !== undefined ? { accessibilityRole: role } : {})}\n className={cn(VARIANT_CLASSES[variant], className)}\n >\n {children}\n </RNText>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useId } from 'react';\nimport type { TextInputProps as RNTextInputProps } from 'react-native';\nimport { Text as RNText, TextInput as RNTextInput, View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type TextInputProps = Omit<RNTextInputProps, 'editable'> & {\n label?: string;\n helperText?: string;\n error?: string;\n disabled?: boolean;\n leading?: ReactNode;\n trailing?: ReactNode;\n /** Pass through a custom wrapper className */\n containerClassName?: string;\n className?: string;\n testID?: string;\n /** Controlled text handler. Optional so uncontrolled usage works too. */\n onChangeText?: (text: string) => void;\n /** Multi-line mode — flipped by TextArea. Default false. */\n multiline?: boolean;\n numberOfLines?: number;\n};\n\n/**\n * Single-line text input with label, helper, error, and leading/trailing slots.\n *\n * a11y: label is a <label for={id}>; the input is `aria-invalid=true` + labelled\n * by the error/helper text via aria-describedby when present.\n *\n * Notionally RSC-safe — uses only useId() which React 19 guarantees is safe on\n * the server. No \"use client\" required.\n */\nexport function TextInput({\n label,\n helperText,\n error,\n disabled,\n leading,\n trailing,\n containerClassName,\n className,\n testID,\n onChangeText,\n multiline,\n numberOfLines,\n ...rest\n}: TextInputProps) {\n const reactId = useId();\n const inputId = testID ?? `nori-ui-input-${reactId}`;\n const describeId = `${inputId}-describe`;\n const hasError = Boolean(error);\n const describedBy = error || helperText ? describeId : undefined;\n\n const inputExtras: Record<string, unknown> = {};\n if (testID !== undefined) inputExtras.testID = testID;\n if (label !== undefined) inputExtras.accessibilityLabel = label;\n if (hasError) inputExtras['aria-invalid'] = true;\n if (describedBy !== undefined) inputExtras['aria-describedby'] = describedBy;\n if (multiline !== undefined) inputExtras.multiline = multiline;\n if (numberOfLines !== undefined) inputExtras.numberOfLines = numberOfLines;\n if (onChangeText !== undefined) inputExtras.onChangeText = onChangeText;\n\n return (\n <View className={cn('flex flex-col gap-1', containerClassName)}>\n {label !== undefined ? (\n <label htmlFor={inputId} className=\"text-sm font-medium text-semantic-text-default\">\n {label}\n </label>\n ) : null}\n <View\n className={cn(\n 'flex-row items-center rounded-md border px-3',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined\n )}\n >\n {leading ? <View className=\"mr-2\">{leading}</View> : null}\n <RNTextInput\n nativeID={inputId}\n editable={!disabled}\n className={cn('flex-1 py-2 text-md text-semantic-text-default outline-none', className)}\n {...inputExtras}\n {...rest}\n />\n {trailing ? <View className=\"ml-2\">{trailing}</View> : null}\n </View>\n {error ? (\n <RNText nativeID={describeId} className=\"text-sm text-semantic-interactive-destructive\">\n {error}\n </RNText>\n ) : helperText ? (\n <RNText nativeID={describeId} className=\"text-sm text-semantic-text-muted\">\n {helperText}\n </RNText>\n ) : null}\n </View>\n );\n}\n","import type { TextInputProps } from '../TextInput';\nimport { TextInput } from '../TextInput';\n\nexport type TextAreaProps = TextInputProps;\n\n/**\n * Multi-line text input. Thin wrapper over TextInput that fixes `multiline=true`\n * and provides a sensible default for `numberOfLines`.\n */\nexport function TextArea({ numberOfLines = 4, ...rest }: TextAreaProps) {\n return <TextInput multiline numberOfLines={numberOfLines} {...rest} />;\n}\n","import type { ViewProps } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport type { StackAlign, StackGap, StackJustify } from '../HStack/HStack';\n\nexport type VStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\n/**\n * Vertical flex layout primitive. RSC-safe.\n */\nexport function VStack({ gap, align, justify, className, children, ...rest }: VStackProps) {\n return (\n <View\n {...rest}\n className={cn(\n 'flex-col',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {children}\n </View>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-7QVYU63E.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-BRCCWMGJ.js"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { __name } from './chunk-7QVYU63E.js';
|
|
2
|
+
import { forwardRef, isValidElement, Children, cloneElement } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/slot/compose-refs.ts
|
|
5
|
+
function composeRefs(...refs) {
|
|
6
|
+
return (node) => {
|
|
7
|
+
for (const ref of refs) {
|
|
8
|
+
if (ref == null) continue;
|
|
9
|
+
if (typeof ref === "function") {
|
|
10
|
+
ref(node);
|
|
11
|
+
} else {
|
|
12
|
+
ref.current = node;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
__name(composeRefs, "composeRefs");
|
|
18
|
+
var Slot = forwardRef(/* @__PURE__ */ __name(function Slot2(props, forwardedRef) {
|
|
19
|
+
const { children, ...slotProps } = props;
|
|
20
|
+
if (!isValidElement(children)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const child = Children.only(children);
|
|
24
|
+
const merged = mergeProps(slotProps, child.props);
|
|
25
|
+
const childRef = child.ref;
|
|
26
|
+
if (forwardedRef || childRef) {
|
|
27
|
+
merged.ref = composeRefs(forwardedRef, childRef);
|
|
28
|
+
}
|
|
29
|
+
return cloneElement(child, merged);
|
|
30
|
+
}, "Slot"));
|
|
31
|
+
Slot.displayName = "Slot";
|
|
32
|
+
function mergeProps(outer, inner) {
|
|
33
|
+
const merged = { ...outer };
|
|
34
|
+
for (const key of Object.keys(inner)) {
|
|
35
|
+
const outerValue = outer[key];
|
|
36
|
+
const innerValue = inner[key];
|
|
37
|
+
if (key === "className" || key === "class") {
|
|
38
|
+
merged[key] = joinClass(outerValue, innerValue);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (key === "style") {
|
|
42
|
+
merged[key] = {
|
|
43
|
+
...outerValue,
|
|
44
|
+
...innerValue
|
|
45
|
+
};
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (isEventHandler(key, outerValue, innerValue)) {
|
|
49
|
+
merged[key] = composeHandlers(outerValue, innerValue);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
merged[key] = innerValue;
|
|
53
|
+
}
|
|
54
|
+
return merged;
|
|
55
|
+
}
|
|
56
|
+
__name(mergeProps, "mergeProps");
|
|
57
|
+
function joinClass(outer, inner) {
|
|
58
|
+
const a = typeof outer === "string" ? outer : "";
|
|
59
|
+
const b = typeof inner === "string" ? inner : "";
|
|
60
|
+
const joined = [a, b].filter(Boolean).join(" ");
|
|
61
|
+
return joined.length > 0 ? joined : void 0;
|
|
62
|
+
}
|
|
63
|
+
__name(joinClass, "joinClass");
|
|
64
|
+
function isEventHandler(key, outer, inner) {
|
|
65
|
+
if (!key.startsWith("on") || key.length < 3) return false;
|
|
66
|
+
if (key[2] !== key[2]?.toUpperCase()) return false;
|
|
67
|
+
return typeof outer === "function" && typeof inner === "function";
|
|
68
|
+
}
|
|
69
|
+
__name(isEventHandler, "isEventHandler");
|
|
70
|
+
function composeHandlers(outer, inner) {
|
|
71
|
+
return (...args) => {
|
|
72
|
+
outer(...args);
|
|
73
|
+
inner(...args);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
__name(composeHandlers, "composeHandlers");
|
|
77
|
+
|
|
78
|
+
export { Slot, composeRefs };
|
|
79
|
+
//# sourceMappingURL=chunk-FXKIWONG.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-FXKIWONG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/slot/compose-refs.ts","../src/slot/slot.tsx"],"names":["Slot"],"mappings":"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","file":"chunk-FXKIWONG.js","sourcesContent":["// composeRefs — merges multiple React refs (callback or object) into a single callback.\n// Derived from Radix UI's approach; reimplemented here so we don't take a Radix dependency.\n\nimport type { MutableRefObject, Ref, RefCallback } from 'react';\n\ntype PossibleRef<T> = Ref<T> | undefined;\n\nexport function composeRefs<T>(...refs: Array<PossibleRef<T>>): RefCallback<T> {\n return (node: T | null) => {\n for (const ref of refs) {\n if (ref == null) continue;\n if (typeof ref === 'function') {\n ref(node);\n } else {\n // React's MutableRefObject typing — we assign .current directly.\n (ref as MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n","import type { CSSProperties, ReactElement, Ref } from 'react';\nimport { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport { composeRefs } from './compose-refs';\n\ntype AnyProps = Record<string, unknown>;\n\nexport type SlotProps = {\n children?: React.ReactNode;\n} & AnyProps;\n\nexport const Slot = forwardRef<unknown, SlotProps>(function Slot(props, forwardedRef) {\n const { children, ...slotProps } = props;\n\n if (!isValidElement(children)) {\n return null;\n }\n\n // Assert that children is a single React element with props — we've narrowed above.\n const child = Children.only(children) as ReactElement<AnyProps> & { ref?: Ref<unknown> };\n const merged = mergeProps(slotProps, child.props);\n\n // Merge refs: Slot's forwarded ref + the child's own ref (if any).\n const childRef = (child as unknown as { ref?: Ref<unknown> }).ref;\n if (forwardedRef || childRef) {\n (merged as AnyProps).ref = composeRefs(forwardedRef, childRef);\n }\n\n return cloneElement(child, merged);\n});\nSlot.displayName = 'Slot';\n\nfunction mergeProps(outer: AnyProps, inner: AnyProps): AnyProps {\n // Inner (child) wins for everything except: className (concatenated), style (merged), and\n // event handlers (composed — outer runs first, then inner).\n const merged: AnyProps = { ...outer };\n\n for (const key of Object.keys(inner)) {\n const outerValue = outer[key];\n const innerValue = inner[key];\n\n if (key === 'className' || key === 'class') {\n merged[key] = joinClass(outerValue, innerValue);\n continue;\n }\n\n if (key === 'style') {\n merged[key] = {\n ...(outerValue as CSSProperties | undefined),\n ...(innerValue as CSSProperties | undefined),\n };\n continue;\n }\n\n if (isEventHandler(key, outerValue, innerValue)) {\n merged[key] = composeHandlers(outerValue as Fn, innerValue as Fn);\n continue;\n }\n\n merged[key] = innerValue;\n }\n\n return merged;\n}\n\nfunction joinClass(outer: unknown, inner: unknown): string | undefined {\n const a = typeof outer === 'string' ? outer : '';\n const b = typeof inner === 'string' ? inner : '';\n const joined = [a, b].filter(Boolean).join(' ');\n return joined.length > 0 ? joined : undefined;\n}\n\ntype Fn = (...args: unknown[]) => unknown;\n\nfunction isEventHandler(key: string, outer: unknown, inner: unknown): boolean {\n if (!key.startsWith('on') || key.length < 3) return false;\n if (key[2] !== key[2]?.toUpperCase()) return false;\n return typeof outer === 'function' && typeof inner === 'function';\n}\n\nfunction composeHandlers(outer: Fn, inner: Fn): Fn {\n return (...args: unknown[]) => {\n outer(...args);\n inner(...args);\n };\n}\n"]}
|