@ecopages/radiant-ui 0.1.0-beta.3 → 0.1.0-beta.6

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 (185) hide show
  1. package/dist/components/ui/autocomplete/autocomplete.css +135 -0
  2. package/dist/components/ui/autocomplete/autocomplete.d.ts +21 -0
  3. package/dist/components/ui/autocomplete/autocomplete.script.d.ts +42 -0
  4. package/dist/components/ui/autocomplete/index.d.ts +2 -0
  5. package/dist/components/ui/autocomplete/index.js +2 -0
  6. package/dist/components/ui/autocomplete/index.js.map +7 -0
  7. package/dist/components/ui/avatar/avatar.css +58 -0
  8. package/dist/components/ui/avatar/avatar.d.ts +13 -0
  9. package/dist/components/ui/avatar/index.d.ts +1 -0
  10. package/dist/components/ui/avatar/index.js +2 -0
  11. package/dist/components/ui/avatar/index.js.map +7 -0
  12. package/dist/components/ui/button-group/button-group.css +16 -0
  13. package/dist/components/ui/button-group/button-group.d.ts +10 -0
  14. package/dist/components/ui/button-group/index.d.ts +1 -0
  15. package/dist/components/ui/button-group/index.js +2 -0
  16. package/dist/components/ui/button-group/index.js.map +7 -0
  17. package/dist/components/ui/calendar/calendar.css +318 -0
  18. package/dist/components/ui/calendar/calendar.d.ts +5 -0
  19. package/dist/components/ui/calendar/calendar.script.d.ts +89 -0
  20. package/dist/components/ui/calendar/index.d.ts +2 -0
  21. package/dist/components/ui/calendar/index.js +2 -0
  22. package/dist/components/ui/calendar/index.js.map +7 -0
  23. package/dist/components/ui/chip/chip.css +47 -0
  24. package/dist/components/ui/chip/chip.d.ts +11 -0
  25. package/dist/components/ui/chip/index.d.ts +1 -0
  26. package/dist/components/ui/chip/index.js +2 -0
  27. package/dist/components/ui/chip/index.js.map +7 -0
  28. package/dist/components/ui/chip-list/chip-list.css +15 -0
  29. package/dist/components/ui/chip-list/chip-list.d.ts +10 -0
  30. package/dist/components/ui/chip-list/index.d.ts +1 -0
  31. package/dist/components/ui/chip-list/index.js +2 -0
  32. package/dist/components/ui/chip-list/index.js.map +7 -0
  33. package/dist/components/ui/combobox/combobox.css +42 -80
  34. package/dist/components/ui/combobox/combobox.d.ts +12 -20
  35. package/dist/components/ui/combobox/combobox.script.d.ts +15 -14
  36. package/dist/components/ui/combobox/index.d.ts +2 -1
  37. package/dist/components/ui/combobox/index.js +1 -1
  38. package/dist/components/ui/combobox/index.js.map +4 -4
  39. package/dist/components/ui/date-field/date-field.css +184 -0
  40. package/dist/components/ui/date-field/date-field.d.ts +10 -0
  41. package/dist/components/ui/date-field/date-field.script.d.ts +108 -0
  42. package/dist/components/ui/date-field/index.d.ts +2 -0
  43. package/dist/components/ui/date-field/index.js +2 -0
  44. package/dist/components/ui/date-field/index.js.map +7 -0
  45. package/dist/components/ui/date-range-picker/date-range-picker.css +194 -0
  46. package/dist/components/ui/date-range-picker/date-range-picker.d.ts +10 -0
  47. package/dist/components/ui/date-range-picker/date-range-picker.script.d.ts +99 -0
  48. package/dist/components/ui/date-range-picker/index.d.ts +2 -0
  49. package/dist/components/ui/date-range-picker/index.js +2 -0
  50. package/dist/components/ui/date-range-picker/index.js.map +7 -0
  51. package/dist/components/ui/dialog/dialog.css +1 -1
  52. package/dist/components/ui/feed/feed.css +169 -5
  53. package/dist/components/ui/feed/feed.d.ts +54 -11
  54. package/dist/components/ui/feed/index.d.ts +1 -2
  55. package/dist/components/ui/feed/index.js +1 -1
  56. package/dist/components/ui/feed/index.js.map +4 -4
  57. package/dist/components/ui/field/index.js +1 -1
  58. package/dist/components/ui/field/index.js.map +3 -3
  59. package/dist/components/ui/form/form-field.test.d.ts +1 -0
  60. package/dist/components/ui/form/index.js +1 -1
  61. package/dist/components/ui/form/index.js.map +3 -3
  62. package/dist/components/ui/heading/heading.css +107 -0
  63. package/dist/components/ui/heading/heading.d.ts +30 -0
  64. package/dist/components/ui/heading/index.d.ts +1 -0
  65. package/dist/components/ui/heading/index.js +2 -0
  66. package/dist/components/ui/heading/index.js.map +7 -0
  67. package/dist/components/ui/headline/headline.css +43 -0
  68. package/dist/components/ui/headline/headline.d.ts +16 -0
  69. package/dist/components/ui/headline/index.d.ts +1 -0
  70. package/dist/components/ui/headline/index.js +2 -0
  71. package/dist/components/ui/headline/index.js.map +7 -0
  72. package/dist/components/ui/input/index.js +1 -1
  73. package/dist/components/ui/input/index.js.map +4 -4
  74. package/dist/components/ui/input/input.d.ts +8 -1
  75. package/dist/components/ui/label/index.js +1 -1
  76. package/dist/components/ui/label/index.js.map +2 -2
  77. package/dist/components/ui/listbox/index.d.ts +1 -1
  78. package/dist/components/ui/listbox/index.js +1 -1
  79. package/dist/components/ui/listbox/index.js.map +4 -4
  80. package/dist/components/ui/listbox/listbox.css +34 -10
  81. package/dist/components/ui/listbox/listbox.d.ts +12 -4
  82. package/dist/components/ui/listbox/listbox.script.d.ts +12 -0
  83. package/dist/components/ui/menu-button/index.js +1 -1
  84. package/dist/components/ui/menu-button/index.js.map +4 -4
  85. package/dist/components/ui/menu-button/menu-button.css +24 -8
  86. package/dist/components/ui/menu-button/menu-button.script.d.ts +3 -4
  87. package/dist/components/ui/menubar/index.js +1 -1
  88. package/dist/components/ui/menubar/index.js.map +4 -4
  89. package/dist/components/ui/menubar/menubar.css +40 -22
  90. package/dist/components/ui/menubar/menubar.script.d.ts +6 -1
  91. package/dist/components/ui/number-field/index.d.ts +2 -0
  92. package/dist/components/ui/number-field/index.js +2 -0
  93. package/dist/components/ui/number-field/index.js.map +7 -0
  94. package/dist/components/ui/number-field/number-field.css +185 -0
  95. package/dist/components/ui/number-field/number-field.d.ts +43 -0
  96. package/dist/components/ui/number-field/number-field.script.d.ts +104 -0
  97. package/dist/components/ui/popover/index.d.ts +4 -0
  98. package/dist/components/ui/popover/index.js +2 -0
  99. package/dist/components/ui/popover/index.js.map +7 -0
  100. package/dist/components/ui/popover/popover.css +132 -0
  101. package/dist/components/ui/popover/popover.d.ts +15 -0
  102. package/dist/components/ui/popover/popover.script.d.ts +85 -0
  103. package/dist/components/ui/select/index.d.ts +3 -0
  104. package/dist/components/ui/select/index.js +2 -0
  105. package/dist/components/ui/select/index.js.map +7 -0
  106. package/dist/components/ui/select/select.css +216 -0
  107. package/dist/components/ui/select/select.d.ts +54 -0
  108. package/dist/components/ui/select/select.script.d.ts +106 -0
  109. package/dist/components/ui/shared/collection-navigation.d.ts +8 -0
  110. package/dist/components/ui/shared/collection-navigation.test.d.ts +1 -0
  111. package/dist/components/ui/shared/control-toggle.css +132 -0
  112. package/dist/components/ui/shared/field-label.d.ts +9 -0
  113. package/dist/components/ui/shared/floating-position.d.ts +13 -2
  114. package/dist/components/ui/shared/listbox-popover-behavior.d.ts +47 -0
  115. package/dist/components/ui/shared/listbox-popover-behavior.test.d.ts +1 -0
  116. package/dist/components/ui/shared/multi-value.d.ts +4 -0
  117. package/dist/components/ui/shared/popover-controller.d.ts +35 -0
  118. package/dist/components/ui/shared/popover-controller.test.d.ts +1 -0
  119. package/dist/components/ui/shared/popover.css +123 -0
  120. package/dist/components/ui/shared/portal.d.ts +7 -0
  121. package/dist/components/ui/shared/portal.test.d.ts +1 -0
  122. package/dist/components/ui/sidebar/index.js +1 -1
  123. package/dist/components/ui/sidebar/index.js.map +3 -3
  124. package/dist/components/ui/slider/index.js +1 -1
  125. package/dist/components/ui/slider/index.js.map +3 -3
  126. package/dist/components/ui/slider/slider.script.d.ts +5 -12
  127. package/dist/components/ui/tag-group/index.d.ts +2 -0
  128. package/dist/components/ui/tag-group/index.js +2 -0
  129. package/dist/components/ui/tag-group/index.js.map +7 -0
  130. package/dist/components/ui/tag-group/tag-group.css +184 -0
  131. package/dist/components/ui/tag-group/tag-group.d.ts +28 -0
  132. package/dist/components/ui/tag-group/tag-group.script.d.ts +65 -0
  133. package/dist/components/ui/textarea/index.js +1 -1
  134. package/dist/components/ui/textarea/index.js.map +2 -2
  135. package/dist/components/ui/toc/index.js +1 -1
  136. package/dist/components/ui/toc/index.js.map +3 -3
  137. package/dist/components/ui/toc/toc.css +1 -1
  138. package/dist/components/ui/toc/toc.ssr.test.d.ts +1 -0
  139. package/dist/components/ui/toc/toc.test.d.ts +1 -0
  140. package/dist/components/ui/tooltip/index.js +1 -1
  141. package/dist/components/ui/tooltip/index.js.map +3 -3
  142. package/dist/index.d.ts +14 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +4 -4
  145. package/dist/lib/icons/calendar.d.ts +3 -0
  146. package/dist/lib/icons/chevron-down.d.ts +3 -0
  147. package/dist/lib/icons/index.d.ts +3 -0
  148. package/dist/lib/icons/types.d.ts +4 -0
  149. package/dist/lib/intl/locale.d.ts +3 -0
  150. package/dist/lib/intl-date/calendar.d.ts +25 -0
  151. package/dist/lib/intl-date/formatters.d.ts +13 -0
  152. package/dist/lib/intl-date/index.d.ts +12 -0
  153. package/dist/lib/intl-date/iso.d.ts +6 -0
  154. package/dist/lib/intl-date/months.d.ts +12 -0
  155. package/dist/lib/intl-date/parts.d.ts +15 -0
  156. package/dist/lib/intl-date/parts.test.d.ts +1 -0
  157. package/dist/lib/intl-date/segments.d.ts +32 -0
  158. package/dist/lib/intl-date/segments.test.d.ts +1 -0
  159. package/dist/lib/intl-date/selection.d.ts +39 -0
  160. package/dist/lib/intl-date/selection.test.d.ts +1 -0
  161. package/dist/lib/intl-date/types.d.ts +17 -0
  162. package/dist/lib/intl-number/format.d.ts +9 -0
  163. package/dist/lib/intl-number/index.d.ts +2 -0
  164. package/dist/lib/intl-number/range.d.ts +3 -0
  165. package/dist/lib/intrinsic.d.ts +13 -0
  166. package/dist/lib/mask/date-mask.d.ts +29 -0
  167. package/dist/lib/mask/date-mask.test.d.ts +1 -0
  168. package/dist/lib/mask/index.d.ts +4 -0
  169. package/dist/lib/mask/input-mask.d.ts +52 -0
  170. package/dist/lib/mask/input-mask.test.d.ts +1 -0
  171. package/dist/lib/text-filter.d.ts +7 -0
  172. package/dist/lib/text-filter.test.d.ts +1 -0
  173. package/dist/styles/radiant-ui-core.css +131 -1
  174. package/dist/styles/radiant-ui.css +142 -1
  175. package/dist/styles/styles.css +4504 -2395
  176. package/dist/styles/tailwind.css +142 -1
  177. package/dist/styles/tokens/typography/default.css +8 -0
  178. package/package.json +106 -15
  179. package/dist/components/ui/feed/feed.script.d.ts +0 -22
  180. package/dist/components/ui/spinbutton/index.d.ts +0 -2
  181. package/dist/components/ui/spinbutton/index.js +0 -2
  182. package/dist/components/ui/spinbutton/index.js.map +0 -7
  183. package/dist/components/ui/spinbutton/spinbutton.css +0 -69
  184. package/dist/components/ui/spinbutton/spinbutton.d.ts +0 -5
  185. package/dist/components/ui/spinbutton/spinbutton.script.d.ts +0 -64
@@ -0,0 +1,3 @@
1
+ import type { RuiIconProps } from './types';
2
+ /** Calendar indicator for date picker triggers. */
3
+ export declare function RuiIconCalendar({ class: className, size, ...props }: RuiIconProps): import("@ecopages/jsx").JsxRenderable;
@@ -0,0 +1,3 @@
1
+ import type { RuiIconProps } from './types';
2
+ /** Chevron-down indicator for listbox and combobox toggles. */
3
+ export declare function RuiIconChevronDown({ class: className, size, ...props }: RuiIconProps): import("@ecopages/jsx").JsxRenderable;
@@ -0,0 +1,3 @@
1
+ export { RuiIconCalendar } from './calendar';
2
+ export { RuiIconChevronDown } from './chevron-down';
3
+ export type { RuiIconProps } from './types';
@@ -0,0 +1,4 @@
1
+ import type { JsxHtmlProps } from '@ecopages/jsx';
2
+ export type RuiIconProps = JsxHtmlProps<{
3
+ size?: 'sm' | 'md';
4
+ }>;
@@ -0,0 +1,3 @@
1
+ export type IntlLocale = string | string[] | undefined;
2
+ /** Parses the public comma-separated locale fallback syntax into Intl input. */
3
+ export declare function resolveLocale(locale?: string): IntlLocale;
@@ -0,0 +1,25 @@
1
+ import { type CalendarSelectionMode, type IsoRange } from './selection';
2
+ import type { CalendarWeek, IntlLocale } from './types';
3
+ export type { CalendarSelectionMode, IsoRange };
4
+ /**
5
+ * Returns the JS weekday index (0 = Sunday) that starts the week for `locale`.
6
+ *
7
+ * @remarks Uses `Intl.Locale.weekInfo` when available; falls back to Monday except en-US.
8
+ */
9
+ export declare function getWeekStartsOn(locale: IntlLocale): number;
10
+ export type BuildCalendarMonthOptions = {
11
+ locale: IntlLocale;
12
+ selectionMode?: CalendarSelectionMode;
13
+ /** Single mode: selected ISO. Multiple: comma-separated. Range: `start/end`. */
14
+ value?: string;
15
+ /** Active range while selecting (anchor + hover preview). */
16
+ rangeDraft?: {
17
+ anchor: string | null;
18
+ hover: string | null;
19
+ };
20
+ min?: string;
21
+ max?: string;
22
+ today?: Date;
23
+ };
24
+ /** Builds a month grid with leading/trailing days from adjacent months. */
25
+ export declare function buildCalendarMonth(year: number, month: number, options: BuildCalendarMonthOptions): CalendarWeek[];
@@ -0,0 +1,13 @@
1
+ import type { DateDisplayStyle, IntlLocale } from './types';
2
+ /** Returns a cached `Intl.DateTimeFormat` for the given locale and options. */
3
+ export declare function getDateTimeFormat(locale: IntlLocale, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat;
4
+ /** Formats a date for display using a `dateStyle` preset. */
5
+ export declare function formatDisplayDate(date: Date, locale: IntlLocale, style?: DateDisplayStyle): string;
6
+ /** Formats the month and year shown in the calendar header. */
7
+ export declare function formatMonthYear(date: Date, locale: IntlLocale): string;
8
+ /** Returns localized narrow weekday labels ordered by the locale's first day of week. */
9
+ export declare function getWeekdayLabels(locale: IntlLocale, weekStartsOn: number): string[];
10
+ /** Formats a date range for display using a `dateStyle` preset. */
11
+ export declare function formatDateRange(start: Date, end: Date, locale: IntlLocale, style?: DateDisplayStyle): string;
12
+ /** Localized label for the "today" shortcut (e.g. "today", "vandaag"). */
13
+ export declare function formatTodayLabel(locale: IntlLocale): string;
@@ -0,0 +1,12 @@
1
+ export { buildCalendarMonth, getWeekStartsOn } from './calendar';
2
+ export type { BuildCalendarMonthOptions, CalendarSelectionMode, IsoRange } from './calendar';
3
+ export { addMonths, getVisibleMonthViews } from './months';
4
+ export type { CalendarMonthView } from './months';
5
+ export { advanceRangeSelection, compareIso, getActiveRangeBounds, getDaySelectionAppearance, isIsoInSpan, normalizeRange, parseIsoRange, parseMultipleIsos, serializeIsoRange, serializeMultipleIsos, toggleMultipleIso, } from './selection';
6
+ export type { DaySelectionAppearance, RangeSelectionDraft } from './selection';
7
+ export { formatDisplayDate, formatDateRange, formatMonthYear, formatTodayLabel, getDateTimeFormat, getWeekdayLabels, } from './formatters';
8
+ export { dateToIso, isoToDate, isIsoInRange } from './iso';
9
+ export { getDatePartOrder, getDateSeparators, parseLocaleDateString } from './parts';
10
+ export { buildDateSegments, clampSegmentValue, getEditableSegmentIndices, incrementSegment, maxSegmentLength, segmentsToDate, } from './segments';
11
+ export type { CalendarDayCell, CalendarWeek, DateDisplayStyle, DateGranularity, DatePartType, IntlLocale, } from './types';
12
+ export type { DateSegmentModel, DateSegmentType } from './segments';
@@ -0,0 +1,6 @@
1
+ /** Parses an ISO `YYYY-MM-DD` string into a local-midnight `Date`, or `null` when invalid. */
2
+ export declare function isoToDate(iso: string | null | undefined): Date | null;
3
+ /** Serializes a local calendar date to ISO `YYYY-MM-DD`. */
4
+ export declare function dateToIso(date: Date): string;
5
+ /** Returns true when `iso` falls within optional `min` / `max` bounds (inclusive). */
6
+ export declare function isIsoInRange(iso: string, min?: string, max?: string): boolean;
@@ -0,0 +1,12 @@
1
+ /** Zero-based month index with year rollover. */
2
+ export declare function addMonths(year: number, month: number, delta: number): {
3
+ year: number;
4
+ month: number;
5
+ };
6
+ export type CalendarMonthView = {
7
+ year: number;
8
+ month: number;
9
+ offset: number;
10
+ };
11
+ /** Returns consecutive month views starting at `year`/`month`. */
12
+ export declare function getVisibleMonthViews(year: number, month: number, count: number): CalendarMonthView[];
@@ -0,0 +1,15 @@
1
+ import type { DatePartType, IntlLocale } from './types';
2
+ /**
3
+ * Uses `formatToParts()` on a fixed reference date to discover the locale's
4
+ * year/month/day field order (e.g. MDY for en-US, DMY for en-GB, YMD for ja-JP).
5
+ */
6
+ export declare function getDatePartOrder(locale: IntlLocale): DatePartType[];
7
+ /** Literal separators between numeric date parts for the locale (e.g. `['/']` for en-US). */
8
+ export declare function getDateSeparators(locale: IntlLocale): string[];
9
+ /**
10
+ * Parses a user-typed date string according to locale conventions.
11
+ *
12
+ * Accepts ISO `YYYY-MM-DD`, masked numeric input (`08/21/2002`), locale-ordered
13
+ * numeric input (`9/3/2026`), and text month names (`Aug 21, 2002`).
14
+ */
15
+ export declare function parseLocaleDateString(input: string | null | undefined, locale: IntlLocale): Date | null;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import type { DateGranularity, DatePartType, IntlLocale } from './types';
2
+ export type DateSegmentType = DatePartType | 'literal';
3
+ /** @experimental Segment model reserved for a future segment-editor field. */
4
+ export type DateSegmentModel = {
5
+ type: DateSegmentType;
6
+ /** Visible text for literals; numeric string for editable segments. */
7
+ value: string;
8
+ placeholder: string;
9
+ isPlaceholder: boolean;
10
+ editable: boolean;
11
+ };
12
+ /**
13
+ * Builds locale-ordered date segments from `Intl.DateTimeFormat.prototype.formatToParts()`.
14
+ *
15
+ * @remarks Mirrors the React Aria `DateInput` segment list — literals plus editable fields.
16
+ * @experimental Reserved for a future segment-editor field.
17
+ */
18
+ export declare function buildDateSegments(date: Date | null, locale: IntlLocale, options?: {
19
+ granularity?: DateGranularity;
20
+ placeholderDate?: Date;
21
+ }): DateSegmentModel[];
22
+ /**
23
+ * Converts editable segment values into a local calendar `Date`, or `null` when incomplete.
24
+ *
25
+ * @experimental Reserved for a future segment-editor field.
26
+ */
27
+ export declare function segmentsToDate(segments: DateSegmentModel[]): Date | null;
28
+ /** @experimental Reserved for a future segment-editor field. */
29
+ export declare function getEditableSegmentIndices(segments: DateSegmentModel[]): number[];
30
+ export declare function maxSegmentLength(type: DatePartType): number;
31
+ export declare function clampSegmentValue(type: DatePartType, raw: string): string;
32
+ export declare function incrementSegment(type: DatePartType, value: string, delta: number): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ export type CalendarSelectionMode = 'single' | 'multiple' | 'range';
2
+ export type IsoRange = {
3
+ start: string;
4
+ end: string;
5
+ };
6
+ export type RangeSelectionDraft = {
7
+ anchor: string | null;
8
+ hover: string | null;
9
+ };
10
+ export type DaySelectionAppearance = {
11
+ isSelected: boolean;
12
+ isRangeStart: boolean;
13
+ isRangeEnd: boolean;
14
+ isRangeMiddle: boolean;
15
+ };
16
+ /** Lexicographic compare for ISO `YYYY-MM-DD` strings. */
17
+ export declare function compareIso(a: string, b: string): number;
18
+ export declare function normalizeRange(start: string, end: string): IsoRange;
19
+ export declare function parseIsoRange(value: string | null | undefined): IsoRange | null;
20
+ export declare function serializeIsoRange(range: IsoRange | null): string;
21
+ export declare function parseMultipleIsos(value: string | null | undefined): string[];
22
+ export declare function serializeMultipleIsos(values: Iterable<string>): string;
23
+ export declare function toggleMultipleIso(selected: readonly string[], iso: string): string[];
24
+ export declare function isIsoInSpan(iso: string, range: IsoRange): boolean;
25
+ export declare function getActiveRangeBounds(committed: IsoRange | null, draft: RangeSelectionDraft): IsoRange | null;
26
+ export declare function getDaySelectionAppearance(iso: string, mode: CalendarSelectionMode, options: {
27
+ singleIso?: string;
28
+ multipleIsos?: readonly string[];
29
+ range?: IsoRange | null;
30
+ }): DaySelectionAppearance;
31
+ /**
32
+ * Advances range selection after a day click.
33
+ *
34
+ * First click sets the anchor; second click commits the range.
35
+ */
36
+ export declare function advanceRangeSelection(committed: IsoRange | null, draft: RangeSelectionDraft, iso: string): {
37
+ committed: IsoRange | null;
38
+ draft: RangeSelectionDraft;
39
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ export type IntlLocale = string | string[] | undefined;
2
+ export type DatePartType = 'day' | 'month' | 'year';
3
+ export type DateDisplayStyle = 'short' | 'medium' | 'long' | 'full';
4
+ /** Smallest displayed unit — mirrors React Aria `granularity`. */
5
+ export type DateGranularity = 'day' | 'month' | 'year';
6
+ export type CalendarDayCell = {
7
+ date: Date;
8
+ iso: string;
9
+ inMonth: boolean;
10
+ isToday: boolean;
11
+ isSelected: boolean;
12
+ isDisabled: boolean;
13
+ isRangeStart: boolean;
14
+ isRangeEnd: boolean;
15
+ isRangeMiddle: boolean;
16
+ };
17
+ export type CalendarWeek = CalendarDayCell[];
@@ -0,0 +1,9 @@
1
+ export type NumberFormatOptions = Intl.NumberFormatOptions;
2
+ export { resolveLocale } from '../intl/locale';
3
+ export declare function getNumberFormatter(locale?: string | string[], options?: NumberFormatOptions): Intl.NumberFormat;
4
+ export declare function formatNumber(value: number, locale?: string | string[], options?: NumberFormatOptions): string;
5
+ /**
6
+ * Parses a locale-aware number string. Returns `null` when the input is empty or invalid.
7
+ */
8
+ export declare function parseNumber(input: string, locale?: string | string[], options?: NumberFormatOptions): number | null;
9
+ export declare function parseFormatOptions(raw?: string): NumberFormatOptions | undefined;
@@ -0,0 +1,2 @@
1
+ export { formatNumber, getNumberFormatter, parseFormatOptions, parseNumber, resolveLocale, type NumberFormatOptions, } from './format';
2
+ export { isOnStep, isWithinRange, snapToStep } from './range';
@@ -0,0 +1,3 @@
1
+ export declare function snapToStep(value: number, min: number, max: number, step: number): number;
2
+ export declare function isWithinRange(value: number, min: number, max: number): boolean;
3
+ export declare function isOnStep(value: number, min: number, step: number): boolean;
@@ -0,0 +1,13 @@
1
+ import type { JsxHtmlPropsWithChildren } from '@ecopages/jsx';
2
+ export type IntrinsicTag = keyof HTMLElementTagNameMap;
3
+ export type IntrinsicProps<Tag extends IntrinsicTag> = JsxHtmlPropsWithChildren<{
4
+ as?: Tag;
5
+ }>;
6
+ /**
7
+ * Renders a dynamic intrinsic element via JSX (`<Tag>`), avoiding per-tag switch blocks.
8
+ *
9
+ * @remarks Default tag is `div`; pass `as` on each call site.
10
+ */
11
+ export declare function Intrinsic<Tag extends IntrinsicTag = 'div'>({ as, children, ...props }: IntrinsicProps<Tag> & {
12
+ as?: Tag;
13
+ }): import("@ecopages/jsx").JsxRenderable;
@@ -0,0 +1,29 @@
1
+ import type { DatePartType, IntlLocale } from '@/lib/intl-date/types';
2
+ /** IMask pattern for locale date digits (`0` = digit slot). */
3
+ export type DateMaskPattern = string;
4
+ declare function getNumericPartOrder(locale: IntlLocale): DatePartType[];
5
+ /**
6
+ * Builds a mask pattern from `formatToParts()` (e.g. `00/00/0000` for en-US).
7
+ *
8
+ * Consecutive `0` runs map to month, day, or year in locale order.
9
+ */
10
+ export declare function buildDateMaskPattern(locale: IntlLocale): DateMaskPattern;
11
+ /** Human-readable placeholder derived from the locale mask (e.g. `mm/dd/yyyy`). */
12
+ export declare function getDefaultDatePlaceholder(locale: IntlLocale): string;
13
+ /** @deprecated Use `getDefaultDatePlaceholder`. */
14
+ export declare function maskPatternToPlaceholder(pattern: DateMaskPattern): string;
15
+ /** Strips non-digits from user input. */
16
+ export declare function extractMaskDigits(value: string): string;
17
+ /**
18
+ * Applies `digits` to a mask pattern, inserting literals as needed.
19
+ *
20
+ * @example
21
+ * applyDateMask('08212002', '00/00/0000') // → '08/21/2002'
22
+ */
23
+ export declare function applyDateMask(digits: string, pattern: DateMaskPattern): string;
24
+ /** Maximum number of digit slots in a mask pattern. */
25
+ export declare function maskDigitCapacity(pattern: DateMaskPattern): number;
26
+ /** Maps masked digits back to year/month/day using the locale field order. */
27
+ export declare function maskedDigitsToParts(digits: string, locale: IntlLocale): Partial<Record<DatePartType, number>> | null;
28
+ export declare function partsToDate(parts: Partial<Record<DatePartType, number>>): Date | null;
29
+ export { getNumericPartOrder };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export { applyDateMask, buildDateMaskPattern, extractMaskDigits as extractDateMaskDigits, getDefaultDatePlaceholder, getNumericPartOrder, maskDigitCapacity, maskedDigitsToParts, maskPatternToPlaceholder, partsToDate, } from './date-mask';
2
+ export type { DateMaskPattern } from './date-mask';
3
+ export { applyInputMask, extractMaskDigits, extractMaskInput, formatWithMask, maskDigitSlotCount, maskInputSlotCount, maskToPlaceholder, parseMaskPattern, } from './input-mask';
4
+ export type { MaskDefinitions, MaskInputKind, MaskToken } from './input-mask';
@@ -0,0 +1,52 @@
1
+ /**
2
+ * IMask-compatible pattern mask utilities.
3
+ *
4
+ * @see https://imask.js.org/guide.html#masked-pattern
5
+ *
6
+ * Default slot definitions:
7
+ * - `0` — digit
8
+ * - `a` — letter
9
+ * - `*` — any character
10
+ *
11
+ * Other syntax:
12
+ * - `{text}` — fixed value (included in extracted input)
13
+ * - `[…]` — optional section
14
+ * - `\` — escape the next character (e.g. `\0` for a literal zero)
15
+ * - all other characters — fixed literals (`+`, `(`, `-`, …)
16
+ */
17
+ export type MaskInputKind = 'digit' | 'letter' | 'any';
18
+ export type MaskToken = {
19
+ type: 'literal';
20
+ value: string;
21
+ } | {
22
+ type: 'fixed';
23
+ value: string;
24
+ } | {
25
+ type: 'input';
26
+ definition: string;
27
+ kind: MaskInputKind;
28
+ pattern?: RegExp;
29
+ optional?: boolean;
30
+ };
31
+ export type MaskDefinitions = Record<string, MaskInputKind | RegExp>;
32
+ /** Parses an IMask pattern string into tokens. */
33
+ export declare function parseMaskPattern(pattern: string, definitions?: MaskDefinitions): MaskToken[];
34
+ export declare function maskInputSlotCount(tokens: MaskToken[], options?: {
35
+ requiredOnly?: boolean;
36
+ }): number;
37
+ /** @deprecated Use `maskInputSlotCount`. */
38
+ export declare function maskDigitSlotCount(tokens: MaskToken[]): number;
39
+ /** Placeholder using IMask's default `_` for input slots. */
40
+ export declare function maskToPlaceholder(pattern: string, definitions?: MaskDefinitions): string;
41
+ /** Extracts user-typed characters from a masked value (skips fixed segments and literals). */
42
+ export declare function extractMaskInput(masked: string, tokens: MaskToken[]): string;
43
+ /** @deprecated Use `extractMaskInput`. */
44
+ export declare function extractMaskDigits(masked: string, tokens: MaskToken[]): string;
45
+ /**
46
+ * Formats extracted input characters into a masked display string.
47
+ *
48
+ * Returns `''` when `input` is empty.
49
+ */
50
+ export declare function formatWithMask(input: string, tokens: MaskToken[]): string;
51
+ /** Normalizes user input to a masked display value. */
52
+ export declare function applyInputMask(raw: string, pattern: string, definitions?: MaskDefinitions): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export type TextFilterSensitivity = 'base' | 'accent' | 'case';
2
+ /**
3
+ * Case- and accent-insensitive "contains" matcher for autocomplete filtering.
4
+ *
5
+ * @remarks `base` ignores case; `case` is a literal substring match.
6
+ */
7
+ export declare function textContains(text: string, query: string, sensitivity?: TextFilterSensitivity): boolean;
@@ -0,0 +1 @@
1
+ export {};
@@ -157,6 +157,17 @@
157
157
  .visible {
158
158
  visibility: visible;
159
159
  }
160
+ .sr-only {
161
+ position: absolute;
162
+ width: 1px;
163
+ height: 1px;
164
+ padding: 0;
165
+ margin: -1px;
166
+ overflow: hidden;
167
+ clip-path: inset(50%);
168
+ white-space: nowrap;
169
+ border-width: 0;
170
+ }
160
171
  .absolute {
161
172
  position: absolute;
162
173
  }
@@ -184,12 +195,27 @@
184
195
  max-width: 96rem;
185
196
  }
186
197
  }
198
+ .m-0 {
199
+ margin: 0px;
200
+ }
201
+ .m-1 {
202
+ margin: var(--spacing-1, var(--space-1));
203
+ }
204
+ .mx-auto {
205
+ margin-inline: auto;
206
+ }
187
207
  .mt-1 {
188
208
  margin-top: var(--spacing-1, var(--space-1));
189
209
  }
190
210
  .mt-2 {
191
211
  margin-top: var(--spacing-2, var(--space-2));
192
212
  }
213
+ .mb-2 {
214
+ margin-bottom: var(--spacing-2, var(--space-2));
215
+ }
216
+ .mb-4 {
217
+ margin-bottom: var(--spacing-4, var(--space-4));
218
+ }
193
219
  .block {
194
220
  display: block;
195
221
  }
@@ -228,18 +254,42 @@
228
254
  .h-full {
229
255
  height: 100%;
230
256
  }
257
+ .max-h-64 {
258
+ max-height: calc(var(--spacing, 0.25rem) * 64);
259
+ }
260
+ .min-h-72 {
261
+ min-height: calc(var(--spacing, 0.25rem) * 72);
262
+ }
263
+ .w-64 {
264
+ width: calc(var(--spacing, 0.25rem) * 64);
265
+ }
266
+ .w-\[calc\(100\%-0\.5rem\)\] {
267
+ width: calc(100% - 0.5rem);
268
+ }
231
269
  .w-full {
232
270
  width: 100%;
233
271
  }
272
+ .max-w-2xl {
273
+ max-width: var(--container-2xl, 42rem);
274
+ }
234
275
  .max-w-3xl {
235
276
  max-width: var(--container-3xl, 48rem);
236
277
  }
278
+ .max-w-4xl {
279
+ max-width: var(--container-4xl, 56rem);
280
+ }
237
281
  .max-w-5xl {
238
282
  max-width: var(--container-5xl, 64rem);
239
283
  }
284
+ .max-w-md {
285
+ max-width: var(--container-md, 28rem);
286
+ }
240
287
  .max-w-prose {
241
288
  max-width: 65ch;
242
289
  }
290
+ .max-w-xl {
291
+ max-width: var(--container-xl, 36rem);
292
+ }
243
293
  .min-w-0 {
244
294
  min-width: 0px;
245
295
  }
@@ -258,6 +308,9 @@
258
308
  .flex-col {
259
309
  flex-direction: column;
260
310
  }
311
+ .flex-wrap {
312
+ flex-wrap: wrap;
313
+ }
261
314
  .place-items-center {
262
315
  place-items: center;
263
316
  }
@@ -267,6 +320,9 @@
267
320
  .justify-between {
268
321
  justify-content: space-between;
269
322
  }
323
+ .justify-center {
324
+ justify-content: center;
325
+ }
270
326
  .gap-0\.5 {
271
327
  gap: calc(var(--spacing, 0.25rem) * 0.5);
272
328
  }
@@ -285,14 +341,42 @@
285
341
  .gap-4 {
286
342
  gap: var(--spacing-4, var(--space-4));
287
343
  }
344
+ .gap-8 {
345
+ gap: var(--spacing-8, var(--space-8));
346
+ }
347
+ .gap-10 {
348
+ gap: calc(var(--spacing, 0.25rem) * 10);
349
+ }
350
+ .gap-inline {
351
+ gap: var(--spacing-inline, var(--space-inline));
352
+ }
353
+ .gap-stack {
354
+ gap: var(--spacing-stack, var(--space-stack));
355
+ }
356
+ :where(.divide-y > :not(:last-child)) {
357
+ --tw-divide-y-reverse: 0;
358
+ border-bottom-style: var(--tw-border-style);
359
+ border-top-style: var(--tw-border-style);
360
+ border-top-width: calc(1px * var(--tw-divide-y-reverse));
361
+ border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
362
+ }
363
+ :where(.divide-border > :not(:last-child)) {
364
+ border-color: var(--color-border, var(--border));
365
+ }
288
366
  .truncate {
289
367
  overflow: hidden;
290
368
  text-overflow: ellipsis;
291
369
  white-space: nowrap;
292
370
  }
371
+ .overflow-auto {
372
+ overflow: auto;
373
+ }
293
374
  .overflow-y-auto {
294
375
  overflow-y: auto;
295
376
  }
377
+ .rounded-container {
378
+ border-radius: var(--radius-container, var(--radius-container));
379
+ }
296
380
  .rounded-control {
297
381
  border-radius: var(--radius-control, var(--radius-control));
298
382
  }
@@ -311,29 +395,60 @@
311
395
  border-bottom-style: var(--tw-border-style);
312
396
  border-bottom-width: 1px;
313
397
  }
398
+ .border-l-2 {
399
+ border-left-style: var(--tw-border-style);
400
+ border-left-width: 2px;
401
+ }
314
402
  .border-border {
315
403
  border-color: var(--color-border, var(--border));
316
404
  }
405
+ .border-primary {
406
+ border-color: var(--color-primary, var(--primary));
407
+ }
408
+ .bg-background {
409
+ background-color: var(--color-background, var(--background));
410
+ }
317
411
  .bg-primary {
318
412
  background-color: var(--color-primary, var(--primary));
319
413
  }
320
414
  .bg-surface {
321
415
  background-color: var(--color-surface, var(--surface));
322
416
  }
417
+ .bg-surface-container-low {
418
+ background-color: var(--color-surface-container-low, var(--surface-container-low));
419
+ }
420
+ .p-2 {
421
+ padding: var(--spacing-2, var(--space-2));
422
+ }
323
423
  .p-4 {
324
424
  padding: var(--spacing-4, var(--space-4));
325
425
  }
426
+ .p-inset {
427
+ padding: var(--spacing-inset, var(--space-inset));
428
+ }
326
429
  .px-4 {
327
430
  padding-inline: var(--spacing-4, var(--space-4));
328
431
  }
432
+ .px-8 {
433
+ padding-inline: var(--spacing-8, var(--space-8));
434
+ }
329
435
  .py-2 {
330
436
  padding-block: var(--spacing-2, var(--space-2));
331
437
  }
438
+ .py-8 {
439
+ padding-block: var(--spacing-8, var(--space-8));
440
+ }
441
+ .py-16 {
442
+ padding-block: calc(var(--spacing, 0.25rem) * 16);
443
+ }
332
444
  .pt-1\.5 {
333
445
  padding-top: calc(var(--spacing, 0.25rem) * 1.5);
334
446
  }
447
+ .pl-6 {
448
+ padding-left: var(--spacing-6, var(--space-6));
449
+ }
335
450
  .text-2xl {
336
- font-size: var(--text-2xl, 1.5rem);
451
+ font-size: var(--text-2xl, var(--text-2xl));
337
452
  line-height: var(--tw-leading, var(--text-2xl--line-height, calc(2 / 1.5)));
338
453
  }
339
454
  .text-base {
@@ -407,6 +522,12 @@
407
522
  --tw-duration: 150ms;
408
523
  transition-duration: 150ms;
409
524
  }
525
+ .first\:pt-0:first-child {
526
+ padding-top: 0px;
527
+ }
528
+ .last\:pb-0:last-child {
529
+ padding-bottom: 0px;
530
+ }
410
531
  @media (width >= 40rem) {
411
532
  .sm\:p-6 {
412
533
  padding: var(--spacing-6, var(--space-6));
@@ -419,6 +540,9 @@
419
540
  .md\:hidden {
420
541
  display: none;
421
542
  }
543
+ .md\:grid-cols-2 {
544
+ grid-template-columns: repeat(2, minmax(0, 1fr));
545
+ }
422
546
  }
423
547
  @media (width >= 64rem) {
424
548
  .lg\:p-8 {
@@ -669,6 +793,11 @@
669
793
  syntax: "*";
670
794
  inherits: false;
671
795
  }
796
+ @property --tw-divide-y-reverse {
797
+ syntax: "*";
798
+ inherits: false;
799
+ initial-value: 0;
800
+ }
672
801
  @property --tw-border-style {
673
802
  syntax: "*";
674
803
  inherits: false;
@@ -817,6 +946,7 @@
817
946
  --tw-rotate-z: initial;
818
947
  --tw-skew-x: initial;
819
948
  --tw-skew-y: initial;
949
+ --tw-divide-y-reverse: 0;
820
950
  --tw-border-style: solid;
821
951
  --tw-font-weight: initial;
822
952
  --tw-shadow: 0 0 #0000;