jaci-ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +95 -0
- package/dist/components/button-group/button-group.cjs +22 -0
- package/dist/components/button-group/button-group.cjs.map +1 -0
- package/dist/components/button-group/button-group.d.cts +12 -0
- package/dist/components/button-group/button-group.d.ts +12 -0
- package/dist/components/button-group/button-group.js +21 -0
- package/dist/components/button-group/button-group.js.map +1 -0
- package/dist/components/button-group/index.d.cts +2 -0
- package/dist/components/button-group/index.d.ts +2 -0
- package/dist/components/calendar/calendar.cjs +377 -0
- package/dist/components/calendar/calendar.cjs.map +1 -0
- package/dist/components/calendar/calendar.d.cts +56 -0
- package/dist/components/calendar/calendar.d.ts +56 -0
- package/dist/components/calendar/calendar.js +368 -0
- package/dist/components/calendar/calendar.js.map +1 -0
- package/dist/components/calendar/index.d.cts +2 -0
- package/dist/components/calendar/index.d.ts +2 -0
- package/dist/components/combobox/combobox.cjs +13 -1
- package/dist/components/combobox/combobox.cjs.map +1 -1
- package/dist/components/combobox/combobox.d.cts +7 -2
- package/dist/components/combobox/combobox.d.ts +7 -2
- package/dist/components/combobox/combobox.js +13 -2
- package/dist/components/combobox/combobox.js.map +1 -1
- package/dist/components/combobox/index.d.cts +2 -2
- package/dist/components/combobox/index.d.ts +2 -2
- package/dist/components/controls/input.cjs +26 -5
- package/dist/components/controls/input.cjs.map +1 -1
- package/dist/components/controls/input.d.cts +5 -2
- package/dist/components/controls/input.d.ts +5 -2
- package/dist/components/controls/input.js +28 -7
- package/dist/components/controls/input.js.map +1 -1
- package/dist/components/controls/textarea.cjs +26 -5
- package/dist/components/controls/textarea.cjs.map +1 -1
- package/dist/components/controls/textarea.d.cts +5 -2
- package/dist/components/controls/textarea.d.ts +5 -2
- package/dist/components/controls/textarea.js +28 -7
- package/dist/components/controls/textarea.js.map +1 -1
- package/dist/components/date-picker/date-picker.cjs +9 -9
- package/dist/components/date-picker/date-picker.cjs.map +1 -1
- package/dist/components/date-picker/date-picker.d.cts +3 -1
- package/dist/components/date-picker/date-picker.d.ts +3 -1
- package/dist/components/date-picker/date-picker.js +9 -9
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.cjs +589 -0
- package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -0
- package/dist/components/date-range-picker/date-range-picker.d.cts +134 -0
- package/dist/components/date-range-picker/date-range-picker.d.ts +134 -0
- package/dist/components/date-range-picker/date-range-picker.js +568 -0
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -0
- package/dist/components/date-range-picker/index.d.cts +2 -0
- package/dist/components/date-range-picker/index.d.ts +2 -0
- package/dist/components/empty-state/empty-state.cjs +62 -0
- package/dist/components/empty-state/empty-state.cjs.map +1 -0
- package/dist/components/empty-state/empty-state.d.cts +18 -0
- package/dist/components/empty-state/empty-state.d.ts +18 -0
- package/dist/components/empty-state/empty-state.js +57 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/index.d.cts +2 -0
- package/dist/components/empty-state/index.d.ts +2 -0
- package/dist/components/field/field.cjs +106 -11
- package/dist/components/field/field.cjs.map +1 -1
- package/dist/components/field/field.d.cts +22 -4
- package/dist/components/field/field.d.ts +22 -4
- package/dist/components/field/field.js +107 -13
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/field/index.d.cts +2 -2
- package/dist/components/field/index.d.ts +2 -2
- package/dist/components/icon-button/icon-button.cjs +40 -0
- package/dist/components/icon-button/icon-button.cjs.map +1 -0
- package/dist/components/icon-button/icon-button.d.cts +12 -0
- package/dist/components/icon-button/icon-button.d.ts +12 -0
- package/dist/components/icon-button/icon-button.js +40 -0
- package/dist/components/icon-button/icon-button.js.map +1 -0
- package/dist/components/icon-button/index.d.cts +2 -0
- package/dist/components/icon-button/index.d.ts +2 -0
- package/dist/components/input-group/index.d.cts +2 -0
- package/dist/components/input-group/index.d.ts +2 -0
- package/dist/components/input-group/input-group.cjs +32 -0
- package/dist/components/input-group/input-group.cjs.map +1 -0
- package/dist/components/input-group/input-group.d.cts +15 -0
- package/dist/components/input-group/input-group.d.ts +15 -0
- package/dist/components/input-group/input-group.js +30 -0
- package/dist/components/input-group/input-group.js.map +1 -0
- package/dist/components/pin-input/index.d.cts +2 -0
- package/dist/components/pin-input/index.d.ts +2 -0
- package/dist/components/pin-input/pin-input.cjs +266 -0
- package/dist/components/pin-input/pin-input.cjs.map +1 -0
- package/dist/components/pin-input/pin-input.d.cts +46 -0
- package/dist/components/pin-input/pin-input.d.ts +46 -0
- package/dist/components/pin-input/pin-input.js +258 -0
- package/dist/components/pin-input/pin-input.js.map +1 -0
- package/dist/components/select/index.d.cts +2 -2
- package/dist/components/select/index.d.ts +2 -2
- package/dist/components/select/select.cjs +80 -3
- package/dist/components/select/select.cjs.map +1 -1
- package/dist/components/select/select.d.cts +18 -3
- package/dist/components/select/select.d.ts +18 -3
- package/dist/components/select/select.js +78 -5
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/tags-input/tags-input.cjs +83 -5
- package/dist/components/tags-input/tags-input.cjs.map +1 -1
- package/dist/components/tags-input/tags-input.d.cts +3 -0
- package/dist/components/tags-input/tags-input.d.ts +3 -0
- package/dist/components/tags-input/tags-input.js +83 -5
- package/dist/components/tags-input/tags-input.js.map +1 -1
- package/dist/components/upload/index.d.cts +2 -2
- package/dist/components/upload/index.d.ts +2 -2
- package/dist/components/upload/upload.cjs +90 -10
- package/dist/components/upload/upload.cjs.map +1 -1
- package/dist/components/upload/upload.d.cts +25 -2
- package/dist/components/upload/upload.d.ts +25 -2
- package/dist/components/upload/upload.js +89 -11
- package/dist/components/upload/upload.js.map +1 -1
- package/dist/index.cjs +70 -0
- package/dist/index.d.cts +21 -5
- package/dist/index.d.ts +21 -5
- package/dist/index.js +13 -5
- package/dist/styled-system/recipes/button-group.cjs +30 -0
- package/dist/styled-system/recipes/button-group.cjs.map +1 -0
- package/dist/styled-system/recipes/button-group.js +30 -0
- package/dist/styled-system/recipes/button-group.js.map +1 -0
- package/dist/styled-system/recipes/calendar.cjs +43 -0
- package/dist/styled-system/recipes/calendar.cjs.map +1 -0
- package/dist/styled-system/recipes/calendar.js +43 -0
- package/dist/styled-system/recipes/calendar.js.map +1 -0
- package/dist/styled-system/recipes/combobox.cjs +1 -0
- package/dist/styled-system/recipes/combobox.cjs.map +1 -1
- package/dist/styled-system/recipes/combobox.js +1 -0
- package/dist/styled-system/recipes/combobox.js.map +1 -1
- package/dist/styled-system/recipes/date-range-picker.cjs +52 -0
- package/dist/styled-system/recipes/date-range-picker.cjs.map +1 -0
- package/dist/styled-system/recipes/date-range-picker.js +52 -0
- package/dist/styled-system/recipes/date-range-picker.js.map +1 -0
- package/dist/styled-system/recipes/empty-state.cjs +36 -0
- package/dist/styled-system/recipes/empty-state.cjs.map +1 -0
- package/dist/styled-system/recipes/empty-state.js +36 -0
- package/dist/styled-system/recipes/empty-state.js.map +1 -0
- package/dist/styled-system/recipes/icon-button.cjs +40 -0
- package/dist/styled-system/recipes/icon-button.cjs.map +1 -0
- package/dist/styled-system/recipes/icon-button.js +40 -0
- package/dist/styled-system/recipes/icon-button.js.map +1 -0
- package/dist/styled-system/recipes/input-group.cjs +30 -0
- package/dist/styled-system/recipes/input-group.cjs.map +1 -0
- package/dist/styled-system/recipes/input-group.js +30 -0
- package/dist/styled-system/recipes/input-group.js.map +1 -0
- package/dist/styled-system/recipes/pin-input.cjs +39 -0
- package/dist/styled-system/recipes/pin-input.cjs.map +1 -0
- package/dist/styled-system/recipes/pin-input.js +39 -0
- package/dist/styled-system/recipes/pin-input.js.map +1 -0
- package/dist/styled-system/recipes/select.cjs +5 -1
- package/dist/styled-system/recipes/select.cjs.map +1 -1
- package/dist/styled-system/recipes/select.js +5 -1
- package/dist/styled-system/recipes/select.js.map +1 -1
- package/dist/styled-system/recipes/upload.cjs +2 -0
- package/dist/styled-system/recipes/upload.cjs.map +1 -1
- package/dist/styled-system/recipes/upload.js +2 -0
- package/dist/styled-system/recipes/upload.js.map +1 -1
- package/dist/styles/theme.cjs +15 -0
- package/dist/styles/theme.cjs.map +1 -1
- package/dist/styles/theme.js +15 -0
- package/dist/styles/theme.js.map +1 -1
- package/dist/styles.css +901 -46
- package/dist/theme/index.d.cts +2 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/theme-provider.cjs +86 -0
- package/dist/theme/theme-provider.cjs.map +1 -0
- package/dist/theme/theme-provider.d.cts +66 -0
- package/dist/theme/theme-provider.d.ts +66 -0
- package/dist/theme/theme-provider.js +85 -0
- package/dist/theme/theme-provider.js.map +1 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- bd92571: Add Calendar, DateRangePicker, and PinInput components, plus richer form field, input, tags, upload, and selection APIs.
|
|
8
|
+
|
|
9
|
+
## 0.3.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 60fe9f1: Add the optional ThemeProvider and reusable IconButton, ButtonGroup, InputGroup, and EmptyState components.
|
|
14
|
+
|
|
3
15
|
## 0.2.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -87,6 +87,68 @@ DatePicker supports day, month and date-time values while keeping the public val
|
|
|
87
87
|
Use `granularity="month"` to select a month normalized to its first day. Date-time popups stay
|
|
88
88
|
open until `DatePicker.Close` is activated; day and month modes close after selection by default.
|
|
89
89
|
|
|
90
|
+
`Calendar` is the standalone, server-renderable calendar engine. Pass `referenceDate` when the
|
|
91
|
+
initial view must be deterministic during SSR or tests:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
<Calendar.Root
|
|
95
|
+
defaultValue={new Date(2025, 3, 15, 12)}
|
|
96
|
+
referenceDate={new Date(2025, 3, 1, 12)}
|
|
97
|
+
locale="en-US"
|
|
98
|
+
>
|
|
99
|
+
<Calendar.Header>
|
|
100
|
+
<Calendar.Previous />
|
|
101
|
+
<Calendar.MonthSelect />
|
|
102
|
+
<Calendar.YearSelect />
|
|
103
|
+
<Calendar.Next />
|
|
104
|
+
</Calendar.Header>
|
|
105
|
+
<Calendar.Grid />
|
|
106
|
+
</Calendar.Root>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`DateRangePicker` keeps its value as local `Date` objects and supports native form fields,
|
|
110
|
+
previewing and optional closing after the second date:
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<DateRangePicker.Root name="period" closeOnSelect={false} referenceDate={new Date(2025, 3, 1, 12)}>
|
|
114
|
+
<DateRangePicker.Label>Period</DateRangePicker.Label>
|
|
115
|
+
<DateRangePicker.Trigger><DateRangePicker.Value /></DateRangePicker.Trigger>
|
|
116
|
+
<DateRangePicker.Portal>
|
|
117
|
+
<DateRangePicker.Positioner>
|
|
118
|
+
<DateRangePicker.Popup>
|
|
119
|
+
<DateRangePicker.Calendar />
|
|
120
|
+
<DateRangePicker.Preview />
|
|
121
|
+
<DateRangePicker.Close>Done</DateRangePicker.Close>
|
|
122
|
+
</DateRangePicker.Popup>
|
|
123
|
+
</DateRangePicker.Positioner>
|
|
124
|
+
</DateRangePicker.Portal>
|
|
125
|
+
</DateRangePicker.Root>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
For one-time codes, `PinInput` generates one accessible input per character and supports paste,
|
|
129
|
+
auto-advance, password masking and native form submission:
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
<PinInput.Root length={6} name="verification-code" otp onComplete={verifyCode}>
|
|
133
|
+
<PinInput.Label>Verification code</PinInput.Label>
|
|
134
|
+
<PinInput.Control><PinInput.Inputs /></PinInput.Control>
|
|
135
|
+
</PinInput.Root>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Small composition helpers keep common layouts consistent:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import { Button, ButtonGroup, EmptyState, IconButton, Input, InputGroup } from "jaci-ui";
|
|
142
|
+
|
|
143
|
+
<IconButton aria-label="Close">×</IconButton>;
|
|
144
|
+
<ButtonGroup><Button>Save</Button><Button>Cancel</Button></ButtonGroup>;
|
|
145
|
+
<InputGroup><InputGroup.Addon>https://</InputGroup.Addon><Input aria-label="URL" /></InputGroup>;
|
|
146
|
+
<EmptyState.Root><EmptyState.Title>No results</EmptyState.Title></EmptyState.Root>;
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
`IconButton` requires an accessible label for icon-only content. `ButtonGroup` and `InputGroup`
|
|
150
|
+
also expose `.Root` aliases for compound composition.
|
|
151
|
+
|
|
90
152
|
## Server rendering and frameworks
|
|
91
153
|
|
|
92
154
|
Static components are server-safe and interactive modules preserve their `"use client"` boundary.
|
|
@@ -128,6 +190,39 @@ the public CSS variables without a provider:
|
|
|
128
190
|
}
|
|
129
191
|
```
|
|
130
192
|
|
|
193
|
+
For applications that prefer a React API, `ThemeProvider` is optional. It can control the mode
|
|
194
|
+
and apply token overrides to only its subtree:
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { ThemeProvider, useTheme } from "jaci-ui";
|
|
198
|
+
|
|
199
|
+
function ThemeToggle() {
|
|
200
|
+
const { resolvedTheme, setTheme } = useTheme();
|
|
201
|
+
return <button onClick={() => setTheme(resolvedTheme === "dark" ? "light" : "dark")}>Toggle</button>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function App() {
|
|
205
|
+
return (
|
|
206
|
+
<ThemeProvider
|
|
207
|
+
defaultTheme="system"
|
|
208
|
+
ssrTheme="light"
|
|
209
|
+
tokens={{
|
|
210
|
+
colors: {
|
|
211
|
+
accent: { default: "#7c3aed", hover: "#6d28d9" },
|
|
212
|
+
fg: { onAccent: "#ffffff" },
|
|
213
|
+
},
|
|
214
|
+
}}
|
|
215
|
+
>
|
|
216
|
+
<ThemeToggle />
|
|
217
|
+
</ThemeProvider>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`system` uses `ssrTheme` during server rendering and reads `prefers-color-scheme` only after
|
|
223
|
+
mounting. The provider is a client module, so Next.js App Router applications should place it
|
|
224
|
+
inside a client boundary. Direct `data-jaci-theme` and `--jaci-*` variables remain supported.
|
|
225
|
+
|
|
131
226
|
The package exposes semantic surface, foreground, border, status, spacing, radius, shadow and
|
|
132
227
|
transition tokens. See the Theming guide in Storybook for the complete token vocabulary.
|
|
133
228
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const require_cx = require("../../styled-system/css/cx.cjs");
|
|
2
|
+
const require_button_group = require("../../styled-system/recipes/button-group.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
+
//#region src/components/button-group/button-group.tsx
|
|
6
|
+
const ButtonGroupRoot = (0, react.forwardRef)(function ButtonGroup({ className, orientation = "horizontal", ...props }, ref) {
|
|
7
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8
|
+
...props,
|
|
9
|
+
ref,
|
|
10
|
+
className: require_cx.cx(require_button_group.buttonGroup({ orientation }).root, className),
|
|
11
|
+
"data-jaci-component": "button-group",
|
|
12
|
+
"data-orientation": orientation,
|
|
13
|
+
"data-slot": "button-group",
|
|
14
|
+
role: props.role ?? "group"
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
const ButtonGroup = Object.assign(ButtonGroupRoot, { Root: ButtonGroupRoot });
|
|
18
|
+
//#endregion
|
|
19
|
+
exports.ButtonGroup = ButtonGroup;
|
|
20
|
+
exports.ButtonGroupRoot = ButtonGroupRoot;
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=button-group.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-group.cjs","names":["cx","buttonGroup"],"sources":["../../../src/components/button-group/button-group.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { buttonGroup } from \"../../styled-system/recipes\";\n\nexport interface ButtonGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const ButtonGroupRoot = forwardRef<HTMLDivElement, ButtonGroupProps>(function ButtonGroup(\n { className, orientation = \"horizontal\", ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(buttonGroup({ orientation }).root, className)}\n data-jaci-component=\"button-group\"\n data-orientation={orientation}\n data-slot=\"button-group\"\n role={props.role ?? \"group\"}\n />\n );\n});\n\nexport const ButtonGroup = Object.assign(ButtonGroupRoot, { Root: ButtonGroupRoot });\n"],"mappings":";;;;;AAUA,MAAa,mBAAA,GAAA,MAAA,WAAA,CAA+D,SAAS,YACnF,EAAE,WAAW,cAAc,cAAc,GAAG,SAC5C,KACA;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,GAAI;EACC;EACL,WAAWA,WAAAA,GAAGC,qBAAAA,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,SAAS;EAC1D,uBAAoB;EACpB,oBAAkB;EAClB,aAAU;EACV,MAAM,MAAM,QAAQ;CACrB,CAAA;AAEL,CAAC;AAED,MAAa,cAAc,OAAO,OAAO,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef } from "react";
|
|
2
|
+
//#region src/components/button-group/button-group.d.ts
|
|
3
|
+
interface ButtonGroupProps extends ComponentPropsWithoutRef<"div"> {
|
|
4
|
+
orientation?: "horizontal" | "vertical";
|
|
5
|
+
}
|
|
6
|
+
declare const ButtonGroupRoot: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
7
|
+
declare const ButtonGroup: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>> & {
|
|
8
|
+
Root: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { ButtonGroup, ButtonGroupProps, ButtonGroupRoot };
|
|
12
|
+
//# sourceMappingURL=button-group.d.cts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComponentPropsWithoutRef } from "react";
|
|
2
|
+
//#region src/components/button-group/button-group.d.ts
|
|
3
|
+
interface ButtonGroupProps extends ComponentPropsWithoutRef<"div"> {
|
|
4
|
+
orientation?: "horizontal" | "vertical";
|
|
5
|
+
}
|
|
6
|
+
declare const ButtonGroupRoot: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
7
|
+
declare const ButtonGroup: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>> & {
|
|
8
|
+
Root: import("react").ForwardRefExoticComponent<ButtonGroupProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { ButtonGroup, ButtonGroupProps, ButtonGroupRoot };
|
|
12
|
+
//# sourceMappingURL=button-group.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { cx } from "../../styled-system/css/cx.js";
|
|
2
|
+
import { buttonGroup } from "../../styled-system/recipes/button-group.js";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/button-group/button-group.tsx
|
|
6
|
+
const ButtonGroupRoot = forwardRef(function ButtonGroup({ className, orientation = "horizontal", ...props }, ref) {
|
|
7
|
+
return /* @__PURE__ */ jsx("div", {
|
|
8
|
+
...props,
|
|
9
|
+
ref,
|
|
10
|
+
className: cx(buttonGroup({ orientation }).root, className),
|
|
11
|
+
"data-jaci-component": "button-group",
|
|
12
|
+
"data-orientation": orientation,
|
|
13
|
+
"data-slot": "button-group",
|
|
14
|
+
role: props.role ?? "group"
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
const ButtonGroup = Object.assign(ButtonGroupRoot, { Root: ButtonGroupRoot });
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ButtonGroup, ButtonGroupRoot };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=button-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-group.js","names":[],"sources":["../../../src/components/button-group/button-group.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { buttonGroup } from \"../../styled-system/recipes\";\n\nexport interface ButtonGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nexport const ButtonGroupRoot = forwardRef<HTMLDivElement, ButtonGroupProps>(function ButtonGroup(\n { className, orientation = \"horizontal\", ...props },\n ref,\n) {\n return (\n <div\n {...props}\n ref={ref}\n className={cx(buttonGroup({ orientation }).root, className)}\n data-jaci-component=\"button-group\"\n data-orientation={orientation}\n data-slot=\"button-group\"\n role={props.role ?? \"group\"}\n />\n );\n});\n\nexport const ButtonGroup = Object.assign(ButtonGroupRoot, { Root: ButtonGroupRoot });\n"],"mappings":";;;;;AAUA,MAAa,kBAAkB,WAA6C,SAAS,YACnF,EAAE,WAAW,cAAc,cAAc,GAAG,SAC5C,KACA;CACA,OACE,oBAAC,OAAD;EACE,GAAI;EACC;EACL,WAAW,GAAG,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,SAAS;EAC1D,uBAAoB;EACpB,oBAAkB;EAClB,aAAU;EACV,MAAM,MAAM,QAAQ;CACrB,CAAA;AAEL,CAAC;AAED,MAAa,cAAc,OAAO,OAAO,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_cx = require("../../styled-system/css/cx.cjs");
|
|
3
|
+
const require_calendar = require("../../styled-system/recipes/calendar.cjs");
|
|
4
|
+
const require_date_utils = require("../date-picker/date-utils.cjs");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
//#region src/components/calendar/calendar.tsx
|
|
8
|
+
const CalendarContext = (0, react.createContext)(null);
|
|
9
|
+
function useCalendarContext() {
|
|
10
|
+
const context = (0, react.useContext)(CalendarContext);
|
|
11
|
+
if (!context) throw new Error("Calendar parts must be rendered inside Calendar.Root.");
|
|
12
|
+
return context;
|
|
13
|
+
}
|
|
14
|
+
function sameMonth(left, right) {
|
|
15
|
+
return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth();
|
|
16
|
+
}
|
|
17
|
+
const CalendarRoot = (0, react.forwardRef)(function CalendarRoot({ children, className, defaultValue = null, disabled = false, isDateDisabled, locale = "pt-BR", maxDate, minDate, onValueChange, referenceDate, value: controlledValue, weekStartsOn = 0, yearRange: configuredYearRange, ...props }, ref) {
|
|
18
|
+
const initialDate = controlledValue ?? defaultValue ?? referenceDate ?? /* @__PURE__ */ new Date();
|
|
19
|
+
const [uncontrolledValue, setUncontrolledValue] = (0, react.useState)(defaultValue);
|
|
20
|
+
const selected = controlledValue === void 0 ? uncontrolledValue : controlledValue;
|
|
21
|
+
const [month, setMonthState] = (0, react.useState)(() => require_date_utils.startOfMonth(initialDate));
|
|
22
|
+
const [focusedDate, setFocusedDate] = (0, react.useState)(selected ?? initialDate);
|
|
23
|
+
const dayRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
24
|
+
const calendarId = (0, react.useId)();
|
|
25
|
+
const styles = require_calendar.calendar();
|
|
26
|
+
const today = (0, react.useMemo)(() => require_date_utils.createCalendarDate((referenceDate ?? /* @__PURE__ */ new Date()).getFullYear(), (referenceDate ?? /* @__PURE__ */ new Date()).getMonth(), (referenceDate ?? /* @__PURE__ */ new Date()).getDate()), [referenceDate]);
|
|
27
|
+
const minMonth = minDate ? require_date_utils.startOfMonth(minDate) : void 0;
|
|
28
|
+
const maxMonth = maxDate ? require_date_utils.startOfMonth(maxDate) : void 0;
|
|
29
|
+
const yearRange = (0, react.useMemo)(() => {
|
|
30
|
+
const start = configuredYearRange?.start ?? today.getFullYear() - 100;
|
|
31
|
+
const end = configuredYearRange?.end ?? today.getFullYear() + 20;
|
|
32
|
+
const years = [
|
|
33
|
+
selected?.getFullYear(),
|
|
34
|
+
minDate?.getFullYear(),
|
|
35
|
+
maxDate?.getFullYear()
|
|
36
|
+
].filter((year) => year !== void 0);
|
|
37
|
+
return {
|
|
38
|
+
start: Math.min(start, end, ...years),
|
|
39
|
+
end: Math.max(start, end, ...years)
|
|
40
|
+
};
|
|
41
|
+
}, [
|
|
42
|
+
configuredYearRange?.end,
|
|
43
|
+
configuredYearRange?.start,
|
|
44
|
+
maxDate,
|
|
45
|
+
minDate,
|
|
46
|
+
selected,
|
|
47
|
+
today
|
|
48
|
+
]);
|
|
49
|
+
const dateDisabled = (0, react.useCallback)((date) => Boolean(minDate && require_date_utils.isBeforeDay(date, minDate) || maxDate && require_date_utils.isAfterDay(date, maxDate) || isDateDisabled?.(date)), [
|
|
50
|
+
isDateDisabled,
|
|
51
|
+
maxDate,
|
|
52
|
+
minDate
|
|
53
|
+
]);
|
|
54
|
+
const monthDisabled = (0, react.useCallback)((date) => {
|
|
55
|
+
const first = require_date_utils.startOfMonth(date);
|
|
56
|
+
const last = require_date_utils.createCalendarDate(date.getFullYear(), date.getMonth() + 1, 0);
|
|
57
|
+
return Boolean(minDate && require_date_utils.isBeforeDay(last, minDate) || maxDate && require_date_utils.isAfterDay(first, maxDate));
|
|
58
|
+
}, [maxDate, minDate]);
|
|
59
|
+
const clampMonth = (0, react.useCallback)((date) => {
|
|
60
|
+
const normalized = require_date_utils.startOfMonth(date);
|
|
61
|
+
if (minMonth && require_date_utils.isBeforeDay(normalized, minMonth)) return minMonth;
|
|
62
|
+
if (maxMonth && require_date_utils.isAfterDay(normalized, maxMonth)) return maxMonth;
|
|
63
|
+
return normalized;
|
|
64
|
+
}, [maxMonth, minMonth]);
|
|
65
|
+
const setMonth = (0, react.useCallback)((date) => setMonthState(clampMonth(date)), [clampMonth]);
|
|
66
|
+
const canNavigate = (0, react.useCallback)((amount) => {
|
|
67
|
+
const next = require_date_utils.addMonths(month, amount);
|
|
68
|
+
return !(minMonth && require_date_utils.isBeforeDay(next, minMonth)) && !(maxMonth && require_date_utils.isAfterDay(next, maxMonth));
|
|
69
|
+
}, [
|
|
70
|
+
maxMonth,
|
|
71
|
+
minMonth,
|
|
72
|
+
month
|
|
73
|
+
]);
|
|
74
|
+
const setValue = (0, react.useCallback)((nextValue) => {
|
|
75
|
+
if (controlledValue === void 0) setUncontrolledValue(nextValue);
|
|
76
|
+
onValueChange?.(nextValue);
|
|
77
|
+
}, [controlledValue, onValueChange]);
|
|
78
|
+
const onSelect = (0, react.useCallback)((date) => {
|
|
79
|
+
if (disabled || dateDisabled(date)) return;
|
|
80
|
+
const next = require_date_utils.createCalendarDate(date.getFullYear(), date.getMonth(), date.getDate());
|
|
81
|
+
setValue(next);
|
|
82
|
+
setFocusedDate(next);
|
|
83
|
+
setMonth(next);
|
|
84
|
+
}, [
|
|
85
|
+
dateDisabled,
|
|
86
|
+
disabled,
|
|
87
|
+
setMonth,
|
|
88
|
+
setValue
|
|
89
|
+
]);
|
|
90
|
+
const focusDate = (0, react.useCallback)((date, direction = 1) => {
|
|
91
|
+
let next = require_date_utils.createCalendarDate(date.getFullYear(), date.getMonth(), date.getDate());
|
|
92
|
+
const step = direction < 0 ? -1 : 1;
|
|
93
|
+
let attempts = 0;
|
|
94
|
+
while (dateDisabled(next) && attempts < 366) {
|
|
95
|
+
next = require_date_utils.addDays(next, step);
|
|
96
|
+
attempts += 1;
|
|
97
|
+
}
|
|
98
|
+
setFocusedDate(next);
|
|
99
|
+
setMonth(next);
|
|
100
|
+
const focusTarget = () => dayRefs.current.get(require_date_utils.dateKey(next))?.focus();
|
|
101
|
+
focusTarget();
|
|
102
|
+
queueMicrotask(focusTarget);
|
|
103
|
+
}, [dateDisabled, setMonth]);
|
|
104
|
+
const selectMonth = (0, react.useCallback)((monthIndex) => setMonth(require_date_utils.createCalendarDate(month.getFullYear(), monthIndex, 1)), [month, setMonth]);
|
|
105
|
+
const selectYear = (0, react.useCallback)((year) => setMonth(require_date_utils.createCalendarDate(year, month.getMonth(), 1)), [month, setMonth]);
|
|
106
|
+
const registerDay = (0, react.useCallback)((key, node) => {
|
|
107
|
+
if (node) dayRefs.current.set(key, node);
|
|
108
|
+
else dayRefs.current.delete(key);
|
|
109
|
+
}, []);
|
|
110
|
+
(0, react.useEffect)(() => {
|
|
111
|
+
if (!selected) return;
|
|
112
|
+
setFocusedDate(selected);
|
|
113
|
+
setMonthState((current) => sameMonth(current, selected) ? current : clampMonth(selected));
|
|
114
|
+
}, [clampMonth, selected]);
|
|
115
|
+
const context = {
|
|
116
|
+
calendarId,
|
|
117
|
+
canNavigate,
|
|
118
|
+
dateDisabled,
|
|
119
|
+
disabled,
|
|
120
|
+
focusedDate,
|
|
121
|
+
focusDate,
|
|
122
|
+
locale,
|
|
123
|
+
month,
|
|
124
|
+
monthDisabled,
|
|
125
|
+
onSelect,
|
|
126
|
+
registerDay,
|
|
127
|
+
selected,
|
|
128
|
+
selectMonth,
|
|
129
|
+
selectYear,
|
|
130
|
+
setMonth,
|
|
131
|
+
styles,
|
|
132
|
+
today,
|
|
133
|
+
weekStartsOn,
|
|
134
|
+
yearRange
|
|
135
|
+
};
|
|
136
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarContext.Provider, {
|
|
137
|
+
value: context,
|
|
138
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
|
|
139
|
+
...props,
|
|
140
|
+
"aria-label": props["aria-label"] ?? require_date_utils.formatMonthLabel(month, locale),
|
|
141
|
+
className: require_cx.cx(styles.root, className),
|
|
142
|
+
"data-jaci-component": "calendar",
|
|
143
|
+
"data-slot": "calendar",
|
|
144
|
+
ref,
|
|
145
|
+
children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CalendarHeader, { children: [
|
|
146
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarPrevious, {}),
|
|
147
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarCaption, {}),
|
|
148
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarNext, {})
|
|
149
|
+
] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarGrid, {})] })
|
|
150
|
+
})
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
const CalendarHeader = (0, react.forwardRef)(function CalendarHeader({ className, ...props }, ref) {
|
|
154
|
+
const { styles } = useCalendarContext();
|
|
155
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
156
|
+
...props,
|
|
157
|
+
className: require_cx.cx(styles.header, className),
|
|
158
|
+
"data-slot": "calendar-header",
|
|
159
|
+
ref
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
const CalendarCaption = (0, react.forwardRef)(function CalendarCaption({ children, className, ...props }, ref) {
|
|
163
|
+
const { locale, month, styles } = useCalendarContext();
|
|
164
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
165
|
+
...props,
|
|
166
|
+
className: require_cx.cx(styles.caption, className),
|
|
167
|
+
"data-slot": "calendar-caption",
|
|
168
|
+
ref,
|
|
169
|
+
children: children ?? require_date_utils.formatMonthLabel(month, locale)
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
const CalendarNavigationButton = (0, react.forwardRef)(function CalendarNavigationButton({ amount = 1, children, className, onClick, ...props }, ref) {
|
|
173
|
+
const { canNavigate, month, setMonth, styles } = useCalendarContext();
|
|
174
|
+
const isDisabled = props.disabled || !canNavigate(amount);
|
|
175
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
176
|
+
...props,
|
|
177
|
+
"aria-label": props["aria-label"] ?? (amount < 0 ? "Previous month" : "Next month"),
|
|
178
|
+
className: require_cx.cx(styles.navigation, className),
|
|
179
|
+
"data-slot": amount < 0 ? "calendar-previous" : "calendar-next",
|
|
180
|
+
disabled: isDisabled,
|
|
181
|
+
onClick: (event) => {
|
|
182
|
+
if (!isDisabled) setMonth(require_date_utils.addMonths(month, amount));
|
|
183
|
+
onClick?.(event);
|
|
184
|
+
},
|
|
185
|
+
ref,
|
|
186
|
+
type: "button",
|
|
187
|
+
children: children ?? (amount < 0 ? "‹" : "›")
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
const CalendarPrevious = (0, react.forwardRef)(function CalendarPrevious(props, ref) {
|
|
191
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarNavigationButton, {
|
|
192
|
+
...props,
|
|
193
|
+
amount: -1,
|
|
194
|
+
ref
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
const CalendarNext = (0, react.forwardRef)(function CalendarNext(props, ref) {
|
|
198
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarNavigationButton, {
|
|
199
|
+
...props,
|
|
200
|
+
amount: 1,
|
|
201
|
+
ref
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
const CalendarMonthSelect = (0, react.forwardRef)(function CalendarMonthSelect({ className, ...props }, ref) {
|
|
205
|
+
const { locale, month, monthDisabled, selectMonth, styles } = useCalendarContext();
|
|
206
|
+
const labels = Array.from({ length: 12 }, (_, index) => new Intl.DateTimeFormat(locale, { month: "long" }).format(require_date_utils.createCalendarDate(2024, index, 1)));
|
|
207
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
|
|
208
|
+
...props,
|
|
209
|
+
"aria-label": props["aria-label"] ?? "Select month",
|
|
210
|
+
className: require_cx.cx(styles.monthSelect, className),
|
|
211
|
+
"data-slot": "calendar-month-select",
|
|
212
|
+
onChange: (event) => selectMonth(Number(event.currentTarget.value)),
|
|
213
|
+
ref,
|
|
214
|
+
value: month.getMonth(),
|
|
215
|
+
children: labels.map((label, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
216
|
+
disabled: monthDisabled(require_date_utils.createCalendarDate(month.getFullYear(), index, 1)),
|
|
217
|
+
value: index,
|
|
218
|
+
children: label
|
|
219
|
+
}, label))
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
const CalendarYearSelect = (0, react.forwardRef)(function CalendarYearSelect({ className, ...props }, ref) {
|
|
223
|
+
const { month, monthDisabled, selectYear, styles, yearRange } = useCalendarContext();
|
|
224
|
+
const years = Array.from({ length: yearRange.end - yearRange.start + 1 }, (_, index) => yearRange.start + index);
|
|
225
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
|
|
226
|
+
...props,
|
|
227
|
+
"aria-label": props["aria-label"] ?? "Select year",
|
|
228
|
+
className: require_cx.cx(styles.yearSelect, className),
|
|
229
|
+
"data-slot": "calendar-year-select",
|
|
230
|
+
onChange: (event) => selectYear(Number(event.currentTarget.value)),
|
|
231
|
+
ref,
|
|
232
|
+
value: month.getFullYear(),
|
|
233
|
+
children: years.map((year) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
234
|
+
disabled: monthDisabled(require_date_utils.createCalendarDate(year, month.getMonth(), 1)),
|
|
235
|
+
value: year,
|
|
236
|
+
children: year
|
|
237
|
+
}, year))
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
const CalendarDay = (0, react.forwardRef)(function CalendarDay({ children, className, date, disabled, onClick, onKeyDown, ...props }, ref) {
|
|
241
|
+
const { dateDisabled, disabled: calendarDisabled, focusDate, focusedDate, locale, month, onSelect, registerDay, selected, styles, today, weekStartsOn } = useCalendarContext();
|
|
242
|
+
const key = require_date_utils.dateKey(date);
|
|
243
|
+
const outsideMonth = !sameMonth(date, month);
|
|
244
|
+
const isDisabled = Boolean(disabled || calendarDisabled || dateDisabled(date));
|
|
245
|
+
const isSelected = require_date_utils.isSameDay(date, selected);
|
|
246
|
+
const isFocused = require_date_utils.isSameDay(date, focusedDate);
|
|
247
|
+
const isToday = require_date_utils.isSameDay(date, today);
|
|
248
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
249
|
+
...props,
|
|
250
|
+
"aria-label": props["aria-label"] ?? new Intl.DateTimeFormat(locale, { dateStyle: "full" }).format(date),
|
|
251
|
+
"aria-current": isToday ? "date" : void 0,
|
|
252
|
+
"aria-selected": isSelected,
|
|
253
|
+
className: require_cx.cx(styles.day, className),
|
|
254
|
+
"data-date": key,
|
|
255
|
+
"data-disabled": isDisabled || void 0,
|
|
256
|
+
"data-outside-month": outsideMonth || void 0,
|
|
257
|
+
"data-selected": isSelected || void 0,
|
|
258
|
+
"data-slot": "calendar-day",
|
|
259
|
+
"data-today": isToday || void 0,
|
|
260
|
+
disabled: isDisabled,
|
|
261
|
+
onClick: (event) => {
|
|
262
|
+
onSelect(date);
|
|
263
|
+
onClick?.(event);
|
|
264
|
+
},
|
|
265
|
+
onKeyDown: (event) => {
|
|
266
|
+
if (!event.defaultPrevented) {
|
|
267
|
+
let nextDate;
|
|
268
|
+
switch (event.key) {
|
|
269
|
+
case "ArrowLeft":
|
|
270
|
+
nextDate = require_date_utils.addDays(date, -1);
|
|
271
|
+
break;
|
|
272
|
+
case "ArrowRight":
|
|
273
|
+
nextDate = require_date_utils.addDays(date, 1);
|
|
274
|
+
break;
|
|
275
|
+
case "ArrowUp":
|
|
276
|
+
nextDate = require_date_utils.addDays(date, -7);
|
|
277
|
+
break;
|
|
278
|
+
case "ArrowDown":
|
|
279
|
+
nextDate = require_date_utils.addDays(date, 7);
|
|
280
|
+
break;
|
|
281
|
+
case "Home":
|
|
282
|
+
nextDate = require_date_utils.addDays(date, -((date.getDay() - weekStartsOn + 7) % 7));
|
|
283
|
+
break;
|
|
284
|
+
case "End":
|
|
285
|
+
nextDate = require_date_utils.addDays(date, 6 - (date.getDay() - weekStartsOn + 7) % 7);
|
|
286
|
+
break;
|
|
287
|
+
case "PageUp":
|
|
288
|
+
nextDate = require_date_utils.addMonths(date, event.shiftKey ? -12 : -1);
|
|
289
|
+
break;
|
|
290
|
+
case "PageDown":
|
|
291
|
+
nextDate = require_date_utils.addMonths(date, event.shiftKey ? 12 : 1);
|
|
292
|
+
break;
|
|
293
|
+
case "Enter":
|
|
294
|
+
case " ":
|
|
295
|
+
if (!isDisabled) {
|
|
296
|
+
event.preventDefault();
|
|
297
|
+
onSelect(date);
|
|
298
|
+
}
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
if (nextDate) {
|
|
302
|
+
event.preventDefault();
|
|
303
|
+
focusDate(nextDate, nextDate < date ? -1 : 1);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
onKeyDown?.(event);
|
|
307
|
+
},
|
|
308
|
+
ref: (node) => {
|
|
309
|
+
registerDay(key, node);
|
|
310
|
+
if (typeof ref === "function") ref(node);
|
|
311
|
+
else if (ref) ref.current = node;
|
|
312
|
+
},
|
|
313
|
+
role: "gridcell",
|
|
314
|
+
tabIndex: isFocused && !isDisabled ? 0 : -1,
|
|
315
|
+
type: "button",
|
|
316
|
+
children: children ?? date.getDate()
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
const CalendarGrid = (0, react.forwardRef)(function CalendarGrid({ "aria-label": ariaLabel, className, ...props }, ref) {
|
|
320
|
+
const { locale, month, styles, weekStartsOn } = useCalendarContext();
|
|
321
|
+
const days = (0, react.useMemo)(() => require_date_utils.getCalendarDays(month, weekStartsOn), [month, weekStartsOn]);
|
|
322
|
+
const weeks = (0, react.useMemo)(() => Array.from({ length: Math.ceil(days.length / 7) }, (_, index) => days.slice(index * 7, index * 7 + 7)), [days]);
|
|
323
|
+
const weekdays = (0, react.useMemo)(() => require_date_utils.getWeekdayLabels(locale, weekStartsOn), [locale, weekStartsOn]);
|
|
324
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
325
|
+
...props,
|
|
326
|
+
className: require_cx.cx(styles.calendar, className),
|
|
327
|
+
"data-slot": "calendar-grid",
|
|
328
|
+
ref,
|
|
329
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
330
|
+
"aria-hidden": "true",
|
|
331
|
+
className: styles.weekdays,
|
|
332
|
+
"data-slot": "calendar-weekdays",
|
|
333
|
+
children: weekdays.map((weekday) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
334
|
+
className: styles.weekday,
|
|
335
|
+
"data-slot": "calendar-weekday",
|
|
336
|
+
children: weekday
|
|
337
|
+
}, weekday))
|
|
338
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
339
|
+
"aria-label": ariaLabel ?? require_date_utils.formatMonthLabel(month, locale),
|
|
340
|
+
className: styles.grid,
|
|
341
|
+
"data-slot": "calendar-day-grid",
|
|
342
|
+
role: "grid",
|
|
343
|
+
children: weeks.map((week, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
344
|
+
"aria-rowindex": index + 1,
|
|
345
|
+
className: styles.row,
|
|
346
|
+
"data-slot": "calendar-week",
|
|
347
|
+
role: "row",
|
|
348
|
+
tabIndex: -1,
|
|
349
|
+
children: week.map((date) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CalendarDay, { date }, require_date_utils.dateKey(date)))
|
|
350
|
+
}, week.map(require_date_utils.dateKey).join("-")))
|
|
351
|
+
})]
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
const Calendar = {
|
|
355
|
+
Root: CalendarRoot,
|
|
356
|
+
Header: CalendarHeader,
|
|
357
|
+
Caption: CalendarCaption,
|
|
358
|
+
Previous: CalendarPrevious,
|
|
359
|
+
Next: CalendarNext,
|
|
360
|
+
MonthSelect: CalendarMonthSelect,
|
|
361
|
+
YearSelect: CalendarYearSelect,
|
|
362
|
+
Grid: CalendarGrid,
|
|
363
|
+
Day: CalendarDay
|
|
364
|
+
};
|
|
365
|
+
//#endregion
|
|
366
|
+
exports.Calendar = Calendar;
|
|
367
|
+
exports.CalendarCaption = CalendarCaption;
|
|
368
|
+
exports.CalendarDay = CalendarDay;
|
|
369
|
+
exports.CalendarGrid = CalendarGrid;
|
|
370
|
+
exports.CalendarHeader = CalendarHeader;
|
|
371
|
+
exports.CalendarMonthSelect = CalendarMonthSelect;
|
|
372
|
+
exports.CalendarNext = CalendarNext;
|
|
373
|
+
exports.CalendarPrevious = CalendarPrevious;
|
|
374
|
+
exports.CalendarRoot = CalendarRoot;
|
|
375
|
+
exports.CalendarYearSelect = CalendarYearSelect;
|
|
376
|
+
|
|
377
|
+
//# sourceMappingURL=calendar.cjs.map
|