@thanh01.pmt/interactive-quiz-kit 1.0.24 → 1.0.27

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,28 +2,6 @@ import { z } from 'zod';
2
2
  import { genkit } from 'genkit';
3
3
  import { gemini20Flash, googleAI } from '@genkit-ai/googleai';
4
4
  import JSZip from 'jszip';
5
- import { clsx } from 'clsx';
6
- import { twMerge } from 'tailwind-merge';
7
-
8
- var __defProp = Object.defineProperty;
9
- var __defProps = Object.defineProperties;
10
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
11
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
- var __spreadValues = (a, b) => {
16
- for (var prop in b || (b = {}))
17
- if (__hasOwnProp.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- if (__getOwnPropSymbols)
20
- for (var prop of __getOwnPropSymbols(b)) {
21
- if (__propIsEnum.call(b, prop))
22
- __defNormalProp(a, prop, b[prop]);
23
- }
24
- return a;
25
- };
26
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
27
5
 
28
6
  // src/services/SCORMService.ts
29
7
  var SCORM_TRUE = "true";
@@ -44,11 +22,12 @@ var SCORMService = class {
44
22
  this.isInitialized = false;
45
23
  this.isTerminated = false;
46
24
  this.studentName = null;
47
- this.settings = __spreadValues({
25
+ this.settings = {
48
26
  setCompletionOnFinish: true,
49
27
  setSuccessOnPass: true,
50
- autoCommit: true
51
- }, settings);
28
+ autoCommit: true,
29
+ ...settings
30
+ };
52
31
  if (typeof window !== "undefined") {
53
32
  this._findAPI();
54
33
  }
@@ -154,14 +133,13 @@ var SCORMService = class {
154
133
  }
155
134
  }
156
135
  getValue(element) {
157
- var _a;
158
136
  if (!this.hasAPI() || !this.isInitialized) return null;
159
137
  const value = this.scormVersionFound === "2004" ? this.scormAPI.GetValue(element) : this.scormAPI.LMSGetValue(element);
160
138
  const error = this.getLastError();
161
139
  if (error.code !== SCORM_NO_ERROR && error.code !== "403" && error.code !== "0") {
162
140
  console.warn(`SCORMService: GetValue for ${element} produced an error ${error.code}: ${error.message}. Returning raw value:`, value);
163
141
  }
164
- return (_a = value == null ? void 0 : value.toString()) != null ? _a : null;
142
+ return value?.toString() ?? null;
165
143
  }
166
144
  commit() {
167
145
  if (!this.hasAPI() || !this.isInitialized) {
@@ -233,7 +211,6 @@ var SCORMService = class {
233
211
  }
234
212
  }
235
213
  getLastError() {
236
- var _a, _b;
237
214
  if (!this.hasAPI()) return { code: "-1", message: "SCORM API not found." };
238
215
  const errorCode = this.scormVersionFound === "2004" ? this.scormAPI.GetLastError() : this.scormAPI.LMSGetLastError();
239
216
  if (errorCode === SCORM_NO_ERROR || errorCode === 0 || errorCode === "0") {
@@ -243,8 +220,8 @@ var SCORMService = class {
243
220
  const diagnostic = this.scormVersionFound === "2004" ? this.scormAPI.GetDiagnostic(errorCode.toString()) : this.scormAPI.LMSGetDiagnostic(errorCode.toString());
244
221
  return {
245
222
  code: errorCode.toString(),
246
- message: (_a = errorMessage == null ? void 0 : errorMessage.toString()) != null ? _a : "Unknown error.",
247
- diagnostic: (_b = diagnostic == null ? void 0 : diagnostic.toString()) != null ? _b : void 0
223
+ message: errorMessage?.toString() ?? "Unknown error.",
224
+ diagnostic: diagnostic?.toString() ?? void 0
248
225
  };
249
226
  }
250
227
  formatCMITime(totalSeconds) {
@@ -275,14 +252,13 @@ var SCORMService = class {
275
252
  // src/services/evaluators/multiple-choice-evaluator.ts
276
253
  var MultipleChoiceEvaluator = class {
277
254
  async evaluate(question, answer) {
278
- var _a;
279
- const points = (_a = question.points) != null ? _a : 0;
255
+ const points = question.points ?? 0;
280
256
  const correctAnswerId = question.correctAnswerId;
281
257
  const isCorrect = answer === correctAnswerId;
282
258
  const correctOption = question.options.find((opt) => opt.id === correctAnswerId);
283
259
  const correctAnswerDetail = {
284
260
  id: correctAnswerId,
285
- value: (correctOption == null ? void 0 : correctOption.text) || ""
261
+ value: correctOption?.text || ""
286
262
  };
287
263
  return Promise.resolve({
288
264
  isCorrect,
@@ -295,8 +271,7 @@ var MultipleChoiceEvaluator = class {
295
271
  // src/services/evaluators/multiple-response-evaluator.ts
296
272
  var MultipleResponseEvaluator = class {
297
273
  async evaluate(question, answer) {
298
- var _a;
299
- const points = (_a = question.points) != null ? _a : 0;
274
+ const points = question.points ?? 0;
300
275
  const correctAnswerIds = question.correctAnswerIds;
301
276
  let isCorrect = false;
302
277
  if (Array.isArray(answer)) {
@@ -305,10 +280,7 @@ var MultipleResponseEvaluator = class {
305
280
  isCorrect = userAnswerSet.size === correctAnswerSet.size && [...userAnswerSet].every((id) => correctAnswerSet.has(id));
306
281
  }
307
282
  const correctValues = correctAnswerIds.map(
308
- (id) => {
309
- var _a2;
310
- return ((_a2 = question.options.find((opt) => opt.id === id)) == null ? void 0 : _a2.text) || "";
311
- }
283
+ (id) => question.options.find((opt) => opt.id === id)?.text || ""
312
284
  );
313
285
  const correctAnswerDetail = {
314
286
  id: correctAnswerIds,
@@ -325,8 +297,7 @@ var MultipleResponseEvaluator = class {
325
297
  // src/services/evaluators/true-false-evaluator.ts
326
298
  var TrueFalseEvaluator = class {
327
299
  async evaluate(question, answer) {
328
- var _a;
329
- const points = (_a = question.points) != null ? _a : 0;
300
+ const points = question.points ?? 0;
330
301
  const correctAnswer = question.correctAnswer;
331
302
  let userAnswer = answer;
332
303
  if (typeof answer === "string") {
@@ -348,12 +319,11 @@ var TrueFalseEvaluator = class {
348
319
  // src/services/evaluators/short-answer-evaluator.ts
349
320
  var ShortAnswerEvaluator = class {
350
321
  async evaluate(question, answer) {
351
- var _a, _b;
352
- const points = (_a = question.points) != null ? _a : 0;
322
+ const points = question.points ?? 0;
353
323
  let isCorrect = false;
354
324
  if (typeof answer === "string") {
355
325
  const userAnswerTrimmed = answer.trim();
356
- const caseSensitive = (_b = question.isCaseSensitive) != null ? _b : false;
326
+ const caseSensitive = question.isCaseSensitive ?? false;
357
327
  isCorrect = question.acceptedAnswers.some(
358
328
  (accAns) => caseSensitive ? accAns.trim() === userAnswerTrimmed : accAns.trim().toLowerCase() === userAnswerTrimmed.toLowerCase()
359
329
  );
@@ -373,8 +343,7 @@ var ShortAnswerEvaluator = class {
373
343
  // src/services/evaluators/numeric-evaluator.ts
374
344
  var NumericEvaluator = class {
375
345
  async evaluate(question, answer) {
376
- var _a;
377
- const points = (_a = question.points) != null ? _a : 0;
346
+ const points = question.points ?? 0;
378
347
  let isCorrect = false;
379
348
  if (typeof answer === "string" || typeof answer === "number") {
380
349
  const userAnswerNum = parseFloat(String(answer));
@@ -397,17 +366,13 @@ var NumericEvaluator = class {
397
366
  // src/services/evaluators/sequence-evaluator.ts
398
367
  var SequenceEvaluator = class {
399
368
  async evaluate(question, answer) {
400
- var _a;
401
- const points = (_a = question.points) != null ? _a : 0;
369
+ const points = question.points ?? 0;
402
370
  let isCorrect = false;
403
371
  if (Array.isArray(answer) && answer.length === question.correctOrder.length) {
404
372
  isCorrect = answer.every((itemId, index) => itemId === question.correctOrder[index]);
405
373
  }
406
374
  const correctValues = question.correctOrder.map(
407
- (id) => {
408
- var _a2;
409
- return ((_a2 = question.items.find((item) => item.id === id)) == null ? void 0 : _a2.content) || "";
410
- }
375
+ (id) => question.items.find((item) => item.id === id)?.content || ""
411
376
  );
412
377
  const correctAnswerDetail = {
413
378
  id: question.correctOrder,
@@ -424,17 +389,15 @@ var SequenceEvaluator = class {
424
389
  // src/services/evaluators/matching-evaluator.ts
425
390
  var MatchingEvaluator = class {
426
391
  async evaluate(question, answer) {
427
- var _a;
428
- const points = (_a = question.points) != null ? _a : 0;
392
+ const points = question.points ?? 0;
429
393
  let isCorrect = false;
430
394
  if (typeof answer === "object" && answer !== null && !Array.isArray(answer)) {
431
395
  const userAnswerMap = answer;
432
396
  isCorrect = question.correctAnswerMap.length === Object.keys(userAnswerMap).length && question.correctAnswerMap.every((map) => userAnswerMap[map.promptId] === map.optionId);
433
397
  }
434
398
  const correctMap = question.correctAnswerMap.reduce((acc, curr) => {
435
- var _a2, _b;
436
- const promptText = ((_a2 = question.prompts.find((p) => p.id === curr.promptId)) == null ? void 0 : _a2.content) || "";
437
- const optionText = ((_b = question.options.find((o) => o.id === curr.optionId)) == null ? void 0 : _b.content) || "";
399
+ const promptText = question.prompts.find((p) => p.id === curr.promptId)?.content || "";
400
+ const optionText = question.options.find((o) => o.id === curr.optionId)?.content || "";
438
401
  acc[promptText] = optionText;
439
402
  return acc;
440
403
  }, {});
@@ -453,16 +416,14 @@ var MatchingEvaluator = class {
453
416
  // src/services/evaluators/fill-in-the-blanks-evaluator.ts
454
417
  var FillInTheBlanksEvaluator = class {
455
418
  async evaluate(question, answer) {
456
- var _a;
457
- const points = (_a = question.points) != null ? _a : 0;
419
+ const points = question.points ?? 0;
458
420
  let isCorrect = false;
459
421
  if (typeof answer === "object" && answer !== null && !Array.isArray(answer)) {
460
422
  const userAnswerMap = answer;
461
423
  isCorrect = question.answers.length > 0 && question.answers.every((correctAnsDef) => {
462
- var _a2, _b;
463
- const userValForBlank = (_a2 = userAnswerMap[correctAnsDef.blankId]) == null ? void 0 : _a2.trim();
424
+ const userValForBlank = userAnswerMap[correctAnsDef.blankId]?.trim();
464
425
  if (userValForBlank === void 0) return false;
465
- const caseSensitive = (_b = question.isCaseSensitive) != null ? _b : false;
426
+ const caseSensitive = question.isCaseSensitive ?? false;
466
427
  return correctAnsDef.acceptedValues.some(
467
428
  (accVal) => caseSensitive ? accVal.trim() === userValForBlank : accVal.trim().toLowerCase() === userValForBlank.toLowerCase()
468
429
  );
@@ -487,17 +448,15 @@ var FillInTheBlanksEvaluator = class {
487
448
  // src/services/evaluators/drag-and-drop-evaluator.ts
488
449
  var DragAndDropEvaluator = class {
489
450
  async evaluate(question, answer) {
490
- var _a;
491
- const points = (_a = question.points) != null ? _a : 0;
451
+ const points = question.points ?? 0;
492
452
  let isCorrect = false;
493
453
  if (typeof answer === "object" && answer !== null && !Array.isArray(answer)) {
494
454
  const userAnswerMap = answer;
495
455
  isCorrect = question.answerMap.length === Object.keys(userAnswerMap).length && question.answerMap.every((map) => userAnswerMap[map.draggableId] === map.dropZoneId);
496
456
  }
497
457
  const correctMap = question.answerMap.reduce((acc, curr) => {
498
- var _a2, _b;
499
- const draggableText = ((_a2 = question.draggableItems.find((d) => d.id === curr.draggableId)) == null ? void 0 : _a2.content) || "";
500
- const dropZoneText = ((_b = question.dropZones.find((z4) => z4.id === curr.dropZoneId)) == null ? void 0 : _b.label) || "";
458
+ const draggableText = question.draggableItems.find((d) => d.id === curr.draggableId)?.content || "";
459
+ const dropZoneText = question.dropZones.find((z4) => z4.id === curr.dropZoneId)?.label || "";
501
460
  acc[draggableText] = dropZoneText;
502
461
  return acc;
503
462
  }, {});
@@ -516,8 +475,7 @@ var DragAndDropEvaluator = class {
516
475
  // src/services/evaluators/hotspot-evaluator.ts
517
476
  var HotspotEvaluator = class {
518
477
  async evaluate(question, answer) {
519
- var _a;
520
- const points = (_a = question.points) != null ? _a : 0;
478
+ const points = question.points ?? 0;
521
479
  let isCorrect = false;
522
480
  if (Array.isArray(answer)) {
523
481
  const userAnswerSet = new Set(answer);
@@ -525,10 +483,7 @@ var HotspotEvaluator = class {
525
483
  isCorrect = userAnswerSet.size === correctAnswerSet.size && [...userAnswerSet].every((id) => correctAnswerSet.has(id));
526
484
  }
527
485
  const correctValues = question.correctHotspotIds.map(
528
- (id) => {
529
- var _a2;
530
- return ((_a2 = question.hotspots.find((h) => h.id === id)) == null ? void 0 : _a2.description) || id;
531
- }
486
+ (id) => question.hotspots.find((h) => h.id === id)?.description || id
532
487
  );
533
488
  const correctAnswerDetail = {
534
489
  id: question.correctHotspotIds,
@@ -545,11 +500,10 @@ var HotspotEvaluator = class {
545
500
  // src/services/evaluators/programming-evaluator.ts
546
501
  var ProgrammingEvaluator = class {
547
502
  async evaluate(question, answer) {
548
- var _a, _b;
549
- const points = (_a = question.points) != null ? _a : 0;
503
+ const points = question.points ?? 0;
550
504
  let isCorrect = false;
551
505
  if (typeof answer === "string" && typeof question.solutionGeneratedCode === "string") {
552
- if (typeof window !== "undefined" && ((_b = window.Blockly) == null ? void 0 : _b.JavaScript)) {
506
+ if (typeof window !== "undefined" && window.Blockly?.JavaScript) {
553
507
  const LocalBlockly = window.Blockly;
554
508
  let generatedUserCode = "";
555
509
  try {
@@ -623,10 +577,10 @@ var JsonRepairEngine = class {
623
577
  if (breakIndex !== -1) {
624
578
  const stringContent = afterUnterminated.substring(0, breakIndex);
625
579
  const remainder = afterUnterminated.substring(breakIndex);
626
- const escapedContent = stringContent.replace(new RegExp('(?<!\\\\)"', "g"), '\\"');
580
+ const escapedContent = stringContent.replace(/(?<!\\)"/g, '\\"');
627
581
  repaired = beforeUnterminated + escapedContent + '"' + remainder;
628
582
  } else {
629
- const escapedContent = afterUnterminated.replace(new RegExp('(?<!\\\\)"', "g"), '\\"');
583
+ const escapedContent = afterUnterminated.replace(/(?<!\\)"/g, '\\"');
630
584
  repaired = beforeUnterminated + escapedContent + '"';
631
585
  }
632
586
  }
@@ -702,7 +656,6 @@ var JsonRepairEngine = class {
702
656
  * Main repair function that attempts multiple strategies.
703
657
  */
704
658
  static repairJson(jsonStr) {
705
- var _a;
706
659
  let current = jsonStr.trim();
707
660
  const maxAttempts = 5;
708
661
  let lastError = "";
@@ -732,7 +685,7 @@ var JsonRepairEngine = class {
732
685
  }
733
686
  lastError = validation.error || "";
734
687
  lastPosition = validation.position;
735
- if ((_a = validation.error) == null ? void 0 : _a.includes("Unterminated string")) {
688
+ if (validation.error?.includes("Unterminated string")) {
736
689
  current = this.repairUnterminatedStrings(current);
737
690
  } else {
738
691
  current = this.applyCommonFixes(current);
@@ -1005,13 +958,6 @@ var CodeEvaluationService = class {
1005
958
  constructor() {
1006
959
  this.apiKey = APIKeyService.getAPIKey(GEMINI_API_KEY_SERVICE_NAME);
1007
960
  }
1008
- /**
1009
- * Evaluates a user's code against a single test case using an AI judge.
1010
- * @param question The full CodingQuestion object.
1011
- * @param userCode The user's submitted code string.
1012
- * @param testCase The specific TestCase to evaluate against.
1013
- * @returns A promise that resolves to an EvaluationResult object.
1014
- */
1015
961
  async evaluateSingleTestCase(question, userCode, testCase) {
1016
962
  if (!this.apiKey) {
1017
963
  return {
@@ -1022,21 +968,20 @@ var CodeEvaluationService = class {
1022
968
  };
1023
969
  }
1024
970
  const aiResult = await evaluateUserCode({
1025
- language: question.language,
971
+ // FIX: Use 'codingLanguage' instead of 'language'
972
+ language: question.codingLanguage,
1026
973
  problemPrompt: question.prompt,
1027
974
  userCode,
1028
975
  testCase
1029
976
  }, this.apiKey);
1030
- return __spreadValues({
1031
- testCaseId: testCase.id
1032
- }, aiResult);
977
+ return {
978
+ testCaseId: testCase.id,
979
+ // FIX: Ensure 'actualOutput' is always provided, even if it's null from AI
980
+ actualOutput: aiResult.actualOutput !== void 0 ? aiResult.actualOutput : null,
981
+ passed: aiResult.passed,
982
+ reasoning: aiResult.reasoning
983
+ };
1033
984
  }
1034
- /**
1035
- * Evaluates user's code against all test cases for a given question.
1036
- * @param question The full CodingQuestion object.
1037
- * @param userCode The user's submitted code string.
1038
- * @returns A promise that resolves to an array of EvaluationResult objects.
1039
- */
1040
985
  async evaluateAllTestCases(question, userCode) {
1041
986
  const results = [];
1042
987
  for (const testCase of question.testCases) {
@@ -1045,13 +990,6 @@ var CodeEvaluationService = class {
1045
990
  }
1046
991
  return results;
1047
992
  }
1048
- /**
1049
- * Evaluates user's code against only the public test cases for a given question.
1050
- * Useful for a "Run Tests" button before final submission.
1051
- * @param question The full CodingQuestion object.
1052
- * @param userCode The user's submitted code string.
1053
- * @returns A promise that resolves to an array of EvaluationResult objects.
1054
- */
1055
993
  async evaluatePublicTestCases(question, userCode) {
1056
994
  const publicTestCases = question.testCases.filter((tc) => tc.isPublic);
1057
995
  const results = [];
@@ -1066,8 +1004,7 @@ var CodeEvaluationService = class {
1066
1004
  // src/services/evaluators/coding-evaluator.ts
1067
1005
  var CodingEvaluator = class {
1068
1006
  async evaluate(question, answer) {
1069
- var _a;
1070
- const points = (_a = question.points) != null ? _a : 0;
1007
+ const points = question.points ?? 0;
1071
1008
  if (typeof answer !== "string" || !answer.trim()) {
1072
1009
  return {
1073
1010
  isCorrect: false,
@@ -1124,17 +1061,16 @@ var QuizEngine = class {
1124
1061
  this.quizResultState = { scormStatus: "idle" };
1125
1062
  this.questionStartTime = null;
1126
1063
  this.questionTimings = /* @__PURE__ */ new Map();
1127
- var _a, _b, _c, _d, _e;
1128
1064
  this.config = options.config;
1129
1065
  this.callbacks = options.callbacks || {};
1130
- this.questions = ((_a = this.config.settings) == null ? void 0 : _a.shuffleQuestions) ? [...this.config.questions].sort(() => Math.random() - 0.5) : this.config.questions;
1066
+ this.questions = this.config.settings?.shuffleQuestions ? [...this.config.questions].sort(() => Math.random() - 0.5) : this.config.questions;
1131
1067
  this.overallStartTime = Date.now();
1132
1068
  this.evaluators = /* @__PURE__ */ new Map();
1133
1069
  this.registerEvaluators();
1134
- if (((_b = this.config.settings) == null ? void 0 : _b.timeLimitMinutes) && this.config.settings.timeLimitMinutes > 0) {
1070
+ if (this.config.settings?.timeLimitMinutes && this.config.settings.timeLimitMinutes > 0) {
1135
1071
  this.timeLeftInSeconds = this.config.settings.timeLimitMinutes * 60;
1136
1072
  }
1137
- if ((_c = this.config.settings) == null ? void 0 : _c.scorm) {
1073
+ if (this.config.settings?.scorm) {
1138
1074
  this.quizResultState.scormStatus = "initializing";
1139
1075
  this.scormService = new SCORMService(this.config.settings.scorm);
1140
1076
  if (this.scormService.hasAPI()) {
@@ -1167,7 +1103,7 @@ var QuizEngine = class {
1167
1103
  if (this.timeLeftInSeconds !== null) {
1168
1104
  this.startTimer();
1169
1105
  }
1170
- (_e = (_d = this.callbacks).onQuestionChange) == null ? void 0 : _e.call(_d, initialQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1106
+ this.callbacks.onQuestionChange?.(initialQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1171
1107
  }
1172
1108
  registerEvaluators() {
1173
1109
  this.evaluators.set("multiple_choice", new MultipleChoiceEvaluator());
@@ -1205,15 +1141,14 @@ var QuizEngine = class {
1205
1141
  }
1206
1142
  }
1207
1143
  handleTick() {
1208
- var _a, _b, _c, _d;
1209
1144
  if (this.timeLeftInSeconds === null) return;
1210
1145
  if (this.timeLeftInSeconds > 0) {
1211
1146
  this.timeLeftInSeconds--;
1212
- (_b = (_a = this.callbacks).onTimeTick) == null ? void 0 : _b.call(_a, this.timeLeftInSeconds);
1147
+ this.callbacks.onTimeTick?.(this.timeLeftInSeconds);
1213
1148
  }
1214
1149
  if (this.timeLeftInSeconds <= 0) {
1215
1150
  this.stopTimer();
1216
- (_d = (_c = this.callbacks).onQuizTimeUp) == null ? void 0 : _d.call(_c);
1151
+ this.callbacks.onQuizTimeUp?.();
1217
1152
  this.calculateResults();
1218
1153
  }
1219
1154
  }
@@ -1236,43 +1171,39 @@ var QuizEngine = class {
1236
1171
  return this.quizResultState.score !== void 0;
1237
1172
  }
1238
1173
  submitAnswer(questionId, answer) {
1239
- var _a, _b;
1240
1174
  this.userAnswers.set(questionId, answer);
1241
1175
  const question = this.questions.find((q) => q.id === questionId);
1242
- if (question) (_b = (_a = this.callbacks).onAnswerSubmit) == null ? void 0 : _b.call(_a, question, answer);
1176
+ if (question) this.callbacks.onAnswerSubmit?.(question, answer);
1243
1177
  }
1244
1178
  nextQuestion() {
1245
- var _a, _b;
1246
1179
  this._recordCurrentQuestionTime();
1247
1180
  if (this.currentQuestionIndex < this.questions.length - 1) {
1248
1181
  this.currentQuestionIndex++;
1249
1182
  const currentQ = this.getCurrentQuestion();
1250
1183
  this.questionStartTime = Date.now();
1251
- (_b = (_a = this.callbacks).onQuestionChange) == null ? void 0 : _b.call(_a, currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1184
+ this.callbacks.onQuestionChange?.(currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1252
1185
  return currentQ;
1253
1186
  }
1254
1187
  return null;
1255
1188
  }
1256
1189
  previousQuestion() {
1257
- var _a, _b;
1258
1190
  this._recordCurrentQuestionTime();
1259
1191
  if (this.currentQuestionIndex > 0) {
1260
1192
  this.currentQuestionIndex--;
1261
1193
  const currentQ = this.getCurrentQuestion();
1262
1194
  this.questionStartTime = Date.now();
1263
- (_b = (_a = this.callbacks).onQuestionChange) == null ? void 0 : _b.call(_a, currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1195
+ this.callbacks.onQuestionChange?.(currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1264
1196
  return currentQ;
1265
1197
  }
1266
1198
  return null;
1267
1199
  }
1268
1200
  goToQuestion(index) {
1269
- var _a, _b;
1270
1201
  if (index >= 0 && index < this.questions.length && index !== this.currentQuestionIndex) {
1271
1202
  this._recordCurrentQuestionTime();
1272
1203
  this.currentQuestionIndex = index;
1273
1204
  const currentQ = this.getCurrentQuestion();
1274
1205
  this.questionStartTime = Date.now();
1275
- (_b = (_a = this.callbacks).onQuestionChange) == null ? void 0 : _b.call(_a, currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1206
+ this.callbacks.onQuestionChange?.(currentQ, this.getCurrentQuestionNumber(), this.getTotalQuestions());
1276
1207
  return currentQ;
1277
1208
  }
1278
1209
  return this.getCurrentQuestion();
@@ -1298,7 +1229,6 @@ var QuizEngine = class {
1298
1229
  }
1299
1230
  // (Tiếp theo từ Phần 1)
1300
1231
  async calculateResults() {
1301
- var _a, _b, _c, _d, _e;
1302
1232
  this.stopTimer();
1303
1233
  this._recordCurrentQuestionTime();
1304
1234
  let totalScore = 0;
@@ -1307,7 +1237,7 @@ var QuizEngine = class {
1307
1237
  let accumulatedTotalTimeSpent = 0;
1308
1238
  for (const question of this.questions) {
1309
1239
  const userAnswerRaw = this.userAnswers.get(question.id) || null;
1310
- maxScore += (_a = question.points) != null ? _a : 0;
1240
+ maxScore += question.points ?? 0;
1311
1241
  const evaluator = this.evaluators.get(question.questionType);
1312
1242
  if (!evaluator) {
1313
1243
  console.warn(`No evaluator found for question type: ${question.questionType}`);
@@ -1347,13 +1277,13 @@ var QuizEngine = class {
1347
1277
  }
1348
1278
  const percentage = maxScore > 0 ? parseFloat((totalScore / maxScore * 100).toFixed(2)) : 0;
1349
1279
  let passed = void 0;
1350
- if (((_b = this.config.settings) == null ? void 0 : _b.passingScorePercent) != null) {
1280
+ if (this.config.settings?.passingScorePercent != null) {
1351
1281
  passed = percentage >= this.config.settings.passingScorePercent;
1352
1282
  }
1353
1283
  const totalQuizTimeSpentSeconds = parseFloat(accumulatedTotalTimeSpent.toFixed(2));
1354
1284
  const averageTimePerQuestionSeconds = this.questions.length > 0 ? parseFloat((totalQuizTimeSpentSeconds / this.questions.length).toFixed(2)) : 0;
1355
1285
  const metadataPerformance = await this._calculateMetadataPerformance();
1356
- const finalResults = __spreadValues({
1286
+ const finalResults = {
1357
1287
  score: totalScore,
1358
1288
  maxScore,
1359
1289
  percentage,
@@ -1365,39 +1295,33 @@ var QuizEngine = class {
1365
1295
  scormError: this.quizResultState.scormError,
1366
1296
  studentName: this.quizResultState.studentName,
1367
1297
  totalTimeSpentSeconds: totalQuizTimeSpentSeconds,
1368
- averageTimePerQuestionSeconds
1369
- }, metadataPerformance);
1370
- this.quizResultState = __spreadValues(__spreadValues({}, this.quizResultState), finalResults);
1371
- if ((_c = this.config.settings) == null ? void 0 : _c.scorm) this._sendResultsToSCORM(finalResults);
1298
+ averageTimePerQuestionSeconds,
1299
+ ...metadataPerformance
1300
+ };
1301
+ this.quizResultState = { ...this.quizResultState, ...finalResults };
1302
+ if (this.config.settings?.scorm) this._sendResultsToSCORM(finalResults);
1372
1303
  await this._sendResultsToWebhook(finalResults);
1373
- (_e = (_d = this.callbacks).onQuizFinish) == null ? void 0 : _e.call(_d, finalResults);
1304
+ this.callbacks.onQuizFinish?.(finalResults);
1374
1305
  return finalResults;
1375
1306
  }
1376
1307
  formatUserAnswerDetail(question, userAnswerRaw) {
1377
- var _a, _b, _c, _d, _e;
1378
1308
  if (userAnswerRaw === null) return null;
1379
1309
  switch (question.questionType) {
1380
1310
  case "multiple_choice": {
1381
1311
  const q = question;
1382
1312
  const id = userAnswerRaw;
1383
- return { id, value: ((_a = q.options.find((opt) => opt.id === id)) == null ? void 0 : _a.text) || "" };
1313
+ return { id, value: q.options.find((opt) => opt.id === id)?.text || "" };
1384
1314
  }
1385
1315
  case "multiple_response": {
1386
1316
  const q = question;
1387
1317
  const ids = userAnswerRaw;
1388
- const values = ids.map((id) => {
1389
- var _a2;
1390
- return ((_a2 = q.options.find((opt) => opt.id === id)) == null ? void 0 : _a2.text) || "";
1391
- });
1318
+ const values = ids.map((id) => q.options.find((opt) => opt.id === id)?.text || "");
1392
1319
  return { id: ids, value: values };
1393
1320
  }
1394
1321
  case "sequence": {
1395
1322
  const q = question;
1396
1323
  const ids = userAnswerRaw;
1397
- const values = ids.map((id) => {
1398
- var _a2;
1399
- return ((_a2 = q.items.find((item) => item.id === id)) == null ? void 0 : _a2.content) || "";
1400
- });
1324
+ const values = ids.map((id) => q.items.find((item) => item.id === id)?.content || "");
1401
1325
  return { id: ids, value: values };
1402
1326
  }
1403
1327
  case "matching": {
@@ -1406,8 +1330,8 @@ var QuizEngine = class {
1406
1330
  const valueMap = {};
1407
1331
  for (const promptId in userAnswerMap) {
1408
1332
  const optionId = userAnswerMap[promptId];
1409
- const promptText = ((_b = q.prompts.find((p) => p.id === promptId)) == null ? void 0 : _b.content) || "";
1410
- const optionText = ((_c = q.options.find((o) => o.id === optionId)) == null ? void 0 : _c.content) || "";
1333
+ const promptText = q.prompts.find((p) => p.id === promptId)?.content || "";
1334
+ const optionText = q.options.find((o) => o.id === optionId)?.content || "";
1411
1335
  valueMap[promptText] = optionText;
1412
1336
  }
1413
1337
  return { id: null, value: valueMap };
@@ -1419,8 +1343,8 @@ var QuizEngine = class {
1419
1343
  const enrichedUserAnswerMap = {};
1420
1344
  for (const draggableId in userAnswerMapByIds) {
1421
1345
  const dropZoneId = userAnswerMapByIds[draggableId];
1422
- const draggableText = ((_d = q.draggableItems.find((d) => d.id === draggableId)) == null ? void 0 : _d.content) || `(ID: ${draggableId})`;
1423
- const dropZoneText = ((_e = q.dropZones.find((z4) => z4.id === dropZoneId)) == null ? void 0 : _e.label) || `(ID: ${dropZoneId})`;
1346
+ const draggableText = q.draggableItems.find((d) => d.id === draggableId)?.content || `(ID: ${draggableId})`;
1347
+ const dropZoneText = q.dropZones.find((z4) => z4.id === dropZoneId)?.label || `(ID: ${dropZoneId})`;
1424
1348
  enrichedUserAnswerMap[draggableText] = dropZoneText;
1425
1349
  }
1426
1350
  return { id: null, value: enrichedUserAnswerMap };
@@ -1432,7 +1356,6 @@ var QuizEngine = class {
1432
1356
  }
1433
1357
  }
1434
1358
  async _calculateMetadataPerformance() {
1435
- var _a;
1436
1359
  const loPerformanceMap = /* @__PURE__ */ new Map();
1437
1360
  const categoryPerformanceMap = /* @__PURE__ */ new Map();
1438
1361
  const topicPerformanceMap = /* @__PURE__ */ new Map();
@@ -1454,7 +1377,7 @@ var QuizEngine = class {
1454
1377
  const evaluator = this.evaluators.get(q.questionType);
1455
1378
  if (evaluator) {
1456
1379
  const { isCorrect } = await evaluator.evaluate(q, userAnswer);
1457
- const pointsForThisQuestion = (_a = q.points) != null ? _a : 0;
1380
+ const pointsForThisQuestion = q.points ?? 0;
1458
1381
  updateMap(loPerformanceMap, q.learningObjective, pointsForThisQuestion, isCorrect);
1459
1382
  updateMap(categoryPerformanceMap, q.category, pointsForThisQuestion, isCorrect);
1460
1383
  updateMap(topicPerformanceMap, q.topic, pointsForThisQuestion, isCorrect);
@@ -1481,8 +1404,7 @@ var QuizEngine = class {
1481
1404
  };
1482
1405
  }
1483
1406
  async _sendResultsToWebhook(results) {
1484
- var _a;
1485
- if (!((_a = this.config.settings) == null ? void 0 : _a.webhookUrl)) {
1407
+ if (!this.config.settings?.webhookUrl) {
1486
1408
  results.webhookStatus = "idle";
1487
1409
  return;
1488
1410
  }
@@ -1510,12 +1432,11 @@ var QuizEngine = class {
1510
1432
  }
1511
1433
  }
1512
1434
  _sendResultsToSCORM(results) {
1513
- var _a, _b, _c, _d, _e, _f, _g;
1514
1435
  if (!this.scormService || !this.scormService.hasAPI() || this.quizResultState.scormStatus === "no_api") {
1515
1436
  results.scormStatus = this.quizResultState.scormStatus || "idle";
1516
1437
  return;
1517
1438
  }
1518
- if (this.quizResultState.scormStatus === "error" && ((_a = this.quizResultState.scormError) == null ? void 0 : _a.includes("initialization failed"))) {
1439
+ if (this.quizResultState.scormStatus === "error" && this.quizResultState.scormError?.includes("initialization failed")) {
1519
1440
  results.scormStatus = "error";
1520
1441
  results.scormError = this.quizResultState.scormError;
1521
1442
  return;
@@ -1524,15 +1445,15 @@ var QuizEngine = class {
1524
1445
  try {
1525
1446
  this.scormService.setScore(results.score, results.maxScore, 0);
1526
1447
  let lessonStatusSetting = "completed";
1527
- if (((_b = this.config.settings) == null ? void 0 : _b.passingScorePercent) !== void 0 && ((_c = this.config.settings) == null ? void 0 : _c.passingScorePercent) !== null) {
1448
+ if (this.config.settings?.passingScorePercent !== void 0 && this.config.settings?.passingScorePercent !== null) {
1528
1449
  lessonStatusSetting = results.passed ? "passed" : "failed";
1529
- } else if ((_e = (_d = this.config.settings) == null ? void 0 : _d.scorm) == null ? void 0 : _e.setCompletionOnFinish) {
1450
+ } else if (this.config.settings?.scorm?.setCompletionOnFinish) {
1530
1451
  lessonStatusSetting = "completed";
1531
1452
  }
1532
1453
  this.scormService.setLessonStatus(lessonStatusSetting, results.passed);
1533
1454
  if (results.totalTimeSpentSeconds !== void 0 && this.scormService.formatCMITime) {
1534
1455
  const cmiTime = this.scormService.formatCMITime(results.totalTimeSpentSeconds);
1535
- const sessionTimeVar = ((_g = (_f = this.config.settings) == null ? void 0 : _f.scorm) == null ? void 0 : _g.sessionTimeVar) || (this.scormService.getSCORMVersion() === "2004" ? "cmi.session_time" : "cmi.core.session_time");
1456
+ const sessionTimeVar = this.config.settings?.scorm?.sessionTimeVar || (this.scormService.getSCORMVersion() === "2004" ? "cmi.session_time" : "cmi.core.session_time");
1536
1457
  if (sessionTimeVar) this.scormService.setValue(sessionTimeVar, cmiTime);
1537
1458
  }
1538
1459
  const commitResult = this.scormService.commit();
@@ -1572,18 +1493,19 @@ var QuizEditorService = class {
1572
1493
  };
1573
1494
  switch (type) {
1574
1495
  case "true_false":
1575
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "true_false", correctAnswer: true });
1496
+ return { ...baseNewQuestion, questionType: "true_false", correctAnswer: true };
1576
1497
  case "multiple_choice":
1577
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "multiple_choice", options: [], correctAnswerId: "" });
1498
+ return { ...baseNewQuestion, questionType: "multiple_choice", options: [], correctAnswerId: "" };
1578
1499
  case "multiple_response":
1579
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "multiple_response", options: [], correctAnswerIds: [] });
1500
+ return { ...baseNewQuestion, questionType: "multiple_response", options: [], correctAnswerIds: [] };
1580
1501
  case "short_answer":
1581
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "short_answer", acceptedAnswers: [""], isCaseSensitive: false });
1502
+ return { ...baseNewQuestion, questionType: "short_answer", acceptedAnswers: [""], isCaseSensitive: false };
1582
1503
  case "numeric":
1583
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "numeric", answer: 0 });
1504
+ return { ...baseNewQuestion, questionType: "numeric", answer: 0 };
1584
1505
  case "fill_in_the_blanks": {
1585
1506
  const blankId = generateUniqueId("blank_");
1586
- return __spreadProps(__spreadValues({}, baseNewQuestion), {
1507
+ return {
1508
+ ...baseNewQuestion,
1587
1509
  questionType: "fill_in_the_blanks",
1588
1510
  segments: [
1589
1511
  { type: "text", content: "Your text before " },
@@ -1592,49 +1514,52 @@ var QuizEditorService = class {
1592
1514
  ],
1593
1515
  answers: [{ blankId, acceptedValues: [""] }],
1594
1516
  isCaseSensitive: false
1595
- });
1517
+ };
1596
1518
  }
1597
1519
  case "sequence":
1598
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "sequence", items: [], correctOrder: [] });
1520
+ return { ...baseNewQuestion, questionType: "sequence", items: [], correctOrder: [] };
1599
1521
  case "matching":
1600
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "matching", prompts: [], options: [], correctAnswerMap: [], shuffleOptions: true });
1522
+ return { ...baseNewQuestion, questionType: "matching", prompts: [], options: [], correctAnswerMap: [], shuffleOptions: true };
1601
1523
  case "drag_and_drop":
1602
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "drag_and_drop", draggableItems: [], dropZones: [], answerMap: [] });
1524
+ return { ...baseNewQuestion, questionType: "drag_and_drop", draggableItems: [], dropZones: [], answerMap: [] };
1603
1525
  case "hotspot":
1604
- return __spreadProps(__spreadValues({}, baseNewQuestion), { questionType: "hotspot", imageUrl: "", hotspots: [], correctHotspotIds: [] });
1526
+ return { ...baseNewQuestion, questionType: "hotspot", imageUrl: "", hotspots: [], correctHotspotIds: [] };
1605
1527
  case "blockly_programming":
1606
- return __spreadProps(__spreadValues({}, baseNewQuestion), {
1528
+ return {
1529
+ ...baseNewQuestion,
1607
1530
  questionType: "blockly_programming",
1608
1531
  toolboxDefinition: '<xml xmlns="https://developers.google.com/blockly/xml"></xml>',
1609
1532
  initialWorkspace: "",
1610
1533
  solutionWorkspaceXML: "",
1611
1534
  solutionGeneratedCode: ""
1612
- });
1535
+ };
1613
1536
  case "scratch_programming":
1614
- return __spreadProps(__spreadValues({}, baseNewQuestion), {
1537
+ return {
1538
+ ...baseNewQuestion,
1615
1539
  questionType: "scratch_programming",
1616
1540
  toolboxDefinition: '<xml xmlns="https://developers.google.com/blockly/xml"></xml>',
1617
1541
  initialWorkspace: "",
1618
1542
  solutionWorkspaceXML: "",
1619
1543
  solutionGeneratedCode: ""
1620
- });
1544
+ };
1621
1545
  case "coding":
1622
- return __spreadProps(__spreadValues({}, baseNewQuestion), {
1546
+ return {
1547
+ ...baseNewQuestion,
1623
1548
  questionType: "coding",
1624
- language: "javascript",
1549
+ codingLanguage: "javascript",
1625
1550
  solutionCode: "",
1626
1551
  testCases: [],
1627
1552
  functionSignature: "",
1628
1553
  points: 25
1629
1554
  // Coding questions are worth more by default
1630
- });
1555
+ };
1631
1556
  default:
1632
1557
  const _exhaustiveCheck = type;
1633
1558
  throw new Error(`Question type "${_exhaustiveCheck}" is not supported for creation.`);
1634
1559
  }
1635
1560
  }
1636
1561
  addQuestion(question) {
1637
- const newQuestion = __spreadValues({}, question);
1562
+ const newQuestion = { ...question };
1638
1563
  if (newQuestion.id.startsWith("new_")) {
1639
1564
  newQuestion.id = generateUniqueId(`${newQuestion.questionType}_`);
1640
1565
  }
@@ -1748,8 +1673,7 @@ var QuestionImportService = class {
1748
1673
  const values = line.split(" ");
1749
1674
  const rowObject = {};
1750
1675
  header.forEach((h, i) => {
1751
- var _a;
1752
- rowObject[h] = ((_a = values[i]) == null ? void 0 : _a.trim()) || "";
1676
+ rowObject[h] = values[i]?.trim() || "";
1753
1677
  });
1754
1678
  try {
1755
1679
  const transformedObject = this.transformTsvRowToRawObject(rowObject);
@@ -1791,17 +1715,17 @@ var QuestionImportService = class {
1791
1715
  };
1792
1716
  switch (questionType) {
1793
1717
  case "multiple_choice":
1794
- return __spreadProps(__spreadValues({}, base), { options: options.split("|"), correctAnswer });
1718
+ return { ...base, options: options.split("|"), correctAnswer };
1795
1719
  case "multiple_response":
1796
- return __spreadProps(__spreadValues({}, base), { options: options.split("|"), correctAnswers: correctAnswer.split("|") });
1720
+ return { ...base, options: options.split("|"), correctAnswers: correctAnswer.split("|") };
1797
1721
  case "true_false":
1798
- return __spreadProps(__spreadValues({}, base), { correctAnswer: correctAnswer.toLowerCase() === "true" });
1722
+ return { ...base, correctAnswer: correctAnswer.toLowerCase() === "true" };
1799
1723
  case "short_answer":
1800
- return __spreadProps(__spreadValues({}, base), { acceptedAnswers: correctAnswer.split("|") });
1724
+ return { ...base, acceptedAnswers: correctAnswer.split("|") };
1801
1725
  case "numeric":
1802
- return __spreadProps(__spreadValues({}, base), { answer: parseFloat(correctAnswer), tolerance: tolerance ? parseFloat(tolerance) : void 0 });
1726
+ return { ...base, answer: parseFloat(correctAnswer), tolerance: tolerance ? parseFloat(tolerance) : void 0 };
1803
1727
  case "sequence":
1804
- return __spreadProps(__spreadValues({}, base), { items: options.split("|"), correctOrder: correctAnswer.split("|") });
1728
+ return { ...base, items: options.split("|"), correctOrder: correctAnswer.split("|") };
1805
1729
  case "matching": {
1806
1730
  const [promptsStr, optionsStr] = options.split("#");
1807
1731
  const prompts = promptsStr.replace("prompts:", "").split("|");
@@ -1811,7 +1735,7 @@ var QuestionImportService = class {
1811
1735
  acc[key] = valParts.join(":");
1812
1736
  return acc;
1813
1737
  }, {});
1814
- return __spreadProps(__spreadValues({}, base), { prompts, options: opts, correctAnswerMap });
1738
+ return { ...base, prompts, options: opts, correctAnswerMap };
1815
1739
  }
1816
1740
  case "fill_in_the_blanks": {
1817
1741
  const blanks = correctAnswer.split("#").reduce((acc, part) => {
@@ -1819,7 +1743,7 @@ var QuestionImportService = class {
1819
1743
  acc[key] = valuesStr.split("|");
1820
1744
  return acc;
1821
1745
  }, {});
1822
- return __spreadProps(__spreadValues({}, base), { sentenceWithPlaceholders: options, blanks });
1746
+ return { ...base, sentenceWithPlaceholders: options, blanks };
1823
1747
  }
1824
1748
  default:
1825
1749
  throw new Error(`Unsupported questionType "${questionType}" in TSV.`);
@@ -1840,20 +1764,20 @@ var QuestionImportService = class {
1840
1764
  const options = validatedRawQ.options.map((text) => ({ id: generateUniqueId("opt_"), text }));
1841
1765
  const correctOption = options.find((opt) => opt.text === validatedRawQ.correctAnswer);
1842
1766
  if (!correctOption) throw new Error(`Correct answer "${validatedRawQ.correctAnswer}" not found in options.`);
1843
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "multiple_choice", options, correctAnswerId: correctOption.id });
1767
+ return { ...baseQuestionData, questionType: "multiple_choice", options, correctAnswerId: correctOption.id };
1844
1768
  }
1845
1769
  case "multiple_response": {
1846
1770
  const options = validatedRawQ.options.map((text) => ({ id: generateUniqueId("opt_mr_"), text }));
1847
1771
  const correctIds = options.filter((opt) => validatedRawQ.correctAnswers.includes(opt.text)).map((opt) => opt.id);
1848
1772
  if (correctIds.length !== validatedRawQ.correctAnswers.length) throw new Error("Some correct answers were not found in options.");
1849
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "multiple_response", options, correctAnswerIds: correctIds });
1773
+ return { ...baseQuestionData, questionType: "multiple_response", options, correctAnswerIds: correctIds };
1850
1774
  }
1851
1775
  case "true_false":
1852
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "true_false", correctAnswer: validatedRawQ.correctAnswer });
1776
+ return { ...baseQuestionData, questionType: "true_false", correctAnswer: validatedRawQ.correctAnswer };
1853
1777
  case "short_answer":
1854
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "short_answer", acceptedAnswers: validatedRawQ.acceptedAnswers, isCaseSensitive: false });
1778
+ return { ...baseQuestionData, questionType: "short_answer", acceptedAnswers: validatedRawQ.acceptedAnswers, isCaseSensitive: false };
1855
1779
  case "numeric":
1856
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "numeric", answer: validatedRawQ.answer, tolerance: validatedRawQ.tolerance });
1780
+ return { ...baseQuestionData, questionType: "numeric", answer: validatedRawQ.answer, tolerance: validatedRawQ.tolerance };
1857
1781
  case "sequence": {
1858
1782
  if (validatedRawQ.items.length !== validatedRawQ.correctOrder.length) {
1859
1783
  throw new Error("The number of items must match the number of items in the correct order for a sequence question.");
@@ -1864,7 +1788,7 @@ var QuestionImportService = class {
1864
1788
  if (!foundItem) throw new Error(`Sequence item "${orderText}" in correctOrder not found in items list.`);
1865
1789
  return foundItem.id;
1866
1790
  });
1867
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "sequence", items, correctOrder });
1791
+ return { ...baseQuestionData, questionType: "sequence", items, correctOrder };
1868
1792
  }
1869
1793
  case "matching": {
1870
1794
  if (validatedRawQ.prompts.length !== Object.keys(validatedRawQ.correctAnswerMap).length) {
@@ -1878,7 +1802,7 @@ var QuestionImportService = class {
1878
1802
  if (!prompt || !option) throw new Error(`Matching pair "${promptText}":"${optionText}" not found in prompts/options.`);
1879
1803
  return { promptId: prompt.id, optionId: option.id };
1880
1804
  });
1881
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "matching", prompts, options, correctAnswerMap, shuffleOptions: true });
1805
+ return { ...baseQuestionData, questionType: "matching", prompts, options, correctAnswerMap, shuffleOptions: true };
1882
1806
  }
1883
1807
  case "fill_in_the_blanks": {
1884
1808
  const { sentenceWithPlaceholders, blanks } = validatedRawQ;
@@ -1906,7 +1830,7 @@ var QuestionImportService = class {
1906
1830
  if (lastIndex < sentenceWithPlaceholders.length) {
1907
1831
  segments.push({ type: "text", content: sentenceWithPlaceholders.substring(lastIndex) });
1908
1832
  }
1909
- return __spreadProps(__spreadValues({}, baseQuestionData), { questionType: "fill_in_the_blanks", segments, answers, isCaseSensitive: false });
1833
+ return { ...baseQuestionData, questionType: "fill_in_the_blanks", segments, answers, isCaseSensitive: false };
1910
1834
  }
1911
1835
  }
1912
1836
  throw new Error(`Unhandled question type in createQuestionFromRawObject: ${validatedRawQ.questionType}`);
@@ -1967,8 +1891,7 @@ var UserConfigService = class {
1967
1891
  this.setConfig("weeklyGoal", goal);
1968
1892
  }
1969
1893
  static getLanguage() {
1970
- var _a;
1971
- return (_a = this.getConfig("language", "en")) != null ? _a : "en";
1894
+ return this.getConfig("language", "en") ?? "en";
1972
1895
  }
1973
1896
  static setLanguage(language) {
1974
1897
  this.setConfig("language", language);
@@ -1986,10 +1909,11 @@ var UserConfigService = class {
1986
1909
  */
1987
1910
  static addGoal(newGoal) {
1988
1911
  const goals = this.getGoals();
1989
- const goalToAdd = __spreadProps(__spreadValues({}, newGoal), {
1912
+ const goalToAdd = {
1913
+ ...newGoal,
1990
1914
  id: generateUniqueId("goal_"),
1991
1915
  isAchieved: false
1992
- });
1916
+ };
1993
1917
  this.saveGoals([...goals, goalToAdd]);
1994
1918
  }
1995
1919
  static updateGoal(updatedGoal) {
@@ -2650,7 +2574,7 @@ var LocalStorageManager = class {
2650
2574
  if (items.some((i) => i.code === item.code)) {
2651
2575
  throw new Error(`An item with code "${item.code}" already exists for ${this.key}.`);
2652
2576
  }
2653
- const newItem = __spreadProps(__spreadValues({}, item), { id: generateUniqueId(`${this.key}_`) });
2577
+ const newItem = { ...item, id: generateUniqueId(`${this.key}_`) };
2654
2578
  this.saveAll([...items, newItem]);
2655
2579
  return newItem;
2656
2580
  }
@@ -2663,7 +2587,7 @@ var LocalStorageManager = class {
2663
2587
  console.warn(`Item with id "${id}" not found in ${this.key} for update.`);
2664
2588
  return null;
2665
2589
  }
2666
- const updatedItem = __spreadValues(__spreadValues({}, items[index]), updates);
2590
+ const updatedItem = { ...items[index], ...updates };
2667
2591
  items[index] = updatedItem;
2668
2592
  this.saveAll(items);
2669
2593
  return updatedItem;
@@ -2757,10 +2681,10 @@ _MetadataService.deleteContext = (code) => contextManager.delete(code);
2757
2681
  _MetadataService.getApproaches = () => approachManager.getAll().sort((a, b) => a.code.localeCompare(b.code));
2758
2682
  _MetadataService.addApproach = (approachData) => {
2759
2683
  const difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2760
- return approachManager.add(__spreadProps(__spreadValues({}, approachData), { difficulty }));
2684
+ return approachManager.add({ ...approachData, difficulty });
2761
2685
  };
2762
2686
  _MetadataService.updateApproach = (id, approachData) => {
2763
- const updates = __spreadValues({}, approachData);
2687
+ const updates = { ...approachData };
2764
2688
  if (approachData.rawDifficulty) {
2765
2689
  updates.difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2766
2690
  }
@@ -2843,10 +2767,11 @@ var QuestionBankService = class {
2843
2767
  if (allQuestions.some((q) => q.code === questionData.code)) {
2844
2768
  throw new Error(`A question with code "${questionData.code}" already exists.`);
2845
2769
  }
2846
- const newQuestion = __spreadProps(__spreadValues({}, questionData), {
2770
+ const newQuestion = {
2771
+ ...questionData,
2847
2772
  id: generateUniqueId("qb_"),
2848
2773
  lastModified: (/* @__PURE__ */ new Date()).toISOString()
2849
- });
2774
+ };
2850
2775
  questionBankManager.saveAll([...allQuestions, newQuestion]);
2851
2776
  return newQuestion;
2852
2777
  }
@@ -2858,9 +2783,11 @@ var QuestionBankService = class {
2858
2783
  console.warn(`Question with id "${id}" not found for update.`);
2859
2784
  return null;
2860
2785
  }
2861
- const updatedQuestion = __spreadProps(__spreadValues(__spreadValues({}, allQuestions[index]), updates), {
2786
+ const updatedQuestion = {
2787
+ ...allQuestions[index],
2788
+ ...updates,
2862
2789
  lastModified: (/* @__PURE__ */ new Date()).toISOString()
2863
- });
2790
+ };
2864
2791
  allQuestions[index] = updatedQuestion;
2865
2792
  questionBankManager.saveAll(allQuestions);
2866
2793
  return updatedQuestion;
@@ -3008,13 +2935,12 @@ var escapeXML = (unsafe) => {
3008
2935
  });
3009
2936
  };
3010
2937
  var generateSCORMManifest = (quizConfig, scormVersion, launcherFile = "index.html", libraryJSPath = "scorm-bundle/player.js", quizDataPath = "quiz_data.json", blocklyCSSPath = "blockly-styles.css", mainCSSPath = "styles.css") => {
3011
- var _a;
3012
2938
  const uniqueId = `iqk_${quizConfig.id.replace(/[^a-zA-Z0-9_]/g, "_")}`;
3013
2939
  const organizationId = `ORG-${uniqueId}`;
3014
2940
  const itemId = `ITEM-${uniqueId}`;
3015
2941
  const resourceId = `RES-${uniqueId}`;
3016
2942
  const quizTitle = escapeXML(quizConfig.title);
3017
- const passingScore = (_a = quizConfig.settings) == null ? void 0 : _a.passingScorePercent;
2943
+ const passingScore = quizConfig.settings?.passingScorePercent;
3018
2944
  const effectiveScormVersion = scormVersion;
3019
2945
  const schemaVersion = effectiveScormVersion === "2004" ? "2004 4th Edition" : "1.2";
3020
2946
  const adlcpNamespace = effectiveScormVersion === "2004" ? "http://www.adlnet.org/xsd/adlcp_v1p3" : "http://www.adlnet.org/xsd/adlcp_rootv1p2";
@@ -3493,6 +3419,2483 @@ var emptyQuiz = {
3493
3419
  timeLimitMinutes: 0
3494
3420
  }
3495
3421
  };
3422
+
3423
+ // node_modules/clsx/dist/clsx.mjs
3424
+ function r(e) {
3425
+ var t, f, n = "";
3426
+ if ("string" == typeof e || "number" == typeof e) n += e;
3427
+ else if ("object" == typeof e) if (Array.isArray(e)) {
3428
+ var o = e.length;
3429
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
3430
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
3431
+ return n;
3432
+ }
3433
+ function clsx() {
3434
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
3435
+ return n;
3436
+ }
3437
+
3438
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
3439
+ var CLASS_PART_SEPARATOR = "-";
3440
+ var createClassGroupUtils = (config) => {
3441
+ const classMap = createClassMap(config);
3442
+ const {
3443
+ conflictingClassGroups,
3444
+ conflictingClassGroupModifiers
3445
+ } = config;
3446
+ const getClassGroupId = (className) => {
3447
+ const classParts = className.split(CLASS_PART_SEPARATOR);
3448
+ if (classParts[0] === "" && classParts.length !== 1) {
3449
+ classParts.shift();
3450
+ }
3451
+ return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
3452
+ };
3453
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
3454
+ const conflicts = conflictingClassGroups[classGroupId] || [];
3455
+ if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
3456
+ return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
3457
+ }
3458
+ return conflicts;
3459
+ };
3460
+ return {
3461
+ getClassGroupId,
3462
+ getConflictingClassGroupIds
3463
+ };
3464
+ };
3465
+ var getGroupRecursive = (classParts, classPartObject) => {
3466
+ if (classParts.length === 0) {
3467
+ return classPartObject.classGroupId;
3468
+ }
3469
+ const currentClassPart = classParts[0];
3470
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
3471
+ const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0;
3472
+ if (classGroupFromNextClassPart) {
3473
+ return classGroupFromNextClassPart;
3474
+ }
3475
+ if (classPartObject.validators.length === 0) {
3476
+ return void 0;
3477
+ }
3478
+ const classRest = classParts.join(CLASS_PART_SEPARATOR);
3479
+ return classPartObject.validators.find(({
3480
+ validator
3481
+ }) => validator(classRest))?.classGroupId;
3482
+ };
3483
+ var arbitraryPropertyRegex = /^\[(.+)\]$/;
3484
+ var getGroupIdForArbitraryProperty = (className) => {
3485
+ if (arbitraryPropertyRegex.test(className)) {
3486
+ const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
3487
+ const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":"));
3488
+ if (property) {
3489
+ return "arbitrary.." + property;
3490
+ }
3491
+ }
3492
+ };
3493
+ var createClassMap = (config) => {
3494
+ const {
3495
+ theme,
3496
+ prefix
3497
+ } = config;
3498
+ const classMap = {
3499
+ nextPart: /* @__PURE__ */ new Map(),
3500
+ validators: []
3501
+ };
3502
+ const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
3503
+ prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {
3504
+ processClassesRecursively(classGroup, classMap, classGroupId, theme);
3505
+ });
3506
+ return classMap;
3507
+ };
3508
+ var processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
3509
+ classGroup.forEach((classDefinition) => {
3510
+ if (typeof classDefinition === "string") {
3511
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
3512
+ classPartObjectToEdit.classGroupId = classGroupId;
3513
+ return;
3514
+ }
3515
+ if (typeof classDefinition === "function") {
3516
+ if (isThemeGetter(classDefinition)) {
3517
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
3518
+ return;
3519
+ }
3520
+ classPartObject.validators.push({
3521
+ validator: classDefinition,
3522
+ classGroupId
3523
+ });
3524
+ return;
3525
+ }
3526
+ Object.entries(classDefinition).forEach(([key, classGroup2]) => {
3527
+ processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme);
3528
+ });
3529
+ });
3530
+ };
3531
+ var getPart = (classPartObject, path) => {
3532
+ let currentClassPartObject = classPartObject;
3533
+ path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {
3534
+ if (!currentClassPartObject.nextPart.has(pathPart)) {
3535
+ currentClassPartObject.nextPart.set(pathPart, {
3536
+ nextPart: /* @__PURE__ */ new Map(),
3537
+ validators: []
3538
+ });
3539
+ }
3540
+ currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
3541
+ });
3542
+ return currentClassPartObject;
3543
+ };
3544
+ var isThemeGetter = (func) => func.isThemeGetter;
3545
+ var getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {
3546
+ if (!prefix) {
3547
+ return classGroupEntries;
3548
+ }
3549
+ return classGroupEntries.map(([classGroupId, classGroup]) => {
3550
+ const prefixedClassGroup = classGroup.map((classDefinition) => {
3551
+ if (typeof classDefinition === "string") {
3552
+ return prefix + classDefinition;
3553
+ }
3554
+ if (typeof classDefinition === "object") {
3555
+ return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));
3556
+ }
3557
+ return classDefinition;
3558
+ });
3559
+ return [classGroupId, prefixedClassGroup];
3560
+ });
3561
+ };
3562
+ var createLruCache = (maxCacheSize) => {
3563
+ if (maxCacheSize < 1) {
3564
+ return {
3565
+ get: () => void 0,
3566
+ set: () => {
3567
+ }
3568
+ };
3569
+ }
3570
+ let cacheSize = 0;
3571
+ let cache = /* @__PURE__ */ new Map();
3572
+ let previousCache = /* @__PURE__ */ new Map();
3573
+ const update = (key, value) => {
3574
+ cache.set(key, value);
3575
+ cacheSize++;
3576
+ if (cacheSize > maxCacheSize) {
3577
+ cacheSize = 0;
3578
+ previousCache = cache;
3579
+ cache = /* @__PURE__ */ new Map();
3580
+ }
3581
+ };
3582
+ return {
3583
+ get(key) {
3584
+ let value = cache.get(key);
3585
+ if (value !== void 0) {
3586
+ return value;
3587
+ }
3588
+ if ((value = previousCache.get(key)) !== void 0) {
3589
+ update(key, value);
3590
+ return value;
3591
+ }
3592
+ },
3593
+ set(key, value) {
3594
+ if (cache.has(key)) {
3595
+ cache.set(key, value);
3596
+ } else {
3597
+ update(key, value);
3598
+ }
3599
+ }
3600
+ };
3601
+ };
3602
+ var IMPORTANT_MODIFIER = "!";
3603
+ var createParseClassName = (config) => {
3604
+ const {
3605
+ separator,
3606
+ experimentalParseClassName
3607
+ } = config;
3608
+ const isSeparatorSingleCharacter = separator.length === 1;
3609
+ const firstSeparatorCharacter = separator[0];
3610
+ const separatorLength = separator.length;
3611
+ const parseClassName = (className) => {
3612
+ const modifiers = [];
3613
+ let bracketDepth = 0;
3614
+ let modifierStart = 0;
3615
+ let postfixModifierPosition;
3616
+ for (let index = 0; index < className.length; index++) {
3617
+ let currentCharacter = className[index];
3618
+ if (bracketDepth === 0) {
3619
+ if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {
3620
+ modifiers.push(className.slice(modifierStart, index));
3621
+ modifierStart = index + separatorLength;
3622
+ continue;
3623
+ }
3624
+ if (currentCharacter === "/") {
3625
+ postfixModifierPosition = index;
3626
+ continue;
3627
+ }
3628
+ }
3629
+ if (currentCharacter === "[") {
3630
+ bracketDepth++;
3631
+ } else if (currentCharacter === "]") {
3632
+ bracketDepth--;
3633
+ }
3634
+ }
3635
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
3636
+ const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
3637
+ const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;
3638
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
3639
+ return {
3640
+ modifiers,
3641
+ hasImportantModifier,
3642
+ baseClassName,
3643
+ maybePostfixModifierPosition
3644
+ };
3645
+ };
3646
+ if (experimentalParseClassName) {
3647
+ return (className) => experimentalParseClassName({
3648
+ className,
3649
+ parseClassName
3650
+ });
3651
+ }
3652
+ return parseClassName;
3653
+ };
3654
+ var sortModifiers = (modifiers) => {
3655
+ if (modifiers.length <= 1) {
3656
+ return modifiers;
3657
+ }
3658
+ const sortedModifiers = [];
3659
+ let unsortedModifiers = [];
3660
+ modifiers.forEach((modifier) => {
3661
+ const isArbitraryVariant = modifier[0] === "[";
3662
+ if (isArbitraryVariant) {
3663
+ sortedModifiers.push(...unsortedModifiers.sort(), modifier);
3664
+ unsortedModifiers = [];
3665
+ } else {
3666
+ unsortedModifiers.push(modifier);
3667
+ }
3668
+ });
3669
+ sortedModifiers.push(...unsortedModifiers.sort());
3670
+ return sortedModifiers;
3671
+ };
3672
+ var createConfigUtils = (config) => ({
3673
+ cache: createLruCache(config.cacheSize),
3674
+ parseClassName: createParseClassName(config),
3675
+ ...createClassGroupUtils(config)
3676
+ });
3677
+ var SPLIT_CLASSES_REGEX = /\s+/;
3678
+ var mergeClassList = (classList, configUtils) => {
3679
+ const {
3680
+ parseClassName,
3681
+ getClassGroupId,
3682
+ getConflictingClassGroupIds
3683
+ } = configUtils;
3684
+ const classGroupsInConflict = [];
3685
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
3686
+ let result = "";
3687
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
3688
+ const originalClassName = classNames[index];
3689
+ const {
3690
+ modifiers,
3691
+ hasImportantModifier,
3692
+ baseClassName,
3693
+ maybePostfixModifierPosition
3694
+ } = parseClassName(originalClassName);
3695
+ let hasPostfixModifier = Boolean(maybePostfixModifierPosition);
3696
+ let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
3697
+ if (!classGroupId) {
3698
+ if (!hasPostfixModifier) {
3699
+ result = originalClassName + (result.length > 0 ? " " + result : result);
3700
+ continue;
3701
+ }
3702
+ classGroupId = getClassGroupId(baseClassName);
3703
+ if (!classGroupId) {
3704
+ result = originalClassName + (result.length > 0 ? " " + result : result);
3705
+ continue;
3706
+ }
3707
+ hasPostfixModifier = false;
3708
+ }
3709
+ const variantModifier = sortModifiers(modifiers).join(":");
3710
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
3711
+ const classId = modifierId + classGroupId;
3712
+ if (classGroupsInConflict.includes(classId)) {
3713
+ continue;
3714
+ }
3715
+ classGroupsInConflict.push(classId);
3716
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
3717
+ for (let i = 0; i < conflictGroups.length; ++i) {
3718
+ const group = conflictGroups[i];
3719
+ classGroupsInConflict.push(modifierId + group);
3720
+ }
3721
+ result = originalClassName + (result.length > 0 ? " " + result : result);
3722
+ }
3723
+ return result;
3724
+ };
3725
+ function twJoin() {
3726
+ let index = 0;
3727
+ let argument;
3728
+ let resolvedValue;
3729
+ let string = "";
3730
+ while (index < arguments.length) {
3731
+ if (argument = arguments[index++]) {
3732
+ if (resolvedValue = toValue(argument)) {
3733
+ string && (string += " ");
3734
+ string += resolvedValue;
3735
+ }
3736
+ }
3737
+ }
3738
+ return string;
3739
+ }
3740
+ var toValue = (mix) => {
3741
+ if (typeof mix === "string") {
3742
+ return mix;
3743
+ }
3744
+ let resolvedValue;
3745
+ let string = "";
3746
+ for (let k = 0; k < mix.length; k++) {
3747
+ if (mix[k]) {
3748
+ if (resolvedValue = toValue(mix[k])) {
3749
+ string && (string += " ");
3750
+ string += resolvedValue;
3751
+ }
3752
+ }
3753
+ }
3754
+ return string;
3755
+ };
3756
+ function createTailwindMerge(createConfigFirst, ...createConfigRest) {
3757
+ let configUtils;
3758
+ let cacheGet;
3759
+ let cacheSet;
3760
+ let functionToCall = initTailwindMerge;
3761
+ function initTailwindMerge(classList) {
3762
+ const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
3763
+ configUtils = createConfigUtils(config);
3764
+ cacheGet = configUtils.cache.get;
3765
+ cacheSet = configUtils.cache.set;
3766
+ functionToCall = tailwindMerge;
3767
+ return tailwindMerge(classList);
3768
+ }
3769
+ function tailwindMerge(classList) {
3770
+ const cachedResult = cacheGet(classList);
3771
+ if (cachedResult) {
3772
+ return cachedResult;
3773
+ }
3774
+ const result = mergeClassList(classList, configUtils);
3775
+ cacheSet(classList, result);
3776
+ return result;
3777
+ }
3778
+ return function callTailwindMerge() {
3779
+ return functionToCall(twJoin.apply(null, arguments));
3780
+ };
3781
+ }
3782
+ var fromTheme = (key) => {
3783
+ const themeGetter = (theme) => theme[key] || [];
3784
+ themeGetter.isThemeGetter = true;
3785
+ return themeGetter;
3786
+ };
3787
+ var arbitraryValueRegex = /^\[(?:([a-z-]+):)?(.+)\]$/i;
3788
+ var fractionRegex = /^\d+\/\d+$/;
3789
+ var stringLengths = /* @__PURE__ */ new Set(["px", "full", "screen"]);
3790
+ var tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
3791
+ var lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
3792
+ var colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/;
3793
+ var shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
3794
+ var imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
3795
+ var isLength = (value) => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);
3796
+ var isArbitraryLength = (value) => getIsArbitraryValue(value, "length", isLengthOnly);
3797
+ var isNumber = (value) => Boolean(value) && !Number.isNaN(Number(value));
3798
+ var isArbitraryNumber = (value) => getIsArbitraryValue(value, "number", isNumber);
3799
+ var isInteger = (value) => Boolean(value) && Number.isInteger(Number(value));
3800
+ var isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
3801
+ var isArbitraryValue = (value) => arbitraryValueRegex.test(value);
3802
+ var isTshirtSize = (value) => tshirtUnitRegex.test(value);
3803
+ var sizeLabels = /* @__PURE__ */ new Set(["length", "size", "percentage"]);
3804
+ var isArbitrarySize = (value) => getIsArbitraryValue(value, sizeLabels, isNever);
3805
+ var isArbitraryPosition = (value) => getIsArbitraryValue(value, "position", isNever);
3806
+ var imageLabels = /* @__PURE__ */ new Set(["image", "url"]);
3807
+ var isArbitraryImage = (value) => getIsArbitraryValue(value, imageLabels, isImage);
3808
+ var isArbitraryShadow = (value) => getIsArbitraryValue(value, "", isShadow);
3809
+ var isAny = () => true;
3810
+ var getIsArbitraryValue = (value, label, testValue) => {
3811
+ const result = arbitraryValueRegex.exec(value);
3812
+ if (result) {
3813
+ if (result[1]) {
3814
+ return typeof label === "string" ? result[1] === label : label.has(result[1]);
3815
+ }
3816
+ return testValue(result[2]);
3817
+ }
3818
+ return false;
3819
+ };
3820
+ var isLengthOnly = (value) => (
3821
+ // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
3822
+ // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
3823
+ // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
3824
+ lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
3825
+ );
3826
+ var isNever = () => false;
3827
+ var isShadow = (value) => shadowRegex.test(value);
3828
+ var isImage = (value) => imageRegex.test(value);
3829
+ var getDefaultConfig = () => {
3830
+ const colors = fromTheme("colors");
3831
+ const spacing = fromTheme("spacing");
3832
+ const blur = fromTheme("blur");
3833
+ const brightness = fromTheme("brightness");
3834
+ const borderColor = fromTheme("borderColor");
3835
+ const borderRadius = fromTheme("borderRadius");
3836
+ const borderSpacing = fromTheme("borderSpacing");
3837
+ const borderWidth = fromTheme("borderWidth");
3838
+ const contrast = fromTheme("contrast");
3839
+ const grayscale = fromTheme("grayscale");
3840
+ const hueRotate = fromTheme("hueRotate");
3841
+ const invert = fromTheme("invert");
3842
+ const gap = fromTheme("gap");
3843
+ const gradientColorStops = fromTheme("gradientColorStops");
3844
+ const gradientColorStopPositions = fromTheme("gradientColorStopPositions");
3845
+ const inset = fromTheme("inset");
3846
+ const margin = fromTheme("margin");
3847
+ const opacity = fromTheme("opacity");
3848
+ const padding = fromTheme("padding");
3849
+ const saturate = fromTheme("saturate");
3850
+ const scale = fromTheme("scale");
3851
+ const sepia = fromTheme("sepia");
3852
+ const skew = fromTheme("skew");
3853
+ const space = fromTheme("space");
3854
+ const translate = fromTheme("translate");
3855
+ const getOverscroll = () => ["auto", "contain", "none"];
3856
+ const getOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
3857
+ const getSpacingWithAutoAndArbitrary = () => ["auto", isArbitraryValue, spacing];
3858
+ const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];
3859
+ const getLengthWithEmptyAndArbitrary = () => ["", isLength, isArbitraryLength];
3860
+ const getNumberWithAutoAndArbitrary = () => ["auto", isNumber, isArbitraryValue];
3861
+ const getPositions = () => ["bottom", "center", "left", "left-bottom", "left-top", "right", "right-bottom", "right-top", "top"];
3862
+ const getLineStyles = () => ["solid", "dashed", "dotted", "double", "none"];
3863
+ const getBlendModes = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
3864
+ const getAlign = () => ["start", "end", "center", "between", "around", "evenly", "stretch"];
3865
+ const getZeroAndEmpty = () => ["", "0", isArbitraryValue];
3866
+ const getBreaks = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
3867
+ const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];
3868
+ return {
3869
+ cacheSize: 500,
3870
+ separator: ":",
3871
+ theme: {
3872
+ colors: [isAny],
3873
+ spacing: [isLength, isArbitraryLength],
3874
+ blur: ["none", "", isTshirtSize, isArbitraryValue],
3875
+ brightness: getNumberAndArbitrary(),
3876
+ borderColor: [colors],
3877
+ borderRadius: ["none", "", "full", isTshirtSize, isArbitraryValue],
3878
+ borderSpacing: getSpacingWithArbitrary(),
3879
+ borderWidth: getLengthWithEmptyAndArbitrary(),
3880
+ contrast: getNumberAndArbitrary(),
3881
+ grayscale: getZeroAndEmpty(),
3882
+ hueRotate: getNumberAndArbitrary(),
3883
+ invert: getZeroAndEmpty(),
3884
+ gap: getSpacingWithArbitrary(),
3885
+ gradientColorStops: [colors],
3886
+ gradientColorStopPositions: [isPercent, isArbitraryLength],
3887
+ inset: getSpacingWithAutoAndArbitrary(),
3888
+ margin: getSpacingWithAutoAndArbitrary(),
3889
+ opacity: getNumberAndArbitrary(),
3890
+ padding: getSpacingWithArbitrary(),
3891
+ saturate: getNumberAndArbitrary(),
3892
+ scale: getNumberAndArbitrary(),
3893
+ sepia: getZeroAndEmpty(),
3894
+ skew: getNumberAndArbitrary(),
3895
+ space: getSpacingWithArbitrary(),
3896
+ translate: getSpacingWithArbitrary()
3897
+ },
3898
+ classGroups: {
3899
+ // Layout
3900
+ /**
3901
+ * Aspect Ratio
3902
+ * @see https://tailwindcss.com/docs/aspect-ratio
3903
+ */
3904
+ aspect: [{
3905
+ aspect: ["auto", "square", "video", isArbitraryValue]
3906
+ }],
3907
+ /**
3908
+ * Container
3909
+ * @see https://tailwindcss.com/docs/container
3910
+ */
3911
+ container: ["container"],
3912
+ /**
3913
+ * Columns
3914
+ * @see https://tailwindcss.com/docs/columns
3915
+ */
3916
+ columns: [{
3917
+ columns: [isTshirtSize]
3918
+ }],
3919
+ /**
3920
+ * Break After
3921
+ * @see https://tailwindcss.com/docs/break-after
3922
+ */
3923
+ "break-after": [{
3924
+ "break-after": getBreaks()
3925
+ }],
3926
+ /**
3927
+ * Break Before
3928
+ * @see https://tailwindcss.com/docs/break-before
3929
+ */
3930
+ "break-before": [{
3931
+ "break-before": getBreaks()
3932
+ }],
3933
+ /**
3934
+ * Break Inside
3935
+ * @see https://tailwindcss.com/docs/break-inside
3936
+ */
3937
+ "break-inside": [{
3938
+ "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
3939
+ }],
3940
+ /**
3941
+ * Box Decoration Break
3942
+ * @see https://tailwindcss.com/docs/box-decoration-break
3943
+ */
3944
+ "box-decoration": [{
3945
+ "box-decoration": ["slice", "clone"]
3946
+ }],
3947
+ /**
3948
+ * Box Sizing
3949
+ * @see https://tailwindcss.com/docs/box-sizing
3950
+ */
3951
+ box: [{
3952
+ box: ["border", "content"]
3953
+ }],
3954
+ /**
3955
+ * Display
3956
+ * @see https://tailwindcss.com/docs/display
3957
+ */
3958
+ display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"],
3959
+ /**
3960
+ * Floats
3961
+ * @see https://tailwindcss.com/docs/float
3962
+ */
3963
+ float: [{
3964
+ float: ["right", "left", "none", "start", "end"]
3965
+ }],
3966
+ /**
3967
+ * Clear
3968
+ * @see https://tailwindcss.com/docs/clear
3969
+ */
3970
+ clear: [{
3971
+ clear: ["left", "right", "both", "none", "start", "end"]
3972
+ }],
3973
+ /**
3974
+ * Isolation
3975
+ * @see https://tailwindcss.com/docs/isolation
3976
+ */
3977
+ isolation: ["isolate", "isolation-auto"],
3978
+ /**
3979
+ * Object Fit
3980
+ * @see https://tailwindcss.com/docs/object-fit
3981
+ */
3982
+ "object-fit": [{
3983
+ object: ["contain", "cover", "fill", "none", "scale-down"]
3984
+ }],
3985
+ /**
3986
+ * Object Position
3987
+ * @see https://tailwindcss.com/docs/object-position
3988
+ */
3989
+ "object-position": [{
3990
+ object: [...getPositions(), isArbitraryValue]
3991
+ }],
3992
+ /**
3993
+ * Overflow
3994
+ * @see https://tailwindcss.com/docs/overflow
3995
+ */
3996
+ overflow: [{
3997
+ overflow: getOverflow()
3998
+ }],
3999
+ /**
4000
+ * Overflow X
4001
+ * @see https://tailwindcss.com/docs/overflow
4002
+ */
4003
+ "overflow-x": [{
4004
+ "overflow-x": getOverflow()
4005
+ }],
4006
+ /**
4007
+ * Overflow Y
4008
+ * @see https://tailwindcss.com/docs/overflow
4009
+ */
4010
+ "overflow-y": [{
4011
+ "overflow-y": getOverflow()
4012
+ }],
4013
+ /**
4014
+ * Overscroll Behavior
4015
+ * @see https://tailwindcss.com/docs/overscroll-behavior
4016
+ */
4017
+ overscroll: [{
4018
+ overscroll: getOverscroll()
4019
+ }],
4020
+ /**
4021
+ * Overscroll Behavior X
4022
+ * @see https://tailwindcss.com/docs/overscroll-behavior
4023
+ */
4024
+ "overscroll-x": [{
4025
+ "overscroll-x": getOverscroll()
4026
+ }],
4027
+ /**
4028
+ * Overscroll Behavior Y
4029
+ * @see https://tailwindcss.com/docs/overscroll-behavior
4030
+ */
4031
+ "overscroll-y": [{
4032
+ "overscroll-y": getOverscroll()
4033
+ }],
4034
+ /**
4035
+ * Position
4036
+ * @see https://tailwindcss.com/docs/position
4037
+ */
4038
+ position: ["static", "fixed", "absolute", "relative", "sticky"],
4039
+ /**
4040
+ * Top / Right / Bottom / Left
4041
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4042
+ */
4043
+ inset: [{
4044
+ inset: [inset]
4045
+ }],
4046
+ /**
4047
+ * Right / Left
4048
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4049
+ */
4050
+ "inset-x": [{
4051
+ "inset-x": [inset]
4052
+ }],
4053
+ /**
4054
+ * Top / Bottom
4055
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4056
+ */
4057
+ "inset-y": [{
4058
+ "inset-y": [inset]
4059
+ }],
4060
+ /**
4061
+ * Start
4062
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4063
+ */
4064
+ start: [{
4065
+ start: [inset]
4066
+ }],
4067
+ /**
4068
+ * End
4069
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4070
+ */
4071
+ end: [{
4072
+ end: [inset]
4073
+ }],
4074
+ /**
4075
+ * Top
4076
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4077
+ */
4078
+ top: [{
4079
+ top: [inset]
4080
+ }],
4081
+ /**
4082
+ * Right
4083
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4084
+ */
4085
+ right: [{
4086
+ right: [inset]
4087
+ }],
4088
+ /**
4089
+ * Bottom
4090
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4091
+ */
4092
+ bottom: [{
4093
+ bottom: [inset]
4094
+ }],
4095
+ /**
4096
+ * Left
4097
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
4098
+ */
4099
+ left: [{
4100
+ left: [inset]
4101
+ }],
4102
+ /**
4103
+ * Visibility
4104
+ * @see https://tailwindcss.com/docs/visibility
4105
+ */
4106
+ visibility: ["visible", "invisible", "collapse"],
4107
+ /**
4108
+ * Z-Index
4109
+ * @see https://tailwindcss.com/docs/z-index
4110
+ */
4111
+ z: [{
4112
+ z: ["auto", isInteger, isArbitraryValue]
4113
+ }],
4114
+ // Flexbox and Grid
4115
+ /**
4116
+ * Flex Basis
4117
+ * @see https://tailwindcss.com/docs/flex-basis
4118
+ */
4119
+ basis: [{
4120
+ basis: getSpacingWithAutoAndArbitrary()
4121
+ }],
4122
+ /**
4123
+ * Flex Direction
4124
+ * @see https://tailwindcss.com/docs/flex-direction
4125
+ */
4126
+ "flex-direction": [{
4127
+ flex: ["row", "row-reverse", "col", "col-reverse"]
4128
+ }],
4129
+ /**
4130
+ * Flex Wrap
4131
+ * @see https://tailwindcss.com/docs/flex-wrap
4132
+ */
4133
+ "flex-wrap": [{
4134
+ flex: ["wrap", "wrap-reverse", "nowrap"]
4135
+ }],
4136
+ /**
4137
+ * Flex
4138
+ * @see https://tailwindcss.com/docs/flex
4139
+ */
4140
+ flex: [{
4141
+ flex: ["1", "auto", "initial", "none", isArbitraryValue]
4142
+ }],
4143
+ /**
4144
+ * Flex Grow
4145
+ * @see https://tailwindcss.com/docs/flex-grow
4146
+ */
4147
+ grow: [{
4148
+ grow: getZeroAndEmpty()
4149
+ }],
4150
+ /**
4151
+ * Flex Shrink
4152
+ * @see https://tailwindcss.com/docs/flex-shrink
4153
+ */
4154
+ shrink: [{
4155
+ shrink: getZeroAndEmpty()
4156
+ }],
4157
+ /**
4158
+ * Order
4159
+ * @see https://tailwindcss.com/docs/order
4160
+ */
4161
+ order: [{
4162
+ order: ["first", "last", "none", isInteger, isArbitraryValue]
4163
+ }],
4164
+ /**
4165
+ * Grid Template Columns
4166
+ * @see https://tailwindcss.com/docs/grid-template-columns
4167
+ */
4168
+ "grid-cols": [{
4169
+ "grid-cols": [isAny]
4170
+ }],
4171
+ /**
4172
+ * Grid Column Start / End
4173
+ * @see https://tailwindcss.com/docs/grid-column
4174
+ */
4175
+ "col-start-end": [{
4176
+ col: ["auto", {
4177
+ span: ["full", isInteger, isArbitraryValue]
4178
+ }, isArbitraryValue]
4179
+ }],
4180
+ /**
4181
+ * Grid Column Start
4182
+ * @see https://tailwindcss.com/docs/grid-column
4183
+ */
4184
+ "col-start": [{
4185
+ "col-start": getNumberWithAutoAndArbitrary()
4186
+ }],
4187
+ /**
4188
+ * Grid Column End
4189
+ * @see https://tailwindcss.com/docs/grid-column
4190
+ */
4191
+ "col-end": [{
4192
+ "col-end": getNumberWithAutoAndArbitrary()
4193
+ }],
4194
+ /**
4195
+ * Grid Template Rows
4196
+ * @see https://tailwindcss.com/docs/grid-template-rows
4197
+ */
4198
+ "grid-rows": [{
4199
+ "grid-rows": [isAny]
4200
+ }],
4201
+ /**
4202
+ * Grid Row Start / End
4203
+ * @see https://tailwindcss.com/docs/grid-row
4204
+ */
4205
+ "row-start-end": [{
4206
+ row: ["auto", {
4207
+ span: [isInteger, isArbitraryValue]
4208
+ }, isArbitraryValue]
4209
+ }],
4210
+ /**
4211
+ * Grid Row Start
4212
+ * @see https://tailwindcss.com/docs/grid-row
4213
+ */
4214
+ "row-start": [{
4215
+ "row-start": getNumberWithAutoAndArbitrary()
4216
+ }],
4217
+ /**
4218
+ * Grid Row End
4219
+ * @see https://tailwindcss.com/docs/grid-row
4220
+ */
4221
+ "row-end": [{
4222
+ "row-end": getNumberWithAutoAndArbitrary()
4223
+ }],
4224
+ /**
4225
+ * Grid Auto Flow
4226
+ * @see https://tailwindcss.com/docs/grid-auto-flow
4227
+ */
4228
+ "grid-flow": [{
4229
+ "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
4230
+ }],
4231
+ /**
4232
+ * Grid Auto Columns
4233
+ * @see https://tailwindcss.com/docs/grid-auto-columns
4234
+ */
4235
+ "auto-cols": [{
4236
+ "auto-cols": ["auto", "min", "max", "fr", isArbitraryValue]
4237
+ }],
4238
+ /**
4239
+ * Grid Auto Rows
4240
+ * @see https://tailwindcss.com/docs/grid-auto-rows
4241
+ */
4242
+ "auto-rows": [{
4243
+ "auto-rows": ["auto", "min", "max", "fr", isArbitraryValue]
4244
+ }],
4245
+ /**
4246
+ * Gap
4247
+ * @see https://tailwindcss.com/docs/gap
4248
+ */
4249
+ gap: [{
4250
+ gap: [gap]
4251
+ }],
4252
+ /**
4253
+ * Gap X
4254
+ * @see https://tailwindcss.com/docs/gap
4255
+ */
4256
+ "gap-x": [{
4257
+ "gap-x": [gap]
4258
+ }],
4259
+ /**
4260
+ * Gap Y
4261
+ * @see https://tailwindcss.com/docs/gap
4262
+ */
4263
+ "gap-y": [{
4264
+ "gap-y": [gap]
4265
+ }],
4266
+ /**
4267
+ * Justify Content
4268
+ * @see https://tailwindcss.com/docs/justify-content
4269
+ */
4270
+ "justify-content": [{
4271
+ justify: ["normal", ...getAlign()]
4272
+ }],
4273
+ /**
4274
+ * Justify Items
4275
+ * @see https://tailwindcss.com/docs/justify-items
4276
+ */
4277
+ "justify-items": [{
4278
+ "justify-items": ["start", "end", "center", "stretch"]
4279
+ }],
4280
+ /**
4281
+ * Justify Self
4282
+ * @see https://tailwindcss.com/docs/justify-self
4283
+ */
4284
+ "justify-self": [{
4285
+ "justify-self": ["auto", "start", "end", "center", "stretch"]
4286
+ }],
4287
+ /**
4288
+ * Align Content
4289
+ * @see https://tailwindcss.com/docs/align-content
4290
+ */
4291
+ "align-content": [{
4292
+ content: ["normal", ...getAlign(), "baseline"]
4293
+ }],
4294
+ /**
4295
+ * Align Items
4296
+ * @see https://tailwindcss.com/docs/align-items
4297
+ */
4298
+ "align-items": [{
4299
+ items: ["start", "end", "center", "baseline", "stretch"]
4300
+ }],
4301
+ /**
4302
+ * Align Self
4303
+ * @see https://tailwindcss.com/docs/align-self
4304
+ */
4305
+ "align-self": [{
4306
+ self: ["auto", "start", "end", "center", "stretch", "baseline"]
4307
+ }],
4308
+ /**
4309
+ * Place Content
4310
+ * @see https://tailwindcss.com/docs/place-content
4311
+ */
4312
+ "place-content": [{
4313
+ "place-content": [...getAlign(), "baseline"]
4314
+ }],
4315
+ /**
4316
+ * Place Items
4317
+ * @see https://tailwindcss.com/docs/place-items
4318
+ */
4319
+ "place-items": [{
4320
+ "place-items": ["start", "end", "center", "baseline", "stretch"]
4321
+ }],
4322
+ /**
4323
+ * Place Self
4324
+ * @see https://tailwindcss.com/docs/place-self
4325
+ */
4326
+ "place-self": [{
4327
+ "place-self": ["auto", "start", "end", "center", "stretch"]
4328
+ }],
4329
+ // Spacing
4330
+ /**
4331
+ * Padding
4332
+ * @see https://tailwindcss.com/docs/padding
4333
+ */
4334
+ p: [{
4335
+ p: [padding]
4336
+ }],
4337
+ /**
4338
+ * Padding X
4339
+ * @see https://tailwindcss.com/docs/padding
4340
+ */
4341
+ px: [{
4342
+ px: [padding]
4343
+ }],
4344
+ /**
4345
+ * Padding Y
4346
+ * @see https://tailwindcss.com/docs/padding
4347
+ */
4348
+ py: [{
4349
+ py: [padding]
4350
+ }],
4351
+ /**
4352
+ * Padding Start
4353
+ * @see https://tailwindcss.com/docs/padding
4354
+ */
4355
+ ps: [{
4356
+ ps: [padding]
4357
+ }],
4358
+ /**
4359
+ * Padding End
4360
+ * @see https://tailwindcss.com/docs/padding
4361
+ */
4362
+ pe: [{
4363
+ pe: [padding]
4364
+ }],
4365
+ /**
4366
+ * Padding Top
4367
+ * @see https://tailwindcss.com/docs/padding
4368
+ */
4369
+ pt: [{
4370
+ pt: [padding]
4371
+ }],
4372
+ /**
4373
+ * Padding Right
4374
+ * @see https://tailwindcss.com/docs/padding
4375
+ */
4376
+ pr: [{
4377
+ pr: [padding]
4378
+ }],
4379
+ /**
4380
+ * Padding Bottom
4381
+ * @see https://tailwindcss.com/docs/padding
4382
+ */
4383
+ pb: [{
4384
+ pb: [padding]
4385
+ }],
4386
+ /**
4387
+ * Padding Left
4388
+ * @see https://tailwindcss.com/docs/padding
4389
+ */
4390
+ pl: [{
4391
+ pl: [padding]
4392
+ }],
4393
+ /**
4394
+ * Margin
4395
+ * @see https://tailwindcss.com/docs/margin
4396
+ */
4397
+ m: [{
4398
+ m: [margin]
4399
+ }],
4400
+ /**
4401
+ * Margin X
4402
+ * @see https://tailwindcss.com/docs/margin
4403
+ */
4404
+ mx: [{
4405
+ mx: [margin]
4406
+ }],
4407
+ /**
4408
+ * Margin Y
4409
+ * @see https://tailwindcss.com/docs/margin
4410
+ */
4411
+ my: [{
4412
+ my: [margin]
4413
+ }],
4414
+ /**
4415
+ * Margin Start
4416
+ * @see https://tailwindcss.com/docs/margin
4417
+ */
4418
+ ms: [{
4419
+ ms: [margin]
4420
+ }],
4421
+ /**
4422
+ * Margin End
4423
+ * @see https://tailwindcss.com/docs/margin
4424
+ */
4425
+ me: [{
4426
+ me: [margin]
4427
+ }],
4428
+ /**
4429
+ * Margin Top
4430
+ * @see https://tailwindcss.com/docs/margin
4431
+ */
4432
+ mt: [{
4433
+ mt: [margin]
4434
+ }],
4435
+ /**
4436
+ * Margin Right
4437
+ * @see https://tailwindcss.com/docs/margin
4438
+ */
4439
+ mr: [{
4440
+ mr: [margin]
4441
+ }],
4442
+ /**
4443
+ * Margin Bottom
4444
+ * @see https://tailwindcss.com/docs/margin
4445
+ */
4446
+ mb: [{
4447
+ mb: [margin]
4448
+ }],
4449
+ /**
4450
+ * Margin Left
4451
+ * @see https://tailwindcss.com/docs/margin
4452
+ */
4453
+ ml: [{
4454
+ ml: [margin]
4455
+ }],
4456
+ /**
4457
+ * Space Between X
4458
+ * @see https://tailwindcss.com/docs/space
4459
+ */
4460
+ "space-x": [{
4461
+ "space-x": [space]
4462
+ }],
4463
+ /**
4464
+ * Space Between X Reverse
4465
+ * @see https://tailwindcss.com/docs/space
4466
+ */
4467
+ "space-x-reverse": ["space-x-reverse"],
4468
+ /**
4469
+ * Space Between Y
4470
+ * @see https://tailwindcss.com/docs/space
4471
+ */
4472
+ "space-y": [{
4473
+ "space-y": [space]
4474
+ }],
4475
+ /**
4476
+ * Space Between Y Reverse
4477
+ * @see https://tailwindcss.com/docs/space
4478
+ */
4479
+ "space-y-reverse": ["space-y-reverse"],
4480
+ // Sizing
4481
+ /**
4482
+ * Width
4483
+ * @see https://tailwindcss.com/docs/width
4484
+ */
4485
+ w: [{
4486
+ w: ["auto", "min", "max", "fit", "svw", "lvw", "dvw", isArbitraryValue, spacing]
4487
+ }],
4488
+ /**
4489
+ * Min-Width
4490
+ * @see https://tailwindcss.com/docs/min-width
4491
+ */
4492
+ "min-w": [{
4493
+ "min-w": [isArbitraryValue, spacing, "min", "max", "fit"]
4494
+ }],
4495
+ /**
4496
+ * Max-Width
4497
+ * @see https://tailwindcss.com/docs/max-width
4498
+ */
4499
+ "max-w": [{
4500
+ "max-w": [isArbitraryValue, spacing, "none", "full", "min", "max", "fit", "prose", {
4501
+ screen: [isTshirtSize]
4502
+ }, isTshirtSize]
4503
+ }],
4504
+ /**
4505
+ * Height
4506
+ * @see https://tailwindcss.com/docs/height
4507
+ */
4508
+ h: [{
4509
+ h: [isArbitraryValue, spacing, "auto", "min", "max", "fit", "svh", "lvh", "dvh"]
4510
+ }],
4511
+ /**
4512
+ * Min-Height
4513
+ * @see https://tailwindcss.com/docs/min-height
4514
+ */
4515
+ "min-h": [{
4516
+ "min-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
4517
+ }],
4518
+ /**
4519
+ * Max-Height
4520
+ * @see https://tailwindcss.com/docs/max-height
4521
+ */
4522
+ "max-h": [{
4523
+ "max-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
4524
+ }],
4525
+ /**
4526
+ * Size
4527
+ * @see https://tailwindcss.com/docs/size
4528
+ */
4529
+ size: [{
4530
+ size: [isArbitraryValue, spacing, "auto", "min", "max", "fit"]
4531
+ }],
4532
+ // Typography
4533
+ /**
4534
+ * Font Size
4535
+ * @see https://tailwindcss.com/docs/font-size
4536
+ */
4537
+ "font-size": [{
4538
+ text: ["base", isTshirtSize, isArbitraryLength]
4539
+ }],
4540
+ /**
4541
+ * Font Smoothing
4542
+ * @see https://tailwindcss.com/docs/font-smoothing
4543
+ */
4544
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
4545
+ /**
4546
+ * Font Style
4547
+ * @see https://tailwindcss.com/docs/font-style
4548
+ */
4549
+ "font-style": ["italic", "not-italic"],
4550
+ /**
4551
+ * Font Weight
4552
+ * @see https://tailwindcss.com/docs/font-weight
4553
+ */
4554
+ "font-weight": [{
4555
+ font: ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black", isArbitraryNumber]
4556
+ }],
4557
+ /**
4558
+ * Font Family
4559
+ * @see https://tailwindcss.com/docs/font-family
4560
+ */
4561
+ "font-family": [{
4562
+ font: [isAny]
4563
+ }],
4564
+ /**
4565
+ * Font Variant Numeric
4566
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4567
+ */
4568
+ "fvn-normal": ["normal-nums"],
4569
+ /**
4570
+ * Font Variant Numeric
4571
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4572
+ */
4573
+ "fvn-ordinal": ["ordinal"],
4574
+ /**
4575
+ * Font Variant Numeric
4576
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4577
+ */
4578
+ "fvn-slashed-zero": ["slashed-zero"],
4579
+ /**
4580
+ * Font Variant Numeric
4581
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4582
+ */
4583
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
4584
+ /**
4585
+ * Font Variant Numeric
4586
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4587
+ */
4588
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
4589
+ /**
4590
+ * Font Variant Numeric
4591
+ * @see https://tailwindcss.com/docs/font-variant-numeric
4592
+ */
4593
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
4594
+ /**
4595
+ * Letter Spacing
4596
+ * @see https://tailwindcss.com/docs/letter-spacing
4597
+ */
4598
+ tracking: [{
4599
+ tracking: ["tighter", "tight", "normal", "wide", "wider", "widest", isArbitraryValue]
4600
+ }],
4601
+ /**
4602
+ * Line Clamp
4603
+ * @see https://tailwindcss.com/docs/line-clamp
4604
+ */
4605
+ "line-clamp": [{
4606
+ "line-clamp": ["none", isNumber, isArbitraryNumber]
4607
+ }],
4608
+ /**
4609
+ * Line Height
4610
+ * @see https://tailwindcss.com/docs/line-height
4611
+ */
4612
+ leading: [{
4613
+ leading: ["none", "tight", "snug", "normal", "relaxed", "loose", isLength, isArbitraryValue]
4614
+ }],
4615
+ /**
4616
+ * List Style Image
4617
+ * @see https://tailwindcss.com/docs/list-style-image
4618
+ */
4619
+ "list-image": [{
4620
+ "list-image": ["none", isArbitraryValue]
4621
+ }],
4622
+ /**
4623
+ * List Style Type
4624
+ * @see https://tailwindcss.com/docs/list-style-type
4625
+ */
4626
+ "list-style-type": [{
4627
+ list: ["none", "disc", "decimal", isArbitraryValue]
4628
+ }],
4629
+ /**
4630
+ * List Style Position
4631
+ * @see https://tailwindcss.com/docs/list-style-position
4632
+ */
4633
+ "list-style-position": [{
4634
+ list: ["inside", "outside"]
4635
+ }],
4636
+ /**
4637
+ * Placeholder Color
4638
+ * @deprecated since Tailwind CSS v3.0.0
4639
+ * @see https://tailwindcss.com/docs/placeholder-color
4640
+ */
4641
+ "placeholder-color": [{
4642
+ placeholder: [colors]
4643
+ }],
4644
+ /**
4645
+ * Placeholder Opacity
4646
+ * @see https://tailwindcss.com/docs/placeholder-opacity
4647
+ */
4648
+ "placeholder-opacity": [{
4649
+ "placeholder-opacity": [opacity]
4650
+ }],
4651
+ /**
4652
+ * Text Alignment
4653
+ * @see https://tailwindcss.com/docs/text-align
4654
+ */
4655
+ "text-alignment": [{
4656
+ text: ["left", "center", "right", "justify", "start", "end"]
4657
+ }],
4658
+ /**
4659
+ * Text Color
4660
+ * @see https://tailwindcss.com/docs/text-color
4661
+ */
4662
+ "text-color": [{
4663
+ text: [colors]
4664
+ }],
4665
+ /**
4666
+ * Text Opacity
4667
+ * @see https://tailwindcss.com/docs/text-opacity
4668
+ */
4669
+ "text-opacity": [{
4670
+ "text-opacity": [opacity]
4671
+ }],
4672
+ /**
4673
+ * Text Decoration
4674
+ * @see https://tailwindcss.com/docs/text-decoration
4675
+ */
4676
+ "text-decoration": ["underline", "overline", "line-through", "no-underline"],
4677
+ /**
4678
+ * Text Decoration Style
4679
+ * @see https://tailwindcss.com/docs/text-decoration-style
4680
+ */
4681
+ "text-decoration-style": [{
4682
+ decoration: [...getLineStyles(), "wavy"]
4683
+ }],
4684
+ /**
4685
+ * Text Decoration Thickness
4686
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
4687
+ */
4688
+ "text-decoration-thickness": [{
4689
+ decoration: ["auto", "from-font", isLength, isArbitraryLength]
4690
+ }],
4691
+ /**
4692
+ * Text Underline Offset
4693
+ * @see https://tailwindcss.com/docs/text-underline-offset
4694
+ */
4695
+ "underline-offset": [{
4696
+ "underline-offset": ["auto", isLength, isArbitraryValue]
4697
+ }],
4698
+ /**
4699
+ * Text Decoration Color
4700
+ * @see https://tailwindcss.com/docs/text-decoration-color
4701
+ */
4702
+ "text-decoration-color": [{
4703
+ decoration: [colors]
4704
+ }],
4705
+ /**
4706
+ * Text Transform
4707
+ * @see https://tailwindcss.com/docs/text-transform
4708
+ */
4709
+ "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
4710
+ /**
4711
+ * Text Overflow
4712
+ * @see https://tailwindcss.com/docs/text-overflow
4713
+ */
4714
+ "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
4715
+ /**
4716
+ * Text Wrap
4717
+ * @see https://tailwindcss.com/docs/text-wrap
4718
+ */
4719
+ "text-wrap": [{
4720
+ text: ["wrap", "nowrap", "balance", "pretty"]
4721
+ }],
4722
+ /**
4723
+ * Text Indent
4724
+ * @see https://tailwindcss.com/docs/text-indent
4725
+ */
4726
+ indent: [{
4727
+ indent: getSpacingWithArbitrary()
4728
+ }],
4729
+ /**
4730
+ * Vertical Alignment
4731
+ * @see https://tailwindcss.com/docs/vertical-align
4732
+ */
4733
+ "vertical-align": [{
4734
+ align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryValue]
4735
+ }],
4736
+ /**
4737
+ * Whitespace
4738
+ * @see https://tailwindcss.com/docs/whitespace
4739
+ */
4740
+ whitespace: [{
4741
+ whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
4742
+ }],
4743
+ /**
4744
+ * Word Break
4745
+ * @see https://tailwindcss.com/docs/word-break
4746
+ */
4747
+ break: [{
4748
+ break: ["normal", "words", "all", "keep"]
4749
+ }],
4750
+ /**
4751
+ * Hyphens
4752
+ * @see https://tailwindcss.com/docs/hyphens
4753
+ */
4754
+ hyphens: [{
4755
+ hyphens: ["none", "manual", "auto"]
4756
+ }],
4757
+ /**
4758
+ * Content
4759
+ * @see https://tailwindcss.com/docs/content
4760
+ */
4761
+ content: [{
4762
+ content: ["none", isArbitraryValue]
4763
+ }],
4764
+ // Backgrounds
4765
+ /**
4766
+ * Background Attachment
4767
+ * @see https://tailwindcss.com/docs/background-attachment
4768
+ */
4769
+ "bg-attachment": [{
4770
+ bg: ["fixed", "local", "scroll"]
4771
+ }],
4772
+ /**
4773
+ * Background Clip
4774
+ * @see https://tailwindcss.com/docs/background-clip
4775
+ */
4776
+ "bg-clip": [{
4777
+ "bg-clip": ["border", "padding", "content", "text"]
4778
+ }],
4779
+ /**
4780
+ * Background Opacity
4781
+ * @deprecated since Tailwind CSS v3.0.0
4782
+ * @see https://tailwindcss.com/docs/background-opacity
4783
+ */
4784
+ "bg-opacity": [{
4785
+ "bg-opacity": [opacity]
4786
+ }],
4787
+ /**
4788
+ * Background Origin
4789
+ * @see https://tailwindcss.com/docs/background-origin
4790
+ */
4791
+ "bg-origin": [{
4792
+ "bg-origin": ["border", "padding", "content"]
4793
+ }],
4794
+ /**
4795
+ * Background Position
4796
+ * @see https://tailwindcss.com/docs/background-position
4797
+ */
4798
+ "bg-position": [{
4799
+ bg: [...getPositions(), isArbitraryPosition]
4800
+ }],
4801
+ /**
4802
+ * Background Repeat
4803
+ * @see https://tailwindcss.com/docs/background-repeat
4804
+ */
4805
+ "bg-repeat": [{
4806
+ bg: ["no-repeat", {
4807
+ repeat: ["", "x", "y", "round", "space"]
4808
+ }]
4809
+ }],
4810
+ /**
4811
+ * Background Size
4812
+ * @see https://tailwindcss.com/docs/background-size
4813
+ */
4814
+ "bg-size": [{
4815
+ bg: ["auto", "cover", "contain", isArbitrarySize]
4816
+ }],
4817
+ /**
4818
+ * Background Image
4819
+ * @see https://tailwindcss.com/docs/background-image
4820
+ */
4821
+ "bg-image": [{
4822
+ bg: ["none", {
4823
+ "gradient-to": ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
4824
+ }, isArbitraryImage]
4825
+ }],
4826
+ /**
4827
+ * Background Color
4828
+ * @see https://tailwindcss.com/docs/background-color
4829
+ */
4830
+ "bg-color": [{
4831
+ bg: [colors]
4832
+ }],
4833
+ /**
4834
+ * Gradient Color Stops From Position
4835
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4836
+ */
4837
+ "gradient-from-pos": [{
4838
+ from: [gradientColorStopPositions]
4839
+ }],
4840
+ /**
4841
+ * Gradient Color Stops Via Position
4842
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4843
+ */
4844
+ "gradient-via-pos": [{
4845
+ via: [gradientColorStopPositions]
4846
+ }],
4847
+ /**
4848
+ * Gradient Color Stops To Position
4849
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4850
+ */
4851
+ "gradient-to-pos": [{
4852
+ to: [gradientColorStopPositions]
4853
+ }],
4854
+ /**
4855
+ * Gradient Color Stops From
4856
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4857
+ */
4858
+ "gradient-from": [{
4859
+ from: [gradientColorStops]
4860
+ }],
4861
+ /**
4862
+ * Gradient Color Stops Via
4863
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4864
+ */
4865
+ "gradient-via": [{
4866
+ via: [gradientColorStops]
4867
+ }],
4868
+ /**
4869
+ * Gradient Color Stops To
4870
+ * @see https://tailwindcss.com/docs/gradient-color-stops
4871
+ */
4872
+ "gradient-to": [{
4873
+ to: [gradientColorStops]
4874
+ }],
4875
+ // Borders
4876
+ /**
4877
+ * Border Radius
4878
+ * @see https://tailwindcss.com/docs/border-radius
4879
+ */
4880
+ rounded: [{
4881
+ rounded: [borderRadius]
4882
+ }],
4883
+ /**
4884
+ * Border Radius Start
4885
+ * @see https://tailwindcss.com/docs/border-radius
4886
+ */
4887
+ "rounded-s": [{
4888
+ "rounded-s": [borderRadius]
4889
+ }],
4890
+ /**
4891
+ * Border Radius End
4892
+ * @see https://tailwindcss.com/docs/border-radius
4893
+ */
4894
+ "rounded-e": [{
4895
+ "rounded-e": [borderRadius]
4896
+ }],
4897
+ /**
4898
+ * Border Radius Top
4899
+ * @see https://tailwindcss.com/docs/border-radius
4900
+ */
4901
+ "rounded-t": [{
4902
+ "rounded-t": [borderRadius]
4903
+ }],
4904
+ /**
4905
+ * Border Radius Right
4906
+ * @see https://tailwindcss.com/docs/border-radius
4907
+ */
4908
+ "rounded-r": [{
4909
+ "rounded-r": [borderRadius]
4910
+ }],
4911
+ /**
4912
+ * Border Radius Bottom
4913
+ * @see https://tailwindcss.com/docs/border-radius
4914
+ */
4915
+ "rounded-b": [{
4916
+ "rounded-b": [borderRadius]
4917
+ }],
4918
+ /**
4919
+ * Border Radius Left
4920
+ * @see https://tailwindcss.com/docs/border-radius
4921
+ */
4922
+ "rounded-l": [{
4923
+ "rounded-l": [borderRadius]
4924
+ }],
4925
+ /**
4926
+ * Border Radius Start Start
4927
+ * @see https://tailwindcss.com/docs/border-radius
4928
+ */
4929
+ "rounded-ss": [{
4930
+ "rounded-ss": [borderRadius]
4931
+ }],
4932
+ /**
4933
+ * Border Radius Start End
4934
+ * @see https://tailwindcss.com/docs/border-radius
4935
+ */
4936
+ "rounded-se": [{
4937
+ "rounded-se": [borderRadius]
4938
+ }],
4939
+ /**
4940
+ * Border Radius End End
4941
+ * @see https://tailwindcss.com/docs/border-radius
4942
+ */
4943
+ "rounded-ee": [{
4944
+ "rounded-ee": [borderRadius]
4945
+ }],
4946
+ /**
4947
+ * Border Radius End Start
4948
+ * @see https://tailwindcss.com/docs/border-radius
4949
+ */
4950
+ "rounded-es": [{
4951
+ "rounded-es": [borderRadius]
4952
+ }],
4953
+ /**
4954
+ * Border Radius Top Left
4955
+ * @see https://tailwindcss.com/docs/border-radius
4956
+ */
4957
+ "rounded-tl": [{
4958
+ "rounded-tl": [borderRadius]
4959
+ }],
4960
+ /**
4961
+ * Border Radius Top Right
4962
+ * @see https://tailwindcss.com/docs/border-radius
4963
+ */
4964
+ "rounded-tr": [{
4965
+ "rounded-tr": [borderRadius]
4966
+ }],
4967
+ /**
4968
+ * Border Radius Bottom Right
4969
+ * @see https://tailwindcss.com/docs/border-radius
4970
+ */
4971
+ "rounded-br": [{
4972
+ "rounded-br": [borderRadius]
4973
+ }],
4974
+ /**
4975
+ * Border Radius Bottom Left
4976
+ * @see https://tailwindcss.com/docs/border-radius
4977
+ */
4978
+ "rounded-bl": [{
4979
+ "rounded-bl": [borderRadius]
4980
+ }],
4981
+ /**
4982
+ * Border Width
4983
+ * @see https://tailwindcss.com/docs/border-width
4984
+ */
4985
+ "border-w": [{
4986
+ border: [borderWidth]
4987
+ }],
4988
+ /**
4989
+ * Border Width X
4990
+ * @see https://tailwindcss.com/docs/border-width
4991
+ */
4992
+ "border-w-x": [{
4993
+ "border-x": [borderWidth]
4994
+ }],
4995
+ /**
4996
+ * Border Width Y
4997
+ * @see https://tailwindcss.com/docs/border-width
4998
+ */
4999
+ "border-w-y": [{
5000
+ "border-y": [borderWidth]
5001
+ }],
5002
+ /**
5003
+ * Border Width Start
5004
+ * @see https://tailwindcss.com/docs/border-width
5005
+ */
5006
+ "border-w-s": [{
5007
+ "border-s": [borderWidth]
5008
+ }],
5009
+ /**
5010
+ * Border Width End
5011
+ * @see https://tailwindcss.com/docs/border-width
5012
+ */
5013
+ "border-w-e": [{
5014
+ "border-e": [borderWidth]
5015
+ }],
5016
+ /**
5017
+ * Border Width Top
5018
+ * @see https://tailwindcss.com/docs/border-width
5019
+ */
5020
+ "border-w-t": [{
5021
+ "border-t": [borderWidth]
5022
+ }],
5023
+ /**
5024
+ * Border Width Right
5025
+ * @see https://tailwindcss.com/docs/border-width
5026
+ */
5027
+ "border-w-r": [{
5028
+ "border-r": [borderWidth]
5029
+ }],
5030
+ /**
5031
+ * Border Width Bottom
5032
+ * @see https://tailwindcss.com/docs/border-width
5033
+ */
5034
+ "border-w-b": [{
5035
+ "border-b": [borderWidth]
5036
+ }],
5037
+ /**
5038
+ * Border Width Left
5039
+ * @see https://tailwindcss.com/docs/border-width
5040
+ */
5041
+ "border-w-l": [{
5042
+ "border-l": [borderWidth]
5043
+ }],
5044
+ /**
5045
+ * Border Opacity
5046
+ * @see https://tailwindcss.com/docs/border-opacity
5047
+ */
5048
+ "border-opacity": [{
5049
+ "border-opacity": [opacity]
5050
+ }],
5051
+ /**
5052
+ * Border Style
5053
+ * @see https://tailwindcss.com/docs/border-style
5054
+ */
5055
+ "border-style": [{
5056
+ border: [...getLineStyles(), "hidden"]
5057
+ }],
5058
+ /**
5059
+ * Divide Width X
5060
+ * @see https://tailwindcss.com/docs/divide-width
5061
+ */
5062
+ "divide-x": [{
5063
+ "divide-x": [borderWidth]
5064
+ }],
5065
+ /**
5066
+ * Divide Width X Reverse
5067
+ * @see https://tailwindcss.com/docs/divide-width
5068
+ */
5069
+ "divide-x-reverse": ["divide-x-reverse"],
5070
+ /**
5071
+ * Divide Width Y
5072
+ * @see https://tailwindcss.com/docs/divide-width
5073
+ */
5074
+ "divide-y": [{
5075
+ "divide-y": [borderWidth]
5076
+ }],
5077
+ /**
5078
+ * Divide Width Y Reverse
5079
+ * @see https://tailwindcss.com/docs/divide-width
5080
+ */
5081
+ "divide-y-reverse": ["divide-y-reverse"],
5082
+ /**
5083
+ * Divide Opacity
5084
+ * @see https://tailwindcss.com/docs/divide-opacity
5085
+ */
5086
+ "divide-opacity": [{
5087
+ "divide-opacity": [opacity]
5088
+ }],
5089
+ /**
5090
+ * Divide Style
5091
+ * @see https://tailwindcss.com/docs/divide-style
5092
+ */
5093
+ "divide-style": [{
5094
+ divide: getLineStyles()
5095
+ }],
5096
+ /**
5097
+ * Border Color
5098
+ * @see https://tailwindcss.com/docs/border-color
5099
+ */
5100
+ "border-color": [{
5101
+ border: [borderColor]
5102
+ }],
5103
+ /**
5104
+ * Border Color X
5105
+ * @see https://tailwindcss.com/docs/border-color
5106
+ */
5107
+ "border-color-x": [{
5108
+ "border-x": [borderColor]
5109
+ }],
5110
+ /**
5111
+ * Border Color Y
5112
+ * @see https://tailwindcss.com/docs/border-color
5113
+ */
5114
+ "border-color-y": [{
5115
+ "border-y": [borderColor]
5116
+ }],
5117
+ /**
5118
+ * Border Color S
5119
+ * @see https://tailwindcss.com/docs/border-color
5120
+ */
5121
+ "border-color-s": [{
5122
+ "border-s": [borderColor]
5123
+ }],
5124
+ /**
5125
+ * Border Color E
5126
+ * @see https://tailwindcss.com/docs/border-color
5127
+ */
5128
+ "border-color-e": [{
5129
+ "border-e": [borderColor]
5130
+ }],
5131
+ /**
5132
+ * Border Color Top
5133
+ * @see https://tailwindcss.com/docs/border-color
5134
+ */
5135
+ "border-color-t": [{
5136
+ "border-t": [borderColor]
5137
+ }],
5138
+ /**
5139
+ * Border Color Right
5140
+ * @see https://tailwindcss.com/docs/border-color
5141
+ */
5142
+ "border-color-r": [{
5143
+ "border-r": [borderColor]
5144
+ }],
5145
+ /**
5146
+ * Border Color Bottom
5147
+ * @see https://tailwindcss.com/docs/border-color
5148
+ */
5149
+ "border-color-b": [{
5150
+ "border-b": [borderColor]
5151
+ }],
5152
+ /**
5153
+ * Border Color Left
5154
+ * @see https://tailwindcss.com/docs/border-color
5155
+ */
5156
+ "border-color-l": [{
5157
+ "border-l": [borderColor]
5158
+ }],
5159
+ /**
5160
+ * Divide Color
5161
+ * @see https://tailwindcss.com/docs/divide-color
5162
+ */
5163
+ "divide-color": [{
5164
+ divide: [borderColor]
5165
+ }],
5166
+ /**
5167
+ * Outline Style
5168
+ * @see https://tailwindcss.com/docs/outline-style
5169
+ */
5170
+ "outline-style": [{
5171
+ outline: ["", ...getLineStyles()]
5172
+ }],
5173
+ /**
5174
+ * Outline Offset
5175
+ * @see https://tailwindcss.com/docs/outline-offset
5176
+ */
5177
+ "outline-offset": [{
5178
+ "outline-offset": [isLength, isArbitraryValue]
5179
+ }],
5180
+ /**
5181
+ * Outline Width
5182
+ * @see https://tailwindcss.com/docs/outline-width
5183
+ */
5184
+ "outline-w": [{
5185
+ outline: [isLength, isArbitraryLength]
5186
+ }],
5187
+ /**
5188
+ * Outline Color
5189
+ * @see https://tailwindcss.com/docs/outline-color
5190
+ */
5191
+ "outline-color": [{
5192
+ outline: [colors]
5193
+ }],
5194
+ /**
5195
+ * Ring Width
5196
+ * @see https://tailwindcss.com/docs/ring-width
5197
+ */
5198
+ "ring-w": [{
5199
+ ring: getLengthWithEmptyAndArbitrary()
5200
+ }],
5201
+ /**
5202
+ * Ring Width Inset
5203
+ * @see https://tailwindcss.com/docs/ring-width
5204
+ */
5205
+ "ring-w-inset": ["ring-inset"],
5206
+ /**
5207
+ * Ring Color
5208
+ * @see https://tailwindcss.com/docs/ring-color
5209
+ */
5210
+ "ring-color": [{
5211
+ ring: [colors]
5212
+ }],
5213
+ /**
5214
+ * Ring Opacity
5215
+ * @see https://tailwindcss.com/docs/ring-opacity
5216
+ */
5217
+ "ring-opacity": [{
5218
+ "ring-opacity": [opacity]
5219
+ }],
5220
+ /**
5221
+ * Ring Offset Width
5222
+ * @see https://tailwindcss.com/docs/ring-offset-width
5223
+ */
5224
+ "ring-offset-w": [{
5225
+ "ring-offset": [isLength, isArbitraryLength]
5226
+ }],
5227
+ /**
5228
+ * Ring Offset Color
5229
+ * @see https://tailwindcss.com/docs/ring-offset-color
5230
+ */
5231
+ "ring-offset-color": [{
5232
+ "ring-offset": [colors]
5233
+ }],
5234
+ // Effects
5235
+ /**
5236
+ * Box Shadow
5237
+ * @see https://tailwindcss.com/docs/box-shadow
5238
+ */
5239
+ shadow: [{
5240
+ shadow: ["", "inner", "none", isTshirtSize, isArbitraryShadow]
5241
+ }],
5242
+ /**
5243
+ * Box Shadow Color
5244
+ * @see https://tailwindcss.com/docs/box-shadow-color
5245
+ */
5246
+ "shadow-color": [{
5247
+ shadow: [isAny]
5248
+ }],
5249
+ /**
5250
+ * Opacity
5251
+ * @see https://tailwindcss.com/docs/opacity
5252
+ */
5253
+ opacity: [{
5254
+ opacity: [opacity]
5255
+ }],
5256
+ /**
5257
+ * Mix Blend Mode
5258
+ * @see https://tailwindcss.com/docs/mix-blend-mode
5259
+ */
5260
+ "mix-blend": [{
5261
+ "mix-blend": [...getBlendModes(), "plus-lighter", "plus-darker"]
5262
+ }],
5263
+ /**
5264
+ * Background Blend Mode
5265
+ * @see https://tailwindcss.com/docs/background-blend-mode
5266
+ */
5267
+ "bg-blend": [{
5268
+ "bg-blend": getBlendModes()
5269
+ }],
5270
+ // Filters
5271
+ /**
5272
+ * Filter
5273
+ * @deprecated since Tailwind CSS v3.0.0
5274
+ * @see https://tailwindcss.com/docs/filter
5275
+ */
5276
+ filter: [{
5277
+ filter: ["", "none"]
5278
+ }],
5279
+ /**
5280
+ * Blur
5281
+ * @see https://tailwindcss.com/docs/blur
5282
+ */
5283
+ blur: [{
5284
+ blur: [blur]
5285
+ }],
5286
+ /**
5287
+ * Brightness
5288
+ * @see https://tailwindcss.com/docs/brightness
5289
+ */
5290
+ brightness: [{
5291
+ brightness: [brightness]
5292
+ }],
5293
+ /**
5294
+ * Contrast
5295
+ * @see https://tailwindcss.com/docs/contrast
5296
+ */
5297
+ contrast: [{
5298
+ contrast: [contrast]
5299
+ }],
5300
+ /**
5301
+ * Drop Shadow
5302
+ * @see https://tailwindcss.com/docs/drop-shadow
5303
+ */
5304
+ "drop-shadow": [{
5305
+ "drop-shadow": ["", "none", isTshirtSize, isArbitraryValue]
5306
+ }],
5307
+ /**
5308
+ * Grayscale
5309
+ * @see https://tailwindcss.com/docs/grayscale
5310
+ */
5311
+ grayscale: [{
5312
+ grayscale: [grayscale]
5313
+ }],
5314
+ /**
5315
+ * Hue Rotate
5316
+ * @see https://tailwindcss.com/docs/hue-rotate
5317
+ */
5318
+ "hue-rotate": [{
5319
+ "hue-rotate": [hueRotate]
5320
+ }],
5321
+ /**
5322
+ * Invert
5323
+ * @see https://tailwindcss.com/docs/invert
5324
+ */
5325
+ invert: [{
5326
+ invert: [invert]
5327
+ }],
5328
+ /**
5329
+ * Saturate
5330
+ * @see https://tailwindcss.com/docs/saturate
5331
+ */
5332
+ saturate: [{
5333
+ saturate: [saturate]
5334
+ }],
5335
+ /**
5336
+ * Sepia
5337
+ * @see https://tailwindcss.com/docs/sepia
5338
+ */
5339
+ sepia: [{
5340
+ sepia: [sepia]
5341
+ }],
5342
+ /**
5343
+ * Backdrop Filter
5344
+ * @deprecated since Tailwind CSS v3.0.0
5345
+ * @see https://tailwindcss.com/docs/backdrop-filter
5346
+ */
5347
+ "backdrop-filter": [{
5348
+ "backdrop-filter": ["", "none"]
5349
+ }],
5350
+ /**
5351
+ * Backdrop Blur
5352
+ * @see https://tailwindcss.com/docs/backdrop-blur
5353
+ */
5354
+ "backdrop-blur": [{
5355
+ "backdrop-blur": [blur]
5356
+ }],
5357
+ /**
5358
+ * Backdrop Brightness
5359
+ * @see https://tailwindcss.com/docs/backdrop-brightness
5360
+ */
5361
+ "backdrop-brightness": [{
5362
+ "backdrop-brightness": [brightness]
5363
+ }],
5364
+ /**
5365
+ * Backdrop Contrast
5366
+ * @see https://tailwindcss.com/docs/backdrop-contrast
5367
+ */
5368
+ "backdrop-contrast": [{
5369
+ "backdrop-contrast": [contrast]
5370
+ }],
5371
+ /**
5372
+ * Backdrop Grayscale
5373
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
5374
+ */
5375
+ "backdrop-grayscale": [{
5376
+ "backdrop-grayscale": [grayscale]
5377
+ }],
5378
+ /**
5379
+ * Backdrop Hue Rotate
5380
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
5381
+ */
5382
+ "backdrop-hue-rotate": [{
5383
+ "backdrop-hue-rotate": [hueRotate]
5384
+ }],
5385
+ /**
5386
+ * Backdrop Invert
5387
+ * @see https://tailwindcss.com/docs/backdrop-invert
5388
+ */
5389
+ "backdrop-invert": [{
5390
+ "backdrop-invert": [invert]
5391
+ }],
5392
+ /**
5393
+ * Backdrop Opacity
5394
+ * @see https://tailwindcss.com/docs/backdrop-opacity
5395
+ */
5396
+ "backdrop-opacity": [{
5397
+ "backdrop-opacity": [opacity]
5398
+ }],
5399
+ /**
5400
+ * Backdrop Saturate
5401
+ * @see https://tailwindcss.com/docs/backdrop-saturate
5402
+ */
5403
+ "backdrop-saturate": [{
5404
+ "backdrop-saturate": [saturate]
5405
+ }],
5406
+ /**
5407
+ * Backdrop Sepia
5408
+ * @see https://tailwindcss.com/docs/backdrop-sepia
5409
+ */
5410
+ "backdrop-sepia": [{
5411
+ "backdrop-sepia": [sepia]
5412
+ }],
5413
+ // Tables
5414
+ /**
5415
+ * Border Collapse
5416
+ * @see https://tailwindcss.com/docs/border-collapse
5417
+ */
5418
+ "border-collapse": [{
5419
+ border: ["collapse", "separate"]
5420
+ }],
5421
+ /**
5422
+ * Border Spacing
5423
+ * @see https://tailwindcss.com/docs/border-spacing
5424
+ */
5425
+ "border-spacing": [{
5426
+ "border-spacing": [borderSpacing]
5427
+ }],
5428
+ /**
5429
+ * Border Spacing X
5430
+ * @see https://tailwindcss.com/docs/border-spacing
5431
+ */
5432
+ "border-spacing-x": [{
5433
+ "border-spacing-x": [borderSpacing]
5434
+ }],
5435
+ /**
5436
+ * Border Spacing Y
5437
+ * @see https://tailwindcss.com/docs/border-spacing
5438
+ */
5439
+ "border-spacing-y": [{
5440
+ "border-spacing-y": [borderSpacing]
5441
+ }],
5442
+ /**
5443
+ * Table Layout
5444
+ * @see https://tailwindcss.com/docs/table-layout
5445
+ */
5446
+ "table-layout": [{
5447
+ table: ["auto", "fixed"]
5448
+ }],
5449
+ /**
5450
+ * Caption Side
5451
+ * @see https://tailwindcss.com/docs/caption-side
5452
+ */
5453
+ caption: [{
5454
+ caption: ["top", "bottom"]
5455
+ }],
5456
+ // Transitions and Animation
5457
+ /**
5458
+ * Tranisition Property
5459
+ * @see https://tailwindcss.com/docs/transition-property
5460
+ */
5461
+ transition: [{
5462
+ transition: ["none", "all", "", "colors", "opacity", "shadow", "transform", isArbitraryValue]
5463
+ }],
5464
+ /**
5465
+ * Transition Duration
5466
+ * @see https://tailwindcss.com/docs/transition-duration
5467
+ */
5468
+ duration: [{
5469
+ duration: getNumberAndArbitrary()
5470
+ }],
5471
+ /**
5472
+ * Transition Timing Function
5473
+ * @see https://tailwindcss.com/docs/transition-timing-function
5474
+ */
5475
+ ease: [{
5476
+ ease: ["linear", "in", "out", "in-out", isArbitraryValue]
5477
+ }],
5478
+ /**
5479
+ * Transition Delay
5480
+ * @see https://tailwindcss.com/docs/transition-delay
5481
+ */
5482
+ delay: [{
5483
+ delay: getNumberAndArbitrary()
5484
+ }],
5485
+ /**
5486
+ * Animation
5487
+ * @see https://tailwindcss.com/docs/animation
5488
+ */
5489
+ animate: [{
5490
+ animate: ["none", "spin", "ping", "pulse", "bounce", isArbitraryValue]
5491
+ }],
5492
+ // Transforms
5493
+ /**
5494
+ * Transform
5495
+ * @see https://tailwindcss.com/docs/transform
5496
+ */
5497
+ transform: [{
5498
+ transform: ["", "gpu", "none"]
5499
+ }],
5500
+ /**
5501
+ * Scale
5502
+ * @see https://tailwindcss.com/docs/scale
5503
+ */
5504
+ scale: [{
5505
+ scale: [scale]
5506
+ }],
5507
+ /**
5508
+ * Scale X
5509
+ * @see https://tailwindcss.com/docs/scale
5510
+ */
5511
+ "scale-x": [{
5512
+ "scale-x": [scale]
5513
+ }],
5514
+ /**
5515
+ * Scale Y
5516
+ * @see https://tailwindcss.com/docs/scale
5517
+ */
5518
+ "scale-y": [{
5519
+ "scale-y": [scale]
5520
+ }],
5521
+ /**
5522
+ * Rotate
5523
+ * @see https://tailwindcss.com/docs/rotate
5524
+ */
5525
+ rotate: [{
5526
+ rotate: [isInteger, isArbitraryValue]
5527
+ }],
5528
+ /**
5529
+ * Translate X
5530
+ * @see https://tailwindcss.com/docs/translate
5531
+ */
5532
+ "translate-x": [{
5533
+ "translate-x": [translate]
5534
+ }],
5535
+ /**
5536
+ * Translate Y
5537
+ * @see https://tailwindcss.com/docs/translate
5538
+ */
5539
+ "translate-y": [{
5540
+ "translate-y": [translate]
5541
+ }],
5542
+ /**
5543
+ * Skew X
5544
+ * @see https://tailwindcss.com/docs/skew
5545
+ */
5546
+ "skew-x": [{
5547
+ "skew-x": [skew]
5548
+ }],
5549
+ /**
5550
+ * Skew Y
5551
+ * @see https://tailwindcss.com/docs/skew
5552
+ */
5553
+ "skew-y": [{
5554
+ "skew-y": [skew]
5555
+ }],
5556
+ /**
5557
+ * Transform Origin
5558
+ * @see https://tailwindcss.com/docs/transform-origin
5559
+ */
5560
+ "transform-origin": [{
5561
+ origin: ["center", "top", "top-right", "right", "bottom-right", "bottom", "bottom-left", "left", "top-left", isArbitraryValue]
5562
+ }],
5563
+ // Interactivity
5564
+ /**
5565
+ * Accent Color
5566
+ * @see https://tailwindcss.com/docs/accent-color
5567
+ */
5568
+ accent: [{
5569
+ accent: ["auto", colors]
5570
+ }],
5571
+ /**
5572
+ * Appearance
5573
+ * @see https://tailwindcss.com/docs/appearance
5574
+ */
5575
+ appearance: [{
5576
+ appearance: ["none", "auto"]
5577
+ }],
5578
+ /**
5579
+ * Cursor
5580
+ * @see https://tailwindcss.com/docs/cursor
5581
+ */
5582
+ cursor: [{
5583
+ cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryValue]
5584
+ }],
5585
+ /**
5586
+ * Caret Color
5587
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
5588
+ */
5589
+ "caret-color": [{
5590
+ caret: [colors]
5591
+ }],
5592
+ /**
5593
+ * Pointer Events
5594
+ * @see https://tailwindcss.com/docs/pointer-events
5595
+ */
5596
+ "pointer-events": [{
5597
+ "pointer-events": ["none", "auto"]
5598
+ }],
5599
+ /**
5600
+ * Resize
5601
+ * @see https://tailwindcss.com/docs/resize
5602
+ */
5603
+ resize: [{
5604
+ resize: ["none", "y", "x", ""]
5605
+ }],
5606
+ /**
5607
+ * Scroll Behavior
5608
+ * @see https://tailwindcss.com/docs/scroll-behavior
5609
+ */
5610
+ "scroll-behavior": [{
5611
+ scroll: ["auto", "smooth"]
5612
+ }],
5613
+ /**
5614
+ * Scroll Margin
5615
+ * @see https://tailwindcss.com/docs/scroll-margin
5616
+ */
5617
+ "scroll-m": [{
5618
+ "scroll-m": getSpacingWithArbitrary()
5619
+ }],
5620
+ /**
5621
+ * Scroll Margin X
5622
+ * @see https://tailwindcss.com/docs/scroll-margin
5623
+ */
5624
+ "scroll-mx": [{
5625
+ "scroll-mx": getSpacingWithArbitrary()
5626
+ }],
5627
+ /**
5628
+ * Scroll Margin Y
5629
+ * @see https://tailwindcss.com/docs/scroll-margin
5630
+ */
5631
+ "scroll-my": [{
5632
+ "scroll-my": getSpacingWithArbitrary()
5633
+ }],
5634
+ /**
5635
+ * Scroll Margin Start
5636
+ * @see https://tailwindcss.com/docs/scroll-margin
5637
+ */
5638
+ "scroll-ms": [{
5639
+ "scroll-ms": getSpacingWithArbitrary()
5640
+ }],
5641
+ /**
5642
+ * Scroll Margin End
5643
+ * @see https://tailwindcss.com/docs/scroll-margin
5644
+ */
5645
+ "scroll-me": [{
5646
+ "scroll-me": getSpacingWithArbitrary()
5647
+ }],
5648
+ /**
5649
+ * Scroll Margin Top
5650
+ * @see https://tailwindcss.com/docs/scroll-margin
5651
+ */
5652
+ "scroll-mt": [{
5653
+ "scroll-mt": getSpacingWithArbitrary()
5654
+ }],
5655
+ /**
5656
+ * Scroll Margin Right
5657
+ * @see https://tailwindcss.com/docs/scroll-margin
5658
+ */
5659
+ "scroll-mr": [{
5660
+ "scroll-mr": getSpacingWithArbitrary()
5661
+ }],
5662
+ /**
5663
+ * Scroll Margin Bottom
5664
+ * @see https://tailwindcss.com/docs/scroll-margin
5665
+ */
5666
+ "scroll-mb": [{
5667
+ "scroll-mb": getSpacingWithArbitrary()
5668
+ }],
5669
+ /**
5670
+ * Scroll Margin Left
5671
+ * @see https://tailwindcss.com/docs/scroll-margin
5672
+ */
5673
+ "scroll-ml": [{
5674
+ "scroll-ml": getSpacingWithArbitrary()
5675
+ }],
5676
+ /**
5677
+ * Scroll Padding
5678
+ * @see https://tailwindcss.com/docs/scroll-padding
5679
+ */
5680
+ "scroll-p": [{
5681
+ "scroll-p": getSpacingWithArbitrary()
5682
+ }],
5683
+ /**
5684
+ * Scroll Padding X
5685
+ * @see https://tailwindcss.com/docs/scroll-padding
5686
+ */
5687
+ "scroll-px": [{
5688
+ "scroll-px": getSpacingWithArbitrary()
5689
+ }],
5690
+ /**
5691
+ * Scroll Padding Y
5692
+ * @see https://tailwindcss.com/docs/scroll-padding
5693
+ */
5694
+ "scroll-py": [{
5695
+ "scroll-py": getSpacingWithArbitrary()
5696
+ }],
5697
+ /**
5698
+ * Scroll Padding Start
5699
+ * @see https://tailwindcss.com/docs/scroll-padding
5700
+ */
5701
+ "scroll-ps": [{
5702
+ "scroll-ps": getSpacingWithArbitrary()
5703
+ }],
5704
+ /**
5705
+ * Scroll Padding End
5706
+ * @see https://tailwindcss.com/docs/scroll-padding
5707
+ */
5708
+ "scroll-pe": [{
5709
+ "scroll-pe": getSpacingWithArbitrary()
5710
+ }],
5711
+ /**
5712
+ * Scroll Padding Top
5713
+ * @see https://tailwindcss.com/docs/scroll-padding
5714
+ */
5715
+ "scroll-pt": [{
5716
+ "scroll-pt": getSpacingWithArbitrary()
5717
+ }],
5718
+ /**
5719
+ * Scroll Padding Right
5720
+ * @see https://tailwindcss.com/docs/scroll-padding
5721
+ */
5722
+ "scroll-pr": [{
5723
+ "scroll-pr": getSpacingWithArbitrary()
5724
+ }],
5725
+ /**
5726
+ * Scroll Padding Bottom
5727
+ * @see https://tailwindcss.com/docs/scroll-padding
5728
+ */
5729
+ "scroll-pb": [{
5730
+ "scroll-pb": getSpacingWithArbitrary()
5731
+ }],
5732
+ /**
5733
+ * Scroll Padding Left
5734
+ * @see https://tailwindcss.com/docs/scroll-padding
5735
+ */
5736
+ "scroll-pl": [{
5737
+ "scroll-pl": getSpacingWithArbitrary()
5738
+ }],
5739
+ /**
5740
+ * Scroll Snap Align
5741
+ * @see https://tailwindcss.com/docs/scroll-snap-align
5742
+ */
5743
+ "snap-align": [{
5744
+ snap: ["start", "end", "center", "align-none"]
5745
+ }],
5746
+ /**
5747
+ * Scroll Snap Stop
5748
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
5749
+ */
5750
+ "snap-stop": [{
5751
+ snap: ["normal", "always"]
5752
+ }],
5753
+ /**
5754
+ * Scroll Snap Type
5755
+ * @see https://tailwindcss.com/docs/scroll-snap-type
5756
+ */
5757
+ "snap-type": [{
5758
+ snap: ["none", "x", "y", "both"]
5759
+ }],
5760
+ /**
5761
+ * Scroll Snap Type Strictness
5762
+ * @see https://tailwindcss.com/docs/scroll-snap-type
5763
+ */
5764
+ "snap-strictness": [{
5765
+ snap: ["mandatory", "proximity"]
5766
+ }],
5767
+ /**
5768
+ * Touch Action
5769
+ * @see https://tailwindcss.com/docs/touch-action
5770
+ */
5771
+ touch: [{
5772
+ touch: ["auto", "none", "manipulation"]
5773
+ }],
5774
+ /**
5775
+ * Touch Action X
5776
+ * @see https://tailwindcss.com/docs/touch-action
5777
+ */
5778
+ "touch-x": [{
5779
+ "touch-pan": ["x", "left", "right"]
5780
+ }],
5781
+ /**
5782
+ * Touch Action Y
5783
+ * @see https://tailwindcss.com/docs/touch-action
5784
+ */
5785
+ "touch-y": [{
5786
+ "touch-pan": ["y", "up", "down"]
5787
+ }],
5788
+ /**
5789
+ * Touch Action Pinch Zoom
5790
+ * @see https://tailwindcss.com/docs/touch-action
5791
+ */
5792
+ "touch-pz": ["touch-pinch-zoom"],
5793
+ /**
5794
+ * User Select
5795
+ * @see https://tailwindcss.com/docs/user-select
5796
+ */
5797
+ select: [{
5798
+ select: ["none", "text", "all", "auto"]
5799
+ }],
5800
+ /**
5801
+ * Will Change
5802
+ * @see https://tailwindcss.com/docs/will-change
5803
+ */
5804
+ "will-change": [{
5805
+ "will-change": ["auto", "scroll", "contents", "transform", isArbitraryValue]
5806
+ }],
5807
+ // SVG
5808
+ /**
5809
+ * Fill
5810
+ * @see https://tailwindcss.com/docs/fill
5811
+ */
5812
+ fill: [{
5813
+ fill: [colors, "none"]
5814
+ }],
5815
+ /**
5816
+ * Stroke Width
5817
+ * @see https://tailwindcss.com/docs/stroke-width
5818
+ */
5819
+ "stroke-w": [{
5820
+ stroke: [isLength, isArbitraryLength, isArbitraryNumber]
5821
+ }],
5822
+ /**
5823
+ * Stroke
5824
+ * @see https://tailwindcss.com/docs/stroke
5825
+ */
5826
+ stroke: [{
5827
+ stroke: [colors, "none"]
5828
+ }],
5829
+ // Accessibility
5830
+ /**
5831
+ * Screen Readers
5832
+ * @see https://tailwindcss.com/docs/screen-readers
5833
+ */
5834
+ sr: ["sr-only", "not-sr-only"],
5835
+ /**
5836
+ * Forced Color Adjust
5837
+ * @see https://tailwindcss.com/docs/forced-color-adjust
5838
+ */
5839
+ "forced-color-adjust": [{
5840
+ "forced-color-adjust": ["auto", "none"]
5841
+ }]
5842
+ },
5843
+ conflictingClassGroups: {
5844
+ overflow: ["overflow-x", "overflow-y"],
5845
+ overscroll: ["overscroll-x", "overscroll-y"],
5846
+ inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
5847
+ "inset-x": ["right", "left"],
5848
+ "inset-y": ["top", "bottom"],
5849
+ flex: ["basis", "grow", "shrink"],
5850
+ gap: ["gap-x", "gap-y"],
5851
+ p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
5852
+ px: ["pr", "pl"],
5853
+ py: ["pt", "pb"],
5854
+ m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
5855
+ mx: ["mr", "ml"],
5856
+ my: ["mt", "mb"],
5857
+ size: ["w", "h"],
5858
+ "font-size": ["leading"],
5859
+ "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
5860
+ "fvn-ordinal": ["fvn-normal"],
5861
+ "fvn-slashed-zero": ["fvn-normal"],
5862
+ "fvn-figure": ["fvn-normal"],
5863
+ "fvn-spacing": ["fvn-normal"],
5864
+ "fvn-fraction": ["fvn-normal"],
5865
+ "line-clamp": ["display", "overflow"],
5866
+ rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"],
5867
+ "rounded-s": ["rounded-ss", "rounded-es"],
5868
+ "rounded-e": ["rounded-se", "rounded-ee"],
5869
+ "rounded-t": ["rounded-tl", "rounded-tr"],
5870
+ "rounded-r": ["rounded-tr", "rounded-br"],
5871
+ "rounded-b": ["rounded-br", "rounded-bl"],
5872
+ "rounded-l": ["rounded-tl", "rounded-bl"],
5873
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
5874
+ "border-w": ["border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
5875
+ "border-w-x": ["border-w-r", "border-w-l"],
5876
+ "border-w-y": ["border-w-t", "border-w-b"],
5877
+ "border-color": ["border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
5878
+ "border-color-x": ["border-color-r", "border-color-l"],
5879
+ "border-color-y": ["border-color-t", "border-color-b"],
5880
+ "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
5881
+ "scroll-mx": ["scroll-mr", "scroll-ml"],
5882
+ "scroll-my": ["scroll-mt", "scroll-mb"],
5883
+ "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
5884
+ "scroll-px": ["scroll-pr", "scroll-pl"],
5885
+ "scroll-py": ["scroll-pt", "scroll-pb"],
5886
+ touch: ["touch-x", "touch-y", "touch-pz"],
5887
+ "touch-x": ["touch"],
5888
+ "touch-y": ["touch"],
5889
+ "touch-pz": ["touch"]
5890
+ },
5891
+ conflictingClassGroupModifiers: {
5892
+ "font-size": ["leading"]
5893
+ }
5894
+ };
5895
+ };
5896
+ var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
5897
+
5898
+ // src/utils/utils.ts
3496
5899
  function cn(...inputs) {
3497
5900
  return twMerge(clsx(inputs));
3498
5901
  }