@lindle/linoardo 1.0.18 → 1.0.20

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 (130) hide show
  1. package/dist/card.cjs +81 -19
  2. package/dist/card.cjs.map +1 -1
  3. package/dist/card.d.cts +8 -1
  4. package/dist/card.d.ts +8 -1
  5. package/dist/card.js +1 -1
  6. package/dist/chip.cjs +9 -1
  7. package/dist/chip.cjs.map +1 -1
  8. package/dist/chip.d.cts +3 -0
  9. package/dist/chip.d.ts +3 -0
  10. package/dist/chip.js +1 -1
  11. package/dist/chunk-36T6I3XH.js +167 -0
  12. package/dist/chunk-36T6I3XH.js.map +1 -0
  13. package/dist/{chunk-N65GNKRG.js → chunk-5LWU5T2C.js} +48 -42
  14. package/dist/chunk-5LWU5T2C.js.map +1 -0
  15. package/dist/{chunk-PWK6MLZT.js → chunk-5PBPURGP.js} +11 -3
  16. package/dist/chunk-5PBPURGP.js.map +1 -0
  17. package/dist/{chunk-XFPBICJG.js → chunk-5WQW6YSJ.js} +12 -3
  18. package/dist/chunk-5WQW6YSJ.js.map +1 -0
  19. package/dist/{chunk-5GY2JCBO.js → chunk-AK7LFJI4.js} +16 -5
  20. package/dist/chunk-AK7LFJI4.js.map +1 -0
  21. package/dist/chunk-B5FW33K3.js +147 -0
  22. package/dist/chunk-B5FW33K3.js.map +1 -0
  23. package/dist/{chunk-AOHXZ7OM.js → chunk-GMDNSU26.js} +19 -5
  24. package/dist/chunk-GMDNSU26.js.map +1 -0
  25. package/dist/chunk-HAXGOTZO.js +94 -0
  26. package/dist/chunk-HAXGOTZO.js.map +1 -0
  27. package/dist/chunk-HEXJCQRO.js +51 -0
  28. package/dist/chunk-HEXJCQRO.js.map +1 -0
  29. package/dist/{chunk-GA6HSRN6.js → chunk-KRYWWWXR.js} +20 -7
  30. package/dist/chunk-KRYWWWXR.js.map +1 -0
  31. package/dist/{chunk-U6NAIIDI.js → chunk-LIEBZOLG.js} +42 -20
  32. package/dist/chunk-LIEBZOLG.js.map +1 -0
  33. package/dist/{chunk-E32P5AHO.js → chunk-LYP7V32H.js} +10 -4
  34. package/dist/chunk-LYP7V32H.js.map +1 -0
  35. package/dist/chunk-MFLH36XK.js +168 -0
  36. package/dist/chunk-MFLH36XK.js.map +1 -0
  37. package/dist/{chunk-QGQ66FJD.js → chunk-T37VPLS4.js} +2 -2
  38. package/dist/chunk-T37VPLS4.js.map +1 -0
  39. package/dist/{chunk-32KFNI6K.js → chunk-U2AL7XFY.js} +48 -28
  40. package/dist/chunk-U2AL7XFY.js.map +1 -0
  41. package/dist/dialog.cjs +40 -18
  42. package/dist/dialog.cjs.map +1 -1
  43. package/dist/dialog.d.cts +3 -0
  44. package/dist/dialog.d.ts +3 -0
  45. package/dist/dialog.js +1 -1
  46. package/dist/expansion-panel/item.cjs +11 -2
  47. package/dist/expansion-panel/item.cjs.map +1 -1
  48. package/dist/expansion-panel/item.js +1 -1
  49. package/dist/expansion-panel.cjs +25 -6
  50. package/dist/expansion-panel.cjs.map +1 -1
  51. package/dist/expansion-panel.js +2 -2
  52. package/dist/icon.cjs +53 -0
  53. package/dist/icon.cjs.map +1 -0
  54. package/dist/icon.d.cts +15 -0
  55. package/dist/icon.d.ts +15 -0
  56. package/dist/icon.js +3 -0
  57. package/dist/icon.js.map +1 -0
  58. package/dist/{index-Md3BuoGM.d.cts → index-B5n8tN2G.d.cts} +3 -0
  59. package/dist/{index-d_JuI06O.d.ts → index-D4-O-oJt.d.ts} +3 -0
  60. package/dist/index.cjs +956 -149
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts +64 -3
  63. package/dist/index.d.ts +64 -3
  64. package/dist/index.js +296 -12
  65. package/dist/index.js.map +1 -1
  66. package/dist/input.cjs +104 -30
  67. package/dist/input.cjs.map +1 -1
  68. package/dist/input.d.cts +8 -19
  69. package/dist/input.d.ts +8 -19
  70. package/dist/input.js +1 -1
  71. package/dist/list/item.cjs +10 -1
  72. package/dist/list/item.cjs.map +1 -1
  73. package/dist/list/item.d.cts +1 -1
  74. package/dist/list/item.d.ts +1 -1
  75. package/dist/list/item.js +1 -1
  76. package/dist/list.cjs +23 -3
  77. package/dist/list.cjs.map +1 -1
  78. package/dist/list.d.cts +5 -2
  79. package/dist/list.d.ts +5 -2
  80. package/dist/list.js +2 -2
  81. package/dist/masonry.cjs +116 -0
  82. package/dist/masonry.cjs.map +1 -0
  83. package/dist/masonry.d.cts +45 -0
  84. package/dist/masonry.d.ts +45 -0
  85. package/dist/masonry.js +3 -0
  86. package/dist/masonry.js.map +1 -0
  87. package/dist/menu.cjs.map +1 -1
  88. package/dist/menu.d.cts +3 -0
  89. package/dist/menu.d.ts +3 -0
  90. package/dist/menu.js +1 -1
  91. package/dist/select.cjs +173 -0
  92. package/dist/select.cjs.map +1 -0
  93. package/dist/select.d.cts +29 -0
  94. package/dist/select.d.ts +29 -0
  95. package/dist/select.js +3 -0
  96. package/dist/select.js.map +1 -0
  97. package/dist/slider.cjs +17 -3
  98. package/dist/slider.cjs.map +1 -1
  99. package/dist/slider.d.cts +3 -0
  100. package/dist/slider.d.ts +3 -0
  101. package/dist/slider.js +1 -1
  102. package/dist/styles.css +1096 -8
  103. package/dist/switch.cjs +46 -40
  104. package/dist/switch.cjs.map +1 -1
  105. package/dist/switch.d.cts +3 -0
  106. package/dist/switch.d.ts +3 -0
  107. package/dist/switch.js +1 -1
  108. package/dist/tooltip.cjs +46 -26
  109. package/dist/tooltip.cjs.map +1 -1
  110. package/dist/tooltip.d.cts +3 -0
  111. package/dist/tooltip.d.ts +3 -0
  112. package/dist/tooltip.js +1 -1
  113. package/dist/types-BCqIOkp1.d.cts +24 -0
  114. package/dist/types-ChXN4u7x.d.ts +24 -0
  115. package/package.json +29 -7
  116. package/readme.md +1 -0
  117. package/dist/chunk-32KFNI6K.js.map +0 -1
  118. package/dist/chunk-5GY2JCBO.js.map +0 -1
  119. package/dist/chunk-AOHXZ7OM.js.map +0 -1
  120. package/dist/chunk-E32P5AHO.js.map +0 -1
  121. package/dist/chunk-GA6HSRN6.js.map +0 -1
  122. package/dist/chunk-N65GNKRG.js.map +0 -1
  123. package/dist/chunk-PWK6MLZT.js.map +0 -1
  124. package/dist/chunk-PYG5SDNO.js +0 -98
  125. package/dist/chunk-PYG5SDNO.js.map +0 -1
  126. package/dist/chunk-QGQ66FJD.js.map +0 -1
  127. package/dist/chunk-U6NAIIDI.js.map +0 -1
  128. package/dist/chunk-V4BVJOSC.js +0 -85
  129. package/dist/chunk-V4BVJOSC.js.map +0 -1
  130. package/dist/chunk-XFPBICJG.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var tailwindMerge = require('tailwind-merge');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ // src/Containment/Masonry/index.tsx
28
+ var masonryBaseClass = "masonry-grid w-full";
29
+ var itemBaseClass = "masonry-item block break-inside-avoid";
30
+ var MasonryBase = (props, ref) => {
31
+ const {
32
+ items,
33
+ renderItem,
34
+ getKey,
35
+ column = 2,
36
+ columnWidth,
37
+ maxColumn,
38
+ gutter = 16,
39
+ className,
40
+ itemClassName,
41
+ itemStyle,
42
+ children,
43
+ style,
44
+ role = "list",
45
+ ...rest
46
+ } = props;
47
+ const resolvedGutter = toCssLength(gutter);
48
+ const columnCount = resolveColumnCount(column, maxColumn, Boolean(columnWidth));
49
+ const layoutStyle = {
50
+ columnGap: resolvedGutter,
51
+ columnCount,
52
+ columnWidth: columnWidth ? toCssLength(columnWidth) : void 0,
53
+ columnFill: "balance",
54
+ ...style
55
+ };
56
+ const wrapItem = (content, key) => /* @__PURE__ */ jsxRuntime.jsx(
57
+ "div",
58
+ {
59
+ className: tailwindMerge.twMerge(itemBaseClass, itemClassName),
60
+ style: { breakInside: "avoid", marginBottom: resolvedGutter, width: "100%", ...itemStyle },
61
+ children: content
62
+ },
63
+ key
64
+ );
65
+ const renderedItems = items && items.length ? items.map((item, index) => {
66
+ const content = resolveItemContent(item, index, renderItem);
67
+ return wrapItem(content, resolveItemKey(item, index, getKey));
68
+ }) : React__namespace.Children.map(children, (child, index) => wrapItem(child, resolveChildKey(child, index))) ?? null;
69
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ...rest, ref, role, className: tailwindMerge.twMerge(masonryBaseClass, className), style: layoutStyle, children: renderedItems });
70
+ };
71
+ var Masonry = React__namespace.forwardRef(MasonryBase);
72
+ Masonry.displayName = "Masonry";
73
+ var Masonry_default = Masonry;
74
+ function toCssLength(value) {
75
+ if (value === void 0) return void 0;
76
+ return typeof value === "number" ? `${value}px` : value;
77
+ }
78
+ function normalizeColumns(value) {
79
+ if (value === void 0) return void 0;
80
+ if (!Number.isFinite(value)) return void 0;
81
+ return Math.max(1, Math.floor(value));
82
+ }
83
+ function resolveColumnCount(column, maxColumn, hasColumnWidth) {
84
+ const normalizedMax = normalizeColumns(maxColumn);
85
+ if (hasColumnWidth) {
86
+ return normalizedMax;
87
+ }
88
+ const normalizedColumn = normalizeColumns(column);
89
+ if (normalizedColumn && normalizedMax) {
90
+ return Math.min(normalizedColumn, normalizedMax);
91
+ }
92
+ return normalizedColumn ?? normalizedMax;
93
+ }
94
+ function resolveItemKey(item, index, getKey) {
95
+ if (getKey) return getKey(item, index);
96
+ if (React__namespace.isValidElement(item) && item.key != null) {
97
+ return item.key;
98
+ }
99
+ return index;
100
+ }
101
+ function resolveChildKey(child, index) {
102
+ if (React__namespace.isValidElement(child) && child.key != null) {
103
+ return child.key;
104
+ }
105
+ return index;
106
+ }
107
+ function resolveItemContent(item, index, renderItem) {
108
+ if (renderItem) {
109
+ return renderItem(item, index);
110
+ }
111
+ return item;
112
+ }
113
+
114
+ module.exports = Masonry_default;
115
+ //# sourceMappingURL=masonry.cjs.map
116
+ //# sourceMappingURL=masonry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Containment/Masonry/index.tsx"],"names":["jsx","twMerge","React"],"mappings":"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","file":"masonry.cjs","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { MasonryComponent, MasonryProps, MasonryRenderItem } from './types.masonry';\n\nconst masonryBaseClass = 'masonry-grid w-full';\nconst itemBaseClass = 'masonry-item block break-inside-avoid';\n\nconst MasonryBase = <T,>(props: MasonryProps<T>, ref: React.ForwardedRef<HTMLDivElement>) => {\n const {\n items,\n renderItem,\n getKey,\n column = 2,\n columnWidth,\n maxColumn,\n gutter = 16,\n className,\n itemClassName,\n itemStyle,\n children,\n style,\n role = 'list',\n ...rest\n } = props;\n\n const resolvedGutter = toCssLength(gutter);\n const columnCount = resolveColumnCount(column, maxColumn, Boolean(columnWidth));\n\n const layoutStyle: React.CSSProperties = {\n columnGap: resolvedGutter,\n columnCount,\n columnWidth: columnWidth ? toCssLength(columnWidth) : undefined,\n columnFill: 'balance',\n ...style\n };\n\n const wrapItem = (content: React.ReactNode, key: React.Key) => (\n <div\n key={key}\n className={twMerge(itemBaseClass, itemClassName)}\n style={{ breakInside: 'avoid', marginBottom: resolvedGutter, width: '100%', ...itemStyle }}\n >\n {content}\n </div>\n );\n\n const renderedItems =\n items && items.length\n ? items.map((item, index) => {\n const content = resolveItemContent(item, index, renderItem);\n return wrapItem(content, resolveItemKey(item, index, getKey));\n })\n : React.Children.map(children, (child, index) => wrapItem(child, resolveChildKey(child, index))) ?? null;\n\n return (\n <div {...rest} ref={ref} role={role} className={twMerge(masonryBaseClass, className)} style={layoutStyle}>\n {renderedItems}\n </div>\n );\n};\n\nconst Masonry = React.forwardRef(MasonryBase) as MasonryComponent;\n\nMasonry.displayName = 'Masonry';\n\nexport type { MasonryProps, MasonryRenderItem } from './types.masonry';\nexport default Masonry;\n\nfunction toCssLength(value?: number | string) {\n if (value === undefined) return undefined;\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nfunction normalizeColumns(value?: number) {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value)) return undefined;\n return Math.max(1, Math.floor(value));\n}\n\nfunction resolveColumnCount(column?: number, maxColumn?: number, hasColumnWidth?: boolean) {\n const normalizedMax = normalizeColumns(maxColumn);\n if (hasColumnWidth) {\n return normalizedMax;\n }\n\n const normalizedColumn = normalizeColumns(column);\n\n if (normalizedColumn && normalizedMax) {\n return Math.min(normalizedColumn, normalizedMax);\n }\n\n return normalizedColumn ?? normalizedMax;\n}\n\nfunction resolveItemKey<T>(item: T, index: number, getKey?: (item: T, index: number) => React.Key) {\n if (getKey) return getKey(item, index);\n if (React.isValidElement(item) && item.key != null) {\n return item.key;\n }\n return index;\n}\n\nfunction resolveChildKey(child: React.ReactNode, index: number) {\n if (React.isValidElement(child) && child.key != null) {\n return child.key;\n }\n return index;\n}\n\nfunction resolveItemContent<T>(item: T, index: number, renderItem?: MasonryRenderItem<T>) {\n if (renderItem) {\n return renderItem(item, index);\n }\n return item as React.ReactNode;\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { ReactNode, CSSProperties, RefAttributes, ReactElement } from 'react';
2
+
3
+ type MasonryRenderItem<T> = (item: T, index: number) => ReactNode;
4
+ type MasonryProps<T = unknown> = React.HTMLAttributes<HTMLDivElement> & {
5
+ /**
6
+ * Data items to render inside the masonry layout. If omitted, children are used instead.
7
+ */
8
+ items?: readonly T[];
9
+ /**
10
+ * Render function for each item when `items` is provided.
11
+ */
12
+ renderItem?: MasonryRenderItem<T>;
13
+ /**
14
+ * Custom key generator for `items`.
15
+ */
16
+ getKey?: (item: T, index: number) => React.Key;
17
+ /**
18
+ * Fixed number of columns. Ignored when `columnWidth` is set.
19
+ */
20
+ column?: number;
21
+ /**
22
+ * Desired width of each column (e.g. 240 or '16rem'). CSS handles responsiveness.
23
+ */
24
+ columnWidth?: number | string;
25
+ /**
26
+ * Maximum number of columns when using `columnWidth`.
27
+ */
28
+ maxColumn?: number;
29
+ /**
30
+ * Gap between columns and items (number is treated as pixels).
31
+ */
32
+ gutter?: number | string;
33
+ /**
34
+ * Extra classes/styles applied to each masonry item wrapper.
35
+ */
36
+ itemClassName?: string;
37
+ itemStyle?: CSSProperties;
38
+ };
39
+ type MasonryComponent = (<T = unknown>(props: MasonryProps<T> & RefAttributes<HTMLDivElement>) => ReactElement | null) & {
40
+ displayName?: string;
41
+ };
42
+
43
+ declare const Masonry: MasonryComponent;
44
+
45
+ export { type MasonryProps, type MasonryRenderItem, Masonry as default };
@@ -0,0 +1,45 @@
1
+ import { ReactNode, CSSProperties, RefAttributes, ReactElement } from 'react';
2
+
3
+ type MasonryRenderItem<T> = (item: T, index: number) => ReactNode;
4
+ type MasonryProps<T = unknown> = React.HTMLAttributes<HTMLDivElement> & {
5
+ /**
6
+ * Data items to render inside the masonry layout. If omitted, children are used instead.
7
+ */
8
+ items?: readonly T[];
9
+ /**
10
+ * Render function for each item when `items` is provided.
11
+ */
12
+ renderItem?: MasonryRenderItem<T>;
13
+ /**
14
+ * Custom key generator for `items`.
15
+ */
16
+ getKey?: (item: T, index: number) => React.Key;
17
+ /**
18
+ * Fixed number of columns. Ignored when `columnWidth` is set.
19
+ */
20
+ column?: number;
21
+ /**
22
+ * Desired width of each column (e.g. 240 or '16rem'). CSS handles responsiveness.
23
+ */
24
+ columnWidth?: number | string;
25
+ /**
26
+ * Maximum number of columns when using `columnWidth`.
27
+ */
28
+ maxColumn?: number;
29
+ /**
30
+ * Gap between columns and items (number is treated as pixels).
31
+ */
32
+ gutter?: number | string;
33
+ /**
34
+ * Extra classes/styles applied to each masonry item wrapper.
35
+ */
36
+ itemClassName?: string;
37
+ itemStyle?: CSSProperties;
38
+ };
39
+ type MasonryComponent = (<T = unknown>(props: MasonryProps<T> & RefAttributes<HTMLDivElement>) => ReactElement | null) & {
40
+ displayName?: string;
41
+ };
42
+
43
+ declare const Masonry: MasonryComponent;
44
+
45
+ export { type MasonryProps, type MasonryRenderItem, Masonry as default };
@@ -0,0 +1,3 @@
1
+ export { Masonry_default as default } from './chunk-HAXGOTZO.js';
2
+ //# sourceMappingURL=masonry.js.map
3
+ //# sourceMappingURL=masonry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"masonry.js"}
package/dist/menu.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Containment/Menu/index.tsx"],"names":["React","jsx","twMerge","jsxs","Fragment"],"mappings":"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","file":"menu.cjs","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport type MenuPlacement = 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n activator: React.ReactNode;\n children: React.ReactNode;\n placement?: MenuPlacement;\n open?: boolean;\n openOnHover?: boolean;\n openOnFocus?: boolean;\n matchActivatorWidth?: boolean;\n keepMounted?: boolean;\n scrim?: boolean;\n contentClassName?: string;\n contentProps?: React.HTMLAttributes<HTMLDivElement>;\n overlayClassName?: string;\n}\n\nconst placementClasses: Record<MenuPlacement, string> = {\n 'bottom-start': 'left-0 top-full origin-top-left',\n bottom: 'left-1/2 top-full -translate-x-1/2 origin-top',\n 'bottom-end': 'right-0 top-full origin-top-right',\n 'top-start': 'left-0 bottom-full origin-bottom-left',\n top: 'left-1/2 bottom-full -translate-x-1/2 origin-bottom',\n 'top-end': 'right-0 bottom-full origin-bottom-right'\n};\n\nconst offsetClasses: Record<'top' | 'bottom', string> = {\n top: 'mb-2',\n bottom: 'mt-2'\n};\n\nconst menuBaseClasses =\n 'absolute z-50 min-w-[10rem] rounded-xl border border-gray-200/80 bg-white/95 p-2 text-sm text-gray-700 shadow-lg shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2';\n\nconst overlayBaseClasses = 'fixed inset-0 z-40 bg-gray-900/30 backdrop-blur-[1px]';\n\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>((props, ref) => {\n const {\n activator,\n children,\n placement = 'bottom-start',\n open,\n openOnHover = true,\n openOnFocus = true,\n matchActivatorWidth = false,\n keepMounted = false,\n scrim = false,\n contentClassName,\n contentProps,\n overlayClassName,\n className,\n ...rest\n } = props;\n\n const { onMouseEnter, onMouseLeave, onFocus, onBlur, ...restProps } = rest;\n\n const hasContent = children !== undefined && children !== null;\n const isControlled = typeof open === 'boolean';\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const closeTimer = React.useRef<number | null>(null);\n const visible = isControlled ? Boolean(open) : uncontrolledOpen;\n const shouldRenderContent = hasContent && (keepMounted || visible || (!isControlled && (openOnHover || openOnFocus)));\n const verticalPlacement = placement.startsWith('top') ? 'top' : 'bottom';\n\n const clearCloseTimer = () => {\n if (closeTimer.current !== null) {\n window.clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n\n const openMenu = () => {\n clearCloseTimer();\n if (!isControlled) {\n setUncontrolledOpen(true);\n }\n };\n\n const scheduleClose = () => {\n clearCloseTimer();\n if (!isControlled) {\n closeTimer.current = window.setTimeout(() => {\n setUncontrolledOpen(false);\n closeTimer.current = null;\n }, 120);\n }\n };\n\n React.useEffect(() => {\n return () => clearCloseTimer();\n }, []);\n\n const visibilityClasses = visible ? 'pointer-events-auto opacity-100 scale-100' : 'pointer-events-none opacity-0 scale-95';\n\n const {\n className: contentExtraClassName,\n style: contentStyle,\n role: contentRole,\n tabIndex: contentTabIndex,\n ...restContentProps\n } = contentProps ?? {};\n\n const overlayNode = scrim && visible ? <div className={twMerge(overlayBaseClasses, overlayClassName)} aria-hidden /> : null;\n\n return (\n <>\n {overlayNode}\n <div\n {...restProps}\n ref={ref}\n className={twMerge('relative inline-flex min-w-0 group/menu', className)}\n data-open={visible || undefined}\n onMouseEnter={event => {\n if (openOnHover) {\n openMenu();\n }\n onMouseEnter?.(event);\n }}\n onMouseLeave={event => {\n if (openOnHover) {\n scheduleClose();\n }\n onMouseLeave?.(event);\n }}\n onFocus={event => {\n if (openOnFocus) {\n openMenu();\n }\n onFocus?.(event);\n }}\n onBlur={event => {\n if (openOnFocus) {\n scheduleClose();\n }\n onBlur?.(event);\n }}\n >\n <div className='inline-flex w-full min-w-0'>{activator}</div>\n {shouldRenderContent ? (\n <div\n {...restContentProps}\n className={twMerge(\n menuBaseClasses,\n placementClasses[placement],\n offsetClasses[verticalPlacement],\n matchActivatorWidth ? 'min-w-full' : undefined,\n visibilityClasses,\n contentClassName,\n contentExtraClassName\n )}\n data-state={visible ? 'open' : 'closed'}\n role={contentRole ?? 'menu'}\n tabIndex={contentTabIndex ?? -1}\n style={contentStyle}\n onMouseEnter={event => {\n if (openOnHover) {\n openMenu();\n }\n restContentProps?.onMouseEnter?.(event);\n }}\n onMouseLeave={event => {\n if (openOnHover) {\n scheduleClose();\n }\n restContentProps?.onMouseLeave?.(event);\n }}\n >\n {children}\n </div>\n ) : null}\n </div>\n </>\n );\n});\n\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"]}
1
+ {"version":3,"sources":["../src/Containment/Menu/index.tsx"],"names":["React","jsx","twMerge","jsxs","Fragment"],"mappings":"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","file":"menu.cjs","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport type MenuPlacement =\n | 'bottom-start'\n | 'bottom'\n | 'bottom-end'\n | 'top-start'\n | 'top'\n | 'top-end';\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n activator: React.ReactNode;\n children: React.ReactNode;\n placement?: MenuPlacement;\n open?: boolean;\n openOnHover?: boolean;\n openOnFocus?: boolean;\n matchActivatorWidth?: boolean;\n keepMounted?: boolean;\n scrim?: boolean;\n contentClassName?: string;\n contentProps?: React.HTMLAttributes<HTMLDivElement>;\n overlayClassName?: string;\n}\n\nconst placementClasses: Record<MenuPlacement, string> = {\n 'bottom-start': 'left-0 top-full origin-top-left',\n bottom: 'left-1/2 top-full -translate-x-1/2 origin-top',\n 'bottom-end': 'right-0 top-full origin-top-right',\n 'top-start': 'left-0 bottom-full origin-bottom-left',\n top: 'left-1/2 bottom-full -translate-x-1/2 origin-bottom',\n 'top-end': 'right-0 bottom-full origin-bottom-right'\n};\n\nconst offsetClasses: Record<'top' | 'bottom', string> = {\n top: 'mb-2',\n bottom: 'mt-2'\n};\n\nconst menuBaseClasses =\n 'absolute z-50 min-w-[10rem] rounded-xl border border-gray-200/80 bg-white/95 p-2 text-sm text-gray-700 shadow-lg shadow-gray-900/10 ring-1 ring-black/5 backdrop-blur-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2';\n\nconst overlayBaseClasses = 'fixed inset-0 z-40 bg-gray-900/30 backdrop-blur-[1px]';\n\n/**\n * Contextual menu that opens relative to an activator with optional hover/focus behavior and scrim.\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>((props, ref) => {\n const {\n activator,\n children,\n placement = 'bottom-start',\n open,\n openOnHover = true,\n openOnFocus = true,\n matchActivatorWidth = false,\n keepMounted = false,\n scrim = false,\n contentClassName,\n contentProps,\n overlayClassName,\n className,\n ...rest\n } = props;\n\n const { onMouseEnter, onMouseLeave, onFocus, onBlur, ...restProps } = rest;\n\n const hasContent = children !== undefined && children !== null;\n const isControlled = typeof open === 'boolean';\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const closeTimer = React.useRef<number | null>(null);\n const visible = isControlled ? Boolean(open) : uncontrolledOpen;\n const shouldRenderContent =\n hasContent && (keepMounted || visible || (!isControlled && (openOnHover || openOnFocus)));\n const verticalPlacement = placement.startsWith('top') ? 'top' : 'bottom';\n\n const clearCloseTimer = () => {\n if (closeTimer.current !== null) {\n window.clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n };\n\n const openMenu = () => {\n clearCloseTimer();\n if (!isControlled) {\n setUncontrolledOpen(true);\n }\n };\n\n const scheduleClose = () => {\n clearCloseTimer();\n if (!isControlled) {\n closeTimer.current = window.setTimeout(() => {\n setUncontrolledOpen(false);\n closeTimer.current = null;\n }, 120);\n }\n };\n\n React.useEffect(() => {\n return () => clearCloseTimer();\n }, []);\n\n const visibilityClasses = visible\n ? 'pointer-events-auto opacity-100 scale-100'\n : 'pointer-events-none opacity-0 scale-95';\n\n const {\n className: contentExtraClassName,\n style: contentStyle,\n role: contentRole,\n tabIndex: contentTabIndex,\n ...restContentProps\n } = contentProps ?? {};\n\n const overlayNode =\n scrim && visible ? (\n <div className={twMerge(overlayBaseClasses, overlayClassName)} aria-hidden />\n ) : null;\n\n return (\n <>\n {overlayNode}\n <div\n {...restProps}\n ref={ref}\n className={twMerge('relative inline-flex min-w-0 group/menu', className)}\n data-open={visible || undefined}\n onMouseEnter={event => {\n if (openOnHover) {\n openMenu();\n }\n onMouseEnter?.(event);\n }}\n onMouseLeave={event => {\n if (openOnHover) {\n scheduleClose();\n }\n onMouseLeave?.(event);\n }}\n onFocus={event => {\n if (openOnFocus) {\n openMenu();\n }\n onFocus?.(event);\n }}\n onBlur={event => {\n if (openOnFocus) {\n scheduleClose();\n }\n onBlur?.(event);\n }}\n >\n <div className='inline-flex w-full min-w-0'>{activator}</div>\n {shouldRenderContent ? (\n <div\n {...restContentProps}\n className={twMerge(\n menuBaseClasses,\n placementClasses[placement],\n offsetClasses[verticalPlacement],\n matchActivatorWidth ? 'min-w-full' : undefined,\n visibilityClasses,\n contentClassName,\n contentExtraClassName\n )}\n data-state={visible ? 'open' : 'closed'}\n role={contentRole ?? 'menu'}\n tabIndex={contentTabIndex ?? -1}\n style={contentStyle}\n onMouseEnter={event => {\n if (openOnHover) {\n openMenu();\n }\n restContentProps?.onMouseEnter?.(event);\n }}\n onMouseLeave={event => {\n if (openOnHover) {\n scheduleClose();\n }\n restContentProps?.onMouseLeave?.(event);\n }}\n >\n {children}\n </div>\n ) : null}\n </div>\n </>\n );\n});\n\nMenu.displayName = 'Menu';\n\nexport default Menu;\n"]}
package/dist/menu.d.cts CHANGED
@@ -15,6 +15,9 @@ interface MenuProps extends Omit<react.HTMLAttributes<HTMLDivElement>, 'children
15
15
  contentProps?: react.HTMLAttributes<HTMLDivElement>;
16
16
  overlayClassName?: string;
17
17
  }
18
+ /**
19
+ * Contextual menu that opens relative to an activator with optional hover/focus behavior and scrim.
20
+ */
18
21
  declare const Menu: react.ForwardRefExoticComponent<MenuProps & react.RefAttributes<HTMLDivElement>>;
19
22
 
20
23
  export { type MenuPlacement, type MenuProps, Menu as default };
package/dist/menu.d.ts CHANGED
@@ -15,6 +15,9 @@ interface MenuProps extends Omit<react.HTMLAttributes<HTMLDivElement>, 'children
15
15
  contentProps?: react.HTMLAttributes<HTMLDivElement>;
16
16
  overlayClassName?: string;
17
17
  }
18
+ /**
19
+ * Contextual menu that opens relative to an activator with optional hover/focus behavior and scrim.
20
+ */
18
21
  declare const Menu: react.ForwardRefExoticComponent<MenuProps & react.RefAttributes<HTMLDivElement>>;
19
22
 
20
23
  export { type MenuPlacement, type MenuProps, Menu as default };
package/dist/menu.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Menu_default as default } from './chunk-QGQ66FJD.js';
1
+ export { Menu_default as default } from './chunk-T37VPLS4.js';
2
2
  //# sourceMappingURL=menu.js.map
3
3
  //# sourceMappingURL=menu.js.map
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var tailwindMerge = require('tailwind-merge');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var React__default = /*#__PURE__*/_interopDefault(React);
10
+
11
+ // src/Form/Select/index.tsx
12
+
13
+ // src/utils/helpers/randomStr.ts
14
+ var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
15
+ function generateString(length = 5) {
16
+ let result = "";
17
+ const charactersLength = characters.length;
18
+ for (let i = 0; i < length; i++) {
19
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
20
+ }
21
+ return result;
22
+ }
23
+ var baseClass = "select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900";
24
+ var variantClasses = {
25
+ solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
26
+ sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
27
+ outline: "rounded border border-gray-300 bg-transparent focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
28
+ text: "rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
29
+ ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15",
30
+ filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25",
31
+ underlined: "rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
32
+ rounded: "rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm"
33
+ };
34
+ var sizeClasses = {
35
+ "x-small": { padding: "pl-2 pr-8 py-2", text: "text-xs" },
36
+ small: { padding: "pl-2.5 pr-9 py-2.5", text: "text-sm" },
37
+ medium: { padding: "pl-3 pr-10 py-3", text: "text-base" },
38
+ large: { padding: "pl-3.5 pr-11 py-3.5", text: "text-lg" },
39
+ "x-large": { padding: "pl-4 pr-12 py-4", text: "text-xl" }
40
+ };
41
+ var normalizeOption = (option) => {
42
+ if (typeof option === "string") {
43
+ return { label: option, value: option };
44
+ }
45
+ return option;
46
+ };
47
+ var Select = ({
48
+ options,
49
+ label,
50
+ placeholder,
51
+ variant = "outline",
52
+ size = "medium",
53
+ className,
54
+ wrapperClassName,
55
+ id,
56
+ name,
57
+ multiple,
58
+ onFocus,
59
+ onBlur,
60
+ onChange,
61
+ value,
62
+ defaultValue,
63
+ ...props
64
+ }) => {
65
+ const selectId = id || name || generateString();
66
+ const selectName = name || selectId;
67
+ const variantClass = variantClasses[variant] ?? variantClasses.outline;
68
+ const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;
69
+ const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;
70
+ const normalizedOptions = options.map(normalizeOption);
71
+ const hasLabel = Boolean(label);
72
+ const hasProvidedPlaceholder = typeof placeholder === "string" && placeholder.trim().length > 0;
73
+ const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder && !multiple;
74
+ const placeholderText = placeholder ?? (hasLabel ? " " : void 0);
75
+ const [isFocused, setIsFocused] = React__default.default.useState(false);
76
+ const [hasValue, setHasValue] = React__default.default.useState(() => {
77
+ const initial = value ?? defaultValue;
78
+ if (initial === void 0 || initial === null) return false;
79
+ if (multiple) {
80
+ if (Array.isArray(initial)) return initial.length > 0;
81
+ return String(initial).length > 0;
82
+ }
83
+ if (Array.isArray(initial)) {
84
+ if (initial.length === 0) return false;
85
+ return String(initial[0]).length > 0;
86
+ }
87
+ return String(initial).length > 0;
88
+ });
89
+ const isControlled = value !== void 0;
90
+ React__default.default.useEffect(() => {
91
+ if (!isControlled) return;
92
+ if (value === void 0 || value === null) {
93
+ setHasValue(false);
94
+ return;
95
+ }
96
+ if (multiple) {
97
+ if (Array.isArray(value)) {
98
+ setHasValue(value.length > 0);
99
+ } else {
100
+ setHasValue(String(value).length > 0);
101
+ }
102
+ return;
103
+ }
104
+ if (Array.isArray(value)) {
105
+ setHasValue(value.length > 0 ? String(value[0]).length > 0 : false);
106
+ return;
107
+ }
108
+ setHasValue(String(value).length > 0);
109
+ }, [isControlled, multiple, value]);
110
+ const placeholderOptionLabel = hidePlaceholderUntilFocus && !isFocused ? " " : placeholderText;
111
+ const shouldRenderPlaceholder = !multiple && placeholderText !== void 0;
112
+ const labelShouldFloat = hasValue || isFocused;
113
+ const labelLeftClass = "left-3";
114
+ const labelBgDefault = ["outline", "text", "underlined"].includes(variant) ? "bg-transparent" : "bg-white/90";
115
+ const handleFocus = (event) => {
116
+ if (hidePlaceholderUntilFocus) setIsFocused(true);
117
+ onFocus?.(event);
118
+ };
119
+ const handleBlur = (event) => {
120
+ if (hidePlaceholderUntilFocus) setIsFocused(false);
121
+ onBlur?.(event);
122
+ };
123
+ const handleChange = (event) => {
124
+ if (!isControlled) {
125
+ const nextHasValue = multiple ? event.target.selectedOptions.length > 0 : event.target.value !== "";
126
+ setHasValue(nextHasValue);
127
+ }
128
+ onChange?.(event);
129
+ };
130
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: tailwindMerge.twMerge("flex flex-col gap-1", wrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center", children: [
131
+ /* @__PURE__ */ jsxRuntime.jsxs(
132
+ "select",
133
+ {
134
+ ...props,
135
+ id: selectId,
136
+ name: selectName,
137
+ multiple,
138
+ value,
139
+ defaultValue: value === void 0 ? defaultValue : void 0,
140
+ onFocus: handleFocus,
141
+ onBlur: handleBlur,
142
+ onChange: handleChange,
143
+ className: tailwindMerge.twMerge("peer", baseClass, variantClass, sizeClass, className),
144
+ children: [
145
+ shouldRenderPlaceholder && /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: props.required, hidden: hasValue, children: placeholderOptionLabel }),
146
+ normalizedOptions.map((option, index) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, disabled: option.disabled, children: option.label }, `${selectId}-${option.value}-${index}`))
147
+ ]
148
+ }
149
+ ),
150
+ !multiple && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500", children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "mdi mdi-chevron-down text-base leading-none", "aria-hidden": true }) }),
151
+ label && /* @__PURE__ */ jsxRuntime.jsx(
152
+ "label",
153
+ {
154
+ htmlFor: selectId,
155
+ className: tailwindMerge.twMerge(
156
+ "absolute transition-all duration-150 pointer-events-none text-gray-700",
157
+ labelLeftClass,
158
+ labelShouldFloat ? [
159
+ "top-0 text-xs px-1",
160
+ isFocused ? "-translate-y-1/2 text-gray-600" : "-translate-y-2/3",
161
+ labelBgDefault
162
+ ].join(" ") : "top-1/2 -translate-y-1/2 text-sm text-gray-500"
163
+ ),
164
+ children: label
165
+ }
166
+ )
167
+ ] }) });
168
+ };
169
+ var Select_default = Select;
170
+
171
+ module.exports = Select_default;
172
+ //# sourceMappingURL=select.cjs.map
173
+ //# sourceMappingURL=select.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/helpers/randomStr.ts","../src/Form/Select/index.tsx"],"names":["React","jsx","twMerge","jsxs"],"mappings":"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","file":"select.cjs","sourcesContent":["const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\nexport function generateString(length = 5) {\n let result: string = '';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n\n return result;\n}\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { generateString } from '../../utils/helpers/randomStr';\nimport type { GlobalSize } from '@lindle/linoardo/global.types';\nimport type { InputVariant } from '../Input/types';\nimport type { SelectOption, SelectOptionObject, SelectProps } from './types.select';\n\nconst baseClass =\n 'select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900';\n\nconst variantClasses = {\n solid:\n 'rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30',\n sharp:\n 'rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30',\n outline:\n 'rounded border border-gray-300 bg-transparent focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30',\n text: 'rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent',\n ghost:\n 'rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25',\n underlined:\n 'rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent',\n rounded:\n 'rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm'\n} satisfies Record<InputVariant, string>;\n\nconst sizeClasses = {\n 'x-small': { padding: 'pl-2 pr-8 py-2', text: 'text-xs' },\n small: { padding: 'pl-2.5 pr-9 py-2.5', text: 'text-sm' },\n medium: { padding: 'pl-3 pr-10 py-3', text: 'text-base' },\n large: { padding: 'pl-3.5 pr-11 py-3.5', text: 'text-lg' },\n 'x-large': { padding: 'pl-4 pr-12 py-4', text: 'text-xl' }\n} satisfies Record<GlobalSize, { padding: string; text: string }>;\n\nconst normalizeOption = (option: SelectOption): SelectOptionObject => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n\n return option;\n};\n\n/**\n * Native select styled with the same visual variants as Input.\n * Accepts options as string[] or { label, value }[] for convenience.\n */\nconst Select: React.FC<SelectProps> = ({\n options,\n label,\n placeholder,\n variant = 'outline',\n size = 'medium',\n className,\n wrapperClassName,\n id,\n name,\n multiple,\n onFocus,\n onBlur,\n onChange,\n value,\n defaultValue,\n ...props\n}) => {\n const selectId = id || name || generateString();\n const selectName = name || selectId;\n const variantClass = variantClasses[variant] ?? variantClasses.outline;\n const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;\n const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;\n const normalizedOptions = options.map(normalizeOption);\n const hasLabel = Boolean(label);\n const hasProvidedPlaceholder = typeof placeholder === 'string' && placeholder.trim().length > 0;\n const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder && !multiple;\n const placeholderText = placeholder ?? (hasLabel ? ' ' : undefined);\n const [isFocused, setIsFocused] = React.useState(false);\n const [hasValue, setHasValue] = React.useState(() => {\n const initial = value ?? defaultValue;\n if (initial === undefined || initial === null) return false;\n if (multiple) {\n if (Array.isArray(initial)) return initial.length > 0;\n return String(initial).length > 0;\n }\n if (Array.isArray(initial)) {\n if (initial.length === 0) return false;\n return String(initial[0]).length > 0;\n }\n return String(initial).length > 0;\n });\n const isControlled = value !== undefined;\n\n React.useEffect(() => {\n if (!isControlled) return;\n if (value === undefined || value === null) {\n setHasValue(false);\n return;\n }\n if (multiple) {\n if (Array.isArray(value)) {\n setHasValue(value.length > 0);\n } else {\n setHasValue(String(value).length > 0);\n }\n return;\n }\n if (Array.isArray(value)) {\n setHasValue(value.length > 0 ? String(value[0]).length > 0 : false);\n return;\n }\n setHasValue(String(value).length > 0);\n }, [isControlled, multiple, value]);\n\n const placeholderOptionLabel = hidePlaceholderUntilFocus && !isFocused ? ' ' : placeholderText;\n const shouldRenderPlaceholder = !multiple && placeholderText !== undefined;\n const labelShouldFloat = hasValue || isFocused;\n const labelLeftClass = 'left-3';\n const labelBgDefault = ['outline', 'text', 'underlined'].includes(variant) ? 'bg-transparent' : 'bg-white/90';\n\n const handleFocus: React.FocusEventHandler<HTMLSelectElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(true);\n onFocus?.(event);\n };\n\n const handleBlur: React.FocusEventHandler<HTMLSelectElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(false);\n onBlur?.(event);\n };\n\n const handleChange: React.ChangeEventHandler<HTMLSelectElement> = event => {\n if (!isControlled) {\n const nextHasValue = multiple ? event.target.selectedOptions.length > 0 : event.target.value !== '';\n setHasValue(nextHasValue);\n }\n onChange?.(event);\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative flex items-center'>\n <select\n {...props}\n id={selectId}\n name={selectName}\n multiple={multiple}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n className={twMerge('peer', baseClass, variantClass, sizeClass, className)}\n >\n {shouldRenderPlaceholder && (\n <option value='' disabled={props.required} hidden={hasValue}>\n {placeholderOptionLabel}\n </option>\n )}\n {normalizedOptions.map((option, index) => (\n <option key={`${selectId}-${option.value}-${index}`} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n {!multiple && (\n <span className='pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500'>\n <i className='mdi mdi-chevron-down text-base leading-none' aria-hidden />\n </span>\n )}\n {label && (\n <label\n htmlFor={selectId}\n className={twMerge(\n 'absolute transition-all duration-150 pointer-events-none text-gray-700',\n labelLeftClass,\n labelShouldFloat\n ? [\n 'top-0 text-xs px-1',\n isFocused ? '-translate-y-1/2 text-gray-600' : '-translate-y-2/3',\n labelBgDefault\n ].join(' ')\n : 'top-1/2 -translate-y-1/2 text-sm text-gray-500'\n )}\n >\n {label}\n </label>\n )}\n </div>\n </div>\n );\n};\n\nexport default Select;\nexport type { SelectProps, SelectOption, SelectOptionObject } from './types.select';\n"]}
@@ -0,0 +1,29 @@
1
+ import react__default from 'react';
2
+ import { a as GlobalSize } from './global.types-E2uVLemv.cjs';
3
+ import { a as InputVariant } from './types-BCqIOkp1.cjs';
4
+
5
+ type SelectOptionObject = {
6
+ label: react__default.ReactNode;
7
+ value: string;
8
+ disabled?: boolean;
9
+ };
10
+ type SelectOption = string | SelectOptionObject;
11
+ type SelectProps = Omit<react__default.SelectHTMLAttributes<HTMLSelectElement>, 'children' | 'size'> & {
12
+ /**
13
+ * Options can be an array of strings or objects with label/value.
14
+ */
15
+ options: SelectOption[];
16
+ label?: react__default.ReactNode;
17
+ placeholder?: string;
18
+ wrapperClassName?: string;
19
+ variant?: InputVariant;
20
+ size?: GlobalSize;
21
+ };
22
+
23
+ /**
24
+ * Native select styled with the same visual variants as Input.
25
+ * Accepts options as string[] or { label, value }[] for convenience.
26
+ */
27
+ declare const Select: react__default.FC<SelectProps>;
28
+
29
+ export { type SelectOption, type SelectOptionObject, type SelectProps, Select as default };
@@ -0,0 +1,29 @@
1
+ import react__default from 'react';
2
+ import { a as GlobalSize } from './global.types-E2uVLemv.js';
3
+ import { a as InputVariant } from './types-ChXN4u7x.js';
4
+
5
+ type SelectOptionObject = {
6
+ label: react__default.ReactNode;
7
+ value: string;
8
+ disabled?: boolean;
9
+ };
10
+ type SelectOption = string | SelectOptionObject;
11
+ type SelectProps = Omit<react__default.SelectHTMLAttributes<HTMLSelectElement>, 'children' | 'size'> & {
12
+ /**
13
+ * Options can be an array of strings or objects with label/value.
14
+ */
15
+ options: SelectOption[];
16
+ label?: react__default.ReactNode;
17
+ placeholder?: string;
18
+ wrapperClassName?: string;
19
+ variant?: InputVariant;
20
+ size?: GlobalSize;
21
+ };
22
+
23
+ /**
24
+ * Native select styled with the same visual variants as Input.
25
+ * Accepts options as string[] or { label, value }[] for convenience.
26
+ */
27
+ declare const Select: react__default.FC<SelectProps>;
28
+
29
+ export { type SelectOption, type SelectOptionObject, type SelectProps, Select as default };
package/dist/select.js ADDED
@@ -0,0 +1,3 @@
1
+ export { Select_default as default } from './chunk-36T6I3XH.js';
2
+ //# sourceMappingURL=select.js.map
3
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"select.js"}
package/dist/slider.cjs CHANGED
@@ -6,7 +6,11 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
 
7
7
  // src/Form/Slider/index.tsx
8
8
  var paletteValues = {
9
- primary: { fill: "var(--color-primary, #6366f1)", ring: "rgba(99, 102, 241, 0.28)", thumbBorder: "#6366f1" },
9
+ primary: {
10
+ fill: "var(--color-primary, #6366f1)",
11
+ ring: "rgba(99, 102, 241, 0.28)",
12
+ thumbBorder: "#6366f1"
13
+ },
10
14
  neutral: { fill: "#4b5563", ring: "rgba(75, 85, 99, 0.28)", thumbBorder: "#4b5563" },
11
15
  info: { fill: "#0284c7", ring: "rgba(2, 132, 199, 0.28)", thumbBorder: "#0284c7" },
12
16
  success: { fill: "#059669", ring: "rgba(5, 150, 105, 0.24)", thumbBorder: "#059669" },
@@ -16,9 +20,19 @@ var paletteValues = {
16
20
  bw: { fill: "#000000", ring: "rgba(0, 0, 0, 0.26)", thumbBorder: "#000000" }
17
21
  };
18
22
  var sizeTokens = {
19
- small: { trackHeight: "0.375rem", thumbSize: "1.1rem", trackClass: "h-1.5", valueClass: "text-xs" },
23
+ small: {
24
+ trackHeight: "0.375rem",
25
+ thumbSize: "1.1rem",
26
+ trackClass: "h-1.5",
27
+ valueClass: "text-xs"
28
+ },
20
29
  medium: { trackHeight: "0.5rem", thumbSize: "1.25rem", trackClass: "h-2", valueClass: "text-sm" },
21
- large: { trackHeight: "0.6rem", thumbSize: "1.4rem", trackClass: "h-[0.65rem]", valueClass: "text-base" }
30
+ large: {
31
+ trackHeight: "0.6rem",
32
+ thumbSize: "1.4rem",
33
+ trackClass: "h-[0.65rem]",
34
+ valueClass: "text-base"
35
+ }
22
36
  };
23
37
  var clamp = (value, min, max) => Math.min(Math.max(value, min), max);
24
38
  var toNumber = (value, fallback) => {