@epilot/volt-ui-experimental-griffel 0.2.3 → 0.3.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/ADOPTING.md +416 -0
- package/README.md +32 -31
- package/dist/_virtual/jsx-dev-runtime.js +5 -0
- package/dist/_virtual/jsx-dev-runtime.js.map +1 -0
- package/dist/_virtual/react-jsx-dev-runtime.development.js +5 -0
- package/dist/_virtual/react-jsx-dev-runtime.development.js.map +1 -0
- package/dist/_virtual/react-jsx-dev-runtime.production.js +5 -0
- package/dist/_virtual/react-jsx-dev-runtime.production.js.map +1 -0
- package/dist/components/accordion/accordion.js +126 -66
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.js +239 -137
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/avatar/avatar-group.js +102 -47
- package/dist/components/avatar/avatar-group.js.map +1 -1
- package/dist/components/avatar/avatar.js +97 -73
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/badge/badge.js +53 -37
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +97 -49
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button.js +88 -77
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button-group/button-group.js +55 -31
- package/dist/components/button-group/button-group.js.map +1 -1
- package/dist/components/callout/callout.js +288 -164
- package/dist/components/callout/callout.js.map +1 -1
- package/dist/components/card/card.js +137 -81
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +100 -49
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js +155 -107
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js.map +1 -1
- package/dist/components/command/command.js +297 -158
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/data-table/data-table-body.js +114 -54
- package/dist/components/data-table/data-table-body.js.map +1 -1
- package/dist/components/data-table/data-table-column-header.js +117 -45
- package/dist/components/data-table/data-table-column-header.js.map +1 -1
- package/dist/components/data-table/data-table-column-visibility.js +98 -39
- package/dist/components/data-table/data-table-column-visibility.js.map +1 -1
- package/dist/components/data-table/data-table-content.js +90 -58
- package/dist/components/data-table/data-table-content.js.map +1 -1
- package/dist/components/data-table/data-table-error.js +83 -39
- package/dist/components/data-table/data-table-error.js.map +1 -1
- package/dist/components/data-table/data-table-header.js +88 -54
- package/dist/components/data-table/data-table-header.js.map +1 -1
- package/dist/components/data-table/data-table-loading.js +27 -15
- package/dist/components/data-table/data-table-loading.js.map +1 -1
- package/dist/components/data-table/data-table-pagination.js +27 -19
- package/dist/components/data-table/data-table-pagination.js.map +1 -1
- package/dist/components/data-table/data-table-row.js +87 -64
- package/dist/components/data-table/data-table-row.js.map +1 -1
- package/dist/components/data-table/data-table-toolbar.js +24 -16
- package/dist/components/data-table/data-table-toolbar.js.map +1 -1
- package/dist/components/data-table/data-table.js +182 -145
- package/dist/components/data-table/data-table.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +342 -214
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/range-calendar.js +132 -92
- package/dist/components/date-range-picker/range-calendar.js.map +1 -1
- package/dist/components/date-time-picker/calendar.js +501 -317
- package/dist/components/date-time-picker/calendar.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-context.js +64 -60
- package/dist/components/date-time-picker/date-time-picker-context.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-input.js +249 -149
- package/dist/components/date-time-picker/date-time-picker-input.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-panel.js +273 -165
- package/dist/components/date-time-picker/date-time-picker-panel.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-popover.js +22 -14
- package/dist/components/date-time-picker/date-time-picker-popover.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker.js +134 -90
- package/dist/components/date-time-picker/date-time-picker.js.map +1 -1
- package/dist/components/date-time-picker/time-picker.js +198 -132
- package/dist/components/date-time-picker/time-picker.js.map +1 -1
- package/dist/components/density-provider/density-provider.js +48 -0
- package/dist/components/density-provider/density-provider.js.map +1 -0
- package/dist/components/dialog/dialog.js +280 -150
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js +273 -163
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +378 -195
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/field/field-combobox.js +447 -240
- package/dist/components/field/field-combobox.js.map +1 -1
- package/dist/components/field/field-select.js +23 -19
- package/dist/components/field/field-select.js.map +1 -1
- package/dist/components/field/field.js +318 -209
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/label/label.js +27 -19
- package/dist/components/label/label.js.map +1 -1
- package/dist/components/list/list.js +623 -369
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/option-card/option-card.js +323 -159
- package/dist/components/option-card/option-card.js.map +1 -1
- package/dist/components/pill/pill.js +82 -64
- package/dist/components/pill/pill.js.map +1 -1
- package/dist/components/popover/popover.js +101 -56
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/radio/radio.js +94 -51
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/scroll-overflow/scroll-overflow.js +350 -198
- package/dist/components/scroll-overflow/scroll-overflow.js.map +1 -1
- package/dist/components/segmented-control/segmented-control.js +141 -97
- package/dist/components/segmented-control/segmented-control.js.map +1 -1
- package/dist/components/select/select.js +452 -227
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/separator/separator.js +24 -16
- package/dist/components/separator/separator.js.map +1 -1
- package/dist/components/skeleton/skeleton.js +83 -43
- package/dist/components/skeleton/skeleton.js.map +1 -1
- package/dist/components/spinner/spinner.js +44 -20
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/switch/switch.js +163 -86
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-pagination.js +465 -205
- package/dist/components/table/table-pagination.js.map +1 -1
- package/dist/components/table/table.js +212 -144
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/tabs/tabs.js +94 -58
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/text/text.js +40 -32
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/toast/toast.js +187 -111
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle/toggle-group.js +40 -24
- package/dist/components/toggle/toggle-group.js.map +1 -1
- package/dist/components/toggle/toggle.js +48 -40
- package/dist/components/toggle/toggle.js.map +1 -1
- package/dist/components/tooltip/tooltip.js +101 -55
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/index.d.ts +600 -427
- package/dist/index.js +215 -212
- package/dist/index.js.map +1 -1
- package/dist/lib/clear-button.js +27 -15
- package/dist/lib/clear-button.js.map +1 -1
- package/dist/lib/icons.js +18 -6
- package/dist/lib/icons.js.map +1 -1
- package/dist/packages/volt-runtime/dist/sheet.js +27 -10
- package/dist/packages/volt-runtime/dist/sheet.js.map +1 -1
- package/dist/packages/volt-runtime/dist/styles/recipe.js +76 -0
- package/dist/packages/volt-runtime/dist/styles/recipe.js.map +1 -0
- package/dist/styles/document-context.js +12 -0
- package/dist/styles/document-context.js.map +1 -0
- package/dist/styles/make-styles.js +18 -10
- package/dist/styles/make-styles.js.map +1 -1
- package/dist/tokens/core.generated.js +1238 -1166
- package/dist/tokens/core.generated.js.map +1 -1
- package/dist/tokens/index.d.ts +442 -415
- package/dist/tokens/index.js +1105 -1078
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/install.js +9 -5
- package/dist/tokens/install.js.map +1 -1
- package/dist/tokens/use-palette-tokens.js +20 -0
- package/dist/tokens/use-palette-tokens.js.map +1 -0
- package/dist/tokens.json +83 -2
- package/dist/vendor/react/cjs/react-jsx-dev-runtime.development.js +236 -0
- package/dist/vendor/react/cjs/react-jsx-dev-runtime.development.js.map +1 -0
- package/dist/vendor/react/cjs/react-jsx-dev-runtime.production.js +21 -0
- package/dist/vendor/react/cjs/react-jsx-dev-runtime.production.js.map +1 -0
- package/dist/vendor/react/jsx-dev-runtime.js +9 -0
- package/dist/vendor/react/jsx-dev-runtime.js.map +1 -0
- package/package.json +13 -5
- package/scripts/migration-diagnostics-core.mjs +859 -0
- package/scripts/migration-diagnostics.mjs +353 -0
- package/scripts/migration-sweep.mjs +179 -0
- package/AGENTS.md +0 -153
- package/AUTHORING.md +0 -292
- package/dist/packages/volt-runtime/dist/styles/make-styles.js +0 -22
- package/dist/packages/volt-runtime/dist/styles/make-styles.js.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import * as
|
|
3
|
-
import { shorthands as
|
|
4
|
-
import { SLOT_ATTR as
|
|
5
|
-
import { mergeClasses as
|
|
6
|
-
import { makeVoltStyles as
|
|
7
|
-
import { radiusMd as
|
|
8
|
-
import { getHours as
|
|
9
|
-
const
|
|
1
|
+
import { j as c } from "../../vendor/react/jsx-dev-runtime.js";
|
|
2
|
+
import * as l from "react";
|
|
3
|
+
import { shorthands as b } from "../../packages/volt-runtime/dist/vendor/@griffel/core/src/index.js";
|
|
4
|
+
import { SLOT_ATTR as N } from "../../packages/volt-runtime/dist/renderer/contract.js";
|
|
5
|
+
import { mergeClasses as d } from "../../packages/volt-runtime/dist/vendor/@griffel/core/src/mergeClasses.js";
|
|
6
|
+
import { makeVoltStyles as $ } from "../../styles/make-styles.js";
|
|
7
|
+
import { radiusMd as H, grayA5 as q, spacingElement1 as O, semAccentSolidHover as _, semAccentContrast as z, semAccentSolid as G, fontWeightSemibold as j, grayA4 as L, grayA11 as Q, leadingSm as X, textSm as J, grayA8 as K, leadingBase as P, textBase as Z, grayA6 as ee } from "../../tokens/index.js";
|
|
8
|
+
import { getHours as te, getMinutes as re, updateTime as E, padNumber as ie } from "./date-time-picker-utils.js";
|
|
9
|
+
const le = Array.from({ length: 24 }, (M, t) => t), S = $({
|
|
10
10
|
root: {
|
|
11
11
|
display: "flex",
|
|
12
12
|
flexDirection: "row",
|
|
13
13
|
alignItems: "stretch",
|
|
14
14
|
justifyContent: "center",
|
|
15
|
-
...
|
|
15
|
+
...b.gap(O)
|
|
16
16
|
},
|
|
17
17
|
fillHeight: {
|
|
18
18
|
height: "100%"
|
|
@@ -33,10 +33,10 @@ const lt = Array.from({ length: 24 }, (w, e) => e), R = O({
|
|
|
33
33
|
overflowX: "hidden",
|
|
34
34
|
width: "100%",
|
|
35
35
|
alignItems: "center",
|
|
36
|
-
...
|
|
37
|
-
...
|
|
36
|
+
...b.borderRadius(H),
|
|
37
|
+
...b.border("1px", "solid", q),
|
|
38
38
|
scrollbarWidth: "thin",
|
|
39
|
-
scrollbarColor: `${
|
|
39
|
+
scrollbarColor: `${ee} transparent`
|
|
40
40
|
},
|
|
41
41
|
scrollFixed: {
|
|
42
42
|
height: "8rem"
|
|
@@ -51,39 +51,39 @@ const lt = Array.from({ length: 24 }, (w, e) => e), R = O({
|
|
|
51
51
|
display: "flex",
|
|
52
52
|
alignItems: "center",
|
|
53
53
|
justifyContent: "center",
|
|
54
|
-
fontSize:
|
|
55
|
-
lineHeight:
|
|
56
|
-
fontWeight:
|
|
57
|
-
color:
|
|
54
|
+
fontSize: Z,
|
|
55
|
+
lineHeight: P,
|
|
56
|
+
fontWeight: j,
|
|
57
|
+
color: K
|
|
58
58
|
},
|
|
59
59
|
timeBtn: {
|
|
60
60
|
display: "flex",
|
|
61
61
|
alignItems: "center",
|
|
62
62
|
justifyContent: "center",
|
|
63
|
-
fontSize:
|
|
64
|
-
lineHeight:
|
|
65
|
-
...
|
|
63
|
+
fontSize: J,
|
|
64
|
+
lineHeight: X,
|
|
65
|
+
...b.borderRadius(H),
|
|
66
66
|
transitionProperty: "background-color, color",
|
|
67
67
|
transitionDuration: "150ms",
|
|
68
68
|
minHeight: "2rem",
|
|
69
69
|
width: "100%",
|
|
70
70
|
maxWidth: "3rem",
|
|
71
|
-
...
|
|
71
|
+
...b.border("0"),
|
|
72
72
|
outlineStyle: "none"
|
|
73
73
|
},
|
|
74
74
|
timeBtnDefault: {
|
|
75
75
|
backgroundColor: "transparent",
|
|
76
|
-
color:
|
|
76
|
+
color: Q,
|
|
77
77
|
":hover": {
|
|
78
|
-
backgroundColor:
|
|
78
|
+
backgroundColor: L
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
81
|
timeBtnSelected: {
|
|
82
|
-
fontWeight:
|
|
83
|
-
backgroundColor:
|
|
84
|
-
color:
|
|
82
|
+
fontWeight: j,
|
|
83
|
+
backgroundColor: G,
|
|
84
|
+
color: z,
|
|
85
85
|
":hover": {
|
|
86
|
-
backgroundColor:
|
|
86
|
+
backgroundColor: _
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
timeBtnDisabled: {
|
|
@@ -93,185 +93,251 @@ const lt = Array.from({ length: 24 }, (w, e) => e), R = O({
|
|
|
93
93
|
timeBtnEnabled: {
|
|
94
94
|
cursor: "pointer"
|
|
95
95
|
}
|
|
96
|
-
}),
|
|
97
|
-
value:
|
|
96
|
+
}), v = l.memo(function({
|
|
97
|
+
value: t,
|
|
98
98
|
isSelected: a,
|
|
99
|
-
isDisabled:
|
|
100
|
-
onClick:
|
|
99
|
+
isDisabled: o,
|
|
100
|
+
onClick: p
|
|
101
101
|
}) {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
}, [
|
|
105
|
-
return /* @__PURE__ */
|
|
102
|
+
const m = S(), f = l.useCallback(() => {
|
|
103
|
+
o || p(t);
|
|
104
|
+
}, [p, t, o]);
|
|
105
|
+
return /* @__PURE__ */ c.jsxDEV(
|
|
106
106
|
"button",
|
|
107
107
|
{
|
|
108
|
-
"aria-disabled":
|
|
108
|
+
"aria-disabled": o,
|
|
109
109
|
"aria-pressed": a,
|
|
110
|
-
className:
|
|
111
|
-
|
|
112
|
-
!a &&
|
|
113
|
-
a &&
|
|
114
|
-
|
|
110
|
+
className: d(
|
|
111
|
+
m.timeBtn,
|
|
112
|
+
!a && m.timeBtnDefault,
|
|
113
|
+
a && m.timeBtnSelected,
|
|
114
|
+
o ? m.timeBtnDisabled : m.timeBtnEnabled
|
|
115
115
|
),
|
|
116
116
|
"data-selected": a,
|
|
117
117
|
"data-slot": "time-button",
|
|
118
|
-
[
|
|
119
|
-
"data-value":
|
|
120
|
-
disabled:
|
|
118
|
+
[N]: "time-button",
|
|
119
|
+
"data-value": t,
|
|
120
|
+
disabled: o,
|
|
121
121
|
onClick: f,
|
|
122
122
|
type: "button",
|
|
123
|
-
children:
|
|
124
|
-
}
|
|
123
|
+
children: ie(t)
|
|
124
|
+
},
|
|
125
|
+
void 0,
|
|
126
|
+
!1,
|
|
127
|
+
{
|
|
128
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
129
|
+
lineNumber: 151,
|
|
130
|
+
columnNumber: 5
|
|
131
|
+
},
|
|
132
|
+
this
|
|
125
133
|
);
|
|
126
134
|
});
|
|
127
|
-
|
|
128
|
-
const
|
|
135
|
+
v.displayName = "TimeButton";
|
|
136
|
+
const pe = l.forwardRef(
|
|
129
137
|
function({
|
|
130
|
-
value:
|
|
138
|
+
value: t,
|
|
131
139
|
onChange: a,
|
|
132
|
-
onTimeSelect:
|
|
133
|
-
disablePast:
|
|
134
|
-
currentTimeInTimezone:
|
|
140
|
+
onTimeSelect: o,
|
|
141
|
+
disablePast: p = !1,
|
|
142
|
+
currentTimeInTimezone: m,
|
|
135
143
|
fillHeight: f = !1,
|
|
136
|
-
minuteStep:
|
|
137
|
-
className:
|
|
138
|
-
hoursLabel:
|
|
139
|
-
minutesLabel:
|
|
140
|
-
},
|
|
141
|
-
const r =
|
|
142
|
-
const
|
|
143
|
-
for (let
|
|
144
|
-
return
|
|
145
|
-
}, [g]), u =
|
|
146
|
-
|
|
147
|
-
Math.round(
|
|
148
|
-
),
|
|
149
|
-
() =>
|
|
150
|
-
[
|
|
151
|
-
),
|
|
152
|
-
(
|
|
153
|
-
[
|
|
154
|
-
),
|
|
155
|
-
(
|
|
156
|
-
[
|
|
157
|
-
),
|
|
158
|
-
(
|
|
159
|
-
const
|
|
160
|
-
a(
|
|
144
|
+
minuteStep: V = 1,
|
|
145
|
+
className: F,
|
|
146
|
+
hoursLabel: R = "Hours",
|
|
147
|
+
minutesLabel: U = "Minutes"
|
|
148
|
+
}, A) {
|
|
149
|
+
const r = S(), g = Math.max(1, Math.floor(V)), y = l.useMemo(() => {
|
|
150
|
+
const e = [];
|
|
151
|
+
for (let n = 0; n < 60; n += g) e.push(n);
|
|
152
|
+
return e;
|
|
153
|
+
}, [g]), u = t !== null ? te(t) : -1, C = t !== null ? re(t) : -1, h = t === null ? -1 : g === 1 ? C : Math.min(
|
|
154
|
+
y[y.length - 1],
|
|
155
|
+
Math.round(C / g) * g
|
|
156
|
+
), w = l.useRef(null), D = l.useRef(null), s = l.useMemo(
|
|
157
|
+
() => m || /* @__PURE__ */ new Date(),
|
|
158
|
+
[m]
|
|
159
|
+
), x = l.useMemo(() => t ? t.getFullYear() === s.getFullYear() && t.getMonth() === s.getMonth() && t.getDate() === s.getDate() : !1, [t, s]), k = s.getHours(), B = s.getMinutes(), I = l.useCallback(
|
|
160
|
+
(e) => !p || !x ? !1 : e < k,
|
|
161
|
+
[p, x, k]
|
|
162
|
+
), W = l.useCallback(
|
|
163
|
+
(e) => !p || !x ? !1 : u < k ? !0 : u === k ? e < B : !1,
|
|
164
|
+
[p, x, u, k, B]
|
|
165
|
+
), T = l.useCallback(
|
|
166
|
+
(e) => {
|
|
167
|
+
const n = t || s, i = h >= 0 ? h : 0;
|
|
168
|
+
a(E(n, e, i));
|
|
161
169
|
},
|
|
162
|
-
[a,
|
|
163
|
-
),
|
|
164
|
-
(
|
|
165
|
-
const
|
|
166
|
-
a(
|
|
170
|
+
[a, t, s, h]
|
|
171
|
+
), Y = l.useCallback(
|
|
172
|
+
(e) => {
|
|
173
|
+
const n = t || s, i = u >= 0 ? u : 0;
|
|
174
|
+
a(E(n, i, e)), o == null || o();
|
|
167
175
|
},
|
|
168
|
-
[a,
|
|
176
|
+
[a, o, t, s, u]
|
|
169
177
|
);
|
|
170
|
-
return
|
|
171
|
-
var
|
|
172
|
-
if (
|
|
173
|
-
const
|
|
178
|
+
return l.useEffect(() => {
|
|
179
|
+
var e, n;
|
|
180
|
+
if (w.current) {
|
|
181
|
+
const i = w.current.querySelector(
|
|
174
182
|
`[data-value="${u}"]`
|
|
175
183
|
);
|
|
176
|
-
|
|
184
|
+
i && ((e = i.scrollIntoView) == null || e.call(i, {
|
|
177
185
|
block: "center",
|
|
178
186
|
behavior: "auto"
|
|
179
187
|
}));
|
|
180
188
|
}
|
|
181
|
-
if (
|
|
182
|
-
const
|
|
183
|
-
`[data-value="${
|
|
189
|
+
if (D.current) {
|
|
190
|
+
const i = D.current.querySelector(
|
|
191
|
+
`[data-value="${h}"]`
|
|
184
192
|
);
|
|
185
|
-
|
|
193
|
+
i && ((n = i.scrollIntoView) == null || n.call(i, {
|
|
186
194
|
block: "center",
|
|
187
195
|
behavior: "auto"
|
|
188
196
|
}));
|
|
189
197
|
}
|
|
190
|
-
}, []), /* @__PURE__ */
|
|
198
|
+
}, []), /* @__PURE__ */ c.jsxDEV(
|
|
191
199
|
"div",
|
|
192
200
|
{
|
|
193
|
-
ref:
|
|
194
|
-
className:
|
|
201
|
+
ref: A,
|
|
202
|
+
className: d(
|
|
195
203
|
r.root,
|
|
196
204
|
f && r.fillHeight,
|
|
197
|
-
|
|
205
|
+
F
|
|
198
206
|
),
|
|
199
207
|
"data-slot": "timepicker",
|
|
200
|
-
[
|
|
208
|
+
[N]: "timepicker",
|
|
201
209
|
children: [
|
|
202
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ c.jsxDEV(
|
|
203
211
|
"div",
|
|
204
212
|
{
|
|
205
|
-
className:
|
|
213
|
+
className: d(
|
|
206
214
|
r.column,
|
|
207
215
|
f && r.columnFillHeight
|
|
208
216
|
),
|
|
209
|
-
children: /* @__PURE__ */
|
|
217
|
+
children: /* @__PURE__ */ c.jsxDEV(
|
|
210
218
|
"div",
|
|
211
219
|
{
|
|
212
|
-
className:
|
|
220
|
+
className: d(
|
|
213
221
|
r.scroll,
|
|
214
222
|
f ? r.scrollFill : r.scrollFixed
|
|
215
223
|
),
|
|
216
|
-
"aria-label":
|
|
224
|
+
"aria-label": R,
|
|
217
225
|
"data-slot": "timepicker-scroll",
|
|
218
226
|
role: "group",
|
|
219
|
-
[
|
|
220
|
-
ref:
|
|
221
|
-
children:
|
|
222
|
-
|
|
227
|
+
[N]: "timepicker-scroll",
|
|
228
|
+
ref: w,
|
|
229
|
+
children: le.map((e) => /* @__PURE__ */ c.jsxDEV(
|
|
230
|
+
v,
|
|
231
|
+
{
|
|
232
|
+
isDisabled: I(e),
|
|
233
|
+
isSelected: e === u,
|
|
234
|
+
onClick: T,
|
|
235
|
+
value: e
|
|
236
|
+
},
|
|
237
|
+
e,
|
|
238
|
+
!1,
|
|
223
239
|
{
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
value: t
|
|
240
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
241
|
+
lineNumber: 333,
|
|
242
|
+
columnNumber: 15
|
|
228
243
|
},
|
|
229
|
-
|
|
244
|
+
this
|
|
230
245
|
))
|
|
231
|
-
}
|
|
246
|
+
},
|
|
247
|
+
void 0,
|
|
248
|
+
!1,
|
|
249
|
+
{
|
|
250
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
251
|
+
lineNumber: 321,
|
|
252
|
+
columnNumber: 11
|
|
253
|
+
},
|
|
254
|
+
this
|
|
232
255
|
)
|
|
233
|
-
}
|
|
256
|
+
},
|
|
257
|
+
void 0,
|
|
258
|
+
!1,
|
|
259
|
+
{
|
|
260
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
261
|
+
lineNumber: 315,
|
|
262
|
+
columnNumber: 9
|
|
263
|
+
},
|
|
264
|
+
this
|
|
234
265
|
),
|
|
235
|
-
/* @__PURE__ */
|
|
236
|
-
|
|
266
|
+
/* @__PURE__ */ c.jsxDEV("div", { className: r.separator, children: ":" }, void 0, !1, {
|
|
267
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
268
|
+
lineNumber: 344,
|
|
269
|
+
columnNumber: 9
|
|
270
|
+
}, this),
|
|
271
|
+
/* @__PURE__ */ c.jsxDEV(
|
|
237
272
|
"div",
|
|
238
273
|
{
|
|
239
|
-
className:
|
|
274
|
+
className: d(
|
|
240
275
|
r.column,
|
|
241
276
|
f && r.columnFillHeight
|
|
242
277
|
),
|
|
243
|
-
children: /* @__PURE__ */
|
|
278
|
+
children: /* @__PURE__ */ c.jsxDEV(
|
|
244
279
|
"div",
|
|
245
280
|
{
|
|
246
|
-
className:
|
|
281
|
+
className: d(
|
|
247
282
|
r.scroll,
|
|
248
283
|
f ? r.scrollFill : r.scrollFixed
|
|
249
284
|
),
|
|
250
|
-
"aria-label":
|
|
285
|
+
"aria-label": U,
|
|
251
286
|
"data-slot": "timepicker-scroll",
|
|
252
287
|
role: "group",
|
|
253
|
-
[
|
|
254
|
-
ref:
|
|
255
|
-
children:
|
|
256
|
-
|
|
288
|
+
[N]: "timepicker-scroll",
|
|
289
|
+
ref: D,
|
|
290
|
+
children: y.map((e) => /* @__PURE__ */ c.jsxDEV(
|
|
291
|
+
v,
|
|
292
|
+
{
|
|
293
|
+
isDisabled: W(e),
|
|
294
|
+
isSelected: e === h,
|
|
295
|
+
onClick: Y,
|
|
296
|
+
value: e
|
|
297
|
+
},
|
|
298
|
+
e,
|
|
299
|
+
!1,
|
|
257
300
|
{
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
value: t
|
|
301
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
302
|
+
lineNumber: 364,
|
|
303
|
+
columnNumber: 15
|
|
262
304
|
},
|
|
263
|
-
|
|
305
|
+
this
|
|
264
306
|
))
|
|
265
|
-
}
|
|
307
|
+
},
|
|
308
|
+
void 0,
|
|
309
|
+
!1,
|
|
310
|
+
{
|
|
311
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
312
|
+
lineNumber: 352,
|
|
313
|
+
columnNumber: 11
|
|
314
|
+
},
|
|
315
|
+
this
|
|
266
316
|
)
|
|
267
|
-
}
|
|
317
|
+
},
|
|
318
|
+
void 0,
|
|
319
|
+
!1,
|
|
320
|
+
{
|
|
321
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
322
|
+
lineNumber: 346,
|
|
323
|
+
columnNumber: 9
|
|
324
|
+
},
|
|
325
|
+
this
|
|
268
326
|
)
|
|
269
327
|
]
|
|
270
|
-
}
|
|
328
|
+
},
|
|
329
|
+
void 0,
|
|
330
|
+
!0,
|
|
331
|
+
{
|
|
332
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/date-time-picker/time-picker.tsx",
|
|
333
|
+
lineNumber: 305,
|
|
334
|
+
columnNumber: 7
|
|
335
|
+
},
|
|
336
|
+
this
|
|
271
337
|
);
|
|
272
338
|
}
|
|
273
339
|
);
|
|
274
340
|
export {
|
|
275
|
-
|
|
341
|
+
pe as TimePicker
|
|
276
342
|
};
|
|
277
343
|
//# sourceMappingURL=time-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-picker.js","sources":["../../../src/components/date-time-picker/time-picker.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nimport {\n getHours,\n getMinutes,\n padNumber,\n updateTime,\n} from \"./date-time-picker-utils\"\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i)\n\nexport type TimePickerProps = {\n value: Date | null\n onChange: (date: Date) => void\n onTimeSelect?: () => void\n disablePast?: boolean\n currentTimeInTimezone?: Date\n fillHeight?: boolean\n minuteStep?: number\n className?: string\n /**\n * Accessible name for the hours column. Pass a translated string.\n *\n * These are ACCESSIBLE NAMES, not visible headers, and the distinction is deliberate. v1 ≤1.3.x\n * had `hoursLabel`/`minutesLabel` that rendered visible \"HH\"/\"MM\" headings; v1 deleted them in\n * `138fe05` (2026-06-25) and this package mirrors v1's current output, which Rule 0 makes the\n * fidelity target. But v1 replaced them with nothing, so both libraries now hand a screen reader\n * two unnamed columns of bare numbers. Naming them via `aria-label` closes that without moving a\n * pixel — the VR gate still matches v1 specimen for specimen.\n */\n hoursLabel?: string\n /** Accessible name for the minutes column. Pass a translated string. See `hoursLabel`. */\n minutesLabel?: string\n}\n\nconst useStyles = makeVoltStyles({\n root: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"stretch\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n },\n fillHeight: {\n height: \"100%\",\n },\n column: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n width: \"3.5rem\",\n },\n columnFillHeight: {\n minHeight: \"0\",\n },\n scroll: {\n display: \"flex\",\n flexDirection: \"column\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n width: \"100%\",\n alignItems: \"center\",\n ...shorthands.borderRadius(tokens.radiusMd),\n ...shorthands.border(\"1px\", \"solid\", tokens.grayA5),\n scrollbarWidth: \"thin\",\n scrollbarColor: `${tokens.grayA6} transparent`,\n },\n scrollFixed: {\n height: \"8rem\",\n },\n scrollFill: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n minHeight: \"0\",\n },\n separator: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textBase,\n lineHeight: tokens.leadingBase,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayA8,\n },\n timeBtn: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n ...shorthands.borderRadius(tokens.radiusMd),\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n minHeight: \"2rem\",\n width: \"100%\",\n maxWidth: \"3rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n timeBtnDefault: {\n backgroundColor: \"transparent\",\n color: tokens.grayA11,\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n },\n timeBtnSelected: {\n fontWeight: tokens.fontWeightSemibold,\n backgroundColor: tokens.semAccentSolid,\n color: tokens.semAccentContrast,\n \":hover\": {\n backgroundColor: tokens.semAccentSolidHover,\n },\n },\n timeBtnDisabled: {\n cursor: \"not-allowed\",\n opacity: 0.5,\n },\n timeBtnEnabled: {\n cursor: \"pointer\",\n },\n})\n\ntype TimeButtonProps = {\n value: number\n isSelected: boolean\n isDisabled: boolean\n onClick: (value: number) => void\n}\n\nconst TimeButton = React.memo(function TimeButton({\n value,\n isSelected,\n isDisabled,\n onClick,\n}: TimeButtonProps) {\n const styles = useStyles()\n const handleClick = React.useCallback(() => {\n if (!isDisabled) {\n onClick(value)\n }\n }, [onClick, value, isDisabled])\n\n return (\n <button\n aria-disabled={isDisabled}\n aria-pressed={isSelected}\n className={mergeClasses(\n styles.timeBtn,\n !isSelected && styles.timeBtnDefault,\n isSelected && styles.timeBtnSelected,\n isDisabled ? styles.timeBtnDisabled : styles.timeBtnEnabled\n )}\n data-selected={isSelected}\n data-slot=\"time-button\"\n {...{ [SLOT_ATTR]: \"time-button\" }}\n data-value={value}\n disabled={isDisabled}\n onClick={handleClick}\n type=\"button\"\n >\n {padNumber(value)}\n </button>\n )\n})\n\nTimeButton.displayName = \"TimeButton\"\n\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n function TimePicker(\n {\n value,\n onChange,\n onTimeSelect,\n disablePast = false,\n currentTimeInTimezone,\n fillHeight = false,\n minuteStep = 1,\n className,\n hoursLabel = \"Hours\",\n minutesLabel = \"Minutes\",\n },\n ref\n ) {\n const styles = useStyles()\n const step = Math.max(1, Math.floor(minuteStep))\n\n // Enumerate buckets 0, step, 2·step… stopping at <60 so a step that\n // doesn't divide 60 evenly (e.g. 7) can never produce an out-of-range\n // value like 63.\n const MINUTES = React.useMemo(() => {\n const buckets: number[] = []\n for (let m = 0; m < 60; m += step) buckets.push(m)\n\n return buckets\n }, [step])\n\n const selectedHour = value !== null ? getHours(value) : -1\n const rawMinute = value !== null ? getMinutes(value) : -1\n const selectedMinute =\n value === null\n ? -1\n : step === 1\n ? rawMinute\n : Math.min(\n MINUTES[MINUTES.length - 1],\n Math.round(rawMinute / step) * step\n )\n\n const hoursRef = React.useRef<HTMLDivElement>(null)\n const minutesRef = React.useRef<HTMLDivElement>(null)\n\n const now = React.useMemo(\n () => currentTimeInTimezone || new Date(),\n [currentTimeInTimezone]\n )\n const isToday = React.useMemo(() => {\n if (!value) return false\n\n return (\n value.getFullYear() === now.getFullYear() &&\n value.getMonth() === now.getMonth() &&\n value.getDate() === now.getDate()\n )\n }, [value, now])\n\n const currentHour = now.getHours()\n const currentMinute = now.getMinutes()\n\n const isHourDisabled = React.useCallback(\n (hour: number) => {\n if (!disablePast || !isToday) return false\n\n return hour < currentHour\n },\n [disablePast, isToday, currentHour]\n )\n\n const isMinuteDisabled = React.useCallback(\n (minute: number) => {\n if (!disablePast || !isToday) return false\n if (selectedHour < currentHour) return true\n if (selectedHour === currentHour) return minute < currentMinute\n\n return false\n },\n [disablePast, isToday, selectedHour, currentHour, currentMinute]\n )\n\n const handleHourChange = React.useCallback(\n (hour: number) => {\n const base = value || now\n const minute = selectedMinute >= 0 ? selectedMinute : 0\n\n onChange(updateTime(base, hour, minute))\n },\n [onChange, value, now, selectedMinute]\n )\n\n const handleMinuteChange = React.useCallback(\n (minute: number) => {\n const base = value || now\n const hour = selectedHour >= 0 ? selectedHour : 0\n\n onChange(updateTime(base, hour, minute))\n onTimeSelect?.()\n },\n [onChange, onTimeSelect, value, now, selectedHour]\n )\n\n React.useEffect(() => {\n if (hoursRef.current) {\n const selectedElement = hoursRef.current.querySelector(\n `[data-value=\"${selectedHour}\"]`\n )\n\n if (selectedElement) {\n selectedElement.scrollIntoView?.({\n block: \"center\",\n behavior: \"auto\",\n })\n }\n }\n if (minutesRef.current) {\n const selectedElement = minutesRef.current.querySelector(\n `[data-value=\"${selectedMinute}\"]`\n )\n\n if (selectedElement) {\n selectedElement.scrollIntoView?.({\n block: \"center\",\n behavior: \"auto\",\n })\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n ref={ref}\n className={mergeClasses(\n styles.root,\n fillHeight && styles.fillHeight,\n className\n )}\n data-slot=\"timepicker\"\n {...{ [SLOT_ATTR]: \"timepicker\" }}\n >\n <div\n className={mergeClasses(\n styles.column,\n fillHeight && styles.columnFillHeight\n )}\n >\n <div\n className={mergeClasses(\n styles.scroll,\n fillHeight ? styles.scrollFill : styles.scrollFixed\n )}\n aria-label={hoursLabel}\n data-slot=\"timepicker-scroll\"\n role=\"group\"\n {...{ [SLOT_ATTR]: \"timepicker-scroll\" }}\n ref={hoursRef}\n >\n {HOURS.map((hour) => (\n <TimeButton\n isDisabled={isHourDisabled(hour)}\n isSelected={hour === selectedHour}\n key={hour}\n onClick={handleHourChange}\n value={hour}\n />\n ))}\n </div>\n </div>\n\n <div className={styles.separator}>:</div>\n\n <div\n className={mergeClasses(\n styles.column,\n fillHeight && styles.columnFillHeight\n )}\n >\n <div\n className={mergeClasses(\n styles.scroll,\n fillHeight ? styles.scrollFill : styles.scrollFixed\n )}\n aria-label={minutesLabel}\n data-slot=\"timepicker-scroll\"\n role=\"group\"\n {...{ [SLOT_ATTR]: \"timepicker-scroll\" }}\n ref={minutesRef}\n >\n {MINUTES.map((minute) => (\n <TimeButton\n isDisabled={isMinuteDisabled(minute)}\n isSelected={minute === selectedMinute}\n key={minute}\n onClick={handleMinuteChange}\n value={minute}\n />\n ))}\n </div>\n </div>\n </div>\n )\n }\n)\n"],"names":["HOURS","_","i","useStyles","makeVoltStyles","shorthands","tokens.spacingElement1","tokens.radiusMd","tokens.grayA5","tokens.grayA6","tokens.textBase","tokens.leadingBase","tokens.fontWeightSemibold","tokens.grayA8","tokens.textSm","tokens.leadingSm","tokens.grayA11","tokens.grayA4","tokens.semAccentSolid","tokens.semAccentContrast","tokens.semAccentSolidHover","TimeButton","React","value","isSelected","isDisabled","onClick","styles","handleClick","jsx","mergeClasses","SLOT_ATTR","TimePicker","onChange","onTimeSelect","disablePast","currentTimeInTimezone","fillHeight","minuteStep","className","hoursLabel","minutesLabel","ref","step","MINUTES","buckets","m","selectedHour","getHours","rawMinute","getMinutes","selectedMinute","hoursRef","minutesRef","now","isToday","currentHour","currentMinute","isHourDisabled","hour","isMinuteDisabled","minute","handleHourChange","base","updateTime","handleMinuteChange","selectedElement","_a","_b","jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"time-picker.js","sources":["../../../src/components/date-time-picker/time-picker.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { mergeClasses, shorthands } from \"@epilot/volt-ui-runtime\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeVoltStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nimport {\n getHours,\n getMinutes,\n padNumber,\n updateTime,\n} from \"./date-time-picker-utils\"\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i)\n\nexport type TimePickerProps = {\n value: Date | null\n onChange: (date: Date) => void\n onTimeSelect?: () => void\n disablePast?: boolean\n currentTimeInTimezone?: Date\n fillHeight?: boolean\n minuteStep?: number\n className?: string\n /**\n * Accessible name for the hours column. Pass a translated string.\n *\n * These are ACCESSIBLE NAMES, not visible headers, and the distinction is deliberate. v1 ≤1.3.x\n * had `hoursLabel`/`minutesLabel` that rendered visible \"HH\"/\"MM\" headings; v1 deleted them in\n * `138fe05` (2026-06-25) and this package mirrors v1's current output, which Rule 0 makes the\n * fidelity target. But v1 replaced them with nothing, so both libraries now hand a screen reader\n * two unnamed columns of bare numbers. Naming them via `aria-label` closes that without moving a\n * pixel — the VR gate still matches v1 specimen for specimen.\n */\n hoursLabel?: string\n /** Accessible name for the minutes column. Pass a translated string. See `hoursLabel`. */\n minutesLabel?: string\n}\n\nconst useStyles = makeVoltStyles({\n root: {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"stretch\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n },\n fillHeight: {\n height: \"100%\",\n },\n column: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n width: \"3.5rem\",\n },\n columnFillHeight: {\n minHeight: \"0\",\n },\n scroll: {\n display: \"flex\",\n flexDirection: \"column\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n width: \"100%\",\n alignItems: \"center\",\n ...shorthands.borderRadius(tokens.radiusMd),\n ...shorthands.border(\"1px\", \"solid\", tokens.grayA5),\n scrollbarWidth: \"thin\",\n scrollbarColor: `${tokens.grayA6} transparent`,\n },\n scrollFixed: {\n height: \"8rem\",\n },\n scrollFill: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n minHeight: \"0\",\n },\n separator: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textBase,\n lineHeight: tokens.leadingBase,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayA8,\n },\n timeBtn: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n ...shorthands.borderRadius(tokens.radiusMd),\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n minHeight: \"2rem\",\n width: \"100%\",\n maxWidth: \"3rem\",\n ...shorthands.border(\"0\"),\n outlineStyle: \"none\",\n },\n timeBtnDefault: {\n backgroundColor: \"transparent\",\n color: tokens.grayA11,\n \":hover\": {\n backgroundColor: tokens.grayA4,\n },\n },\n timeBtnSelected: {\n fontWeight: tokens.fontWeightSemibold,\n backgroundColor: tokens.semAccentSolid,\n color: tokens.semAccentContrast,\n \":hover\": {\n backgroundColor: tokens.semAccentSolidHover,\n },\n },\n timeBtnDisabled: {\n cursor: \"not-allowed\",\n opacity: 0.5,\n },\n timeBtnEnabled: {\n cursor: \"pointer\",\n },\n})\n\ntype TimeButtonProps = {\n value: number\n isSelected: boolean\n isDisabled: boolean\n onClick: (value: number) => void\n}\n\nconst TimeButton = React.memo(function TimeButton({\n value,\n isSelected,\n isDisabled,\n onClick,\n}: TimeButtonProps) {\n const styles = useStyles()\n const handleClick = React.useCallback(() => {\n if (!isDisabled) {\n onClick(value)\n }\n }, [onClick, value, isDisabled])\n\n return (\n <button\n aria-disabled={isDisabled}\n aria-pressed={isSelected}\n className={mergeClasses(\n styles.timeBtn,\n !isSelected && styles.timeBtnDefault,\n isSelected && styles.timeBtnSelected,\n isDisabled ? styles.timeBtnDisabled : styles.timeBtnEnabled\n )}\n data-selected={isSelected}\n data-slot=\"time-button\"\n {...{ [SLOT_ATTR]: \"time-button\" }}\n data-value={value}\n disabled={isDisabled}\n onClick={handleClick}\n type=\"button\"\n >\n {padNumber(value)}\n </button>\n )\n})\n\nTimeButton.displayName = \"TimeButton\"\n\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n function TimePicker(\n {\n value,\n onChange,\n onTimeSelect,\n disablePast = false,\n currentTimeInTimezone,\n fillHeight = false,\n minuteStep = 1,\n className,\n hoursLabel = \"Hours\",\n minutesLabel = \"Minutes\",\n },\n ref\n ) {\n const styles = useStyles()\n const step = Math.max(1, Math.floor(minuteStep))\n\n // Enumerate buckets 0, step, 2·step… stopping at <60 so a step that\n // doesn't divide 60 evenly (e.g. 7) can never produce an out-of-range\n // value like 63.\n const MINUTES = React.useMemo(() => {\n const buckets: number[] = []\n for (let m = 0; m < 60; m += step) buckets.push(m)\n\n return buckets\n }, [step])\n\n const selectedHour = value !== null ? getHours(value) : -1\n const rawMinute = value !== null ? getMinutes(value) : -1\n const selectedMinute =\n value === null\n ? -1\n : step === 1\n ? rawMinute\n : Math.min(\n MINUTES[MINUTES.length - 1],\n Math.round(rawMinute / step) * step\n )\n\n const hoursRef = React.useRef<HTMLDivElement>(null)\n const minutesRef = React.useRef<HTMLDivElement>(null)\n\n const now = React.useMemo(\n () => currentTimeInTimezone || new Date(),\n [currentTimeInTimezone]\n )\n const isToday = React.useMemo(() => {\n if (!value) return false\n\n return (\n value.getFullYear() === now.getFullYear() &&\n value.getMonth() === now.getMonth() &&\n value.getDate() === now.getDate()\n )\n }, [value, now])\n\n const currentHour = now.getHours()\n const currentMinute = now.getMinutes()\n\n const isHourDisabled = React.useCallback(\n (hour: number) => {\n if (!disablePast || !isToday) return false\n\n return hour < currentHour\n },\n [disablePast, isToday, currentHour]\n )\n\n const isMinuteDisabled = React.useCallback(\n (minute: number) => {\n if (!disablePast || !isToday) return false\n if (selectedHour < currentHour) return true\n if (selectedHour === currentHour) return minute < currentMinute\n\n return false\n },\n [disablePast, isToday, selectedHour, currentHour, currentMinute]\n )\n\n const handleHourChange = React.useCallback(\n (hour: number) => {\n const base = value || now\n const minute = selectedMinute >= 0 ? selectedMinute : 0\n\n onChange(updateTime(base, hour, minute))\n },\n [onChange, value, now, selectedMinute]\n )\n\n const handleMinuteChange = React.useCallback(\n (minute: number) => {\n const base = value || now\n const hour = selectedHour >= 0 ? selectedHour : 0\n\n onChange(updateTime(base, hour, minute))\n onTimeSelect?.()\n },\n [onChange, onTimeSelect, value, now, selectedHour]\n )\n\n React.useEffect(() => {\n if (hoursRef.current) {\n const selectedElement = hoursRef.current.querySelector(\n `[data-value=\"${selectedHour}\"]`\n )\n\n if (selectedElement) {\n selectedElement.scrollIntoView?.({\n block: \"center\",\n behavior: \"auto\",\n })\n }\n }\n if (minutesRef.current) {\n const selectedElement = minutesRef.current.querySelector(\n `[data-value=\"${selectedMinute}\"]`\n )\n\n if (selectedElement) {\n selectedElement.scrollIntoView?.({\n block: \"center\",\n behavior: \"auto\",\n })\n }\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n ref={ref}\n className={mergeClasses(\n styles.root,\n fillHeight && styles.fillHeight,\n className\n )}\n data-slot=\"timepicker\"\n {...{ [SLOT_ATTR]: \"timepicker\" }}\n >\n <div\n className={mergeClasses(\n styles.column,\n fillHeight && styles.columnFillHeight\n )}\n >\n <div\n className={mergeClasses(\n styles.scroll,\n fillHeight ? styles.scrollFill : styles.scrollFixed\n )}\n aria-label={hoursLabel}\n data-slot=\"timepicker-scroll\"\n role=\"group\"\n {...{ [SLOT_ATTR]: \"timepicker-scroll\" }}\n ref={hoursRef}\n >\n {HOURS.map((hour) => (\n <TimeButton\n isDisabled={isHourDisabled(hour)}\n isSelected={hour === selectedHour}\n key={hour}\n onClick={handleHourChange}\n value={hour}\n />\n ))}\n </div>\n </div>\n\n <div className={styles.separator}>:</div>\n\n <div\n className={mergeClasses(\n styles.column,\n fillHeight && styles.columnFillHeight\n )}\n >\n <div\n className={mergeClasses(\n styles.scroll,\n fillHeight ? styles.scrollFill : styles.scrollFixed\n )}\n aria-label={minutesLabel}\n data-slot=\"timepicker-scroll\"\n role=\"group\"\n {...{ [SLOT_ATTR]: \"timepicker-scroll\" }}\n ref={minutesRef}\n >\n {MINUTES.map((minute) => (\n <TimeButton\n isDisabled={isMinuteDisabled(minute)}\n isSelected={minute === selectedMinute}\n key={minute}\n onClick={handleMinuteChange}\n value={minute}\n />\n ))}\n </div>\n </div>\n </div>\n )\n }\n)\n"],"names":["HOURS","_","i","useStyles","makeVoltStyles","shorthands","tokens.spacingElement1","tokens.radiusMd","tokens.grayA5","tokens.grayA6","tokens.textBase","tokens.leadingBase","tokens.fontWeightSemibold","tokens.grayA8","tokens.textSm","tokens.leadingSm","tokens.grayA11","tokens.grayA4","tokens.semAccentSolid","tokens.semAccentContrast","tokens.semAccentSolidHover","TimeButton","React","value","isSelected","isDisabled","onClick","styles","handleClick","jsxDEV","mergeClasses","SLOT_ATTR","TimePicker","onChange","onTimeSelect","disablePast","currentTimeInTimezone","fillHeight","minuteStep","className","hoursLabel","minutesLabel","ref","step","MINUTES","buckets","m","selectedHour","getHours","rawMinute","getMinutes","selectedMinute","hoursRef","minutesRef","now","isToday","currentHour","currentMinute","isHourDisabled","hour","isMinuteDisabled","minute","handleHourChange","base","updateTime","handleMinuteChange","selectedElement","_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { j as r } from "../../vendor/react/jsx-dev-runtime.js";
|
|
2
|
+
import * as o from "react";
|
|
3
|
+
import { SLOT_ATTR as u } from "../../packages/volt-runtime/dist/renderer/contract.js";
|
|
4
|
+
const c = ["compact", "normal", "comfortable"], t = (e) => c.includes(e) ? e : "normal", s = o.createContext(void 0), f = o.forwardRef(function({ density: i, className: l, children: a, ...m }, d) {
|
|
5
|
+
const n = t(i);
|
|
6
|
+
return /* @__PURE__ */ r.jsxDEV(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
ref: d,
|
|
10
|
+
"data-slot": "density-provider",
|
|
11
|
+
[u]: "density-provider",
|
|
12
|
+
className: l,
|
|
13
|
+
...m,
|
|
14
|
+
"data-density": n,
|
|
15
|
+
children: /* @__PURE__ */ r.jsxDEV(s.Provider, { value: n, children: a }, void 0, !1, {
|
|
16
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/density-provider/density-provider.tsx",
|
|
17
|
+
lineNumber: 76,
|
|
18
|
+
columnNumber: 7
|
|
19
|
+
}, this)
|
|
20
|
+
},
|
|
21
|
+
void 0,
|
|
22
|
+
!1,
|
|
23
|
+
{
|
|
24
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/density-provider/density-provider.tsx",
|
|
25
|
+
lineNumber: 63,
|
|
26
|
+
columnNumber: 5
|
|
27
|
+
},
|
|
28
|
+
this
|
|
29
|
+
);
|
|
30
|
+
}), x = () => o.useContext(s), y = ({
|
|
31
|
+
density: e,
|
|
32
|
+
children: i
|
|
33
|
+
}) => e === void 0 ? /* @__PURE__ */ r.jsxDEV(r.Fragment, { children: i }, void 0, !1, {
|
|
34
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/density-provider/density-provider.tsx",
|
|
35
|
+
lineNumber: 113,
|
|
36
|
+
columnNumber: 37
|
|
37
|
+
}, void 0) : /* @__PURE__ */ r.jsxDEV(s.Provider, { value: t(e), children: i }, void 0, !1, {
|
|
38
|
+
fileName: "/Users/wilianmolinari/repos/volt-ui-rollout/release/packages/experimental-griffel/src/components/density-provider/density-provider.tsx",
|
|
39
|
+
lineNumber: 115,
|
|
40
|
+
columnNumber: 5
|
|
41
|
+
}, void 0);
|
|
42
|
+
export {
|
|
43
|
+
y as DensityContextBoundary,
|
|
44
|
+
f as DensityProvider,
|
|
45
|
+
t as canonicalDensity,
|
|
46
|
+
x as useDensity
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=density-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"density-provider.js","sources":["../../../src/components/density-provider/density-provider.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\n\n/**\n * DENSITY-SPEC.md §4.4 — the two density mechanisms, and why this component is the only one that\n * does both:\n *\n * - CSS custom-property inheritance (no JavaScript) already delivers the shell's AMBIENT default\n * to every element, portalled or not — a Radix portal root is still an ordinary DOM descendant\n * of `<html>`, so it inherits `<html data-density=\"...\">` with zero wiring. No provider needed\n * for that common case.\n * - A bare `data-density` DOM attribute alone never reaches a portal that ISN'T a DOM descendant of\n * it — setting a DOM attribute runs no React code, so `useDensity()` inside such a subtree (or a\n * sibling-in-DOM, descendant-in-React-tree portal) sees nothing from it.\n *\n * `DensityProvider` sets both at once: a real DOM `data-density` boundary for ordinary (non-portal)\n * CSS inheritance, and a React context value that portal-content components (`SelectContent`,\n * `PopoverContent`, `DialogContent`, etc.) read via `useDensity()` to re-stamp themselves — since\n * portalled content is a React-tree descendant but a DOM sibling, only the context path reaches it.\n */\n\nexport type Density = \"compact\" | \"normal\" | \"comfortable\"\n\nconst CANONICAL_DENSITIES: readonly Density[] = [\"compact\", \"normal\", \"comfortable\"]\n\n/**\n * Invalid runtime input (a bad string slipping past TypeScript) normalizes to \"normal\". Exported\n * (package-internal — NOT added to `src/index.ts`, no new public export) so `Table`/`DataTable`/\n * `TableHead`/`TableCell` can apply the exact same normalization to their own DOM `data-density`\n * stamp that `DensityContextBoundary` already applies to the context value — one function, so the\n * two can never independently disagree on what an invalid input normalizes to\n * (TABLE-DENSITY-REVIEW-1.md #2).\n */\nexport const canonicalDensity = (density: Density): Density =>\n CANONICAL_DENSITIES.includes(density) ? density : \"normal\"\n\n/**\n * Unexported by design, same as `ListContext` — read only through `useDensity()`. Default\n * `undefined`: a component nested with no `DensityProvider` ancestor gets `undefined`, never a\n * fabricated \"normal\" — that would be a JS reading of ambient CSS this hook explicitly does not do.\n */\nconst DensityContext = React.createContext<Density | undefined>(undefined)\n\nexport type DensityProviderProps = React.ComponentProps<\"div\"> & {\n /** The explicit density boundary for this subtree. No default — always a real caller choice. */\n density: Density\n}\n\n/**\n * Ordinary HTML div semantics: forwards `ref`/`className`/`style`/every other div prop, no\n * polymorphic `asChild`. Renders one real DOM node (the boundary) wrapping a React context\n * provider around `children` — not two independent trees, so context and DOM boundary can never\n * disagree about which density is active.\n */\nexport const DensityProvider = React.forwardRef<\n HTMLDivElement,\n DensityProviderProps\n>(function DensityProvider({ density, className, children, ...props }, ref) {\n const value = canonicalDensity(density)\n\n return (\n <div\n ref={ref}\n data-slot=\"density-provider\"\n {...{ [SLOT_ATTR]: \"density-provider\" }}\n className={className}\n {...props}\n // Authoritative, spread LAST: a raw caller `data-density` prop (part of `...props`, since\n // `DensityProviderProps` extends every native div prop) must never win over the normalized\n // `density` prop — the DOM attribute and the context value below both derive from the same\n // `value`, and this ordering is what keeps that invariant true even when a caller passes a\n // conflicting literal `data-density` alongside `density` (finish-line integration fix).\n data-density={value}\n >\n <DensityContext.Provider value={value}>\n {children}\n </DensityContext.Provider>\n </div>\n )\n})\n\n/**\n * Returns the nearest explicit `DensityProvider` value, or `undefined` if none exists. Never reads\n * `getComputedStyle`/CSS custom properties — an `undefined` result means \"no explicit override in\n * the React tree,\" not \"ambient density is unknown\"; the caller's job (portal content components)\n * is to stamp nothing in that case and let ordinary CSS inheritance supply the ambient value.\n */\nexport const useDensity = (): Density | undefined => React.useContext(DensityContext)\n\n/**\n * Internal, package-private — NOT exported from `src/index.ts`. `DensityProvider` is the only\n * public density-boundary API; this is a context-only variant for a component that already owns a\n * real DOM boundary of its own (e.g. `Table`, whose root is a `<table>` and cannot safely have\n * `DensityProvider`'s wrapping `<div>` injected into its child structure without breaking table\n * semantics) and just needs the same context so its own descendant portals (e.g.\n * `table-pagination.tsx`'s inline Select) can read an explicit override via `useDensity()`.\n *\n * Renders no DOM node. Provides nothing (passes `children` through untouched, leaving whatever\n * outer `DensityContext` value already exists) when `density` is `undefined` — omitted density\n * must not fabricate a boundary any more than `DensityProvider` fabricates a DOM stamp.\n *\n * @no-host-element A pure context provider — it renders no host element (a `React.Context.Provider`\n * is not one), so there is no DOM node for a forwarded ref to ever reach.\n */\nexport const DensityContextBoundary = ({\n density,\n children,\n}: {\n density: Density | undefined\n children: React.ReactNode\n}): React.ReactElement => {\n if (density === undefined) return <>{children}</>\n return (\n <DensityContext.Provider value={canonicalDensity(density)}>\n {children}\n </DensityContext.Provider>\n )\n}\n"],"names":["CANONICAL_DENSITIES","canonicalDensity","density","DensityContext","React","DensityProvider","className","children","props","ref","value","jsxDEV","SLOT_ATTR","useDensity","DensityContextBoundary","Fragment","this"],"mappings":";;;AAwBA,MAAMA,IAA0C,CAAC,WAAW,UAAU,aAAa,GAUtEC,IAAmB,CAACC,MAC/BF,EAAoB,SAASE,CAAO,IAAIA,IAAU,UAO9CC,IAAiBC,EAAM,cAAmC,MAAS,GAa5DC,IAAkBD,EAAM,WAGnC,SAAyB,EAAE,SAAAF,GAAS,WAAAI,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAASC,GAAK;AAC1E,QAAMC,IAAQT,EAAiBC,CAAO;AAEtC,SACES,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAF;AAAA,MACA,aAAU;AAAA,MACJ,CAACG,CAAS,GAAG;AAAA,MACnB,WAAAN;AAAA,MACC,GAAGE;AAAA,MAMJ,gBAAcE;AAAA,MAEd,UAAAC,gBAAAA,EAAAA,OAACR,EAAe,UAAf,EAAwB,OAAAO,GACtB,UAAAH,EAAA,GADH,QAAA,IAAA;AAAA,QAAA,UAAA;AAAA,QAAA,YAAA;AAAA,QAAA,cAAA;AAAA,MAAA,GAAA,IAEA;AAAA,IAAA;AAAA,IAfF;AAAA,IAAA;AAAA,IAAA;AAAA,MAAA,UAAA;AAAA,MAAA,YAAA;AAAA,MAAA,cAAA;AAAA,IAAA;AAAA,IAAA;AAAA,EAAA;AAkBJ,CAAC,GAQYM,IAAa,MAA2BT,EAAM,WAAWD,CAAc,GAiBvEW,IAAyB,CAAC;AAAA,EACrC,SAAAZ;AAAA,EACA,UAAAK;AACF,MAIML,MAAY,SAAkBS,gBAAAA,EAAAA,OAAAI,EAAAA,UAAA,EAAG,UAAAR,EAAA,GAAH,QAAA,IAAA;AAAA,EAAA,UAAA;AAAA,EAAA,YAAA;AAAA,EAAA,cAAA;AAAA,GAAAS,MAAY,IAE5CL,gBAAAA,SAACR,EAAe,UAAf,EAAwB,OAAOF,EAAiBC,CAAO,GACrD,UAAAK,KADH,QAAA,IAAA;AAAA,EAAA,UAAA;AAAA,EAAA,YAAA;AAAA,EAAA,cAAA;AAAA,GAAAS,MAEA;"}
|