@lindle/linoardo 1.0.39 → 1.0.41
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.
- package/dist/{ExpansionPanelItem-CFm8a8R_.d.ts → ExpansionPanelItem-C4-2nlhq.d.ts} +1 -1
- package/dist/{ExpansionPanelItem-ufS2RIZf.d.cts → ExpansionPanelItem-CEhDj2Uw.d.cts} +1 -1
- package/dist/badge.d.cts +1 -1
- package/dist/badge.d.ts +1 -1
- package/dist/block.d.cts +1 -1
- package/dist/block.d.ts +1 -1
- package/dist/button.d.cts +1 -1
- package/dist/button.d.ts +1 -1
- package/dist/card.d.cts +1 -1
- package/dist/card.d.ts +1 -1
- package/dist/chip.d.cts +12 -12
- package/dist/chip.d.ts +12 -12
- package/dist/chip.js +2 -1
- package/dist/chunk-4J3SRVOS.js +217 -0
- package/dist/chunk-4J3SRVOS.js.map +1 -0
- package/dist/chunk-HT5XBHWN.js +119 -0
- package/dist/chunk-HT5XBHWN.js.map +1 -0
- package/dist/{chunk-BDN4EDJQ.js → chunk-LULQOD2K.js} +12 -6
- package/dist/chunk-LULQOD2K.js.map +1 -0
- package/dist/{chunk-P3ESW6KM.js → chunk-OBGYXMZ3.js} +74 -28
- package/dist/chunk-OBGYXMZ3.js.map +1 -0
- package/dist/{chunk-HJFHZNOV.js → chunk-PSMGRUU5.js} +3 -116
- package/dist/chunk-PSMGRUU5.js.map +1 -0
- package/dist/expansion-panel/item.d.cts +2 -2
- package/dist/expansion-panel/item.d.ts +2 -2
- package/dist/expansion-panel.d.cts +3 -3
- package/dist/expansion-panel.d.ts +3 -3
- package/dist/{global.types-D-o85tuX.d.cts → global.types-gx9A7mUe.d.cts} +1 -1
- package/dist/{global.types-D-o85tuX.d.ts → global.types-gx9A7mUe.d.ts} +1 -1
- package/dist/hero.d.cts +1 -1
- package/dist/hero.d.ts +1 -1
- package/dist/icon.d.cts +1 -1
- package/dist/icon.d.ts +1 -1
- package/dist/{index-B7xZzSwm.d.cts → index-BDrBOeFI.d.cts} +1 -1
- package/dist/{index-BhfThlf0.d.ts → index-CNwl6vmH.d.ts} +1 -1
- package/dist/index.cjs +700 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +61 -6
- package/dist/index.d.ts +61 -6
- package/dist/index.js +409 -5
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +71 -25
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.cts +4 -2
- package/dist/input.d.ts +4 -2
- package/dist/input.js +1 -1
- package/dist/list/item.d.cts +2 -2
- package/dist/list/item.d.ts +2 -2
- package/dist/list.d.cts +3 -3
- package/dist/list.d.ts +3 -3
- package/dist/notification.d.cts +1 -1
- package/dist/notification.d.ts +1 -1
- package/dist/profileCard.d.cts +1 -1
- package/dist/profileCard.d.ts +1 -1
- package/dist/select.cjs +14 -4
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.cts +5 -4
- package/dist/select.d.ts +5 -4
- package/dist/select.js +1 -1
- package/dist/slider.d.cts +1 -1
- package/dist/slider.d.ts +1 -1
- package/dist/styles.css +166 -5
- package/dist/switch.d.cts +1 -1
- package/dist/switch.d.ts +1 -1
- package/dist/timeline.cjs +274 -0
- package/dist/timeline.cjs.map +1 -0
- package/dist/timeline.d.cts +54 -0
- package/dist/timeline.d.ts +54 -0
- package/dist/timeline.js +5 -0
- package/dist/timeline.js.map +1 -0
- package/dist/{types-DqPSePni.d.cts → types-CJ0zqPXF.d.cts} +1 -1
- package/dist/{types-CbQEphC3.d.ts → types-DaTHYIPO.d.ts} +1 -1
- package/package.json +13 -1
- package/dist/chunk-BDN4EDJQ.js.map +0 -1
- package/dist/chunk-HJFHZNOV.js.map +0 -1
- package/dist/chunk-P3ESW6KM.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Feedback/Notification/useNotification.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,eAAA,GAAkB,CAAC,cAAA,KAAsC;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAA6B,EAAE,CAAA;AAE/D,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAiB;AAC3C,IAAA,WAAA,CAAY,CAAA,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,CAAA,YAAA,KAAgB,aAAa,GAAA,KAAQ,GAAG,CAAA,GAAI,EAAG,CAAA;AAAA,EACxF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,YAAA,KAAmC;AAC3D,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC1C,IAAA,WAAA,CAAY,CAAA,IAAA,KAAQ;AAAA,MAClB,GAAG,IAAA;AAAA,MACH;AAAA,QACE,QAAA,EAAU,GAAA;AAAA,QACV,OAAA,EAAS,MAAM,kBAAA,CAAmB,GAAG,CAAA;AAAA,QACrC,GAAG,cAAA;AAAA,QACH,GAAG,YAAA;AAAA,QACH;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,EAAE,UAAU,gBAAA,EAAiB;AACtC,CAAA;AAEA,IAAO,uBAAA,GAAQ","file":"index.js","sourcesContent":["import { useState } from 'react';\nimport { NotificationArgs } from './types.notification';\n\nconst useNotification = (defaultMessage?: NotificationArgs) => {\n const [messages, setMessages] = useState<NotificationArgs[]>([]);\n\n const clearNotifications = (key?: string) => {\n setMessages(prev => (key ? prev.filter(notification => notification.key !== key) : []));\n };\n\n const showNotification = (notification: NotificationArgs) => {\n const key = `${Date.now()}-${Math.random()}`;\n setMessages(prev => [\n ...prev,\n {\n duration: 4000,\n onClose: () => clearNotifications(key),\n ...defaultMessage,\n ...notification,\n key\n }\n ]);\n };\n\n return { messages, showNotification };\n};\n\nexport default useNotification;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Containment/Tabs/context.ts","../src/Containment/Tabs/index.tsx","../src/Feedback/Notification/useNotification.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { isValidElement } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport type { TabProps } from './types.tabs';\n\nconst TABS_TAB_MARKER = '__isTabsTab';\n\ntype MarkerTarget = Record<string | number | symbol, unknown> & {\n type?: unknown;\n};\n\nconst hasMarker = (type: unknown): boolean => {\n if (!type || (typeof type !== 'function' && typeof type !== 'object')) {\n return false;\n }\n\n if ((type as MarkerTarget)[TABS_TAB_MARKER]) {\n return true;\n }\n\n const innerType = (type as MarkerTarget).type;\n if (innerType && innerType !== type) {\n return hasMarker(innerType);\n }\n\n return false;\n};\n\nexport const isTabsTabElement = (element: ReactNode): element is ReactElement<TabProps> => {\n if (!isValidElement(element)) {\n return false;\n }\n\n return hasMarker(element.type);\n};\n\nexport const markTabsTab = (component: unknown) => {\n if (typeof component !== 'function' && (typeof component !== 'object' || component === null)) {\n return;\n }\n\n (component as MarkerTarget)[TABS_TAB_MARKER] = true;\n};\n","import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { Palette, PropIcon } from '@lindle/linoardo/global.types';\nimport { resolveIconClassName } from '../Chip/states.chip';\nimport { isTabsTabElement, markTabsTab } from './context';\nimport type {\n TabProps,\n TabsContextValue,\n TabsExtraContent,\n TabsInternalProps,\n TabsProps,\n TabsSize,\n TabsValue,\n TabsVariant\n} from './types.tabs';\n\nconst sizeClasses: Record<TabsSize, { tab: string; icon: string }> = {\n 'x-small': { tab: 'h-7 px-2 text-xs', icon: 'text-sm' },\n small: { tab: 'h-8 px-2.5 text-sm', icon: 'text-base' },\n medium: { tab: 'h-9 px-3 text-sm', icon: 'text-base' },\n large: { tab: 'h-10 px-3.5 text-base', icon: 'text-lg' },\n 'x-large': { tab: 'h-11 px-4 text-base', icon: 'text-lg' }\n};\n\nconst variantListClasses: Record<TabsVariant, string> = {\n line: 'border-b border-gray-200',\n card: 'rounded-xl bg-gray-100 p-1',\n pill: 'rounded-full bg-gray-100/80 p-1'\n};\n\nconst variantTabBaseClasses: Record<TabsVariant, string> = {\n line: 'border-b-2 border-transparent -mb-px',\n card: 'rounded-lg border border-transparent bg-white/70',\n pill: 'rounded-full'\n};\n\nconst paletteClasses: Record<Palette, { text: string; border: string; bg: string; ring: string; ink: string }> = {\n primary: {\n text: 'text-primary',\n border: 'border-primary',\n bg: 'bg-primary/10',\n ring: 'ring-primary/30',\n ink: 'bg-primary'\n },\n neutral: {\n text: 'text-gray-900',\n border: 'border-gray-900',\n bg: 'bg-gray-100',\n ring: 'ring-gray-900/20',\n ink: 'bg-gray-900'\n },\n info: {\n text: 'text-sky-600',\n border: 'border-sky-500',\n bg: 'bg-sky-50',\n ring: 'ring-sky-500/20',\n ink: 'bg-sky-500'\n },\n success: {\n text: 'text-emerald-600',\n border: 'border-emerald-500',\n bg: 'bg-emerald-50',\n ring: 'ring-emerald-500/20',\n ink: 'bg-emerald-500'\n },\n warning: {\n text: 'text-amber-600',\n border: 'border-amber-500',\n bg: 'bg-amber-50',\n ring: 'ring-amber-500/20',\n ink: 'bg-amber-500'\n },\n danger: {\n text: 'text-red-600',\n border: 'border-red-500',\n bg: 'bg-red-50',\n ring: 'ring-red-500/20',\n ink: 'bg-red-500'\n },\n surface: {\n text: 'text-gray-900',\n border: 'border-gray-300',\n bg: 'bg-white',\n ring: 'ring-gray-300/30',\n ink: 'bg-gray-400'\n },\n bw: {\n text: 'text-black',\n border: 'border-black',\n bg: 'bg-black/10',\n ring: 'ring-black/20',\n ink: 'bg-black'\n }\n};\n\nconst panelVariantClasses: Record<TabsVariant, string> = {\n line: 'pt-4',\n card: 'mt-3 rounded-xl border border-gray-200 bg-white p-4 shadow-sm',\n pill: 'mt-3 rounded-2xl border border-gray-200 bg-white/90 p-4'\n};\n\nconst isExtraContentObject = (value: TabsExtraContent): value is { left?: React.ReactNode; right?: React.ReactNode } => {\n return (\n !!value &&\n typeof value === 'object' &&\n !React.isValidElement(value) &&\n ('left' in (value as Record<string, unknown>) || 'right' in (value as Record<string, unknown>))\n );\n};\n\nconst resolveFirstEnabledTab = (tabs: TabsDescriptor[]): TabsValue | undefined =>\n tabs.find(tab => !tab.disabled)?.value;\n\nconst clampActive = (value: TabsValue | undefined, tabs: TabsDescriptor[]): TabsValue | undefined => {\n if (value === undefined) {\n return resolveFirstEnabledTab(tabs);\n }\n\n const match = tabs.find(tab => tab.value === value);\n if (!match || match.disabled) {\n return resolveFirstEnabledTab(tabs);\n }\n\n return value;\n};\n\nconst resolveIconNode = (icon?: PropIcon, size?: TabsSize) => {\n if (!icon) return null;\n const iconClass = resolveIconClassName(icon);\n return iconClass ? <i className={twMerge(iconClass, size ? sizeClasses[size].icon : undefined)} aria-hidden /> : null;\n};\n\ntype TabsDescriptor = {\n element: React.ReactElement<TabProps>;\n index: number;\n value: TabsValue;\n label: React.ReactNode;\n disabled?: boolean;\n icon?: PropIcon;\n badge?: React.ReactNode;\n tabClassName?: string;\n panelClassName?: string;\n tabId: string;\n panelId: string;\n forceRender?: boolean;\n};\n\nconst collectTabs = (children: React.ReactNode, tabsId: string): TabsDescriptor[] => {\n const tabs: TabsDescriptor[] = [];\n let index = 0;\n\n const walk = (node: React.ReactNode) => {\n if (Array.isArray(node)) {\n node.forEach(walk);\n return;\n }\n\n if (!isTabsTabElement(node)) {\n if (React.isValidElement(node)) {\n const props = node.props as { children?: React.ReactNode } | null;\n if (props && Object.prototype.hasOwnProperty.call(props, 'children')) {\n walk(props.children);\n }\n }\n return;\n }\n\n const tabIndex = index++;\n const value = node.props.value ?? tabIndex;\n const tabId = `${tabsId}-tab-${tabIndex}`;\n const panelId = `${tabsId}-panel-${tabIndex}`;\n\n tabs.push({\n element: node,\n index: tabIndex,\n value,\n label: node.props.label,\n disabled: node.props.disabled,\n icon: node.props.icon,\n badge: node.props.badge,\n tabClassName: node.props.tabClassName,\n panelClassName: node.props.panelClassName,\n tabId,\n panelId,\n forceRender: node.props.forceRender\n });\n };\n\n walk(children);\n return tabs;\n};\n\nconst injectTabs = (\n children: React.ReactNode,\n context: TabsContextValue,\n tabs: TabsDescriptor[]\n): React.ReactNode => {\n let index = 0;\n\n const walk = (node: React.ReactNode): React.ReactNode => {\n if (Array.isArray(node)) {\n let changed = false;\n const next = node.map(child => {\n const mapped = walk(child);\n if (mapped !== child) {\n changed = true;\n }\n return mapped;\n });\n return changed ? next : node;\n }\n\n if (!React.isValidElement(node)) {\n return node;\n }\n\n if (isTabsTabElement(node)) {\n const tab = tabs[index++];\n if (!tab) {\n return node;\n }\n const injectedProps: Partial<TabProps & TabsInternalProps> = {\n value: tab.value,\n __tabsContext: context,\n __tabsValue: tab.value,\n __tabsIndex: tab.index,\n __tabsTabId: tab.tabId,\n __tabsPanelId: tab.panelId\n };\n return React.cloneElement(node, injectedProps);\n }\n\n if (node.props) {\n const props = node.props as { children?: React.ReactNode } | null;\n if (props && Object.prototype.hasOwnProperty.call(props, 'children')) {\n const mappedChildren = walk(props.children);\n if (mappedChildren !== props.children) {\n return React.cloneElement(node, undefined, mappedChildren);\n }\n }\n }\n\n return node;\n };\n\n return walk(children);\n};\n\nconst handleTabListKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const { key } = event;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key)) {\n return;\n }\n\n const tabs = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]'))\n .filter(tab => !tab.disabled);\n\n if (!tabs.length) {\n return;\n }\n\n const currentIndex = tabs.findIndex(tab => tab === document.activeElement);\n let nextIndex = currentIndex;\n\n if (key === 'ArrowRight') {\n nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % tabs.length;\n }\n\n if (key === 'ArrowLeft') {\n nextIndex = currentIndex === -1 ? tabs.length - 1 : (currentIndex - 1 + tabs.length) % tabs.length;\n }\n\n if (key === 'Home') {\n nextIndex = 0;\n }\n\n if (key === 'End') {\n nextIndex = tabs.length - 1;\n }\n\n tabs[nextIndex]?.focus();\n event.preventDefault();\n};\n\n/**\n * Tabbed container inspired by Ant Design with line, card, and pill styles.\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>((props, ref) => {\n const {\n activeKey,\n defaultActiveKey,\n onChange,\n variant = 'line',\n size = 'medium',\n color = 'primary',\n align = 'start',\n tabBarGutter = 8,\n tabBarExtraContent,\n tabBarClassName,\n destroyInactiveTabPane = false,\n keepMounted = false,\n className,\n children,\n id,\n ...rest\n } = props;\n\n const tabsId = typeof id === 'string' && id.trim().length ? id : 'tabs';\n const tabs = collectTabs(children, tabsId);\n const resolvedActive = clampActive(activeKey ?? defaultActiveKey, tabs);\n\n const handleActivate = (value: TabsValue) => {\n onChange?.(value);\n };\n\n const extraContent = tabBarExtraContent;\n const extraLeft = isExtraContentObject(extraContent) ? extraContent.left : null;\n const extraRight = isExtraContentObject(extraContent) ? extraContent.right : extraContent;\n\n const palette = paletteClasses[color] ?? paletteClasses.primary;\n\n const context: TabsContextValue = {\n activeKey: resolvedActive,\n onChange: handleActivate,\n variant,\n size,\n color,\n destroyInactiveTabPane,\n keepMounted\n };\n\n const enhancedChildren = injectTabs(children, context, tabs);\n\n return (\n <div\n {...rest}\n id={id}\n ref={ref}\n className={twMerge('tabs flex w-full flex-col text-gray-900', className)}\n >\n <div className='flex items-center gap-3'>\n {extraLeft ? <div className='flex items-center'>{extraLeft}</div> : null}\n <div\n role='tablist'\n aria-orientation='horizontal'\n onKeyDown={handleTabListKeyDown}\n className={twMerge(\n 'flex min-w-0 flex-1 items-center gap-2 overflow-x-auto',\n align === 'center' ? 'justify-center' : align === 'end' ? 'justify-end' : undefined,\n variantListClasses[variant],\n tabBarClassName\n )}\n style={{ gap: tabBarGutter }}\n >\n {tabs.map(tab => {\n const isActive = tab.value === resolvedActive;\n const sizeClass = sizeClasses[size] ?? sizeClasses.medium;\n const iconNode = resolveIconNode(tab.icon, size);\n const badgeNode = tab.badge ? (\n <span className='rounded-full bg-gray-200 px-1.5 py-0.5 text-[0.6rem] font-semibold text-gray-700'>\n {tab.badge}\n </span>\n ) : null;\n const activeText = isActive ? palette.text : 'text-gray-600';\n const activeBorder = isActive ? palette.border : 'border-transparent';\n const activeBg = isActive ? palette.bg : undefined;\n const activeRing = isActive ? palette.ring : undefined;\n\n const variantClasses = {\n line: twMerge(activeText, activeBorder),\n card: twMerge(activeText, activeBg, activeBorder, isActive ? 'shadow-sm' : undefined),\n pill: twMerge(activeText, activeBg)\n };\n\n return (\n <button\n key={tab.value}\n type='button'\n role='tab'\n id={tab.tabId}\n aria-selected={isActive}\n aria-controls={tab.panelId}\n aria-disabled={tab.disabled || undefined}\n disabled={tab.disabled}\n tabIndex={isActive ? 0 : -1}\n onClick={() => {\n if (!tab.disabled) {\n handleActivate(tab.value);\n }\n }}\n className={twMerge(\n 'inline-flex items-center gap-2 whitespace-nowrap font-medium transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2',\n sizeClass.tab,\n variantTabBaseClasses[variant],\n variantClasses[variant],\n activeRing ? `ring-1 ${activeRing}` : undefined,\n tab.disabled\n ? 'cursor-not-allowed text-gray-400 opacity-60'\n : 'hover:text-gray-900',\n tab.tabClassName\n )}\n data-state={isActive ? 'active' : 'inactive'}\n >\n {iconNode}\n <span className='truncate'>{tab.label}</span>\n {badgeNode}\n </button>\n );\n })}\n </div>\n {extraRight ? <div className='flex items-center'>{extraRight}</div> : null}\n </div>\n <div className={twMerge('min-h-0', panelVariantClasses[variant])}>{enhancedChildren}</div>\n </div>\n );\n});\n\nTabs.displayName = 'Tabs';\n\nconst Tab = React.forwardRef<HTMLDivElement, TabProps & TabsInternalProps>((props, ref) => {\n const {\n label: _label,\n value,\n disabled,\n forceRender,\n tabClassName: _tabClassName,\n panelClassName,\n className,\n children,\n __tabsContext,\n __tabsValue,\n __tabsTabId,\n __tabsPanelId,\n ...rest\n } = props;\n\n const context = __tabsContext;\n const resolvedValue = value ?? __tabsValue;\n const isActive = context ? context.activeKey === resolvedValue : true;\n\n const shouldRender =\n !context ||\n isActive ||\n context.keepMounted ||\n !context.destroyInactiveTabPane ||\n forceRender;\n\n if (!shouldRender) {\n return null;\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n role='tabpanel'\n id={__tabsPanelId}\n aria-labelledby={__tabsTabId}\n aria-hidden={context ? !isActive : undefined}\n hidden={context ? !isActive : undefined}\n className={twMerge('tabs-panel text-gray-900', className, panelClassName)}\n data-state={isActive ? 'active' : 'inactive'}\n data-disabled={disabled || undefined}\n >\n {children}\n </div>\n );\n});\n\nTab.displayName = 'Tab';\nmarkTabsTab(Tab);\n\nexport type { TabProps, TabsProps, TabsValue, TabsVariant, TabsSize } from './types.tabs';\nexport { Tab };\nexport default Tabs;\n","import { useState } from 'react';\nimport { NotificationArgs } from './types.notification';\n\nconst useNotification = (defaultMessage?: NotificationArgs) => {\n const [messages, setMessages] = useState<NotificationArgs[]>([]);\n\n const clearNotifications = (key?: string) => {\n setMessages(prev => (key ? prev.filter(notification => notification.key !== key) : []));\n };\n\n const showNotification = (notification: NotificationArgs) => {\n const key = `${Date.now()}-${Math.random()}`;\n setMessages(prev => [\n ...prev,\n {\n duration: 4000,\n onClose: () => clearNotifications(key),\n ...defaultMessage,\n ...notification,\n key\n }\n ]);\n };\n\n return { messages, showNotification };\n};\n\nexport default useNotification;\n"]}
|
package/dist/input.cjs
CHANGED
|
@@ -52,6 +52,8 @@ var Input = React__default.default.forwardRef(
|
|
|
52
52
|
className,
|
|
53
53
|
wrapperClassName,
|
|
54
54
|
label,
|
|
55
|
+
prefix,
|
|
56
|
+
suffix,
|
|
55
57
|
...props
|
|
56
58
|
}, ref) => {
|
|
57
59
|
const { placeholder, onFocus, onBlur, ...inputProps } = props;
|
|
@@ -72,19 +74,51 @@ var Input = React__default.default.forwardRef(
|
|
|
72
74
|
rounded: "rounded-full px-4 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20"
|
|
73
75
|
};
|
|
74
76
|
const sizeClasses = {
|
|
75
|
-
"x-small": {
|
|
77
|
+
"x-small": {
|
|
78
|
+
paddingY: "py-2",
|
|
79
|
+
paddingLeft: "pl-2",
|
|
80
|
+
paddingRight: "pr-2",
|
|
81
|
+
paddingLeftLeading: "pl-8",
|
|
82
|
+
paddingLeftLeadingDouble: "pl-12",
|
|
83
|
+
paddingRightTrailing: "pr-8",
|
|
84
|
+
text: "text-xs"
|
|
85
|
+
},
|
|
76
86
|
small: {
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
paddingY: "py-2.5",
|
|
88
|
+
paddingLeft: "pl-2.5",
|
|
89
|
+
paddingRight: "pr-2.5",
|
|
90
|
+
paddingLeftLeading: "pl-9",
|
|
91
|
+
paddingLeftLeadingDouble: "pl-12",
|
|
92
|
+
paddingRightTrailing: "pr-9",
|
|
79
93
|
text: "text-sm"
|
|
80
94
|
},
|
|
81
|
-
medium: {
|
|
95
|
+
medium: {
|
|
96
|
+
paddingY: "py-3",
|
|
97
|
+
paddingLeft: "pl-3",
|
|
98
|
+
paddingRight: "pr-3",
|
|
99
|
+
paddingLeftLeading: "pl-10",
|
|
100
|
+
paddingLeftLeadingDouble: "pl-14",
|
|
101
|
+
paddingRightTrailing: "pr-10",
|
|
102
|
+
text: "text-base"
|
|
103
|
+
},
|
|
82
104
|
large: {
|
|
83
|
-
|
|
84
|
-
|
|
105
|
+
paddingY: "py-3.5",
|
|
106
|
+
paddingLeft: "pl-3.5",
|
|
107
|
+
paddingRight: "pr-3.5",
|
|
108
|
+
paddingLeftLeading: "pl-11",
|
|
109
|
+
paddingLeftLeadingDouble: "pl-14",
|
|
110
|
+
paddingRightTrailing: "pr-11",
|
|
85
111
|
text: "text-lg"
|
|
86
112
|
},
|
|
87
|
-
"x-large": {
|
|
113
|
+
"x-large": {
|
|
114
|
+
paddingY: "py-4",
|
|
115
|
+
paddingLeft: "pl-4",
|
|
116
|
+
paddingRight: "pr-4",
|
|
117
|
+
paddingLeftLeading: "pl-12",
|
|
118
|
+
paddingLeftLeadingDouble: "pl-16",
|
|
119
|
+
paddingRightTrailing: "pr-12",
|
|
120
|
+
text: "text-xl"
|
|
121
|
+
}
|
|
88
122
|
};
|
|
89
123
|
const status = error ? { tone: "error", message: error } : warn ? { tone: "warn", message: warn } : success ? { tone: "success", message: success } : void 0;
|
|
90
124
|
const statusClasses = {
|
|
@@ -100,16 +134,23 @@ var Input = React__default.default.forwardRef(
|
|
|
100
134
|
const variantClass = variantClasses[variant] ?? variantClasses.outline;
|
|
101
135
|
const toneClass = status ? statusClasses[status.tone] : void 0;
|
|
102
136
|
let prependIconClass = resolveIconClassName(icon);
|
|
137
|
+
const hasPrefix = typeof prefix === "string" ? prefix.trim().length > 0 : Boolean(prefix);
|
|
138
|
+
const hasSuffix = typeof suffix === "string" ? suffix.trim().length > 0 : Boolean(suffix);
|
|
139
|
+
const hasLeadingIcon = Boolean(prependIconClass);
|
|
140
|
+
const hasLeadingAdornment = hasLeadingIcon || hasPrefix;
|
|
141
|
+
const hasTrailingAdornment = hasSuffix;
|
|
103
142
|
const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
].join(" ");
|
|
143
|
+
const leftPaddingClass = hasPrefix ? sizeConfig.paddingLeftLeadingDouble : hasLeadingAdornment ? sizeConfig.paddingLeftLeading : sizeConfig.paddingLeft;
|
|
144
|
+
const rightPaddingClass = hasTrailingAdornment ? sizeConfig.paddingRightTrailing : sizeConfig.paddingRight;
|
|
145
|
+
const sizeClass = [sizeConfig.paddingY, leftPaddingClass, rightPaddingClass, sizeConfig.text].join(" ");
|
|
108
146
|
const inputName = inputProps.name || reactId;
|
|
109
147
|
const basePlaceholder = placeholder ?? (hasLabel ? " " : void 0);
|
|
110
148
|
const placeholderValue = hidePlaceholderUntilFocus ? isFocused ? placeholder : " " : basePlaceholder;
|
|
111
149
|
const placeholderClass = hidePlaceholderUntilFocus ? "placeholder-transparent focus:placeholder-gray-500 focus:dark:placeholder-gray-400" : void 0;
|
|
112
|
-
const labelLeftClass =
|
|
150
|
+
const labelLeftClass = hasLeadingAdornment ? "left-10" : "left-3";
|
|
151
|
+
const labelFocusLeftClass = hasLeadingAdornment ? "peer-focus:left-10" : "peer-focus:left-3";
|
|
152
|
+
const renderPrefix = hasPrefix ? typeof prefix === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: tailwindMerge.twMerge("text-gray-500 dark:text-gray-400", sizeConfig.text), children: prefix }) : prefix : null;
|
|
153
|
+
const renderSuffix = hasSuffix ? typeof suffix === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: tailwindMerge.twMerge("text-gray-500 dark:text-gray-400", sizeConfig.text), children: suffix }) : suffix : null;
|
|
113
154
|
const labelBgDefault = ["outline", "text", "underlined"].includes(variant) ? "bg-transparent" : "bg-white/90 dark:bg-slate-900";
|
|
114
155
|
const handleFocus = (event) => {
|
|
115
156
|
if (hidePlaceholderUntilFocus) setIsFocused(true);
|
|
@@ -121,17 +162,20 @@ var Input = React__default.default.forwardRef(
|
|
|
121
162
|
};
|
|
122
163
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge("flex flex-col gap-1", wrapperClassName), children: [
|
|
123
164
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center", children: [
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
165
|
+
hasLeadingAdornment && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "absolute left-3 inset-y-0 flex items-center gap-2", children: [
|
|
166
|
+
prependIconClass && /* @__PURE__ */ jsxRuntime.jsx(
|
|
167
|
+
"i",
|
|
168
|
+
{
|
|
169
|
+
className: tailwindMerge.twMerge(
|
|
170
|
+
"text-gray-500 dark:text-gray-400",
|
|
171
|
+
status?.tone && statusMessageClasses[status?.tone] || "",
|
|
172
|
+
prependIconClass
|
|
173
|
+
),
|
|
174
|
+
"aria-hidden": true
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
renderPrefix
|
|
178
|
+
] }),
|
|
135
179
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
136
180
|
"input",
|
|
137
181
|
{
|
|
@@ -161,16 +205,18 @@ var Input = React__default.default.forwardRef(
|
|
|
161
205
|
"absolute transition-all duration-150 pointer-events-none text-gray-700 rounded dark:text-gray-200",
|
|
162
206
|
labelLeftClass,
|
|
163
207
|
// Floated state: center label's vertical middle on the top border line
|
|
164
|
-
"-top-1.5
|
|
208
|
+
"-top-1.5 -translate-y-2/3 text-xs px-1",
|
|
165
209
|
labelBgDefault,
|
|
166
210
|
// focus state mirrors floated state (keeps center on border)
|
|
211
|
+
labelFocusLeftClass,
|
|
167
212
|
"peer-focus:top-0 peer-focus:-translate-y-1/2 peer-focus:text-xs peer-focus:px-1 peer-focus:bg-white peer-focus:text-gray-600 dark:peer-focus:bg-slate-900 dark:peer-focus:text-gray-300",
|
|
168
213
|
// when input is empty (placeholder shown) -> center label inside input
|
|
169
214
|
"peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 peer-placeholder-shown:text-sm peer-placeholder-shown:bg-transparent peer-placeholder-shown:text-gray-500 dark:peer-placeholder-shown:text-gray-400"
|
|
170
215
|
),
|
|
171
216
|
children: label
|
|
172
217
|
}
|
|
173
|
-
)
|
|
218
|
+
),
|
|
219
|
+
hasTrailingAdornment && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-3 inset-y-0 flex items-center", children: renderSuffix })
|
|
174
220
|
] }),
|
|
175
221
|
status?.message && /* @__PURE__ */ jsxRuntime.jsx("span", { className: tailwindMerge.twMerge("text-sm", statusMessageClasses[status.tone]), children: status.message })
|
|
176
222
|
] });
|
package/dist/input.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/globals.ts","../src/Form/Input/states.input.ts","../src/Form/Input/index.tsx"],"names":["normalizedName","React","twMerge","jsxs","jsx"],"mappings":"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","file":"input.cjs","sourcesContent":["export const iconBaseClasses = {\n mdi: ['mdi']\n} as const;\n","import { iconBaseClasses } from '@lindle/linoardo/globals';\nimport { InputProp } from './types';\n\nexport const resolveIconClassName = (icon?: InputProp['icon']) => {\n if (!icon) {\n return undefined;\n }\n\n if (typeof icon === 'string') {\n const trimmed = icon.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes(' ')) {\n return trimmed;\n }\n\n const normalizedName = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalizedName].join(' ');\n }\n\n const [library, iconNameRaw] = icon;\n const baseClasses = iconBaseClasses[library] ?? [library];\n const iconName = iconNameRaw.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n const normalizedName = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n const classes = [...baseClasses, normalizedName];\n return Array.from(new Set(classes)).join(' ');\n};\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { InputProp, InputVariant, InputSize } from './types';\nimport { resolveIconClassName } from './states.input';\n\n/**\n * Text input with multiple visual variants and inline status or icon adornments.\n * Label is purely CSS-driven (peer + placeholder-shown + focus), no hooks used.\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProp>(\n (\n {\n variant = 'outline',\n size = 'medium',\n success,\n error,\n warn,\n icon,\n className,\n wrapperClassName,\n label,\n ...props\n },\n ref\n ) => {\n const { placeholder, onFocus, onBlur, ...inputProps } = props;\n const reactId = React.useId();\n const hasLabel = Boolean(label);\n const hasProvidedPlaceholder = typeof placeholder === 'string' && placeholder.trim().length > 0;\n const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder;\n const [isFocused, setIsFocused] = React.useState(false);\n const classBase =\n 'input-base focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed w-full text-gray-900 dark:text-gray-100 placeholder:text-gray-500 dark:placeholder:text-gray-400';\n const 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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\n text: 'rounded-none border-0 border-b border-transparent px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\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 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\n underlined:\n 'rounded-none border-0 border-b border-gray-300 px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\n rounded:\n 'rounded-full px-4 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\n } satisfies Record<InputVariant, string>;\n const sizeClasses = {\n 'x-small': { paddingNoIcon: 'px-2 py-2', paddingWithIcon: 'pl-8 pr-2 py-2', text: 'text-xs' },\n small: {\n paddingNoIcon: 'px-2.5 py-2.5',\n paddingWithIcon: 'pl-9 pr-2.5 py-2.5',\n text: 'text-sm'\n },\n medium: { paddingNoIcon: 'px-3 py-3', paddingWithIcon: 'pl-10 pr-3 py-3', text: 'text-base' },\n large: {\n paddingNoIcon: 'px-3.5 py-3.5',\n paddingWithIcon: 'pl-11 pr-3.5 py-3.5',\n text: 'text-lg'\n },\n 'x-large': { paddingNoIcon: 'px-4 py-4', paddingWithIcon: 'pl-12 pr-4 py-4', text: 'text-xl' }\n } satisfies Record<InputSize, { paddingNoIcon: string; paddingWithIcon: string; text: string }>;\n\n const status = error\n ? { tone: 'error' as const, message: error }\n : warn\n ? { tone: 'warn' as const, message: warn }\n : success\n ? { tone: 'success' as const, message: success }\n : undefined;\n\n const statusClasses = {\n error: 'border-red-500 focus:border-red-500 focus:ring-red-400',\n warn: 'border-amber-500 focus:border-amber-500 focus:ring-amber-400',\n success: 'border-emerald-500 focus:border-emerald-500 focus:ring-emerald-400'\n } as const;\n\n const statusMessageClasses = {\n error: 'text-red-600 dark:text-red-300',\n warn: 'text-amber-600 dark:text-amber-300',\n success: 'text-emerald-600 dark:text-emerald-300'\n } as const;\n\n const variantClass = variantClasses[variant] ?? variantClasses.outline;\n const toneClass = status ? statusClasses[status.tone] : undefined;\n let prependIconClass = resolveIconClassName(icon);\n const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;\n const sizeClass = [\n prependIconClass ? sizeConfig.paddingWithIcon : sizeConfig.paddingNoIcon,\n sizeConfig.text\n ].join(' ');\n\n // useId keeps SSR/CSR ids consistent while still providing a fallback name\n const inputName = inputProps.name || reactId;\n\n // Ensure placeholder is present when label exists so :placeholder-shown works.\n // Label stays primary; placeholder only appears on focus when the field is empty.\n const basePlaceholder = placeholder ?? (hasLabel ? ' ' : undefined);\n const placeholderValue = hidePlaceholderUntilFocus\n ? isFocused\n ? placeholder\n : ' '\n : basePlaceholder;\n const placeholderClass = hidePlaceholderUntilFocus\n ? 'placeholder-transparent focus:placeholder-gray-500 focus:dark:placeholder-gray-400'\n : undefined;\n\n // Label left offset depends on icon presence\n const labelLeftClass = prependIconClass ? 'left-10' : 'left-3';\n\n // Background for floated label — keep transparent for outline/text/underlined variants\n const labelBgDefault = ['outline', 'text', 'underlined'].includes(variant)\n ? 'bg-transparent'\n : 'bg-white/90 dark:bg-slate-900';\n\n const handleFocus: React.FocusEventHandler<HTMLInputElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(true);\n onFocus?.(event);\n };\n\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(false);\n onBlur?.(event);\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative flex items-center'>\n {prependIconClass && (\n <i\n className={twMerge(\n 'pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-500 dark:text-gray-400',\n (status?.tone && statusMessageClasses[status?.tone]) || '',\n prependIconClass\n )}\n aria-hidden\n />\n )}\n\n {/* input is peer so label can react with peer-* utilities */}\n <input\n {...inputProps}\n ref={ref}\n id={inputName}\n name={inputName}\n placeholder={placeholderValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={twMerge(\n 'peer',\n classBase,\n variantClass,\n toneClass,\n sizeClass,\n placeholderClass,\n className\n )}\n />\n\n {label && (\n <label\n htmlFor={inputName}\n className={twMerge(\n 'absolute transition-all duration-150 pointer-events-none text-gray-700 rounded dark:text-gray-200',\n labelLeftClass,\n // Floated state: center label's vertical middle on the top border line\n '-top-1.5 left-1 peer-focus:left-7 -translate-y-2/3 text-xs px-1',\n labelBgDefault,\n // focus state mirrors floated state (keeps center on border)\n 'peer-focus:top-0 peer-focus:-translate-y-1/2 peer-focus:text-xs peer-focus:px-1 peer-focus:bg-white peer-focus:text-gray-600 dark:peer-focus:bg-slate-900 dark:peer-focus:text-gray-300',\n // when input is empty (placeholder shown) -> center label inside input\n 'peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 peer-placeholder-shown:text-sm peer-placeholder-shown:bg-transparent peer-placeholder-shown:text-gray-500 dark:peer-placeholder-shown:text-gray-400'\n )}\n >\n {label}\n </label>\n )}\n\n {/* {appendIconClass && (\n <i className={twMerge('pointer-events-none absolute right-3 text-gray-500', appendIconClass)} aria-hidden />\n )} */}\n </div>\n {status?.message && (\n <span className={twMerge('text-sm', statusMessageClasses[status.tone])}>\n {status.message}\n </span>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/globals.ts","../src/Form/Input/states.input.ts","../src/Form/Input/index.tsx"],"names":["normalizedName","React","jsx","twMerge","jsxs"],"mappings":"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","file":"input.cjs","sourcesContent":["export const iconBaseClasses = {\n mdi: ['mdi']\n} as const;\n","import { iconBaseClasses } from '@lindle/linoardo/globals';\nimport { InputProp } from './types';\n\nexport const resolveIconClassName = (icon?: InputProp['icon']) => {\n if (!icon) {\n return undefined;\n }\n\n if (typeof icon === 'string') {\n const trimmed = icon.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes(' ')) {\n return trimmed;\n }\n\n const normalizedName = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalizedName].join(' ');\n }\n\n const [library, iconNameRaw] = icon;\n const baseClasses = iconBaseClasses[library] ?? [library];\n const iconName = iconNameRaw.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n const normalizedName = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n const classes = [...baseClasses, normalizedName];\n return Array.from(new Set(classes)).join(' ');\n};\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { InputProp, InputVariant, InputSize } from './types';\nimport { resolveIconClassName } from './states.input';\n\n/**\n * Text input with multiple visual variants and inline status or icon adornments.\n * Label is purely CSS-driven (peer + placeholder-shown + focus), no hooks used.\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProp>(\n (\n {\n variant = 'outline',\n size = 'medium',\n success,\n error,\n warn,\n icon,\n className,\n wrapperClassName,\n label,\n prefix,\n suffix,\n ...props\n },\n ref\n ) => {\n const { placeholder, onFocus, onBlur, ...inputProps } = props;\n const reactId = React.useId();\n const hasLabel = Boolean(label);\n const hasProvidedPlaceholder = typeof placeholder === 'string' && placeholder.trim().length > 0;\n const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder;\n const [isFocused, setIsFocused] = React.useState(false);\n const classBase =\n 'input-base focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed w-full text-gray-900 dark:text-gray-100 placeholder:text-gray-500 dark:placeholder:text-gray-400';\n const 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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\n text: 'rounded-none border-0 border-b border-transparent px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\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 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\n underlined:\n 'rounded-none border-0 border-b border-gray-300 px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\n rounded:\n 'rounded-full px-4 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\n } satisfies Record<InputVariant, string>;\n const sizeClasses = {\n 'x-small': {\n paddingY: 'py-2',\n paddingLeft: 'pl-2',\n paddingRight: 'pr-2',\n paddingLeftLeading: 'pl-8',\n paddingLeftLeadingDouble: 'pl-12',\n paddingRightTrailing: 'pr-8',\n text: 'text-xs'\n },\n small: {\n paddingY: 'py-2.5',\n paddingLeft: 'pl-2.5',\n paddingRight: 'pr-2.5',\n paddingLeftLeading: 'pl-9',\n paddingLeftLeadingDouble: 'pl-12',\n paddingRightTrailing: 'pr-9',\n text: 'text-sm'\n },\n medium: {\n paddingY: 'py-3',\n paddingLeft: 'pl-3',\n paddingRight: 'pr-3',\n paddingLeftLeading: 'pl-10',\n paddingLeftLeadingDouble: 'pl-14',\n paddingRightTrailing: 'pr-10',\n text: 'text-base'\n },\n large: {\n paddingY: 'py-3.5',\n paddingLeft: 'pl-3.5',\n paddingRight: 'pr-3.5',\n paddingLeftLeading: 'pl-11',\n paddingLeftLeadingDouble: 'pl-14',\n paddingRightTrailing: 'pr-11',\n text: 'text-lg'\n },\n 'x-large': {\n paddingY: 'py-4',\n paddingLeft: 'pl-4',\n paddingRight: 'pr-4',\n paddingLeftLeading: 'pl-12',\n paddingLeftLeadingDouble: 'pl-16',\n paddingRightTrailing: 'pr-12',\n text: 'text-xl'\n }\n } satisfies Record<\n InputSize,\n {\n paddingY: string;\n paddingLeft: string;\n paddingRight: string;\n paddingLeftLeading: string;\n paddingLeftLeadingDouble: string;\n paddingRightTrailing: string;\n text: string;\n }\n >;\n\n const status = error\n ? { tone: 'error' as const, message: error }\n : warn\n ? { tone: 'warn' as const, message: warn }\n : success\n ? { tone: 'success' as const, message: success }\n : undefined;\n\n const statusClasses = {\n error: 'border-red-500 focus:border-red-500 focus:ring-red-400',\n warn: 'border-amber-500 focus:border-amber-500 focus:ring-amber-400',\n success: 'border-emerald-500 focus:border-emerald-500 focus:ring-emerald-400'\n } as const;\n\n const statusMessageClasses = {\n error: 'text-red-600 dark:text-red-300',\n warn: 'text-amber-600 dark:text-amber-300',\n success: 'text-emerald-600 dark:text-emerald-300'\n } as const;\n\n const variantClass = variantClasses[variant] ?? variantClasses.outline;\n const toneClass = status ? statusClasses[status.tone] : undefined;\n let prependIconClass = resolveIconClassName(icon);\n const hasPrefix = typeof prefix === 'string' ? prefix.trim().length > 0 : Boolean(prefix);\n const hasSuffix = typeof suffix === 'string' ? suffix.trim().length > 0 : Boolean(suffix);\n const hasLeadingIcon = Boolean(prependIconClass);\n const hasLeadingAdornment = hasLeadingIcon || hasPrefix;\n const hasTrailingAdornment = hasSuffix;\n const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;\n const leftPaddingClass =\n hasPrefix\n ? sizeConfig.paddingLeftLeadingDouble\n : hasLeadingAdornment\n ? sizeConfig.paddingLeftLeading\n : sizeConfig.paddingLeft;\n const rightPaddingClass = hasTrailingAdornment\n ? sizeConfig.paddingRightTrailing\n : sizeConfig.paddingRight;\n const sizeClass = [sizeConfig.paddingY, leftPaddingClass, rightPaddingClass, sizeConfig.text].join(' ');\n\n // useId keeps SSR/CSR ids consistent while still providing a fallback name\n const inputName = inputProps.name || reactId;\n\n // Ensure placeholder is present when label exists so :placeholder-shown works.\n // Label stays primary; placeholder only appears on focus when the field is empty.\n const basePlaceholder = placeholder ?? (hasLabel ? ' ' : undefined);\n const placeholderValue = hidePlaceholderUntilFocus\n ? isFocused\n ? placeholder\n : ' '\n : basePlaceholder;\n const placeholderClass = hidePlaceholderUntilFocus\n ? 'placeholder-transparent focus:placeholder-gray-500 focus:dark:placeholder-gray-400'\n : undefined;\n\n // Label left offset depends on leading adornments\n const labelLeftClass = hasLeadingAdornment ? 'left-10' : 'left-3';\n const labelFocusLeftClass = hasLeadingAdornment ? 'peer-focus:left-10' : 'peer-focus:left-3';\n\n const renderPrefix = hasPrefix\n ? typeof prefix === 'string'\n ? (\n <span className={twMerge('text-gray-500 dark:text-gray-400', sizeConfig.text)}>\n {prefix}\n </span>\n )\n : (\n prefix\n )\n : null;\n const renderSuffix = hasSuffix\n ? typeof suffix === 'string'\n ? (\n <span className={twMerge('text-gray-500 dark:text-gray-400', sizeConfig.text)}>\n {suffix}\n </span>\n )\n : (\n suffix\n )\n : null;\n\n // Background for floated label — keep transparent for outline/text/underlined variants\n const labelBgDefault = ['outline', 'text', 'underlined'].includes(variant)\n ? 'bg-transparent'\n : 'bg-white/90 dark:bg-slate-900';\n\n const handleFocus: React.FocusEventHandler<HTMLInputElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(true);\n onFocus?.(event);\n };\n\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(false);\n onBlur?.(event);\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative flex items-center'>\n {hasLeadingAdornment && (\n <span className='absolute left-3 inset-y-0 flex items-center gap-2'>\n {prependIconClass && (\n <i\n className={twMerge(\n 'text-gray-500 dark:text-gray-400',\n (status?.tone && statusMessageClasses[status?.tone]) || '',\n prependIconClass\n )}\n aria-hidden\n />\n )}\n {renderPrefix}\n </span>\n )}\n\n {/* input is peer so label can react with peer-* utilities */}\n <input\n {...inputProps}\n ref={ref}\n id={inputName}\n name={inputName}\n placeholder={placeholderValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className={twMerge(\n 'peer',\n classBase,\n variantClass,\n toneClass,\n sizeClass,\n placeholderClass,\n className\n )}\n />\n\n {label && (\n <label\n htmlFor={inputName}\n className={twMerge(\n 'absolute transition-all duration-150 pointer-events-none text-gray-700 rounded dark:text-gray-200',\n labelLeftClass,\n // Floated state: center label's vertical middle on the top border line\n '-top-1.5 -translate-y-2/3 text-xs px-1',\n labelBgDefault,\n // focus state mirrors floated state (keeps center on border)\n labelFocusLeftClass,\n 'peer-focus:top-0 peer-focus:-translate-y-1/2 peer-focus:text-xs peer-focus:px-1 peer-focus:bg-white peer-focus:text-gray-600 dark:peer-focus:bg-slate-900 dark:peer-focus:text-gray-300',\n // when input is empty (placeholder shown) -> center label inside input\n 'peer-placeholder-shown:top-1/2 peer-placeholder-shown:-translate-y-1/2 peer-placeholder-shown:text-sm peer-placeholder-shown:bg-transparent peer-placeholder-shown:text-gray-500 dark:peer-placeholder-shown:text-gray-400'\n )}\n >\n {label}\n </label>\n )}\n\n {hasTrailingAdornment && (\n <span className='absolute right-3 inset-y-0 flex items-center'>\n {renderSuffix}\n </span>\n )}\n\n {/* {appendIconClass && (\n <i className={twMerge('pointer-events-none absolute right-3 text-gray-500', appendIconClass)} aria-hidden />\n )} */}\n </div>\n {status?.message && (\n <span className={twMerge('text-sm', statusMessageClasses[status.tone])}>\n {status.message}\n </span>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n"]}
|
package/dist/input.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { I as InputStatusProps, a as InputVariant, b as InputSize, c as InputIcon } from './types-
|
|
1
|
+
import { I as InputStatusProps, a as InputVariant, b as InputSize, c as InputIcon } from './types-CJ0zqPXF.cjs';
|
|
2
2
|
import react__default from 'react';
|
|
3
|
-
import './global.types-
|
|
3
|
+
import './global.types-gx9A7mUe.cjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Text input with multiple visual variants and inline status or icon adornments.
|
|
@@ -12,6 +12,8 @@ declare const Input: react__default.ForwardRefExoticComponent<Omit<react__defaul
|
|
|
12
12
|
icon?: InputIcon;
|
|
13
13
|
wrapperClassName?: string;
|
|
14
14
|
label?: react__default.ReactNode;
|
|
15
|
+
prefix?: react__default.ReactNode;
|
|
16
|
+
suffix?: react__default.ReactNode;
|
|
15
17
|
} & react__default.RefAttributes<HTMLInputElement>>;
|
|
16
18
|
|
|
17
19
|
export { Input as default };
|
package/dist/input.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { I as InputStatusProps, a as InputVariant, b as InputSize, c as InputIcon } from './types-
|
|
1
|
+
import { I as InputStatusProps, a as InputVariant, b as InputSize, c as InputIcon } from './types-DaTHYIPO.js';
|
|
2
2
|
import react__default from 'react';
|
|
3
|
-
import './global.types-
|
|
3
|
+
import './global.types-gx9A7mUe.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Text input with multiple visual variants and inline status or icon adornments.
|
|
@@ -12,6 +12,8 @@ declare const Input: react__default.ForwardRefExoticComponent<Omit<react__defaul
|
|
|
12
12
|
icon?: InputIcon;
|
|
13
13
|
wrapperClassName?: string;
|
|
14
14
|
label?: react__default.ReactNode;
|
|
15
|
+
prefix?: react__default.ReactNode;
|
|
16
|
+
suffix?: react__default.ReactNode;
|
|
15
17
|
} & react__default.RefAttributes<HTMLInputElement>>;
|
|
16
18
|
|
|
17
19
|
export { Input as default };
|
package/dist/input.js
CHANGED
package/dist/list/item.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
import '../global.types-
|
|
3
|
-
export { L as ListDensity, b as ListItemProps, c as ListLines, a as default } from '../index-
|
|
2
|
+
import '../global.types-gx9A7mUe.cjs';
|
|
3
|
+
export { L as ListDensity, b as ListItemProps, c as ListLines, a as default } from '../index-BDrBOeFI.cjs';
|
package/dist/list/item.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
import '../global.types-
|
|
3
|
-
export { L as ListDensity, b as ListItemProps, c as ListLines, a as default } from '../index-
|
|
2
|
+
import '../global.types-gx9A7mUe.js';
|
|
3
|
+
export { L as ListDensity, b as ListItemProps, c as ListLines, a as default } from '../index-CNwl6vmH.js';
|
package/dist/list.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { e as ListVariant, L as ListDensity, c as ListLines, d as ListRounded, a as ListItem } from './index-
|
|
4
|
-
export { b as ListItemProps } from './index-
|
|
2
|
+
import { a as Palette } from './global.types-gx9A7mUe.cjs';
|
|
3
|
+
import { e as ListVariant, L as ListDensity, c as ListLines, d as ListRounded, a as ListItem } from './index-BDrBOeFI.cjs';
|
|
4
|
+
export { b as ListItemProps } from './index-BDrBOeFI.cjs';
|
|
5
5
|
|
|
6
6
|
interface ListProps extends react.HTMLAttributes<HTMLDivElement> {
|
|
7
7
|
variant?: ListVariant;
|
package/dist/list.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { e as ListVariant, L as ListDensity, c as ListLines, d as ListRounded, a as ListItem } from './index-
|
|
4
|
-
export { b as ListItemProps } from './index-
|
|
2
|
+
import { a as Palette } from './global.types-gx9A7mUe.js';
|
|
3
|
+
import { e as ListVariant, L as ListDensity, c as ListLines, d as ListRounded, a as ListItem } from './index-CNwl6vmH.js';
|
|
4
|
+
export { b as ListItemProps } from './index-CNwl6vmH.js';
|
|
5
5
|
|
|
6
6
|
interface ListProps extends react.HTMLAttributes<HTMLDivElement> {
|
|
7
7
|
variant?: ListVariant;
|
package/dist/notification.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { P as PropIcon, b as GlobalVariant } from './global.types-gx9A7mUe.cjs';
|
|
3
3
|
|
|
4
4
|
type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
|
|
5
5
|
type NotificationType = 'info' | 'success' | 'warning' | 'error';
|
package/dist/notification.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { P as PropIcon, b as GlobalVariant } from './global.types-gx9A7mUe.js';
|
|
3
3
|
|
|
4
4
|
type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
|
|
5
5
|
type NotificationType = 'info' | 'success' | 'warning' | 'error';
|
package/dist/profileCard.d.cts
CHANGED
package/dist/profileCard.d.ts
CHANGED
package/dist/select.cjs
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var React = require('react');
|
|
3
4
|
var tailwindMerge = require('tailwind-merge');
|
|
4
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
5
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
10
|
+
|
|
6
11
|
// src/Form/Select/index.tsx
|
|
7
12
|
|
|
8
13
|
// src/globals.ts
|
|
@@ -73,7 +78,7 @@ var resolveIconClassName = (icon) => {
|
|
|
73
78
|
const classes = [...baseClasses, normalizedName];
|
|
74
79
|
return Array.from(new Set(classes)).join(" ");
|
|
75
80
|
};
|
|
76
|
-
var Select = ({
|
|
81
|
+
var Select = React__default.default.forwardRef(({
|
|
77
82
|
options,
|
|
78
83
|
label,
|
|
79
84
|
placeholder,
|
|
@@ -91,9 +96,11 @@ var Select = ({
|
|
|
91
96
|
disabled,
|
|
92
97
|
required,
|
|
93
98
|
onChange,
|
|
99
|
+
onBlur,
|
|
94
100
|
...props
|
|
95
|
-
}) => {
|
|
101
|
+
}, ref) => {
|
|
96
102
|
const selectId = id || name || generateString();
|
|
103
|
+
const inputName = name || selectId;
|
|
97
104
|
const variantClass = variantClasses[variant] ?? variantClasses.outline;
|
|
98
105
|
const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;
|
|
99
106
|
const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;
|
|
@@ -151,12 +158,14 @@ var Select = ({
|
|
|
151
158
|
{
|
|
152
159
|
type: multiple ? "checkbox" : "radio",
|
|
153
160
|
id: inputId,
|
|
154
|
-
name:
|
|
161
|
+
name: inputName,
|
|
155
162
|
value: option.value,
|
|
156
163
|
disabled: option.disabled || disabled,
|
|
157
164
|
checked: value !== void 0 ? isSelected : void 0,
|
|
158
165
|
defaultChecked: defaultValue !== void 0 ? isDefaultSelected : void 0,
|
|
159
166
|
onChange: handleOptionChange,
|
|
167
|
+
onBlur,
|
|
168
|
+
ref,
|
|
160
169
|
required: required && !multiple,
|
|
161
170
|
className: "peer sr-only"
|
|
162
171
|
}
|
|
@@ -180,7 +189,8 @@ var Select = ({
|
|
|
180
189
|
] }),
|
|
181
190
|
helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: tailwindMerge.twMerge("mt-1 text-xs text-gray-500", error && "text-red-500"), children: helperText })
|
|
182
191
|
] });
|
|
183
|
-
};
|
|
192
|
+
});
|
|
193
|
+
Select.displayName = "Select";
|
|
184
194
|
var Select_default = Select;
|
|
185
195
|
|
|
186
196
|
module.exports = Select_default;
|
package/dist/select.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/globals.ts","../src/utils/helpers/randomStr.ts","../src/Form/Select/index.tsx"],"names":["normalizedName","twMerge","jsxs","jsx"],"mappings":"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","file":"select.cjs","sourcesContent":["export const iconBaseClasses = {\n mdi: ['mdi']\n} as const;\n","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 { iconBaseClasses } from '@lindle/linoardo/globals';\nimport type { GlobalSize, PropIcon } from '@lindle/linoardo/global.types';\nimport type { InputVariant } from '../Input/types';\nimport { generateString } from '../../utils/helpers/randomStr';\n\nexport interface SelectOptionObject {\n value: string | number;\n label: string;\n disabled?: boolean;\n icon?: PropIcon;\n}\n\nexport type SelectOption = SelectOptionObject | string;\n\nexport interface SelectProps extends Omit<React.DetailsHTMLAttributes<HTMLDetailsElement>, 'onChange' | 'value' | 'defaultValue'> {\n options: SelectOption[];\n label?: string;\n placeholder?: string;\n variant?: InputVariant;\n size?: GlobalSize;\n wrapperClassName?: string;\n error?: boolean;\n helperText?: string;\n value?: string | number | readonly string[];\n defaultValue?: string | number | readonly string[];\n name?: string;\n multiple?: boolean;\n disabled?: boolean;\n required?: boolean;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\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 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400';\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\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 dark:border-b-gray-600 dark:focus-visible:border-primary/70',\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 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\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 dark:border-b-gray-300 dark:focus-visible:border-primary/70',\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 dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\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 return option;\n};\n\nconst toIdSafe = (value: string) => {\n const sanitized = value.replace(/\\s+/g, '-').replace(/[^A-Za-z0-9_-]/g, '');\n return sanitized || 'opt';\n};\n\nconst resolveIconClassName = (icon?: PropIcon) => {\n if (!icon) {\n return undefined;\n }\n\n if (typeof icon === 'string') {\n const trimmed = icon.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes(' ')) {\n return trimmed;\n }\n\n const normalizedName = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalizedName].join(' ');\n }\n\n const [library, iconNameRaw] = icon;\n const baseClasses = iconBaseClasses[library] ?? [library];\n const iconName = iconNameRaw.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n\n const normalizedName = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n const classes = [...baseClasses, normalizedName];\n return Array.from(new Set(classes)).join(' ');\n};\n\n/**\n * Custom styled Select component using <details> and radio/checkbox inputs.\n * Supports icons and custom styling while remaining a Server Component (no hooks).\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 value,\n defaultValue,\n error,\n helperText,\n disabled,\n required,\n onChange,\n ...props\n}) => {\n const selectId = id || name || generateString();\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 selectedValueList =\n value !== undefined\n ? (Array.isArray(value) ? value : [value]).map(String)\n : defaultValue !== undefined\n ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]).map(String)\n : [];\n const selectedLabels = normalizedOptions\n .filter(option => selectedValueList.includes(String(option.value)))\n .map(option => option.label);\n const hasSelection = selectedLabels.length > 0;\n const summaryText = hasSelection\n ? multiple\n ? selectedLabels.join(', ')\n : selectedLabels[0]\n : placeholder || '\\u00A0';\n const handleOptionChange: React.ChangeEventHandler<HTMLInputElement> = event => {\n onChange?.(event);\n if (multiple) return;\n const detailsEl = event.currentTarget.closest('details');\n detailsEl?.removeAttribute('open');\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative'>\n <details className='group w-full' {...props} open={undefined}>\n <summary\n className={twMerge(\n baseClass,\n variantClass,\n sizeClass,\n 'list-none cursor-pointer flex items-center justify-between pr-10 relative [&::-webkit-details-marker]:hidden',\n error && 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500',\n disabled && 'pointer-events-none opacity-50 cursor-not-allowed',\n className\n )}\n style={{ minHeight: '2.75rem' }}\n onClick={e => disabled && e.preventDefault()}\n >\n <span className={twMerge('truncate', !hasSelection && 'text-gray-500 dark:text-gray-400')}>{summaryText}</span>\n <span className='pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300'>\n <i className='mdi mdi-chevron-down text-base leading-none transition-transform duration-200 group-open:rotate-180' aria-hidden />\n </span>\n </summary>\n\n <div className='absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-slate-800 dark:border-slate-700'>\n {normalizedOptions.map((option, index) => {\n const optionValueStr = String(option.value);\n const isSelected = Array.isArray(value) ? value.map(String).includes(optionValueStr) : String(value) === optionValueStr;\n const isDefaultSelected = Array.isArray(defaultValue)\n ? defaultValue.map(String).includes(optionValueStr)\n : String(defaultValue) === optionValueStr;\n const iconClassName = resolveIconClassName(option.icon);\n const inputId = `${selectId}-${toIdSafe(optionValueStr)}-${index}`;\n\n return (\n <label\n key={`${optionValueStr}-${index}`}\n htmlFor={inputId}\n className={twMerge(\n 'relative flex cursor-pointer select-none items-center gap-2 px-4 py-2 text-sm text-gray-900 hover:bg-gray-50 dark:text-gray-100 dark:hover:bg-slate-700',\n option.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <input\n type={multiple ? 'checkbox' : 'radio'}\n id={inputId}\n name={name || selectId}\n value={option.value}\n disabled={option.disabled || disabled}\n checked={value !== undefined ? isSelected : undefined}\n defaultChecked={defaultValue !== undefined ? isDefaultSelected : undefined}\n onChange={handleOptionChange}\n required={required && !multiple}\n className='peer sr-only'\n />\n {iconClassName && <i className={twMerge(iconClassName, 'text-lg text-gray-500 peer-checked:text-primary dark:text-gray-400')} />}\n <span className='flex-1 truncate peer-checked:font-medium peer-checked:text-primary'>{option.label}</span>\n <i className='mdi mdi-check invisible ml-auto text-primary peer-checked:visible' />\n </label>\n );\n })}\n </div>\n </details>\n\n {label && (\n <label\n className={twMerge('absolute left-3 -top-1.5 text-xs bg-white px-1 text-gray-500 transition-all dark:bg-slate-900 dark:text-gray-400')}\n >\n {label}\n </label>\n )}\n </div>\n {helperText && <p className={twMerge('mt-1 text-xs text-gray-500', error && 'text-red-500')}>{helperText}</p>}\n </div>\n );\n};\n\nexport default Select;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/globals.ts","../src/utils/helpers/randomStr.ts","../src/Form/Select/index.tsx"],"names":["normalizedName","React","twMerge","jsxs","jsx"],"mappings":"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","file":"select.cjs","sourcesContent":["export const iconBaseClasses = {\n mdi: ['mdi']\n} as const;\n","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 { iconBaseClasses } from '@lindle/linoardo/globals';\nimport type { GlobalSize, PropIcon } from '@lindle/linoardo/global.types';\nimport type { InputVariant } from '../Input/types';\nimport { generateString } from '../../utils/helpers/randomStr';\n\nexport interface SelectOptionObject {\n value: string | number;\n label: string;\n disabled?: boolean;\n icon?: PropIcon;\n}\n\nexport type SelectOption = SelectOptionObject | string;\n\nexport interface SelectProps\n extends Omit<React.DetailsHTMLAttributes<HTMLDetailsElement>, 'onBlur' | 'onChange' | 'value' | 'defaultValue'> {\n options: SelectOption[];\n label?: string;\n placeholder?: string;\n variant?: InputVariant;\n size?: GlobalSize;\n wrapperClassName?: string;\n error?: boolean;\n helperText?: string;\n value?: string | number | readonly string[];\n defaultValue?: string | number | readonly string[];\n name?: string;\n multiple?: boolean;\n disabled?: boolean;\n required?: boolean;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n}\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 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400';\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\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 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\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 dark:border-b-gray-600 dark:focus-visible:border-primary/70',\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 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\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 dark:border-b-gray-300 dark:focus-visible:border-primary/70',\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 dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\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 return option;\n};\n\nconst toIdSafe = (value: string) => {\n const sanitized = value.replace(/\\s+/g, '-').replace(/[^A-Za-z0-9_-]/g, '');\n return sanitized || 'opt';\n};\n\nconst resolveIconClassName = (icon?: PropIcon) => {\n if (!icon) {\n return undefined;\n }\n\n if (typeof icon === 'string') {\n const trimmed = icon.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (trimmed.includes(' ')) {\n return trimmed;\n }\n\n const normalizedName = trimmed.startsWith('mdi-') ? trimmed : `mdi-${trimmed}`;\n return ['mdi', normalizedName].join(' ');\n }\n\n const [library, iconNameRaw] = icon;\n const baseClasses = iconBaseClasses[library] ?? [library];\n const iconName = iconNameRaw.trim();\n if (!iconName) {\n return baseClasses.join(' ');\n }\n\n const normalizedName = iconName.startsWith('mdi-') ? iconName : `mdi-${iconName}`;\n const classes = [...baseClasses, normalizedName];\n return Array.from(new Set(classes)).join(' ');\n};\n\n/**\n * Custom styled Select component using <details> and radio/checkbox inputs.\n * Supports icons and custom styling while remaining a Server Component (no hooks).\n */\nconst Select = React.forwardRef<HTMLInputElement, SelectProps>(({\n options,\n label,\n placeholder,\n variant = 'outline',\n size = 'medium',\n className,\n wrapperClassName,\n id,\n name,\n multiple,\n value,\n defaultValue,\n error,\n helperText,\n disabled,\n required,\n onChange,\n onBlur,\n ...props\n}, ref) => {\n const selectId = id || name || generateString();\n const inputName = 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 selectedValueList =\n value !== undefined\n ? (Array.isArray(value) ? value : [value]).map(String)\n : defaultValue !== undefined\n ? (Array.isArray(defaultValue) ? defaultValue : [defaultValue]).map(String)\n : [];\n const selectedLabels = normalizedOptions\n .filter(option => selectedValueList.includes(String(option.value)))\n .map(option => option.label);\n const hasSelection = selectedLabels.length > 0;\n const summaryText = hasSelection\n ? multiple\n ? selectedLabels.join(', ')\n : selectedLabels[0]\n : placeholder || '\\u00A0';\n const handleOptionChange: React.ChangeEventHandler<HTMLInputElement> = event => {\n onChange?.(event);\n if (multiple) return;\n const detailsEl = event.currentTarget.closest('details');\n detailsEl?.removeAttribute('open');\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative'>\n <details className='group w-full' {...props} open={undefined}>\n <summary\n className={twMerge(\n baseClass,\n variantClass,\n sizeClass,\n 'list-none cursor-pointer flex items-center justify-between pr-10 relative [&::-webkit-details-marker]:hidden',\n error && 'border-red-500 focus-visible:border-red-500 focus-visible:ring-red-500',\n disabled && 'pointer-events-none opacity-50 cursor-not-allowed',\n className\n )}\n style={{ minHeight: '2.75rem' }}\n onClick={e => disabled && e.preventDefault()}\n >\n <span className={twMerge('truncate', !hasSelection && 'text-gray-500 dark:text-gray-400')}>{summaryText}</span>\n <span className='pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300'>\n <i className='mdi mdi-chevron-down text-base leading-none transition-transform duration-200 group-open:rotate-180' aria-hidden />\n </span>\n </summary>\n\n <div className='absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-slate-800 dark:border-slate-700'>\n {normalizedOptions.map((option, index) => {\n const optionValueStr = String(option.value);\n const isSelected = Array.isArray(value) ? value.map(String).includes(optionValueStr) : String(value) === optionValueStr;\n const isDefaultSelected = Array.isArray(defaultValue)\n ? defaultValue.map(String).includes(optionValueStr)\n : String(defaultValue) === optionValueStr;\n const iconClassName = resolveIconClassName(option.icon);\n const inputId = `${selectId}-${toIdSafe(optionValueStr)}-${index}`;\n\n return (\n <label\n key={`${optionValueStr}-${index}`}\n htmlFor={inputId}\n className={twMerge(\n 'relative flex cursor-pointer select-none items-center gap-2 px-4 py-2 text-sm text-gray-900 hover:bg-gray-50 dark:text-gray-100 dark:hover:bg-slate-700',\n option.disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n <input\n type={multiple ? 'checkbox' : 'radio'}\n id={inputId}\n name={inputName}\n value={option.value}\n disabled={option.disabled || disabled}\n checked={value !== undefined ? isSelected : undefined}\n defaultChecked={defaultValue !== undefined ? isDefaultSelected : undefined}\n onChange={handleOptionChange}\n onBlur={onBlur}\n ref={ref}\n required={required && !multiple}\n className='peer sr-only'\n />\n {iconClassName && <i className={twMerge(iconClassName, 'text-lg text-gray-500 peer-checked:text-primary dark:text-gray-400')} />}\n <span className='flex-1 truncate peer-checked:font-medium peer-checked:text-primary'>{option.label}</span>\n <i className='mdi mdi-check invisible ml-auto text-primary peer-checked:visible' />\n </label>\n );\n })}\n </div>\n </details>\n\n {label && (\n <label\n className={twMerge('absolute left-3 -top-1.5 text-xs bg-white px-1 text-gray-500 transition-all dark:bg-slate-900 dark:text-gray-400')}\n >\n {label}\n </label>\n )}\n </div>\n {helperText && <p className={twMerge('mt-1 text-xs text-gray-500', error && 'text-red-500')}>{helperText}</p>}\n </div>\n );\n});\n\nSelect.displayName = 'Select';\n\nexport default Select;\n"]}
|