@wow-two-beta/ui 0.0.21 → 0.0.23

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 (67) hide show
  1. package/dist/{chunk-WRPLV6H2.js → chunk-5KVTU5TX.js} +262 -105
  2. package/dist/chunk-5KVTU5TX.js.map +1 -0
  3. package/dist/chunk-XAJKBU6P.js +145 -0
  4. package/dist/chunk-XAJKBU6P.js.map +1 -0
  5. package/dist/{chunk-CBOC2DT2.js → chunk-XLPFX4WK.js} +1323 -3
  6. package/dist/chunk-XLPFX4WK.js.map +1 -0
  7. package/dist/display/animatedNumber/AnimatedNumber.d.ts +14 -0
  8. package/dist/display/animatedNumber/AnimatedNumber.d.ts.map +1 -0
  9. package/dist/display/animatedNumber/index.d.ts +2 -0
  10. package/dist/display/animatedNumber/index.d.ts.map +1 -0
  11. package/dist/display/confetti/Confetti.d.ts +31 -0
  12. package/dist/display/confetti/Confetti.d.ts.map +1 -0
  13. package/dist/display/confetti/index.d.ts +2 -0
  14. package/dist/display/confetti/index.d.ts.map +1 -0
  15. package/dist/display/countUp/CountUp.d.ts +17 -0
  16. package/dist/display/countUp/CountUp.d.ts.map +1 -0
  17. package/dist/display/countUp/index.d.ts +2 -0
  18. package/dist/display/countUp/index.d.ts.map +1 -0
  19. package/dist/display/eventCalendar/EventCalendar.d.ts +30 -0
  20. package/dist/display/eventCalendar/EventCalendar.d.ts.map +1 -0
  21. package/dist/display/eventCalendar/index.d.ts +2 -0
  22. package/dist/display/eventCalendar/index.d.ts.map +1 -0
  23. package/dist/display/gantt/Gantt.d.ts +38 -0
  24. package/dist/display/gantt/Gantt.d.ts.map +1 -0
  25. package/dist/display/gantt/index.d.ts +2 -0
  26. package/dist/display/gantt/index.d.ts.map +1 -0
  27. package/dist/display/gradientText/GradientText.d.ts +18 -0
  28. package/dist/display/gradientText/GradientText.d.ts.map +1 -0
  29. package/dist/display/gradientText/index.d.ts +2 -0
  30. package/dist/display/gradientText/index.d.ts.map +1 -0
  31. package/dist/display/index.d.ts +11 -0
  32. package/dist/display/index.d.ts.map +1 -1
  33. package/dist/display/index.js +2 -2
  34. package/dist/display/marquee/Marquee.d.ts +16 -0
  35. package/dist/display/marquee/Marquee.d.ts.map +1 -0
  36. package/dist/display/marquee/index.d.ts +2 -0
  37. package/dist/display/marquee/index.d.ts.map +1 -0
  38. package/dist/display/scheduleView/ScheduleView.d.ts +30 -0
  39. package/dist/display/scheduleView/ScheduleView.d.ts.map +1 -0
  40. package/dist/display/scheduleView/index.d.ts +2 -0
  41. package/dist/display/scheduleView/index.d.ts.map +1 -0
  42. package/dist/display/scrollReveal/ScrollReveal.d.ts +18 -0
  43. package/dist/display/scrollReveal/ScrollReveal.d.ts.map +1 -0
  44. package/dist/display/scrollReveal/index.d.ts +2 -0
  45. package/dist/display/scrollReveal/index.d.ts.map +1 -0
  46. package/dist/display/tilt/Tilt.d.ts +15 -0
  47. package/dist/display/tilt/Tilt.d.ts.map +1 -0
  48. package/dist/display/tilt/index.d.ts +2 -0
  49. package/dist/display/tilt/index.d.ts.map +1 -0
  50. package/dist/display/typewriter/Typewriter.d.ts +18 -0
  51. package/dist/display/typewriter/Typewriter.d.ts.map +1 -0
  52. package/dist/display/typewriter/index.d.ts +2 -0
  53. package/dist/display/typewriter/index.d.ts.map +1 -0
  54. package/dist/forms/index.d.ts +1 -0
  55. package/dist/forms/index.d.ts.map +1 -1
  56. package/dist/forms/index.js +2 -2
  57. package/dist/forms/recurrenceEditor/RecurrenceEditor.d.ts +28 -0
  58. package/dist/forms/recurrenceEditor/RecurrenceEditor.d.ts.map +1 -0
  59. package/dist/forms/recurrenceEditor/index.d.ts +2 -0
  60. package/dist/forms/recurrenceEditor/index.d.ts.map +1 -0
  61. package/dist/index.css +24 -0
  62. package/dist/index.js +3 -3
  63. package/package.json +1 -1
  64. package/dist/chunk-CBOC2DT2.js.map +0 -1
  65. package/dist/chunk-WRPLV6H2.js.map +0 -1
  66. package/dist/chunk-ZCA365IX.js +0 -44
  67. package/dist/chunk-ZCA365IX.js.map +0 -1
@@ -0,0 +1,145 @@
1
+ import { tv } from './chunk-BMBIZLO4.js';
2
+ import { Icon } from './chunk-TDX22OWF.js';
3
+ import { cn } from './chunk-KZ4VFY2T.js';
4
+ import { forwardRef } from 'react';
5
+ import { X } from 'lucide-react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ // src/display/tag/Tag.variants.ts
9
+ var tagVariants = tv({
10
+ base: "inline-flex items-center gap-1 rounded-md border border-border bg-card px-2 py-0.5 text-xs font-medium text-card-foreground",
11
+ variants: {
12
+ variant: {
13
+ neutral: "",
14
+ brand: "border-transparent bg-primary-soft text-primary-soft-foreground",
15
+ success: "border-transparent bg-success-soft text-success-soft-foreground",
16
+ warning: "border-transparent bg-warning-soft text-warning-soft-foreground",
17
+ danger: "border-transparent bg-destructive-soft text-destructive-soft-foreground",
18
+ info: "border-transparent bg-info-soft text-info-soft-foreground"
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ variant: "neutral"
23
+ }
24
+ });
25
+ var Tag = forwardRef(
26
+ ({ children, onClose, closeLabel = "Remove", variant, className, ...props }, ref) => /* @__PURE__ */ jsxs("span", { ref, className: cn(tagVariants({ variant }), className), ...props, children: [
27
+ children,
28
+ onClose && /* @__PURE__ */ jsx(
29
+ "button",
30
+ {
31
+ type: "button",
32
+ "aria-label": closeLabel,
33
+ onClick: onClose,
34
+ className: "-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
35
+ children: /* @__PURE__ */ jsx(Icon, { icon: X, size: 12 })
36
+ }
37
+ )
38
+ ] })
39
+ );
40
+ Tag.displayName = "Tag";
41
+
42
+ // src/forms/DateExtensions.ts
43
+ var WEEKDAYS_SHORT = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
44
+ var MONTHS_LONG = [
45
+ "January",
46
+ "February",
47
+ "March",
48
+ "April",
49
+ "May",
50
+ "June",
51
+ "July",
52
+ "August",
53
+ "September",
54
+ "October",
55
+ "November",
56
+ "December"
57
+ ];
58
+ function startOfDay(d) {
59
+ const c = new Date(d);
60
+ c.setHours(0, 0, 0, 0);
61
+ return c;
62
+ }
63
+ function isSameDay(a, b) {
64
+ if (!a || !b) return false;
65
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
66
+ }
67
+ function isToday(d) {
68
+ return isSameDay(d, /* @__PURE__ */ new Date());
69
+ }
70
+ function addMonths(d, n) {
71
+ const c = new Date(d);
72
+ c.setMonth(c.getMonth() + n);
73
+ return c;
74
+ }
75
+ function addDays(d, n) {
76
+ const c = new Date(d);
77
+ c.setDate(c.getDate() + n);
78
+ return c;
79
+ }
80
+ function startOfMonth(d) {
81
+ return new Date(d.getFullYear(), d.getMonth(), 1);
82
+ }
83
+ function buildMonthGrid(year, month) {
84
+ const first = new Date(year, month, 1);
85
+ const firstWeekday = first.getDay();
86
+ const start = addDays(first, -firstWeekday);
87
+ const cells = [];
88
+ for (let i = 0; i < 42; i++) {
89
+ const date = addDays(start, i);
90
+ cells.push({ date, outOfMonth: date.getMonth() !== month });
91
+ }
92
+ return cells;
93
+ }
94
+ function formatISODate(d) {
95
+ if (!d) return "";
96
+ const year = d.getFullYear();
97
+ const month = String(d.getMonth() + 1).padStart(2, "0");
98
+ const day = String(d.getDate()).padStart(2, "0");
99
+ return `${year}-${month}-${day}`;
100
+ }
101
+ function parseISODate(s) {
102
+ if (!s) return null;
103
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
104
+ if (!m) return null;
105
+ const [, y, mo, d] = m;
106
+ if (!y || !mo || !d) return null;
107
+ const date = new Date(Number(y), Number(mo) - 1, Number(d));
108
+ if (isNaN(date.getTime())) return null;
109
+ return date;
110
+ }
111
+ function formatISOTime(d) {
112
+ if (!d) return "";
113
+ const h = String(d.getHours()).padStart(2, "0");
114
+ const m = String(d.getMinutes()).padStart(2, "0");
115
+ return `${h}:${m}`;
116
+ }
117
+ function parseISOTime(s) {
118
+ if (!s) return null;
119
+ const m = /^(\d{2}):(\d{2})$/.exec(s);
120
+ if (!m) return null;
121
+ const [, h, mi] = m;
122
+ if (!h || !mi) return null;
123
+ const hours = Number(h);
124
+ const minutes = Number(mi);
125
+ if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;
126
+ return { hours, minutes };
127
+ }
128
+ function isDateDisabled(d, options) {
129
+ const { min, max, isDisabled } = options;
130
+ if (min && startOfDay(d) < startOfDay(min)) return true;
131
+ if (max && startOfDay(d) > startOfDay(max)) return true;
132
+ if (isDisabled?.(d)) return true;
133
+ return false;
134
+ }
135
+ function isInRange(d, start, end) {
136
+ if (!start || !end) return false;
137
+ const t = startOfDay(d).getTime();
138
+ const s = startOfDay(start).getTime();
139
+ const e = startOfDay(end).getTime();
140
+ return t >= Math.min(s, e) && t <= Math.max(s, e);
141
+ }
142
+
143
+ export { MONTHS_LONG, Tag, WEEKDAYS_SHORT, addDays, addMonths, buildMonthGrid, formatISODate, formatISOTime, isDateDisabled, isInRange, isSameDay, isToday, parseISODate, parseISOTime, startOfDay, startOfMonth, tagVariants };
144
+ //# sourceMappingURL=chunk-XAJKBU6P.js.map
145
+ //# sourceMappingURL=chunk-XAJKBU6P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/display/tag/Tag.variants.ts","../src/display/tag/Tag.tsx","../src/forms/DateExtensions.ts"],"names":[],"mappings":"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","file":"chunk-XAJKBU6P.js","sourcesContent":["import { tv, type VariantProps } from '../../utils';\n\nexport const tagVariants = tv({\n base: 'inline-flex items-center gap-1 rounded-md border border-border bg-card px-2 py-0.5 text-xs font-medium text-card-foreground',\n variants: {\n variant: {\n neutral: '',\n brand: 'border-transparent bg-primary-soft text-primary-soft-foreground',\n success: 'border-transparent bg-success-soft text-success-soft-foreground',\n warning: 'border-transparent bg-warning-soft text-warning-soft-foreground',\n danger: 'border-transparent bg-destructive-soft text-destructive-soft-foreground',\n info: 'border-transparent bg-info-soft text-info-soft-foreground',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n },\n});\n\nexport type TagVariants = VariantProps<typeof tagVariants>;\n","import { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils';\nimport { Icon } from '../../icons';\nimport { tagVariants, type TagVariants } from './Tag.variants';\n\nexport interface TagProps\n extends Omit<ComponentPropsWithoutRef<'span'>, 'children'>,\n TagVariants {\n children?: ReactNode;\n /** Show a close (×) button. Pass a handler to receive the click. */\n onClose?: () => void;\n /** Accessible label for the close button. Default `\"Remove\"`. */\n closeLabel?: string;\n}\n\n/**\n * Pill with an optional close button. The close button is a raw `<button>`\n * (not `IconButton`) so this stays a strict atom.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(\n ({ children, onClose, closeLabel = 'Remove', variant, className, ...props }, ref) => (\n <span ref={ref} className={cn(tagVariants({ variant }), className)} {...props}>\n {children}\n {onClose && (\n <button\n type=\"button\"\n aria-label={closeLabel}\n onClick={onClose}\n className=\"-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Icon icon={X} size={12} />\n </button>\n )}\n </span>\n ),\n);\nTag.displayName = 'Tag';\n","// Shared date helpers for Calendar / DatePicker / DateField / RangeCalendar.\n// Co-located in `forms/` so imports stay within-domain.\n//\n// Native Date only — no date-fns / luxon dependency. All helpers operate on\n// local time (no UTC math) since calendar UIs are inherently local.\n\nexport const WEEKDAYS_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nexport const MONTHS_LONG = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport function startOfDay(d: Date): Date {\n const c = new Date(d);\n c.setHours(0, 0, 0, 0);\n return c;\n}\n\nexport function isSameDay(a: Date | null | undefined, b: Date | null | undefined): boolean {\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function isToday(d: Date): boolean {\n return isSameDay(d, new Date());\n}\n\nexport function addMonths(d: Date, n: number): Date {\n const c = new Date(d);\n c.setMonth(c.getMonth() + n);\n return c;\n}\n\nexport function addDays(d: Date, n: number): Date {\n const c = new Date(d);\n c.setDate(c.getDate() + n);\n return c;\n}\n\nexport function startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n}\n\nexport function daysInMonth(year: number, month: number): number {\n // month is 0-indexed; setting day 0 of next month gives last day of month.\n return new Date(year, month + 1, 0).getDate();\n}\n\n/**\n * Build the 6-week (42-cell) grid that the calendar UI renders.\n * Cells outside the target month carry `outOfMonth: true`.\n */\nexport function buildMonthGrid(year: number, month: number): { date: Date; outOfMonth: boolean }[] {\n const first = new Date(year, month, 1);\n const firstWeekday = first.getDay(); // 0 (Sun) – 6 (Sat)\n const start = addDays(first, -firstWeekday);\n const cells: { date: Date; outOfMonth: boolean }[] = [];\n for (let i = 0; i < 42; i++) {\n const date = addDays(start, i);\n cells.push({ date, outOfMonth: date.getMonth() !== month });\n }\n return cells;\n}\n\n/** Format Date → \"YYYY-MM-DD\" for native `<input type=\"date\">` value. */\nexport function formatISODate(d: Date | null | undefined): string {\n if (!d) return '';\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/** Parse \"YYYY-MM-DD\" → Date (local time). Returns null for invalid input. */\nexport function parseISODate(s: string | null | undefined): Date | null {\n if (!s) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, y, mo, d] = m;\n if (!y || !mo || !d) return null;\n const date = new Date(Number(y), Number(mo) - 1, Number(d));\n if (isNaN(date.getTime())) return null;\n return date;\n}\n\n/** Format Date → \"HH:MM\" for native `<input type=\"time\">` value. */\nexport function formatISOTime(d: Date | null | undefined): string {\n if (!d) return '';\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n return `${h}:${m}`;\n}\n\n/** Parse \"HH:MM\" → { hours, minutes }. Returns null for invalid input. */\nexport function parseISOTime(s: string | null | undefined): { hours: number; minutes: number } | null {\n if (!s) return null;\n const m = /^(\\d{2}):(\\d{2})$/.exec(s);\n if (!m) return null;\n const [, h, mi] = m;\n if (!h || !mi) return null;\n const hours = Number(h);\n const minutes = Number(mi);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null;\n return { hours, minutes };\n}\n\nexport function clampDate(d: Date, min?: Date | null, max?: Date | null): Date {\n if (min && d < min) return min;\n if (max && d > max) return max;\n return d;\n}\n\nexport function isDateDisabled(\n d: Date,\n options: { min?: Date | null; max?: Date | null; isDisabled?: (d: Date) => boolean },\n): boolean {\n const { min, max, isDisabled } = options;\n if (min && startOfDay(d) < startOfDay(min)) return true;\n if (max && startOfDay(d) > startOfDay(max)) return true;\n if (isDisabled?.(d)) return true;\n return false;\n}\n\nexport function isInRange(\n d: Date,\n start: Date | null | undefined,\n end: Date | null | undefined,\n): boolean {\n if (!start || !end) return false;\n const t = startOfDay(d).getTime();\n const s = startOfDay(start).getTime();\n const e = startOfDay(end).getTime();\n return t >= Math.min(s, e) && t <= Math.max(s, e);\n}\n"]}