mado-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +274 -0
  3. package/css/index.css +5829 -0
  4. package/dist/components/button.d.ts +21 -0
  5. package/dist/components/form/index.d.ts +30 -0
  6. package/dist/components/form/input/index.d.ts +36 -0
  7. package/dist/components/form/submit-button.d.ts +20 -0
  8. package/dist/components/ghost.d.ts +4 -0
  9. package/dist/components/heading.d.ts +11 -0
  10. package/dist/components/index.d.ts +8 -0
  11. package/dist/components/link.d.ts +51 -0
  12. package/dist/components/mado-ui-provider.d.ts +1 -0
  13. package/dist/components/modal.d.ts +19 -0
  14. package/dist/components/time.d.ts +16 -0
  15. package/dist/hooks/create-fast-context.d.ts +7 -0
  16. package/dist/hooks/index.d.ts +4 -0
  17. package/dist/hooks/use-anime-scope.d.ts +15 -0
  18. package/dist/hooks/use-form-context.d.ts +30 -0
  19. package/dist/hooks/use-form-status.d.ts +7 -0
  20. package/dist/icons/3-people.d.ts +2 -0
  21. package/dist/icons/3-rectangles-desktop-fill.d.ts +2 -0
  22. package/dist/icons/3-rectangles-desktop.d.ts +2 -0
  23. package/dist/icons/airplane.d.ts +2 -0
  24. package/dist/icons/arrow-triangle-2-circlepath-circle-fill.d.ts +2 -0
  25. package/dist/icons/arrow-triangle-2-circlepath-circle.d.ts +2 -0
  26. package/dist/icons/bag-fill.d.ts +2 -0
  27. package/dist/icons/banknote.d.ts +2 -0
  28. package/dist/icons/bell-fill.d.ts +2 -0
  29. package/dist/icons/bolt-car.d.ts +2 -0
  30. package/dist/icons/bolt-fill.d.ts +2 -0
  31. package/dist/icons/bolt-ring-closed.d.ts +2 -0
  32. package/dist/icons/bolt-trianglebadge-exclamationmark.d.ts +2 -0
  33. package/dist/icons/book-fill.d.ts +2 -0
  34. package/dist/icons/bookmark-fill.d.ts +2 -0
  35. package/dist/icons/briefcase-fill.d.ts +2 -0
  36. package/dist/icons/bubble-left-fill.d.ts +2 -0
  37. package/dist/icons/building-2-fill.d.ts +2 -0
  38. package/dist/icons/calendar.d.ts +2 -0
  39. package/dist/icons/camera-fill.d.ts +2 -0
  40. package/dist/icons/car-fill.d.ts +2 -0
  41. package/dist/icons/cart-fill.d.ts +2 -0
  42. package/dist/icons/chart-bar-doc-horizontal.d.ts +2 -0
  43. package/dist/icons/checkmark-seal.d.ts +2 -0
  44. package/dist/icons/checkmark.d.ts +2 -0
  45. package/dist/icons/chevron-compact-down.d.ts +2 -0
  46. package/dist/icons/chevron-down.d.ts +2 -0
  47. package/dist/icons/chevron-left-forwardslash-chevron-right.d.ts +2 -0
  48. package/dist/icons/chevron-left.d.ts +2 -0
  49. package/dist/icons/chevron-right.d.ts +2 -0
  50. package/dist/icons/chevron-up-chevron-down.d.ts +2 -0
  51. package/dist/icons/circle-fill.d.ts +2 -0
  52. package/dist/icons/clock-badge-checkmark.d.ts +2 -0
  53. package/dist/icons/clock-fill.d.ts +2 -0
  54. package/dist/icons/cloud-fill.d.ts +2 -0
  55. package/dist/icons/cube-fill.d.ts +2 -0
  56. package/dist/icons/curve-point-left.d.ts +2 -0
  57. package/dist/icons/dial-high.d.ts +2 -0
  58. package/dist/icons/doc-fill.d.ts +2 -0
  59. package/dist/icons/doc-on-clipboard.d.ts +2 -0
  60. package/dist/icons/doc-on-doc-fill.d.ts +2 -0
  61. package/dist/icons/doc-on-doc.d.ts +2 -0
  62. package/dist/icons/doc-text-magnifyingglass.d.ts +2 -0
  63. package/dist/icons/dollar-sign.d.ts +2 -0
  64. package/dist/icons/ellipsis-circle-fill.d.ts +2 -0
  65. package/dist/icons/ellipsis-circle.d.ts +2 -0
  66. package/dist/icons/envelope-fill.d.ts +2 -0
  67. package/dist/icons/envelope.d.ts +2 -0
  68. package/dist/icons/exclamationmark-octagon.d.ts +2 -0
  69. package/dist/icons/eye.d.ts +2 -0
  70. package/dist/icons/figure-water-fitness.d.ts +2 -0
  71. package/dist/icons/flag-fill.d.ts +2 -0
  72. package/dist/icons/flame-fill.d.ts +2 -0
  73. package/dist/icons/folder-fill.d.ts +2 -0
  74. package/dist/icons/folder.d.ts +2 -0
  75. package/dist/icons/gearshape-fill.d.ts +2 -0
  76. package/dist/icons/gearshape.d.ts +2 -0
  77. package/dist/icons/gift-fill.d.ts +2 -0
  78. package/dist/icons/globe-americas-fill.d.ts +2 -0
  79. package/dist/icons/hare-fill.d.ts +2 -0
  80. package/dist/icons/house-deskclock.d.ts +2 -0
  81. package/dist/icons/house-fill.d.ts +2 -0
  82. package/dist/icons/house.d.ts +2 -0
  83. package/dist/icons/index.d.ts +104 -0
  84. package/dist/icons/iphone-house.d.ts +2 -0
  85. package/dist/icons/light-ribbon.d.ts +2 -0
  86. package/dist/icons/lightbulb-fill.d.ts +2 -0
  87. package/dist/icons/lightbulb-led.d.ts +2 -0
  88. package/dist/icons/list-bullet-clipboard-fill.d.ts +2 -0
  89. package/dist/icons/magnifyingglass.d.ts +2 -0
  90. package/dist/icons/map-pin-ellipse.d.ts +2 -0
  91. package/dist/icons/minus-plus-batterblock.d.ts +2 -0
  92. package/dist/icons/network-shield.d.ts +2 -0
  93. package/dist/icons/network.d.ts +2 -0
  94. package/dist/icons/newspaper-fill.d.ts +2 -0
  95. package/dist/icons/number.d.ts +2 -0
  96. package/dist/icons/paperplane-fill.d.ts +2 -0
  97. package/dist/icons/person-crop-square.d.ts +2 -0
  98. package/dist/icons/person-fill-questionmark.d.ts +2 -0
  99. package/dist/icons/person-fill.d.ts +2 -0
  100. package/dist/icons/person.d.ts +2 -0
  101. package/dist/icons/phone-arrow-up-right.d.ts +2 -0
  102. package/dist/icons/phone-fill.d.ts +2 -0
  103. package/dist/icons/phone.d.ts +2 -0
  104. package/dist/icons/play-rectangle-fill.d.ts +2 -0
  105. package/dist/icons/plus.d.ts +2 -0
  106. package/dist/icons/qrcode.d.ts +2 -0
  107. package/dist/icons/rectangle-portrait-and-arrow-left-fill.d.ts +2 -0
  108. package/dist/icons/rectangle-portrait-and-arrow-left.d.ts +2 -0
  109. package/dist/icons/sensor.d.ts +2 -0
  110. package/dist/icons/signature.d.ts +2 -0
  111. package/dist/icons/solar-panel.d.ts +2 -0
  112. package/dist/icons/square-and-arrow-down-fill.d.ts +2 -0
  113. package/dist/icons/square-and-arrow-down.d.ts +2 -0
  114. package/dist/icons/square-and-arrow-up-fill.d.ts +2 -0
  115. package/dist/icons/square-and-arrow-up.d.ts +2 -0
  116. package/dist/icons/square-and-pencil-fill.d.ts +2 -0
  117. package/dist/icons/square-and-pencil.d.ts +2 -0
  118. package/dist/icons/text-bubble.d.ts +2 -0
  119. package/dist/icons/trash-fill.d.ts +2 -0
  120. package/dist/icons/trash.d.ts +2 -0
  121. package/dist/icons/tree.d.ts +2 -0
  122. package/dist/icons/umbrella-fill.d.ts +2 -0
  123. package/dist/icons/xmark.d.ts +2 -0
  124. package/dist/index.d.ts +3 -0
  125. package/dist/index.esm.js +1168 -0
  126. package/dist/index.esm.js.map +1 -0
  127. package/dist/index.js +1186 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/types/index.d.ts +2 -0
  130. package/dist/types/utils.d.ts +18 -0
  131. package/dist/utils/class-management.d.ts +29 -0
  132. package/dist/utils/custom-tailwind-merge.d.ts +4 -0
  133. package/dist/utils/get-date.d.ts +153 -0
  134. package/dist/utils/helpers.d.ts +2 -0
  135. package/dist/utils/index.d.ts +9 -0
  136. package/dist/utils/math.d.ts +1 -0
  137. package/dist/utils/regex.d.ts +12 -0
  138. package/dist/utils/string-manipulation.d.ts +17 -0
  139. package/dist/utils/tw-sort.d.ts +1 -0
  140. package/package.json +63 -0
package/dist/index.js ADDED
@@ -0,0 +1,1186 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var tailwindMerge = require('tailwind-merge');
5
+ var react = require('react');
6
+ var react$1 = require('@headlessui/react');
7
+ var reactDom = require('react-dom');
8
+
9
+ const integerList = Array.from({ length: 100 }, (_, i) => `${i + 1}`);
10
+ const twMerge = tailwindMerge.extendTailwindMerge({
11
+ extend: {
12
+ theme: {
13
+ color: [
14
+ {
15
+ ui: [
16
+ 'red',
17
+ 'orange',
18
+ 'yellow',
19
+ 'green',
20
+ 'sky-blue',
21
+ 'blue',
22
+ 'violet',
23
+ 'magenta',
24
+ 'purple',
25
+ 'brown',
26
+ 'grey',
27
+ 'pink',
28
+ ],
29
+ },
30
+ ],
31
+ },
32
+ classGroups: {
33
+ animate: [
34
+ {
35
+ animate: [
36
+ 'bounce',
37
+ 'double-spin',
38
+ 'drop-in',
39
+ 'flip',
40
+ 'flip-again',
41
+ 'grid-rows',
42
+ 'heartbeat',
43
+ 'ping',
44
+ 'pulse',
45
+ 'slide-up',
46
+ 'spin',
47
+ 'wave',
48
+ ],
49
+ },
50
+ ],
51
+ 'animation-direction': [
52
+ {
53
+ 'animation-direction': ['normal', 'reverse', 'alternate', 'alternate-reverse'],
54
+ },
55
+ ],
56
+ 'animation-fill': [
57
+ {
58
+ 'animation-fill': ['none', 'forwards', 'backwards', 'both'],
59
+ },
60
+ ],
61
+ 'animation-iteration': [
62
+ {
63
+ 'animation-iteration': [...integerList, 'infinite'],
64
+ },
65
+ ],
66
+ 'animation-state': [
67
+ {
68
+ 'animation-state': ['running', 'paused'],
69
+ },
70
+ ],
71
+ 'grid-cols': [
72
+ {
73
+ 'grid-cols': ['0fr', '1fr'],
74
+ },
75
+ ],
76
+ 'grid-rows': [
77
+ {
78
+ 'grid-rows': ['0fr', '1fr'],
79
+ },
80
+ ],
81
+ transition: ['transition-rows'],
82
+ },
83
+ },
84
+ });
85
+
86
+ /** The current date as a Date object */
87
+ const d = new Date();
88
+ /** The current minute of the current hour */
89
+ const minutes = d.getMinutes();
90
+ /** The current year */
91
+ d.getFullYear();
92
+ /** An array of the names of month in order */
93
+ const monthNamesList = [
94
+ 'January',
95
+ 'February',
96
+ 'March',
97
+ 'April',
98
+ 'May',
99
+ 'June',
100
+ 'July',
101
+ 'August',
102
+ 'September',
103
+ 'October',
104
+ 'November',
105
+ 'December',
106
+ ];
107
+ /** An array of the names of the days of the week in order */
108
+ const weekdayNamesList = [
109
+ 'Sunday',
110
+ 'Monday',
111
+ 'Tuesday',
112
+ 'Wednesday',
113
+ 'Thursday',
114
+ 'Friday',
115
+ 'Saturday',
116
+ ];
117
+ /** The name of the current month */
118
+ getMonthName();
119
+ /** The name of the current day of the week */
120
+ getWeekdayName();
121
+ /**
122
+ * ### Get Date
123
+ * - Returns the date with two digits
124
+ * @param {number|Date} date The date to get date
125
+ * @returns {string} The date with two digits
126
+ */
127
+ function getDate(date = d) {
128
+ if (typeof date !== 'number')
129
+ date = date.getDate();
130
+ let formattedDate = date.toString();
131
+ if (formattedDate.length === 1)
132
+ formattedDate = `0${formattedDate}`;
133
+ return formattedDate;
134
+ }
135
+ /**
136
+ * ### Get Hours
137
+ * - Returns the hours with two digits
138
+ * @param {number|Date} hours The date to get hours
139
+ * @returns {string} The hours with two digits
140
+ */
141
+ function getHours(hours = d) {
142
+ if (typeof hours !== 'number')
143
+ hours = hours.getHours();
144
+ let formattedHours = hours.toString();
145
+ if (formattedHours.length === 1)
146
+ formattedHours = `0${formattedHours}`;
147
+ return formattedHours;
148
+ }
149
+ /**
150
+ * ### Get Milliseconds
151
+ * - Returns the milliseconds with two digits
152
+ * @param {number|Date} milliseconds The date to get milliseconds
153
+ * @returns {string} The milliseconds with two digits
154
+ */
155
+ function getMilliseconds(milliseconds = d) {
156
+ if (typeof milliseconds !== 'number')
157
+ milliseconds = milliseconds.getMilliseconds();
158
+ let formattedMilliseconds = minutes.toString();
159
+ if (formattedMilliseconds.length === 1)
160
+ formattedMilliseconds = `0${formattedMilliseconds}`;
161
+ return formattedMilliseconds;
162
+ }
163
+ /**
164
+ * ### Get Minutes
165
+ * - Returns the minutes with two digits
166
+ * @param {number|Date} minutes The date to get minutes
167
+ * @returns {string} The minutes with two digits
168
+ */
169
+ function getMinutes(minutes = d) {
170
+ if (typeof minutes !== 'number')
171
+ minutes = minutes.getMinutes();
172
+ let formattedMinutes = minutes.toString();
173
+ if (formattedMinutes.length === 1)
174
+ formattedMinutes = `0${formattedMinutes}`;
175
+ return formattedMinutes;
176
+ }
177
+ /**
178
+ * ### Get Month
179
+ * - Returns the month with two digits
180
+ * @param {number|Date} month The date to get month
181
+ * @returns {string} The month with two digits
182
+ */
183
+ function getMonth(month = d) {
184
+ if (typeof month !== 'number')
185
+ month = month.getMonth() + 1;
186
+ let formattedMonth = month.toString();
187
+ if (formattedMonth.length === 1)
188
+ formattedMonth = `0${formattedMonth}`;
189
+ return formattedMonth;
190
+ }
191
+ /**
192
+ * ### Get Month Name
193
+ * - Returns the name of the specified month
194
+ * @param {Date} date A Date object representing the month to get the name of the month from. (Preset to the current date)
195
+ * @returns {MonthName} The name of the specified month
196
+ */
197
+ function getMonthName(date = d) {
198
+ if (typeof date === 'number')
199
+ return monthNamesList[date];
200
+ return monthNamesList[date.getMonth()];
201
+ }
202
+ /**
203
+ * ### Get Seconds
204
+ * - Returns the seconds with two digits
205
+ * @param {number|Date} seconds The date to get seconds
206
+ * @returns {string} The seconds with two digits
207
+ */
208
+ function getSeconds(seconds = d) {
209
+ if (typeof seconds !== 'number')
210
+ seconds = seconds.getSeconds();
211
+ let formattedSeconds = seconds.toString();
212
+ if (formattedSeconds.length === 1)
213
+ formattedSeconds = `0${formattedSeconds}`;
214
+ return formattedSeconds;
215
+ }
216
+ /**
217
+ * ### Get Weekday Name
218
+ * - Returns the weekday name of the specified day
219
+ * @param {number | Date} weekday A Date object or number representing the day to get the weekday name from. (Preset to the current date)
220
+ * @returns {WeekdayName} The name of the specified weekday
221
+ */
222
+ function getWeekdayName(weekday = d) {
223
+ if (typeof weekday === 'number')
224
+ return weekdayNamesList[weekday];
225
+ // Return the name of the day of the week
226
+ return weekdayNamesList[weekday.getDay()];
227
+ }
228
+
229
+ function findComponentByType(children, componentType) {
230
+ const childrenArray = react.Children.toArray(children);
231
+ for (const child of childrenArray) {
232
+ if (react.isValidElement(child) && child.type === componentType)
233
+ return child;
234
+ }
235
+ for (const child of childrenArray) {
236
+ if (react.isValidElement(child)) {
237
+ if (child.type === react.Fragment && child.props.children) {
238
+ const found = findComponentByType(child.props.children, componentType);
239
+ if (found)
240
+ return found;
241
+ }
242
+ else if (child.props.children) {
243
+ const found = findComponentByType(child.props.children, componentType);
244
+ if (found)
245
+ return found;
246
+ }
247
+ }
248
+ }
249
+ return null;
250
+ }
251
+
252
+ function easeOutExpo(time, start, end, duration) {
253
+ return time == duration ? start + end : end * (-Math.pow(2, (-10 * time) / duration) + 1) + start;
254
+ }
255
+
256
+ const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
257
+ /**
258
+ * # Is Email
259
+ * Checks whether the specified string is in email format
260
+ */
261
+ function isEmail(email) {
262
+ return emailRegex.test(email);
263
+ }
264
+ const telRegex = /(?:\+1\s|1\s|)?\d{3}\.\d{3}\.\d{4}|(?:\+1\s|1\s|)?\d{3}-\d{3}-\d{4}|(?:\+1\s|1\s|)?\(\d{3}\) \d{3}-\d{4}|(?:\+1\s|1\s|\+1|1|)?\d{10}/;
265
+ /**
266
+ * # Is Phone Number
267
+ * Checks whether the specified string is in phone number format
268
+ */
269
+ function isPhoneNumber(tel) {
270
+ return telRegex.test(tel);
271
+ }
272
+
273
+ /**
274
+ * # Format Phone Number
275
+ * Converts any string containing at least 10 numbers to a formatted phone number
276
+ * @param {string} string
277
+ * @returns {string} string formatted (000) 000-0000
278
+ */
279
+ /**
280
+ * # To Lower Case
281
+ * Converts a string to lowercase, and offers easy string replacements for creating snake case, kebab case, or your own.
282
+ * @param str - The string to convert to lowercase.
283
+ * @param options - Configuration options.
284
+ * @param options[0] - The delimiter to split the string. Defaults to space.
285
+ * @param options[1] - The string to join the parts back together. Defaults to space.
286
+ * @returns The lowercase version of the input string, with the replacements, if provided.
287
+ */
288
+ function toLowerCase(str, [delimiter, joiner]) {
289
+ return str.toLowerCase().replaceAll(delimiter || ' ', joiner || ' ');
290
+ }
291
+
292
+ function twSort(className) {
293
+ return className;
294
+ }
295
+
296
+ function Anchor({ className, disabled, href, onClick, ref, target, rel, ...props }) {
297
+ const isExternal = `${href}`.startsWith('http'), hasHash = `${href}`.includes('#');
298
+ const handleClick = e => {
299
+ if (disabled)
300
+ return e.preventDefault();
301
+ onClick?.(e);
302
+ setTimeout(() => history.replaceState({}, document.title, location.pathname), 100);
303
+ };
304
+ return (jsxRuntime.jsx("a", { ref: ref, ...props, "aria-disabled": disabled, className: twMerge(className, disabled && 'pointer-events-none'), href: href, target: target || (isExternal ? '_blank' : '_self'), onClick: hasHash ? handleClick : onClick, rel: rel !== undefined
305
+ ? rel === 'nofollow'
306
+ ? `${rel} noreferrer noopener`
307
+ : `${rel} prefetch`
308
+ : isExternal
309
+ ? 'nofollow noreferrer noopener'
310
+ : 'prefetch' }));
311
+ }
312
+ // * Styles
313
+ const baseClasses = twSort('ease-exponential isolate inline-block cursor-pointer duration-300 after:absolute after:left-1/2 after:-z-10 after:-translate-x-1/2 after:duration-500 active:scale-95 active:after:opacity-100');
314
+ const lineStaticClasses = tailwindMerge.twJoin(baseClasses, 'after:border-1 whitespace-nowrap after:-bottom-0.5 after:w-[calc(100%+0.15rem)] after:rounded-full after:border-current');
315
+ const lineClasses = tailwindMerge.twJoin(lineStaticClasses, 'after:ease-exponential whitespace-nowrap transition-transform after:transition-transform');
316
+ const scaleXClasses = 'after:scale-x-0 pointer-fine:hover:after:scale-x-100 active:after:scale-x-100';
317
+ const scaleYClasses = 'after:scale-y-0 pointer-fine:hover:after:scale-y-100 active:after:scale-y-100';
318
+ const lineNormalClasses = tailwindMerge.twJoin([
319
+ lineClasses,
320
+ scaleYClasses,
321
+ 'pointer-fine:hover:after:translate-y-0 after:origin-bottom after:translate-y-0.5 active:after:translate-y-0',
322
+ ]);
323
+ const lineLtrClasses = tailwindMerge.twJoin([lineClasses, scaleXClasses, 'after:origin-left']);
324
+ const lineRtlClasses = tailwindMerge.twJoin([lineClasses, scaleXClasses, 'after:origin-right']);
325
+ const lineCenterClasses = tailwindMerge.twJoin([lineClasses, scaleXClasses]);
326
+ const lineLiftClasses = tailwindMerge.twJoin([
327
+ lineClasses,
328
+ scaleYClasses,
329
+ 'pointer-fine:hover:after:translate-y-0 pointer-fine:hover:after:scale-x-100 after:origin-bottom after:translate-y-1 after:scale-x-75 active:after:translate-y-0 active:after:scale-x-100',
330
+ ]);
331
+ const fillClasses = tailwindMerge.twJoin(baseClasses, 'after:ease-exponential pointer-fine:hover:text-zinc-50 whitespace-nowrap transition-[transform_color] after:top-1/2 after:h-[calc(100%+0.05rem)] after:w-[calc(100%+0.25rem)] after:-translate-y-1/2 after:rounded active:text-zinc-50');
332
+ // Define theme-specific fill color transition classes
333
+ const getFillColorTransitionClasses = (theme = 'blue') => {
334
+ switch (theme) {
335
+ case 'brown':
336
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-brown contrast-more:after:bg-ui-brown after:transition-transform');
337
+ case 'green':
338
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-green contrast-more:after:bg-ui-green after:transition-transform');
339
+ case 'grey':
340
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-grey contrast-more:after:bg-ui-grey after:transition-transform');
341
+ case 'sky-blue':
342
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-sky-blue contrast-more:after:bg-ui-sky-blue after:transition-transform');
343
+ case 'magenta':
344
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-magenta contrast-more:after:bg-ui-magenta after:transition-transform');
345
+ case 'neutral':
346
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-zinc-700 after:transition-transform contrast-more:after:bg-zinc-700 dark:after:bg-zinc-300 dark:contrast-more:after:bg-zinc-300');
347
+ case 'orange':
348
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-orange contrast-more:after:bg-ui-orange after:transition-transform');
349
+ case 'pink':
350
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-pink contrast-more:after:bg-ui-pink after:transition-transform');
351
+ case 'primary':
352
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-primary-500 contrast-more:after:bg-primary-500 after:transition-transform');
353
+ case 'purple':
354
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-purple contrast-more:after:bg-ui-purple after:transition-transform');
355
+ case 'red':
356
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-red contrast-more:after:bg-ui-red after:transition-transform');
357
+ case 'violet':
358
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-violet contrast-more:after:bg-ui-violet after:transition-transform');
359
+ case 'yellow':
360
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-yellow contrast-more:after:bg-ui-yellow after:transition-transform');
361
+ case 'blue':
362
+ default:
363
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-blue contrast-more:after:bg-ui-blue after:transition-transform');
364
+ }
365
+ };
366
+ // Define theme-specific fill center classes
367
+ const getFillCenterClasses = (theme = 'blue') => {
368
+ switch (theme) {
369
+ case 'brown':
370
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-brown/0 active:after:bg-ui-brown pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-brown after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
371
+ case 'green':
372
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-green/0 active:after:bg-ui-green pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-green after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
373
+ case 'grey':
374
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-grey/0 active:after:bg-ui-grey pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-grey after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
375
+ case 'sky-blue':
376
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-sky-blue/0 active:after:bg-ui-sky-blue pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-sky-blue after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
377
+ case 'magenta':
378
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-magenta/0 active:after:bg-ui-magenta pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-magenta after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
379
+ case 'neutral':
380
+ return tailwindMerge.twJoin(fillClasses, 'pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-zinc-700 dark:pointer-fine:hover:after:bg-zinc-300 after:scale-x-50 after:scale-y-[0.25] after:bg-zinc-700/0 after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100 active:after:bg-zinc-700 dark:after:bg-zinc-300/0 dark:active:after:bg-zinc-300');
381
+ case 'orange':
382
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-orange/0 active:after:bg-ui-orange pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-orange after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
383
+ case 'pink':
384
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-pink/0 active:after:bg-ui-pink pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-pink after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
385
+ case 'primary':
386
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-primary-500/0 active:after:bg-primary-500 pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-primary-500 after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
387
+ case 'purple':
388
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-purple/0 active:after:bg-ui-purple pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-purple after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
389
+ case 'red':
390
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-red/0 active:after:bg-ui-red pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-red after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
391
+ case 'violet':
392
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-violet/0 active:after:bg-ui-violet pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-violet after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
393
+ case 'yellow':
394
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-yellow/0 active:after:bg-ui-yellow pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-yellow after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
395
+ case 'blue':
396
+ default:
397
+ return tailwindMerge.twJoin(fillClasses, 'after:bg-ui-blue/0 active:after:bg-ui-blue pointer-fine:hover:after:scale-x-100 pointer-fine:hover:after:scale-y-100 pointer-fine:hover:after:bg-ui-blue after:scale-x-50 after:scale-y-[0.25] after:transition-[transform_background-color] active:after:scale-x-100 active:after:scale-y-100');
398
+ }
399
+ };
400
+ const multilineBaseClasses = twSort('bg-linear-to-r from-current to-current bg-no-repeat active:scale-95');
401
+ const multilineLineStaticClasses = 'underline';
402
+ const multilineNormalClasses = twSort('pointer-fine:hover:underline underline-offset-1 active:underline');
403
+ const multilineClasses = tailwindMerge.twJoin(multilineBaseClasses, 'ease-exponential duration-500');
404
+ const multilineLineClasses = tailwindMerge.twJoin(multilineClasses, 'bg-[position:0%_100%] px-px pb-px transition-[background-size]');
405
+ const multilineXClasses = tailwindMerge.twJoin(multilineLineClasses, 'pointer-fine:hover:bg-[size:100%_2px] bg-[size:0%_2px] focus-visible:bg-[size:100%_2px] active:bg-[size:100%_2px]');
406
+ const multilineLineRtlClasses = tailwindMerge.twJoin([multilineXClasses, 'bg-[position:100%_100%]']);
407
+ const multilineLineCenterClasses = tailwindMerge.twJoin([multilineXClasses, 'bg-[position:50%_100%]']);
408
+ const multilineLineLiftClasses = tailwindMerge.twJoin(multilineLineClasses, 'pointer-fine:hover:bg-[size:auto_2px] bg-[size:auto_0px] focus-visible:bg-[size:auto_2px] active:bg-[size:auto_2px]');
409
+ const multilineFillBaseClasses = tailwindMerge.twJoin(multilineBaseClasses, 'py-0.75 pointer-fine:hover:text-zinc-50 rounded px-0.5 focus-visible:text-zinc-50 active:text-zinc-50');
410
+ // Define theme-specific multiline fill color classes
411
+ const getMultilineFillColorClasses = (theme = 'blue') => {
412
+ switch (theme) {
413
+ case 'brown':
414
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-brown to-ui-brown contrast-more:from-ui-brown contrast-more:to-ui-brown transition-[background-size_color]');
415
+ case 'green':
416
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-green to-ui-green contrast-more:from-ui-green contrast-more:to-ui-green transition-[background-size_color]');
417
+ case 'grey':
418
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-grey to-ui-grey contrast-more:from-ui-grey contrast-more:to-ui-grey transition-[background-size_color]');
419
+ case 'sky-blue':
420
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-sky-blue to-ui-sky-blue contrast-more:from-ui-sky-blue contrast-more:to-ui-sky-blue transition-[background-size_color]');
421
+ case 'magenta':
422
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-magenta to-ui-magenta contrast-more:from-ui-magenta contrast-more:to-ui-magenta transition-[background-size_color]');
423
+ case 'neutral':
424
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-zinc-700 to-zinc-700 transition-[background-size_color] contrast-more:from-zinc-700 contrast-more:to-zinc-700 dark:from-zinc-300 dark:to-zinc-300 dark:contrast-more:from-zinc-300 dark:contrast-more:to-zinc-300');
425
+ case 'orange':
426
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-orange to-ui-orange contrast-more:from-ui-orange contrast-more:to-ui-orange transition-[background-size_color]');
427
+ case 'pink':
428
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-pink to-ui-pink contrast-more:from-ui-pink contrast-more:to-ui-pink transition-[background-size_color]');
429
+ case 'primary':
430
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-primary-500 to-primary-500 contrast-more:from-primary-500 contrast-more:to-primary-500 transition-[background-size_color]');
431
+ case 'purple':
432
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-purple to-ui-purple contrast-more:from-ui-purple contrast-more:to-ui-purple transition-[background-size_color]');
433
+ case 'red':
434
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-red to-ui-red contrast-more:from-ui-red contrast-more:to-ui-red transition-[background-size_color]');
435
+ case 'violet':
436
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-violet to-ui-violet contrast-more:from-ui-violet contrast-more:to-ui-violet transition-[background-size_color]');
437
+ case 'yellow':
438
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-yellow to-ui-yellow contrast-more:from-ui-yellow contrast-more:to-ui-yellow transition-[background-size_color]');
439
+ case 'blue':
440
+ default:
441
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-blue to-ui-blue contrast-more:from-ui-blue contrast-more:to-ui-blue transition-[background-size_color]');
442
+ }
443
+ };
444
+ // Define theme-specific multiline fill classes
445
+ const getMultilineFillClasses = (theme = 'blue') => {
446
+ switch (theme) {
447
+ case 'brown':
448
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-brown/0 to-ui-brown/0 focus-visible:from-ui-brown focus-visible:to-ui-brown active:from-ui-brown active:to-ui-brown contrast-more:from-ui-brown/0 contrast-more:to-ui-brown/0 focus-visible:contrast-more:from-ui-brown focus-visible:contrast-more:to-ui-brown active:contrast-more:from-ui-brown active:contrast-more:to-ui-brown pointer-fine:hover:from-ui-brown pointer-fine:hover:to-ui-brown pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-brown pointer-fine:hover:contrast-more:to-ui-brown bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
449
+ case 'green':
450
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-green/0 to-ui-green/0 focus-visible:from-ui-green focus-visible:to-ui-green active:from-ui-green active:to-ui-green contrast-more:from-ui-green/0 contrast-more:to-ui-green/0 focus-visible:contrast-more:from-ui-green focus-visible:contrast-more:to-ui-green active:contrast-more:from-ui-green active:contrast-more:to-ui-green pointer-fine:hover:from-ui-green pointer-fine:hover:to-ui-green pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-green pointer-fine:hover:contrast-more:to-ui-green bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
451
+ case 'grey':
452
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-grey/0 to-ui-grey/0 focus-visible:from-ui-grey focus-visible:to-ui-grey active:from-ui-grey active:to-ui-grey contrast-more:from-ui-grey/0 contrast-more:to-ui-grey/0 focus-visible:contrast-more:from-ui-grey focus-visible:contrast-more:to-ui-grey active:contrast-more:from-ui-grey active:contrast-more:to-ui-grey pointer-fine:hover:from-ui-grey pointer-fine:hover:to-ui-grey pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-grey pointer-fine:hover:contrast-more:to-ui-grey bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
453
+ case 'sky-blue':
454
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-sky-blue/0 to-ui-sky-blue/0 focus-visible:from-ui-sky-blue focus-visible:to-ui-sky-blue active:from-ui-sky-blue active:to-ui-sky-blue contrast-more:from-ui-sky-blue/0 contrast-more:to-ui-sky-blue/0 focus-visible:contrast-more:from-ui-sky-blue focus-visible:contrast-more:to-ui-sky-blue active:contrast-more:from-ui-sky-blue active:contrast-more:to-ui-sky-blue pointer-fine:hover:from-ui-sky-blue pointer-fine:hover:to-ui-sky-blue pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-sky-blue pointer-fine:hover:contrast-more:to-ui-sky-blue bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
455
+ case 'magenta':
456
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-magenta/0 to-ui-magenta/0 focus-visible:from-ui-magenta focus-visible:to-ui-magenta active:from-ui-magenta active:to-ui-magenta contrast-more:from-ui-magenta/0 contrast-more:to-ui-magenta/0 focus-visible:contrast-more:from-ui-magenta focus-visible:contrast-more:to-ui-magenta active:contrast-more:from-ui-magenta active:contrast-more:to-ui-magenta pointer-fine:hover:from-ui-magenta pointer-fine:hover:to-ui-magenta pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-magenta pointer-fine:hover:contrast-more:to-ui-magenta bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
457
+ case 'neutral':
458
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'pointer-fine:hover:from-zinc-700 pointer-fine:hover:to-zinc-700 pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-zinc-700 pointer-fine:hover:contrast-more:to-zinc-700 dark:pointer-fine:hover:from-zinc-300 dark:pointer-fine:hover:to-zinc-300 dark:pointer-fine:hover:contrast-more:from-zinc-300 dark:pointer-fine:hover:contrast-more:to-zinc-300 from-zinc-700/0 to-zinc-700/0 bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:from-zinc-700 focus-visible:to-zinc-700 focus-visible:bg-[size:100%_100%] active:from-zinc-700 active:to-zinc-700 active:bg-[size:100%_100%] contrast-more:from-zinc-700/0 contrast-more:to-zinc-700/0 focus-visible:contrast-more:from-zinc-700 focus-visible:contrast-more:to-zinc-700 active:contrast-more:from-zinc-700 active:contrast-more:to-zinc-700 dark:from-zinc-300/0 dark:to-zinc-300/0 dark:focus-visible:from-zinc-300 dark:focus-visible:to-zinc-300 dark:active:from-zinc-300 dark:active:to-zinc-300 dark:contrast-more:from-zinc-300/0 dark:contrast-more:to-zinc-300/0 dark:focus-visible:contrast-more:from-zinc-300 dark:focus-visible:contrast-more:to-zinc-300 dark:active:contrast-more:from-zinc-300 dark:active:contrast-more:to-zinc-300');
459
+ case 'orange':
460
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-orange/0 to-ui-orange/0 focus-visible:from-ui-orange focus-visible:to-ui-orange active:from-ui-orange active:to-ui-orange contrast-more:from-ui-orange/0 contrast-more:to-ui-orange/0 focus-visible:contrast-more:from-ui-orange focus-visible:contrast-more:to-ui-orange active:contrast-more:from-ui-orange active:contrast-more:to-ui-orange pointer-fine:hover:from-ui-orange pointer-fine:hover:to-ui-orange pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-orange pointer-fine:hover:contrast-more:to-ui-orange bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
461
+ case 'pink':
462
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-pink/0 to-ui-pink/0 focus-visible:from-ui-pink focus-visible:to-ui-pink active:from-ui-pink active:to-ui-pink contrast-more:from-ui-pink/0 contrast-more:to-ui-pink/0 focus-visible:contrast-more:from-ui-pink focus-visible:contrast-more:to-ui-pink active:contrast-more:from-ui-pink active:contrast-more:to-ui-pink pointer-fine:hover:from-ui-pink pointer-fine:hover:to-ui-pink pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-pink pointer-fine:hover:contrast-more:to-ui-pink bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
463
+ case 'primary':
464
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-primary-500/0 to-primary-500/0 focus-visible:from-primary-500 focus-visible:to-primary-500 active:from-primary-500 active:to-primary-500 contrast-more:from-primary-500/0 contrast-more:to-primary-500/0 focus-visible:contrast-more:from-primary-500 focus-visible:contrast-more:to-primary-500 active:contrast-more:from-primary-500 active:contrast-more:to-primary-500 pointer-fine:hover:from-primary-500 pointer-fine:hover:to-primary-500 pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-primary-500 pointer-fine:hover:contrast-more:to-primary-500 bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
465
+ case 'purple':
466
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-purple/0 to-ui-purple/0 focus-visible:from-ui-purple focus-visible:to-ui-purple active:from-ui-purple active:to-ui-purple contrast-more:from-ui-purple/0 contrast-more:to-ui-purple/0 focus-visible:contrast-more:from-ui-purple focus-visible:contrast-more:to-ui-purple active:contrast-more:from-ui-purple active:contrast-more:to-ui-purple pointer-fine:hover:from-ui-purple pointer-fine:hover:to-ui-purple pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-purple pointer-fine:hover:contrast-more:to-ui-purple bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
467
+ case 'red':
468
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-red/0 to-ui-red/0 focus-visible:from-ui-red focus-visible:to-ui-red active:from-ui-red active:to-ui-red contrast-more:from-ui-red/0 contrast-more:to-ui-red/0 focus-visible:contrast-more:from-ui-red focus-visible:contrast-more:to-ui-red active:contrast-more:from-ui-red active:contrast-more:to-ui-red pointer-fine:hover:from-ui-red pointer-fine:hover:to-ui-red pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-red pointer-fine:hover:contrast-more:to-ui-red bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
469
+ case 'violet':
470
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-violet/0 to-ui-violet/0 focus-visible:from-ui-violet focus-visible:to-ui-violet active:from-ui-violet active:to-ui-violet contrast-more:from-ui-violet/0 contrast-more:to-ui-violet/0 focus-visible:contrast-more:from-ui-violet focus-visible:contrast-more:to-ui-violet active:contrast-more:from-ui-violet active:contrast-more:to-ui-violet pointer-fine:hover:from-ui-violet pointer-fine:hover:to-ui-violet pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-violet pointer-fine:hover:contrast-more:to-ui-violet bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
471
+ case 'yellow':
472
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-yellow/0 to-ui-yellow/0 focus-visible:from-ui-yellow focus-visible:to-ui-yellow active:from-ui-yellow active:to-ui-yellow contrast-more:from-ui-yellow/0 contrast-more:to-ui-yellow/0 focus-visible:contrast-more:from-ui-yellow focus-visible:contrast-more:to-ui-yellow active:contrast-more:from-ui-yellow active:contrast-more:to-ui-yellow pointer-fine:hover:from-ui-yellow pointer-fine:hover:to-ui-yellow pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-yellow pointer-fine:hover:contrast-more:to-ui-yellow bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
473
+ case 'blue':
474
+ default:
475
+ return tailwindMerge.twJoin(multilineFillBaseClasses, 'from-ui-blue/0 to-ui-blue/0 focus-visible:from-ui-blue focus-visible:to-ui-blue active:from-ui-blue active:to-ui-blue contrast-more:from-ui-blue/0 contrast-more:to-ui-blue/0 focus-visible:contrast-more:from-ui-blue focus-visible:contrast-more:to-ui-blue active:contrast-more:from-ui-blue active:contrast-more:to-ui-blue pointer-fine:hover:from-ui-blue pointer-fine:hover:to-ui-blue pointer-fine:hover:bg-[size:100%_100%] pointer-fine:hover:contrast-more:from-ui-blue pointer-fine:hover:contrast-more:to-ui-blue bg-[size:50%_0px] bg-[position:50%_50%] transition-[background-size_background-image_color] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
476
+ }
477
+ };
478
+ const getMultilineFillLiftClasses = (theme = 'blue') => {
479
+ return tailwindMerge.twJoin(getMultilineFillColorClasses(theme), 'pointer-fine:hover:bg-[size:auto_100%] bg-[size:auto_0px] bg-[position:auto_100%] focus-visible:bg-[size:auto_100%] active:bg-[size:auto_100%]');
480
+ };
481
+ const getMultilineFillXClasses = (theme = 'blue') => {
482
+ return tailwindMerge.twJoin(getMultilineFillColorClasses(theme), 'pointer-fine:hover:bg-[size:100%_100%] bg-[size:0%_100%] focus-visible:bg-[size:100%_100%] active:bg-[size:100%_100%]');
483
+ };
484
+ const getMultilineFillRtlClasses = (theme = 'blue') => {
485
+ return tailwindMerge.twJoin(getMultilineFillXClasses(theme), 'bg-[position:100%_auto]');
486
+ };
487
+ const getMultilineFillCenterClasses = (theme = 'blue') => {
488
+ return tailwindMerge.twJoin(getMultilineFillXClasses(theme), 'bg-[position:50%_auto]');
489
+ };
490
+ /**
491
+ * # Link
492
+ *
493
+ * - A component for rendering links with various styles and options.
494
+ * - Utilizes the Next.js `Link` component and provides additional functionality.
495
+ *
496
+ * ---
497
+ *
498
+ * ## Styles
499
+ *
500
+ * This component includes various classes to style the link. The styles are divided into two types:
501
+ *
502
+ * - Line styles: These styles add a line underneath the link, and include variations for different positions and orientations.
503
+ * - Fill styles: These styles add a background color behind the link, and include variations for different positions and orientations.
504
+ * - Multiline styles: These styles seek to accomplish the same as the line and fill styles, while offering multiline support.
505
+ *
506
+ * ---
507
+ *
508
+ * ## Examples
509
+ *
510
+ * @example
511
+ * <Link href='/about' type='ltr' title='About Us'>Learn more about our company</Link>
512
+ *
513
+ * @example
514
+ * <Link href='/about' type='fill-ltr' title='About Us'>Learn more about our company</Link>
515
+ *
516
+ * @example
517
+ * <Link href='/about' type='fill-ltr' theme='red' title='About Us'>Learn more about our company</Link>
518
+ */
519
+ function Link({ type, theme = 'blue', className, ref, ...props }) {
520
+ const getLinkClasses = () => {
521
+ switch (type) {
522
+ case 'static':
523
+ return lineStaticClasses;
524
+ case 'ltr':
525
+ return lineLtrClasses;
526
+ case 'rtl':
527
+ return lineRtlClasses;
528
+ case 'center':
529
+ return lineCenterClasses;
530
+ case 'lift':
531
+ return lineLiftClasses;
532
+ case 'fill':
533
+ return getFillCenterClasses(theme);
534
+ case 'fill-ltr':
535
+ return tailwindMerge.twJoin([getFillColorTransitionClasses(theme), scaleXClasses, 'after:origin-left']);
536
+ case 'fill-rtl':
537
+ return tailwindMerge.twJoin([getFillColorTransitionClasses(theme), scaleXClasses, 'after:origin-right']);
538
+ case 'fill-lift':
539
+ return tailwindMerge.twJoin([getFillColorTransitionClasses(theme), scaleYClasses, 'after:origin-bottom']);
540
+ case 'multiline':
541
+ return multilineNormalClasses;
542
+ case 'multiline-static':
543
+ return multilineLineStaticClasses;
544
+ case 'multiline-ltr':
545
+ return multilineXClasses;
546
+ case 'multiline-rtl':
547
+ return multilineLineRtlClasses;
548
+ case 'multiline-center':
549
+ return multilineLineCenterClasses;
550
+ case 'multiline-lift':
551
+ return multilineLineLiftClasses;
552
+ case 'multiline-fill':
553
+ return getMultilineFillClasses(theme);
554
+ case 'multiline-fill-ltr':
555
+ return getMultilineFillXClasses(theme);
556
+ case 'multiline-fill-rtl':
557
+ return getMultilineFillRtlClasses(theme);
558
+ case 'multiline-fill-center':
559
+ return getMultilineFillCenterClasses(theme);
560
+ case 'multiline-fill-lift':
561
+ return getMultilineFillLiftClasses(theme);
562
+ default:
563
+ return lineNormalClasses;
564
+ }
565
+ };
566
+ const linkClasses = getLinkClasses();
567
+ return jsxRuntime.jsx(Anchor, { ref: ref, ...props, className: twMerge(linkClasses, className) });
568
+ }
569
+
570
+ /**
571
+ * # Button
572
+ * - A pre-styled button with utility props for easy customization depending on use case.
573
+ */
574
+ function Button({ className, padding = 'md', rounded = 'lg', theme = 'primary', ref, ...props }) {
575
+ const getPaddingClasses = () => {
576
+ switch (padding) {
577
+ case 'xs':
578
+ return 'px-2 py-0.5';
579
+ case 'sm':
580
+ return 'px-4 py-1';
581
+ case 'md':
582
+ return 'px-6 py-1.5';
583
+ case 'lg':
584
+ return 'px-8 py-2';
585
+ case 'xl':
586
+ return 'px-12 py-3';
587
+ }
588
+ };
589
+ const getRoundedClasses = () => {
590
+ switch (rounded) {
591
+ case 'xs':
592
+ return 'rounded-sm';
593
+ case 'sm':
594
+ return 'rounded-md';
595
+ case 'md':
596
+ return 'rounded-lg';
597
+ case 'lg':
598
+ return 'rounded-xl';
599
+ case 'xl':
600
+ return 'rounded-3xl';
601
+ case 'full':
602
+ return 'rounded-full';
603
+ }
604
+ };
605
+ const getThemeClasses = () => {
606
+ switch (theme) {
607
+ case 'blue':
608
+ return twSort('before:bg-ui-blue shadow-ui-blue/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
609
+ case 'blue-gradient':
610
+ return twSort('bg-ui-blue shadow-ui-blue/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
611
+ case 'brown':
612
+ return twSort('before:bg-ui-brown shadow-ui-brown/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
613
+ case 'brown-gradient':
614
+ return twSort('bg-ui-brown shadow-ui-brown/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
615
+ case 'green':
616
+ return twSort('before:bg-ui-green shadow-ui-green/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
617
+ case 'green-gradient':
618
+ return twSort('bg-ui-green shadow-ui-green/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
619
+ case 'grey':
620
+ return twSort('before:bg-ui-grey shadow-ui-grey/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
621
+ case 'grey-gradient':
622
+ return twSort('bg-ui-grey shadow-ui-grey/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
623
+ case 'sky-blue':
624
+ return twSort('before:bg-ui-sky-blue shadow-ui-sky-blue/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
625
+ case 'sky-blue-gradient':
626
+ return twSort('bg-ui-sky-blue shadow-text-white lg shadow-ui-sky-blue/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
627
+ case 'magenta':
628
+ return twSort('before:bg-ui-magenta shadow-ui-magenta/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
629
+ case 'magenta-gradient':
630
+ return twSort('bg-ui-magenta shadow-ui-magenta/25 before:bg-linear-to-t active:before transition-transform:brightness-90 pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white mix-blend-soft-light shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:text-white before:opacity-75');
631
+ case 'neutral':
632
+ return twSort('before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90text-white dark bg-zinc-200 text-black before:absolute before:inset-0 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90 dark:bg-zinc-800');
633
+ case 'neutral-gradient':
634
+ return twSort('bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 dark from-zinc-300 via-zinc-200 to-zinc-100 text-black before:transition-[filter] before:duration-300 active:before:brightness-90 dark:from-zinc-900 dark:via-zinc-800 dark:to-zinc-700');
635
+ case 'orange':
636
+ return twSort('before:bg-ui-orange shadow-ui-orange/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
637
+ case 'orange-gradient':
638
+ return twSort('bg-ui-orange shadow-ui-orange/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
639
+ case 'pink':
640
+ return twSort('before:bg-ui-pink shadow-ui-pink/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
641
+ case 'pink-gradient':
642
+ return twSort('bg-ui-pink shadow-ui-pink/25 before:bg-linear-to-t before:to-white/75/75 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
643
+ case 'primary-light':
644
+ return twSort('bg-primary-50 text-primary-600 active:bg-primary-600 active:text-primary-50 pointer-fine:hover:bg-primary-600 pointer-fine:hover:text-primary-50 pointer-fine:active:bg-primary-700 transition-[transform_background-color_color_box-shadow]');
645
+ case 'primary-gradient':
646
+ return twSort('bg-linear-to-t from-primary-700 via-primary-500 to-primary-300 bg-size-y-[200%] shadow-primary-600/25 pointer-fine:hover:[background-position:50%_0%] transition-[transform_background-position] [background-position:50%_50%] active:[background-position:50%_75%]');
647
+ case 'purple':
648
+ return twSort('before:bg-ui-purple shadow-ui-purple/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
649
+ case 'purple-gradient':
650
+ return twSort('bg-ui-purple shadow-ui-purple/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
651
+ case 'red':
652
+ return twSort('before:bg-ui-red shadow-ui-red/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
653
+ case 'red-gradient':
654
+ return twSort('bg-ui-red shadow-ui-red/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
655
+ case 'violet':
656
+ return twSort('before:bg-ui-violet shadow-ui-violet/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
657
+ case 'violet-gradient':
658
+ return twSort('bg-ui-violet shadow-ui-violet/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-white shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black/75 before:via-transparent before:to-white/75 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
659
+ case 'yellow':
660
+ return twSort('before:bg-ui-yellow shadow-ui-yellow/25 before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-black shadow-lg transition-transform before:absolute before:inset-0 before:-z-10 before:rounded-[inherit] before:transition-[filter] before:duration-300 active:before:brightness-90');
661
+ case 'yellow-gradient':
662
+ return twSort('bg-ui-yellow shadow-ui-yellow/25 before:bg-linear-to-t before:ease-exponential pointer-fine:hover:before:brightness-110 pointer-fine:active:before:brightness-90 text-black shadow-lg transition-transform before:absolute before:inset-0 before:rounded-[inherit] before:from-black before:via-black/50 before:to-white/50 before:opacity-75 before:mix-blend-soft-light before:transition-[filter] before:duration-300 active:before:brightness-90');
663
+ case 'primary':
664
+ default:
665
+ return twSort('bg-primary-500 shadow-primary-700/25 active:bg-primary-600 pointer-fine:hover:bg-primary-400 pointer-fine:active:bg-primary-600 text-white shadow-lg transition-[transform_background-color_box-shadow]');
666
+ }
667
+ };
668
+ const paddingClasses = getPaddingClasses(), roundedClasses = getRoundedClasses(), themeClasses = getThemeClasses();
669
+ const buttonClasses = twMerge([
670
+ 'ease-exponential focus-visible:scale-101 pointer-fine:hover:scale-101 pointer-fine:active:scale-99 block w-fit min-w-fit text-center font-semibold duration-300 active:scale-95',
671
+ paddingClasses,
672
+ roundedClasses,
673
+ themeClasses,
674
+ className,
675
+ ]);
676
+ return 'href' in props && typeof props.href === 'string' ? (jsxRuntime.jsx(Anchor, { ref: ref, ...props, className: buttonClasses })) : (jsxRuntime.jsx(react$1.Button, { ref: ref, ...props, className: buttonClasses }));
677
+ }
678
+
679
+ function createFastContext(defaultInitialState) {
680
+ function useStoreData(initialState = defaultInitialState) {
681
+ const store = react.useRef(initialState), get = () => store.current, subscribers = react.useRef(new Set());
682
+ const set = (value) => {
683
+ if (typeof value === 'function') {
684
+ store.current = value(store.current);
685
+ }
686
+ else {
687
+ store.current = value;
688
+ }
689
+ subscribers.current.forEach(callback => callback());
690
+ };
691
+ const subscribe = (callback) => {
692
+ subscribers.current.add(callback);
693
+ return () => subscribers.current.delete(callback);
694
+ };
695
+ return {
696
+ get,
697
+ set,
698
+ subscribe,
699
+ };
700
+ }
701
+ const StoreContext = react.createContext(null);
702
+ function Provider({ initialValue = defaultInitialState, ...props }) {
703
+ return jsxRuntime.jsx(StoreContext.Provider, { value: useStoreData(initialValue), ...props });
704
+ }
705
+ function useStore(selector, initialValue) {
706
+ const store = react.useContext(StoreContext);
707
+ if (!store) {
708
+ const localStoreValue = initialValue !== undefined ? initialValue : defaultInitialState;
709
+ const selectedValue = selector(localStoreValue);
710
+ const noOpSet = () => console.warn('Attempting to set store value outside of Provider');
711
+ return [selectedValue, noOpSet];
712
+ }
713
+ const state = react.useSyncExternalStore(store.subscribe, () => selector(store.get()), () => selector(initialValue !== undefined ? initialValue : defaultInitialState));
714
+ return [state, store.set];
715
+ }
716
+ return {
717
+ Provider,
718
+ useStore,
719
+ };
720
+ }
721
+
722
+ /**
723
+ * # Define Field
724
+ *
725
+ * This is a helper function to define a field in a form context with type safety.
726
+ */
727
+ function defineField(fieldDefinition) {
728
+ return fieldDefinition;
729
+ }
730
+ const { Provider: Provider$1, useStore: useStore$1 } = createFastContext([]);
731
+ function FormContextProvider({ children }) {
732
+ return jsxRuntime.jsx(Provider$1, { children: children });
733
+ }
734
+ function useFormContext() {
735
+ return useStore$1(store => store);
736
+ }
737
+
738
+ const DEFAULT_STATUS = 'incomplete';
739
+ const { Provider, useStore } = createFastContext(DEFAULT_STATUS);
740
+ function FormStatusProvider({ children, initialStatus = DEFAULT_STATUS, }) {
741
+ return (jsxRuntime.jsx(react.Suspense, { children: jsxRuntime.jsx(Provider, { initialValue: initialStatus, children: children }) }));
742
+ }
743
+ function useFormStatus() {
744
+ return useStore(store => store);
745
+ }
746
+
747
+ function validateField(value, { required, type }) {
748
+ const noValue = !value || value === '';
749
+ if (!required && noValue)
750
+ return true;
751
+ if (noValue)
752
+ return false;
753
+ switch (type) {
754
+ case 'email':
755
+ return isEmail(value);
756
+ case 'number':
757
+ return !isNaN(Number(value));
758
+ case 'tel':
759
+ return isPhoneNumber(value);
760
+ default:
761
+ return true;
762
+ }
763
+ }
764
+ function Input({ checked, className, defaultValue, description, descriptionProps, disabled, fieldProps, invalid = true, label, labelProps, name, onChange, placeholder, ref, required = true, type, value, ...props }) {
765
+ const [formContext, setFormContext] = useFormContext(), [, setFormStatus] = useFormStatus();
766
+ if (placeholder === '*')
767
+ placeholder = name + (required && !label ? '*' : '');
768
+ if (label === '*')
769
+ label = name;
770
+ const uniqueID = react.useId(), fieldContextID = toLowerCase(name, [, '_']) + '§' + uniqueID;
771
+ if (Boolean(formContext?.find(field => field.id === fieldContextID)?.invalid))
772
+ invalid = true;
773
+ const getFieldContextType = () => {
774
+ switch (type) {
775
+ case 'email':
776
+ return 'email';
777
+ case 'file':
778
+ return 'file';
779
+ case 'number':
780
+ return 'number';
781
+ case 'tel':
782
+ return 'tel';
783
+ case 'url':
784
+ return 'url';
785
+ default:
786
+ return 'string';
787
+ }
788
+ };
789
+ const fieldContextType = getFieldContextType();
790
+ const fieldContext = defineField({
791
+ type: fieldContextType,
792
+ id: fieldContextID,
793
+ invalid,
794
+ name,
795
+ required,
796
+ value: value ? `${value}` : defaultValue ? `${defaultValue}` : '',
797
+ });
798
+ react.useEffect(() => {
799
+ if (!setFormContext)
800
+ return;
801
+ setFormContext(prevContext => {
802
+ const otherFields = (prevContext || []).filter(field => field.id !== fieldContext.id);
803
+ return [...otherFields, fieldContext];
804
+ });
805
+ return () => {
806
+ setFormContext(prevContext => (prevContext || []).filter(field => field.id !== fieldContext.id));
807
+ };
808
+ }, [setFormContext]);
809
+ const debounceTimerRef = react.useRef(undefined);
810
+ const handleChange = e => {
811
+ if (disabled) {
812
+ e.preventDefault();
813
+ return;
814
+ }
815
+ clearTimeout(debounceTimerRef.current);
816
+ const { currentTarget } = e, { value: newValue } = currentTarget;
817
+ setFormContext?.(prevContext => {
818
+ if (!prevContext)
819
+ return [];
820
+ const field = prevContext.find(({ id: fieldID }) => fieldID === fieldContext.id);
821
+ if (!field)
822
+ throw new Error(`Field with id "${fieldContext.id}" not found in form context.`);
823
+ const otherFields = prevContext.filter(({ id: fieldID }) => fieldID !== fieldContext.id);
824
+ const updatedField = { ...field, value: newValue };
825
+ return [...otherFields, updatedField];
826
+ });
827
+ debounceTimerRef.current = setTimeout(() => {
828
+ const field = formContext?.find(({ id: fieldID }) => fieldID === fieldContext.id);
829
+ if (!field)
830
+ return;
831
+ const invalid = validateField(newValue, field) === false;
832
+ if (invalid !== field.invalid)
833
+ setFormContext?.(prevContext => {
834
+ if (!prevContext)
835
+ return [];
836
+ const field = prevContext.find(({ id: fieldID }) => fieldID === fieldContext.id);
837
+ if (!field)
838
+ throw new Error(`Field with id "${fieldContext.id}" not found in form context.`);
839
+ const otherFields = prevContext.filter(({ id: fieldID }) => fieldID !== fieldContext.id);
840
+ const updatedField = { ...field, invalid };
841
+ return [...otherFields, updatedField];
842
+ });
843
+ }, 500);
844
+ onChange?.(e);
845
+ };
846
+ const restFieldProps = fieldProps
847
+ ? Object.fromEntries(Object.entries(fieldProps).filter(([key]) => key !== 'className'))
848
+ : {};
849
+ const restLabelProps = labelProps
850
+ ? Object.fromEntries(Object.entries(labelProps).filter(([key]) => key !== 'className'))
851
+ : {};
852
+ const restDescriptionProps = descriptionProps
853
+ ? Object.fromEntries(Object.entries(descriptionProps).filter(([key]) => key !== 'className'))
854
+ : {};
855
+ return (jsxRuntime.jsxs(react$1.Field, { ...restFieldProps, className: bag => twMerge('grid gap-1', typeof fieldProps?.className === 'function' ? fieldProps?.className(bag) : fieldProps?.className), disabled: disabled, children: [label && (jsxRuntime.jsx(react$1.Label, { ...restLabelProps, className: bag => twMerge('text-sm font-medium', required ? 'after:text-ui-red after:content-["_*"]' : '', typeof labelProps?.className === 'function' ? labelProps?.className(bag) : labelProps?.className), children: label })), jsxRuntime.jsx(react$1.Input, { ...props, className: bag => twMerge('pointer-fine:hover:bg-neutral-50 dark:pointer-fine:hover:bg-neutral-600 pointer-fine:active:bg-neutral-200 dark:pointer-fine:active:bg-neutral-800 border-1 outline-ui-sky-blue/95 focus-visible:outline-3 ease-exponential rounded-xl border-neutral-500/50 bg-neutral-100 py-1 pl-2 text-neutral-950 outline-offset-1 transition-[background-color] duration-300 focus-visible:bg-neutral-50 active:bg-neutral-200 dark:bg-neutral-700 dark:text-neutral-50 dark:focus-visible:bg-neutral-600 dark:active:bg-neutral-800', typeof className === 'function' ? className(bag) : className), invalid: invalid, onChange: handleChange, placeholder: placeholder, ref: ref, type: type }), description && (jsxRuntime.jsx(react$1.Description, { ...restDescriptionProps, className: bag => twMerge('text-xs', typeof descriptionProps?.className === 'function'
856
+ ? descriptionProps?.className(bag)
857
+ : descriptionProps?.className), children: description }))] }));
858
+ }
859
+
860
+ function SubmitButton({ children, className, 'aria-disabled': ariaDisabled, error, incomplete, loading, success, theme, type = 'submit', ref, ...props }) {
861
+ const [formStatus] = useFormStatus();
862
+ const getDisabledStatus = () => {
863
+ if (ariaDisabled !== undefined)
864
+ return ariaDisabled;
865
+ if (formStatus !== 'ready')
866
+ return 'true';
867
+ return 'false';
868
+ };
869
+ const disabled = getDisabledStatus();
870
+ const getFormStatusButtonClasses = () => {
871
+ switch (formStatus) {
872
+ case 'loading':
873
+ return twSort('animate-pulse cursor-wait text-lg font-black leading-6 tracking-widest');
874
+ case 'error':
875
+ case 'success':
876
+ return 'cursor-not-allowed';
877
+ default:
878
+ return undefined;
879
+ }
880
+ };
881
+ const formStatusButtonClasses = getFormStatusButtonClasses();
882
+ const getFormStatusButtonTheme = () => {
883
+ switch (formStatus) {
884
+ case 'incomplete':
885
+ return 'grey';
886
+ case 'loading':
887
+ return 'blue';
888
+ case 'error':
889
+ return 'red';
890
+ case 'success':
891
+ return 'green';
892
+ default:
893
+ return theme;
894
+ }
895
+ };
896
+ const formStatusButtonTheme = getFormStatusButtonTheme();
897
+ const getButtonText = () => {
898
+ switch (formStatus) {
899
+ case 'incomplete':
900
+ return incomplete || 'Complete Form';
901
+ case 'loading':
902
+ return (loading || (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: 'animate-wave animation-delay-300 inline-block', children: "\u2022" }), jsxRuntime.jsx("span", { className: 'animate-wave animation-delay-150 inline-block', children: "\u2022" }), jsxRuntime.jsx("span", { className: 'animate-wave inline-block', children: "\u2022" })] })));
903
+ case 'error':
904
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [error || 'Error', ' ', jsxRuntime.jsx("span", { className: 'absolute top-1/2 ml-1.5 translate-y-[calc(-50%-1.5px)] text-2xl', children: "\u00D7" })] }));
905
+ case 'success':
906
+ return success || 'Successfully Submitted';
907
+ default:
908
+ return children || 'Submit';
909
+ }
910
+ };
911
+ const buttonText = getButtonText();
912
+ return (jsxRuntime.jsx(Button, { ...props, ...(disabled === 'true' ? { 'aria-disabled': 'true', disabled: true } : {}), className: twMerge([formStatusButtonClasses, 'w-full', className]), ref: ref, theme: formStatusButtonTheme, type: type, children: buttonText }));
913
+ }
914
+
915
+ // import { findComponentByType } from '../../utils'
916
+ function FormComponent({ as, children, className, handleSubmit, onError, onSubmit, onSuccess, ...props }) {
917
+ const [formContext] = useFormContext(), [formStatus, setFormStatus] = useFormStatus();
918
+ // const submitButton = findComponentByType(children, SubmitButton)
919
+ react.useEffect(() => {
920
+ if (!formContext)
921
+ return;
922
+ if (formStatus !== 'incomplete' && formContext.find(({ invalid }) => invalid))
923
+ setFormStatus?.('incomplete');
924
+ if (formStatus !== 'ready' && formContext.every(({ invalid }) => !invalid))
925
+ setFormStatus?.('ready');
926
+ }, [formContext]);
927
+ const processSubmit = handleSubmit ||
928
+ (async (e) => {
929
+ e.preventDefault();
930
+ e.stopPropagation();
931
+ setFormStatus?.('loading');
932
+ const response = await onSubmit?.({ event: e, formContext });
933
+ if (response && ('error' in response || response.status === 'error')) {
934
+ setFormStatus?.('error');
935
+ onError?.({ event: e, error: response.error || 'An error occurred when submitting the form.' });
936
+ return;
937
+ }
938
+ if ((response && response.status === 'success') || !response) {
939
+ setFormStatus?.('success');
940
+ onSuccess?.({ event: e });
941
+ }
942
+ });
943
+ const FormElement = as || 'form';
944
+ return (jsxRuntime.jsxs(FormElement, { ...props, className: twMerge(className, 'grid gap-3'), onSubmit: processSubmit, children: [jsxRuntime.jsx("span", { className: 'block text-xl font-black', children: formStatus }), children] }));
945
+ }
946
+ function Form({ controlled = 'auto', initialStatus = 'incomplete', ...props }) {
947
+ const FormContextOrNotProvider = controlled === 'auto' ? FormContextProvider : react.Fragment;
948
+ return (jsxRuntime.jsx(FormStatusProvider, { initialStatus: initialStatus, children: jsxRuntime.jsx(FormContextOrNotProvider, { children: jsxRuntime.jsx(FormComponent, { ...props }) }) }));
949
+ }
950
+
951
+ function Ghost({ children, className, ...props }) {
952
+ return (jsxRuntime.jsx("div", { ...props, className: twMerge('block w-24 max-w-full animate-pulse rounded bg-white/50', className), children: children || jsxRuntime.jsx(jsxRuntime.Fragment, { children: "\u00A0" }) }));
953
+ }
954
+
955
+ function getTextFromChildren(children) {
956
+ let text = '';
957
+ react.Children.forEach(children, child => {
958
+ if (typeof child === 'string' || typeof child === 'number') {
959
+ text += child;
960
+ }
961
+ else if (react.isValidElement(child)) {
962
+ text += getTextFromChildren(child.props.children);
963
+ }
964
+ });
965
+ return text;
966
+ }
967
+ /**
968
+ * # Heading
969
+ * A heading component that renders HTML heading elements (h1-h6) with appropriate styling.
970
+ * Automatically generates an ID for the heading based on its content if none is provided.
971
+ */
972
+ function Heading({ as = 'h2', children, className, id, ref, ...props }) {
973
+ const H = as;
974
+ const targetableID = id || getTextFromChildren(children).replace(/\s+/g, '-').toLowerCase();
975
+ const getBaseClasses = () => {
976
+ switch (as) {
977
+ case 'h1':
978
+ return twSort('pb-2.5 text-6xl font-black last:pb-0');
979
+ case 'h3':
980
+ return twSort('pb-2 text-4xl font-extralight last:pb-0');
981
+ case 'h4':
982
+ return twSort('pb-2 text-3xl font-extrabold last:pb-0');
983
+ case 'h5':
984
+ return twSort('pb-1.5 text-2xl font-semibold last:pb-0');
985
+ case 'h6':
986
+ return twSort('pb-1 text-xl font-bold last:pb-0');
987
+ default:
988
+ return twSort('pb-2.5 text-5xl font-medium last:pb-0');
989
+ }
990
+ };
991
+ const baseClasses = getBaseClasses();
992
+ return (jsxRuntime.jsx(H, { ref: ref, id: targetableID, ...props, className: twMerge(baseClasses, className), children: children }));
993
+ }
994
+
995
+ function xmark(props) {
996
+ return (jsxRuntime.jsx("svg", { viewBox: '0 0 64 64', ...props, children: jsxRuntime.jsx("path", { d: 'M1,63c0.7,0.7,1.6,1,2.6,1s1.9-0.3,2.6-1L32,37.1L57.8,63c0.7,0.7,1.5,1,2.5,1c1,0,1.9-0.3,2.6-1c0.7-0.7,1-1.6,1-2.6 c0-1-0.3-1.8-1-2.5L37.1,32L63,6.2c0.7-0.7,1-1.6,1-2.6S63.7,1.7,63,1c-0.7-0.7-1.6-1-2.6-1c-1,0-1.8,0.3-2.5,1L32,26.9L6.2,1 C5.5,0.3,4.6,0,3.6,0C2.6,0,1.7,0.3,1,1C0.3,1.7,0,2.6,0,3.6c0,1,0.3,1.9,1,2.6L26.9,32L1,57.8c-0.7,0.7-1,1.5-1,2.6 C0,61.4,0.3,62.3,1,63z' }) }));
997
+ }
998
+
999
+ function ModalTrigger({ as, ...props }) {
1000
+ const Element = as || react$1.Button;
1001
+ return jsxRuntime.jsx(Element, { ...props });
1002
+ }
1003
+ function ModalDialog(props) {
1004
+ return jsxRuntime.jsx("div", { ...props });
1005
+ }
1006
+ function Modal({ children, className, onClose, onOpen, place = 'bottom' }) {
1007
+ const [bodyElement, setBodyElement] = react.useState(null);
1008
+ react.useEffect(() => {
1009
+ if (!bodyElement && typeof window !== 'undefined')
1010
+ setBodyElement(document.body);
1011
+ }, [bodyElement]);
1012
+ const [isOpen, setIsOpen] = react.useState(false);
1013
+ const dialogPanelRef = react.useRef(null), dragMoveBoxRef = react.useRef(null),
1014
+ // lastTouchYRef = useRef(0),
1015
+ startDragCoords = react.useRef({ x: 0, y: 0 });
1016
+ const [allowDragClose, setAllowDragClose] = react.useState(false), [readyToClose, setReadyToClose] = react.useState(false);
1017
+ const openModal = () => {
1018
+ console.log('open');
1019
+ setIsOpen(true);
1020
+ onOpen?.();
1021
+ };
1022
+ const closeModal = () => {
1023
+ console.log('close');
1024
+ setIsOpen(false);
1025
+ onClose?.();
1026
+ };
1027
+ const enableClose = (clientX, clientY) => {
1028
+ startDragCoords.current.x = clientX;
1029
+ startDragCoords.current.y = clientY;
1030
+ dialogPanelRef.current.style.transitionDuration = '0s';
1031
+ setAllowDragClose(true);
1032
+ };
1033
+ const enableTouchClose = e => {
1034
+ const { touches } = e, touch = touches[0], { clientY } = touch;
1035
+ enableClose(0, clientY);
1036
+ };
1037
+ const enableMouseClose = e => {
1038
+ const { clientX, clientY } = e;
1039
+ enableClose(clientX, clientY);
1040
+ };
1041
+ const handleMove = (clientX, clientY) => {
1042
+ if (!dialogPanelRef.current)
1043
+ return;
1044
+ let deltaX = clientX - startDragCoords.current.x, deltaY = clientY - startDragCoords.current.y;
1045
+ if (deltaX > 0)
1046
+ deltaX = easeOutExpo(Math.abs(deltaX), 0, 25, 5000);
1047
+ if (deltaX < 0)
1048
+ deltaX = -easeOutExpo(Math.abs(deltaX), 0, 25, 5000);
1049
+ if (deltaY < 0)
1050
+ deltaY = -easeOutExpo(Math.abs(deltaY), 0, 25, 2000);
1051
+ if (deltaY >= 100 && !readyToClose) {
1052
+ setReadyToClose(true);
1053
+ }
1054
+ else if (deltaY < 100 && readyToClose) {
1055
+ setReadyToClose(false);
1056
+ }
1057
+ const greaterThanMediaSmall = innerWidth > 640;
1058
+ dialogPanelRef.current.style.translate = `calc(-50% + ${deltaX}px) ${greaterThanMediaSmall ? `calc(-50% + ${deltaY}px)` : `${deltaY}px`}`;
1059
+ };
1060
+ const handleMouseMove = e => {
1061
+ if (!allowDragClose)
1062
+ return;
1063
+ const { clientX, clientY } = e;
1064
+ handleMove(clientX, clientY);
1065
+ };
1066
+ const disableDragClose = (clientY) => {
1067
+ const deltaY = clientY - startDragCoords.current.y;
1068
+ dialogPanelRef.current.style.transitionDuration = '';
1069
+ if (deltaY >= 100) {
1070
+ closeModal();
1071
+ setReadyToClose(false);
1072
+ }
1073
+ else {
1074
+ setTimeout(() => (dialogPanelRef.current.style.removeProperty('translate'), 50));
1075
+ }
1076
+ };
1077
+ const disableMouseDragClose = e => {
1078
+ if (allowDragClose)
1079
+ setAllowDragClose(false);
1080
+ const { clientY } = e;
1081
+ disableDragClose(clientY);
1082
+ };
1083
+ const content = typeof children === 'function' ? children({ openModal, closeModal }) : children;
1084
+ const dialogElement = findComponentByType(content, ModalDialog);
1085
+ if (!dialogElement)
1086
+ throw new Error('ModalDialog must be defined in Modal children');
1087
+ let triggerElement = null;
1088
+ if (typeof children !== 'function') {
1089
+ triggerElement = findComponentByType(content, ModalTrigger);
1090
+ if (!triggerElement)
1091
+ throw new Error('ModalTrigger must be provided when not using render prop pattern');
1092
+ }
1093
+ else {
1094
+ triggerElement = findComponentByType(content, ModalTrigger);
1095
+ }
1096
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [allowDragClose &&
1097
+ bodyElement &&
1098
+ reactDom.createPortal(jsxRuntime.jsx("div", { ref: dragMoveBoxRef, className: 'z-99 pointer-coarse:hidden fixed inset-0 h-dvh w-screen bg-transparent active:cursor-grabbing', onMouseMove: handleMouseMove, onMouseUp: disableMouseDragClose }), bodyElement), triggerElement &&
1099
+ react.cloneElement(triggerElement, { onClick: openModal }), jsxRuntime.jsxs(react$1.Dialog, { open: isOpen, onClose: closeModal, className: [
1100
+ 'isolate z-50',
1101
+ place === 'bottom' &&
1102
+ 'after:fixed after:inset-x-0 after:bottom-0 after:-z-10 after:h-16 after:bg-neutral-50 sm:after:hidden',
1103
+ ].join(' '), children: [jsxRuntime.jsx(react$1.DialogBackdrop, { transition: true, className: [
1104
+ 'duration-750 ease-exponential data-closed:opacity-0 fixed inset-0 cursor-pointer transition-[opacity_background-color_backdrop-filter_-webkit-backdrop-filter] delay-100',
1105
+ readyToClose
1106
+ ? 'bg-neutral-50/5 backdrop-blur-[1px] dark:bg-neutral-950/5'
1107
+ : 'bg-neutral-50/25 backdrop-blur-sm dark:bg-neutral-950/25',
1108
+ ].join(' '), children: jsxRuntime.jsx(Button, { theme: 'blue', padding: 'none', rounded: 'full', className: 'group/button pointer-fine:hover:w-20 fixed right-4 top-4 h-7 w-7 overflow-x-hidden transition-[scale_width_filter]', children: jsxRuntime.jsxs("div", { className: 'pointer-fine:group-hover/button:-translate-x-0.5 ease-exponential absolute right-1 top-1 flex items-center gap-1 pt-px transition-transform duration-300', children: [jsxRuntime.jsxs("span", { className: 'block text-xs font-medium uppercase leading-none text-neutral-50', children: ["Close", jsxRuntime.jsx("span", { className: 'sr-only', children: " Modal" })] }), jsxRuntime.jsx(xmark, { className: '-top-px block size-5 rotate-90 scale-75 fill-white stroke-white stroke-1 transition-transform duration-300 ease-in-out group-hover/button:rotate-0' })] }) }) }), jsxRuntime.jsxs(react$1.DialogPanel, { ref: dialogPanelRef, transition: true, className: twMerge('duration-750 ease-exponential data-closed:opacity-0 data-closed:scale-50 fixed left-1/2 -translate-x-1/2 overflow-y-scroll bg-neutral-50 p-4 shadow-[0_-15px_50px_-12px] shadow-neutral-950/25 transition-[transform_translate_opacity] sm:w-[calc(100vw-2rem)] sm:max-w-fit sm:p-6 sm:shadow-2xl lg:p-8 dark:bg-neutral-900', place === 'center'
1109
+ ? 'data-enter:translate-y-[calc(-50%+12rem)] data-leave:translate-y-[calc(-50%-8rem)] top-1/2 -translate-y-1/2 rounded-2xl'
1110
+ : 'rounded-t-4xl pointer-fine:top-1/2 pointer-fine:bottom-auto pointer-fine:-translate-y-1/2 pointer-fine:rounded-2xl data-enter:translate-y-full sm:data-enter:translate-y-[calc(-50%+12rem)] data-leave:translate-y-full sm:data-leave:translate-y-[calc(-50%-8rem)] sm:data-open:-translate-y-1/2 bottom-0 h-fit max-h-[calc(100dvh-4rem)] translate-y-0 sm:bottom-auto sm:top-1/2 sm:rounded-b-2xl sm:rounded-t-2xl', className), children: [jsxRuntime.jsx("button", { onTouchStart: enableTouchClose, onMouseDown: enableMouseClose, className: [
1111
+ 'after:ease-exponential absolute inset-x-0 top-0 z-10 flex h-6 cursor-grab items-center justify-center after:h-1 after:w-8 after:rounded-full after:transition-[transform_background-color] after:duration-500 active:cursor-grabbing',
1112
+ readyToClose
1113
+ ? 'after:scale-x-200 after:scale-y-200 after:bg-ui-blue'
1114
+ : 'after:bg-ui-grey/50 active:after:bg-ui-grey pointer-fine:hover:after:scale-x-125 pointer-fine:hover:after:bg-neutral-500/75 pointer-fine:active:after:scale-x-150 pointer-fine:active:after:bg-ui-grey active:after:scale-x-150 active:after:scale-y-125',
1115
+ ].join(' '), children: jsxRuntime.jsx("span", { className: 'sr-only', children: "Drag down to close" }) }), dialogElement] })] })] }));
1116
+ }
1117
+
1118
+ function Time({ children, dateObject, dateTime, day, hours, milliseconds, minutes, month, seconds, year, ref, ...props }) {
1119
+ const [date, setDate] = react.useState(dateObject || undefined);
1120
+ const getDateAndTime = () => {
1121
+ if (dateTime)
1122
+ return dateTime;
1123
+ if (!date)
1124
+ return '';
1125
+ const currentYear = date.getFullYear(), currentMonth = getMonth(date), currentDay = getDate(date), currentHour = getHours(date), currentMinute = getMinutes(date), currentSecond = getSeconds(date), currentMillisecond = getMilliseconds(date);
1126
+ return [currentYear, currentMonth, currentDay, currentHour, currentMinute, currentSecond, currentMillisecond].join('-');
1127
+ };
1128
+ const dateAndTime = getDateAndTime();
1129
+ const getDateDisplay = () => {
1130
+ if (children)
1131
+ return children;
1132
+ if (dateAndTime === '')
1133
+ return '';
1134
+ const [dtYear, dtMonth, dtDay, dtHour, dtMinute, dtSecond, dtMillisecond] = dateAndTime.split('-').map(Number);
1135
+ return [
1136
+ day && dtDay,
1137
+ month && [getMonthName(Number(dtMonth) - 1), month && year && ','].filter(Boolean).join(''),
1138
+ year && dtYear,
1139
+ hours &&
1140
+ minutes &&
1141
+ [
1142
+ 'at',
1143
+ hours && dtHour,
1144
+ hours && minutes && ':',
1145
+ minutes && dtMinute,
1146
+ minutes && seconds && ':',
1147
+ seconds && dtSecond,
1148
+ seconds && milliseconds && '.',
1149
+ milliseconds && dtMillisecond,
1150
+ ]
1151
+ .filter(Boolean)
1152
+ .join(''),
1153
+ ]
1154
+ .filter(Boolean)
1155
+ .join(' ');
1156
+ };
1157
+ const dateDisplay = getDateDisplay();
1158
+ react.useEffect(() => {
1159
+ if (date === undefined &&
1160
+ dateObject === undefined &&
1161
+ dateTime === undefined &&
1162
+ typeof window !== 'undefined' &&
1163
+ (dateAndTime === '' || dateDisplay === ''))
1164
+ setDate(new Date());
1165
+ }, [date, setDate, dateAndTime, dateDisplay, dateObject, dateTime]);
1166
+ return (jsxRuntime.jsx("time", { dateTime: dateAndTime, ref: ref, ...props, children: dateDisplay }));
1167
+ }
1168
+
1169
+ exports.Anchor = Anchor;
1170
+ exports.Button = Button;
1171
+ exports.Form = Form;
1172
+ exports.FormContextProvider = FormContextProvider;
1173
+ exports.FormStatusProvider = FormStatusProvider;
1174
+ exports.Ghost = Ghost;
1175
+ exports.Heading = Heading;
1176
+ exports.Input = Input;
1177
+ exports.Link = Link;
1178
+ exports.Modal = Modal;
1179
+ exports.ModalDialog = ModalDialog;
1180
+ exports.ModalTrigger = ModalTrigger;
1181
+ exports.SubmitButton = SubmitButton;
1182
+ exports.Time = Time;
1183
+ exports.defineField = defineField;
1184
+ exports.useFormContext = useFormContext;
1185
+ exports.useFormStatus = useFormStatus;
1186
+ //# sourceMappingURL=index.js.map