@proyecto-viviana/ui 0.3.1 → 0.3.3
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/components.css +1077 -1077
- package/dist/index.js +236 -249
- package/dist/index.js.map +3 -3
- package/dist/index.ssr.js +78 -81
- package/dist/index.ssr.js.map +3 -3
- package/dist/radio/index.d.ts +12 -27
- package/dist/radio/index.d.ts.map +1 -1
- package/dist/test-utils/index.d.ts +2 -2
- package/dist/test-utils/index.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/alert/index.tsx +48 -0
- package/src/assets/favicon.png +0 -0
- package/src/assets/fire.gif +0 -0
- package/src/autocomplete/index.tsx +313 -0
- package/src/avatar/index.tsx +75 -0
- package/src/badge/index.tsx +43 -0
- package/src/breadcrumbs/index.tsx +207 -0
- package/src/button/Button.tsx +74 -0
- package/src/button/index.ts +2 -0
- package/src/button/types.ts +24 -0
- package/src/calendar/DateField.tsx +200 -0
- package/src/calendar/DatePicker.tsx +298 -0
- package/src/calendar/RangeCalendar.tsx +236 -0
- package/src/calendar/TimeField.tsx +196 -0
- package/src/calendar/index.tsx +223 -0
- package/src/checkbox/index.tsx +257 -0
- package/src/color/index.tsx +687 -0
- package/src/combobox/index.tsx +383 -0
- package/src/components.css +1077 -0
- package/src/custom/calendar-card/index.tsx +66 -0
- package/src/custom/chip/index.tsx +46 -0
- package/src/custom/conversation/index.tsx +105 -0
- package/src/custom/event-card/index.tsx +132 -0
- package/src/custom/header/index.tsx +33 -0
- package/src/custom/lateral-nav/index.tsx +88 -0
- package/src/custom/logo/index.tsx +58 -0
- package/src/custom/nav-header/index.tsx +42 -0
- package/src/custom/page-layout/index.tsx +29 -0
- package/src/custom/profile-card/index.tsx +64 -0
- package/src/custom/project-card/index.tsx +59 -0
- package/src/custom/timeline-item/index.tsx +105 -0
- package/src/dialog/Dialog.tsx +260 -0
- package/src/dialog/index.tsx +3 -0
- package/src/disclosure/index.tsx +307 -0
- package/src/gridlist/index.tsx +403 -0
- package/src/icon/icons/GitHubIcon.tsx +20 -0
- package/src/icon/index.tsx +48 -0
- package/src/index.ts +322 -0
- package/src/landmark/index.tsx +231 -0
- package/src/link/index.tsx +130 -0
- package/src/listbox/index.tsx +231 -0
- package/src/menu/index.tsx +297 -0
- package/src/meter/index.tsx +163 -0
- package/src/numberfield/index.tsx +482 -0
- package/src/popover/index.tsx +260 -0
- package/src/progress-bar/index.tsx +169 -0
- package/src/radio/index.tsx +173 -0
- package/src/searchfield/index.tsx +453 -0
- package/src/select/index.tsx +349 -0
- package/src/separator/index.tsx +141 -0
- package/src/slider/index.tsx +382 -0
- package/src/styles.css +450 -0
- package/src/switch/ToggleSwitch.tsx +112 -0
- package/src/switch/index.tsx +90 -0
- package/src/table/index.tsx +531 -0
- package/src/tabs/index.tsx +273 -0
- package/src/tag-group/index.tsx +240 -0
- package/src/test-utils/index.ts +40 -0
- package/src/textfield/index.tsx +211 -0
- package/src/theme.css +101 -0
- package/src/toast/index.tsx +324 -0
- package/src/toolbar/index.tsx +108 -0
- package/src/tooltip/index.tsx +197 -0
- package/src/tree/index.tsx +494 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toolbar component for proyecto-viviana-ui
|
|
3
|
+
*
|
|
4
|
+
* Styled toolbar component built on top of solidaria-components Toolbar.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type JSX, splitProps, createMemo } from 'solid-js'
|
|
8
|
+
import {
|
|
9
|
+
Toolbar as HeadlessToolbar,
|
|
10
|
+
type ToolbarProps as HeadlessToolbarProps,
|
|
11
|
+
type ToolbarRenderProps,
|
|
12
|
+
} from '@proyecto-viviana/solidaria-components'
|
|
13
|
+
|
|
14
|
+
// ============================================
|
|
15
|
+
// TYPES
|
|
16
|
+
// ============================================
|
|
17
|
+
|
|
18
|
+
export type ToolbarSize = 'sm' | 'md' | 'lg'
|
|
19
|
+
export type ToolbarVariant = 'default' | 'bordered' | 'ghost'
|
|
20
|
+
|
|
21
|
+
export interface ToolbarProps extends Omit<HeadlessToolbarProps, 'class' | 'style'> {
|
|
22
|
+
/** The visual variant of the toolbar. @default 'default' */
|
|
23
|
+
variant?: ToolbarVariant
|
|
24
|
+
/** The size of the toolbar. @default 'md' */
|
|
25
|
+
size?: ToolbarSize
|
|
26
|
+
/** Additional CSS class name. */
|
|
27
|
+
class?: string
|
|
28
|
+
/** Inline styles. */
|
|
29
|
+
style?: JSX.CSSProperties
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ============================================
|
|
33
|
+
// STYLES
|
|
34
|
+
// ============================================
|
|
35
|
+
|
|
36
|
+
const baseStyles = 'vui-toolbar inline-flex items-center'
|
|
37
|
+
|
|
38
|
+
const variantStyles: Record<ToolbarVariant, string> = {
|
|
39
|
+
default: 'bg-bg-50 rounded-md',
|
|
40
|
+
bordered: 'border border-bg-200 rounded-md',
|
|
41
|
+
ghost: '',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const sizeStyles: Record<ToolbarSize, string> = {
|
|
45
|
+
sm: 'gap-1 p-1',
|
|
46
|
+
md: 'gap-2 p-2',
|
|
47
|
+
lg: 'gap-3 p-3',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const orientationStyles = {
|
|
51
|
+
horizontal: 'flex-row',
|
|
52
|
+
vertical: 'flex-col',
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ============================================
|
|
56
|
+
// TOOLBAR COMPONENT
|
|
57
|
+
// ============================================
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A styled toolbar for grouping interactive controls with keyboard navigation.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```tsx
|
|
64
|
+
* <Toolbar aria-label="Text formatting">
|
|
65
|
+
* <Button>Bold</Button>
|
|
66
|
+
* <Button>Italic</Button>
|
|
67
|
+
* <Separator orientation="vertical" />
|
|
68
|
+
* <Button>Align Left</Button>
|
|
69
|
+
* <Button>Align Center</Button>
|
|
70
|
+
* </Toolbar>
|
|
71
|
+
*
|
|
72
|
+
* // Vertical toolbar
|
|
73
|
+
* <Toolbar orientation="vertical" variant="bordered">
|
|
74
|
+
* <Button>Cut</Button>
|
|
75
|
+
* <Button>Copy</Button>
|
|
76
|
+
* <Button>Paste</Button>
|
|
77
|
+
* </Toolbar>
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export function Toolbar(props: ToolbarProps): JSX.Element {
|
|
81
|
+
const [local, headlessProps] = splitProps(props, [
|
|
82
|
+
'variant',
|
|
83
|
+
'size',
|
|
84
|
+
'class',
|
|
85
|
+
'style',
|
|
86
|
+
])
|
|
87
|
+
|
|
88
|
+
const variant = () => local.variant ?? 'default'
|
|
89
|
+
const size = () => local.size ?? 'md'
|
|
90
|
+
|
|
91
|
+
const getClassName = (renderProps: ToolbarRenderProps): string => {
|
|
92
|
+
return [
|
|
93
|
+
baseStyles,
|
|
94
|
+
variantStyles[variant()],
|
|
95
|
+
sizeStyles[size()],
|
|
96
|
+
orientationStyles[renderProps.orientation],
|
|
97
|
+
local.class ?? '',
|
|
98
|
+
].filter(Boolean).join(' ')
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<HeadlessToolbar
|
|
103
|
+
{...headlessProps}
|
|
104
|
+
class={getClassName}
|
|
105
|
+
style={local.style}
|
|
106
|
+
/>
|
|
107
|
+
)
|
|
108
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip component for proyecto-viviana-ui
|
|
3
|
+
*
|
|
4
|
+
* A tooltip displays a description of an element on hover or focus.
|
|
5
|
+
* Built on top of solidaria-components for accessibility.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { type JSX, Show, splitProps } from 'solid-js'
|
|
9
|
+
import {
|
|
10
|
+
Tooltip as HeadlessTooltip,
|
|
11
|
+
TooltipTrigger as HeadlessTooltipTrigger,
|
|
12
|
+
type TooltipProps as HeadlessTooltipProps,
|
|
13
|
+
type TooltipTriggerComponentProps as HeadlessTooltipTriggerProps,
|
|
14
|
+
type TooltipRenderProps,
|
|
15
|
+
} from '@proyecto-viviana/solidaria-components'
|
|
16
|
+
|
|
17
|
+
// ============================================
|
|
18
|
+
// TYPES
|
|
19
|
+
// ============================================
|
|
20
|
+
|
|
21
|
+
export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'
|
|
22
|
+
export type TooltipVariant = 'default' | 'neutral' | 'info'
|
|
23
|
+
|
|
24
|
+
export interface TooltipTriggerProps extends HeadlessTooltipTriggerProps {
|
|
25
|
+
/** The children of the tooltip trigger (trigger element and tooltip). */
|
|
26
|
+
children: JSX.Element
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface TooltipProps extends Omit<HeadlessTooltipProps, 'class' | 'style' | 'children'> {
|
|
30
|
+
/** The content of the tooltip. */
|
|
31
|
+
children: JSX.Element
|
|
32
|
+
/** The position of the tooltip relative to the trigger. */
|
|
33
|
+
placement?: TooltipPlacement
|
|
34
|
+
/** Visual variant of the tooltip. */
|
|
35
|
+
variant?: TooltipVariant
|
|
36
|
+
/** Additional CSS class name. */
|
|
37
|
+
class?: string
|
|
38
|
+
/** Whether to show an arrow pointing to the trigger. */
|
|
39
|
+
showArrow?: boolean
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ============================================
|
|
43
|
+
// STYLES
|
|
44
|
+
// ============================================
|
|
45
|
+
|
|
46
|
+
// Note: Position is now calculated by the headless layer (solidaria-components)
|
|
47
|
+
// so we don't need CSS positioning classes here
|
|
48
|
+
const baseStyles = [
|
|
49
|
+
'px-3 py-2 rounded-lg',
|
|
50
|
+
'text-sm font-medium',
|
|
51
|
+
'shadow-lg',
|
|
52
|
+
'pointer-events-auto',
|
|
53
|
+
'animate-in fade-in-0 zoom-in-95',
|
|
54
|
+
'data-[exiting]:animate-out data-[exiting]:fade-out-0 data-[exiting]:zoom-out-95',
|
|
55
|
+
].join(' ')
|
|
56
|
+
|
|
57
|
+
const variantStyles: Record<TooltipVariant, string> = {
|
|
58
|
+
default: 'bg-neutral-900 text-white dark:bg-neutral-100 dark:text-neutral-900',
|
|
59
|
+
neutral: 'bg-neutral-800 text-neutral-100 dark:bg-neutral-200 dark:text-neutral-900',
|
|
60
|
+
info: 'bg-blue-600 text-white dark:bg-blue-500',
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const arrowStyles: Record<TooltipPlacement, string> = {
|
|
64
|
+
top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-l-transparent border-r-transparent border-b-transparent',
|
|
65
|
+
bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-l-transparent border-r-transparent border-t-transparent',
|
|
66
|
+
left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-t-transparent border-b-transparent border-r-transparent',
|
|
67
|
+
right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-t-transparent border-b-transparent border-l-transparent',
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const getArrowBorderColor = (variant: TooltipVariant): string => {
|
|
71
|
+
const colors: Record<TooltipVariant, string> = {
|
|
72
|
+
default: 'border-neutral-900 dark:border-neutral-100',
|
|
73
|
+
neutral: 'border-neutral-800 dark:border-neutral-200',
|
|
74
|
+
info: 'border-blue-600 dark:border-blue-500',
|
|
75
|
+
}
|
|
76
|
+
return colors[variant]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ============================================
|
|
80
|
+
// COMPONENTS
|
|
81
|
+
// ============================================
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* TooltipTrigger wraps around a trigger element and a Tooltip.
|
|
85
|
+
* It handles opening and closing the Tooltip when the user hovers
|
|
86
|
+
* over or focuses the trigger.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* <TooltipTrigger>
|
|
91
|
+
* <Button>Hover me</Button>
|
|
92
|
+
* <Tooltip>This is helpful information</Tooltip>
|
|
93
|
+
* </TooltipTrigger>
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function TooltipTrigger(props: TooltipTriggerProps): JSX.Element {
|
|
97
|
+
return <HeadlessTooltipTrigger {...props} />
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Styled tooltip component that displays a description on hover or focus.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```tsx
|
|
105
|
+
* <TooltipTrigger>
|
|
106
|
+
* <Button>Save</Button>
|
|
107
|
+
* <Tooltip placement="top">Save your changes</Tooltip>
|
|
108
|
+
* </TooltipTrigger>
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export function Tooltip(props: TooltipProps): JSX.Element {
|
|
112
|
+
const [local, rest] = splitProps(props, [
|
|
113
|
+
'placement',
|
|
114
|
+
'variant',
|
|
115
|
+
'class',
|
|
116
|
+
'showArrow',
|
|
117
|
+
])
|
|
118
|
+
|
|
119
|
+
const placement = () => local.placement ?? 'top'
|
|
120
|
+
const variant = () => local.variant ?? 'default'
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<HeadlessTooltip
|
|
124
|
+
{...rest}
|
|
125
|
+
placement={placement()}
|
|
126
|
+
class={(_renderProps: TooltipRenderProps) => {
|
|
127
|
+
const classes = [
|
|
128
|
+
baseStyles,
|
|
129
|
+
variantStyles[variant()],
|
|
130
|
+
local.class ?? '',
|
|
131
|
+
].filter(Boolean).join(' ')
|
|
132
|
+
return classes
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
{(renderProps: TooltipRenderProps) => (
|
|
136
|
+
<>
|
|
137
|
+
{props.children}
|
|
138
|
+
<Show when={local.showArrow}>
|
|
139
|
+
<div
|
|
140
|
+
class={[
|
|
141
|
+
'absolute w-0 h-0 border-4',
|
|
142
|
+
arrowStyles[renderProps.placement ?? placement()],
|
|
143
|
+
getArrowBorderColor(variant()),
|
|
144
|
+
].join(' ')}
|
|
145
|
+
/>
|
|
146
|
+
</Show>
|
|
147
|
+
</>
|
|
148
|
+
)}
|
|
149
|
+
</HeadlessTooltip>
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ============================================
|
|
154
|
+
// SIMPLE CSS-ONLY TOOLTIP (Legacy)
|
|
155
|
+
// ============================================
|
|
156
|
+
|
|
157
|
+
export interface SimpleTooltipProps {
|
|
158
|
+
/** The content to show in the tooltip */
|
|
159
|
+
label: string
|
|
160
|
+
/** The trigger element */
|
|
161
|
+
children: JSX.Element
|
|
162
|
+
/** Position of the tooltip */
|
|
163
|
+
position?: 'top' | 'bottom'
|
|
164
|
+
/** Additional CSS class */
|
|
165
|
+
class?: string
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Simple CSS-only tooltip component.
|
|
170
|
+
* Uses CSS hover effect for performance. No JS state management.
|
|
171
|
+
*
|
|
172
|
+
* @deprecated Use the accessible Tooltip + TooltipTrigger components instead.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```tsx
|
|
176
|
+
* <SimpleTooltip label="Save your changes">
|
|
177
|
+
* <button>Save</button>
|
|
178
|
+
* </SimpleTooltip>
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export function SimpleTooltip(props: SimpleTooltipProps): JSX.Element {
|
|
182
|
+
const position = () => props.position ?? 'bottom'
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<div class={`vui-tooltip ${props.class ?? ''}`}>
|
|
186
|
+
<div class="vui-tooltip__trigger">
|
|
187
|
+
{props.children}
|
|
188
|
+
</div>
|
|
189
|
+
<div class={`vui-tooltip__content vui-tooltip__content--${position()}`}>
|
|
190
|
+
<span>{props.label}</span>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Re-export types
|
|
197
|
+
export type { TooltipRenderProps }
|