@djangocfg/ui-tools 2.1.133 → 2.1.135

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkCBGBDVUG_cjs = require('./chunk-CBGBDVUG.cjs');
5
+ var chunkWU6ZLOL4_cjs = require('./chunk-WU6ZLOL4.cjs');
6
6
  var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
7
7
  var lib = require('@djangocfg/ui-core/lib');
8
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -15,15 +15,15 @@ function CronSchedulerInner({
15
15
  disabled,
16
16
  className
17
17
  }) {
18
- const { type } = chunkCBGBDVUG_cjs.useCronType();
18
+ const { type } = chunkWU6ZLOL4_cjs.useCronType();
19
19
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: lib.cn("space-y-3", className), children: [
20
- /* @__PURE__ */ jsxRuntime.jsx(chunkCBGBDVUG_cjs.ScheduleTypeSelector, { disabled }),
21
- type !== "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkCBGBDVUG_cjs.TimeSelector, { format: timeFormat, disabled }),
22
- type === "weekly" && /* @__PURE__ */ jsxRuntime.jsx(chunkCBGBDVUG_cjs.DayChips, { disabled, showPresets: true }),
23
- type === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(chunkCBGBDVUG_cjs.MonthDayGrid, { disabled, showPresets: true }),
24
- type === "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkCBGBDVUG_cjs.CustomInput, { disabled }),
20
+ /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.ScheduleTypeSelector, { disabled }),
21
+ type !== "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.TimeSelector, { format: timeFormat, disabled }),
22
+ type === "weekly" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.DayChips, { disabled, showPresets: true }),
23
+ type === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.MonthDayGrid, { disabled, showPresets: true }),
24
+ type === "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.CustomInput, { disabled }),
25
25
  showPreview && /* @__PURE__ */ jsxRuntime.jsx(
26
- chunkCBGBDVUG_cjs.SchedulePreview,
26
+ chunkWU6ZLOL4_cjs.SchedulePreview,
27
27
  {
28
28
  showCronExpression: true,
29
29
  allowCopy
@@ -44,7 +44,7 @@ function CronScheduler({
44
44
  className
45
45
  }) {
46
46
  return /* @__PURE__ */ jsxRuntime.jsx(
47
- chunkCBGBDVUG_cjs.CronSchedulerProvider,
47
+ chunkWU6ZLOL4_cjs.CronSchedulerProvider,
48
48
  {
49
49
  value,
50
50
  onChange,
@@ -68,5 +68,5 @@ var CronScheduler_client_default = CronScheduler;
68
68
 
69
69
  exports.CronScheduler = CronScheduler;
70
70
  exports.default = CronScheduler_client_default;
71
- //# sourceMappingURL=CronScheduler.client-G65DNGCA.cjs.map
72
- //# sourceMappingURL=CronScheduler.client-G65DNGCA.cjs.map
71
+ //# sourceMappingURL=CronScheduler.client-Q6HLKGLR.cjs.map
72
+ //# sourceMappingURL=CronScheduler.client-Q6HLKGLR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":["useCronType","cn","jsx","ScheduleTypeSelector","TimeSelector","DayChips","MonthDayGrid","CustomInput","SchedulePreview","__name","CronSchedulerProvider"],"mappings":";;;;;;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIA,6BAAA,EAAY;AAE7B,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWC,MAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,0CAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACRD,cAAA,CAACE,8BAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACRF,cAAA,CAACG,0BAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACRH,cAAA,CAACI,8BAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACRJ,cAAA,CAACK,6BAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACCL,cAAA;AAAA,MAACM,iCAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CSC,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEP,cAAA;AAAA,IAACQ,uCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAAR,cAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgBO,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-G65DNGCA.cjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
1
+ {"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":["useCronType","cn","jsx","ScheduleTypeSelector","TimeSelector","DayChips","MonthDayGrid","CustomInput","SchedulePreview","__name","CronSchedulerProvider"],"mappings":";;;;;;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIA,6BAAA,EAAY;AAE7B,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWC,MAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,0CAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACRD,cAAA,CAACE,8BAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACRF,cAAA,CAACG,0BAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACRH,cAAA,CAACI,8BAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACRJ,cAAA,CAACK,6BAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACCL,cAAA;AAAA,MAACM,iCAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CSC,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEP,cAAA;AAAA,IAACQ,uCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAAR,cAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgBO,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-Q6HLKGLR.cjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
@@ -1,4 +1,4 @@
1
- import { useCronType, ScheduleTypeSelector, TimeSelector, DayChips, MonthDayGrid, CustomInput, SchedulePreview, CronSchedulerProvider } from './chunk-CDUFZ24N.mjs';
1
+ import { useCronType, ScheduleTypeSelector, TimeSelector, DayChips, MonthDayGrid, CustomInput, SchedulePreview, CronSchedulerProvider } from './chunk-7H4LDBIH.mjs';
2
2
  import { __name } from './chunk-CGILA3WO.mjs';
3
3
  import { cn } from '@djangocfg/ui-core/lib';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -63,5 +63,5 @@ __name(CronScheduler, "CronScheduler");
63
63
  var CronScheduler_client_default = CronScheduler;
64
64
 
65
65
  export { CronScheduler, CronScheduler_client_default as default };
66
- //# sourceMappingURL=CronScheduler.client-HLABENG7.mjs.map
67
- //# sourceMappingURL=CronScheduler.client-HLABENG7.mjs.map
66
+ //# sourceMappingURL=CronScheduler.client-T42ZXXOG.mjs.map
67
+ //# sourceMappingURL=CronScheduler.client-T42ZXXOG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":[],"mappings":";;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,EAAY;AAE7B,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,wBAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACR,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACR,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACC,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-HLABENG7.mjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
1
+ {"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":[],"mappings":";;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,EAAY;AAE7B,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,wBAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACR,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACR,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACC,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-T42ZXXOG.mjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
@@ -7,24 +7,29 @@ import { Clock, CheckCircle2, AlertCircle, HelpCircle, Calendar, Check, Copy } f
7
7
 
8
8
  // src/tools/CronScheduler/utils/cron-builder.ts
9
9
  function buildCron(state) {
10
- const { type, hour, minute, weekDays, monthDays, customCron } = state;
11
- const h = Math.max(0, Math.min(23, hour));
12
- const m = Math.max(0, Math.min(59, minute));
10
+ if (!state || typeof state !== "object") {
11
+ return "0 0 * * *";
12
+ }
13
+ const { type, hour = 0, minute = 0, weekDays = [], monthDays = [], customCron = "" } = state;
14
+ const h = Math.max(0, Math.min(23, Number(hour) || 0));
15
+ const m = Math.max(0, Math.min(59, Number(minute) || 0));
16
+ const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
17
+ const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
13
18
  switch (type) {
14
19
  case "daily":
15
20
  return `${m} ${h} * * *`;
16
21
  case "weekly": {
17
- const sortedDays = [...weekDays].sort((a, b) => a - b);
22
+ const sortedDays = [...safeWeekDays].sort((a, b) => a - b);
18
23
  const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "*";
19
24
  return `${m} ${h} * * ${daysStr}`;
20
25
  }
21
26
  case "monthly": {
22
- const sortedDays = [...monthDays].sort((a, b) => a - b);
27
+ const sortedDays = [...safeMonthDays].sort((a, b) => a - b);
23
28
  const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "1";
24
29
  return `${m} ${h} ${daysStr} * *`;
25
30
  }
26
31
  case "custom":
27
- return customCron.trim() || "* * * * *";
32
+ return (customCron || "").trim() || "* * * * *";
28
33
  default:
29
34
  return "0 0 * * *";
30
35
  }
@@ -57,10 +62,13 @@ function parseCron(cron) {
57
62
  const parts = cron.trim().split(/\s+/);
58
63
  if (parts.length !== 5) return null;
59
64
  const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
60
- const minute = parseField(minutePart, 0, 59);
61
- if (minute === null && minutePart !== "*") return null;
62
- const hour = parseField(hourPart, 0, 23);
63
- if (hour === null && hourPart !== "*") return null;
65
+ if (!isValidCronField(minutePart, 0, 59)) return null;
66
+ if (!isValidCronField(hourPart, 0, 23)) return null;
67
+ if (!isValidCronField(dayOfMonthPart, 1, 31)) return null;
68
+ if (!isValidCronField(monthPart, 1, 12)) return null;
69
+ if (!isValidCronField(dayOfWeekPart, 0, 6)) return null;
70
+ const minute = parseField(minutePart);
71
+ const hour = parseField(hourPart);
64
72
  const result = detectScheduleType(
65
73
  minutePart,
66
74
  hourPart,
@@ -95,10 +103,31 @@ function detectScheduleType(_minutePart, _hourPart, dayOfMonthPart, monthPart, d
95
103
  return { type, weekDays, monthDays };
96
104
  }
97
105
  __name(detectScheduleType, "detectScheduleType");
98
- function parseField(part, min, max) {
106
+ function isValidCronField(part, min, max) {
107
+ if (part === "*") return true;
108
+ if (part.includes("/")) {
109
+ const [base, step] = part.split("/");
110
+ if (!step || !/^\d+$/.test(step)) return false;
111
+ if (base === "*") return true;
112
+ return isValidCronField(base, min, max);
113
+ }
114
+ if (part.includes("-") && !part.includes(",")) {
115
+ const [start, end] = part.split("-").map((s) => parseInt(s, 10));
116
+ return !isNaN(start) && !isNaN(end) && start >= min && end <= max && start <= end;
117
+ }
118
+ if (part.includes(",")) {
119
+ return part.split(",").every((p) => isValidCronField(p.trim(), min, max));
120
+ }
99
121
  if (/^\d+$/.test(part)) {
100
122
  const num = parseInt(part, 10);
101
- if (num >= min && num <= max) return num;
123
+ return num >= min && num <= max;
124
+ }
125
+ return false;
126
+ }
127
+ __name(isValidCronField, "isValidCronField");
128
+ function parseField(part, _min, _max) {
129
+ if (/^\d+$/.test(part)) {
130
+ return parseInt(part, 10);
102
131
  }
103
132
  return null;
104
133
  }
@@ -147,19 +176,8 @@ function isValidCron(cron) {
147
176
  if (!cron || typeof cron !== "string") return false;
148
177
  const parts = cron.trim().split(/\s+/);
149
178
  if (parts.length !== 5) return false;
150
- const patterns = [
151
- /^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
152
- // minute
153
- /^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
154
- // hour
155
- /^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
156
- // day of month
157
- /^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
158
- // month
159
- /^(\*|\d{1}|\d{1}-\d{1}|\d{1}(,\d{1})*|\*\/\d{1,2})$/
160
- // day of week
161
- ];
162
- return parts.every((part, i) => patterns[i].test(part));
179
+ const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
180
+ return isValidCronField(minutePart, 0, 59) && isValidCronField(hourPart, 0, 23) && isValidCronField(dayOfMonthPart, 1, 31) && isValidCronField(monthPart, 1, 12) && isValidCronField(dayOfWeekPart, 0, 6);
163
181
  }
164
182
  __name(isValidCron, "isValidCron");
165
183
 
@@ -309,21 +327,27 @@ function CronSchedulerProvider({
309
327
  const onChangeRef = useRef(onChange);
310
328
  onChangeRef.current = onChange;
311
329
  const [state, setState] = useState(() => {
312
- if (value) {
313
- const parsed = parseCron(value);
314
- if (parsed) return parsed;
330
+ try {
331
+ if (value) {
332
+ const parsed = parseCron(value);
333
+ if (parsed) return parsed;
334
+ }
335
+ } catch {
315
336
  }
316
337
  return { ...DEFAULT_STATE, type: defaultType };
317
338
  });
318
339
  useEffect(() => {
319
- if (value) {
320
- const parsed = parseCron(value);
321
- if (parsed) {
322
- const currentCron = buildCron(state);
323
- if (value !== currentCron) {
324
- setState(parsed);
340
+ try {
341
+ if (value) {
342
+ const parsed = parseCron(value);
343
+ if (parsed) {
344
+ const currentCron = buildCron(state);
345
+ if (value !== currentCron) {
346
+ setState(parsed);
347
+ }
325
348
  }
326
349
  }
350
+ } catch {
327
351
  }
328
352
  }, [value]);
329
353
  const cronExpression = useMemo(() => buildCron(state), [state]);
@@ -493,25 +517,32 @@ function ScheduleTypeSelector({
493
517
  className
494
518
  }) {
495
519
  const { type, setType } = useCronType();
520
+ const triggerClassName = cn(
521
+ "text-xs font-medium px-2 py-1.5",
522
+ "data-[state=active]:shadow-sm",
523
+ "transition-all duration-150"
524
+ );
525
+ const triggers = SCHEDULE_TYPES.map(({ value, label }) => ({
526
+ value,
527
+ label,
528
+ disabled,
529
+ className: triggerClassName
530
+ }));
496
531
  return /* @__PURE__ */ jsx(
497
532
  Tabs,
498
533
  {
499
534
  value: type,
500
535
  onValueChange: (v) => setType(v),
501
536
  className: cn("w-full", className),
502
- children: /* @__PURE__ */ jsx(TabsList, { className: "!grid w-full !grid-cols-4 h-9 p-0.5", children: SCHEDULE_TYPES.map(({ value, label }) => /* @__PURE__ */ jsx(
537
+ children: /* @__PURE__ */ jsx(TabsList, { className: "grid w-full grid-cols-4 h-9 p-0.5", children: triggers.map((trigger) => /* @__PURE__ */ jsx(
503
538
  TabsTrigger,
504
539
  {
505
- value,
506
- disabled,
507
- className: cn(
508
- "text-xs font-medium px-2 py-1.5",
509
- "data-[state=active]:shadow-sm",
510
- "transition-all duration-150"
511
- ),
512
- children: label
540
+ value: trigger.value,
541
+ disabled: trigger.disabled,
542
+ className: trigger.className,
543
+ children: trigger.label
513
544
  },
514
- value
545
+ trigger.value
515
546
  )) })
516
547
  }
517
548
  );
@@ -612,66 +643,60 @@ function DayChips({
612
643
  className
613
644
  }) {
614
645
  const { weekDays, toggleWeekDay, setWeekDays } = useCronWeekDays();
615
- const isWeekdays2 = weekDays.length === 5 && [1, 2, 3, 4, 5].every((d) => weekDays.includes(d));
616
- const isWeekend2 = weekDays.length === 2 && [0, 6].every((d) => weekDays.includes(d));
617
- const isEveryday = weekDays.length === 7;
618
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
619
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: DAYS.map(({ value, label }) => {
620
- const isSelected = weekDays.includes(value);
621
- const isWeekend3 = value === 0 || value === 6;
622
- return /* @__PURE__ */ jsx(
623
- "button",
624
- {
625
- type: "button",
626
- disabled,
627
- onClick: () => toggleWeekDay(value),
628
- "aria-pressed": isSelected,
629
- className: cn(
630
- "flex flex-col items-center justify-center",
631
- "py-2.5 rounded-lg text-xs font-medium",
632
- "transition-all duration-150",
633
- "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
634
- "active:scale-[0.97]",
635
- isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
636
- "bg-muted/50 hover:bg-muted",
637
- isWeekend3 ? "text-muted-foreground/70" : "text-muted-foreground"
638
- ),
639
- disabled && "opacity-50 cursor-not-allowed pointer-events-none"
640
- ),
641
- children: /* @__PURE__ */ jsx("span", { children: label })
642
- },
643
- value
644
- );
645
- }) }),
646
- showPresets && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
647
- /* @__PURE__ */ jsx(
648
- PresetButton,
649
- {
650
- label: "Weekdays",
651
- isActive: isWeekdays2,
652
- onClick: () => setWeekDays([1, 2, 3, 4, 5]),
653
- disabled
654
- }
655
- ),
656
- /* @__PURE__ */ jsx(
657
- PresetButton,
658
- {
659
- label: "Weekends",
660
- isActive: isWeekend2,
661
- onClick: () => setWeekDays([0, 6]),
662
- disabled
663
- }
664
- ),
665
- /* @__PURE__ */ jsx(
666
- PresetButton,
667
- {
668
- label: "Every day",
669
- isActive: isEveryday,
670
- onClick: () => setWeekDays([0, 1, 2, 3, 4, 5, 6]),
671
- disabled
672
- }
646
+ const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
647
+ const isWeekdays2 = safeWeekDays.length === 5 && [1, 2, 3, 4, 5].every((d) => safeWeekDays.includes(d));
648
+ const isWeekendPreset = safeWeekDays.length === 2 && [0, 6].every((d) => safeWeekDays.includes(d));
649
+ const isEveryday = safeWeekDays.length === 7;
650
+ const dayButtons = DAYS.map(({ value, label }) => {
651
+ const isSelected = safeWeekDays.includes(value);
652
+ const isWeekendDay = value === 0 || value === 6;
653
+ return {
654
+ value,
655
+ label,
656
+ isSelected,
657
+ isWeekendDay,
658
+ className: cn(
659
+ "flex flex-col items-center justify-center",
660
+ "py-2.5 rounded-lg text-xs font-medium",
661
+ "transition-all duration-150",
662
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
663
+ "active:scale-[0.97]",
664
+ isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
665
+ "bg-muted/50 hover:bg-muted",
666
+ isWeekendDay ? "text-muted-foreground/70" : "text-muted-foreground"
667
+ ),
668
+ disabled && "opacity-50 cursor-not-allowed pointer-events-none"
673
669
  )
674
- ] })
670
+ };
671
+ });
672
+ const presets = [
673
+ { label: "Weekdays", isActive: isWeekdays2, days: [1, 2, 3, 4, 5] },
674
+ { label: "Weekends", isActive: isWeekendPreset, days: [0, 6] },
675
+ { label: "Every day", isActive: isEveryday, days: [0, 1, 2, 3, 4, 5, 6] }
676
+ ];
677
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
678
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: dayButtons.map((day) => /* @__PURE__ */ jsx(
679
+ "button",
680
+ {
681
+ type: "button",
682
+ disabled,
683
+ onClick: () => toggleWeekDay(day.value),
684
+ "aria-pressed": day.isSelected,
685
+ className: day.className,
686
+ children: /* @__PURE__ */ jsx("span", { children: day.label })
687
+ },
688
+ day.value
689
+ )) }),
690
+ showPresets && /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: presets.map((preset) => /* @__PURE__ */ jsx(
691
+ PresetButton,
692
+ {
693
+ label: preset.label,
694
+ isActive: preset.isActive,
695
+ onClick: () => setWeekDays(preset.days),
696
+ disabled
697
+ },
698
+ preset.label
699
+ )) })
675
700
  ] });
676
701
  }
677
702
  __name(DayChips, "DayChips");
@@ -702,74 +727,74 @@ function MonthDayGrid({
702
727
  className
703
728
  }) {
704
729
  const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();
705
- const is1st = monthDays.length === 1 && monthDays[0] === 1;
706
- const is15th = monthDays.length === 1 && monthDays[0] === 15;
707
- const is1stAnd15th = monthDays.length === 2 && monthDays.includes(1) && monthDays.includes(15);
708
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
709
- showPresets && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
710
- /* @__PURE__ */ jsx(
711
- PresetButton2,
712
- {
713
- label: "1st",
714
- isActive: is1st,
715
- onClick: () => setMonthDays([1]),
716
- disabled
717
- }
718
- ),
719
- /* @__PURE__ */ jsx(
720
- PresetButton2,
721
- {
722
- label: "15th",
723
- isActive: is15th,
724
- onClick: () => setMonthDays([15]),
725
- disabled
726
- }
727
- ),
728
- /* @__PURE__ */ jsx(
729
- PresetButton2,
730
- {
731
- label: "1st & 15th",
732
- isActive: is1stAnd15th,
733
- onClick: () => setMonthDays([1, 15]),
734
- disabled
735
- }
730
+ const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
731
+ const is1st = safeMonthDays.length === 1 && safeMonthDays[0] === 1;
732
+ const is15th = safeMonthDays.length === 1 && safeMonthDays[0] === 15;
733
+ const is1stAnd15th = safeMonthDays.length === 2 && safeMonthDays.includes(1) && safeMonthDays.includes(15);
734
+ const presets = [
735
+ { label: "1st", isActive: is1st, days: [1] },
736
+ { label: "15th", isActive: is15th, days: [15] },
737
+ { label: "1st & 15th", isActive: is1stAnd15th, days: [1, 15] }
738
+ ];
739
+ const gridCells = Array.from({ length: GRID_SIZE }, (_, i) => {
740
+ const day = i + 1;
741
+ const isValidDay = day <= 31;
742
+ const isSelected = isValidDay && safeMonthDays.includes(day);
743
+ const isPartialMonth = day > 28;
744
+ if (!isValidDay) {
745
+ return { type: "empty", key: i };
746
+ }
747
+ return {
748
+ type: "day",
749
+ key: day,
750
+ day,
751
+ isSelected,
752
+ className: cn(
753
+ "aspect-square flex items-center justify-center",
754
+ "rounded-lg text-sm font-medium",
755
+ "transition-all duration-150",
756
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
757
+ "active:scale-[0.95]",
758
+ isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
759
+ "bg-muted/30 hover:bg-muted/60",
760
+ isPartialMonth ? "text-muted-foreground/50" : "text-muted-foreground"
761
+ ),
762
+ disabled && "opacity-50 cursor-not-allowed pointer-events-none"
736
763
  )
737
- ] }),
738
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: Array.from({ length: GRID_SIZE }, (_, i) => {
739
- const day = i + 1;
740
- const isValidDay = day <= 31;
741
- const isSelected = isValidDay && monthDays.includes(day);
742
- const isPartialMonth = day > 28;
743
- if (!isValidDay) {
744
- return /* @__PURE__ */ jsx("div", { className: "aspect-square" }, i);
764
+ };
765
+ });
766
+ const selectionCount = safeMonthDays.length;
767
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
768
+ showPresets && /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: presets.map((preset) => /* @__PURE__ */ jsx(
769
+ PresetButton2,
770
+ {
771
+ label: preset.label,
772
+ isActive: preset.isActive,
773
+ onClick: () => setMonthDays(preset.days),
774
+ disabled
775
+ },
776
+ preset.label
777
+ )) }),
778
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: gridCells.map((cell) => {
779
+ if (cell.type === "empty") {
780
+ return /* @__PURE__ */ jsx("div", { className: "aspect-square" }, cell.key);
745
781
  }
746
782
  return /* @__PURE__ */ jsx(
747
783
  "button",
748
784
  {
749
785
  type: "button",
750
786
  disabled,
751
- onClick: () => toggleMonthDay(day),
752
- "aria-pressed": isSelected,
753
- "aria-label": `Day ${day}`,
754
- className: cn(
755
- "aspect-square flex items-center justify-center",
756
- "rounded-lg text-sm font-medium",
757
- "transition-all duration-150",
758
- "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
759
- "active:scale-[0.95]",
760
- isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
761
- "bg-muted/30 hover:bg-muted/60",
762
- isPartialMonth ? "text-muted-foreground/50" : "text-muted-foreground"
763
- ),
764
- disabled && "opacity-50 cursor-not-allowed pointer-events-none"
765
- ),
766
- children: day
787
+ onClick: () => toggleMonthDay(cell.day),
788
+ "aria-pressed": cell.isSelected,
789
+ "aria-label": `Day ${cell.day}`,
790
+ className: cell.className,
791
+ children: cell.day
767
792
  },
768
- day
793
+ cell.key
769
794
  );
770
795
  }) }),
771
- monthDays.length > 1 && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [
772
- monthDays.length,
796
+ selectionCount > 1 && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [
797
+ selectionCount,
773
798
  " days selected"
774
799
  ] })
775
800
  ] });
@@ -991,5 +1016,5 @@ function SchedulePreview({
991
1016
  __name(SchedulePreview, "SchedulePreview");
992
1017
 
993
1018
  export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays };
994
- //# sourceMappingURL=chunk-CDUFZ24N.mjs.map
995
- //# sourceMappingURL=chunk-CDUFZ24N.mjs.map
1019
+ //# sourceMappingURL=chunk-7H4LDBIH.mjs.map
1020
+ //# sourceMappingURL=chunk-7H4LDBIH.mjs.map