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