@plastic-js/tsumiki 0.1.19 → 0.1.21

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.
@@ -1,11 +1,11 @@
1
1
  import Icon from "../Icon.js";
2
- import { makeWheel } from "./wheel.js";
2
+ import { expandCircular, makeWheel } from "./wheel.js";
3
3
  import { Fragment, insert, jsx, mergeProps, setProp, template } from "@plastic-js/plastic/jsx-runtime";
4
4
  import { css } from "@emotion/css";
5
5
  import { createEffect, createSignal, splitProps } from "@plastic-js/plastic";
6
6
  //#region src/components/DatePickerMobile/index.jsx
7
7
  var _tmpl6 = template("<button type=\"button\"></button>");
8
- var _tmpl5 = template("<div><div role=\"presentation\" aria-hidden=\"true\"></div><div role=\"dialog\" aria-label=\"Date picker\"><div><button type=\"button\">Cancel</button><span>Select Date</span><button type=\"button\">Done</button></div><div></div><div></div><div></div><!></div></div>");
8
+ var _tmpl5 = template("<div><div role=\"presentation\" aria-hidden=\"true\"></div><div role=\"dialog\" aria-label=\"Date picker\"><div><button type=\"button\">Cancel</button><span>Select Date</span><button type=\"button\">Done</button></div><div></div><!></div></div>");
9
9
  var _tmpl4 = template("<span></span>");
10
10
  var _tmpl3 = template("<button type=\"button\"><!><span></span></button>");
11
11
  var _tmpl2 = template("<div></div>");
@@ -50,6 +50,10 @@ var triggerWrapperClass = css({
50
50
  borderRadius: "10px",
51
51
  "&:focus-visible": { boxShadow: "0 0 0 2px var(--accent)" }
52
52
  });
53
+ var triggerDisabledClass = css({
54
+ opacity: .4,
55
+ cursor: "not-allowed"
56
+ });
53
57
  var triggerClass = css({
54
58
  width: "100%",
55
59
  height: "42px",
@@ -142,7 +146,7 @@ var wheelAreaClass = css({
142
146
  padding: "12px 0 20px",
143
147
  position: "relative"
144
148
  });
145
- var gradientOverlayClass = css({
149
+ css({
146
150
  position: "absolute",
147
151
  left: 0,
148
152
  right: 0,
@@ -170,7 +174,24 @@ var columnViewportClass = css({
170
174
  height: `180px`,
171
175
  overflow: "hidden",
172
176
  position: "relative",
173
- touchAction: "none"
177
+ touchAction: "none",
178
+ "&::before, &::after": {
179
+ content: "\"\"",
180
+ position: "absolute",
181
+ left: 0,
182
+ right: 0,
183
+ height: `72px`,
184
+ pointerEvents: "none",
185
+ zIndex: 2
186
+ },
187
+ "&::before": {
188
+ top: 0,
189
+ background: "linear-gradient(to bottom, var(--surface) 0%, transparent 100%)"
190
+ },
191
+ "&::after": {
192
+ bottom: 0,
193
+ background: "linear-gradient(to top, var(--surface) 0%, transparent 100%)"
194
+ }
174
195
  });
175
196
  var columnListClass = css({ willChange: "transform" });
176
197
  var highlightBarClass = css({
@@ -228,10 +249,17 @@ function CalendarIconComp() {
228
249
  strokeWidth: 1.5
229
250
  }));
230
251
  }
252
+ function mountWheel(el, wheel) {
253
+ if (el._wheel && el._wheel !== wheel) el._wheel.destroy();
254
+ el._wheel = wheel;
255
+ wheel.mount(el);
256
+ }
231
257
  function Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {
232
- const yearWheel = makeWheel(YEARS, YEARS.indexOf(y));
233
- const monthWheel = makeWheel(MONTHS, m);
234
- const dayWheel = makeWheel(days, selDay - 1);
258
+ const yearWheel = makeWheel(YEARS, YEARS.indexOf(y), false);
259
+ const [monthItems, monthStartIdx] = expandCircular(MONTHS, m);
260
+ const monthWheel = makeWheel(monthItems, monthStartIdx, true);
261
+ const [dayItems, dayStartIdx] = expandCircular(days, selDay - 1);
262
+ const dayWheel = makeWheel(dayItems, dayStartIdx, true);
235
263
  return () => {
236
264
  const _el0 = _tmpl.cloneNode(true);
237
265
  const _el1 = _el0.firstChild;
@@ -259,7 +287,7 @@ function Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {
259
287
  return _el0;
260
288
  }));
261
289
  setProp(_el5, "ref", (el) => {
262
- if (el) yearWheel.mount(el);
290
+ if (el) mountWheel(el, yearWheel);
263
291
  });
264
292
  setProp(_el5, "className", () => columnListClass);
265
293
  setProp(_el5, "onPointerDown", (e) => yearWheel.handlePointerDown(e));
@@ -275,15 +303,15 @@ function Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {
275
303
  setProp(_el1, "className", () => columnWrapperClass);
276
304
  setProp(_el7, "className", () => columnLabelClass);
277
305
  setProp(_el9, "className", () => highlightBarClass);
278
- insert(_el10, () => MONTHS.map((item, i) => () => {
306
+ insert(_el10, () => monthItems.map((item, i) => () => {
279
307
  const _el0 = _tmpl2.cloneNode(true);
280
308
  insert(_el0, () => MONTH_NAMES_SHORT[item]);
281
- setProp(_el0, "className", () => `${itemBaseClass} ${i === m ? selectedItemClass : ""}`);
309
+ setProp(_el0, "className", () => `${itemBaseClass} ${i === monthStartIdx ? selectedItemClass : ""}`);
282
310
  setProp(_el0, "key", () => i);
283
311
  return _el0;
284
312
  }));
285
313
  setProp(_el10, "ref", (el) => {
286
- if (el) monthWheel.mount(el);
314
+ if (el) mountWheel(el, monthWheel);
287
315
  });
288
316
  setProp(_el10, "className", () => columnListClass);
289
317
  setProp(_el10, "onPointerDown", (e) => monthWheel.handlePointerDown(e));
@@ -298,15 +326,15 @@ function Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {
298
326
  setProp(_el6, "className", () => columnWrapperClass);
299
327
  setProp(_el12, "className", () => columnLabelClass);
300
328
  setProp(_el14, "className", () => highlightBarClass);
301
- insert(_el15, () => days.map((item, i) => () => {
329
+ insert(_el15, () => dayItems.map((item, i) => () => {
302
330
  const _el0 = _tmpl2.cloneNode(true);
303
331
  insert(_el0, () => String(item));
304
- setProp(_el0, "className", () => `${itemBaseClass} ${i === selDay - 1 ? selectedItemClass : ""}`);
332
+ setProp(_el0, "className", () => `${itemBaseClass} ${i === dayStartIdx ? selectedItemClass : ""}`);
305
333
  setProp(_el0, "key", () => i);
306
334
  return _el0;
307
335
  }));
308
336
  setProp(_el15, "ref", (el) => {
309
- if (el) dayWheel.mount(el);
337
+ if (el) mountWheel(el, dayWheel);
310
338
  });
311
339
  setProp(_el15, "className", () => columnListClass);
312
340
  setProp(_el15, "onPointerDown", (e) => dayWheel.handlePointerDown(e));
@@ -329,6 +357,8 @@ var DatePickerMobile = (props) => {
329
357
  "placeholder",
330
358
  "clearable",
331
359
  "clearLabel",
360
+ "disabled",
361
+ "disabledClassName",
332
362
  "backdropClassName",
333
363
  "backdropStyle"
334
364
  ]);
@@ -336,6 +366,9 @@ var DatePickerMobile = (props) => {
336
366
  const resolveValue = () => {
337
367
  return (typeof local.value === "function" ? local.value() : local.value) ?? null;
338
368
  };
369
+ const isDisabled = () => {
370
+ return !!(typeof local.disabled === "function" ? local.disabled() : local.disabled);
371
+ };
339
372
  const tempYear = createSignal(2e3);
340
373
  const tempMonth = createSignal(0);
341
374
  const tempDay = createSignal(1);
@@ -353,6 +386,7 @@ var DatePickerMobile = (props) => {
353
386
  };
354
387
  });
355
388
  const openSheet = () => {
389
+ if (isDisabled()) return;
356
390
  const d = resolveValue() || /* @__PURE__ */ new Date();
357
391
  tempYear(d.getFullYear());
358
392
  tempMonth(d.getMonth());
@@ -387,8 +421,9 @@ var DatePickerMobile = (props) => {
387
421
  }, _el1);
388
422
  insert(_el2, () => jsx(CalendarIconComp, {}));
389
423
  setProp(_el2, "className", () => calendarIconClass);
390
- setProp(_el0, "className", () => triggerWrapperClass);
424
+ setProp(_el0, "className", () => `${triggerWrapperClass} ${isDisabled() ? `${triggerDisabledClass} ${local.disabledClassName || ""}` : ""}`);
391
425
  setProp(_el0, "onClick", () => openSheet);
426
+ setProp(_el0, "aria-disabled", () => isDisabled());
392
427
  return _el0;
393
428
  }, () => {
394
429
  if (!open()) return null;
@@ -406,8 +441,6 @@ var DatePickerMobile = (props) => {
406
441
  const _el6 = _el3.firstChild.nextSibling.nextSibling;
407
442
  const _el7 = _el2.firstChild.nextSibling;
408
443
  const _el8 = _el2.firstChild.nextSibling.nextSibling;
409
- const _el9 = _el2.firstChild.nextSibling.nextSibling.nextSibling;
410
- const _el10 = _el2.firstChild.nextSibling.nextSibling.nextSibling.nextSibling;
411
444
  setProp(_el1, "className", () => `${backdropClass} ${local.backdropClassName || ""}`);
412
445
  setProp(_el1, "style", () => local.backdropStyle);
413
446
  setProp(_el1, "onClick", () => cancel);
@@ -417,19 +450,7 @@ var DatePickerMobile = (props) => {
417
450
  setProp(_el6, "className", () => toolbarBtnClass);
418
451
  setProp(_el6, "onClick", () => confirm);
419
452
  setProp(_el3, "className", () => toolbarClass);
420
- setProp(_el7, "className", () => gradientOverlayClass);
421
- setProp(_el7, "style", () => ({
422
- top: 0,
423
- height: `72px`,
424
- background: "linear-gradient(to bottom, var(--surface) 0%, transparent 100%)"
425
- }));
426
- setProp(_el8, "className", () => gradientOverlayClass);
427
- setProp(_el8, "style", () => ({
428
- bottom: 0,
429
- height: `72px`,
430
- background: "linear-gradient(to top, var(--surface) 0%, transparent 100%)"
431
- }));
432
- insert(_el9, () => jsx(Columns, mergeProps({
453
+ insert(_el7, () => jsx(Columns, mergeProps({
433
454
  y,
434
455
  m,
435
456
  days,
@@ -438,14 +459,14 @@ var DatePickerMobile = (props) => {
438
459
  tempMonth,
439
460
  tempDay
440
461
  })));
441
- setProp(_el9, "className", () => wheelAreaClass);
462
+ setProp(_el7, "className", () => wheelAreaClass);
442
463
  insert(_el2, () => local.clearable && (() => {
443
464
  const _el0 = _tmpl6.cloneNode(true);
444
465
  insert(_el0, () => local.clearLabel || "Clear");
445
466
  setProp(_el0, "className", () => clearRowClass);
446
467
  setProp(_el0, "onClick", () => clear);
447
468
  return _el0;
448
- }), _el10);
469
+ }), _el8);
449
470
  setProp(_el2, "className", () => sheetClass);
450
471
  setProp(_el0, "className", () => `${overlayClass} ${openClass}`);
451
472
  return _el0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["css","createEffect","createSignal","splitProps","Icon","CENTER_OFFSET","ITEM_HEIGHT","makeWheel","_tmpl6","_template","_tmpl5","_tmpl4","_tmpl3","_tmpl2","_tmpl","MONTH_NAMES_SHORT","daysInMonth","year","month","Date","getDate","YEARS","Array","from","length","_","i","MONTHS","getDays","count","toDate","day","formatDateLabel","date","getMonth","getFullYear","calendarSvg","triggerWrapperClass","position","width","background","border","padding","font","cursor","color","outline","borderRadius","boxShadow","triggerClass","height","fontSize","fontFamily","boxSizing","display","alignItems","triggerPlaceholderClass","triggerValueClass","calendarIconClass","right","top","transform","pointerEvents","overlayClass","inset","zIndex","flexDirection","justifyContent","backdropClass","opacity","transition","sheetClass","borderTop","paddingBottom","openClass","toolbarClass","borderBottom","flexShrink","toolbarBtnClass","WebkitTapHighlightColor","toolbarTitleClass","fontWeight","wheelAreaClass","gradientOverlayClass","left","columnWrapperClass","flex","overflow","columnLabelClass","textTransform","letterSpacing","marginBottom","columnViewportClass","touchAction","columnListClass","willChange","highlightBarClass","itemBaseClass","userSelect","whiteSpace","textOverflow","selectedItemClass","clearRowClass","gap","CalendarIconComp","_jsx","_mergeProps","svg","size","strokeWidth","Columns","y","m","days","selDay","tempYear","tempMonth","tempDay","yearWheel","indexOf","monthWheel","dayWheel","_el0","cloneNode","_el1","firstChild","_el2","_el3","nextSibling","_el4","_el5","_el6","_el7","_el8","_el9","_el10","_el11","_el12","_el13","_el14","_el15","_setProp","_insert","map","item","String","el","mount","e","handlePointerDown","handlePointerMove","currentTarget","handlePointerUp","idx","newYear","maxDay","handlePointerCancel","DatePickerMobile","props","local","open","resolveValue","v","value","onKey","key","cancel","document","addEventListener","prevOverflow","body","style","removeEventListener","openSheet","d","Math","min","confirm","onValueChange","clear","dayItems","_Fragment","children","placeholder","backdropClassName","backdropStyle","bottom","clearable","clearLabel"],"sources":["../../../src/components/DatePickerMobile/index.jsx"],"sourcesContent":["import { css } from '@emotion/css'\nimport { createEffect, createSignal, splitProps } from '@plastic-js/plastic'\nimport Icon from '../Icon.jsx'\nimport { CENTER_OFFSET, ITEM_HEIGHT, makeWheel } from './wheel.js'\n\n// ── Date helpers ──────────────────────────────────────────────────────────\nconst MONTH_NAMES_SHORT = [\n\t'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\nconst daysInMonth = (year, month) => new Date(year, month + 1, 0).getDate()\n\nconst YEARS = Array.from({ length: 200 }, (_, i) => 1900 + i)\nconst MONTHS = Array.from({ length: 12 }, (_, i) => i)\n\nconst getDays = (year, month) => {\n\tconst count = daysInMonth(year, month)\n\treturn Array.from({ length: count }, (_, i) => i + 1)\n}\n\nconst toDate = (year, month, day) => new Date(year, month, day)\n\nconst formatDateLabel = (date) => {\n\tif (!date) return ''\n\treturn `${MONTH_NAMES_SHORT[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`\n}\n\n// ── SVGs ───────────────────────────────────────────────────────────────────\nconst calendarSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>'\n\n// ── Styles ─────────────────────────────────────────────────────────────────\nconst triggerWrapperClass = css({\n\tposition: 'relative',\n\twidth: '100%',\n\tbackground: 'none',\n\tborder: 'none',\n\tpadding: 0,\n\tfont: 'inherit',\n\tcursor: 'pointer',\n\tcolor: 'inherit',\n\toutline: 'none',\n\tborderRadius: '10px',\n\t'&:focus-visible': { boxShadow: '0 0 0 2px var(--accent)' },\n})\n\nconst triggerClass = css({\n\twidth: '100%',\n\theight: '42px',\n\tpadding: '0 36px 0 14px',\n\tbackground: 'rgba(255,255,255,0.06)',\n\tborder: '1px solid var(--border)',\n\tborderRadius: '10px',\n\tcolor: 'var(--ink)',\n\tfontSize: '16px',\n\tfontFamily: 'inherit',\n\toutline: 'none',\n\tboxSizing: 'border-box',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tcursor: 'pointer',\n})\n\nconst triggerPlaceholderClass = css({\n\tcolor: 'var(--muted)',\n})\n\nconst triggerValueClass = css({\n\tcolor: 'var(--ink)',\n})\n\nconst calendarIconClass = css({\n\tposition: 'absolute',\n\tright: '10px',\n\ttop: '50%',\n\ttransform: 'translateY(-50%)',\n\twidth: '18px',\n\theight: '18px',\n\tcolor: 'var(--muted)',\n\tpointerEvents: 'none',\n})\n\nconst overlayClass = css({\n\tposition: 'fixed',\n\tinset: 0,\n\tzIndex: 1000,\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tjustifyContent: 'flex-end',\n\tpointerEvents: 'none',\n})\n\nconst backdropClass = css({\n\tposition: 'absolute',\n\tinset: 0,\n\tbackground: 'rgba(0,0,0,0.5)',\n\topacity: 0,\n\ttransition: 'opacity 240ms ease',\n})\n\nconst sheetClass = css({\n\tposition: 'relative',\n\twidth: '100%',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tbackground: 'var(--surface)',\n\tborderTop: '1px solid var(--border)',\n\tborderRadius: '18px 18px 0 0',\n\tboxShadow: '0 -8px 32px rgba(0,0,0,0.4)',\n\tpaddingBottom: 'env(safe-area-inset-bottom, 0px)',\n\ttransform: 'translateY(100%)',\n\ttransition: 'transform 280ms cubic-bezier(0.32, 0.72, 0, 1)',\n})\n\nconst openClass = css({\n\tpointerEvents: 'auto',\n\t[`& .${backdropClass}`]: { opacity: 1 },\n\t[`& .${sheetClass}`]: { transform: 'translateY(0)' },\n})\n\nconst toolbarClass = css({\n\tdisplay: 'flex',\n\tjustifyContent: 'space-between',\n\talignItems: 'center',\n\tpadding: '12px 16px',\n\tborderBottom: '1px solid var(--border)',\n\tflexShrink: 0,\n})\n\nconst toolbarBtnClass = css({\n\tbackground: 'none',\n\tborder: 'none',\n\tpadding: '6px 0',\n\tcolor: 'var(--accent)',\n\tfontSize: '16px',\n\tfontFamily: 'inherit',\n\tcursor: 'pointer',\n\tWebkitTapHighlightColor: 'transparent',\n})\n\nconst toolbarTitleClass = css({\n\tfontSize: '15px',\n\tfontWeight: 600,\n\tcolor: 'var(--ink)',\n})\n\nconst wheelAreaClass = css({\n\tdisplay: 'flex',\n\tjustifyContent: 'center',\n\talignItems: 'stretch',\n\tpadding: '12px 0 20px',\n\tposition: 'relative',\n})\n\nconst gradientOverlayClass = css({\n\tposition: 'absolute',\n\tleft: 0,\n\tright: 0,\n\tpointerEvents: 'none',\n\tzIndex: 2,\n})\n\nconst columnWrapperClass = css({\n\tflex: 1,\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\talignItems: 'center',\n\toverflow: 'hidden',\n\tposition: 'relative',\n})\n\nconst columnLabelClass = css({\n\tfontSize: '11px',\n\tcolor: 'var(--muted)',\n\ttextTransform: 'uppercase',\n\tletterSpacing: '0.5px',\n\tmarginBottom: '6px',\n\tfontWeight: 500,\n})\n\nconst columnViewportClass = css({\n\twidth: '100%',\n\theight: `${CENTER_OFFSET * 2 + ITEM_HEIGHT}px`,\n\toverflow: 'hidden',\n\tposition: 'relative',\n\ttouchAction: 'none',\n})\n\nconst columnListClass = css({\n\twillChange: 'transform',\n})\n\nconst highlightBarClass = css({\n\tposition: 'absolute',\n\ttop: `${CENTER_OFFSET}px`,\n\tleft: '10%',\n\tright: '10%',\n\theight: `${ITEM_HEIGHT}px`,\n\tborderRadius: '8px',\n\tbackground: 'rgba(255,255,255,0.06)',\n\tpointerEvents: 'none',\n\tzIndex: 1,\n})\n\nconst itemBaseClass = css({\n\theight: `${ITEM_HEIGHT}px`,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tfontSize: '20px',\n\tcolor: 'var(--muted)',\n\tuserSelect: 'none',\n\twhiteSpace: 'nowrap',\n\toverflow: 'hidden',\n\ttextOverflow: 'ellipsis',\n\tpadding: '0 4px',\n\tboxSizing: 'border-box',\n})\n\nconst selectedItemClass = css({\n\tcolor: 'var(--ink)',\n\tfontWeight: 600,\n\tfontSize: '22px',\n})\n\nconst clearRowClass = css({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '44px',\n\tgap: '6px',\n\tcolor: 'var(--accent)',\n\tfontSize: '15px',\n\tfontFamily: 'inherit',\n\tbackground: 'none',\n\tborder: 'none',\n\tborderTop: '1px solid var(--border)',\n\tcursor: 'pointer',\n\twidth: '100%',\n\tflexShrink: 0,\n\tpadding: 0,\n\t'&:active': { background: 'rgba(255,255,255,0.04)' },\n})\n\n// ── CalendarIcon ───────────────────────────────────────────────────────────\nfunction CalendarIconComp() {\n\treturn <Icon svg={calendarSvg} size={18} strokeWidth={1.5} />\n}\n\n// ── Columns ────────────────────────────────────────────────────────────────\n//\n// Renders the three wheel columns (year / month / day). Receives all data as\n// plain props so it can be used as a normal Plastic component.\nfunction Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {\n\tconst yearWheel = makeWheel(YEARS, YEARS.indexOf(y))\n\tconst monthWheel = makeWheel(MONTHS, m)\n\tconst dayWheel = makeWheel(days, selDay - 1)\n\n\treturn (\n\t\t<div style={{ display: 'flex', width: '100%' }}>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Year</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) yearWheel.mount(el) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => yearWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => yearWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => yearWheel.handlePointerUp(e, e.currentTarget, (idx) => {\n\t\t\t\t\t\t\tconst newYear = YEARS[idx]\n\t\t\t\t\t\t\ttempYear(newYear)\n\t\t\t\t\t\t\tconst maxDay = daysInMonth(newYear, tempYear())\n\t\t\t\t\t\t\tif (tempDay() > maxDay) tempDay(maxDay)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonPointerCancel={(e) => yearWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{YEARS.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === YEARS.indexOf(y) ? selectedItemClass : ''}`} key={i}>{String(item)}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Month</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) monthWheel.mount(el) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => monthWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => monthWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => monthWheel.handlePointerUp(e, e.currentTarget, (idx) => {\n\t\t\t\t\t\t\ttempMonth(idx)\n\t\t\t\t\t\t\tconst maxDay = daysInMonth(tempYear(), idx)\n\t\t\t\t\t\t\tif (tempDay() > maxDay) tempDay(maxDay)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonPointerCancel={(e) => monthWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{MONTHS.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === m ? selectedItemClass : ''}`} key={i}>{MONTH_NAMES_SHORT[item]}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Day</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) dayWheel.mount(el) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => dayWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => dayWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => dayWheel.handlePointerUp(e, e.currentTarget, (idx) => tempDay(idx + 1))}\n\t\t\t\t\t\tonPointerCancel={(e) => dayWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{days.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === selDay - 1 ? selectedItemClass : ''}`} key={i}>{String(item)}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// ── DatePickerMobile ───────────────────────────────────────────────────────\n//\n// A mobile bottom-sheet date picker with iOS-style wheel columns for\n// year, month, and day. The trigger visually mimics <input type=\"date\">.\n//\n// Props:\n// value Date | (() => Date | null) — current selected date\n// onValueChange (Date | null) => void — called when user confirms\n// placeholder string — trigger placeholder text (default \"Select date\")\n// clearable boolean — show a \"Clear\" row in the sheet\n// clearLabel string — label for the clear row (default \"Clear\")\n// backdropClassName className for the backdrop\n// backdropStyle inline style for the backdrop\nconst DatePickerMobile = (props) => {\n\tconst [local] = splitProps(props, [\n\t\t'value', 'onValueChange', 'placeholder',\n\t\t'clearable', 'clearLabel',\n\t\t'backdropClassName', 'backdropStyle',\n\t])\n\n\tconst open = createSignal(false)\n\n\tconst resolveValue = () => {\n\t\tconst v = typeof local.value === 'function' ? local.value() : local.value\n\t\treturn v ?? null\n\t}\n\n\tconst tempYear = createSignal(2000)\n\tconst tempMonth = createSignal(0)\n\tconst tempDay = createSignal(1)\n\n\tcreateEffect(() => {\n\t\tif (!open()) return\n\t\tconst onKey = (e) => { if (e.key === 'Escape') cancel() }\n\t\tdocument.addEventListener('keydown', onKey)\n\t\tconst prevOverflow = document.body.style.overflow\n\t\tdocument.body.style.overflow = 'hidden'\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', onKey)\n\t\t\tdocument.body.style.overflow = prevOverflow\n\t\t}\n\t})\n\n\tconst openSheet = () => {\n\t\tconst d = resolveValue() || new Date()\n\t\ttempYear(d.getFullYear())\n\t\ttempMonth(d.getMonth())\n\t\ttempDay(Math.min(d.getDate(), daysInMonth(d.getFullYear(), d.getMonth())))\n\t\topen(true)\n\t}\n\n\tconst confirm = () => {\n\t\tconst date = toDate(tempYear(), tempMonth(), tempDay())\n\t\tlocal.onValueChange?.(date)\n\t\topen(false)\n\t}\n\n\tconst cancel = () => {\n\t\topen(false)\n\t}\n\n\tconst clear = () => {\n\t\tlocal.onValueChange?.(null)\n\t\topen(false)\n\t}\n\n\tconst dayItems = () => getDays(tempYear(), tempMonth())\n\n\treturn (\n\t\t<>\n\t\t\t<button type='button' className={triggerWrapperClass} onClick={openSheet}>\n\t\t\t\t{() => {\n\t\t\t\t\tconst d = resolveValue()\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span className={`${triggerClass} ${d ? triggerValueClass : triggerPlaceholderClass}`}>\n\t\t\t\t\t\t\t{d ? formatDateLabel(d) : (local.placeholder || 'Select date')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t<span className={calendarIconClass}>\n\t\t\t\t\t<CalendarIconComp />\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t{() => {\n\t\t\t\tif (!open()) return null\n\t\t\t\tconst y = tempYear()\n\t\t\t\tconst m = tempMonth()\n\t\t\t\tconst days = dayItems()\n\t\t\t\tconst selDay = tempDay()\n\n\t\t\t\treturn (\n\t\t\t\t\t<div className={`${overlayClass} ${openClass}`}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`${backdropClass} ${local.backdropClassName || ''}`}\n\t\t\t\t\t\t\tstyle={local.backdropStyle}\n\t\t\t\t\t\t\trole='presentation'\n\t\t\t\t\t\t\taria-hidden='true'\n\t\t\t\t\t\t\tonClick={cancel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className={sheetClass} role='dialog' aria-label='Date picker'>\n\t\t\t\t\t\t\t<div className={toolbarClass}>\n\t\t\t\t\t\t\t\t<button className={toolbarBtnClass} type='button' onClick={cancel}>Cancel</button>\n\t\t\t\t\t\t\t\t<span className={toolbarTitleClass}>Select Date</span>\n\t\t\t\t\t\t\t\t<button className={toolbarBtnClass} type='button' onClick={confirm}>Done</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={gradientOverlayClass} style={{ top: 0, height: `${CENTER_OFFSET}px`, background: 'linear-gradient(to bottom, var(--surface) 0%, transparent 100%)' }} />\n\t\t\t\t\t\t\t<div className={gradientOverlayClass} style={{ bottom: 0, height: `${CENTER_OFFSET}px`, background: 'linear-gradient(to top, var(--surface) 0%, transparent 100%)' }} />\n\t\t\t\t\t\t\t<div className={wheelAreaClass}>\n\t\t\t\t\t\t\t\t<Columns\n\t\t\t\t\t\t\t\t\ty={y}\n\t\t\t\t\t\t\t\t\tm={m}\n\t\t\t\t\t\t\t\t\tdays={days}\n\t\t\t\t\t\t\t\t\tselDay={selDay}\n\t\t\t\t\t\t\t\t\ttempYear={tempYear}\n\t\t\t\t\t\t\t\t\ttempMonth={tempMonth}\n\t\t\t\t\t\t\t\t\ttempDay={tempDay}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{local.clearable && (\n\t\t\t\t\t\t\t\t<button className={clearRowClass} type='button' onClick={clear}>\n\t\t\t\t\t\t\t\t\t{local.clearLabel || 'Clear'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t}}\n\t\t</>\n\t)\n}\n\nexport default DatePickerMobile\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["css","createEffect","createSignal","splitProps","Icon","CENTER_OFFSET","ITEM_HEIGHT","expandCircular","makeWheel","_tmpl6","_template","_tmpl5","_tmpl4","_tmpl3","_tmpl2","_tmpl","MONTH_NAMES_SHORT","daysInMonth","year","month","Date","getDate","YEARS","Array","from","length","_","i","MONTHS","getDays","count","toDate","day","formatDateLabel","date","getMonth","getFullYear","calendarSvg","triggerWrapperClass","position","width","background","border","padding","font","cursor","color","outline","borderRadius","boxShadow","triggerDisabledClass","opacity","triggerClass","height","fontSize","fontFamily","boxSizing","display","alignItems","triggerPlaceholderClass","triggerValueClass","calendarIconClass","right","top","transform","pointerEvents","overlayClass","inset","zIndex","flexDirection","justifyContent","backdropClass","transition","sheetClass","borderTop","paddingBottom","openClass","toolbarClass","borderBottom","flexShrink","toolbarBtnClass","WebkitTapHighlightColor","toolbarTitleClass","fontWeight","wheelAreaClass","gradientOverlayClass","left","columnWrapperClass","flex","overflow","columnLabelClass","textTransform","letterSpacing","marginBottom","columnViewportClass","touchAction","content","bottom","columnListClass","willChange","highlightBarClass","itemBaseClass","userSelect","whiteSpace","textOverflow","selectedItemClass","clearRowClass","gap","CalendarIconComp","_jsx","_mergeProps","svg","size","strokeWidth","mountWheel","el","wheel","_wheel","destroy","mount","Columns","y","m","days","selDay","tempYear","tempMonth","tempDay","yearWheel","indexOf","monthItems","monthStartIdx","monthWheel","dayItems","dayStartIdx","dayWheel","_el0","cloneNode","_el1","firstChild","_el2","_el3","nextSibling","_el4","_el5","_el6","_el7","_el8","_el9","_el10","_el11","_el12","_el13","_el14","_el15","_setProp","_insert","map","item","String","e","handlePointerDown","handlePointerMove","currentTarget","handlePointerUp","idx","newYear","maxDay","handlePointerCancel","DatePickerMobile","props","local","open","resolveValue","v","value","isDisabled","d","disabled","onKey","key","cancel","document","addEventListener","prevOverflow","body","style","removeEventListener","openSheet","Math","min","confirm","onValueChange","clear","_Fragment","children","placeholder","disabledClassName","backdropClassName","backdropStyle","clearable","clearLabel"],"sources":["../../../src/components/DatePickerMobile/index.jsx"],"sourcesContent":["import { css } from '@emotion/css'\nimport { createEffect, createSignal, splitProps } from '@plastic-js/plastic'\nimport Icon from '../Icon.jsx'\nimport { CENTER_OFFSET, ITEM_HEIGHT, expandCircular, makeWheel } from './wheel.js'\n\n// ── Date helpers ──────────────────────────────────────────────────────────\nconst MONTH_NAMES_SHORT = [\n\t'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\nconst daysInMonth = (year, month) => new Date(year, month + 1, 0).getDate()\n\nconst YEARS = Array.from({ length: 200 }, (_, i) => 1900 + i)\nconst MONTHS = Array.from({ length: 12 }, (_, i) => i)\n\nconst getDays = (year, month) => {\n\tconst count = daysInMonth(year, month)\n\treturn Array.from({ length: count }, (_, i) => i + 1)\n}\n\nconst toDate = (year, month, day) => new Date(year, month, day)\n\nconst formatDateLabel = (date) => {\n\tif (!date) return ''\n\treturn `${MONTH_NAMES_SHORT[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`\n}\n\n// ── SVGs ───────────────────────────────────────────────────────────────────\nconst calendarSvg = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>'\n\n// ── Styles ─────────────────────────────────────────────────────────────────\nconst triggerWrapperClass = css({\n\tposition: 'relative',\n\twidth: '100%',\n\tbackground: 'none',\n\tborder: 'none',\n\tpadding: 0,\n\tfont: 'inherit',\n\tcursor: 'pointer',\n\tcolor: 'inherit',\n\toutline: 'none',\n\tborderRadius: '10px',\n\t'&:focus-visible': { boxShadow: '0 0 0 2px var(--accent)' },\n})\n\nconst triggerDisabledClass = css({\n\topacity: 0.4,\n\tcursor: 'not-allowed',\n})\n\nconst triggerClass = css({\n\twidth: '100%',\n\theight: '42px',\n\tpadding: '0 36px 0 14px',\n\tbackground: 'rgba(255,255,255,0.06)',\n\tborder: '1px solid var(--border)',\n\tborderRadius: '10px',\n\tcolor: 'var(--ink)',\n\tfontSize: '16px',\n\tfontFamily: 'inherit',\n\toutline: 'none',\n\tboxSizing: 'border-box',\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tcursor: 'pointer',\n})\n\nconst triggerPlaceholderClass = css({\n\tcolor: 'var(--muted)',\n})\n\nconst triggerValueClass = css({\n\tcolor: 'var(--ink)',\n})\n\nconst calendarIconClass = css({\n\tposition: 'absolute',\n\tright: '10px',\n\ttop: '50%',\n\ttransform: 'translateY(-50%)',\n\twidth: '18px',\n\theight: '18px',\n\tcolor: 'var(--muted)',\n\tpointerEvents: 'none',\n})\n\nconst overlayClass = css({\n\tposition: 'fixed',\n\tinset: 0,\n\tzIndex: 1000,\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tjustifyContent: 'flex-end',\n\tpointerEvents: 'none',\n})\n\nconst backdropClass = css({\n\tposition: 'absolute',\n\tinset: 0,\n\tbackground: 'rgba(0,0,0,0.5)',\n\topacity: 0,\n\ttransition: 'opacity 240ms ease',\n})\n\nconst sheetClass = css({\n\tposition: 'relative',\n\twidth: '100%',\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\tbackground: 'var(--surface)',\n\tborderTop: '1px solid var(--border)',\n\tborderRadius: '18px 18px 0 0',\n\tboxShadow: '0 -8px 32px rgba(0,0,0,0.4)',\n\tpaddingBottom: 'env(safe-area-inset-bottom, 0px)',\n\ttransform: 'translateY(100%)',\n\ttransition: 'transform 280ms cubic-bezier(0.32, 0.72, 0, 1)',\n})\n\nconst openClass = css({\n\tpointerEvents: 'auto',\n\t[`& .${backdropClass}`]: { opacity: 1 },\n\t[`& .${sheetClass}`]: { transform: 'translateY(0)' },\n})\n\nconst toolbarClass = css({\n\tdisplay: 'flex',\n\tjustifyContent: 'space-between',\n\talignItems: 'center',\n\tpadding: '12px 16px',\n\tborderBottom: '1px solid var(--border)',\n\tflexShrink: 0,\n})\n\nconst toolbarBtnClass = css({\n\tbackground: 'none',\n\tborder: 'none',\n\tpadding: '6px 0',\n\tcolor: 'var(--accent)',\n\tfontSize: '16px',\n\tfontFamily: 'inherit',\n\tcursor: 'pointer',\n\tWebkitTapHighlightColor: 'transparent',\n})\n\nconst toolbarTitleClass = css({\n\tfontSize: '15px',\n\tfontWeight: 600,\n\tcolor: 'var(--ink)',\n})\n\nconst wheelAreaClass = css({\n\tdisplay: 'flex',\n\tjustifyContent: 'center',\n\talignItems: 'stretch',\n\tpadding: '12px 0 20px',\n\tposition: 'relative',\n})\n\nconst gradientOverlayClass = css({\n\tposition: 'absolute',\n\tleft: 0,\n\tright: 0,\n\tpointerEvents: 'none',\n\tzIndex: 2,\n})\n\nconst columnWrapperClass = css({\n\tflex: 1,\n\tdisplay: 'flex',\n\tflexDirection: 'column',\n\talignItems: 'center',\n\toverflow: 'hidden',\n\tposition: 'relative',\n})\n\nconst columnLabelClass = css({\n\tfontSize: '11px',\n\tcolor: 'var(--muted)',\n\ttextTransform: 'uppercase',\n\tletterSpacing: '0.5px',\n\tmarginBottom: '6px',\n\tfontWeight: 500,\n})\n\nconst columnViewportClass = css({\n\twidth: '100%',\n\theight: `${CENTER_OFFSET * 2 + ITEM_HEIGHT}px`,\n\toverflow: 'hidden',\n\tposition: 'relative',\n\ttouchAction: 'none',\n\t// Gradient overlays for iOS-style edge fade\n\t'&::before, &::after': {\n\t\tcontent: '\"\"',\n\t\tposition: 'absolute',\n\t\tleft: 0,\n\t\tright: 0,\n\t\theight: `${CENTER_OFFSET}px`,\n\t\tpointerEvents: 'none',\n\t\tzIndex: 2,\n\t},\n\t'&::before': {\n\t\ttop: 0,\n\t\tbackground: 'linear-gradient(to bottom, var(--surface) 0%, transparent 100%)',\n\t},\n\t'&::after': {\n\t\tbottom: 0,\n\t\tbackground: 'linear-gradient(to top, var(--surface) 0%, transparent 100%)',\n\t},\n})\n\nconst columnListClass = css({\n\twillChange: 'transform',\n})\n\nconst highlightBarClass = css({\n\tposition: 'absolute',\n\ttop: `${CENTER_OFFSET}px`,\n\tleft: '10%',\n\tright: '10%',\n\theight: `${ITEM_HEIGHT}px`,\n\tborderRadius: '8px',\n\tbackground: 'rgba(255,255,255,0.06)',\n\tpointerEvents: 'none',\n\tzIndex: 1,\n})\n\nconst itemBaseClass = css({\n\theight: `${ITEM_HEIGHT}px`,\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\tfontSize: '20px',\n\tcolor: 'var(--muted)',\n\tuserSelect: 'none',\n\twhiteSpace: 'nowrap',\n\toverflow: 'hidden',\n\ttextOverflow: 'ellipsis',\n\tpadding: '0 4px',\n\tboxSizing: 'border-box',\n})\n\nconst selectedItemClass = css({\n\tcolor: 'var(--ink)',\n\tfontWeight: 600,\n\tfontSize: '22px',\n})\n\nconst clearRowClass = css({\n\tdisplay: 'flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n\theight: '44px',\n\tgap: '6px',\n\tcolor: 'var(--accent)',\n\tfontSize: '15px',\n\tfontFamily: 'inherit',\n\tbackground: 'none',\n\tborder: 'none',\n\tborderTop: '1px solid var(--border)',\n\tcursor: 'pointer',\n\twidth: '100%',\n\tflexShrink: 0,\n\tpadding: 0,\n\t'&:active': { background: 'rgba(255,255,255,0.04)' },\n})\n\n// ── CalendarIcon ───────────────────────────────────────────────────────────\nfunction CalendarIconComp() {\n\treturn <Icon svg={calendarSvg} size={18} strokeWidth={1.5} />\n}\n\n// ── mountWheel ref helper ──────────────────────────────────────────────────\n//\n// Stores the wheel controller on the DOM element so that a subsequent mount\n// can destroy the previous instance first — prevents animation leaks.\nfunction mountWheel(el, wheel) {\n\tif (el._wheel && el._wheel !== wheel) {\n\t\tel._wheel.destroy()\n\t}\n\tel._wheel = wheel\n\twheel.mount(el)\n}\n\n// ── Columns ────────────────────────────────────────────────────────────────\n//\n// Renders the three wheel columns (year / month / day). Receives all data as\n// plain props so it can be used as a normal Plastic component.\nfunction Columns({ y, m, days, selDay, tempYear, tempMonth, tempDay }) {\n\tconst yearWheel = makeWheel(YEARS, YEARS.indexOf(y), false)\n\n\tconst [monthItems, monthStartIdx] = expandCircular(MONTHS, m)\n\tconst monthWheel = makeWheel(monthItems, monthStartIdx, true)\n\n\tconst [dayItems, dayStartIdx] = expandCircular(days, selDay - 1)\n\tconst dayWheel = makeWheel(dayItems, dayStartIdx, true)\n\n\treturn (\n\t\t<div style={{ display: 'flex', width: '100%' }}>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Year</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) mountWheel(el, yearWheel) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => yearWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => yearWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => yearWheel.handlePointerUp(e, e.currentTarget, (idx) => {\n\t\t\t\t\t\t\tconst newYear = YEARS[idx]\n\t\t\t\t\t\t\ttempYear(newYear)\n\t\t\t\t\t\t\tconst maxDay = daysInMonth(newYear, tempYear())\n\t\t\t\t\t\t\tif (tempDay() > maxDay) tempDay(maxDay)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonPointerCancel={(e) => yearWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{YEARS.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === YEARS.indexOf(y) ? selectedItemClass : ''}`} key={i}>{String(item)}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Month</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) mountWheel(el, monthWheel) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => monthWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => monthWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => monthWheel.handlePointerUp(e, e.currentTarget, (idx) => {\n\t\t\t\t\t\t\ttempMonth(idx)\n\t\t\t\t\t\t\tconst maxDay = daysInMonth(tempYear(), idx)\n\t\t\t\t\t\t\tif (tempDay() > maxDay) tempDay(maxDay)\n\t\t\t\t\t\t})}\n\t\t\t\t\t\tonPointerCancel={(e) => monthWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{monthItems.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === monthStartIdx ? selectedItemClass : ''}`} key={i}>{MONTH_NAMES_SHORT[item]}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className={columnWrapperClass}>\n\t\t\t\t<span className={columnLabelClass}>Day</span>\n\t\t\t\t<div className={columnViewportClass}>\n\t\t\t\t\t<div className={highlightBarClass} />\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={(el) => { if (el) mountWheel(el, dayWheel) }}\n\t\t\t\t\t\tclassName={columnListClass}\n\t\t\t\t\t\tonPointerDown={(e) => dayWheel.handlePointerDown(e)}\n\t\t\t\t\t\tonPointerMove={(e) => dayWheel.handlePointerMove(e, e.currentTarget)}\n\t\t\t\t\t\tonPointerUp={(e) => dayWheel.handlePointerUp(e, e.currentTarget, (idx) => tempDay(idx + 1))}\n\t\t\t\t\t\tonPointerCancel={(e) => dayWheel.handlePointerCancel(e, e.currentTarget)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{dayItems.map((item, i) => (\n\t\t\t\t\t\t\t<div className={`${itemBaseClass} ${i === dayStartIdx ? selectedItemClass : ''}`} key={i}>{String(item)}</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// ── DatePickerMobile ───────────────────────────────────────────────────────\n//\n// A mobile bottom-sheet date picker with iOS-style wheel columns for\n// year, month, and day. The trigger visually mimics <input type=\"date\">.\n//\n// Props:\n// value Date | (() => Date | null) — current selected date\n// onValueChange (Date | null) => void — called when user confirms\n// placeholder string — trigger placeholder text (default \"Select date\")\n// clearable boolean — show a \"Clear\" row in the sheet\n// clearLabel string — label for the clear row (default \"Clear\")\n// disabled boolean — disable interaction (default false)\n// disabledClassName string — additional class when disabled\n// backdropClassName className for the backdrop\n// backdropStyle inline style for the backdrop\nconst DatePickerMobile = (props) => {\n\tconst [local] = splitProps(props, [\n\t\t'value', 'onValueChange', 'placeholder',\n\t\t'clearable', 'clearLabel',\n\t\t'disabled', 'disabledClassName',\n\t\t'backdropClassName', 'backdropStyle',\n\t])\n\n\tconst open = createSignal(false)\n\n\tconst resolveValue = () => {\n\t\tconst v = typeof local.value === 'function' ? local.value() : local.value\n\t\treturn v ?? null\n\t}\n\n\tconst isDisabled = () => {\n\t\tconst d = typeof local.disabled === 'function' ? local.disabled() : local.disabled\n\t\treturn !!d\n\t}\n\n\tconst tempYear = createSignal(2000)\n\tconst tempMonth = createSignal(0)\n\tconst tempDay = createSignal(1)\n\n\tcreateEffect(() => {\n\t\tif (!open()) return\n\t\tconst onKey = (e) => { if (e.key === 'Escape') cancel() }\n\t\tdocument.addEventListener('keydown', onKey)\n\t\tconst prevOverflow = document.body.style.overflow\n\t\tdocument.body.style.overflow = 'hidden'\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', onKey)\n\t\t\tdocument.body.style.overflow = prevOverflow\n\t\t}\n\t})\n\n\tconst openSheet = () => {\n\t\tif (isDisabled()) return\n\t\tconst d = resolveValue() || new Date()\n\t\ttempYear(d.getFullYear())\n\t\ttempMonth(d.getMonth())\n\t\ttempDay(Math.min(d.getDate(), daysInMonth(d.getFullYear(), d.getMonth())))\n\t\topen(true)\n\t}\n\n\tconst confirm = () => {\n\t\tconst date = toDate(tempYear(), tempMonth(), tempDay())\n\t\tlocal.onValueChange?.(date)\n\t\topen(false)\n\t}\n\n\tconst cancel = () => {\n\t\topen(false)\n\t}\n\n\tconst clear = () => {\n\t\tlocal.onValueChange?.(null)\n\t\topen(false)\n\t}\n\n\tconst dayItems = () => getDays(tempYear(), tempMonth())\n\n\treturn (\n\t\t<>\n\t\t\t<button\n\t\t\t\ttype='button'\n\t\t\t\tclassName={`${triggerWrapperClass} ${isDisabled() ? `${triggerDisabledClass} ${local.disabledClassName || ''}` : ''}`}\n\t\t\t\tonClick={openSheet}\n\t\t\t\taria-disabled={isDisabled()}\n\t\t\t>\n\t\t\t\t{() => {\n\t\t\t\t\tconst d = resolveValue()\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span className={`${triggerClass} ${d ? triggerValueClass : triggerPlaceholderClass}`}>\n\t\t\t\t\t\t\t{d ? formatDateLabel(d) : (local.placeholder || 'Select date')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t<span className={calendarIconClass}>\n\t\t\t\t\t<CalendarIconComp />\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t{() => {\n\t\t\t\tif (!open()) return null\n\t\t\t\tconst y = tempYear()\n\t\t\t\tconst m = tempMonth()\n\t\t\t\tconst days = dayItems()\n\t\t\t\tconst selDay = tempDay()\n\n\t\t\t\treturn (\n\t\t\t\t\t<div className={`${overlayClass} ${openClass}`}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`${backdropClass} ${local.backdropClassName || ''}`}\n\t\t\t\t\t\t\tstyle={local.backdropStyle}\n\t\t\t\t\t\t\trole='presentation'\n\t\t\t\t\t\t\taria-hidden='true'\n\t\t\t\t\t\t\tonClick={cancel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className={sheetClass} role='dialog' aria-label='Date picker'>\n\t\t\t\t\t\t\t<div className={toolbarClass}>\n\t\t\t\t\t\t\t\t<button className={toolbarBtnClass} type='button' onClick={cancel}>Cancel</button>\n\t\t\t\t\t\t\t\t<span className={toolbarTitleClass}>Select Date</span>\n\t\t\t\t\t\t\t\t<button className={toolbarBtnClass} type='button' onClick={confirm}>Done</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className={wheelAreaClass}>\n\t\t\t\t\t\t\t\t<Columns\n\t\t\t\t\t\t\t\t\ty={y}\n\t\t\t\t\t\t\t\t\tm={m}\n\t\t\t\t\t\t\t\t\tdays={days}\n\t\t\t\t\t\t\t\t\tselDay={selDay}\n\t\t\t\t\t\t\t\t\ttempYear={tempYear}\n\t\t\t\t\t\t\t\t\ttempMonth={tempMonth}\n\t\t\t\t\t\t\t\t\ttempDay={tempDay}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{local.clearable && (\n\t\t\t\t\t\t\t\t<button className={clearRowClass} type='button' onClick={clear}>\n\t\t\t\t\t\t\t\t\t{local.clearLabel || 'Clear'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t}}\n\t\t</>\n\t)\n}\n\nexport default DatePickerMobile\n"],"mappings":";;;;;;AAKA,IAAAS,SAAAC,SAAA,mCAAA;AAAA,IAAAC,SAAAD,SAAA,sPAAA;AAAA,IAAAE,SAAAF,SAAA,eAAA;AAAA,IAAAG,SAAAH,SAAA,mDAAA;AAAA,IAAAI,SAAAJ,SAAA,aAAA;AAAA,IAAAK,QAAAL,SAAA,oMAAA;AACA,IAAMM,oBAAoB;CACzB;CAAO;CAAO;CAAO;CAAO;CAAO;CACnC;CAAO;CAAO;CAAO;CAAO;CAAO;AAAK;AAGzC,IAAMC,eAAeC,MAAMC,UAAU,IAAIC,KAAKF,MAAMC,QAAQ,GAAG,CAAC,EAAEE,QAAQ;AAE1E,IAAMC,QAAQC,MAAMC,KAAK,EAAEC,QAAQ,IAAI,IAAIC,GAAGC,MAAM,OAAOA,CAAC;AAC5D,IAAMC,SAASL,MAAMC,KAAK,EAAEC,QAAQ,GAAG,IAAIC,GAAGC,MAAMA,CAAC;AAErD,IAAME,WAAWX,MAAMC,UAAU;CAChC,MAAMW,QAAQb,YAAYC,MAAMC,KAAK;CACrC,OAAOI,MAAMC,KAAK,EAAEC,QAAQK,MAAM,IAAIJ,GAAGC,MAAMA,IAAI,CAAC;AACrD;AAEA,IAAMI,UAAUb,MAAMC,OAAOa,QAAQ,IAAIZ,KAAKF,MAAMC,OAAOa,GAAG;AAE9D,IAAMC,mBAAmBC,SAAS;CACjC,IAAI,CAACA,MAAM,OAAO;CAClB,OAAO,GAAGlB,kBAAkBkB,KAAKC,SAAS,GAAE,GAAID,KAAKb,QAAQ,EAAC,IAAKa,KAAKE,YAAY;AACrF;AAGA,IAAMC,cAAc;AAGpB,IAAMC,sBAAsBtC,IAAI;CAC/BuC,UAAU;CACVC,OAAO;CACPC,YAAY;CACZC,QAAQ;CACRC,SAAS;CACTC,MAAM;CACNC,QAAQ;CACRC,OAAO;CACPC,SAAS;CACTC,cAAc;CACd,mBAAmB,EAAEC,WAAW,0BAA0B;AAC3D,CAAC;AAED,IAAMC,uBAAuBlD,IAAI;CAChCmD,SAAS;CACTN,QAAQ;AACT,CAAC;AAED,IAAMO,eAAepD,IAAI;CACxBwC,OAAO;CACPa,QAAQ;CACRV,SAAS;CACTF,YAAY;CACZC,QAAQ;CACRM,cAAc;CACdF,OAAO;CACPQ,UAAU;CACVC,YAAY;CACZR,SAAS;CACTS,WAAW;CACXC,SAAS;CACTC,YAAY;CACZb,QAAQ;AACT,CAAC;AAED,IAAMc,0BAA0B3D,IAAI,EACnC8C,OAAO,eACR,CAAC;AAED,IAAMc,oBAAoB5D,IAAI,EAC7B8C,OAAO,aACR,CAAC;AAED,IAAMe,oBAAoB7D,IAAI;CAC7BuC,UAAU;CACVuB,OAAO;CACPC,KAAK;CACLC,WAAW;CACXxB,OAAO;CACPa,QAAQ;CACRP,OAAO;CACPmB,eAAe;AAChB,CAAC;AAED,IAAMC,eAAelE,IAAI;CACxBuC,UAAU;CACV4B,OAAO;CACPC,QAAQ;CACRX,SAAS;CACTY,eAAe;CACfC,gBAAgB;CAChBL,eAAe;AAChB,CAAC;AAED,IAAMM,gBAAgBvE,IAAI;CACzBuC,UAAU;CACV4B,OAAO;CACP1B,YAAY;CACZU,SAAS;CACTqB,YAAY;AACb,CAAC;AAED,IAAMC,aAAazE,IAAI;CACtBuC,UAAU;CACVC,OAAO;CACPiB,SAAS;CACTY,eAAe;CACf5B,YAAY;CACZiC,WAAW;CACX1B,cAAc;CACdC,WAAW;CACX0B,eAAe;CACfX,WAAW;CACXQ,YAAY;AACb,CAAC;AAED,IAAMI,YAAY5E,IAAI;CACrBiE,eAAe;EACd,MAAMM,kBAAkB,EAAEpB,SAAS,EAAE;EACrC,MAAMsB,eAAe,EAAET,WAAW,gBAAgB;AACpD,CAAC;AAED,IAAMa,eAAe7E,IAAI;CACxByD,SAAS;CACTa,gBAAgB;CAChBZ,YAAY;CACZf,SAAS;CACTmC,cAAc;CACdC,YAAY;AACb,CAAC;AAED,IAAMC,kBAAkBhF,IAAI;CAC3ByC,YAAY;CACZC,QAAQ;CACRC,SAAS;CACTG,OAAO;CACPQ,UAAU;CACVC,YAAY;CACZV,QAAQ;CACRoC,yBAAyB;AAC1B,CAAC;AAED,IAAMC,oBAAoBlF,IAAI;CAC7BsD,UAAU;CACV6B,YAAY;CACZrC,OAAO;AACR,CAAC;AAED,IAAMsC,iBAAiBpF,IAAI;CAC1ByD,SAAS;CACTa,gBAAgB;CAChBZ,YAAY;CACZf,SAAS;CACTJ,UAAU;AACX,CAAC;AAE4BvC,IAAI;CAChCuC,UAAU;CACV+C,MAAM;CACNxB,OAAO;CACPG,eAAe;CACfG,QAAQ;AACT,CAAC;AAED,IAAMmB,qBAAqBvF,IAAI;CAC9BwF,MAAM;CACN/B,SAAS;CACTY,eAAe;CACfX,YAAY;CACZ+B,UAAU;CACVlD,UAAU;AACX,CAAC;AAED,IAAMmD,mBAAmB1F,IAAI;CAC5BsD,UAAU;CACVR,OAAO;CACP6C,eAAe;CACfC,eAAe;CACfC,cAAc;CACdV,YAAY;AACb,CAAC;AAED,IAAMW,sBAAsB9F,IAAI;CAC/BwC,OAAO;CACPa,QAAQ;CACRoC,UAAU;CACVlD,UAAU;CACVwD,aAAa;CAEb,uBAAuB;EACtBC,SAAS;EACTzD,UAAU;EACV+C,MAAM;EACNxB,OAAO;EACPT,QAAQ;EACRY,eAAe;EACfG,QAAQ;CACT;CACA,aAAa;EACZL,KAAK;EACLtB,YAAY;CACb;CACA,YAAY;EACXwD,QAAQ;EACRxD,YAAY;CACb;AACD,CAAC;AAED,IAAMyD,kBAAkBlG,IAAI,EAC3BmG,YAAY,YACb,CAAC;AAED,IAAMC,oBAAoBpG,IAAI;CAC7BuC,UAAU;CACVwB,KAAK;CACLuB,MAAM;CACNxB,OAAO;CACPT,QAAQ;CACRL,cAAc;CACdP,YAAY;CACZwB,eAAe;CACfG,QAAQ;AACT,CAAC;AAED,IAAMiC,gBAAgBrG,IAAI;CACzBqD,QAAQ;CACRI,SAAS;CACTC,YAAY;CACZY,gBAAgB;CAChBhB,UAAU;CACVR,OAAO;CACPwD,YAAY;CACZC,YAAY;CACZd,UAAU;CACVe,cAAc;CACd7D,SAAS;CACTa,WAAW;AACZ,CAAC;AAED,IAAMiD,oBAAoBzG,IAAI;CAC7B8C,OAAO;CACPqC,YAAY;CACZ7B,UAAU;AACX,CAAC;AAED,IAAMoD,gBAAgB1G,IAAI;CACzByD,SAAS;CACTC,YAAY;CACZY,gBAAgB;CAChBjB,QAAQ;CACRsD,KAAK;CACL7D,OAAO;CACPQ,UAAU;CACVC,YAAY;CACZd,YAAY;CACZC,QAAQ;CACRgC,WAAW;CACX7B,QAAQ;CACRL,OAAO;CACPuC,YAAY;CACZpC,SAAS;CACT,YAAY,EAAEF,YAAY,yBAAyB;AACpD,CAAC;AAGD,SAASmE,mBAAmB;CAC3B,OAAAC,IAAAzG,MAAA0G,WAAA;EAAAC,KAAkB1E;EAAW2E,MAAQ;EAAEC,aAAe;CAAG,CAAA,CAAA;AAC1D;AAMA,SAASC,WAAWC,IAAIC,OAAO;CAC9B,IAAID,GAAGE,UAAUF,GAAGE,WAAWD,OAC9BD,GAAGE,OAAOC,QAAQ;CAEnBH,GAAGE,SAASD;CACZA,MAAMG,MAAMJ,EAAE;AACf;AAMA,SAASK,QAAQ,EAAEC,GAAGC,GAAGC,MAAMC,QAAQC,UAAUC,WAAWC,WAAW;CACtE,MAAMC,YAAYxH,UAAUc,OAAOA,MAAM2G,QAAQR,CAAC,GAAG,KAAK;CAE1D,MAAM,CAACS,YAAYC,iBAAiB5H,eAAeqB,QAAQ8F,CAAC;CAC5D,MAAMU,aAAa5H,UAAU0H,YAAYC,eAAe,IAAI;CAE5D,MAAM,CAACE,UAAUC,eAAe/H,eAAeoH,MAAMC,SAAS,CAAC;CAC/D,MAAMW,WAAW/H,UAAU6H,UAAUC,aAAa,IAAI;CAEtD,aAAA;EAAA,MAAAE,OAAAzH,MAAA0H,UAAA,IAAA;EAAA,MAAAC,OAAAF,KAAAG;EAAA,MAAAC,OAAAF,KAAAC;EAAA,MAAAE,OAAAH,KAAAC,WAAAG;EAAA,MAAAC,OAAAF,KAAAF;EAAA,MAAAK,OAAAH,KAAAF,WAAAG;EAAA,MAAAG,OAAAT,KAAAG,WAAAG;EAAA,MAAAI,OAAAD,KAAAN;EAAA,MAAAQ,OAAAF,KAAAN,WAAAG;EAAA,MAAAM,OAAAD,KAAAR;EAAA,MAAAU,QAAAF,KAAAR,WAAAG;EAAA,MAAAQ,QAAAd,KAAAG,WAAAG,YAAAA;EAAA,MAAAS,QAAAD,MAAAX;EAAA,MAAAa,QAAAF,MAAAX,WAAAG;EAAA,MAAAW,QAAAD,MAAAb;EAAA,MAAAe,QAAAF,MAAAb,WAAAG;EAAAa,QAAAf,MAAA,mBAGoBlD,gBAAgB;EAAAiE,QAAAZ,MAAA,mBAEhB3C,iBAAiB;EAAAwD,OAAAZ,YAc/B1H,MAAMuI,KAAKC,MAAMnI,YAAC;GAAA,MAAA6G,OAAA1H,OAAA2H,UAAA,IAAA;GAAAmB,OAAApB,YAC8EuB,OAAOD,IAAI,CAAC;GAAAH,QAAAnB,MAAA,mBAA5F,GAAGnC,cAAa,GAAI1E,MAAML,MAAM2G,QAAQR,CAAC,IAAIhB,oBAAoB,IAAI;GAAAkD,QAAAnB,MAAA,aAAO7G,CAAC;GAAA,OAAA6G;EAAA,CAC7F,CAAC;EAAAmB,QAAAX,MAAA,QAdI7B,OAAO;GAAE,IAAIA,IAAID,WAAWC,IAAIa,SAAS;EAAE,CAAC;EAAA2B,QAAAX,MAAA,mBACvC9C,eAAe;EAAAyD,QAAAX,MAAA,kBACVgB,MAAMhC,UAAUiC,kBAAkBD,CAAC,CAAC;EAAAL,QAAAX,MAAA,kBACpCgB,MAAMhC,UAAUkC,kBAAkBF,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAX,MAAA,gBACvDgB,MAAMhC,UAAUoC,gBAAgBJ,GAAGA,EAAEG,gBAAgBE,QAAQ;GAC1E,MAAMC,UAAUhJ,MAAM+I;GACtBxC,SAASyC,OAAO;GAChB,MAAMC,SAAStJ,YAAYqJ,SAASzC,SAAS,CAAC;GAC9C,IAAIE,QAAQ,IAAIwC,QAAQxC,QAAQwC,MAAM;EACvC,CAAC,CAAC;EAAAZ,QAAAX,MAAA,oBACgBgB,MAAMhC,UAAUwC,oBAAoBR,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAd,MAAA,mBAb3D/C,mBAAmB;EAAA6D,QAAAjB,MAAA,mBAFpBnD,kBAAkB;EAAAoE,QAAAT,MAAA,mBAwBhBxD,gBAAgB;EAAAiE,QAAAP,MAAA,mBAEhBhD,iBAAiB;EAAAwD,OAAAP,aAa/BnB,WAAW2B,KAAKC,MAAMnI,YAAC;GAAA,MAAA6G,OAAA1H,OAAA2H,UAAA,IAAA;GAAAmB,OAAApB,YACsExH,kBAAkB8I,KAAK;GAAAH,QAAAnB,MAAA,mBAApG,GAAGnC,cAAa,GAAI1E,MAAMwG,gBAAgB1B,oBAAoB,IAAI;GAAAkD,QAAAnB,MAAA,aAAO7G,CAAC;GAAA,OAAA6G;EAAA,CAC1F,CAAC;EAAAmB,QAAAN,OAAA,QAbIlC,OAAO;GAAE,IAAIA,IAAID,WAAWC,IAAIiB,UAAU;EAAE,CAAC;EAAAuB,QAAAN,OAAA,mBACxCnD,eAAe;EAAAyD,QAAAN,OAAA,kBACVW,MAAM5B,WAAW6B,kBAAkBD,CAAC,CAAC;EAAAL,QAAAN,OAAA,kBACrCW,MAAM5B,WAAW8B,kBAAkBF,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAN,OAAA,gBACxDW,MAAM5B,WAAWgC,gBAAgBJ,GAAGA,EAAEG,gBAAgBE,QAAQ;GAC3EvC,UAAUuC,GAAG;GACb,MAAME,SAAStJ,YAAY4G,SAAS,GAAGwC,GAAG;GAC1C,IAAItC,QAAQ,IAAIwC,QAAQxC,QAAQwC,MAAM;EACvC,CAAC,CAAC;EAAAZ,QAAAN,OAAA,oBACgBW,MAAM5B,WAAWoC,oBAAoBR,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAR,MAAA,mBAZ5DrD,mBAAmB;EAAA6D,QAAAV,MAAA,mBAFpB1D,kBAAkB;EAAAoE,QAAAJ,OAAA,mBAuBhB7D,gBAAgB;EAAAiE,QAAAF,OAAA,mBAEhBrD,iBAAiB;EAAAwD,OAAAF,aAS/BrB,SAASwB,KAAKC,MAAMnI,YAAC;GAAA,MAAA6G,OAAA1H,OAAA2H,UAAA,IAAA;GAAAmB,OAAApB,YACsEuB,OAAOD,IAAI,CAAC;GAAAH,QAAAnB,MAAA,mBAAvF,GAAGnC,cAAa,GAAI1E,MAAM2G,cAAc7B,oBAAoB,IAAI;GAAAkD,QAAAnB,MAAA,aAAO7G,CAAC;GAAA,OAAA6G;EAAA,CACxF,CAAC;EAAAmB,QAAAD,OAAA,QATIvC,OAAO;GAAE,IAAIA,IAAID,WAAWC,IAAIoB,QAAQ;EAAE,CAAC;EAAAoB,QAAAD,OAAA,mBACtCxD,eAAe;EAAAyD,QAAAD,OAAA,kBACVM,MAAMzB,SAAS0B,kBAAkBD,CAAC,CAAC;EAAAL,QAAAD,OAAA,kBACnCM,MAAMzB,SAAS2B,kBAAkBF,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAD,OAAA,gBACtDM,MAAMzB,SAAS6B,gBAAgBJ,GAAGA,EAAEG,gBAAgBE,QAAQtC,QAAQsC,MAAM,CAAC,CAAC,CAAC;EAAAV,QAAAD,OAAA,oBACzEM,MAAMzB,SAASiC,oBAAoBR,GAAGA,EAAEG,aAAa,CAAC;EAAAR,QAAAH,OAAA,mBAR1D1D,mBAAmB;EAAA6D,QAAAL,OAAA,mBAFpB/D,kBAAkB;EAAAoE,QAAAnB,MAAA,gBA9CvB;GAAE/E,SAAS;GAAQjB,OAAO;EAAO,EAAC;EAAA,OAAAgG;CAAA;AAkEhD;AAiBA,IAAMiC,oBAAoBC,UAAU;CACnC,MAAM,CAACC,SAASxK,WAAWuK,OAAO;EACjC;EAAS;EAAiB;EAC1B;EAAa;EACb;EAAY;EACZ;EAAqB;CAAe,CACpC;CAED,MAAME,OAAO1K,aAAa,KAAK;CAE/B,MAAM2K,qBAAqB;EAE1B,QADU,OAAOF,MAAMI,UAAU,aAAaJ,MAAMI,MAAM,IAAIJ,MAAMI,UACxD;CACb;CAEA,MAAMC,mBAAmB;EAExB,OAAO,CAAC,EADE,OAAOL,MAAMO,aAAa,aAAaP,MAAMO,SAAS,IAAIP,MAAMO;CAE3E;CAEA,MAAMrD,WAAW3H,aAAa,GAAI;CAClC,MAAM4H,YAAY5H,aAAa,CAAC;CAChC,MAAM6H,UAAU7H,aAAa,CAAC;CAE9BD,mBAAmB;EAClB,IAAI,CAAC2K,KAAK,GAAG;EACb,MAAMO,SAASnB,MAAM;GAAE,IAAIA,EAAEoB,QAAQ,UAAUC,OAAO;EAAE;EACxDC,SAASC,iBAAiB,WAAWJ,KAAK;EAC1C,MAAMK,eAAeF,SAASG,KAAKC,MAAMjG;EACzC6F,SAASG,KAAKC,MAAMjG,WAAW;EAC/B,aAAa;GACZ6F,SAASK,oBAAoB,WAAWR,KAAK;GAC7CG,SAASG,KAAKC,MAAMjG,WAAW+F;EAChC;CACD,CAAC;CAED,MAAMI,kBAAkB;EACvB,IAAIZ,WAAW,GAAG;EAClB,MAAMC,IAAIJ,aAAa,qBAAK,IAAIzJ,KAAK;EACrCyG,SAASoD,EAAE7I,YAAY,CAAC;EACxB0F,UAAUmD,EAAE9I,SAAS,CAAC;EACtB4F,QAAQ8D,KAAKC,IAAIb,EAAE5J,QAAQ,GAAGJ,YAAYgK,EAAE7I,YAAY,GAAG6I,EAAE9I,SAAS,CAAC,CAAC,CAAC;EACzEyI,KAAK,IAAI;CACV;CAEA,MAAMmB,gBAAgB;EACrB,MAAM7J,OAAOH,OAAO8F,SAAS,GAAGC,UAAU,GAAGC,QAAQ,CAAC;EACtD4C,MAAMqB,gBAAgB9J,IAAI;EAC1B0I,KAAK,KAAK;CACX;CAEA,MAAMS,eAAe;EACpBT,KAAK,KAAK;CACX;CAEA,MAAMqB,cAAc;EACnBtB,MAAMqB,gBAAgB,IAAI;EAC1BpB,KAAK,KAAK;CACX;CAEA,MAAMvC,iBAAiBxG,QAAQgG,SAAS,GAAGC,UAAU,CAAC;CAEtD,OAAAjB,IAAAqF,UAAA,EAAAC,UAAA,OAAA;EAAA,MAAA3D,OAAA3H,OAAA4H,UAAA,IAAA;EAAA,MAAAC,OAAAF,KAAAG;EAAA,MAAAC,OAAAJ,KAAAG,WAAAG;EAAAc,OAAApB,YAQU;GACN,MAAMyC,IAAIJ,aAAa;GACvB,aAAA;IAAA,MAAArC,OAAA5H,OAAA6H,UAAA,IAAA;IAAAmB,OAAApB,YAEGyC,IAAIhJ,gBAAgBgJ,CAAC,IAAKN,MAAMyB,eAAe,aAAc;IAAAzC,QAAAnB,MAAA,mBAD9C,GAAGpF,aAAY,GAAI6H,IAAIrH,oBAAoBD,yBAAyB;IAAA,OAAA6E;GAAA;EAIvF,GAACE,IAAA;EAAAkB,OAAAhB,YAAA/B,IAAAD,kBAAA,CAAA,CAAA,CAAA;EAAA+C,QAAAf,MAAA,mBACgB/E,iBAAiB;EAAA8F,QAAAnB,MAAA,mBAZvB,GAAGlG,oBAAmB,GAAI0I,WAAW,IAAI,GAAG9H,qBAAoB,GAAIyH,MAAM0B,qBAAqB,OAAO,IAAI;EAAA1C,QAAAnB,MAAA,iBAC5GoD,SAAS;EAAAjC,QAAAnB,MAAA,uBACHwC,WAAW,CAAC;EAAA,OAAAxC;CAAA,SAerB;EACN,IAAI,CAACoC,KAAK,GAAG,OAAO;EACpB,MAAMnD,IAAII,SAAS;EACnB,MAAMH,IAAII,UAAU;EACpB,MAAMH,OAAOU,SAAS;EACtB,MAAMT,SAASG,QAAQ;EAEvB,aAAA;GAAA,MAAAS,OAAA7H,OAAA8H,UAAA,IAAA;GAAA,MAAAC,OAAAF,KAAAG;GAAA,MAAAC,OAAAJ,KAAAG,WAAAG;GAAA,MAAAD,OAAAD,KAAAD;GAAA,MAAAI,OAAAF,KAAAF;GAAA,MAAAK,OAAAH,KAAAF,WAAAG;GAAA,MAAAG,OAAAJ,KAAAF,WAAAG,YAAAA;GAAA,MAAAI,OAAAN,KAAAD,WAAAG;GAAA,MAAAK,OAAAP,KAAAD,WAAAG,YAAAA;GAAAa,QAAAjB,MAAA,mBAGc,GAAGnE,cAAa,GAAIoG,MAAM2B,qBAAqB,IAAI;GAAA3C,QAAAjB,MAAA,eACvDiC,MAAM4B,aAAa;GAAA5C,QAAAjB,MAAA,iBAGjB2C,MAAM;GAAA1B,QAAAZ,MAAA,mBAIK/D,eAAe;GAAA2E,QAAAZ,MAAA,iBAAyBsC,MAAM;GAAA1B,QAAAX,MAAA,mBAChD9D,iBAAiB;GAAAyE,QAAAV,MAAA,mBACfjE,eAAe;GAAA2E,QAAAV,MAAA,iBAAyB8C,OAAO;GAAApC,QAAAd,MAAA,mBAHnDhE,YAAY;GAAA+E,OAAAV,YAAArC,IAAAW,SAAAV,WAAA;IAOvBW;IACAC;IACGC;IACEC;IACEC;IACCC;IACFC;GAAO,CAAA,CAAA,CAAA;GAAA4B,QAAAT,MAAA,mBARF9D,cAAc;GAAAwE,OAAAhB,YAW7B+B,MAAM6B,oBAAS;IAAA,MAAAhE,OAAA/H,OAAAgI,UAAA,IAAA;IAAAmB,OAAApB,YAEbmC,MAAM8B,cAAc,OAAO;IAAA9C,QAAAnB,MAAA,mBADV9B,aAAa;IAAAiD,QAAAnB,MAAA,iBAAyByD,KAAK;IAAA,OAAAzD;GAAA,IAG9DW,IAAA;GAAAQ,QAAAf,MAAA,mBArBcnE,UAAU;GAAAkF,QAAAnB,MAAA,mBARX,GAAGtE,aAAY,GAAIU,WAAW;GAAA,OAAA4D;EAAA;CAiChD,CAAC,EAAA,CAAA;AAGJ"}
@@ -1,35 +1,51 @@
1
+ function expandCircular(items, index) {
2
+ const len = items.length;
3
+ if (len === 0) return [items, index];
4
+ return [[
5
+ ...items,
6
+ ...items,
7
+ ...items
8
+ ], len + index];
9
+ }
1
10
  function clampOffset(offset, itemCount) {
2
11
  const max = 72;
3
12
  const min = 72 - Math.max(0, itemCount - 1) * 36;
4
13
  return Math.max(min, Math.min(max, offset));
5
14
  }
6
- function getIndexFromOffset(offset, itemCount) {
7
- const raw = Math.round((72 - offset) / 36);
8
- return Math.max(0, Math.min(itemCount - 1, raw));
9
- }
10
- function snapAnimation(el, from, to, onComplete) {
11
- const duration = 180;
12
- const startTime = performance.now();
13
- function tick(now) {
14
- const t = Math.min((now - startTime) / duration, 1);
15
- const ease = 1 - Math.pow(1 - t, 3);
16
- const current = from + (to - from) * ease;
17
- el.style.transform = `translateY(${current}px)`;
18
- if (t < 1) requestAnimationFrame(tick);
19
- else onComplete?.();
20
- }
21
- requestAnimationFrame(tick);
22
- }
23
- function makeWheel(items, index) {
24
- let translateY = clampOffset(72 - index * 36, items.length);
15
+ function makeWheel(displayItems, displayIndex, circular) {
16
+ const baseLen = circular ? Math.round(displayItems.length / 3) : displayItems.length;
17
+ let translateY = circular ? 72 - displayIndex * 36 : clampOffset(72 - displayIndex * 36, displayItems.length);
25
18
  let drag = null;
26
19
  let animFrame = null;
20
+ function clampOrPass(v) {
21
+ if (!circular) return clampOffset(v, displayItems.length);
22
+ const maxV = 108;
23
+ const minV = 72 - (2 * baseLen + 1) * 36;
24
+ if (v > maxV) return maxV + (v - maxV) * .15;
25
+ if (v < minV) return minV + (v - minV) * .15;
26
+ return v;
27
+ }
28
+ function resolveIndex(offset) {
29
+ const raw = Math.round((72 - offset) / 36);
30
+ if (circular) return (raw % baseLen + baseLen) % baseLen;
31
+ return Math.max(0, Math.min(displayItems.length - 1, raw));
32
+ }
33
+ function nearestCopyOffset(idx, currentOffset) {
34
+ if (!circular) return 72 - idx * 36;
35
+ return [
36
+ 0,
37
+ 1,
38
+ 2
39
+ ].map((c) => 72 - (c * baseLen + idx) * 36).reduce((a, b) => Math.abs(a - currentOffset) < Math.abs(b - currentOffset) ? a : b);
40
+ }
27
41
  return {
28
42
  mount(el) {
43
+ el.style.transition = "none";
29
44
  el.style.transform = `translateY(${translateY}px)`;
30
45
  },
31
46
  destroy() {
32
47
  cancelAnimationFrame(animFrame);
48
+ animFrame = null;
33
49
  drag = null;
34
50
  },
35
51
  handlePointerDown(e) {
@@ -51,8 +67,9 @@ function makeWheel(items, index) {
51
67
  if (dt > 0) drag.velocity = (e.clientY - drag.lastY) / dt;
52
68
  drag.lastY = e.clientY;
53
69
  drag.lastTime = now;
54
- const offset = clampOffset(drag.startTranslate + dy, items.length);
70
+ const offset = clampOrPass(drag.startTranslate + dy);
55
71
  translateY = offset;
72
+ el.style.transition = "none";
56
73
  el.style.transform = `translateY(${offset}px)`;
57
74
  },
58
75
  handlePointerUp(e, el, onChange) {
@@ -60,23 +77,25 @@ function makeWheel(items, index) {
60
77
  const vel = drag.velocity;
61
78
  drag = null;
62
79
  let finalOffset = translateY;
63
- if (Math.abs(vel) > .3) finalOffset = clampOffset(finalOffset + vel * 120, items.length);
64
- const idx = getIndexFromOffset(finalOffset, items.length);
65
- const target = clampOffset(72 - idx * 36, items.length);
80
+ if (Math.abs(vel) > .3) finalOffset = clampOrPass(finalOffset + vel * 120);
81
+ const idx = resolveIndex(finalOffset);
82
+ const target = nearestCopyOffset(idx, translateY);
66
83
  translateY = target;
67
- snapAnimation(el, finalOffset, target);
84
+ el.style.transition = "transform 180ms cubic-bezier(0.32, 0.72, 0, 1)";
85
+ el.style.transform = `translateY(${target}px)`;
68
86
  onChange(idx);
69
87
  },
70
88
  handlePointerCancel(e, el) {
71
89
  if (!drag) return;
72
- const target = clampOffset(72 - getIndexFromOffset(translateY, items.length) * 36, items.length);
90
+ const target = nearestCopyOffset(resolveIndex(translateY), translateY);
73
91
  translateY = target;
74
- snapAnimation(el, translateY, target);
92
+ el.style.transition = "transform 180ms cubic-bezier(0.32, 0.72, 0, 1)";
93
+ el.style.transform = `translateY(${target}px)`;
75
94
  drag = null;
76
95
  }
77
96
  };
78
97
  }
79
98
  //#endregion
80
- export { makeWheel };
99
+ export { expandCircular, makeWheel };
81
100
 
82
101
  //# sourceMappingURL=wheel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wheel.js","names":[],"sources":["../../../src/components/DatePickerMobile/wheel.js"],"sourcesContent":["// ── Wheel constants ──────────────────────────────────────────────────────\nexport const ITEM_HEIGHT = 36\nexport const VISIBLE_ITEMS = 5\nexport const CONTAINER_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS\nexport const CENTER_OFFSET = (CONTAINER_HEIGHT - ITEM_HEIGHT) / 2\n\n// ── Math helpers ─────────────────────────────────────────────────────────\nexport function clampOffset(offset, itemCount) {\n\tconst max = CENTER_OFFSET\n\tconst min = CENTER_OFFSET - Math.max(0, itemCount - 1) * ITEM_HEIGHT\n\treturn Math.max(min, Math.min(max, offset))\n}\n\nexport function getIndexFromOffset(offset, itemCount) {\n\tconst raw = Math.round((CENTER_OFFSET - offset) / ITEM_HEIGHT)\n\treturn Math.max(0, Math.min(itemCount - 1, raw))\n}\n\nexport function snapAnimation(el, from, to, onComplete) {\n\tconst duration = 180\n\tconst startTime = performance.now()\n\tfunction tick(now) {\n\t\tconst t = Math.min((now - startTime) / duration, 1)\n\t\tconst ease = 1 - Math.pow(1 - t, 3)\n\t\tconst current = from + (to - from) * ease\n\t\tel.style.transform = `translateY(${current}px)`\n\t\tif (t < 1) {\n\t\t\trequestAnimationFrame(tick)\n\t\t} else {\n\t\t\tonComplete?.()\n\t\t}\n\t}\n\trequestAnimationFrame(tick)\n}\n\n// ── Wheel controller factory ─────────────────────────────────────────────\n//\n// Creates a mutable wheel-scroll controller for one column. All state is kept\n// in plain closures no Plastic signals so it works without lifecycle\n// constraints.\nexport function makeWheel(items, index) {\n\tlet translateY = clampOffset(CENTER_OFFSET - index * ITEM_HEIGHT, items.length)\n\tlet drag = null\n\tlet animFrame = null\n\treturn {\n\t\tmount(el) {\n\t\t\tel.style.transform = `translateY(${translateY}px)`\n\t\t},\n\t\tdestroy() {\n\t\t\tcancelAnimationFrame(animFrame)\n\t\t\tdrag = null\n\t\t},\n\t\thandlePointerDown(e) {\n\t\t\te.preventDefault()\n\t\t\tcancelAnimationFrame(animFrame)\n\t\t\tdrag = { startY: e.clientY, startTranslate: translateY, lastY: e.clientY, lastTime: performance.now(), velocity: 0 }\n\t\t},\n\t\thandlePointerMove(e, el) {\n\t\t\tif (!drag) return\n\t\t\tconst dy = e.clientY - drag.startY\n\t\t\tconst now = performance.now()\n\t\t\tconst dt = now - drag.lastTime\n\t\t\tif (dt > 0) drag.velocity = (e.clientY - drag.lastY) / dt\n\t\t\tdrag.lastY = e.clientY\n\t\t\tdrag.lastTime = now\n\t\t\tconst offset = clampOffset(drag.startTranslate + dy, items.length)\n\t\t\ttranslateY = offset\n\t\t\tel.style.transform = `translateY(${offset}px)`\n\t\t},\n\t\thandlePointerUp(e, el, onChange) {\n\t\t\tif (!drag) return\n\t\t\tconst vel = drag.velocity\n\t\t\tdrag = null\n\t\t\tlet finalOffset = translateY\n\t\t\tif (Math.abs(vel) > 0.3) finalOffset = clampOffset(finalOffset + vel * 120, items.length)\n\t\t\tconst idx = getIndexFromOffset(finalOffset, items.length)\n\t\t\tconst target = clampOffset(CENTER_OFFSET - idx * ITEM_HEIGHT, items.length)\n\t\t\ttranslateY = target\n\t\t\tsnapAnimation(el, finalOffset, target)\n\t\t\tonChange(idx)\n\t\t},\n\t\thandlePointerCancel(e, el) {\n\t\t\tif (!drag) return\n\t\t\tconst idx = getIndexFromOffset(translateY, items.length)\n\t\t\tconst target = clampOffset(CENTER_OFFSET - idx * ITEM_HEIGHT, items.length)\n\t\t\ttranslateY = target\n\t\t\tsnapAnimation(el, translateY, target)\n\t\t\tdrag = null\n\t\t},\n\t}\n}\n"],"mappings":"AAOA,SAAgB,YAAY,QAAQ,WAAW;CAC9C,MAAM,MAAA;CACN,MAAM,MAAA,KAAsB,KAAK,IAAI,GAAG,YAAY,CAAC,IAAA;CACrD,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,CAAC;AAC3C;AAEA,SAAgB,mBAAmB,QAAQ,WAAW;CACrD,MAAM,MAAM,KAAK,OAAA,KAAuB,UAAA,EAAqB;CAC7D,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,GAAG,GAAG,CAAC;AAChD;AAEA,SAAgB,cAAc,IAAI,MAAM,IAAI,YAAY;CACvD,MAAM,WAAW;CACjB,MAAM,YAAY,YAAY,IAAI;CAClC,SAAS,KAAK,KAAK;EAClB,MAAM,IAAI,KAAK,KAAK,MAAM,aAAa,UAAU,CAAC;EAClD,MAAM,OAAO,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;EAClC,MAAM,UAAU,QAAQ,KAAK,QAAQ;EACrC,GAAG,MAAM,YAAY,cAAc,QAAQ;EAC3C,IAAI,IAAI,GACP,sBAAsB,IAAI;OAE1B,aAAa;CAEf;CACA,sBAAsB,IAAI;AAC3B;AAOA,SAAgB,UAAU,OAAO,OAAO;CACvC,IAAI,aAAa,YAAA,KAA4B,QAAA,IAAqB,MAAM,MAAM;CAC9E,IAAI,OAAO;CACX,IAAI,YAAY;CAChB,OAAO;EACN,MAAM,IAAI;GACT,GAAG,MAAM,YAAY,cAAc,WAAW;EAC/C;EACA,UAAU;GACT,qBAAqB,SAAS;GAC9B,OAAO;EACR;EACA,kBAAkB,GAAG;GACpB,EAAE,eAAe;GACjB,qBAAqB,SAAS;GAC9B,OAAO;IAAE,QAAQ,EAAE;IAAS,gBAAgB;IAAY,OAAO,EAAE;IAAS,UAAU,YAAY,IAAI;IAAG,UAAU;GAAE;EACpH;EACA,kBAAkB,GAAG,IAAI;GACxB,IAAI,CAAC,MAAM;GACX,MAAM,KAAK,EAAE,UAAU,KAAK;GAC5B,MAAM,MAAM,YAAY,IAAI;GAC5B,MAAM,KAAK,MAAM,KAAK;GACtB,IAAI,KAAK,GAAG,KAAK,YAAY,EAAE,UAAU,KAAK,SAAS;GACvD,KAAK,QAAQ,EAAE;GACf,KAAK,WAAW;GAChB,MAAM,SAAS,YAAY,KAAK,iBAAiB,IAAI,MAAM,MAAM;GACjE,aAAa;GACb,GAAG,MAAM,YAAY,cAAc,OAAO;EAC3C;EACA,gBAAgB,GAAG,IAAI,UAAU;GAChC,IAAI,CAAC,MAAM;GACX,MAAM,MAAM,KAAK;GACjB,OAAO;GACP,IAAI,cAAc;GAClB,IAAI,KAAK,IAAI,GAAG,IAAI,IAAK,cAAc,YAAY,cAAc,MAAM,KAAK,MAAM,MAAM;GACxF,MAAM,MAAM,mBAAmB,aAAa,MAAM,MAAM;GACxD,MAAM,SAAS,YAAA,KAA4B,MAAA,IAAmB,MAAM,MAAM;GAC1E,aAAa;GACb,cAAc,IAAI,aAAa,MAAM;GACrC,SAAS,GAAG;EACb;EACA,oBAAoB,GAAG,IAAI;GAC1B,IAAI,CAAC,MAAM;GAEX,MAAM,SAAS,YAAA,KADH,mBAAmB,YAAY,MAAM,MACN,IAAA,IAAmB,MAAM,MAAM;GAC1E,aAAa;GACb,cAAc,IAAI,YAAY,MAAM;GACpC,OAAO;EACR;CACD;AACD"}
1
+ {"version":3,"file":"wheel.js","names":[],"sources":["../../../src/components/DatePickerMobile/wheel.js"],"sourcesContent":["// ── Wheel constants ──────────────────────────────────────────────────────\nexport const ITEM_HEIGHT = 36\nexport const VISIBLE_ITEMS = 5\nexport const CONTAINER_HEIGHT = ITEM_HEIGHT * VISIBLE_ITEMS\nexport const CENTER_OFFSET = (CONTAINER_HEIGHT - ITEM_HEIGHT) / 2\n\n// ── Expand helper for circular mode ───────────────────────────────────────\n//\n// Returns [expandedArray, middleIndex] where the array is repeated 3x and\n// the original `index` is placed in the middle copy.\nexport function expandCircular(items, index) {\n\tconst len = items.length\n\tif (len === 0) return [items, index]\n\treturn [[...items, ...items, ...items], len + index]\n}\n\n// ── Math helpers ─────────────────────────────────────────────────────────\nexport function clampOffset(offset, itemCount) {\n\tconst max = CENTER_OFFSET\n\tconst min = CENTER_OFFSET - Math.max(0, itemCount - 1) * ITEM_HEIGHT\n\treturn Math.max(min, Math.min(max, offset))\n}\n\nexport function getIndexFromOffset(offset, itemCount) {\n\tconst raw = Math.round((CENTER_OFFSET - offset) / ITEM_HEIGHT)\n\treturn Math.max(0, Math.min(itemCount - 1, raw))\n}\n\n// ── Wheel controller factory ─────────────────────────────────────────────\n//\n// Creates a mutable wheel-scroll controller for one column. All state is kept\n// in plain closures — no Plastic signals.\n//\n// When `circular` is true the wheel snaps to the nearest 3x copy of the\n// target index, creating an infinite-scroll illusion.\n//\n// The controller stores itself on `el._wheel` so that the parent's ref\n// callback can destroy the previous instance before mounting a new one.\nexport function makeWheel(displayItems, displayIndex, circular) {\n\tconst baseLen = circular ? Math.round(displayItems.length / 3) : displayItems.length\n\n\tlet translateY = circular\n\t\t? CENTER_OFFSET - displayIndex * ITEM_HEIGHT\n\t\t: clampOffset(CENTER_OFFSET - displayIndex * ITEM_HEIGHT, displayItems.length)\n\n\tlet drag = null\n\tlet animFrame = null\n\n\tfunction clampOrPass(v) {\n\t\tif (!circular) return clampOffset(v, displayItems.length)\n\t\tconst maxV = CENTER_OFFSET + ITEM_HEIGHT\n\t\tconst minV = CENTER_OFFSET - (2 * baseLen + 1) * ITEM_HEIGHT\n\t\tif (v > maxV) return maxV + (v - maxV) * 0.15\n\t\tif (v < minV) return minV + (v - minV) * 0.15\n\t\treturn v\n\t}\n\n\tfunction resolveIndex(offset) {\n\t\tconst raw = Math.round((CENTER_OFFSET - offset) / ITEM_HEIGHT)\n\t\tif (circular) return ((raw % baseLen) + baseLen) % baseLen\n\t\treturn Math.max(0, Math.min(displayItems.length - 1, raw))\n\t}\n\n\tfunction nearestCopyOffset(idx, currentOffset) {\n\t\tif (!circular) return CENTER_OFFSET - idx * ITEM_HEIGHT\n\t\tconst copies = [0, 1, 2]\n\t\t\t.map((c) => CENTER_OFFSET - (c * baseLen + idx) * ITEM_HEIGHT)\n\t\treturn copies.reduce((a, b) =>\n\t\t\tMath.abs(a - currentOffset) < Math.abs(b - currentOffset) ? a : b,\n\t\t)\n\t}\n\n\treturn {\n\t\tmount(el) {\n\t\t\tel.style.transition = 'none'\n\t\t\tel.style.transform = `translateY(${translateY}px)`\n\t\t},\n\n\t\tdestroy() {\n\t\t\tcancelAnimationFrame(animFrame)\n\t\t\tanimFrame = null\n\t\t\tdrag = null\n\t\t},\n\n\t\thandlePointerDown(e) {\n\t\t\te.preventDefault()\n\t\t\tcancelAnimationFrame(animFrame)\n\t\t\tdrag = {\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tstartTranslate: translateY,\n\t\t\t\tlastY: e.clientY,\n\t\t\t\tlastTime: performance.now(),\n\t\t\t\tvelocity: 0,\n\t\t\t}\n\t\t},\n\n\t\thandlePointerMove(e, el) {\n\t\t\tif (!drag) return\n\t\t\tconst dy = e.clientY - drag.startY\n\t\t\tconst now = performance.now()\n\t\t\tconst dt = now - drag.lastTime\n\t\t\tif (dt > 0) drag.velocity = (e.clientY - drag.lastY) / dt\n\t\t\tdrag.lastY = e.clientY\n\t\t\tdrag.lastTime = now\n\t\t\tconst offset = clampOrPass(drag.startTranslate + dy)\n\t\t\ttranslateY = offset\n\t\t\tel.style.transition = 'none'\n\t\t\tel.style.transform = `translateY(${offset}px)`\n\t\t},\n\n\t\thandlePointerUp(e, el, onChange) {\n\t\t\tif (!drag) return\n\t\t\tconst vel = drag.velocity\n\t\t\tdrag = null\n\n\t\t\tlet finalOffset = translateY\n\t\t\tif (Math.abs(vel) > 0.3) {\n\t\t\t\tfinalOffset = clampOrPass(finalOffset + vel * 120)\n\t\t\t}\n\n\t\t\tconst idx = resolveIndex(finalOffset)\n\t\t\tconst target = nearestCopyOffset(idx, translateY)\n\t\t\ttranslateY = target\n\n\t\t\tel.style.transition = 'transform 180ms cubic-bezier(0.32, 0.72, 0, 1)'\n\t\t\tel.style.transform = `translateY(${target}px)`\n\t\t\tonChange(idx)\n\t\t},\n\n\t\thandlePointerCancel(e, el) {\n\t\t\tif (!drag) return\n\t\t\tconst idx = resolveIndex(translateY)\n\t\t\tconst target = nearestCopyOffset(idx, translateY)\n\t\t\ttranslateY = target\n\t\t\tel.style.transition = 'transform 180ms cubic-bezier(0.32, 0.72, 0, 1)'\n\t\t\tel.style.transform = `translateY(${target}px)`\n\t\t\tdrag = null\n\t\t},\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plastic-js/tsumiki",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "A UI component library for Plastic JS.",
5
5
  "license": "MIT",
6
6
  "author": "tigre",