@digo-labs/ws 0.1.8 → 0.1.10

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.
@@ -17319,10 +17319,17 @@ for (i = 0; i < chars.length; i++) {
17319
17319
  }
17320
17320
  var i;
17321
17321
 
17322
+ // ../common/src/constants.ts
17323
+ var TYPO_CLASS_GROUPS = {
17324
+ "font-size": [{ typo: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"] }],
17325
+ "font-weight": [{ "typo-weight": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] }],
17326
+ "typo-family": ["typo-header", "typo-label", "typo-body", "typo-code"]
17327
+ };
17328
+
17322
17329
  // ../common/src/index.css?raw
17323
17330
  var src_default = {};
17324
17331
 
17325
- // ../common/src/font-parser.ts
17332
+ // ../common/src/fonts.ts
17326
17333
  var FONT_VAR_REGEX = /--font-([\w-]+):\s*'([^']+)'/g;
17327
17334
  var familyToVariable = /* @__PURE__ */ new Map();
17328
17335
  var varMatch;
@@ -17331,15 +17338,21 @@ while ((varMatch = FONT_VAR_REGEX.exec(src_default)) !== null) {
17331
17338
  const familyName = varMatch[2];
17332
17339
  familyToVariable.set(familyName.toLowerCase(), variableName);
17333
17340
  }
17334
- var FONT_FACE_REGEX = /@font-face\s*\{[^}]*?font-family:\s*'([^']+)'[^}]*?font-weight:\s*([\d\s]+)[^}]*?font-style:\s*(\w+)[^}]*?src:\s*url\([^)]*?\/fonts\/([^)]+)\)\s*format\('(\w+)'\)[^}]*?\}/gs;
17341
+ var FONT_FACE_REGEX = /@font-face\s*\{([^}]*)\}/gs;
17335
17342
  var parsedFonts = [];
17336
17343
  var faceMatch;
17337
17344
  while ((faceMatch = FONT_FACE_REGEX.exec(src_default)) !== null) {
17338
- const family = faceMatch[1];
17339
- const weightRaw = faceMatch[2].trim();
17340
- const style = faceMatch[3];
17341
- const fileName = faceMatch[4];
17342
- const format = faceMatch[5] === "truetype" ? "ttf" : "otf";
17345
+ const block = faceMatch[1];
17346
+ const familyMatch = block.match(/font-family:\s*'([^']+)'/);
17347
+ const weightMatch = block.match(/font-weight:\s*([\d\s]+)/);
17348
+ const styleMatch = block.match(/font-style:\s*(\w+)/);
17349
+ const srcMatch = block.match(/src:\s*url\([^)]*?\/fonts\/([^)]+)\)\s*format\('(\w+)'\)/);
17350
+ if (!familyMatch || !weightMatch || !styleMatch || !srcMatch) continue;
17351
+ const family = familyMatch[1];
17352
+ const weightRaw = weightMatch[1].trim();
17353
+ const style = styleMatch[1];
17354
+ const fileName = srcMatch[1];
17355
+ const format = srcMatch[2] === "truetype" ? "ttf" : srcMatch[2] === "opentype" ? "otf" : "woff2";
17343
17356
  const weights = weightRaw.split(/\s+/).map(Number);
17344
17357
  const weightMin = Math.min(...weights);
17345
17358
  const weightMax = Math.max(...weights);
@@ -31873,52 +31886,85 @@ function date4(params) {
31873
31886
  // ../../node_modules/zod/v4/classic/external.js
31874
31887
  config(en_default());
31875
31888
 
31889
+ // ../common/src/schemas/primitives.ts
31890
+ var filePayloadSchema = external_exports.object({
31891
+ mediaType: external_exports.string(),
31892
+ base64: external_exports.string()
31893
+ });
31894
+ var imagePayloadSchema = external_exports.object({
31895
+ mediaType: external_exports.string(),
31896
+ base64: external_exports.string()
31897
+ });
31898
+ var sizeFormattedSchema = external_exports.string().regex(/^\d+x\d+$/).transform((s) => s);
31899
+ var aspectRatioSchema = external_exports.string().regex(/^\d+:\d+$/).transform((s) => s);
31900
+
31876
31901
  // ../common/src/schemas/ai.ts
31877
- var BEDROCK_MODELS = [
31878
- {
31879
- id: "us.anthropic.claude-haiku-4-5-20251001-v1:0",
31880
- provider: "Anthropic",
31881
- name: "Claude Haiku",
31882
- version: "4.5",
31883
- description: "Fastest and cheapest, good for short replies."
31884
- },
31885
- {
31886
- id: "us.anthropic.claude-sonnet-4-6",
31887
- provider: "Anthropic",
31888
- name: "Claude Sonnet",
31889
- version: "4.6",
31890
- description: "Balanced quality and speed for most tasks."
31891
- },
31892
- {
31893
- id: "us.anthropic.claude-opus-4-7",
31894
- provider: "Anthropic",
31895
- name: "Claude Opus",
31896
- version: "4.7",
31897
- description: "Highest quality, slower and more expensive."
31898
- },
31899
- {
31900
- id: "us.amazon.nova-micro-v1:0",
31901
- provider: "Amazon",
31902
- name: "Nova Micro",
31903
- version: "1",
31904
- description: "Text-only, extremely fast and cheap."
31905
- },
31906
- {
31907
- id: "us.amazon.nova-lite-v1:0",
31908
- provider: "Amazon",
31909
- name: "Nova Lite",
31910
- version: "1",
31911
- description: "Fast multimodal with image and video input."
31912
- },
31913
- {
31914
- id: "us.amazon.nova-pro-v1:0",
31915
- provider: "Amazon",
31916
- name: "Nova Pro",
31917
- version: "1",
31918
- description: "Higher-quality multimodal, slower than Lite."
31919
- }
31920
- ];
31921
- var DEFAULT_TEXT_MODEL = BEDROCK_MODELS[0].id;
31902
+ var imageGenerateBodySchema = external_exports.object({
31903
+ prompt: external_exports.string().min(1),
31904
+ aspectRatio: aspectRatioSchema.optional(),
31905
+ seed: external_exports.number().int().optional()
31906
+ });
31907
+ var imageEditBodySchema = external_exports.object({
31908
+ prompt: external_exports.string().min(1),
31909
+ image: external_exports.string().url(),
31910
+ strength: external_exports.number().min(0).max(1).optional()
31911
+ });
31912
+ var imageUpscaleBodySchema = external_exports.object({
31913
+ image: external_exports.string().url(),
31914
+ factor: external_exports.number().positive().optional()
31915
+ });
31916
+ var imageRemoveBackgroundBodySchema = external_exports.object({
31917
+ image: external_exports.string().url()
31918
+ });
31919
+ var generatedImageSchema = external_exports.object({
31920
+ url: external_exports.string().url(),
31921
+ contentType: external_exports.string().optional(),
31922
+ width: external_exports.number().optional(),
31923
+ height: external_exports.number().optional(),
31924
+ seed: external_exports.number().optional(),
31925
+ model: external_exports.string().optional()
31926
+ });
31927
+ var videoGenerateBodySchema = external_exports.object({
31928
+ prompt: external_exports.string().min(1),
31929
+ aspectRatio: aspectRatioSchema.optional(),
31930
+ durationSeconds: external_exports.number().positive().optional()
31931
+ });
31932
+ var generatedVideoSchema = external_exports.object({
31933
+ url: external_exports.string().url(),
31934
+ contentType: external_exports.string().optional(),
31935
+ durationSeconds: external_exports.number().optional(),
31936
+ model: external_exports.string().optional()
31937
+ });
31938
+ var audioSpeechBodySchema = external_exports.object({
31939
+ text: external_exports.string().min(1),
31940
+ voice: external_exports.string().optional(),
31941
+ speed: external_exports.number().positive().optional()
31942
+ });
31943
+ var audioMusicBodySchema = external_exports.object({
31944
+ prompt: external_exports.string().min(1),
31945
+ durationSeconds: external_exports.number().positive().optional()
31946
+ });
31947
+ var audioTranscribeBodySchema = external_exports.object({
31948
+ audio: external_exports.string().url(),
31949
+ language: external_exports.string().optional()
31950
+ });
31951
+ var generatedAudioSchema = external_exports.object({
31952
+ url: external_exports.string().url(),
31953
+ contentType: external_exports.string().optional(),
31954
+ durationSeconds: external_exports.number().optional(),
31955
+ model: external_exports.string().optional()
31956
+ });
31957
+ var transcriptionSegmentSchema = external_exports.object({
31958
+ text: external_exports.string(),
31959
+ startSecond: external_exports.number(),
31960
+ endSecond: external_exports.number()
31961
+ });
31962
+ var transcriptionSchema = external_exports.object({
31963
+ text: external_exports.string(),
31964
+ segments: external_exports.array(transcriptionSegmentSchema).optional(),
31965
+ language: external_exports.string().optional(),
31966
+ model: external_exports.string().optional()
31967
+ });
31922
31968
  var textContentPartSchema = external_exports.object({
31923
31969
  type: external_exports.literal("text"),
31924
31970
  text: external_exports.string()
@@ -31947,6 +31993,11 @@ var textBodySchema = external_exports.object({
31947
31993
  stopSequences: external_exports.array(external_exports.string()).optional(),
31948
31994
  providerOptions: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.any())).optional()
31949
31995
  });
31996
+ var textGenerateBodySchema = textBodySchema.omit({
31997
+ model: true,
31998
+ stopSequences: true,
31999
+ providerOptions: true
32000
+ });
31950
32001
 
31951
32002
  // ../common/src/schemas/dmx.ts
31952
32003
  var dmxSendBodySchema = external_exports.object({
@@ -31963,7 +32014,7 @@ var scalarValue = external_exports.union([external_exports.string(), external_ex
31963
32014
  var recordValue = external_exports.record(external_exports.string(), external_exports.unknown());
31964
32015
  var databaseGetAllBodySchema = external_exports.object({
31965
32016
  table: identifier,
31966
- limit: external_exports.number().int().positive().optional(),
32017
+ limit: external_exports.number().int().positive().max(1e3).default(100),
31967
32018
  offset: external_exports.number().int().nonnegative().optional()
31968
32019
  });
31969
32020
  var databaseGetAllResponseSchema = external_exports.object({
@@ -31980,7 +32031,9 @@ var databaseGetResponseSchema = external_exports.object({
31980
32031
  var databaseGetByBodySchema = external_exports.object({
31981
32032
  table: identifier,
31982
32033
  column: identifier,
31983
- value: scalarValue
32034
+ value: scalarValue,
32035
+ limit: external_exports.number().int().positive().max(1e3).default(100),
32036
+ offset: external_exports.number().int().nonnegative().optional()
31984
32037
  });
31985
32038
  var databaseGetByResponseSchema = external_exports.object({
31986
32039
  rows: external_exports.array(recordValue)
@@ -32010,18 +32063,6 @@ var databaseDeleteResponseSchema = external_exports.object({
32010
32063
  success: external_exports.boolean()
32011
32064
  });
32012
32065
 
32013
- // ../common/src/schemas/primitives.ts
32014
- var filePayloadSchema = external_exports.object({
32015
- mediaType: external_exports.string(),
32016
- base64: external_exports.string()
32017
- });
32018
- var imagePayloadSchema = external_exports.object({
32019
- mediaType: external_exports.string(),
32020
- base64: external_exports.string()
32021
- });
32022
- var sizeFormattedSchema = external_exports.string().regex(/^\d+x\d+$/).transform((s) => s);
32023
- var aspectRatioSchema = external_exports.string().regex(/^\d+:\d+$/).transform((s) => s);
32024
-
32025
32066
  // ../common/src/schemas/storage.ts
32026
32067
  var presignUploadBodySchema = external_exports.object({
32027
32068
  bucket: external_exports.string().min(1),
@@ -32064,150 +32105,2670 @@ var deleteResponseSchema = external_exports.object({
32064
32105
  // ../common/src/types/websocket-types.ts
32065
32106
  var WEBSOCKET_HUB_CHANNEL = "_hub";
32066
32107
 
32067
- // src/server.ts
32068
- var WebsocketHub = class {
32069
- httpServer;
32070
- wss;
32071
- clients = /* @__PURE__ */ new Set();
32072
- state = /* @__PURE__ */ new Map();
32073
- logs = [];
32074
- messageHandlers = [];
32075
- heartbeatInterval;
32076
- constructor(config2) {
32077
- this.httpServer = import_node_http.default.createServer((req, res) => {
32078
- if (req.method === "GET" && req.url === "/health") {
32079
- res.writeHead(200, { "Content-Type": "application/json" });
32080
- res.end(JSON.stringify({ ok: true, clients: this.clients.size }));
32081
- return;
32082
- }
32083
- res.writeHead(404);
32084
- res.end();
32085
- });
32086
- this.wss = new import_ws.WebSocketServer({ server: this.httpServer });
32087
- this.heartbeatInterval = setInterval(() => this.heartbeat(), 3e4);
32088
- this.wss.on("close", () => clearInterval(this.heartbeatInterval));
32089
- this.wss.on("connection", (socket) => this.handleConnection(socket));
32090
- this.httpServer.listen(config2.port);
32108
+ // ../../node_modules/tailwind-merge/dist/bundle-mjs.mjs
32109
+ var CLASS_PART_SEPARATOR = "-";
32110
+ var createClassGroupUtils = (config2) => {
32111
+ const classMap = createClassMap(config2);
32112
+ const {
32113
+ conflictingClassGroups,
32114
+ conflictingClassGroupModifiers
32115
+ } = config2;
32116
+ const getClassGroupId = (className) => {
32117
+ const classParts = className.split(CLASS_PART_SEPARATOR);
32118
+ if (classParts[0] === "" && classParts.length !== 1) {
32119
+ classParts.shift();
32120
+ }
32121
+ return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
32122
+ };
32123
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
32124
+ const conflicts = conflictingClassGroups[classGroupId] || [];
32125
+ if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
32126
+ return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
32127
+ }
32128
+ return conflicts;
32129
+ };
32130
+ return {
32131
+ getClassGroupId,
32132
+ getConflictingClassGroupIds
32133
+ };
32134
+ };
32135
+ var getGroupRecursive = (classParts, classPartObject) => {
32136
+ if (classParts.length === 0) {
32137
+ return classPartObject.classGroupId;
32091
32138
  }
32092
- heartbeat() {
32093
- let terminated = false;
32094
- this.clients.forEach((client) => {
32095
- if (!client.alive) {
32096
- client.ws.terminate();
32097
- this.clients.delete(client);
32098
- terminated = true;
32139
+ const currentClassPart = classParts[0];
32140
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
32141
+ const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0;
32142
+ if (classGroupFromNextClassPart) {
32143
+ return classGroupFromNextClassPart;
32144
+ }
32145
+ if (classPartObject.validators.length === 0) {
32146
+ return void 0;
32147
+ }
32148
+ const classRest = classParts.join(CLASS_PART_SEPARATOR);
32149
+ return classPartObject.validators.find(({
32150
+ validator
32151
+ }) => validator(classRest))?.classGroupId;
32152
+ };
32153
+ var arbitraryPropertyRegex = /^\[(.+)\]$/;
32154
+ var getGroupIdForArbitraryProperty = (className) => {
32155
+ if (arbitraryPropertyRegex.test(className)) {
32156
+ const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
32157
+ const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":"));
32158
+ if (property) {
32159
+ return "arbitrary.." + property;
32160
+ }
32161
+ }
32162
+ };
32163
+ var createClassMap = (config2) => {
32164
+ const {
32165
+ theme,
32166
+ prefix
32167
+ } = config2;
32168
+ const classMap = {
32169
+ nextPart: /* @__PURE__ */ new Map(),
32170
+ validators: []
32171
+ };
32172
+ const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config2.classGroups), prefix);
32173
+ prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {
32174
+ processClassesRecursively(classGroup, classMap, classGroupId, theme);
32175
+ });
32176
+ return classMap;
32177
+ };
32178
+ var processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
32179
+ classGroup.forEach((classDefinition) => {
32180
+ if (typeof classDefinition === "string") {
32181
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
32182
+ classPartObjectToEdit.classGroupId = classGroupId;
32183
+ return;
32184
+ }
32185
+ if (typeof classDefinition === "function") {
32186
+ if (isThemeGetter(classDefinition)) {
32187
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
32099
32188
  return;
32100
32189
  }
32101
- client.alive = false;
32102
- client.ws.ping();
32190
+ classPartObject.validators.push({
32191
+ validator: classDefinition,
32192
+ classGroupId
32193
+ });
32194
+ return;
32195
+ }
32196
+ Object.entries(classDefinition).forEach(([key, classGroup2]) => {
32197
+ processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme);
32103
32198
  });
32104
- if (terminated) this.broadcastStatus();
32199
+ });
32200
+ };
32201
+ var getPart = (classPartObject, path) => {
32202
+ let currentClassPartObject = classPartObject;
32203
+ path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {
32204
+ if (!currentClassPartObject.nextPart.has(pathPart)) {
32205
+ currentClassPartObject.nextPart.set(pathPart, {
32206
+ nextPart: /* @__PURE__ */ new Map(),
32207
+ validators: []
32208
+ });
32209
+ }
32210
+ currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
32211
+ });
32212
+ return currentClassPartObject;
32213
+ };
32214
+ var isThemeGetter = (func) => func.isThemeGetter;
32215
+ var getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {
32216
+ if (!prefix) {
32217
+ return classGroupEntries;
32105
32218
  }
32106
- handleConnection(socket) {
32107
- const client = {
32108
- id: "unknown",
32109
- app: "unknown",
32110
- ws: socket,
32111
- channels: /* @__PURE__ */ new Set(),
32112
- alive: true
32113
- };
32114
- this.clients.add(client);
32115
- socket.on("error", () => {
32116
- });
32117
- socket.on("pong", () => {
32118
- client.alive = true;
32119
- });
32120
- socket.on("message", (raw) => {
32121
- let message;
32122
- try {
32123
- message = JSON.parse(raw.toString());
32124
- } catch {
32125
- return;
32219
+ return classGroupEntries.map(([classGroupId, classGroup]) => {
32220
+ const prefixedClassGroup = classGroup.map((classDefinition) => {
32221
+ if (typeof classDefinition === "string") {
32222
+ return prefix + classDefinition;
32126
32223
  }
32127
- this.handleMessage(client, socket, message);
32128
- });
32129
- socket.on("close", () => {
32130
- this.clients.delete(client);
32131
- this.addLog(client.id, "DISCONNECT" /* DISCONNECT */, "");
32132
- this.broadcastStatus();
32224
+ if (typeof classDefinition === "object") {
32225
+ return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));
32226
+ }
32227
+ return classDefinition;
32133
32228
  });
32229
+ return [classGroupId, prefixedClassGroup];
32230
+ });
32231
+ };
32232
+ var createLruCache = (maxCacheSize) => {
32233
+ if (maxCacheSize < 1) {
32234
+ return {
32235
+ get: () => void 0,
32236
+ set: () => {
32237
+ }
32238
+ };
32134
32239
  }
32135
- handleMessage(client, socket, message) {
32136
- switch (message.type) {
32137
- case "IDENTIFY" /* IDENTIFY */: {
32138
- const existing = [...this.clients].find((c) => c.id === message.id && c !== client);
32139
- if (existing) {
32140
- existing.ws.close(4e3);
32141
- this.clients.delete(existing);
32240
+ let cacheSize = 0;
32241
+ let cache = /* @__PURE__ */ new Map();
32242
+ let previousCache = /* @__PURE__ */ new Map();
32243
+ const update = (key, value) => {
32244
+ cache.set(key, value);
32245
+ cacheSize++;
32246
+ if (cacheSize > maxCacheSize) {
32247
+ cacheSize = 0;
32248
+ previousCache = cache;
32249
+ cache = /* @__PURE__ */ new Map();
32250
+ }
32251
+ };
32252
+ return {
32253
+ get(key) {
32254
+ let value = cache.get(key);
32255
+ if (value !== void 0) {
32256
+ return value;
32257
+ }
32258
+ if ((value = previousCache.get(key)) !== void 0) {
32259
+ update(key, value);
32260
+ return value;
32261
+ }
32262
+ },
32263
+ set(key, value) {
32264
+ if (cache.has(key)) {
32265
+ cache.set(key, value);
32266
+ } else {
32267
+ update(key, value);
32268
+ }
32269
+ }
32270
+ };
32271
+ };
32272
+ var IMPORTANT_MODIFIER = "!";
32273
+ var createParseClassName = (config2) => {
32274
+ const {
32275
+ separator,
32276
+ experimentalParseClassName
32277
+ } = config2;
32278
+ const isSeparatorSingleCharacter = separator.length === 1;
32279
+ const firstSeparatorCharacter = separator[0];
32280
+ const separatorLength = separator.length;
32281
+ const parseClassName = (className) => {
32282
+ const modifiers = [];
32283
+ let bracketDepth = 0;
32284
+ let modifierStart = 0;
32285
+ let postfixModifierPosition;
32286
+ for (let index = 0; index < className.length; index++) {
32287
+ let currentCharacter = className[index];
32288
+ if (bracketDepth === 0) {
32289
+ if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {
32290
+ modifiers.push(className.slice(modifierStart, index));
32291
+ modifierStart = index + separatorLength;
32292
+ continue;
32293
+ }
32294
+ if (currentCharacter === "/") {
32295
+ postfixModifierPosition = index;
32296
+ continue;
32142
32297
  }
32143
- client.id = message.id;
32144
- client.app = message.app;
32145
- this.addLog(message.id, "CONNECT" /* CONNECT */, "");
32146
- this.broadcastStatus();
32147
- break;
32148
32298
  }
32149
- case "SUBSCRIBE" /* SUBSCRIBE */: {
32150
- message.channels.forEach((channel) => {
32151
- client.channels.add(channel);
32152
- if (this.state.has(channel)) {
32153
- const stateMessage = {
32154
- type: "STATE" /* STATE */,
32155
- channel,
32156
- data: this.state.get(channel)
32157
- };
32158
- socket.send(JSON.stringify(stateMessage));
32159
- }
32160
- });
32161
- this.addLog(client.id, "SUBSCRIBE" /* SUBSCRIBE */, message.channels.join(", "));
32162
- this.broadcastStatus();
32163
- break;
32299
+ if (currentCharacter === "[") {
32300
+ bracketDepth++;
32301
+ } else if (currentCharacter === "]") {
32302
+ bracketDepth--;
32164
32303
  }
32165
- case "UNSUBSCRIBE" /* UNSUBSCRIBE */: {
32166
- message.channels.forEach((channel) => client.channels.delete(channel));
32167
- this.addLog(client.id, "UNSUBSCRIBE" /* UNSUBSCRIBE */, message.channels.join(", "));
32168
- this.broadcastStatus();
32169
- break;
32304
+ }
32305
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
32306
+ const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
32307
+ const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;
32308
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
32309
+ return {
32310
+ modifiers,
32311
+ hasImportantModifier,
32312
+ baseClassName,
32313
+ maybePostfixModifierPosition
32314
+ };
32315
+ };
32316
+ if (experimentalParseClassName) {
32317
+ return (className) => experimentalParseClassName({
32318
+ className,
32319
+ parseClassName
32320
+ });
32321
+ }
32322
+ return parseClassName;
32323
+ };
32324
+ var sortModifiers = (modifiers) => {
32325
+ if (modifiers.length <= 1) {
32326
+ return modifiers;
32327
+ }
32328
+ const sortedModifiers = [];
32329
+ let unsortedModifiers = [];
32330
+ modifiers.forEach((modifier) => {
32331
+ const isArbitraryVariant = modifier[0] === "[";
32332
+ if (isArbitraryVariant) {
32333
+ sortedModifiers.push(...unsortedModifiers.sort(), modifier);
32334
+ unsortedModifiers = [];
32335
+ } else {
32336
+ unsortedModifiers.push(modifier);
32337
+ }
32338
+ });
32339
+ sortedModifiers.push(...unsortedModifiers.sort());
32340
+ return sortedModifiers;
32341
+ };
32342
+ var createConfigUtils = (config2) => ({
32343
+ cache: createLruCache(config2.cacheSize),
32344
+ parseClassName: createParseClassName(config2),
32345
+ ...createClassGroupUtils(config2)
32346
+ });
32347
+ var SPLIT_CLASSES_REGEX = /\s+/;
32348
+ var mergeClassList = (classList, configUtils) => {
32349
+ const {
32350
+ parseClassName,
32351
+ getClassGroupId,
32352
+ getConflictingClassGroupIds
32353
+ } = configUtils;
32354
+ const classGroupsInConflict = [];
32355
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
32356
+ let result = "";
32357
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
32358
+ const originalClassName = classNames[index];
32359
+ const {
32360
+ modifiers,
32361
+ hasImportantModifier,
32362
+ baseClassName,
32363
+ maybePostfixModifierPosition
32364
+ } = parseClassName(originalClassName);
32365
+ let hasPostfixModifier = Boolean(maybePostfixModifierPosition);
32366
+ let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
32367
+ if (!classGroupId) {
32368
+ if (!hasPostfixModifier) {
32369
+ result = originalClassName + (result.length > 0 ? " " + result : result);
32370
+ continue;
32170
32371
  }
32171
- case "MESSAGE" /* MESSAGE */: {
32172
- const outgoing = {
32173
- type: "MESSAGE" /* MESSAGE */,
32174
- channel: message.channel,
32175
- data: message.data
32176
- };
32177
- this.broadcast(client, message.channel, outgoing);
32178
- this.messageHandlers.forEach((h) => h(message.channel, message.data));
32179
- this.addLog(client.id, "MESSAGE" /* MESSAGE */, message.channel, message.data);
32180
- this.broadcastStatus();
32181
- break;
32372
+ classGroupId = getClassGroupId(baseClassName);
32373
+ if (!classGroupId) {
32374
+ result = originalClassName + (result.length > 0 ? " " + result : result);
32375
+ continue;
32182
32376
  }
32183
- case "STATE" /* STATE */: {
32184
- this.state.set(message.channel, message.data);
32185
- const outgoing = {
32186
- type: "STATE" /* STATE */,
32187
- channel: message.channel,
32188
- data: message.data
32189
- };
32190
- this.broadcast(client, message.channel, outgoing);
32191
- this.messageHandlers.forEach((h) => h(message.channel, message.data));
32192
- this.addLog(client.id, "STATE" /* STATE */, message.channel, message.data);
32193
- this.broadcastStatus();
32194
- break;
32377
+ hasPostfixModifier = false;
32378
+ }
32379
+ const variantModifier = sortModifiers(modifiers).join(":");
32380
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
32381
+ const classId = modifierId + classGroupId;
32382
+ if (classGroupsInConflict.includes(classId)) {
32383
+ continue;
32384
+ }
32385
+ classGroupsInConflict.push(classId);
32386
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
32387
+ for (let i = 0; i < conflictGroups.length; ++i) {
32388
+ const group = conflictGroups[i];
32389
+ classGroupsInConflict.push(modifierId + group);
32390
+ }
32391
+ result = originalClassName + (result.length > 0 ? " " + result : result);
32392
+ }
32393
+ return result;
32394
+ };
32395
+ function twJoin() {
32396
+ let index = 0;
32397
+ let argument;
32398
+ let resolvedValue;
32399
+ let string4 = "";
32400
+ while (index < arguments.length) {
32401
+ if (argument = arguments[index++]) {
32402
+ if (resolvedValue = toValue(argument)) {
32403
+ string4 && (string4 += " ");
32404
+ string4 += resolvedValue;
32195
32405
  }
32196
32406
  }
32197
32407
  }
32198
- addLog(sender, type, channel, data) {
32199
- this.logs.push({ timestamp: Date.now(), sender, type, channel, data });
32200
- if (this.logs.length > 808) this.logs.shift();
32408
+ return string4;
32409
+ }
32410
+ var toValue = (mix) => {
32411
+ if (typeof mix === "string") {
32412
+ return mix;
32201
32413
  }
32202
- broadcast(sender, channel, message) {
32203
- const payload = JSON.stringify(message);
32204
- this.clients.forEach((client) => {
32205
- if (client !== sender && client.channels.has(channel) && client.ws.readyState === import_ws.WebSocket.OPEN) {
32206
- client.ws.send(payload);
32414
+ let resolvedValue;
32415
+ let string4 = "";
32416
+ for (let k2 = 0; k2 < mix.length; k2++) {
32417
+ if (mix[k2]) {
32418
+ if (resolvedValue = toValue(mix[k2])) {
32419
+ string4 && (string4 += " ");
32420
+ string4 += resolvedValue;
32207
32421
  }
32208
- });
32422
+ }
32209
32423
  }
32210
- broadcastStatus() {
32424
+ return string4;
32425
+ };
32426
+ function createTailwindMerge(createConfigFirst, ...createConfigRest) {
32427
+ let configUtils;
32428
+ let cacheGet;
32429
+ let cacheSet;
32430
+ let functionToCall = initTailwindMerge;
32431
+ function initTailwindMerge(classList) {
32432
+ const config2 = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
32433
+ configUtils = createConfigUtils(config2);
32434
+ cacheGet = configUtils.cache.get;
32435
+ cacheSet = configUtils.cache.set;
32436
+ functionToCall = tailwindMerge;
32437
+ return tailwindMerge(classList);
32438
+ }
32439
+ function tailwindMerge(classList) {
32440
+ const cachedResult = cacheGet(classList);
32441
+ if (cachedResult) {
32442
+ return cachedResult;
32443
+ }
32444
+ const result = mergeClassList(classList, configUtils);
32445
+ cacheSet(classList, result);
32446
+ return result;
32447
+ }
32448
+ return function callTailwindMerge() {
32449
+ return functionToCall(twJoin.apply(null, arguments));
32450
+ };
32451
+ }
32452
+ var fromTheme = (key) => {
32453
+ const themeGetter = (theme) => theme[key] || [];
32454
+ themeGetter.isThemeGetter = true;
32455
+ return themeGetter;
32456
+ };
32457
+ var arbitraryValueRegex = /^\[(?:([a-z-]+):)?(.+)\]$/i;
32458
+ var fractionRegex = /^\d+\/\d+$/;
32459
+ var stringLengths = /* @__PURE__ */ new Set(["px", "full", "screen"]);
32460
+ var tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
32461
+ 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$/;
32462
+ var colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
32463
+ var shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
32464
+ var imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
32465
+ var isLength = (value) => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);
32466
+ var isArbitraryLength = (value) => getIsArbitraryValue(value, "length", isLengthOnly);
32467
+ var isNumber = (value) => Boolean(value) && !Number.isNaN(Number(value));
32468
+ var isArbitraryNumber = (value) => getIsArbitraryValue(value, "number", isNumber);
32469
+ var isInteger = (value) => Boolean(value) && Number.isInteger(Number(value));
32470
+ var isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
32471
+ var isArbitraryValue = (value) => arbitraryValueRegex.test(value);
32472
+ var isTshirtSize = (value) => tshirtUnitRegex.test(value);
32473
+ var sizeLabels = /* @__PURE__ */ new Set(["length", "size", "percentage"]);
32474
+ var isArbitrarySize = (value) => getIsArbitraryValue(value, sizeLabels, isNever);
32475
+ var isArbitraryPosition = (value) => getIsArbitraryValue(value, "position", isNever);
32476
+ var imageLabels = /* @__PURE__ */ new Set(["image", "url"]);
32477
+ var isArbitraryImage = (value) => getIsArbitraryValue(value, imageLabels, isImage);
32478
+ var isArbitraryShadow = (value) => getIsArbitraryValue(value, "", isShadow);
32479
+ var isAny = () => true;
32480
+ var getIsArbitraryValue = (value, label, testValue) => {
32481
+ const result = arbitraryValueRegex.exec(value);
32482
+ if (result) {
32483
+ if (result[1]) {
32484
+ return typeof label === "string" ? result[1] === label : label.has(result[1]);
32485
+ }
32486
+ return testValue(result[2]);
32487
+ }
32488
+ return false;
32489
+ };
32490
+ var isLengthOnly = (value) => (
32491
+ // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
32492
+ // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
32493
+ // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
32494
+ lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
32495
+ );
32496
+ var isNever = () => false;
32497
+ var isShadow = (value) => shadowRegex.test(value);
32498
+ var isImage = (value) => imageRegex.test(value);
32499
+ var getDefaultConfig = () => {
32500
+ const colors = fromTheme("colors");
32501
+ const spacing = fromTheme("spacing");
32502
+ const blur = fromTheme("blur");
32503
+ const brightness = fromTheme("brightness");
32504
+ const borderColor = fromTheme("borderColor");
32505
+ const borderRadius = fromTheme("borderRadius");
32506
+ const borderSpacing = fromTheme("borderSpacing");
32507
+ const borderWidth = fromTheme("borderWidth");
32508
+ const contrast = fromTheme("contrast");
32509
+ const grayscale = fromTheme("grayscale");
32510
+ const hueRotate = fromTheme("hueRotate");
32511
+ const invert = fromTheme("invert");
32512
+ const gap = fromTheme("gap");
32513
+ const gradientColorStops = fromTheme("gradientColorStops");
32514
+ const gradientColorStopPositions = fromTheme("gradientColorStopPositions");
32515
+ const inset = fromTheme("inset");
32516
+ const margin = fromTheme("margin");
32517
+ const opacity = fromTheme("opacity");
32518
+ const padding = fromTheme("padding");
32519
+ const saturate = fromTheme("saturate");
32520
+ const scale = fromTheme("scale");
32521
+ const sepia = fromTheme("sepia");
32522
+ const skew = fromTheme("skew");
32523
+ const space = fromTheme("space");
32524
+ const translate = fromTheme("translate");
32525
+ const getOverscroll = () => ["auto", "contain", "none"];
32526
+ const getOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
32527
+ const getSpacingWithAutoAndArbitrary = () => ["auto", isArbitraryValue, spacing];
32528
+ const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];
32529
+ const getLengthWithEmptyAndArbitrary = () => ["", isLength, isArbitraryLength];
32530
+ const getNumberWithAutoAndArbitrary = () => ["auto", isNumber, isArbitraryValue];
32531
+ const getPositions = () => ["bottom", "center", "left", "left-bottom", "left-top", "right", "right-bottom", "right-top", "top"];
32532
+ const getLineStyles = () => ["solid", "dashed", "dotted", "double", "none"];
32533
+ const getBlendModes = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
32534
+ const getAlign = () => ["start", "end", "center", "between", "around", "evenly", "stretch"];
32535
+ const getZeroAndEmpty = () => ["", "0", isArbitraryValue];
32536
+ const getBreaks = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
32537
+ const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];
32538
+ return {
32539
+ cacheSize: 500,
32540
+ separator: ":",
32541
+ theme: {
32542
+ colors: [isAny],
32543
+ spacing: [isLength, isArbitraryLength],
32544
+ blur: ["none", "", isTshirtSize, isArbitraryValue],
32545
+ brightness: getNumberAndArbitrary(),
32546
+ borderColor: [colors],
32547
+ borderRadius: ["none", "", "full", isTshirtSize, isArbitraryValue],
32548
+ borderSpacing: getSpacingWithArbitrary(),
32549
+ borderWidth: getLengthWithEmptyAndArbitrary(),
32550
+ contrast: getNumberAndArbitrary(),
32551
+ grayscale: getZeroAndEmpty(),
32552
+ hueRotate: getNumberAndArbitrary(),
32553
+ invert: getZeroAndEmpty(),
32554
+ gap: getSpacingWithArbitrary(),
32555
+ gradientColorStops: [colors],
32556
+ gradientColorStopPositions: [isPercent, isArbitraryLength],
32557
+ inset: getSpacingWithAutoAndArbitrary(),
32558
+ margin: getSpacingWithAutoAndArbitrary(),
32559
+ opacity: getNumberAndArbitrary(),
32560
+ padding: getSpacingWithArbitrary(),
32561
+ saturate: getNumberAndArbitrary(),
32562
+ scale: getNumberAndArbitrary(),
32563
+ sepia: getZeroAndEmpty(),
32564
+ skew: getNumberAndArbitrary(),
32565
+ space: getSpacingWithArbitrary(),
32566
+ translate: getSpacingWithArbitrary()
32567
+ },
32568
+ classGroups: {
32569
+ // Layout
32570
+ /**
32571
+ * Aspect Ratio
32572
+ * @see https://tailwindcss.com/docs/aspect-ratio
32573
+ */
32574
+ aspect: [{
32575
+ aspect: ["auto", "square", "video", isArbitraryValue]
32576
+ }],
32577
+ /**
32578
+ * Container
32579
+ * @see https://tailwindcss.com/docs/container
32580
+ */
32581
+ container: ["container"],
32582
+ /**
32583
+ * Columns
32584
+ * @see https://tailwindcss.com/docs/columns
32585
+ */
32586
+ columns: [{
32587
+ columns: [isTshirtSize]
32588
+ }],
32589
+ /**
32590
+ * Break After
32591
+ * @see https://tailwindcss.com/docs/break-after
32592
+ */
32593
+ "break-after": [{
32594
+ "break-after": getBreaks()
32595
+ }],
32596
+ /**
32597
+ * Break Before
32598
+ * @see https://tailwindcss.com/docs/break-before
32599
+ */
32600
+ "break-before": [{
32601
+ "break-before": getBreaks()
32602
+ }],
32603
+ /**
32604
+ * Break Inside
32605
+ * @see https://tailwindcss.com/docs/break-inside
32606
+ */
32607
+ "break-inside": [{
32608
+ "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
32609
+ }],
32610
+ /**
32611
+ * Box Decoration Break
32612
+ * @see https://tailwindcss.com/docs/box-decoration-break
32613
+ */
32614
+ "box-decoration": [{
32615
+ "box-decoration": ["slice", "clone"]
32616
+ }],
32617
+ /**
32618
+ * Box Sizing
32619
+ * @see https://tailwindcss.com/docs/box-sizing
32620
+ */
32621
+ box: [{
32622
+ box: ["border", "content"]
32623
+ }],
32624
+ /**
32625
+ * Display
32626
+ * @see https://tailwindcss.com/docs/display
32627
+ */
32628
+ 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"],
32629
+ /**
32630
+ * Floats
32631
+ * @see https://tailwindcss.com/docs/float
32632
+ */
32633
+ float: [{
32634
+ float: ["right", "left", "none", "start", "end"]
32635
+ }],
32636
+ /**
32637
+ * Clear
32638
+ * @see https://tailwindcss.com/docs/clear
32639
+ */
32640
+ clear: [{
32641
+ clear: ["left", "right", "both", "none", "start", "end"]
32642
+ }],
32643
+ /**
32644
+ * Isolation
32645
+ * @see https://tailwindcss.com/docs/isolation
32646
+ */
32647
+ isolation: ["isolate", "isolation-auto"],
32648
+ /**
32649
+ * Object Fit
32650
+ * @see https://tailwindcss.com/docs/object-fit
32651
+ */
32652
+ "object-fit": [{
32653
+ object: ["contain", "cover", "fill", "none", "scale-down"]
32654
+ }],
32655
+ /**
32656
+ * Object Position
32657
+ * @see https://tailwindcss.com/docs/object-position
32658
+ */
32659
+ "object-position": [{
32660
+ object: [...getPositions(), isArbitraryValue]
32661
+ }],
32662
+ /**
32663
+ * Overflow
32664
+ * @see https://tailwindcss.com/docs/overflow
32665
+ */
32666
+ overflow: [{
32667
+ overflow: getOverflow()
32668
+ }],
32669
+ /**
32670
+ * Overflow X
32671
+ * @see https://tailwindcss.com/docs/overflow
32672
+ */
32673
+ "overflow-x": [{
32674
+ "overflow-x": getOverflow()
32675
+ }],
32676
+ /**
32677
+ * Overflow Y
32678
+ * @see https://tailwindcss.com/docs/overflow
32679
+ */
32680
+ "overflow-y": [{
32681
+ "overflow-y": getOverflow()
32682
+ }],
32683
+ /**
32684
+ * Overscroll Behavior
32685
+ * @see https://tailwindcss.com/docs/overscroll-behavior
32686
+ */
32687
+ overscroll: [{
32688
+ overscroll: getOverscroll()
32689
+ }],
32690
+ /**
32691
+ * Overscroll Behavior X
32692
+ * @see https://tailwindcss.com/docs/overscroll-behavior
32693
+ */
32694
+ "overscroll-x": [{
32695
+ "overscroll-x": getOverscroll()
32696
+ }],
32697
+ /**
32698
+ * Overscroll Behavior Y
32699
+ * @see https://tailwindcss.com/docs/overscroll-behavior
32700
+ */
32701
+ "overscroll-y": [{
32702
+ "overscroll-y": getOverscroll()
32703
+ }],
32704
+ /**
32705
+ * Position
32706
+ * @see https://tailwindcss.com/docs/position
32707
+ */
32708
+ position: ["static", "fixed", "absolute", "relative", "sticky"],
32709
+ /**
32710
+ * Top / Right / Bottom / Left
32711
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32712
+ */
32713
+ inset: [{
32714
+ inset: [inset]
32715
+ }],
32716
+ /**
32717
+ * Right / Left
32718
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32719
+ */
32720
+ "inset-x": [{
32721
+ "inset-x": [inset]
32722
+ }],
32723
+ /**
32724
+ * Top / Bottom
32725
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32726
+ */
32727
+ "inset-y": [{
32728
+ "inset-y": [inset]
32729
+ }],
32730
+ /**
32731
+ * Start
32732
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32733
+ */
32734
+ start: [{
32735
+ start: [inset]
32736
+ }],
32737
+ /**
32738
+ * End
32739
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32740
+ */
32741
+ end: [{
32742
+ end: [inset]
32743
+ }],
32744
+ /**
32745
+ * Top
32746
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32747
+ */
32748
+ top: [{
32749
+ top: [inset]
32750
+ }],
32751
+ /**
32752
+ * Right
32753
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32754
+ */
32755
+ right: [{
32756
+ right: [inset]
32757
+ }],
32758
+ /**
32759
+ * Bottom
32760
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32761
+ */
32762
+ bottom: [{
32763
+ bottom: [inset]
32764
+ }],
32765
+ /**
32766
+ * Left
32767
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
32768
+ */
32769
+ left: [{
32770
+ left: [inset]
32771
+ }],
32772
+ /**
32773
+ * Visibility
32774
+ * @see https://tailwindcss.com/docs/visibility
32775
+ */
32776
+ visibility: ["visible", "invisible", "collapse"],
32777
+ /**
32778
+ * Z-Index
32779
+ * @see https://tailwindcss.com/docs/z-index
32780
+ */
32781
+ z: [{
32782
+ z: ["auto", isInteger, isArbitraryValue]
32783
+ }],
32784
+ // Flexbox and Grid
32785
+ /**
32786
+ * Flex Basis
32787
+ * @see https://tailwindcss.com/docs/flex-basis
32788
+ */
32789
+ basis: [{
32790
+ basis: getSpacingWithAutoAndArbitrary()
32791
+ }],
32792
+ /**
32793
+ * Flex Direction
32794
+ * @see https://tailwindcss.com/docs/flex-direction
32795
+ */
32796
+ "flex-direction": [{
32797
+ flex: ["row", "row-reverse", "col", "col-reverse"]
32798
+ }],
32799
+ /**
32800
+ * Flex Wrap
32801
+ * @see https://tailwindcss.com/docs/flex-wrap
32802
+ */
32803
+ "flex-wrap": [{
32804
+ flex: ["wrap", "wrap-reverse", "nowrap"]
32805
+ }],
32806
+ /**
32807
+ * Flex
32808
+ * @see https://tailwindcss.com/docs/flex
32809
+ */
32810
+ flex: [{
32811
+ flex: ["1", "auto", "initial", "none", isArbitraryValue]
32812
+ }],
32813
+ /**
32814
+ * Flex Grow
32815
+ * @see https://tailwindcss.com/docs/flex-grow
32816
+ */
32817
+ grow: [{
32818
+ grow: getZeroAndEmpty()
32819
+ }],
32820
+ /**
32821
+ * Flex Shrink
32822
+ * @see https://tailwindcss.com/docs/flex-shrink
32823
+ */
32824
+ shrink: [{
32825
+ shrink: getZeroAndEmpty()
32826
+ }],
32827
+ /**
32828
+ * Order
32829
+ * @see https://tailwindcss.com/docs/order
32830
+ */
32831
+ order: [{
32832
+ order: ["first", "last", "none", isInteger, isArbitraryValue]
32833
+ }],
32834
+ /**
32835
+ * Grid Template Columns
32836
+ * @see https://tailwindcss.com/docs/grid-template-columns
32837
+ */
32838
+ "grid-cols": [{
32839
+ "grid-cols": [isAny]
32840
+ }],
32841
+ /**
32842
+ * Grid Column Start / End
32843
+ * @see https://tailwindcss.com/docs/grid-column
32844
+ */
32845
+ "col-start-end": [{
32846
+ col: ["auto", {
32847
+ span: ["full", isInteger, isArbitraryValue]
32848
+ }, isArbitraryValue]
32849
+ }],
32850
+ /**
32851
+ * Grid Column Start
32852
+ * @see https://tailwindcss.com/docs/grid-column
32853
+ */
32854
+ "col-start": [{
32855
+ "col-start": getNumberWithAutoAndArbitrary()
32856
+ }],
32857
+ /**
32858
+ * Grid Column End
32859
+ * @see https://tailwindcss.com/docs/grid-column
32860
+ */
32861
+ "col-end": [{
32862
+ "col-end": getNumberWithAutoAndArbitrary()
32863
+ }],
32864
+ /**
32865
+ * Grid Template Rows
32866
+ * @see https://tailwindcss.com/docs/grid-template-rows
32867
+ */
32868
+ "grid-rows": [{
32869
+ "grid-rows": [isAny]
32870
+ }],
32871
+ /**
32872
+ * Grid Row Start / End
32873
+ * @see https://tailwindcss.com/docs/grid-row
32874
+ */
32875
+ "row-start-end": [{
32876
+ row: ["auto", {
32877
+ span: [isInteger, isArbitraryValue]
32878
+ }, isArbitraryValue]
32879
+ }],
32880
+ /**
32881
+ * Grid Row Start
32882
+ * @see https://tailwindcss.com/docs/grid-row
32883
+ */
32884
+ "row-start": [{
32885
+ "row-start": getNumberWithAutoAndArbitrary()
32886
+ }],
32887
+ /**
32888
+ * Grid Row End
32889
+ * @see https://tailwindcss.com/docs/grid-row
32890
+ */
32891
+ "row-end": [{
32892
+ "row-end": getNumberWithAutoAndArbitrary()
32893
+ }],
32894
+ /**
32895
+ * Grid Auto Flow
32896
+ * @see https://tailwindcss.com/docs/grid-auto-flow
32897
+ */
32898
+ "grid-flow": [{
32899
+ "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
32900
+ }],
32901
+ /**
32902
+ * Grid Auto Columns
32903
+ * @see https://tailwindcss.com/docs/grid-auto-columns
32904
+ */
32905
+ "auto-cols": [{
32906
+ "auto-cols": ["auto", "min", "max", "fr", isArbitraryValue]
32907
+ }],
32908
+ /**
32909
+ * Grid Auto Rows
32910
+ * @see https://tailwindcss.com/docs/grid-auto-rows
32911
+ */
32912
+ "auto-rows": [{
32913
+ "auto-rows": ["auto", "min", "max", "fr", isArbitraryValue]
32914
+ }],
32915
+ /**
32916
+ * Gap
32917
+ * @see https://tailwindcss.com/docs/gap
32918
+ */
32919
+ gap: [{
32920
+ gap: [gap]
32921
+ }],
32922
+ /**
32923
+ * Gap X
32924
+ * @see https://tailwindcss.com/docs/gap
32925
+ */
32926
+ "gap-x": [{
32927
+ "gap-x": [gap]
32928
+ }],
32929
+ /**
32930
+ * Gap Y
32931
+ * @see https://tailwindcss.com/docs/gap
32932
+ */
32933
+ "gap-y": [{
32934
+ "gap-y": [gap]
32935
+ }],
32936
+ /**
32937
+ * Justify Content
32938
+ * @see https://tailwindcss.com/docs/justify-content
32939
+ */
32940
+ "justify-content": [{
32941
+ justify: ["normal", ...getAlign()]
32942
+ }],
32943
+ /**
32944
+ * Justify Items
32945
+ * @see https://tailwindcss.com/docs/justify-items
32946
+ */
32947
+ "justify-items": [{
32948
+ "justify-items": ["start", "end", "center", "stretch"]
32949
+ }],
32950
+ /**
32951
+ * Justify Self
32952
+ * @see https://tailwindcss.com/docs/justify-self
32953
+ */
32954
+ "justify-self": [{
32955
+ "justify-self": ["auto", "start", "end", "center", "stretch"]
32956
+ }],
32957
+ /**
32958
+ * Align Content
32959
+ * @see https://tailwindcss.com/docs/align-content
32960
+ */
32961
+ "align-content": [{
32962
+ content: ["normal", ...getAlign(), "baseline"]
32963
+ }],
32964
+ /**
32965
+ * Align Items
32966
+ * @see https://tailwindcss.com/docs/align-items
32967
+ */
32968
+ "align-items": [{
32969
+ items: ["start", "end", "center", "baseline", "stretch"]
32970
+ }],
32971
+ /**
32972
+ * Align Self
32973
+ * @see https://tailwindcss.com/docs/align-self
32974
+ */
32975
+ "align-self": [{
32976
+ self: ["auto", "start", "end", "center", "stretch", "baseline"]
32977
+ }],
32978
+ /**
32979
+ * Place Content
32980
+ * @see https://tailwindcss.com/docs/place-content
32981
+ */
32982
+ "place-content": [{
32983
+ "place-content": [...getAlign(), "baseline"]
32984
+ }],
32985
+ /**
32986
+ * Place Items
32987
+ * @see https://tailwindcss.com/docs/place-items
32988
+ */
32989
+ "place-items": [{
32990
+ "place-items": ["start", "end", "center", "baseline", "stretch"]
32991
+ }],
32992
+ /**
32993
+ * Place Self
32994
+ * @see https://tailwindcss.com/docs/place-self
32995
+ */
32996
+ "place-self": [{
32997
+ "place-self": ["auto", "start", "end", "center", "stretch"]
32998
+ }],
32999
+ // Spacing
33000
+ /**
33001
+ * Padding
33002
+ * @see https://tailwindcss.com/docs/padding
33003
+ */
33004
+ p: [{
33005
+ p: [padding]
33006
+ }],
33007
+ /**
33008
+ * Padding X
33009
+ * @see https://tailwindcss.com/docs/padding
33010
+ */
33011
+ px: [{
33012
+ px: [padding]
33013
+ }],
33014
+ /**
33015
+ * Padding Y
33016
+ * @see https://tailwindcss.com/docs/padding
33017
+ */
33018
+ py: [{
33019
+ py: [padding]
33020
+ }],
33021
+ /**
33022
+ * Padding Start
33023
+ * @see https://tailwindcss.com/docs/padding
33024
+ */
33025
+ ps: [{
33026
+ ps: [padding]
33027
+ }],
33028
+ /**
33029
+ * Padding End
33030
+ * @see https://tailwindcss.com/docs/padding
33031
+ */
33032
+ pe: [{
33033
+ pe: [padding]
33034
+ }],
33035
+ /**
33036
+ * Padding Top
33037
+ * @see https://tailwindcss.com/docs/padding
33038
+ */
33039
+ pt: [{
33040
+ pt: [padding]
33041
+ }],
33042
+ /**
33043
+ * Padding Right
33044
+ * @see https://tailwindcss.com/docs/padding
33045
+ */
33046
+ pr: [{
33047
+ pr: [padding]
33048
+ }],
33049
+ /**
33050
+ * Padding Bottom
33051
+ * @see https://tailwindcss.com/docs/padding
33052
+ */
33053
+ pb: [{
33054
+ pb: [padding]
33055
+ }],
33056
+ /**
33057
+ * Padding Left
33058
+ * @see https://tailwindcss.com/docs/padding
33059
+ */
33060
+ pl: [{
33061
+ pl: [padding]
33062
+ }],
33063
+ /**
33064
+ * Margin
33065
+ * @see https://tailwindcss.com/docs/margin
33066
+ */
33067
+ m: [{
33068
+ m: [margin]
33069
+ }],
33070
+ /**
33071
+ * Margin X
33072
+ * @see https://tailwindcss.com/docs/margin
33073
+ */
33074
+ mx: [{
33075
+ mx: [margin]
33076
+ }],
33077
+ /**
33078
+ * Margin Y
33079
+ * @see https://tailwindcss.com/docs/margin
33080
+ */
33081
+ my: [{
33082
+ my: [margin]
33083
+ }],
33084
+ /**
33085
+ * Margin Start
33086
+ * @see https://tailwindcss.com/docs/margin
33087
+ */
33088
+ ms: [{
33089
+ ms: [margin]
33090
+ }],
33091
+ /**
33092
+ * Margin End
33093
+ * @see https://tailwindcss.com/docs/margin
33094
+ */
33095
+ me: [{
33096
+ me: [margin]
33097
+ }],
33098
+ /**
33099
+ * Margin Top
33100
+ * @see https://tailwindcss.com/docs/margin
33101
+ */
33102
+ mt: [{
33103
+ mt: [margin]
33104
+ }],
33105
+ /**
33106
+ * Margin Right
33107
+ * @see https://tailwindcss.com/docs/margin
33108
+ */
33109
+ mr: [{
33110
+ mr: [margin]
33111
+ }],
33112
+ /**
33113
+ * Margin Bottom
33114
+ * @see https://tailwindcss.com/docs/margin
33115
+ */
33116
+ mb: [{
33117
+ mb: [margin]
33118
+ }],
33119
+ /**
33120
+ * Margin Left
33121
+ * @see https://tailwindcss.com/docs/margin
33122
+ */
33123
+ ml: [{
33124
+ ml: [margin]
33125
+ }],
33126
+ /**
33127
+ * Space Between X
33128
+ * @see https://tailwindcss.com/docs/space
33129
+ */
33130
+ "space-x": [{
33131
+ "space-x": [space]
33132
+ }],
33133
+ /**
33134
+ * Space Between X Reverse
33135
+ * @see https://tailwindcss.com/docs/space
33136
+ */
33137
+ "space-x-reverse": ["space-x-reverse"],
33138
+ /**
33139
+ * Space Between Y
33140
+ * @see https://tailwindcss.com/docs/space
33141
+ */
33142
+ "space-y": [{
33143
+ "space-y": [space]
33144
+ }],
33145
+ /**
33146
+ * Space Between Y Reverse
33147
+ * @see https://tailwindcss.com/docs/space
33148
+ */
33149
+ "space-y-reverse": ["space-y-reverse"],
33150
+ // Sizing
33151
+ /**
33152
+ * Width
33153
+ * @see https://tailwindcss.com/docs/width
33154
+ */
33155
+ w: [{
33156
+ w: ["auto", "min", "max", "fit", "svw", "lvw", "dvw", isArbitraryValue, spacing]
33157
+ }],
33158
+ /**
33159
+ * Min-Width
33160
+ * @see https://tailwindcss.com/docs/min-width
33161
+ */
33162
+ "min-w": [{
33163
+ "min-w": [isArbitraryValue, spacing, "min", "max", "fit"]
33164
+ }],
33165
+ /**
33166
+ * Max-Width
33167
+ * @see https://tailwindcss.com/docs/max-width
33168
+ */
33169
+ "max-w": [{
33170
+ "max-w": [isArbitraryValue, spacing, "none", "full", "min", "max", "fit", "prose", {
33171
+ screen: [isTshirtSize]
33172
+ }, isTshirtSize]
33173
+ }],
33174
+ /**
33175
+ * Height
33176
+ * @see https://tailwindcss.com/docs/height
33177
+ */
33178
+ h: [{
33179
+ h: [isArbitraryValue, spacing, "auto", "min", "max", "fit", "svh", "lvh", "dvh"]
33180
+ }],
33181
+ /**
33182
+ * Min-Height
33183
+ * @see https://tailwindcss.com/docs/min-height
33184
+ */
33185
+ "min-h": [{
33186
+ "min-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
33187
+ }],
33188
+ /**
33189
+ * Max-Height
33190
+ * @see https://tailwindcss.com/docs/max-height
33191
+ */
33192
+ "max-h": [{
33193
+ "max-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
33194
+ }],
33195
+ /**
33196
+ * Size
33197
+ * @see https://tailwindcss.com/docs/size
33198
+ */
33199
+ size: [{
33200
+ size: [isArbitraryValue, spacing, "auto", "min", "max", "fit"]
33201
+ }],
33202
+ // Typography
33203
+ /**
33204
+ * Font Size
33205
+ * @see https://tailwindcss.com/docs/font-size
33206
+ */
33207
+ "font-size": [{
33208
+ text: ["base", isTshirtSize, isArbitraryLength]
33209
+ }],
33210
+ /**
33211
+ * Font Smoothing
33212
+ * @see https://tailwindcss.com/docs/font-smoothing
33213
+ */
33214
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
33215
+ /**
33216
+ * Font Style
33217
+ * @see https://tailwindcss.com/docs/font-style
33218
+ */
33219
+ "font-style": ["italic", "not-italic"],
33220
+ /**
33221
+ * Font Weight
33222
+ * @see https://tailwindcss.com/docs/font-weight
33223
+ */
33224
+ "font-weight": [{
33225
+ font: ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black", isArbitraryNumber]
33226
+ }],
33227
+ /**
33228
+ * Font Family
33229
+ * @see https://tailwindcss.com/docs/font-family
33230
+ */
33231
+ "font-family": [{
33232
+ font: [isAny]
33233
+ }],
33234
+ /**
33235
+ * Font Variant Numeric
33236
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33237
+ */
33238
+ "fvn-normal": ["normal-nums"],
33239
+ /**
33240
+ * Font Variant Numeric
33241
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33242
+ */
33243
+ "fvn-ordinal": ["ordinal"],
33244
+ /**
33245
+ * Font Variant Numeric
33246
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33247
+ */
33248
+ "fvn-slashed-zero": ["slashed-zero"],
33249
+ /**
33250
+ * Font Variant Numeric
33251
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33252
+ */
33253
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
33254
+ /**
33255
+ * Font Variant Numeric
33256
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33257
+ */
33258
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
33259
+ /**
33260
+ * Font Variant Numeric
33261
+ * @see https://tailwindcss.com/docs/font-variant-numeric
33262
+ */
33263
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
33264
+ /**
33265
+ * Letter Spacing
33266
+ * @see https://tailwindcss.com/docs/letter-spacing
33267
+ */
33268
+ tracking: [{
33269
+ tracking: ["tighter", "tight", "normal", "wide", "wider", "widest", isArbitraryValue]
33270
+ }],
33271
+ /**
33272
+ * Line Clamp
33273
+ * @see https://tailwindcss.com/docs/line-clamp
33274
+ */
33275
+ "line-clamp": [{
33276
+ "line-clamp": ["none", isNumber, isArbitraryNumber]
33277
+ }],
33278
+ /**
33279
+ * Line Height
33280
+ * @see https://tailwindcss.com/docs/line-height
33281
+ */
33282
+ leading: [{
33283
+ leading: ["none", "tight", "snug", "normal", "relaxed", "loose", isLength, isArbitraryValue]
33284
+ }],
33285
+ /**
33286
+ * List Style Image
33287
+ * @see https://tailwindcss.com/docs/list-style-image
33288
+ */
33289
+ "list-image": [{
33290
+ "list-image": ["none", isArbitraryValue]
33291
+ }],
33292
+ /**
33293
+ * List Style Type
33294
+ * @see https://tailwindcss.com/docs/list-style-type
33295
+ */
33296
+ "list-style-type": [{
33297
+ list: ["none", "disc", "decimal", isArbitraryValue]
33298
+ }],
33299
+ /**
33300
+ * List Style Position
33301
+ * @see https://tailwindcss.com/docs/list-style-position
33302
+ */
33303
+ "list-style-position": [{
33304
+ list: ["inside", "outside"]
33305
+ }],
33306
+ /**
33307
+ * Placeholder Color
33308
+ * @deprecated since Tailwind CSS v3.0.0
33309
+ * @see https://tailwindcss.com/docs/placeholder-color
33310
+ */
33311
+ "placeholder-color": [{
33312
+ placeholder: [colors]
33313
+ }],
33314
+ /**
33315
+ * Placeholder Opacity
33316
+ * @see https://tailwindcss.com/docs/placeholder-opacity
33317
+ */
33318
+ "placeholder-opacity": [{
33319
+ "placeholder-opacity": [opacity]
33320
+ }],
33321
+ /**
33322
+ * Text Alignment
33323
+ * @see https://tailwindcss.com/docs/text-align
33324
+ */
33325
+ "text-alignment": [{
33326
+ text: ["left", "center", "right", "justify", "start", "end"]
33327
+ }],
33328
+ /**
33329
+ * Text Color
33330
+ * @see https://tailwindcss.com/docs/text-color
33331
+ */
33332
+ "text-color": [{
33333
+ text: [colors]
33334
+ }],
33335
+ /**
33336
+ * Text Opacity
33337
+ * @see https://tailwindcss.com/docs/text-opacity
33338
+ */
33339
+ "text-opacity": [{
33340
+ "text-opacity": [opacity]
33341
+ }],
33342
+ /**
33343
+ * Text Decoration
33344
+ * @see https://tailwindcss.com/docs/text-decoration
33345
+ */
33346
+ "text-decoration": ["underline", "overline", "line-through", "no-underline"],
33347
+ /**
33348
+ * Text Decoration Style
33349
+ * @see https://tailwindcss.com/docs/text-decoration-style
33350
+ */
33351
+ "text-decoration-style": [{
33352
+ decoration: [...getLineStyles(), "wavy"]
33353
+ }],
33354
+ /**
33355
+ * Text Decoration Thickness
33356
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
33357
+ */
33358
+ "text-decoration-thickness": [{
33359
+ decoration: ["auto", "from-font", isLength, isArbitraryLength]
33360
+ }],
33361
+ /**
33362
+ * Text Underline Offset
33363
+ * @see https://tailwindcss.com/docs/text-underline-offset
33364
+ */
33365
+ "underline-offset": [{
33366
+ "underline-offset": ["auto", isLength, isArbitraryValue]
33367
+ }],
33368
+ /**
33369
+ * Text Decoration Color
33370
+ * @see https://tailwindcss.com/docs/text-decoration-color
33371
+ */
33372
+ "text-decoration-color": [{
33373
+ decoration: [colors]
33374
+ }],
33375
+ /**
33376
+ * Text Transform
33377
+ * @see https://tailwindcss.com/docs/text-transform
33378
+ */
33379
+ "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
33380
+ /**
33381
+ * Text Overflow
33382
+ * @see https://tailwindcss.com/docs/text-overflow
33383
+ */
33384
+ "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
33385
+ /**
33386
+ * Text Wrap
33387
+ * @see https://tailwindcss.com/docs/text-wrap
33388
+ */
33389
+ "text-wrap": [{
33390
+ text: ["wrap", "nowrap", "balance", "pretty"]
33391
+ }],
33392
+ /**
33393
+ * Text Indent
33394
+ * @see https://tailwindcss.com/docs/text-indent
33395
+ */
33396
+ indent: [{
33397
+ indent: getSpacingWithArbitrary()
33398
+ }],
33399
+ /**
33400
+ * Vertical Alignment
33401
+ * @see https://tailwindcss.com/docs/vertical-align
33402
+ */
33403
+ "vertical-align": [{
33404
+ align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryValue]
33405
+ }],
33406
+ /**
33407
+ * Whitespace
33408
+ * @see https://tailwindcss.com/docs/whitespace
33409
+ */
33410
+ whitespace: [{
33411
+ whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
33412
+ }],
33413
+ /**
33414
+ * Word Break
33415
+ * @see https://tailwindcss.com/docs/word-break
33416
+ */
33417
+ break: [{
33418
+ break: ["normal", "words", "all", "keep"]
33419
+ }],
33420
+ /**
33421
+ * Hyphens
33422
+ * @see https://tailwindcss.com/docs/hyphens
33423
+ */
33424
+ hyphens: [{
33425
+ hyphens: ["none", "manual", "auto"]
33426
+ }],
33427
+ /**
33428
+ * Content
33429
+ * @see https://tailwindcss.com/docs/content
33430
+ */
33431
+ content: [{
33432
+ content: ["none", isArbitraryValue]
33433
+ }],
33434
+ // Backgrounds
33435
+ /**
33436
+ * Background Attachment
33437
+ * @see https://tailwindcss.com/docs/background-attachment
33438
+ */
33439
+ "bg-attachment": [{
33440
+ bg: ["fixed", "local", "scroll"]
33441
+ }],
33442
+ /**
33443
+ * Background Clip
33444
+ * @see https://tailwindcss.com/docs/background-clip
33445
+ */
33446
+ "bg-clip": [{
33447
+ "bg-clip": ["border", "padding", "content", "text"]
33448
+ }],
33449
+ /**
33450
+ * Background Opacity
33451
+ * @deprecated since Tailwind CSS v3.0.0
33452
+ * @see https://tailwindcss.com/docs/background-opacity
33453
+ */
33454
+ "bg-opacity": [{
33455
+ "bg-opacity": [opacity]
33456
+ }],
33457
+ /**
33458
+ * Background Origin
33459
+ * @see https://tailwindcss.com/docs/background-origin
33460
+ */
33461
+ "bg-origin": [{
33462
+ "bg-origin": ["border", "padding", "content"]
33463
+ }],
33464
+ /**
33465
+ * Background Position
33466
+ * @see https://tailwindcss.com/docs/background-position
33467
+ */
33468
+ "bg-position": [{
33469
+ bg: [...getPositions(), isArbitraryPosition]
33470
+ }],
33471
+ /**
33472
+ * Background Repeat
33473
+ * @see https://tailwindcss.com/docs/background-repeat
33474
+ */
33475
+ "bg-repeat": [{
33476
+ bg: ["no-repeat", {
33477
+ repeat: ["", "x", "y", "round", "space"]
33478
+ }]
33479
+ }],
33480
+ /**
33481
+ * Background Size
33482
+ * @see https://tailwindcss.com/docs/background-size
33483
+ */
33484
+ "bg-size": [{
33485
+ bg: ["auto", "cover", "contain", isArbitrarySize]
33486
+ }],
33487
+ /**
33488
+ * Background Image
33489
+ * @see https://tailwindcss.com/docs/background-image
33490
+ */
33491
+ "bg-image": [{
33492
+ bg: ["none", {
33493
+ "gradient-to": ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
33494
+ }, isArbitraryImage]
33495
+ }],
33496
+ /**
33497
+ * Background Color
33498
+ * @see https://tailwindcss.com/docs/background-color
33499
+ */
33500
+ "bg-color": [{
33501
+ bg: [colors]
33502
+ }],
33503
+ /**
33504
+ * Gradient Color Stops From Position
33505
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33506
+ */
33507
+ "gradient-from-pos": [{
33508
+ from: [gradientColorStopPositions]
33509
+ }],
33510
+ /**
33511
+ * Gradient Color Stops Via Position
33512
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33513
+ */
33514
+ "gradient-via-pos": [{
33515
+ via: [gradientColorStopPositions]
33516
+ }],
33517
+ /**
33518
+ * Gradient Color Stops To Position
33519
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33520
+ */
33521
+ "gradient-to-pos": [{
33522
+ to: [gradientColorStopPositions]
33523
+ }],
33524
+ /**
33525
+ * Gradient Color Stops From
33526
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33527
+ */
33528
+ "gradient-from": [{
33529
+ from: [gradientColorStops]
33530
+ }],
33531
+ /**
33532
+ * Gradient Color Stops Via
33533
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33534
+ */
33535
+ "gradient-via": [{
33536
+ via: [gradientColorStops]
33537
+ }],
33538
+ /**
33539
+ * Gradient Color Stops To
33540
+ * @see https://tailwindcss.com/docs/gradient-color-stops
33541
+ */
33542
+ "gradient-to": [{
33543
+ to: [gradientColorStops]
33544
+ }],
33545
+ // Borders
33546
+ /**
33547
+ * Border Radius
33548
+ * @see https://tailwindcss.com/docs/border-radius
33549
+ */
33550
+ rounded: [{
33551
+ rounded: [borderRadius]
33552
+ }],
33553
+ /**
33554
+ * Border Radius Start
33555
+ * @see https://tailwindcss.com/docs/border-radius
33556
+ */
33557
+ "rounded-s": [{
33558
+ "rounded-s": [borderRadius]
33559
+ }],
33560
+ /**
33561
+ * Border Radius End
33562
+ * @see https://tailwindcss.com/docs/border-radius
33563
+ */
33564
+ "rounded-e": [{
33565
+ "rounded-e": [borderRadius]
33566
+ }],
33567
+ /**
33568
+ * Border Radius Top
33569
+ * @see https://tailwindcss.com/docs/border-radius
33570
+ */
33571
+ "rounded-t": [{
33572
+ "rounded-t": [borderRadius]
33573
+ }],
33574
+ /**
33575
+ * Border Radius Right
33576
+ * @see https://tailwindcss.com/docs/border-radius
33577
+ */
33578
+ "rounded-r": [{
33579
+ "rounded-r": [borderRadius]
33580
+ }],
33581
+ /**
33582
+ * Border Radius Bottom
33583
+ * @see https://tailwindcss.com/docs/border-radius
33584
+ */
33585
+ "rounded-b": [{
33586
+ "rounded-b": [borderRadius]
33587
+ }],
33588
+ /**
33589
+ * Border Radius Left
33590
+ * @see https://tailwindcss.com/docs/border-radius
33591
+ */
33592
+ "rounded-l": [{
33593
+ "rounded-l": [borderRadius]
33594
+ }],
33595
+ /**
33596
+ * Border Radius Start Start
33597
+ * @see https://tailwindcss.com/docs/border-radius
33598
+ */
33599
+ "rounded-ss": [{
33600
+ "rounded-ss": [borderRadius]
33601
+ }],
33602
+ /**
33603
+ * Border Radius Start End
33604
+ * @see https://tailwindcss.com/docs/border-radius
33605
+ */
33606
+ "rounded-se": [{
33607
+ "rounded-se": [borderRadius]
33608
+ }],
33609
+ /**
33610
+ * Border Radius End End
33611
+ * @see https://tailwindcss.com/docs/border-radius
33612
+ */
33613
+ "rounded-ee": [{
33614
+ "rounded-ee": [borderRadius]
33615
+ }],
33616
+ /**
33617
+ * Border Radius End Start
33618
+ * @see https://tailwindcss.com/docs/border-radius
33619
+ */
33620
+ "rounded-es": [{
33621
+ "rounded-es": [borderRadius]
33622
+ }],
33623
+ /**
33624
+ * Border Radius Top Left
33625
+ * @see https://tailwindcss.com/docs/border-radius
33626
+ */
33627
+ "rounded-tl": [{
33628
+ "rounded-tl": [borderRadius]
33629
+ }],
33630
+ /**
33631
+ * Border Radius Top Right
33632
+ * @see https://tailwindcss.com/docs/border-radius
33633
+ */
33634
+ "rounded-tr": [{
33635
+ "rounded-tr": [borderRadius]
33636
+ }],
33637
+ /**
33638
+ * Border Radius Bottom Right
33639
+ * @see https://tailwindcss.com/docs/border-radius
33640
+ */
33641
+ "rounded-br": [{
33642
+ "rounded-br": [borderRadius]
33643
+ }],
33644
+ /**
33645
+ * Border Radius Bottom Left
33646
+ * @see https://tailwindcss.com/docs/border-radius
33647
+ */
33648
+ "rounded-bl": [{
33649
+ "rounded-bl": [borderRadius]
33650
+ }],
33651
+ /**
33652
+ * Border Width
33653
+ * @see https://tailwindcss.com/docs/border-width
33654
+ */
33655
+ "border-w": [{
33656
+ border: [borderWidth]
33657
+ }],
33658
+ /**
33659
+ * Border Width X
33660
+ * @see https://tailwindcss.com/docs/border-width
33661
+ */
33662
+ "border-w-x": [{
33663
+ "border-x": [borderWidth]
33664
+ }],
33665
+ /**
33666
+ * Border Width Y
33667
+ * @see https://tailwindcss.com/docs/border-width
33668
+ */
33669
+ "border-w-y": [{
33670
+ "border-y": [borderWidth]
33671
+ }],
33672
+ /**
33673
+ * Border Width Start
33674
+ * @see https://tailwindcss.com/docs/border-width
33675
+ */
33676
+ "border-w-s": [{
33677
+ "border-s": [borderWidth]
33678
+ }],
33679
+ /**
33680
+ * Border Width End
33681
+ * @see https://tailwindcss.com/docs/border-width
33682
+ */
33683
+ "border-w-e": [{
33684
+ "border-e": [borderWidth]
33685
+ }],
33686
+ /**
33687
+ * Border Width Top
33688
+ * @see https://tailwindcss.com/docs/border-width
33689
+ */
33690
+ "border-w-t": [{
33691
+ "border-t": [borderWidth]
33692
+ }],
33693
+ /**
33694
+ * Border Width Right
33695
+ * @see https://tailwindcss.com/docs/border-width
33696
+ */
33697
+ "border-w-r": [{
33698
+ "border-r": [borderWidth]
33699
+ }],
33700
+ /**
33701
+ * Border Width Bottom
33702
+ * @see https://tailwindcss.com/docs/border-width
33703
+ */
33704
+ "border-w-b": [{
33705
+ "border-b": [borderWidth]
33706
+ }],
33707
+ /**
33708
+ * Border Width Left
33709
+ * @see https://tailwindcss.com/docs/border-width
33710
+ */
33711
+ "border-w-l": [{
33712
+ "border-l": [borderWidth]
33713
+ }],
33714
+ /**
33715
+ * Border Opacity
33716
+ * @see https://tailwindcss.com/docs/border-opacity
33717
+ */
33718
+ "border-opacity": [{
33719
+ "border-opacity": [opacity]
33720
+ }],
33721
+ /**
33722
+ * Border Style
33723
+ * @see https://tailwindcss.com/docs/border-style
33724
+ */
33725
+ "border-style": [{
33726
+ border: [...getLineStyles(), "hidden"]
33727
+ }],
33728
+ /**
33729
+ * Divide Width X
33730
+ * @see https://tailwindcss.com/docs/divide-width
33731
+ */
33732
+ "divide-x": [{
33733
+ "divide-x": [borderWidth]
33734
+ }],
33735
+ /**
33736
+ * Divide Width X Reverse
33737
+ * @see https://tailwindcss.com/docs/divide-width
33738
+ */
33739
+ "divide-x-reverse": ["divide-x-reverse"],
33740
+ /**
33741
+ * Divide Width Y
33742
+ * @see https://tailwindcss.com/docs/divide-width
33743
+ */
33744
+ "divide-y": [{
33745
+ "divide-y": [borderWidth]
33746
+ }],
33747
+ /**
33748
+ * Divide Width Y Reverse
33749
+ * @see https://tailwindcss.com/docs/divide-width
33750
+ */
33751
+ "divide-y-reverse": ["divide-y-reverse"],
33752
+ /**
33753
+ * Divide Opacity
33754
+ * @see https://tailwindcss.com/docs/divide-opacity
33755
+ */
33756
+ "divide-opacity": [{
33757
+ "divide-opacity": [opacity]
33758
+ }],
33759
+ /**
33760
+ * Divide Style
33761
+ * @see https://tailwindcss.com/docs/divide-style
33762
+ */
33763
+ "divide-style": [{
33764
+ divide: getLineStyles()
33765
+ }],
33766
+ /**
33767
+ * Border Color
33768
+ * @see https://tailwindcss.com/docs/border-color
33769
+ */
33770
+ "border-color": [{
33771
+ border: [borderColor]
33772
+ }],
33773
+ /**
33774
+ * Border Color X
33775
+ * @see https://tailwindcss.com/docs/border-color
33776
+ */
33777
+ "border-color-x": [{
33778
+ "border-x": [borderColor]
33779
+ }],
33780
+ /**
33781
+ * Border Color Y
33782
+ * @see https://tailwindcss.com/docs/border-color
33783
+ */
33784
+ "border-color-y": [{
33785
+ "border-y": [borderColor]
33786
+ }],
33787
+ /**
33788
+ * Border Color S
33789
+ * @see https://tailwindcss.com/docs/border-color
33790
+ */
33791
+ "border-color-s": [{
33792
+ "border-s": [borderColor]
33793
+ }],
33794
+ /**
33795
+ * Border Color E
33796
+ * @see https://tailwindcss.com/docs/border-color
33797
+ */
33798
+ "border-color-e": [{
33799
+ "border-e": [borderColor]
33800
+ }],
33801
+ /**
33802
+ * Border Color Top
33803
+ * @see https://tailwindcss.com/docs/border-color
33804
+ */
33805
+ "border-color-t": [{
33806
+ "border-t": [borderColor]
33807
+ }],
33808
+ /**
33809
+ * Border Color Right
33810
+ * @see https://tailwindcss.com/docs/border-color
33811
+ */
33812
+ "border-color-r": [{
33813
+ "border-r": [borderColor]
33814
+ }],
33815
+ /**
33816
+ * Border Color Bottom
33817
+ * @see https://tailwindcss.com/docs/border-color
33818
+ */
33819
+ "border-color-b": [{
33820
+ "border-b": [borderColor]
33821
+ }],
33822
+ /**
33823
+ * Border Color Left
33824
+ * @see https://tailwindcss.com/docs/border-color
33825
+ */
33826
+ "border-color-l": [{
33827
+ "border-l": [borderColor]
33828
+ }],
33829
+ /**
33830
+ * Divide Color
33831
+ * @see https://tailwindcss.com/docs/divide-color
33832
+ */
33833
+ "divide-color": [{
33834
+ divide: [borderColor]
33835
+ }],
33836
+ /**
33837
+ * Outline Style
33838
+ * @see https://tailwindcss.com/docs/outline-style
33839
+ */
33840
+ "outline-style": [{
33841
+ outline: ["", ...getLineStyles()]
33842
+ }],
33843
+ /**
33844
+ * Outline Offset
33845
+ * @see https://tailwindcss.com/docs/outline-offset
33846
+ */
33847
+ "outline-offset": [{
33848
+ "outline-offset": [isLength, isArbitraryValue]
33849
+ }],
33850
+ /**
33851
+ * Outline Width
33852
+ * @see https://tailwindcss.com/docs/outline-width
33853
+ */
33854
+ "outline-w": [{
33855
+ outline: [isLength, isArbitraryLength]
33856
+ }],
33857
+ /**
33858
+ * Outline Color
33859
+ * @see https://tailwindcss.com/docs/outline-color
33860
+ */
33861
+ "outline-color": [{
33862
+ outline: [colors]
33863
+ }],
33864
+ /**
33865
+ * Ring Width
33866
+ * @see https://tailwindcss.com/docs/ring-width
33867
+ */
33868
+ "ring-w": [{
33869
+ ring: getLengthWithEmptyAndArbitrary()
33870
+ }],
33871
+ /**
33872
+ * Ring Width Inset
33873
+ * @see https://tailwindcss.com/docs/ring-width
33874
+ */
33875
+ "ring-w-inset": ["ring-inset"],
33876
+ /**
33877
+ * Ring Color
33878
+ * @see https://tailwindcss.com/docs/ring-color
33879
+ */
33880
+ "ring-color": [{
33881
+ ring: [colors]
33882
+ }],
33883
+ /**
33884
+ * Ring Opacity
33885
+ * @see https://tailwindcss.com/docs/ring-opacity
33886
+ */
33887
+ "ring-opacity": [{
33888
+ "ring-opacity": [opacity]
33889
+ }],
33890
+ /**
33891
+ * Ring Offset Width
33892
+ * @see https://tailwindcss.com/docs/ring-offset-width
33893
+ */
33894
+ "ring-offset-w": [{
33895
+ "ring-offset": [isLength, isArbitraryLength]
33896
+ }],
33897
+ /**
33898
+ * Ring Offset Color
33899
+ * @see https://tailwindcss.com/docs/ring-offset-color
33900
+ */
33901
+ "ring-offset-color": [{
33902
+ "ring-offset": [colors]
33903
+ }],
33904
+ // Effects
33905
+ /**
33906
+ * Box Shadow
33907
+ * @see https://tailwindcss.com/docs/box-shadow
33908
+ */
33909
+ shadow: [{
33910
+ shadow: ["", "inner", "none", isTshirtSize, isArbitraryShadow]
33911
+ }],
33912
+ /**
33913
+ * Box Shadow Color
33914
+ * @see https://tailwindcss.com/docs/box-shadow-color
33915
+ */
33916
+ "shadow-color": [{
33917
+ shadow: [isAny]
33918
+ }],
33919
+ /**
33920
+ * Opacity
33921
+ * @see https://tailwindcss.com/docs/opacity
33922
+ */
33923
+ opacity: [{
33924
+ opacity: [opacity]
33925
+ }],
33926
+ /**
33927
+ * Mix Blend Mode
33928
+ * @see https://tailwindcss.com/docs/mix-blend-mode
33929
+ */
33930
+ "mix-blend": [{
33931
+ "mix-blend": [...getBlendModes(), "plus-lighter", "plus-darker"]
33932
+ }],
33933
+ /**
33934
+ * Background Blend Mode
33935
+ * @see https://tailwindcss.com/docs/background-blend-mode
33936
+ */
33937
+ "bg-blend": [{
33938
+ "bg-blend": getBlendModes()
33939
+ }],
33940
+ // Filters
33941
+ /**
33942
+ * Filter
33943
+ * @deprecated since Tailwind CSS v3.0.0
33944
+ * @see https://tailwindcss.com/docs/filter
33945
+ */
33946
+ filter: [{
33947
+ filter: ["", "none"]
33948
+ }],
33949
+ /**
33950
+ * Blur
33951
+ * @see https://tailwindcss.com/docs/blur
33952
+ */
33953
+ blur: [{
33954
+ blur: [blur]
33955
+ }],
33956
+ /**
33957
+ * Brightness
33958
+ * @see https://tailwindcss.com/docs/brightness
33959
+ */
33960
+ brightness: [{
33961
+ brightness: [brightness]
33962
+ }],
33963
+ /**
33964
+ * Contrast
33965
+ * @see https://tailwindcss.com/docs/contrast
33966
+ */
33967
+ contrast: [{
33968
+ contrast: [contrast]
33969
+ }],
33970
+ /**
33971
+ * Drop Shadow
33972
+ * @see https://tailwindcss.com/docs/drop-shadow
33973
+ */
33974
+ "drop-shadow": [{
33975
+ "drop-shadow": ["", "none", isTshirtSize, isArbitraryValue]
33976
+ }],
33977
+ /**
33978
+ * Grayscale
33979
+ * @see https://tailwindcss.com/docs/grayscale
33980
+ */
33981
+ grayscale: [{
33982
+ grayscale: [grayscale]
33983
+ }],
33984
+ /**
33985
+ * Hue Rotate
33986
+ * @see https://tailwindcss.com/docs/hue-rotate
33987
+ */
33988
+ "hue-rotate": [{
33989
+ "hue-rotate": [hueRotate]
33990
+ }],
33991
+ /**
33992
+ * Invert
33993
+ * @see https://tailwindcss.com/docs/invert
33994
+ */
33995
+ invert: [{
33996
+ invert: [invert]
33997
+ }],
33998
+ /**
33999
+ * Saturate
34000
+ * @see https://tailwindcss.com/docs/saturate
34001
+ */
34002
+ saturate: [{
34003
+ saturate: [saturate]
34004
+ }],
34005
+ /**
34006
+ * Sepia
34007
+ * @see https://tailwindcss.com/docs/sepia
34008
+ */
34009
+ sepia: [{
34010
+ sepia: [sepia]
34011
+ }],
34012
+ /**
34013
+ * Backdrop Filter
34014
+ * @deprecated since Tailwind CSS v3.0.0
34015
+ * @see https://tailwindcss.com/docs/backdrop-filter
34016
+ */
34017
+ "backdrop-filter": [{
34018
+ "backdrop-filter": ["", "none"]
34019
+ }],
34020
+ /**
34021
+ * Backdrop Blur
34022
+ * @see https://tailwindcss.com/docs/backdrop-blur
34023
+ */
34024
+ "backdrop-blur": [{
34025
+ "backdrop-blur": [blur]
34026
+ }],
34027
+ /**
34028
+ * Backdrop Brightness
34029
+ * @see https://tailwindcss.com/docs/backdrop-brightness
34030
+ */
34031
+ "backdrop-brightness": [{
34032
+ "backdrop-brightness": [brightness]
34033
+ }],
34034
+ /**
34035
+ * Backdrop Contrast
34036
+ * @see https://tailwindcss.com/docs/backdrop-contrast
34037
+ */
34038
+ "backdrop-contrast": [{
34039
+ "backdrop-contrast": [contrast]
34040
+ }],
34041
+ /**
34042
+ * Backdrop Grayscale
34043
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
34044
+ */
34045
+ "backdrop-grayscale": [{
34046
+ "backdrop-grayscale": [grayscale]
34047
+ }],
34048
+ /**
34049
+ * Backdrop Hue Rotate
34050
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
34051
+ */
34052
+ "backdrop-hue-rotate": [{
34053
+ "backdrop-hue-rotate": [hueRotate]
34054
+ }],
34055
+ /**
34056
+ * Backdrop Invert
34057
+ * @see https://tailwindcss.com/docs/backdrop-invert
34058
+ */
34059
+ "backdrop-invert": [{
34060
+ "backdrop-invert": [invert]
34061
+ }],
34062
+ /**
34063
+ * Backdrop Opacity
34064
+ * @see https://tailwindcss.com/docs/backdrop-opacity
34065
+ */
34066
+ "backdrop-opacity": [{
34067
+ "backdrop-opacity": [opacity]
34068
+ }],
34069
+ /**
34070
+ * Backdrop Saturate
34071
+ * @see https://tailwindcss.com/docs/backdrop-saturate
34072
+ */
34073
+ "backdrop-saturate": [{
34074
+ "backdrop-saturate": [saturate]
34075
+ }],
34076
+ /**
34077
+ * Backdrop Sepia
34078
+ * @see https://tailwindcss.com/docs/backdrop-sepia
34079
+ */
34080
+ "backdrop-sepia": [{
34081
+ "backdrop-sepia": [sepia]
34082
+ }],
34083
+ // Tables
34084
+ /**
34085
+ * Border Collapse
34086
+ * @see https://tailwindcss.com/docs/border-collapse
34087
+ */
34088
+ "border-collapse": [{
34089
+ border: ["collapse", "separate"]
34090
+ }],
34091
+ /**
34092
+ * Border Spacing
34093
+ * @see https://tailwindcss.com/docs/border-spacing
34094
+ */
34095
+ "border-spacing": [{
34096
+ "border-spacing": [borderSpacing]
34097
+ }],
34098
+ /**
34099
+ * Border Spacing X
34100
+ * @see https://tailwindcss.com/docs/border-spacing
34101
+ */
34102
+ "border-spacing-x": [{
34103
+ "border-spacing-x": [borderSpacing]
34104
+ }],
34105
+ /**
34106
+ * Border Spacing Y
34107
+ * @see https://tailwindcss.com/docs/border-spacing
34108
+ */
34109
+ "border-spacing-y": [{
34110
+ "border-spacing-y": [borderSpacing]
34111
+ }],
34112
+ /**
34113
+ * Table Layout
34114
+ * @see https://tailwindcss.com/docs/table-layout
34115
+ */
34116
+ "table-layout": [{
34117
+ table: ["auto", "fixed"]
34118
+ }],
34119
+ /**
34120
+ * Caption Side
34121
+ * @see https://tailwindcss.com/docs/caption-side
34122
+ */
34123
+ caption: [{
34124
+ caption: ["top", "bottom"]
34125
+ }],
34126
+ // Transitions and Animation
34127
+ /**
34128
+ * Tranisition Property
34129
+ * @see https://tailwindcss.com/docs/transition-property
34130
+ */
34131
+ transition: [{
34132
+ transition: ["none", "all", "", "colors", "opacity", "shadow", "transform", isArbitraryValue]
34133
+ }],
34134
+ /**
34135
+ * Transition Duration
34136
+ * @see https://tailwindcss.com/docs/transition-duration
34137
+ */
34138
+ duration: [{
34139
+ duration: getNumberAndArbitrary()
34140
+ }],
34141
+ /**
34142
+ * Transition Timing Function
34143
+ * @see https://tailwindcss.com/docs/transition-timing-function
34144
+ */
34145
+ ease: [{
34146
+ ease: ["linear", "in", "out", "in-out", isArbitraryValue]
34147
+ }],
34148
+ /**
34149
+ * Transition Delay
34150
+ * @see https://tailwindcss.com/docs/transition-delay
34151
+ */
34152
+ delay: [{
34153
+ delay: getNumberAndArbitrary()
34154
+ }],
34155
+ /**
34156
+ * Animation
34157
+ * @see https://tailwindcss.com/docs/animation
34158
+ */
34159
+ animate: [{
34160
+ animate: ["none", "spin", "ping", "pulse", "bounce", isArbitraryValue]
34161
+ }],
34162
+ // Transforms
34163
+ /**
34164
+ * Transform
34165
+ * @see https://tailwindcss.com/docs/transform
34166
+ */
34167
+ transform: [{
34168
+ transform: ["", "gpu", "none"]
34169
+ }],
34170
+ /**
34171
+ * Scale
34172
+ * @see https://tailwindcss.com/docs/scale
34173
+ */
34174
+ scale: [{
34175
+ scale: [scale]
34176
+ }],
34177
+ /**
34178
+ * Scale X
34179
+ * @see https://tailwindcss.com/docs/scale
34180
+ */
34181
+ "scale-x": [{
34182
+ "scale-x": [scale]
34183
+ }],
34184
+ /**
34185
+ * Scale Y
34186
+ * @see https://tailwindcss.com/docs/scale
34187
+ */
34188
+ "scale-y": [{
34189
+ "scale-y": [scale]
34190
+ }],
34191
+ /**
34192
+ * Rotate
34193
+ * @see https://tailwindcss.com/docs/rotate
34194
+ */
34195
+ rotate: [{
34196
+ rotate: [isInteger, isArbitraryValue]
34197
+ }],
34198
+ /**
34199
+ * Translate X
34200
+ * @see https://tailwindcss.com/docs/translate
34201
+ */
34202
+ "translate-x": [{
34203
+ "translate-x": [translate]
34204
+ }],
34205
+ /**
34206
+ * Translate Y
34207
+ * @see https://tailwindcss.com/docs/translate
34208
+ */
34209
+ "translate-y": [{
34210
+ "translate-y": [translate]
34211
+ }],
34212
+ /**
34213
+ * Skew X
34214
+ * @see https://tailwindcss.com/docs/skew
34215
+ */
34216
+ "skew-x": [{
34217
+ "skew-x": [skew]
34218
+ }],
34219
+ /**
34220
+ * Skew Y
34221
+ * @see https://tailwindcss.com/docs/skew
34222
+ */
34223
+ "skew-y": [{
34224
+ "skew-y": [skew]
34225
+ }],
34226
+ /**
34227
+ * Transform Origin
34228
+ * @see https://tailwindcss.com/docs/transform-origin
34229
+ */
34230
+ "transform-origin": [{
34231
+ origin: ["center", "top", "top-right", "right", "bottom-right", "bottom", "bottom-left", "left", "top-left", isArbitraryValue]
34232
+ }],
34233
+ // Interactivity
34234
+ /**
34235
+ * Accent Color
34236
+ * @see https://tailwindcss.com/docs/accent-color
34237
+ */
34238
+ accent: [{
34239
+ accent: ["auto", colors]
34240
+ }],
34241
+ /**
34242
+ * Appearance
34243
+ * @see https://tailwindcss.com/docs/appearance
34244
+ */
34245
+ appearance: [{
34246
+ appearance: ["none", "auto"]
34247
+ }],
34248
+ /**
34249
+ * Cursor
34250
+ * @see https://tailwindcss.com/docs/cursor
34251
+ */
34252
+ cursor: [{
34253
+ 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]
34254
+ }],
34255
+ /**
34256
+ * Caret Color
34257
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
34258
+ */
34259
+ "caret-color": [{
34260
+ caret: [colors]
34261
+ }],
34262
+ /**
34263
+ * Pointer Events
34264
+ * @see https://tailwindcss.com/docs/pointer-events
34265
+ */
34266
+ "pointer-events": [{
34267
+ "pointer-events": ["none", "auto"]
34268
+ }],
34269
+ /**
34270
+ * Resize
34271
+ * @see https://tailwindcss.com/docs/resize
34272
+ */
34273
+ resize: [{
34274
+ resize: ["none", "y", "x", ""]
34275
+ }],
34276
+ /**
34277
+ * Scroll Behavior
34278
+ * @see https://tailwindcss.com/docs/scroll-behavior
34279
+ */
34280
+ "scroll-behavior": [{
34281
+ scroll: ["auto", "smooth"]
34282
+ }],
34283
+ /**
34284
+ * Scroll Margin
34285
+ * @see https://tailwindcss.com/docs/scroll-margin
34286
+ */
34287
+ "scroll-m": [{
34288
+ "scroll-m": getSpacingWithArbitrary()
34289
+ }],
34290
+ /**
34291
+ * Scroll Margin X
34292
+ * @see https://tailwindcss.com/docs/scroll-margin
34293
+ */
34294
+ "scroll-mx": [{
34295
+ "scroll-mx": getSpacingWithArbitrary()
34296
+ }],
34297
+ /**
34298
+ * Scroll Margin Y
34299
+ * @see https://tailwindcss.com/docs/scroll-margin
34300
+ */
34301
+ "scroll-my": [{
34302
+ "scroll-my": getSpacingWithArbitrary()
34303
+ }],
34304
+ /**
34305
+ * Scroll Margin Start
34306
+ * @see https://tailwindcss.com/docs/scroll-margin
34307
+ */
34308
+ "scroll-ms": [{
34309
+ "scroll-ms": getSpacingWithArbitrary()
34310
+ }],
34311
+ /**
34312
+ * Scroll Margin End
34313
+ * @see https://tailwindcss.com/docs/scroll-margin
34314
+ */
34315
+ "scroll-me": [{
34316
+ "scroll-me": getSpacingWithArbitrary()
34317
+ }],
34318
+ /**
34319
+ * Scroll Margin Top
34320
+ * @see https://tailwindcss.com/docs/scroll-margin
34321
+ */
34322
+ "scroll-mt": [{
34323
+ "scroll-mt": getSpacingWithArbitrary()
34324
+ }],
34325
+ /**
34326
+ * Scroll Margin Right
34327
+ * @see https://tailwindcss.com/docs/scroll-margin
34328
+ */
34329
+ "scroll-mr": [{
34330
+ "scroll-mr": getSpacingWithArbitrary()
34331
+ }],
34332
+ /**
34333
+ * Scroll Margin Bottom
34334
+ * @see https://tailwindcss.com/docs/scroll-margin
34335
+ */
34336
+ "scroll-mb": [{
34337
+ "scroll-mb": getSpacingWithArbitrary()
34338
+ }],
34339
+ /**
34340
+ * Scroll Margin Left
34341
+ * @see https://tailwindcss.com/docs/scroll-margin
34342
+ */
34343
+ "scroll-ml": [{
34344
+ "scroll-ml": getSpacingWithArbitrary()
34345
+ }],
34346
+ /**
34347
+ * Scroll Padding
34348
+ * @see https://tailwindcss.com/docs/scroll-padding
34349
+ */
34350
+ "scroll-p": [{
34351
+ "scroll-p": getSpacingWithArbitrary()
34352
+ }],
34353
+ /**
34354
+ * Scroll Padding X
34355
+ * @see https://tailwindcss.com/docs/scroll-padding
34356
+ */
34357
+ "scroll-px": [{
34358
+ "scroll-px": getSpacingWithArbitrary()
34359
+ }],
34360
+ /**
34361
+ * Scroll Padding Y
34362
+ * @see https://tailwindcss.com/docs/scroll-padding
34363
+ */
34364
+ "scroll-py": [{
34365
+ "scroll-py": getSpacingWithArbitrary()
34366
+ }],
34367
+ /**
34368
+ * Scroll Padding Start
34369
+ * @see https://tailwindcss.com/docs/scroll-padding
34370
+ */
34371
+ "scroll-ps": [{
34372
+ "scroll-ps": getSpacingWithArbitrary()
34373
+ }],
34374
+ /**
34375
+ * Scroll Padding End
34376
+ * @see https://tailwindcss.com/docs/scroll-padding
34377
+ */
34378
+ "scroll-pe": [{
34379
+ "scroll-pe": getSpacingWithArbitrary()
34380
+ }],
34381
+ /**
34382
+ * Scroll Padding Top
34383
+ * @see https://tailwindcss.com/docs/scroll-padding
34384
+ */
34385
+ "scroll-pt": [{
34386
+ "scroll-pt": getSpacingWithArbitrary()
34387
+ }],
34388
+ /**
34389
+ * Scroll Padding Right
34390
+ * @see https://tailwindcss.com/docs/scroll-padding
34391
+ */
34392
+ "scroll-pr": [{
34393
+ "scroll-pr": getSpacingWithArbitrary()
34394
+ }],
34395
+ /**
34396
+ * Scroll Padding Bottom
34397
+ * @see https://tailwindcss.com/docs/scroll-padding
34398
+ */
34399
+ "scroll-pb": [{
34400
+ "scroll-pb": getSpacingWithArbitrary()
34401
+ }],
34402
+ /**
34403
+ * Scroll Padding Left
34404
+ * @see https://tailwindcss.com/docs/scroll-padding
34405
+ */
34406
+ "scroll-pl": [{
34407
+ "scroll-pl": getSpacingWithArbitrary()
34408
+ }],
34409
+ /**
34410
+ * Scroll Snap Align
34411
+ * @see https://tailwindcss.com/docs/scroll-snap-align
34412
+ */
34413
+ "snap-align": [{
34414
+ snap: ["start", "end", "center", "align-none"]
34415
+ }],
34416
+ /**
34417
+ * Scroll Snap Stop
34418
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
34419
+ */
34420
+ "snap-stop": [{
34421
+ snap: ["normal", "always"]
34422
+ }],
34423
+ /**
34424
+ * Scroll Snap Type
34425
+ * @see https://tailwindcss.com/docs/scroll-snap-type
34426
+ */
34427
+ "snap-type": [{
34428
+ snap: ["none", "x", "y", "both"]
34429
+ }],
34430
+ /**
34431
+ * Scroll Snap Type Strictness
34432
+ * @see https://tailwindcss.com/docs/scroll-snap-type
34433
+ */
34434
+ "snap-strictness": [{
34435
+ snap: ["mandatory", "proximity"]
34436
+ }],
34437
+ /**
34438
+ * Touch Action
34439
+ * @see https://tailwindcss.com/docs/touch-action
34440
+ */
34441
+ touch: [{
34442
+ touch: ["auto", "none", "manipulation"]
34443
+ }],
34444
+ /**
34445
+ * Touch Action X
34446
+ * @see https://tailwindcss.com/docs/touch-action
34447
+ */
34448
+ "touch-x": [{
34449
+ "touch-pan": ["x", "left", "right"]
34450
+ }],
34451
+ /**
34452
+ * Touch Action Y
34453
+ * @see https://tailwindcss.com/docs/touch-action
34454
+ */
34455
+ "touch-y": [{
34456
+ "touch-pan": ["y", "up", "down"]
34457
+ }],
34458
+ /**
34459
+ * Touch Action Pinch Zoom
34460
+ * @see https://tailwindcss.com/docs/touch-action
34461
+ */
34462
+ "touch-pz": ["touch-pinch-zoom"],
34463
+ /**
34464
+ * User Select
34465
+ * @see https://tailwindcss.com/docs/user-select
34466
+ */
34467
+ select: [{
34468
+ select: ["none", "text", "all", "auto"]
34469
+ }],
34470
+ /**
34471
+ * Will Change
34472
+ * @see https://tailwindcss.com/docs/will-change
34473
+ */
34474
+ "will-change": [{
34475
+ "will-change": ["auto", "scroll", "contents", "transform", isArbitraryValue]
34476
+ }],
34477
+ // SVG
34478
+ /**
34479
+ * Fill
34480
+ * @see https://tailwindcss.com/docs/fill
34481
+ */
34482
+ fill: [{
34483
+ fill: [colors, "none"]
34484
+ }],
34485
+ /**
34486
+ * Stroke Width
34487
+ * @see https://tailwindcss.com/docs/stroke-width
34488
+ */
34489
+ "stroke-w": [{
34490
+ stroke: [isLength, isArbitraryLength, isArbitraryNumber]
34491
+ }],
34492
+ /**
34493
+ * Stroke
34494
+ * @see https://tailwindcss.com/docs/stroke
34495
+ */
34496
+ stroke: [{
34497
+ stroke: [colors, "none"]
34498
+ }],
34499
+ // Accessibility
34500
+ /**
34501
+ * Screen Readers
34502
+ * @see https://tailwindcss.com/docs/screen-readers
34503
+ */
34504
+ sr: ["sr-only", "not-sr-only"],
34505
+ /**
34506
+ * Forced Color Adjust
34507
+ * @see https://tailwindcss.com/docs/forced-color-adjust
34508
+ */
34509
+ "forced-color-adjust": [{
34510
+ "forced-color-adjust": ["auto", "none"]
34511
+ }]
34512
+ },
34513
+ conflictingClassGroups: {
34514
+ overflow: ["overflow-x", "overflow-y"],
34515
+ overscroll: ["overscroll-x", "overscroll-y"],
34516
+ inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
34517
+ "inset-x": ["right", "left"],
34518
+ "inset-y": ["top", "bottom"],
34519
+ flex: ["basis", "grow", "shrink"],
34520
+ gap: ["gap-x", "gap-y"],
34521
+ p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
34522
+ px: ["pr", "pl"],
34523
+ py: ["pt", "pb"],
34524
+ m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
34525
+ mx: ["mr", "ml"],
34526
+ my: ["mt", "mb"],
34527
+ size: ["w", "h"],
34528
+ "font-size": ["leading"],
34529
+ "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
34530
+ "fvn-ordinal": ["fvn-normal"],
34531
+ "fvn-slashed-zero": ["fvn-normal"],
34532
+ "fvn-figure": ["fvn-normal"],
34533
+ "fvn-spacing": ["fvn-normal"],
34534
+ "fvn-fraction": ["fvn-normal"],
34535
+ "line-clamp": ["display", "overflow"],
34536
+ 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"],
34537
+ "rounded-s": ["rounded-ss", "rounded-es"],
34538
+ "rounded-e": ["rounded-se", "rounded-ee"],
34539
+ "rounded-t": ["rounded-tl", "rounded-tr"],
34540
+ "rounded-r": ["rounded-tr", "rounded-br"],
34541
+ "rounded-b": ["rounded-br", "rounded-bl"],
34542
+ "rounded-l": ["rounded-tl", "rounded-bl"],
34543
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
34544
+ "border-w": ["border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
34545
+ "border-w-x": ["border-w-r", "border-w-l"],
34546
+ "border-w-y": ["border-w-t", "border-w-b"],
34547
+ "border-color": ["border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
34548
+ "border-color-x": ["border-color-r", "border-color-l"],
34549
+ "border-color-y": ["border-color-t", "border-color-b"],
34550
+ "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
34551
+ "scroll-mx": ["scroll-mr", "scroll-ml"],
34552
+ "scroll-my": ["scroll-mt", "scroll-mb"],
34553
+ "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
34554
+ "scroll-px": ["scroll-pr", "scroll-pl"],
34555
+ "scroll-py": ["scroll-pt", "scroll-pb"],
34556
+ touch: ["touch-x", "touch-y", "touch-pz"],
34557
+ "touch-x": ["touch"],
34558
+ "touch-y": ["touch"],
34559
+ "touch-pz": ["touch"]
34560
+ },
34561
+ conflictingClassGroupModifiers: {
34562
+ "font-size": ["leading"]
34563
+ }
34564
+ };
34565
+ };
34566
+ var mergeConfigs = (baseConfig, {
34567
+ cacheSize,
34568
+ prefix,
34569
+ separator,
34570
+ experimentalParseClassName,
34571
+ extend: extend2 = {},
34572
+ override = {}
34573
+ }) => {
34574
+ overrideProperty(baseConfig, "cacheSize", cacheSize);
34575
+ overrideProperty(baseConfig, "prefix", prefix);
34576
+ overrideProperty(baseConfig, "separator", separator);
34577
+ overrideProperty(baseConfig, "experimentalParseClassName", experimentalParseClassName);
34578
+ for (const configKey in override) {
34579
+ overrideConfigProperties(baseConfig[configKey], override[configKey]);
34580
+ }
34581
+ for (const key in extend2) {
34582
+ mergeConfigProperties(baseConfig[key], extend2[key]);
34583
+ }
34584
+ return baseConfig;
34585
+ };
34586
+ var overrideProperty = (baseObject, overrideKey, overrideValue) => {
34587
+ if (overrideValue !== void 0) {
34588
+ baseObject[overrideKey] = overrideValue;
34589
+ }
34590
+ };
34591
+ var overrideConfigProperties = (baseObject, overrideObject) => {
34592
+ if (overrideObject) {
34593
+ for (const key in overrideObject) {
34594
+ overrideProperty(baseObject, key, overrideObject[key]);
34595
+ }
34596
+ }
34597
+ };
34598
+ var mergeConfigProperties = (baseObject, mergeObject) => {
34599
+ if (mergeObject) {
34600
+ for (const key in mergeObject) {
34601
+ const mergeValue = mergeObject[key];
34602
+ if (mergeValue !== void 0) {
34603
+ baseObject[key] = (baseObject[key] || []).concat(mergeValue);
34604
+ }
34605
+ }
34606
+ }
34607
+ };
34608
+ var extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === "function" ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);
34609
+
34610
+ // ../common/src/utils.ts
34611
+ var twMerge = extendTailwindMerge({ extend: { classGroups: TYPO_CLASS_GROUPS } });
34612
+
34613
+ // src/server.ts
34614
+ var WebsocketHub = class {
34615
+ httpServer;
34616
+ wss;
34617
+ clients = /* @__PURE__ */ new Set();
34618
+ state = /* @__PURE__ */ new Map();
34619
+ logs = [];
34620
+ messageHandlers = [];
34621
+ heartbeatInterval;
34622
+ statusTimer = null;
34623
+ statusDirty = false;
34624
+ constructor(config2) {
34625
+ this.httpServer = import_node_http.default.createServer((req, res) => {
34626
+ if (req.method === "GET" && req.url === "/health") {
34627
+ res.writeHead(200, { "Content-Type": "application/json" });
34628
+ res.end(JSON.stringify({ ok: true, clients: this.clients.size }));
34629
+ return;
34630
+ }
34631
+ res.writeHead(404);
34632
+ res.end();
34633
+ });
34634
+ this.wss = new import_ws.WebSocketServer({ server: this.httpServer });
34635
+ this.heartbeatInterval = setInterval(() => this.heartbeat(), 3e4);
34636
+ this.wss.on("close", () => clearInterval(this.heartbeatInterval));
34637
+ this.wss.on("connection", (socket) => this.handleConnection(socket));
34638
+ this.httpServer.listen(config2.port);
34639
+ }
34640
+ heartbeat() {
34641
+ let terminated = false;
34642
+ this.clients.forEach((client) => {
34643
+ if (!client.alive) {
34644
+ client.ws.terminate();
34645
+ this.clients.delete(client);
34646
+ terminated = true;
34647
+ return;
34648
+ }
34649
+ client.alive = false;
34650
+ client.ws.ping();
34651
+ });
34652
+ if (terminated) this.broadcastStatus();
34653
+ }
34654
+ handleConnection(socket) {
34655
+ const client = {
34656
+ id: "unknown",
34657
+ app: "unknown",
34658
+ ws: socket,
34659
+ channels: /* @__PURE__ */ new Set(),
34660
+ alive: true
34661
+ };
34662
+ this.clients.add(client);
34663
+ socket.on("error", () => {
34664
+ });
34665
+ socket.on("pong", () => {
34666
+ client.alive = true;
34667
+ });
34668
+ socket.on("message", (raw) => {
34669
+ let message;
34670
+ try {
34671
+ message = JSON.parse(raw.toString());
34672
+ } catch {
34673
+ return;
34674
+ }
34675
+ this.handleMessage(client, socket, message);
34676
+ });
34677
+ socket.on("close", () => {
34678
+ this.clients.delete(client);
34679
+ this.addLog(client, "DISCONNECT" /* DISCONNECT */, "");
34680
+ this.broadcastStatus();
34681
+ });
34682
+ }
34683
+ handleMessage(client, socket, message) {
34684
+ switch (message.type) {
34685
+ case "IDENTIFY" /* IDENTIFY */: {
34686
+ const existing = [...this.clients].find((c) => c.id === message.id && c !== client);
34687
+ if (existing) {
34688
+ existing.ws.close(4e3);
34689
+ this.clients.delete(existing);
34690
+ }
34691
+ client.id = message.id;
34692
+ client.app = message.app;
34693
+ this.addLog(client, "CONNECT" /* CONNECT */, "");
34694
+ this.broadcastStatus();
34695
+ break;
34696
+ }
34697
+ case "SUBSCRIBE" /* SUBSCRIBE */: {
34698
+ message.channels.forEach((channel) => {
34699
+ client.channels.add(channel);
34700
+ if (this.state.has(channel)) {
34701
+ const stateMessage = {
34702
+ type: "STATE" /* STATE */,
34703
+ channel,
34704
+ data: this.state.get(channel)
34705
+ };
34706
+ socket.send(JSON.stringify(stateMessage));
34707
+ }
34708
+ });
34709
+ this.addLog(client, "SUBSCRIBE" /* SUBSCRIBE */, message.channels.join(", "));
34710
+ this.broadcastStatus();
34711
+ break;
34712
+ }
34713
+ case "UNSUBSCRIBE" /* UNSUBSCRIBE */: {
34714
+ message.channels.forEach((channel) => client.channels.delete(channel));
34715
+ this.addLog(client, "UNSUBSCRIBE" /* UNSUBSCRIBE */, message.channels.join(", "));
34716
+ this.broadcastStatus();
34717
+ break;
34718
+ }
34719
+ case "MESSAGE" /* MESSAGE */: {
34720
+ const outgoing = {
34721
+ type: "MESSAGE" /* MESSAGE */,
34722
+ channel: message.channel,
34723
+ data: message.data
34724
+ };
34725
+ this.broadcast(client, message.channel, outgoing);
34726
+ this.messageHandlers.forEach((h) => h(message.channel, message.data));
34727
+ this.addLog(client, "MESSAGE" /* MESSAGE */, message.channel, message.data);
34728
+ this.broadcastStatus();
34729
+ break;
34730
+ }
34731
+ case "STATE" /* STATE */: {
34732
+ this.state.set(message.channel, message.data);
34733
+ const outgoing = {
34734
+ type: "STATE" /* STATE */,
34735
+ channel: message.channel,
34736
+ data: message.data
34737
+ };
34738
+ this.broadcast(client, message.channel, outgoing);
34739
+ this.messageHandlers.forEach((h) => h(message.channel, message.data));
34740
+ this.addLog(client, "STATE" /* STATE */, message.channel, message.data);
34741
+ this.broadcastStatus();
34742
+ break;
34743
+ }
34744
+ }
34745
+ }
34746
+ addLog(client, type, channel, data) {
34747
+ this.logs.push({ timestamp: Date.now(), sender: client.id, app: client.app, type, channel, data });
34748
+ if (this.logs.length > 808) this.logs.shift();
34749
+ }
34750
+ broadcast(sender, channel, message) {
34751
+ const payload = JSON.stringify(message);
34752
+ this.clients.forEach((client) => {
34753
+ if (client !== sender && client.channels.has(channel) && client.ws.readyState === import_ws.WebSocket.OPEN) {
34754
+ client.ws.send(payload);
34755
+ }
34756
+ });
34757
+ }
34758
+ broadcastStatus() {
34759
+ if (this.statusTimer) {
34760
+ this.statusDirty = true;
34761
+ return;
34762
+ }
34763
+ this.sendStatus();
34764
+ this.statusTimer = setTimeout(() => {
34765
+ this.statusTimer = null;
34766
+ if (!this.statusDirty) return;
34767
+ this.statusDirty = false;
34768
+ this.broadcastStatus();
34769
+ }, 200);
34770
+ }
34771
+ sendStatus() {
32211
34772
  const status = {
32212
34773
  clients: [...this.clients].map((client) => ({ id: client.id, app: client.app, channels: [...client.channels] })),
32213
34774
  state: Object.fromEntries([...this.state].filter(([k2]) => k2 !== WEBSOCKET_HUB_CHANNEL)),
@@ -32234,6 +34795,7 @@ var WebsocketHub = class {
32234
34795
  }
32235
34796
  close() {
32236
34797
  clearInterval(this.heartbeatInterval);
34798
+ if (this.statusTimer) clearTimeout(this.statusTimer);
32237
34799
  this.clients.forEach((client) => {
32238
34800
  if (client.ws.readyState === import_ws.WebSocket.OPEN) {
32239
34801
  client.ws.close(1001, "Hub shutting down");