@lostgradient/cinder 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/components.json +82 -4
  3. package/dist/components/access-gate/index.js +381 -239
  4. package/dist/components/chat/builders.d.ts +17 -8
  5. package/dist/components/chat/conversation-model.d.ts +1 -1
  6. package/dist/components/chat/index.d.ts +1 -1
  7. package/dist/components/chat/index.js +300 -17
  8. package/dist/components/chat/utilities/conversation.d.ts +6 -6
  9. package/dist/components/chat-conversation-header/index.js +19 -6
  10. package/dist/components/chat-conversation-list/index.js +19 -6
  11. package/dist/components/connection-indicator/connection-indicator.css +136 -0
  12. package/dist/components/connection-indicator/connection-indicator.css.d.ts +1 -0
  13. package/dist/components/connection-indicator/connection-indicator.schema.d.ts +3 -0
  14. package/dist/components/connection-indicator/connection-indicator.schema.js +89 -0
  15. package/dist/components/connection-indicator/connection-indicator.svelte.d.ts +21 -0
  16. package/dist/components/connection-indicator/connection-indicator.types.d.ts +46 -0
  17. package/dist/components/connection-indicator/connection-indicator.variables.d.ts +2 -0
  18. package/dist/components/connection-indicator/connection-indicator.variables.js +61 -0
  19. package/dist/components/connection-indicator/index.d.ts +5 -0
  20. package/dist/components/connection-indicator/index.js +409 -0
  21. package/dist/components/container/container.schema.js +4 -4
  22. package/dist/components/invocation-rule-builder/index.d.ts +1 -1
  23. package/dist/components/invocation-rule-builder/index.js +305 -150
  24. package/dist/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  25. package/dist/components/invocation-rule-builder/invocation-rule-builder.schema.js +89 -5
  26. package/dist/components/invocation-rule-builder/invocation-rule-builder.svelte.d.ts +2 -1
  27. package/dist/components/invocation-rule-builder/invocation-rule-builder.types.d.ts +114 -16
  28. package/dist/components/run-step-timeline/index.d.ts +1 -1
  29. package/dist/components/run-step-timeline/index.js +992 -559
  30. package/dist/components/run-step-timeline/run-step-branch-disclosure.svelte.d.ts +17 -0
  31. package/dist/components/run-step-timeline/run-step-timeline.css +124 -0
  32. package/dist/components/run-step-timeline/run-step-timeline.schema.js +873 -350
  33. package/dist/components/run-step-timeline/run-step-timeline.svelte.d.ts +1 -15
  34. package/dist/components/run-step-timeline/run-step-timeline.types.d.ts +182 -5
  35. package/dist/components/run-step-timeline/run-step-timeline.utilities.d.ts +52 -0
  36. package/dist/components/schedule-builder/index.d.ts +5 -0
  37. package/dist/components/schedule-builder/index.js +3176 -0
  38. package/dist/components/schedule-builder/schedule-builder.css +121 -0
  39. package/dist/components/schedule-builder/schedule-builder.css.d.ts +1 -0
  40. package/dist/components/schedule-builder/schedule-builder.schema.d.ts +3 -0
  41. package/dist/components/schedule-builder/schedule-builder.schema.js +141 -0
  42. package/dist/components/schedule-builder/schedule-builder.svelte.d.ts +22 -0
  43. package/dist/components/schedule-builder/schedule-builder.types.d.ts +130 -0
  44. package/dist/components/schedule-builder/schedule-builder.utilities.d.ts +78 -0
  45. package/dist/components/schedule-builder/schedule-builder.variables.d.ts +2 -0
  46. package/dist/components/schedule-builder/schedule-builder.variables.js +61 -0
  47. package/dist/components/tag-input/index.js +22 -4
  48. package/dist/components/tag-input/tag-input.schema.js +5 -1
  49. package/dist/components/tag-input/tag-input.types.d.ts +4 -0
  50. package/dist/index.d.ts +6 -2
  51. package/dist/index.js +22704 -20574
  52. package/dist/server/components/access-gate/index.js +2 -1
  53. package/dist/server/components/chat/index.js +4 -4
  54. package/dist/server/components/chat-conversation-header/index.js +5 -5
  55. package/dist/server/components/chat-conversation-list/index.js +3 -3
  56. package/dist/server/components/connection-indicator/index.js +16 -0
  57. package/dist/server/components/data-table/index.js +3 -3
  58. package/dist/server/components/diff-viewer/index.js +4 -3
  59. package/dist/server/components/invocation-rule-builder/index.js +1 -1
  60. package/dist/server/components/json-schema-editor/index.js +4 -3
  61. package/dist/server/components/review-editor/index.js +4 -3
  62. package/dist/server/components/run-step-timeline/index.js +1 -1
  63. package/dist/server/components/schedule-builder/index.js +30 -0
  64. package/dist/server/components/side-navigation/index.js +2 -2
  65. package/dist/server/components/table/index.js +3 -3
  66. package/dist/server/components/tag-input/index.js +1 -1
  67. package/dist/server/components/time-field/index.js +5 -3
  68. package/dist/server/index.js +100 -87
  69. package/dist/server/index.server-0sx92swg.js +9 -0
  70. package/dist/server/{index.server-mzzb7dnm.js → index.server-2bbwajb2.js} +1 -1
  71. package/dist/server/{index.server-q7w4jw89.js → index.server-2s5h1d05.js} +2 -2
  72. package/dist/server/{index.server-dg83ke3k.js → index.server-2zdbz3rj.js} +1 -1
  73. package/dist/server/{index.server-0jhra85x.js → index.server-3w72dxz7.js} +4 -4
  74. package/dist/server/{index.server-qh9qzd5t.js → index.server-4x4hgvqe.js} +283 -13
  75. package/dist/server/{index.server-c6pe4kaf.js → index.server-5gzyqv78.js} +1 -1
  76. package/dist/server/{index.server-mqt1ngqw.js → index.server-6hnfzc7f.js} +19 -6
  77. package/dist/server/index.server-be9bpqeh.js +93 -0
  78. package/dist/server/{index.server-f3z7tpxr.js → index.server-c42b462p.js} +2 -4
  79. package/dist/server/{index.server-7vyzen5x.js → index.server-c5qv3p61.js} +171 -63
  80. package/dist/server/index.server-cch0eed5.js +144 -0
  81. package/dist/server/index.server-gmh5ar16.js +2 -0
  82. package/dist/server/{index.server-0atyznp7.js → index.server-h89zk5ev.js} +7 -7
  83. package/dist/server/{index.server-jxg42jpz.js → index.server-jdcq5zza.js} +7 -7
  84. package/dist/server/{index.server-2dga5yzr.js → index.server-jfrssta6.js} +1 -1
  85. package/dist/server/{index.server-fy068yne.js → index.server-jj76374p.js} +1 -1
  86. package/dist/server/index.server-qbkxz7r2.js +750 -0
  87. package/dist/server/{index.server-marjz8ps.js → index.server-tcay903b.js} +3 -2
  88. package/dist/server/index.server-z38bxms8.js +734 -0
  89. package/dist/server/{index.server-yz4k36cw.js → index.server-z7hxtqs1.js} +1 -1
  90. package/package.json +66 -3
  91. package/src/components/chat/builders.ts +445 -14
  92. package/src/components/chat/conversation-model.ts +1 -0
  93. package/src/components/chat/index.ts +1 -0
  94. package/src/components/chat/utilities/conversation.ts +33 -15
  95. package/src/components/connection-indicator/connection-indicator.css +136 -0
  96. package/src/components/connection-indicator/connection-indicator.examples.json +31 -0
  97. package/src/components/connection-indicator/connection-indicator.schema.json +29 -0
  98. package/src/components/connection-indicator/connection-indicator.schema.ts +36 -0
  99. package/src/components/connection-indicator/connection-indicator.svelte +63 -0
  100. package/src/components/connection-indicator/connection-indicator.types.ts +58 -0
  101. package/src/components/connection-indicator/connection-indicator.variables.json +1 -0
  102. package/src/components/connection-indicator/connection-indicator.variables.ts +3 -0
  103. package/src/components/connection-indicator/index.ts +10 -0
  104. package/src/components/container/container.schema.json +3 -3
  105. package/src/components/container/container.schema.ts +3 -3
  106. package/src/components/invocation-rule-builder/index.ts +4 -0
  107. package/src/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  108. package/src/components/invocation-rule-builder/invocation-rule-builder.examples.json +6 -0
  109. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.json +76 -3
  110. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.ts +83 -3
  111. package/src/components/invocation-rule-builder/invocation-rule-builder.svelte +326 -113
  112. package/src/components/invocation-rule-builder/invocation-rule-builder.types.ts +157 -43
  113. package/src/components/run-step-timeline/index.ts +8 -0
  114. package/src/components/run-step-timeline/run-step-branch-disclosure.svelte +16 -0
  115. package/src/components/run-step-timeline/run-step-timeline.css +124 -0
  116. package/src/components/run-step-timeline/run-step-timeline.examples.json +18 -0
  117. package/src/components/run-step-timeline/run-step-timeline.schema.json +872 -349
  118. package/src/components/run-step-timeline/run-step-timeline.schema.ts +931 -349
  119. package/src/components/run-step-timeline/run-step-timeline.svelte +387 -268
  120. package/src/components/run-step-timeline/run-step-timeline.types.ts +192 -5
  121. package/src/components/run-step-timeline/run-step-timeline.utilities.ts +242 -0
  122. package/src/components/schedule-builder/index.ts +14 -0
  123. package/src/components/schedule-builder/schedule-builder.css +121 -0
  124. package/src/components/schedule-builder/schedule-builder.examples.json +31 -0
  125. package/src/components/schedule-builder/schedule-builder.schema.json +78 -0
  126. package/src/components/schedule-builder/schedule-builder.schema.ts +86 -0
  127. package/src/components/schedule-builder/schedule-builder.svelte +629 -0
  128. package/src/components/schedule-builder/schedule-builder.types.ts +137 -0
  129. package/src/components/schedule-builder/schedule-builder.utilities.ts +344 -0
  130. package/src/components/schedule-builder/schedule-builder.variables.json +1 -0
  131. package/src/components/schedule-builder/schedule-builder.variables.ts +3 -0
  132. package/src/components/tag-input/tag-input.schema.json +4 -0
  133. package/src/components/tag-input/tag-input.schema.ts +4 -0
  134. package/src/components/tag-input/tag-input.svelte +20 -3
  135. package/src/components/tag-input/tag-input.types.ts +4 -0
  136. package/src/index.ts +23 -0
  137. package/src/styles/components.css +2 -0
  138. package/dist/server/index.server-qk1h0n02.js +0 -393
@@ -0,0 +1,750 @@
1
+ import {
2
+ Time_field
3
+ } from "./index.server-c42b462p.js";
4
+ import {
5
+ Select
6
+ } from "./index.server-ex3ea9z0.js";
7
+ import {
8
+ Number_input
9
+ } from "./index.server-d146g8pr.js";
10
+ import {
11
+ Segmented_control
12
+ } from "./index.server-xeqtpv61.js";
13
+ import {
14
+ Segment
15
+ } from "./index.server-sedjxt36.js";
16
+ import {
17
+ Input
18
+ } from "./index.server-8xvc73zh.js";
19
+ import {
20
+ Chip
21
+ } from "./index.server-b6jr01st.js";
22
+ import {
23
+ classNames
24
+ } from "./index.server-z7nvkz8v.js";
25
+
26
+ // src/components/schedule-builder/schedule-builder.svelte
27
+ import * as $ from "svelte/internal/server";
28
+
29
+ // src/components/schedule-builder/schedule-builder.utilities.ts
30
+ var INTERVAL_UNITS = [
31
+ "minutes",
32
+ "hours",
33
+ "days",
34
+ "weeks"
35
+ ];
36
+ var WEEKDAYS = [
37
+ { value: 1, short: "Mon", long: "Monday" },
38
+ { value: 2, short: "Tue", long: "Tuesday" },
39
+ { value: 3, short: "Wed", long: "Wednesday" },
40
+ { value: 4, short: "Thu", long: "Thursday" },
41
+ { value: 5, short: "Fri", long: "Friday" },
42
+ { value: 6, short: "Sat", long: "Saturday" },
43
+ { value: 0, short: "Sun", long: "Sunday" }
44
+ ];
45
+ var CRON_FIELDS = [
46
+ { name: "Minute", min: 0, max: 59, hint: "0–59" },
47
+ { name: "Hour", min: 0, max: 23, hint: "0–23" },
48
+ { name: "Day of month", min: 1, max: 31, hint: "1–31" },
49
+ { name: "Month", min: 1, max: 12, hint: "1–12" },
50
+ { name: "Day of week", min: 0, max: 6, hint: "0–6 (Sun–Sat)" }
51
+ ];
52
+ function defaultScheduleValue() {
53
+ return { mode: "interval", every: 15, unit: "minutes" };
54
+ }
55
+ function singularUnit(unit) {
56
+ return unit.slice(0, -1);
57
+ }
58
+ function validateCronField(rawValue, fieldIndex) {
59
+ const field = CRON_FIELDS[fieldIndex];
60
+ if (!field)
61
+ return "Unknown field.";
62
+ const value = rawValue.trim();
63
+ if (value === "")
64
+ return "Required.";
65
+ const inRange = (n) => Number.isInteger(n) && n >= field.min && n <= field.max;
66
+ for (const part of value.split(",")) {
67
+ const token = part.trim();
68
+ if (token === "")
69
+ return "Empty list item.";
70
+ if (token === "*")
71
+ continue;
72
+ const stepMatch = token.match(/^(\*|\d+-\d+)\/(\d+)$/);
73
+ if (stepMatch) {
74
+ const step = Number(stepMatch[2] ?? "");
75
+ if (!Number.isInteger(step) || step <= 0)
76
+ return "Step must be a positive integer.";
77
+ if (step > field.max)
78
+ return `Step is larger than ${field.hint}.`;
79
+ const rangeText = stepMatch[1] ?? "*";
80
+ if (rangeText !== "*") {
81
+ const [a, b] = rangeText.split("-").map(Number);
82
+ if (a === undefined || b === undefined || !inRange(a) || !inRange(b)) {
83
+ return `Out of range (${field.hint}).`;
84
+ }
85
+ if (a > b)
86
+ return "Range start is after its end.";
87
+ }
88
+ continue;
89
+ }
90
+ const rangeMatch = token.match(/^(\d+)-(\d+)$/);
91
+ if (rangeMatch) {
92
+ const a = Number(rangeMatch[1]);
93
+ const b = Number(rangeMatch[2]);
94
+ if (!inRange(a) || !inRange(b))
95
+ return `Out of range (${field.hint}).`;
96
+ if (a > b)
97
+ return "Range start is after its end.";
98
+ continue;
99
+ }
100
+ if (/^\d+$/.test(token)) {
101
+ if (!inRange(Number(token)))
102
+ return `Out of range (${field.hint}).`;
103
+ continue;
104
+ }
105
+ return "Not a valid cron token.";
106
+ }
107
+ return;
108
+ }
109
+ function cronFieldsValid(fields) {
110
+ return fields.length === 5 && fields.every((value, index) => validateCronField(value, index) === undefined);
111
+ }
112
+ function joinCron(fields) {
113
+ return fields.map((field) => field.trim()).join(" ");
114
+ }
115
+ function splitCron(expression) {
116
+ const parts = expression.trim().split(/\s+/).filter(Boolean);
117
+ const lastField = parts.length > 5 ? parts.slice(4).join(" ") : parts[4];
118
+ return [parts[0] ?? "*", parts[1] ?? "*", parts[2] ?? "*", parts[3] ?? "*", lastField ?? "*"];
119
+ }
120
+ function parseTime(time) {
121
+ const match = time.trim().match(/^(\d{1,2}):(\d{2})$/);
122
+ if (!match)
123
+ return { hour: 0, minute: 0 };
124
+ const hour = Math.min(23, Math.max(0, Number(match[1])));
125
+ const minute = Math.min(59, Math.max(0, Number(match[2])));
126
+ return { hour, minute };
127
+ }
128
+ function lowerEveryN(every, unit) {
129
+ const safeEvery = Number.isInteger(every) && every > 0 ? every : 1;
130
+ return { mode: "interval", every: safeEvery, unit };
131
+ }
132
+ function lowerDailyAt(time) {
133
+ const { hour, minute } = parseTime(time);
134
+ return { mode: "cron", expression: `${minute} ${hour} * * *` };
135
+ }
136
+ function lowerWeeklyAt(days, time) {
137
+ const { hour, minute } = parseTime(time);
138
+ const sortedDays = [...days];
139
+ sortedDays.sort((a, b) => a - b);
140
+ const dow = sortedDays.length > 0 ? sortedDays.join(",") : "*";
141
+ return { mode: "cron", expression: `${minute} ${hour} * * ${dow}` };
142
+ }
143
+ function lowerMonthlyOnDay(day, time) {
144
+ const { hour, minute } = parseTime(time);
145
+ const safeDay = Math.min(31, Math.max(1, Math.trunc(day)));
146
+ return { mode: "cron", expression: `${minute} ${hour} ${safeDay} * *` };
147
+ }
148
+ function isEvenDivisorStep(every, cycleLength) {
149
+ return Number.isInteger(every) && every > 0 && every < cycleLength && cycleLength % every === 0;
150
+ }
151
+ function valueToCronFields(value) {
152
+ if (value.mode === "cron")
153
+ return splitCron(value.expression);
154
+ switch (value.unit) {
155
+ case "minutes":
156
+ if (isEvenDivisorStep(value.every, 60))
157
+ return [`*/${value.every}`, "*", "*", "*", "*"];
158
+ if (value.every % 60 === 0)
159
+ return hoursIntervalFields(value.every / 60);
160
+ return ["0", "0", "*", "*", "*"];
161
+ case "hours":
162
+ return hoursIntervalFields(value.every);
163
+ case "days":
164
+ case "weeks":
165
+ return ["0", "0", "*", "*", "*"];
166
+ }
167
+ }
168
+ function hoursIntervalFields(everyHours) {
169
+ if (everyHours === 1)
170
+ return ["0", "*", "*", "*", "*"];
171
+ if (isEvenDivisorStep(everyHours, 24))
172
+ return ["0", `*/${everyHours}`, "*", "*", "*"];
173
+ return ["0", "0", "*", "*", "*"];
174
+ }
175
+ function valueToInterval(value) {
176
+ if (value.mode === "interval")
177
+ return { every: value.every, unit: value.unit };
178
+ const [minute, hour, dom, month, dow] = splitCron(value.expression);
179
+ if (month !== "*" || dow !== "*")
180
+ return;
181
+ if (dom === "*" && hour === "*" && minute === "*")
182
+ return { every: 1, unit: "minutes" };
183
+ if (dom === "*" && hour === "*" && minute === "0")
184
+ return { every: 1, unit: "hours" };
185
+ const minuteStep = cronFieldStep(minute);
186
+ if (minuteStep && isEvenDivisorStep(minuteStep, 60) && hour === "*" && dom === "*") {
187
+ return { every: minuteStep, unit: "minutes" };
188
+ }
189
+ const hourStep = cronFieldStep(hour);
190
+ if (hourStep && isEvenDivisorStep(hourStep, 24) && minute === "0" && dom === "*") {
191
+ return { every: hourStep, unit: "hours" };
192
+ }
193
+ return;
194
+ }
195
+ function cronFieldStep(token) {
196
+ const match = token.match(/^\*\/(\d+)$/);
197
+ return match ? Number(match[1]) : undefined;
198
+ }
199
+ var DOW_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
200
+ function pad2(n) {
201
+ return n.toString().padStart(2, "0");
202
+ }
203
+ function isFixedInRange(token, min, max) {
204
+ if (!/^\d+$/.test(token))
205
+ return false;
206
+ const n = Number(token);
207
+ return Number.isInteger(n) && n >= min && n <= max;
208
+ }
209
+ function describeValue(value) {
210
+ if (value.mode === "interval") {
211
+ return value.every === 1 ? `Every ${singularUnit(value.unit)}` : `Every ${value.every} ${value.unit}`;
212
+ }
213
+ const [minute, hour, dom, month, dow] = splitCron(value.expression);
214
+ const timeIsFixed = isFixedInRange(minute, 0, 59) && isFixedInRange(hour, 0, 23);
215
+ const at = timeIsFixed ? ` at ${pad2(Number(hour))}:${pad2(Number(minute))}` : "";
216
+ if (timeIsFixed && dom === "*" && month === "*" && dow !== "*" && /^[\d,]+$/.test(dow)) {
217
+ const dayNumbers = dow.split(",").map(Number);
218
+ const allDaysInRange = dayNumbers.every((day) => Number.isInteger(day) && day >= 0 && day <= 6);
219
+ if (allDaysInRange) {
220
+ const names = dayNumbers.map((day) => DOW_NAMES[day] ?? "").join(", ");
221
+ return `Weekly on ${names}${at}`;
222
+ }
223
+ }
224
+ if (timeIsFixed && isFixedInRange(dom, 1, 31) && month === "*" && dow === "*") {
225
+ return `Monthly on day ${dom}${at}`;
226
+ }
227
+ if (dom === "*" && month === "*" && dow === "*" && timeIsFixed) {
228
+ return `Daily${at}`;
229
+ }
230
+ return `Cron: ${joinCron([minute, hour, dom, month, dow])}`;
231
+ }
232
+
233
+ // src/components/schedule-builder/schedule-builder.svelte
234
+ function Schedule_builder($$renderer, $$props) {
235
+ $$renderer.component(($$renderer2) => {
236
+ const baseId = $.props_id($$renderer2);
237
+ const PRESET_EVERY_UNIT_OPTIONS = [
238
+ { value: "minutes", label: "Minutes" },
239
+ { value: "hours", label: "Hours" }
240
+ ];
241
+ const INTERVAL_UNIT_LABELS = {
242
+ minutes: "Minutes",
243
+ hours: "Hours",
244
+ days: "Days",
245
+ weeks: "Weeks"
246
+ };
247
+ const INTERVAL_UNIT_OPTIONS = INTERVAL_UNITS.map((unit) => ({ value: unit, label: INTERVAL_UNIT_LABELS[unit] }));
248
+ let {
249
+ value,
250
+ onchange,
251
+ computeNextFires,
252
+ previewCount = 5,
253
+ timezoneLabel,
254
+ timezone,
255
+ label = "Schedule",
256
+ class: className,
257
+ "aria-label": ariaLabel,
258
+ "aria-labelledby": ariaLabelledby,
259
+ $$slots,
260
+ $$events,
261
+ ...rest
262
+ } = $$props;
263
+ const normalizedAriaLabel = $.derived(() => typeof ariaLabel === "string" && ariaLabel.trim().length > 0 ? ariaLabel : undefined);
264
+ const normalizedAriaLabelledby = $.derived(() => typeof ariaLabelledby === "string" && ariaLabelledby.trim().length > 0 ? ariaLabelledby : undefined);
265
+ const resolvedAriaLabel = $.derived(() => normalizedAriaLabelledby() === undefined && normalizedAriaLabel() === undefined ? label : normalizedAriaLabel());
266
+ const seedValue = value ?? defaultScheduleValue();
267
+ function scheduleValuesEqual(a, b) {
268
+ if (a.mode !== b.mode)
269
+ return false;
270
+ if (a.mode === "cron" && b.mode === "cron")
271
+ return a.expression === b.expression;
272
+ if (a.mode === "interval" && b.mode === "interval") {
273
+ return a.every === b.every && a.unit === b.unit;
274
+ }
275
+ return false;
276
+ }
277
+ function initialAuthoringMode(candidateValue) {
278
+ if (candidateValue === undefined)
279
+ return "presets";
280
+ if (candidateValue.mode === "cron")
281
+ return "cron";
282
+ return candidateValue.unit === "minutes" || candidateValue.unit === "hours" ? "presets" : "interval";
283
+ }
284
+ function seedFieldsFromValue(seededValue) {
285
+ const interval = valueToInterval(seededValue);
286
+ const isMinutesOrHours = interval !== undefined && (interval.unit === "minutes" || interval.unit === "hours");
287
+ return {
288
+ authoringMode: initialAuthoringMode(seededValue),
289
+ cronFields: valueToCronFields(seededValue),
290
+ intervalEvery: interval?.every ?? 15,
291
+ intervalUnit: interval?.unit ?? "minutes",
292
+ presetKind: "every",
293
+ presetEveryValue: isMinutesOrHours ? interval.every : 15,
294
+ presetEveryUnit: isMinutesOrHours ? interval.unit : "minutes",
295
+ presetDailyTime: "09:00",
296
+ presetWeeklyDays: [],
297
+ presetWeeklyTime: "09:00",
298
+ presetMonthlyDay: 1,
299
+ presetMonthlyTime: "09:00"
300
+ };
301
+ }
302
+ const initialSeed = seedFieldsFromValue(seedValue);
303
+ let authoringMode = initialSeed.authoringMode;
304
+ let presetKind = initialSeed.presetKind;
305
+ let cronFields = initialSeed.cronFields;
306
+ let intervalEvery = initialSeed.intervalEvery;
307
+ let intervalUnit = initialSeed.intervalUnit;
308
+ let presetEveryValue = initialSeed.presetEveryValue;
309
+ let presetEveryUnit = initialSeed.presetEveryUnit;
310
+ let presetDailyTime = initialSeed.presetDailyTime;
311
+ let presetWeeklyDays = initialSeed.presetWeeklyDays;
312
+ let presetWeeklyTime = initialSeed.presetWeeklyTime;
313
+ let presetMonthlyDay = initialSeed.presetMonthlyDay;
314
+ let presetMonthlyTime = initialSeed.presetMonthlyTime;
315
+ function valueForPresets() {
316
+ switch (presetKind) {
317
+ case "every":
318
+ return lowerEveryN(presetEveryValue, presetEveryUnit);
319
+ case "daily":
320
+ return lowerDailyAt(presetDailyTime);
321
+ case "weekly":
322
+ return lowerWeeklyAt(presetWeeklyDays, presetWeeklyTime);
323
+ case "monthly":
324
+ return lowerMonthlyOnDay(presetMonthlyDay, presetMonthlyTime);
325
+ }
326
+ }
327
+ function valueForMode(mode) {
328
+ if (mode === "cron")
329
+ return { mode: "cron", expression: joinCron(cronFields) };
330
+ if (mode === "interval")
331
+ return { mode: "interval", every: intervalEvery, unit: intervalUnit };
332
+ return valueForPresets();
333
+ }
334
+ const currentValue = $.derived(() => valueForMode(authoringMode));
335
+ const currentValueIsValid = $.derived(() => authoringMode !== "cron" || cronFieldsValid(cronFields));
336
+ const resolvedPreviewCount = $.derived(() => Number.isInteger(previewCount) && previewCount > 0 ? previewCount : 5);
337
+ const previewResult = $.derived(() => {
338
+ if (!computeNextFires)
339
+ return { status: "hidden" };
340
+ if (!currentValueIsValid())
341
+ return { status: "invalid" };
342
+ try {
343
+ return {
344
+ status: "ok",
345
+ fires: computeNextFires(currentValue(), resolvedPreviewCount())
346
+ };
347
+ } catch {
348
+ return { status: "error" };
349
+ }
350
+ });
351
+ let lastKnownValue = seedValue;
352
+ let previousValueProp = value;
353
+ function emitChange() {
354
+ lastKnownValue = currentValue();
355
+ onchange?.(currentValue());
356
+ }
357
+ function handleAuthoringModeChange(nextMode) {
358
+ if (nextMode === authoringMode)
359
+ return;
360
+ authoringMode = nextMode;
361
+ if (nextMode === "cron") {
362
+ cronFields = valueToCronFields(lastKnownValue);
363
+ } else if (nextMode === "interval") {
364
+ const interval = valueToInterval(lastKnownValue);
365
+ if (interval) {
366
+ intervalEvery = interval.every;
367
+ intervalUnit = interval.unit;
368
+ }
369
+ } else if (nextMode === "presets") {
370
+ const seed = seedFieldsFromValue(lastKnownValue);
371
+ presetKind = seed.presetKind;
372
+ presetEveryValue = seed.presetEveryValue;
373
+ presetEveryUnit = seed.presetEveryUnit;
374
+ presetDailyTime = seed.presetDailyTime;
375
+ presetWeeklyDays = seed.presetWeeklyDays;
376
+ presetWeeklyTime = seed.presetWeeklyTime;
377
+ presetMonthlyDay = seed.presetMonthlyDay;
378
+ presetMonthlyTime = seed.presetMonthlyTime;
379
+ }
380
+ }
381
+ function handlePresetKindChange(nextKind) {
382
+ if (nextKind === presetKind)
383
+ return;
384
+ presetKind = nextKind;
385
+ emitChange();
386
+ }
387
+ function handleCronFieldChange(index, raw) {
388
+ const next = [...cronFields];
389
+ next[index] = raw;
390
+ cronFields = next;
391
+ if (cronFieldsValid(next))
392
+ emitChange();
393
+ }
394
+ function toPositiveInteger(next) {
395
+ if (next === null || !Number.isFinite(next) || next < 1)
396
+ return 1;
397
+ return Math.trunc(next);
398
+ }
399
+ function handleIntervalEveryChange(next) {
400
+ intervalEvery = toPositiveInteger(next);
401
+ emitChange();
402
+ }
403
+ function handleIntervalUnitChange(event) {
404
+ intervalUnit = event.currentTarget.value;
405
+ emitChange();
406
+ }
407
+ function handlePresetEveryValueChange(next) {
408
+ presetEveryValue = toPositiveInteger(next);
409
+ emitChange();
410
+ }
411
+ function handlePresetEveryUnitChange(event) {
412
+ presetEveryUnit = event.currentTarget.value;
413
+ emitChange();
414
+ }
415
+ function acceptPresetTime(next, commit) {
416
+ if (!next)
417
+ return;
418
+ commit(next);
419
+ emitChange();
420
+ }
421
+ function handlePresetDailyTimeChange(next) {
422
+ acceptPresetTime(next, (time) => presetDailyTime = time);
423
+ }
424
+ function toggleWeeklyDay(day) {
425
+ presetWeeklyDays = presetWeeklyDays.includes(day) ? presetWeeklyDays.filter((existing) => existing !== day) : [...presetWeeklyDays, day];
426
+ emitChange();
427
+ }
428
+ function handlePresetWeeklyTimeChange(next) {
429
+ acceptPresetTime(next, (time) => presetWeeklyTime = time);
430
+ }
431
+ function handlePresetMonthlyDayChange(next) {
432
+ presetMonthlyDay = next && next >= 1 ? Math.min(31, Math.trunc(next)) : 1;
433
+ emitChange();
434
+ }
435
+ function handlePresetMonthlyTimeChange(next) {
436
+ acceptPresetTime(next, (time) => presetMonthlyTime = time);
437
+ }
438
+ const modeTabId = (mode) => `${baseId}-mode-${mode}-tab`;
439
+ const modePanelId = (mode) => `${baseId}-mode-${mode}-panel`;
440
+ let $$settled = true;
441
+ let $$inner_renderer;
442
+ function $$render_inner($$renderer3) {
443
+ $$renderer3.push(`<div${$.attributes({
444
+ ...rest,
445
+ class: $.clsx(classNames("cinder-schedule-builder", className)),
446
+ role: "group",
447
+ "aria-label": resolvedAriaLabel(),
448
+ "aria-labelledby": normalizedAriaLabelledby(),
449
+ "data-sb-mode": authoringMode
450
+ })}>`);
451
+ Segmented_control($$renderer3, {
452
+ id: `${baseId}-mode`,
453
+ label: "Schedule authoring mode",
454
+ variant: "tablist",
455
+ value: authoringMode,
456
+ onchange: handleAuthoringModeChange,
457
+ class: "cinder-schedule-builder__mode-switch",
458
+ children: ($$renderer4) => {
459
+ Segment($$renderer4, {
460
+ id: modeTabId("presets"),
461
+ value: "presets",
462
+ controls: modePanelId("presets"),
463
+ children: ($$renderer5) => {
464
+ $$renderer5.push(`<!---->Presets`);
465
+ },
466
+ $$slots: { default: true }
467
+ });
468
+ $$renderer4.push(`<!----> `);
469
+ Segment($$renderer4, {
470
+ id: modeTabId("cron"),
471
+ value: "cron",
472
+ controls: modePanelId("cron"),
473
+ children: ($$renderer5) => {
474
+ $$renderer5.push(`<!---->Cron`);
475
+ },
476
+ $$slots: { default: true }
477
+ });
478
+ $$renderer4.push(`<!----> `);
479
+ Segment($$renderer4, {
480
+ id: modeTabId("interval"),
481
+ value: "interval",
482
+ controls: modePanelId("interval"),
483
+ children: ($$renderer5) => {
484
+ $$renderer5.push(`<!---->Interval`);
485
+ },
486
+ $$slots: { default: true }
487
+ });
488
+ $$renderer4.push(`<!---->`);
489
+ },
490
+ $$slots: { default: true }
491
+ });
492
+ $$renderer3.push(`<!----> `);
493
+ if (authoringMode === "presets") {
494
+ $$renderer3.push("<!--[0-->");
495
+ $$renderer3.push(`<div${$.attr("id", modePanelId("presets"))} role="tabpanel"${$.attr("aria-labelledby", modeTabId("presets"))} class="cinder-schedule-builder__panel" data-sb-panel="presets">`);
496
+ Segmented_control($$renderer3, {
497
+ id: `${baseId}-preset-kind`,
498
+ label: "Preset kind",
499
+ value: presetKind,
500
+ onchange: handlePresetKindChange,
501
+ class: "cinder-schedule-builder__preset-kind",
502
+ children: ($$renderer4) => {
503
+ Segment($$renderer4, {
504
+ id: `${baseId}-preset-kind-every`,
505
+ value: "every",
506
+ children: ($$renderer5) => {
507
+ $$renderer5.push(`<!---->Every N`);
508
+ },
509
+ $$slots: { default: true }
510
+ });
511
+ $$renderer4.push(`<!----> `);
512
+ Segment($$renderer4, {
513
+ id: `${baseId}-preset-kind-daily`,
514
+ value: "daily",
515
+ children: ($$renderer5) => {
516
+ $$renderer5.push(`<!---->Daily`);
517
+ },
518
+ $$slots: { default: true }
519
+ });
520
+ $$renderer4.push(`<!----> `);
521
+ Segment($$renderer4, {
522
+ id: `${baseId}-preset-kind-weekly`,
523
+ value: "weekly",
524
+ children: ($$renderer5) => {
525
+ $$renderer5.push(`<!---->Weekly`);
526
+ },
527
+ $$slots: { default: true }
528
+ });
529
+ $$renderer4.push(`<!----> `);
530
+ Segment($$renderer4, {
531
+ id: `${baseId}-preset-kind-monthly`,
532
+ value: "monthly",
533
+ children: ($$renderer5) => {
534
+ $$renderer5.push(`<!---->Monthly`);
535
+ },
536
+ $$slots: { default: true }
537
+ });
538
+ $$renderer4.push(`<!---->`);
539
+ },
540
+ $$slots: { default: true }
541
+ });
542
+ $$renderer3.push(`<!----> `);
543
+ if (presetKind === "every") {
544
+ $$renderer3.push("<!--[0-->");
545
+ var bind_get = () => presetEveryValue;
546
+ var bind_set = handlePresetEveryValueChange;
547
+ $$renderer3.push(`<div class="cinder-schedule-builder__field-row">`);
548
+ Number_input($$renderer3, {
549
+ id: `${baseId}-preset-every-value`,
550
+ label: "Every",
551
+ min: 1,
552
+ step: 1,
553
+ get value() {
554
+ return bind_get();
555
+ },
556
+ set value($$value) {
557
+ bind_set($$value);
558
+ }
559
+ });
560
+ $$renderer3.push(`<!----> `);
561
+ Select($$renderer3, {
562
+ id: `${baseId}-preset-every-unit`,
563
+ label: "Unit",
564
+ options: PRESET_EVERY_UNIT_OPTIONS,
565
+ value: presetEveryUnit,
566
+ onchange: handlePresetEveryUnitChange
567
+ });
568
+ $$renderer3.push(`<!----></div>`);
569
+ } else if (presetKind === "daily") {
570
+ $$renderer3.push("<!--[1-->");
571
+ var bind_get_1 = () => presetDailyTime;
572
+ var bind_set_1 = handlePresetDailyTimeChange;
573
+ Time_field($$renderer3, {
574
+ id: `${baseId}-preset-daily-time`,
575
+ label: "At",
576
+ get value() {
577
+ return bind_get_1();
578
+ },
579
+ set value($$value) {
580
+ bind_set_1($$value);
581
+ }
582
+ });
583
+ } else if (presetKind === "weekly") {
584
+ $$renderer3.push("<!--[2-->");
585
+ var bind_get_2 = () => presetWeeklyTime;
586
+ var bind_set_2 = handlePresetWeeklyTimeChange;
587
+ $$renderer3.push(`<div class="cinder-schedule-builder__weekday-group" role="group" aria-label="Days of week"><!--[-->`);
588
+ const each_array = $.ensure_array_like(WEEKDAYS);
589
+ for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
590
+ let day = each_array[$$index];
591
+ Chip($$renderer3, {
592
+ mode: "toggle",
593
+ label: day.short,
594
+ "aria-label": day.long,
595
+ pressed: presetWeeklyDays.includes(day.value),
596
+ onpressedchange: () => toggleWeeklyDay(day.value)
597
+ });
598
+ }
599
+ $$renderer3.push(`<!--]--></div> `);
600
+ Time_field($$renderer3, {
601
+ id: `${baseId}-preset-weekly-time`,
602
+ label: "At",
603
+ get value() {
604
+ return bind_get_2();
605
+ },
606
+ set value($$value) {
607
+ bind_set_2($$value);
608
+ }
609
+ });
610
+ $$renderer3.push(`<!---->`);
611
+ } else {
612
+ $$renderer3.push("<!--[-1-->");
613
+ var bind_get_3 = () => presetMonthlyDay;
614
+ var bind_set_3 = handlePresetMonthlyDayChange;
615
+ var bind_get_4 = () => presetMonthlyTime;
616
+ var bind_set_4 = handlePresetMonthlyTimeChange;
617
+ $$renderer3.push(`<div class="cinder-schedule-builder__field-row">`);
618
+ Number_input($$renderer3, {
619
+ id: `${baseId}-preset-monthly-day`,
620
+ label: "Day of month",
621
+ min: 1,
622
+ max: 31,
623
+ get value() {
624
+ return bind_get_3();
625
+ },
626
+ set value($$value) {
627
+ bind_set_3($$value);
628
+ }
629
+ });
630
+ $$renderer3.push(`<!----> `);
631
+ Time_field($$renderer3, {
632
+ id: `${baseId}-preset-monthly-time`,
633
+ label: "At",
634
+ get value() {
635
+ return bind_get_4();
636
+ },
637
+ set value($$value) {
638
+ bind_set_4($$value);
639
+ }
640
+ });
641
+ $$renderer3.push(`<!----></div>`);
642
+ }
643
+ $$renderer3.push(`<!--]--></div>`);
644
+ } else if (authoringMode === "cron") {
645
+ $$renderer3.push("<!--[1-->");
646
+ $$renderer3.push(`<div${$.attr("id", modePanelId("cron"))} role="tabpanel"${$.attr("aria-labelledby", modeTabId("cron"))} class="cinder-schedule-builder__panel" data-sb-panel="cron"><div class="cinder-schedule-builder__cron-fields"><!--[-->`);
647
+ const each_array_1 = $.ensure_array_like(CRON_FIELDS);
648
+ for (let index = 0, $$length = each_array_1.length;index < $$length; index++) {
649
+ let field = each_array_1[index];
650
+ const fieldError = validateCronField(cronFields[index] ?? "*", index);
651
+ var bind_get_5 = () => cronFields[index] ?? "*";
652
+ var bind_set_5 = (next) => handleCronFieldChange(index, next);
653
+ Input($$renderer3, $.spread_props([
654
+ {
655
+ id: `${baseId}-cron-field-${index}`,
656
+ label: field.name,
657
+ description: field.hint,
658
+ get value() {
659
+ return bind_get_5();
660
+ },
661
+ set value($$value) {
662
+ bind_set_5($$value);
663
+ }
664
+ },
665
+ fieldError ? { error: fieldError } : {}
666
+ ]));
667
+ }
668
+ $$renderer3.push(`<!--]--></div></div>`);
669
+ } else {
670
+ $$renderer3.push("<!--[-1-->");
671
+ var bind_get_6 = () => intervalEvery;
672
+ var bind_set_6 = handleIntervalEveryChange;
673
+ $$renderer3.push(`<div${$.attr("id", modePanelId("interval"))} role="tabpanel"${$.attr("aria-labelledby", modeTabId("interval"))} class="cinder-schedule-builder__panel" data-sb-panel="interval"><div class="cinder-schedule-builder__field-row">`);
674
+ Number_input($$renderer3, {
675
+ id: `${baseId}-interval-every`,
676
+ label: "Every",
677
+ min: 1,
678
+ step: 1,
679
+ get value() {
680
+ return bind_get_6();
681
+ },
682
+ set value($$value) {
683
+ bind_set_6($$value);
684
+ }
685
+ });
686
+ $$renderer3.push(`<!----> `);
687
+ Select($$renderer3, {
688
+ id: `${baseId}-interval-unit`,
689
+ label: "Unit",
690
+ options: INTERVAL_UNIT_OPTIONS,
691
+ value: intervalUnit,
692
+ onchange: handleIntervalUnitChange
693
+ });
694
+ $$renderer3.push(`<!----></div></div>`);
695
+ }
696
+ $$renderer3.push(`<!--]--> <dl class="cinder-schedule-builder__summary"><dt class="cinder-schedule-builder__section-label">Summary</dt> <dd class="cinder-schedule-builder__summary-text">${$.escape(describeValue(currentValue()))}</dd></dl> `);
697
+ if (previewResult().status !== "hidden") {
698
+ $$renderer3.push("<!--[0-->");
699
+ $$renderer3.push(`<div class="cinder-schedule-builder__preview"><span class="cinder-schedule-builder__section-label"${$.attr("id", `${baseId}-preview-label`)}>Upcoming fires</span> `);
700
+ if (previewResult().status === "invalid") {
701
+ $$renderer3.push("<!--[0-->");
702
+ $$renderer3.push(`<p class="cinder-schedule-builder__empty">Preview unavailable — fix the cron expression above.</p>`);
703
+ } else if (previewResult().status === "error") {
704
+ $$renderer3.push("<!--[1-->");
705
+ $$renderer3.push(`<p class="cinder-schedule-builder__empty">Preview unavailable.</p>`);
706
+ } else if (previewResult().fires.length > 0) {
707
+ $$renderer3.push("<!--[2-->");
708
+ $$renderer3.push(`<ul class="cinder-schedule-builder__preview-list"${$.attr("aria-labelledby", `${baseId}-preview-label`)}><!--[-->`);
709
+ const each_array_2 = $.ensure_array_like(previewResult().fires);
710
+ for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
711
+ let fire = each_array_2[$$index_2];
712
+ $$renderer3.push(`<li class="cinder-schedule-builder__preview-item">${$.escape(fire.label)}</li>`);
713
+ }
714
+ $$renderer3.push(`<!--]--></ul>`);
715
+ } else {
716
+ $$renderer3.push("<!--[-1-->");
717
+ $$renderer3.push(`<p class="cinder-schedule-builder__empty">No upcoming fires.</p>`);
718
+ }
719
+ $$renderer3.push(`<!--]--></div>`);
720
+ } else {
721
+ $$renderer3.push("<!--[-1-->");
722
+ }
723
+ $$renderer3.push(`<!--]--> <dl class="cinder-schedule-builder__timezone"><dt class="cinder-schedule-builder__section-label">Timezone</dt> <dd class="cinder-schedule-builder__timezone-value">`);
724
+ if (timezone) {
725
+ $$renderer3.push("<!--[0-->");
726
+ timezone($$renderer3);
727
+ $$renderer3.push(`<!---->`);
728
+ } else if (timezoneLabel) {
729
+ $$renderer3.push("<!--[1-->");
730
+ $$renderer3.push(`${$.escape(timezoneLabel)}`);
731
+ } else {
732
+ $$renderer3.push("<!--[-1-->");
733
+ $$renderer3.push(`<span class="cinder-schedule-builder__empty">Not set</span>`);
734
+ }
735
+ $$renderer3.push(`<!--]--></dd></dl></div>`);
736
+ }
737
+ do {
738
+ $$settled = true;
739
+ $$inner_renderer = $$renderer2.copy();
740
+ $$render_inner($$inner_renderer);
741
+ } while (!$$settled);
742
+ $$renderer2.subsume($$inner_renderer);
743
+ }, Schedule_builder);
744
+ }
745
+
746
+ // src/components/schedule-builder/index.ts
747
+ var schedule_builder_default = Schedule_builder;
748
+ export { Schedule_builder, schedule_builder_default };
749
+
750
+ //# debugId=302BB8070B07926364756E2164756E21