@ankhorage/zora 2.4.5 → 2.4.6

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 (52) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +188 -0
  3. package/dist/components/date-picker/DatePicker.d.ts +4 -0
  4. package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
  5. package/dist/components/date-picker/DatePicker.js +144 -0
  6. package/dist/components/date-picker/DatePicker.js.map +1 -0
  7. package/dist/components/date-picker/index.d.ts +3 -0
  8. package/dist/components/date-picker/index.d.ts.map +1 -0
  9. package/dist/components/date-picker/index.js +2 -0
  10. package/dist/components/date-picker/index.js.map +1 -0
  11. package/dist/components/date-picker/meta.d.ts +9 -0
  12. package/dist/components/date-picker/meta.d.ts.map +1 -0
  13. package/dist/components/date-picker/meta.js +9 -0
  14. package/dist/components/date-picker/meta.js.map +1 -0
  15. package/dist/components/date-picker/types.d.ts +18 -0
  16. package/dist/components/date-picker/types.d.ts.map +1 -0
  17. package/dist/components/date-picker/types.js +2 -0
  18. package/dist/components/date-picker/types.js.map +1 -0
  19. package/dist/components/time-picker/TimePicker.d.ts +4 -0
  20. package/dist/components/time-picker/TimePicker.d.ts.map +1 -0
  21. package/dist/components/time-picker/TimePicker.js +80 -0
  22. package/dist/components/time-picker/TimePicker.js.map +1 -0
  23. package/dist/components/time-picker/index.d.ts +3 -0
  24. package/dist/components/time-picker/index.d.ts.map +1 -0
  25. package/dist/components/time-picker/index.js +2 -0
  26. package/dist/components/time-picker/index.js.map +1 -0
  27. package/dist/components/time-picker/meta.d.ts +9 -0
  28. package/dist/components/time-picker/meta.d.ts.map +1 -0
  29. package/dist/components/time-picker/meta.js +9 -0
  30. package/dist/components/time-picker/meta.js.map +1 -0
  31. package/dist/components/time-picker/types.d.ts +19 -0
  32. package/dist/components/time-picker/types.d.ts.map +1 -0
  33. package/dist/components/time-picker/types.js +2 -0
  34. package/dist/components/time-picker/types.js.map +1 -0
  35. package/dist/index.d.ts +4 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/metadata/componentMeta.d.ts.map +1 -1
  40. package/dist/metadata/componentMeta.js +4 -0
  41. package/dist/metadata/componentMeta.js.map +1 -1
  42. package/package.json +1 -1
  43. package/src/components/date-picker/DatePicker.tsx +242 -0
  44. package/src/components/date-picker/index.ts +2 -0
  45. package/src/components/date-picker/meta.ts +10 -0
  46. package/src/components/date-picker/types.ts +20 -0
  47. package/src/components/time-picker/TimePicker.tsx +152 -0
  48. package/src/components/time-picker/index.ts +2 -0
  49. package/src/components/time-picker/meta.ts +10 -0
  50. package/src/components/time-picker/types.ts +21 -0
  51. package/src/index.ts +4 -0
  52. package/src/metadata/componentMeta.ts +4 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.4.6
4
+
5
+ ### Patch Changes
6
+
7
+ - 884095d: Add DatePicker and TimePicker components backed by existing ZORA ActionSheet primitives.
8
+
3
9
  ## 2.4.5
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -301,6 +301,7 @@ Metadata model overview:
301
301
  - `CheckboxGroup`
302
302
  - `Chip`
303
303
  - `ChipGroup`
304
+ - `DataTable`
304
305
  - `DropdownMenu`
305
306
  - `Drawer`
306
307
  - `Form`
@@ -1131,6 +1132,193 @@ No inherited props. `ChipGroupProps` is declared directly by ZORA.
1131
1132
 
1132
1133
  </details>
1133
1134
 
1135
+ ### `DataTable`
1136
+
1137
+ Typed, app-facing tabular data display for admin lists, dashboards, commerce
1138
+ orders, transactions, inventory, reports, moderation queues, bookings, and other
1139
+ structured app screens.
1140
+
1141
+ `DataTable` is intentionally a ZORA component, not a Surface primitive. Surface
1142
+ provides the render foundation. ZORA owns the app-facing table behavior:
1143
+ columns, rows, sorting UI, row actions, loading/empty states, and responsive
1144
+ mobile fallback.
1145
+
1146
+ ```tsx
1147
+ type Order = {
1148
+ id: string;
1149
+ customer: string;
1150
+ status: 'paid' | 'pending' | 'failed';
1151
+ total: string;
1152
+ };
1153
+
1154
+ const orders: Order[] = [
1155
+ { id: 'ord-1001', customer: 'Nora Frei', status: 'paid', total: 'CHF 128' },
1156
+ { id: 'ord-1002', customer: 'Mika Baumann', status: 'pending', total: 'CHF 64' },
1157
+ ];
1158
+
1159
+ <DataTable
1160
+ columns={[
1161
+ { id: 'customer', header: 'Customer', accessor: 'customer', sortable: true },
1162
+ {
1163
+ id: 'status',
1164
+ header: 'Status',
1165
+ renderCell: ({ row }) => (
1166
+ <Badge color={row.status === 'paid' ? 'success' : 'warning'}>{row.status}</Badge>
1167
+ ),
1168
+ },
1169
+ { id: 'total', header: 'Total', accessor: 'total', align: 'end' },
1170
+ ]}
1171
+ rows={orders}
1172
+ rowId={(row) => row.id}
1173
+ />;
1174
+ ```
1175
+
1176
+ Use `rowActions` to attach contextual actions. Row actions are rendered through
1177
+ ZORA `DropdownMenu`, so `DataTable` does not invent its own overflow behavior.
1178
+
1179
+ ```tsx
1180
+ <DataTable
1181
+ columns={[
1182
+ { id: 'customer', header: 'Customer', accessor: 'customer' },
1183
+ { id: 'total', header: 'Total', accessor: 'total', align: 'end' },
1184
+ ]}
1185
+ rows={orders}
1186
+ rowId={(row) => row.id}
1187
+ rowActions={(row) => [
1188
+ {
1189
+ id: 'view',
1190
+ title: 'View',
1191
+ icon: { name: 'eye-outline' },
1192
+ onPress: () => viewOrder(row),
1193
+ },
1194
+ {
1195
+ id: 'refund',
1196
+ title: 'Refund',
1197
+ description: 'Start a refund workflow.',
1198
+ icon: { name: 'return-down-back-outline' },
1199
+ intent: 'danger',
1200
+ onPress: () => refundOrder(row),
1201
+ },
1202
+ ]}
1203
+ />
1204
+ ```
1205
+
1206
+ Use controlled sort state when a screen owns sorting:
1207
+
1208
+ ```tsx
1209
+ const [sort, setSort] = React.useState<DataTableSortState>({
1210
+ columnId: 'customer',
1211
+ direction: 'asc',
1212
+ });
1213
+
1214
+ <DataTable
1215
+ columns={[
1216
+ { id: 'customer', header: 'Customer', accessor: 'customer', sortable: true },
1217
+ { id: 'total', header: 'Total', accessor: 'total', align: 'end', sortable: true },
1218
+ ]}
1219
+ rows={orders}
1220
+ rowId={(row) => row.id}
1221
+ sort={sort}
1222
+ onSortChange={setSort}
1223
+ />;
1224
+ ```
1225
+
1226
+ `DataTable` renders a table-like layout on wider screens and a card/list fallback
1227
+ on narrow screens. It supports loading and empty states out of the box:
1228
+
1229
+ ```tsx
1230
+ <DataTable
1231
+ columns={columns}
1232
+ rows={orders}
1233
+ rowId={(row) => row.id}
1234
+ loading={isLoading}
1235
+ loadingRows={6}
1236
+ emptyTitle="No orders"
1237
+ emptyDescription="Orders will appear here when customers check out."
1238
+ />
1239
+ ```
1240
+
1241
+ V1 is intentionally not a spreadsheet or data grid. It does not include
1242
+ virtualization, column resizing, column pinning, inline editing, grouped rows,
1243
+ nested rows, server-side pagination controllers, or export features.
1244
+
1245
+ <details>
1246
+ <summary>Props</summary>
1247
+
1248
+ `DataTable` props:
1249
+
1250
+ | Prop | Type | Default | Notes |
1251
+ | ------------------ | -------------------------------------- | --------------------------------- | ------------------------------------------- |
1252
+ | `columns` | `readonly DataTableColumn<TRow>[]` | - | Column definitions. |
1253
+ | `rows` | `readonly TRow[]` | - | Row data. |
1254
+ | `rowId` | `(row: TRow, index: number) => string` | - | Stable row id resolver. |
1255
+ | `rowActions` | `(row, index) => DataTableRowAction[]` | - | Optional contextual row actions. |
1256
+ | `sort` | `DataTableSortState` | - | Controlled sort state. |
1257
+ | `onSortChange` | `(sort: DataTableSortState) => void` | - | Called when a sortable header is activated. |
1258
+ | `loading` | `boolean` | `false` | Shows loading placeholders. |
1259
+ | `loadingRows` | `number` | `5` | Placeholder row count while loading. |
1260
+ | `emptyTitle` | `React.ReactNode` | `'No data'` | Empty-state title. |
1261
+ | `emptyDescription` | `React.ReactNode` | `'There are no rows to display.'` | Empty-state description. |
1262
+ | `density` | `DataTableDensity` | `'comfortable'` | Row density: `comfortable` or `compact`. |
1263
+ | `testID` | `string` | - | Test id. |
1264
+ | `mode` | `ZoraThemeMode` | - | Optional scoped theme mode override. |
1265
+ | `themeId` | `ZoraThemeId` | - | Optional scoped theme id override. |
1266
+
1267
+ `DataTableColumn<TRow>` fields:
1268
+
1269
+ | Field | Type | Default | Notes |
1270
+ | ------------ | ---------------------------------------------------------- | ------- | ------------------------------------------ |
1271
+ | `id` | `string` | - | Stable column id. |
1272
+ | `header` | `React.ReactNode` | - | Header label. |
1273
+ | `accessor` | `keyof TRow` | - | Reads a primitive/date value from the row. |
1274
+ | `align` | `DataTableColumnAlign` | `start` | Cell alignment. |
1275
+ | `width` | `number` | - | Fixed column width. |
1276
+ | `minWidth` | `number` | `140` | Minimum column width. |
1277
+ | `sortable` | `boolean` | `false` | Enables sort header behavior. |
1278
+ | `renderCell` | `(context: DataTableCellContext<TRow>) => React.ReactNode` | - | Custom cell rendering. |
1279
+
1280
+ `DataTableCellContext<TRow>` fields:
1281
+
1282
+ | Field | Type | Notes |
1283
+ | ---------- | ----------------------- | ----------------------------- |
1284
+ | `row` | `TRow` | Current row. |
1285
+ | `rowIndex` | `number` | Current row index. |
1286
+ | `column` | `DataTableColumn<TRow>` | Current column. |
1287
+ | `value` | `unknown` | Accessor value, when present. |
1288
+
1289
+ `DataTableRowAction<TRow>` fields:
1290
+
1291
+ | Field | Type | Default | Notes |
1292
+ | ------------- | --------------------- | ------- | -------------------------------------------- |
1293
+ | `id` | `string` | - | Stable action id. |
1294
+ | `title` | `React.ReactNode` | - | Action label. |
1295
+ | `description` | `React.ReactNode` | - | Optional secondary text. |
1296
+ | `icon` | `ButtonIconSpec` | - | Optional action icon. |
1297
+ | `intent` | `MenuActionIntent` | - | Action intent, currently `default`/`danger`. |
1298
+ | `disabled` | `boolean` | `false` | Disables the action. |
1299
+ | `onPress` | `(row: TRow) => void` | - | Called with the row when selected. |
1300
+
1301
+ Type aliases:
1302
+
1303
+ ```ts
1304
+ type DataTableColumnAlign = 'start' | 'center' | 'end';
1305
+ type DataTableDensity = 'comfortable' | 'compact';
1306
+ type DataTableSortDirection = 'asc' | 'desc';
1307
+
1308
+ interface DataTableSortState {
1309
+ columnId: string;
1310
+ direction: DataTableSortDirection;
1311
+ }
1312
+ ```
1313
+
1314
+ Default cell rendering:
1315
+
1316
+ - `string`, `number`, `boolean`, `bigint`, and `Date` values render automatically.
1317
+ - `null` / `undefined` render as `—`.
1318
+ - Structured values render as `—` unless `renderCell` is provided.
1319
+
1320
+ </details>
1321
+
1134
1322
  ### `Textarea`
1135
1323
 
1136
1324
  Multiline text input wrapper with ZORA sizing and optional Surface icon specs.
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { DatePickerProps } from './types';
3
+ export declare const DatePicker: (props: DatePickerProps) => React.ReactElement | null;
4
+ //# sourceMappingURL=DatePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/DatePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAyO/C,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { Field } from '@ankhorage/surface';
2
+ import React from 'react';
3
+ import { Box, Stack } from '../../foundation';
4
+ import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
5
+ import { ActionSheet } from '../action-sheet';
6
+ import { Button } from '../button';
7
+ import { Text } from '../text';
8
+ const WEEKDAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
9
+ const DAY_CELL_WIDTH = 42;
10
+ function renderLabel(label, description) {
11
+ return (<Stack gap="xs">
12
+ <Text variant="label" weight="semiBold">
13
+ {label}
14
+ </Text>
15
+ {description ? (<Text emphasis="muted" variant="bodySmall">
16
+ {description}
17
+ </Text>) : null}
18
+ </Stack>);
19
+ }
20
+ function startOfLocalDay(value) {
21
+ return new Date(value.getFullYear(), value.getMonth(), value.getDate());
22
+ }
23
+ function isSameLocalDay(left, right) {
24
+ if (!left) {
25
+ return false;
26
+ }
27
+ return startOfLocalDay(left).getTime() === startOfLocalDay(right).getTime();
28
+ }
29
+ function isBeforeLocalDay(left, right) {
30
+ return startOfLocalDay(left).getTime() < startOfLocalDay(right).getTime();
31
+ }
32
+ function isAfterLocalDay(left, right) {
33
+ return startOfLocalDay(left).getTime() > startOfLocalDay(right).getTime();
34
+ }
35
+ function isDateDisabled(value, minDate, maxDate) {
36
+ if (minDate && isBeforeLocalDay(value, minDate)) {
37
+ return true;
38
+ }
39
+ if (maxDate && isAfterLocalDay(value, maxDate)) {
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ function formatMonthLabel(value) {
45
+ return value.toLocaleDateString(undefined, { month: 'long', year: 'numeric' });
46
+ }
47
+ function formatDefaultDate(value) {
48
+ return value.toLocaleDateString();
49
+ }
50
+ function createMonthDays(month) {
51
+ const firstDay = new Date(month.getFullYear(), month.getMonth(), 1);
52
+ const dayCount = new Date(month.getFullYear(), month.getMonth() + 1, 0).getDate();
53
+ const days = [];
54
+ for (let offset = 0; offset < firstDay.getDay(); offset += 1) {
55
+ days.push(null);
56
+ }
57
+ for (let day = 1; day <= dayCount; day += 1) {
58
+ days.push(new Date(month.getFullYear(), month.getMonth(), day));
59
+ }
60
+ while (days.length % 7 !== 0) {
61
+ days.push(null);
62
+ }
63
+ return days;
64
+ }
65
+ function resolveInitialMonth(value, minDate) {
66
+ const base = value ?? minDate ?? new Date();
67
+ return new Date(base.getFullYear(), base.getMonth(), 1);
68
+ }
69
+ function canNavigateToMonth(month, minDate, maxDate) {
70
+ const firstDay = new Date(month.getFullYear(), month.getMonth(), 1);
71
+ const lastDay = new Date(month.getFullYear(), month.getMonth() + 1, 0);
72
+ if (maxDate && isAfterLocalDay(firstDay, maxDate)) {
73
+ return false;
74
+ }
75
+ if (minDate && isBeforeLocalDay(lastDay, minDate)) {
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+ function DatePickerInner({ themeId: _themeId, mode: _mode, value, onValueChange, label, description, error, placeholder = 'Choose date', minDate, maxDate, disabled = false, required = false, formatDate, testID, }) {
81
+ const [visible, setVisible] = React.useState(false);
82
+ const [displayMonth, setDisplayMonth] = React.useState(() => resolveInitialMonth(value, minDate));
83
+ const monthDays = React.useMemo(() => createMonthDays(displayMonth), [displayMonth]);
84
+ const previousMonth = new Date(displayMonth.getFullYear(), displayMonth.getMonth() - 1, 1);
85
+ const nextMonth = new Date(displayMonth.getFullYear(), displayMonth.getMonth() + 1, 1);
86
+ const displayValue = value
87
+ ? formatDate
88
+ ? formatDate(value)
89
+ : formatDefaultDate(value)
90
+ : placeholder;
91
+ React.useEffect(() => {
92
+ if (visible) {
93
+ setDisplayMonth(resolveInitialMonth(value, minDate));
94
+ }
95
+ }, [minDate, value, visible]);
96
+ return (<Field disabled={disabled} errorText={error} invalid={Boolean(error)} label={label ? renderLabel(label, description) : undefined} required={required} testID={testID}>
97
+ <Button disabled={disabled} onPress={() => setVisible(true)} testID={testID ? `${testID}-trigger` : undefined} trailingIcon={{ name: 'calendar-outline' }} variant="outline">
98
+ {displayValue}
99
+ </Button>
100
+ <ActionSheet description={description} onDismiss={() => setVisible(false)} testID={testID ? `${testID}-sheet` : undefined} title={label ?? 'Choose date'} visible={visible}>
101
+ <Stack gap="m">
102
+ <Stack align="center" direction="row" justify="space-between">
103
+ <Button disabled={!canNavigateToMonth(previousMonth, minDate, maxDate)} onPress={() => setDisplayMonth(previousMonth)} size="s" variant="ghost">
104
+ Previous
105
+ </Button>
106
+ <Text align="center" variant="label" weight="semiBold">
107
+ {formatMonthLabel(displayMonth)}
108
+ </Text>
109
+ <Button disabled={!canNavigateToMonth(nextMonth, minDate, maxDate)} onPress={() => setDisplayMonth(nextMonth)} size="s" variant="ghost">
110
+ Next
111
+ </Button>
112
+ </Stack>
113
+
114
+ <Stack direction="row" justify="space-between">
115
+ {WEEKDAY_LABELS.map((weekday) => (<Box key={weekday} style={{ width: DAY_CELL_WIDTH }}>
116
+ <Text align="center" emphasis="muted" variant="caption" weight="semiBold">
117
+ {weekday}
118
+ </Text>
119
+ </Box>))}
120
+ </Stack>
121
+
122
+ <Stack direction="row" gap="xs" style={{ flexWrap: 'wrap' }}>
123
+ {monthDays.map((day, index) => {
124
+ if (!day) {
125
+ return <Box key={`empty-${index}`} style={{ width: DAY_CELL_WIDTH }}/>;
126
+ }
127
+ const selected = isSameLocalDay(value, day);
128
+ const dayDisabled = isDateDisabled(day, minDate, maxDate);
129
+ return (<Box key={day.toISOString()} style={{ width: DAY_CELL_WIDTH }}>
130
+ <Button color={selected ? 'primary' : 'neutral'} disabled={dayDisabled} onPress={() => {
131
+ onValueChange?.(startOfLocalDay(day));
132
+ setVisible(false);
133
+ }} size="s" testID={testID ? `${testID}-day-${day.getDate()}` : undefined} variant={selected ? 'solid' : 'ghost'}>
134
+ {day.getDate()}
135
+ </Button>
136
+ </Box>);
137
+ })}
138
+ </Stack>
139
+ </Stack>
140
+ </ActionSheet>
141
+ </Field>);
142
+ }
143
+ export const DatePicker = withZoraThemeScope(DatePickerInner);
144
+ //# sourceMappingURL=DatePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePicker.js","sourceRoot":"","sources":["../../../src/components/date-picker/DatePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAClF,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,SAAS,WAAW,CAAC,KAAsB,EAAE,WAAwC;IACnF,OAAO,CACL,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CACb;MAAA,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CACrC;QAAA,CAAC,KAAK,CACR;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,WAAW,CAAC,CAAC,CAAC,CACb,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CACxC;UAAA,CAAC,WAAW,CACd;QAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,IAAI,CACV;IAAA,EAAE,KAAK,CAAC,CACT,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAW;IAClC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB,EAAE,KAAW;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAU,EAAE,KAAW;IAC/C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,eAAe,CAAC,IAAU,EAAE,KAAW;IAC9C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,cAAc,CACrB,KAAW,EACX,OAAyB,EACzB,OAAyB;IAEzB,IAAI,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,IAAI,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAW;IACnC,OAAO,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAW;IACpC,OAAO,KAAK,CAAC,kBAAkB,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,eAAe,CAAC,KAAW;IAClC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAClF,MAAM,IAAI,GAAoB,EAAE,CAAC;IAEjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAkB,EAAE,OAAyB;IACxE,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC;IAC5C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAW,EACX,OAAyB,EACzB,OAAyB;IAEzB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvE,IAAI,OAAO,IAAI,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,IAAI,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,EACvB,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,KAAK,EACX,KAAK,EACL,aAAa,EACb,KAAK,EACL,WAAW,EACX,KAAK,EACL,WAAW,GAAG,aAAa,EAC3B,OAAO,EACP,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,UAAU,EACV,MAAM,GACU;IAChB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAClG,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,KAAK;QACxB,CAAC,CAAC,UAAU;YACV,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;YACnB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC5B,CAAC,CAAC,WAAW,CAAC;IAEhB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,eAAe,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,CAAC,KAAK,CACJ,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,SAAS,CAAC,CAAC,KAAK,CAAC,CACjB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACxB,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAC3D,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,MAAM,CAAC,CAAC,MAAM,CAAC,CAEf;MAAA,CAAC,MAAM,CACL,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAChC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CACjD,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAC3C,OAAO,CAAC,SAAS,CAEjB;QAAA,CAAC,YAAY,CACf;MAAA,EAAE,MAAM,CACR;MAAA,CAAC,WAAW,CACV,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CACnC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAC/C,KAAK,CAAC,CAAC,KAAK,IAAI,aAAa,CAAC,CAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,CAEjB;QAAA,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CACZ;UAAA,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAC3D;YAAA,CAAC,MAAM,CACL,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAC/D,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAC9C,IAAI,CAAC,GAAG,CACR,OAAO,CAAC,OAAO,CAEf;;YACF,EAAE,MAAM,CACR;YAAA,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CACpD;cAAA,CAAC,gBAAgB,CAAC,YAAY,CAAC,CACjC;YAAA,EAAE,IAAI,CACN;YAAA,CAAC,MAAM,CACL,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAC3D,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAC1C,IAAI,CAAC,GAAG,CACR,OAAO,CAAC,OAAO,CAEf;;YACF,EAAE,MAAM,CACV;UAAA,EAAE,KAAK,CAEP;;UAAA,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAC5C;YAAA,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC/B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAClD;gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CACvE;kBAAA,CAAC,OAAO,CACV;gBAAA,EAAE,IAAI,CACR;cAAA,EAAE,GAAG,CAAC,CACP,CAAC,CACJ;UAAA,EAAE,KAAK,CAEP;;UAAA,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAC1D;YAAA,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAG,CAAC;YAC1E,CAAC;YAED,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE1D,OAAO,CACL,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAC5D;kBAAA,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CACxC,QAAQ,CAAC,CAAC,WAAW,CAAC,CACtB,OAAO,CAAC,CAAC,GAAG,EAAE;oBACZ,aAAa,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;oBACtC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,CAAC,CACF,IAAI,CAAC,GAAG,CACR,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAC9D,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAEtC;oBAAA,CAAC,GAAG,CAAC,OAAO,EAAE,CAChB;kBAAA,EAAE,MAAM,CACV;gBAAA,EAAE,GAAG,CAAC,CACP,CAAC;QACJ,CAAC,CAAC,CACJ;UAAA,EAAE,KAAK,CACT;QAAA,EAAE,KAAK,CACT;MAAA,EAAE,WAAW,CACf;IAAA,EAAE,KAAK,CAAC,CACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC","sourcesContent":["import { Field } from '@ankhorage/surface';\nimport React from 'react';\n\nimport { Box, Stack } from '../../foundation';\nimport { withZoraThemeScope } from '../../theme/withZoraThemeScope';\nimport { ActionSheet } from '../action-sheet';\nimport { Button } from '../button';\nimport { Text } from '../text';\nimport type { DatePickerProps } from './types';\n\nconst WEEKDAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\nconst DAY_CELL_WIDTH = 42;\n\nfunction renderLabel(label: React.ReactNode, description: React.ReactNode | undefined) {\n return (\n <Stack gap=\"xs\">\n <Text variant=\"label\" weight=\"semiBold\">\n {label}\n </Text>\n {description ? (\n <Text emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n\nfunction startOfLocalDay(value: Date): Date {\n return new Date(value.getFullYear(), value.getMonth(), value.getDate());\n}\n\nfunction isSameLocalDay(left: Date | null, right: Date): boolean {\n if (!left) {\n return false;\n }\n\n return startOfLocalDay(left).getTime() === startOfLocalDay(right).getTime();\n}\n\nfunction isBeforeLocalDay(left: Date, right: Date): boolean {\n return startOfLocalDay(left).getTime() < startOfLocalDay(right).getTime();\n}\n\nfunction isAfterLocalDay(left: Date, right: Date): boolean {\n return startOfLocalDay(left).getTime() > startOfLocalDay(right).getTime();\n}\n\nfunction isDateDisabled(\n value: Date,\n minDate: Date | undefined,\n maxDate: Date | undefined,\n): boolean {\n if (minDate && isBeforeLocalDay(value, minDate)) {\n return true;\n }\n\n if (maxDate && isAfterLocalDay(value, maxDate)) {\n return true;\n }\n\n return false;\n}\n\nfunction formatMonthLabel(value: Date): string {\n return value.toLocaleDateString(undefined, { month: 'long', year: 'numeric' });\n}\n\nfunction formatDefaultDate(value: Date): string {\n return value.toLocaleDateString();\n}\n\nfunction createMonthDays(month: Date): (Date | null)[] {\n const firstDay = new Date(month.getFullYear(), month.getMonth(), 1);\n const dayCount = new Date(month.getFullYear(), month.getMonth() + 1, 0).getDate();\n const days: (Date | null)[] = [];\n\n for (let offset = 0; offset < firstDay.getDay(); offset += 1) {\n days.push(null);\n }\n\n for (let day = 1; day <= dayCount; day += 1) {\n days.push(new Date(month.getFullYear(), month.getMonth(), day));\n }\n\n while (days.length % 7 !== 0) {\n days.push(null);\n }\n\n return days;\n}\n\nfunction resolveInitialMonth(value: Date | null, minDate: Date | undefined): Date {\n const base = value ?? minDate ?? new Date();\n return new Date(base.getFullYear(), base.getMonth(), 1);\n}\n\nfunction canNavigateToMonth(\n month: Date,\n minDate: Date | undefined,\n maxDate: Date | undefined,\n): boolean {\n const firstDay = new Date(month.getFullYear(), month.getMonth(), 1);\n const lastDay = new Date(month.getFullYear(), month.getMonth() + 1, 0);\n\n if (maxDate && isAfterLocalDay(firstDay, maxDate)) {\n return false;\n }\n\n if (minDate && isBeforeLocalDay(lastDay, minDate)) {\n return false;\n }\n\n return true;\n}\n\nfunction DatePickerInner({\n themeId: _themeId,\n mode: _mode,\n value,\n onValueChange,\n label,\n description,\n error,\n placeholder = 'Choose date',\n minDate,\n maxDate,\n disabled = false,\n required = false,\n formatDate,\n testID,\n}: DatePickerProps) {\n const [visible, setVisible] = React.useState(false);\n const [displayMonth, setDisplayMonth] = React.useState(() => resolveInitialMonth(value, minDate));\n const monthDays = React.useMemo(() => createMonthDays(displayMonth), [displayMonth]);\n const previousMonth = new Date(displayMonth.getFullYear(), displayMonth.getMonth() - 1, 1);\n const nextMonth = new Date(displayMonth.getFullYear(), displayMonth.getMonth() + 1, 1);\n const displayValue = value\n ? formatDate\n ? formatDate(value)\n : formatDefaultDate(value)\n : placeholder;\n\n React.useEffect(() => {\n if (visible) {\n setDisplayMonth(resolveInitialMonth(value, minDate));\n }\n }, [minDate, value, visible]);\n\n return (\n <Field\n disabled={disabled}\n errorText={error}\n invalid={Boolean(error)}\n label={label ? renderLabel(label, description) : undefined}\n required={required}\n testID={testID}\n >\n <Button\n disabled={disabled}\n onPress={() => setVisible(true)}\n testID={testID ? `${testID}-trigger` : undefined}\n trailingIcon={{ name: 'calendar-outline' }}\n variant=\"outline\"\n >\n {displayValue}\n </Button>\n <ActionSheet\n description={description}\n onDismiss={() => setVisible(false)}\n testID={testID ? `${testID}-sheet` : undefined}\n title={label ?? 'Choose date'}\n visible={visible}\n >\n <Stack gap=\"m\">\n <Stack align=\"center\" direction=\"row\" justify=\"space-between\">\n <Button\n disabled={!canNavigateToMonth(previousMonth, minDate, maxDate)}\n onPress={() => setDisplayMonth(previousMonth)}\n size=\"s\"\n variant=\"ghost\"\n >\n Previous\n </Button>\n <Text align=\"center\" variant=\"label\" weight=\"semiBold\">\n {formatMonthLabel(displayMonth)}\n </Text>\n <Button\n disabled={!canNavigateToMonth(nextMonth, minDate, maxDate)}\n onPress={() => setDisplayMonth(nextMonth)}\n size=\"s\"\n variant=\"ghost\"\n >\n Next\n </Button>\n </Stack>\n\n <Stack direction=\"row\" justify=\"space-between\">\n {WEEKDAY_LABELS.map((weekday) => (\n <Box key={weekday} style={{ width: DAY_CELL_WIDTH }}>\n <Text align=\"center\" emphasis=\"muted\" variant=\"caption\" weight=\"semiBold\">\n {weekday}\n </Text>\n </Box>\n ))}\n </Stack>\n\n <Stack direction=\"row\" gap=\"xs\" style={{ flexWrap: 'wrap' }}>\n {monthDays.map((day, index) => {\n if (!day) {\n return <Box key={`empty-${index}`} style={{ width: DAY_CELL_WIDTH }} />;\n }\n\n const selected = isSameLocalDay(value, day);\n const dayDisabled = isDateDisabled(day, minDate, maxDate);\n\n return (\n <Box key={day.toISOString()} style={{ width: DAY_CELL_WIDTH }}>\n <Button\n color={selected ? 'primary' : 'neutral'}\n disabled={dayDisabled}\n onPress={() => {\n onValueChange?.(startOfLocalDay(day));\n setVisible(false);\n }}\n size=\"s\"\n testID={testID ? `${testID}-day-${day.getDate()}` : undefined}\n variant={selected ? 'solid' : 'ghost'}\n >\n {day.getDate()}\n </Button>\n </Box>\n );\n })}\n </Stack>\n </Stack>\n </ActionSheet>\n </Field>\n );\n}\n\nexport const DatePicker = withZoraThemeScope(DatePickerInner);\n"]}
@@ -0,0 +1,3 @@
1
+ export { DatePicker } from './DatePicker';
2
+ export type { DatePickerProps, DatePickerValue } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DatePicker } from './DatePicker';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/date-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { DatePicker } from './DatePicker';\nexport type { DatePickerProps, DatePickerValue } from './types';\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const datePickerMeta: {
2
+ readonly name: "DatePicker";
3
+ readonly category: "component";
4
+ readonly directManifestNode: false;
5
+ readonly allowedChildren: readonly [];
6
+ readonly note: "Code-facing ActionSheet-backed date picker; not represented as a manifest node in v1.";
7
+ readonly props: {};
8
+ };
9
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/meta.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;CAOW,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const datePickerMeta = {
2
+ name: 'DatePicker',
3
+ category: 'component',
4
+ directManifestNode: false,
5
+ allowedChildren: [],
6
+ note: 'Code-facing ActionSheet-backed date picker; not represented as a manifest node in v1.',
7
+ props: {},
8
+ };
9
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/components/date-picker/meta.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,WAAW;IACrB,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,EAAE;IACnB,IAAI,EAAE,uFAAuF;IAC7F,KAAK,EAAE,EAAE;CAC2B,CAAC","sourcesContent":["import type { ZoraComponentMeta } from '../../metadata';\n\nexport const datePickerMeta = {\n name: 'DatePicker',\n category: 'component',\n directManifestNode: false,\n allowedChildren: [],\n note: 'Code-facing ActionSheet-backed date picker; not represented as a manifest node in v1.',\n props: {},\n} as const satisfies ZoraComponentMeta;\n"]}
@@ -0,0 +1,18 @@
1
+ import type React from 'react';
2
+ import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
3
+ export type DatePickerValue = Date | null;
4
+ export interface DatePickerProps extends ZoraBaseProps {
5
+ value: DatePickerValue;
6
+ onValueChange?: (value: DatePickerValue) => void;
7
+ label?: React.ReactNode;
8
+ description?: React.ReactNode;
9
+ error?: React.ReactNode;
10
+ placeholder?: React.ReactNode;
11
+ minDate?: Date;
12
+ maxDate?: Date;
13
+ disabled?: boolean;
14
+ required?: boolean;
15
+ formatDate?: (value: Date) => React.ReactNode;
16
+ testID?: string;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/date-picker/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,KAAK,EAAE,eAAe,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/date-picker/types.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\n\nimport type { ZoraBaseProps } from '../../theme/ZoraBaseProps';\n\nexport type DatePickerValue = Date | null;\n\nexport interface DatePickerProps extends ZoraBaseProps {\n value: DatePickerValue;\n onValueChange?: (value: DatePickerValue) => void;\n label?: React.ReactNode;\n description?: React.ReactNode;\n error?: React.ReactNode;\n placeholder?: React.ReactNode;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n required?: boolean;\n formatDate?: (value: Date) => React.ReactNode;\n testID?: string;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { TimePickerProps } from './types';
3
+ export declare const TimePicker: (props: TimePickerProps) => React.ReactElement | null;
4
+ //# sourceMappingURL=TimePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/time-picker/TimePicker.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8I/C,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { Field } from '@ankhorage/surface';
2
+ import React from 'react';
3
+ import { ScrollView } from 'react-native';
4
+ import { Stack } from '../../foundation';
5
+ import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
6
+ import { ActionSheet, ActionSheetItem } from '../action-sheet';
7
+ import { Button } from '../button';
8
+ import { Text } from '../text';
9
+ const MINUTES_PER_DAY = 24 * 60;
10
+ const DEFAULT_STEP_MINUTES = 30;
11
+ function renderLabel(label, description) {
12
+ return (<Stack gap="xs">
13
+ <Text variant="label" weight="semiBold">
14
+ {label}
15
+ </Text>
16
+ {description ? (<Text emphasis="muted" variant="bodySmall">
17
+ {description}
18
+ </Text>) : null}
19
+ </Stack>);
20
+ }
21
+ function parseTimeToMinutes(value) {
22
+ if (!value) {
23
+ return undefined;
24
+ }
25
+ const match = /^(\d{2}):(\d{2})$/.exec(value);
26
+ if (!match) {
27
+ return undefined;
28
+ }
29
+ const hours = Number(match[1]);
30
+ const minutes = Number(match[2]);
31
+ if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
32
+ return undefined;
33
+ }
34
+ return hours * 60 + minutes;
35
+ }
36
+ function formatMinutes(value) {
37
+ const hours = Math.floor(value / 60);
38
+ const minutes = value % 60;
39
+ return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
40
+ }
41
+ function resolveStepMinutes(stepMinutes) {
42
+ if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {
43
+ return DEFAULT_STEP_MINUTES;
44
+ }
45
+ return Math.max(1, Math.floor(stepMinutes));
46
+ }
47
+ function generateTimeOptions({ minTime, maxTime, stepMinutes, }) {
48
+ const step = resolveStepMinutes(stepMinutes);
49
+ const min = parseTimeToMinutes(minTime) ?? 0;
50
+ const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;
51
+ const options = [];
52
+ for (let minute = 0; minute < MINUTES_PER_DAY; minute += step) {
53
+ if (minute >= min && minute <= max) {
54
+ options.push(formatMinutes(minute));
55
+ }
56
+ }
57
+ return options;
58
+ }
59
+ function TimePickerInner({ themeId: _themeId, mode: _mode, value, onValueChange, label, description, error, placeholder = 'Choose time', minTime, maxTime, stepMinutes, disabled = false, required = false, formatTime, testID, }) {
60
+ const [visible, setVisible] = React.useState(false);
61
+ const options = React.useMemo(() => generateTimeOptions({ maxTime, minTime, stepMinutes }), [maxTime, minTime, stepMinutes]);
62
+ const displayValue = value ? (formatTime ? formatTime(value) : value) : placeholder;
63
+ return (<Field disabled={disabled} errorText={error} invalid={Boolean(error)} label={label ? renderLabel(label, description) : undefined} required={required} testID={testID}>
64
+ <Button disabled={disabled} onPress={() => setVisible(true)} testID={testID ? `${testID}-trigger` : undefined} trailingIcon={{ name: 'chevron-down-outline' }} variant="outline">
65
+ {displayValue}
66
+ </Button>
67
+ <ActionSheet description={description} onDismiss={() => setVisible(false)} testID={testID ? `${testID}-sheet` : undefined} title={label ?? 'Choose time'} visible={visible}>
68
+ <ScrollView style={{ maxHeight: 360 }}>
69
+ <Stack gap="xxs">
70
+ {options.map((option) => (<ActionSheetItem key={option} label={formatTime ? formatTime(option) : option} onPress={() => {
71
+ onValueChange?.(option);
72
+ setVisible(false);
73
+ }} selected={option === value} testID={testID ? `${testID}-option-${option}` : undefined}/>))}
74
+ </Stack>
75
+ </ScrollView>
76
+ </ActionSheet>
77
+ </Field>);
78
+ }
79
+ export const TimePicker = withZoraThemeScope(TimePickerInner);
80
+ //# sourceMappingURL=TimePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["../../../src/components/time-picker/TimePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Field } from '@ankhorage/surface';\nimport React from 'react';\nimport { ScrollView } from 'react-native';\n\nimport { Stack } from '../../foundation';\nimport { withZoraThemeScope } from '../../theme/withZoraThemeScope';\nimport { ActionSheet, ActionSheetItem } from '../action-sheet';\nimport { Button } from '../button';\nimport { Text } from '../text';\nimport type { TimePickerProps } from './types';\n\nconst MINUTES_PER_DAY = 24 * 60;\nconst DEFAULT_STEP_MINUTES = 30;\n\nfunction renderLabel(label: React.ReactNode, description: React.ReactNode | undefined) {\n return (\n <Stack gap=\"xs\">\n <Text variant=\"label\" weight=\"semiBold\">\n {label}\n </Text>\n {description ? (\n <Text emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n\nfunction parseTimeToMinutes(value: string | undefined): number | undefined {\n if (!value) {\n return undefined;\n }\n\n const match = /^(\\d{2}):(\\d{2})$/.exec(value);\n if (!match) {\n return undefined;\n }\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {\n return undefined;\n }\n\n return hours * 60 + minutes;\n}\n\nfunction formatMinutes(value: number): string {\n const hours = Math.floor(value / 60);\n const minutes = value % 60;\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n\nfunction resolveStepMinutes(stepMinutes: number | undefined): number {\n if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {\n return DEFAULT_STEP_MINUTES;\n }\n\n return Math.max(1, Math.floor(stepMinutes));\n}\n\nfunction generateTimeOptions({\n minTime,\n maxTime,\n stepMinutes,\n}: Pick<TimePickerProps, 'maxTime' | 'minTime' | 'stepMinutes'>): string[] {\n const step = resolveStepMinutes(stepMinutes);\n const min = parseTimeToMinutes(minTime) ?? 0;\n const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;\n const options: string[] = [];\n\n for (let minute = 0; minute < MINUTES_PER_DAY; minute += step) {\n if (minute >= min && minute <= max) {\n options.push(formatMinutes(minute));\n }\n }\n\n return options;\n}\n\nfunction TimePickerInner({\n themeId: _themeId,\n mode: _mode,\n value,\n onValueChange,\n label,\n description,\n error,\n placeholder = 'Choose time',\n minTime,\n maxTime,\n stepMinutes,\n disabled = false,\n required = false,\n formatTime,\n testID,\n}: TimePickerProps) {\n const [visible, setVisible] = React.useState(false);\n const options = React.useMemo(\n () => generateTimeOptions({ maxTime, minTime, stepMinutes }),\n [maxTime, minTime, stepMinutes],\n );\n const displayValue = value ? (formatTime ? formatTime(value) : value) : placeholder;\n\n return (\n <Field\n disabled={disabled}\n errorText={error}\n invalid={Boolean(error)}\n label={label ? renderLabel(label, description) : undefined}\n required={required}\n testID={testID}\n >\n <Button\n disabled={disabled}\n onPress={() => setVisible(true)}\n testID={testID ? `${testID}-trigger` : undefined}\n trailingIcon={{ name: 'chevron-down-outline' }}\n variant=\"outline\"\n >\n {displayValue}\n </Button>\n <ActionSheet\n description={description}\n onDismiss={() => setVisible(false)}\n testID={testID ? `${testID}-sheet` : undefined}\n title={label ?? 'Choose time'}\n visible={visible}\n >\n <ScrollView style={{ maxHeight: 360 }}>\n <Stack gap=\"xxs\">\n {options.map((option) => (\n <ActionSheetItem\n key={option}\n label={formatTime ? formatTime(option) : option}\n onPress={() => {\n onValueChange?.(option);\n setVisible(false);\n }}\n selected={option === value}\n testID={testID ? `${testID}-option-${option}` : undefined}\n />\n ))}\n </Stack>\n </ScrollView>\n </ActionSheet>\n </Field>\n );\n}\n\nexport const TimePicker = withZoraThemeScope(TimePickerInner);\n"]}
@@ -0,0 +1,3 @@
1
+ export { TimePicker } from './TimePicker';
2
+ export type { TimePickerProps, TimePickerValue } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/time-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { TimePicker } from './TimePicker';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/time-picker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { TimePicker } from './TimePicker';\nexport type { TimePickerProps, TimePickerValue } from './types';\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const timePickerMeta: {
2
+ readonly name: "TimePicker";
3
+ readonly category: "component";
4
+ readonly directManifestNode: false;
5
+ readonly allowedChildren: readonly [];
6
+ readonly note: "Code-facing ActionSheet-backed time picker; not represented as a manifest node in v1.";
7
+ readonly props: {};
8
+ };
9
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/components/time-picker/meta.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;CAOW,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const timePickerMeta = {
2
+ name: 'TimePicker',
3
+ category: 'component',
4
+ directManifestNode: false,
5
+ allowedChildren: [],
6
+ note: 'Code-facing ActionSheet-backed time picker; not represented as a manifest node in v1.',
7
+ props: {},
8
+ };
9
+ //# sourceMappingURL=meta.js.map