@proyecto-viviana/ui 0.3.5 → 0.4.0
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/LICENSE +21 -0
- package/README.md +80 -157
- package/dist/ActionButton.d.ts +2 -0
- package/dist/ActionButton.d.ts.map +1 -0
- package/dist/ActionButton.js +1 -0
- package/dist/ActionButton.jsx +1 -0
- package/dist/ActionMenu.d.ts +2 -0
- package/dist/ActionMenu.d.ts.map +1 -0
- package/dist/ActionMenu.js +1 -0
- package/dist/ActionMenu.jsx +1 -0
- package/dist/Breadcrumbs.d.ts +2 -0
- package/dist/Breadcrumbs.d.ts.map +1 -0
- package/dist/Breadcrumbs.js +1 -0
- package/dist/Breadcrumbs.jsx +1 -0
- package/dist/Button.d.ts +2 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Button.js +1 -0
- package/dist/Button.jsx +1 -0
- package/dist/Calendar.d.ts +2 -0
- package/dist/Calendar.d.ts.map +1 -0
- package/dist/Calendar.js +1 -0
- package/dist/Calendar.jsx +1 -0
- package/dist/CalendarCard.d.ts +2 -0
- package/dist/CalendarCard.d.ts.map +1 -0
- package/dist/CalendarCard.js +97 -0
- package/dist/CalendarCard.js.map +1 -0
- package/dist/CalendarCard.jsx +51 -0
- package/dist/CalendarCard.jsx.map +1 -0
- package/dist/Card.d.ts +2 -0
- package/dist/Card.d.ts.map +1 -0
- package/dist/Card.js +1 -0
- package/dist/Card.jsx +1 -0
- package/dist/CardView.d.ts +2 -0
- package/dist/CardView.d.ts.map +1 -0
- package/dist/CardView.js +1 -0
- package/dist/CardView.jsx +1 -0
- package/dist/CenterBaseline.d.ts +2 -0
- package/dist/CenterBaseline.d.ts.map +1 -0
- package/dist/CenterBaseline.js +1 -0
- package/dist/CenterBaseline.jsx +1 -0
- package/dist/Chip.d.ts +2 -0
- package/dist/Chip.d.ts.map +1 -0
- package/dist/Chip.js +2 -0
- package/dist/Chip.jsx +2 -0
- package/dist/ColorArea.d.ts +2 -0
- package/dist/ColorArea.d.ts.map +1 -0
- package/dist/ColorArea.js +1 -0
- package/dist/ColorArea.jsx +1 -0
- package/dist/ColorField.d.ts +2 -0
- package/dist/ColorField.d.ts.map +1 -0
- package/dist/ColorField.js +1 -0
- package/dist/ColorField.jsx +1 -0
- package/dist/ColorSlider.d.ts +2 -0
- package/dist/ColorSlider.d.ts.map +1 -0
- package/dist/ColorSlider.js +1 -0
- package/dist/ColorSlider.jsx +1 -0
- package/dist/ColorSwatch.d.ts +2 -0
- package/dist/ColorSwatch.d.ts.map +1 -0
- package/dist/ColorSwatch.js +1 -0
- package/dist/ColorSwatch.jsx +1 -0
- package/dist/ColorSwatchPicker.d.ts +2 -0
- package/dist/ColorSwatchPicker.d.ts.map +1 -0
- package/dist/ColorSwatchPicker.js +1 -0
- package/dist/ColorSwatchPicker.jsx +1 -0
- package/dist/ColorWheel.d.ts +2 -0
- package/dist/ColorWheel.d.ts.map +1 -0
- package/dist/ColorWheel.js +1 -0
- package/dist/ColorWheel.jsx +1 -0
- package/dist/ContrastIcon.d.ts +3 -0
- package/dist/ContrastIcon.d.ts.map +1 -0
- package/dist/ContrastIcon.js +3 -0
- package/dist/ContrastIcon.jsx +3 -0
- package/dist/Conversation.d.ts +2 -0
- package/dist/Conversation.d.ts.map +1 -0
- package/dist/Conversation.js +177 -0
- package/dist/Conversation.js.map +1 -0
- package/dist/Conversation.jsx +107 -0
- package/dist/Conversation.jsx.map +1 -0
- package/dist/Disclosure.d.ts +2 -0
- package/dist/Disclosure.d.ts.map +1 -0
- package/dist/Disclosure.js +1 -0
- package/dist/Disclosure.jsx +1 -0
- package/dist/EventCard.d.ts +2 -0
- package/dist/EventCard.d.ts.map +1 -0
- package/dist/EventCard.js +173 -0
- package/dist/EventCard.js.map +1 -0
- package/dist/EventCard.jsx +96 -0
- package/dist/EventCard.jsx.map +1 -0
- package/dist/FileTrigger.d.ts +2 -0
- package/dist/FileTrigger.d.ts.map +1 -0
- package/dist/FileTrigger.js +1 -0
- package/dist/FileTrigger.jsx +1 -0
- package/dist/GitHubIcon.d.ts +2 -0
- package/dist/GitHubIcon.d.ts.map +1 -0
- package/dist/GitHubIcon.js +1 -0
- package/dist/GitHubIcon.jsx +1 -0
- package/dist/LightenIcon.d.ts +3 -0
- package/dist/LightenIcon.d.ts.map +1 -0
- package/dist/LightenIcon.js +3 -0
- package/dist/LightenIcon.jsx +3 -0
- package/dist/LinkButton.d.ts +2 -0
- package/dist/LinkButton.d.ts.map +1 -0
- package/dist/LinkButton.js +1 -0
- package/dist/LinkButton.jsx +1 -0
- package/dist/ListView.d.ts +2 -0
- package/dist/ListView.d.ts.map +1 -0
- package/dist/ListView.js +1 -0
- package/dist/ListView.jsx +1 -0
- package/dist/Logo.d.ts +2 -0
- package/dist/Logo.d.ts.map +1 -0
- package/dist/Logo.js +116 -0
- package/dist/Logo.js.map +1 -0
- package/dist/Logo.jsx +101 -0
- package/dist/Logo.jsx.map +1 -0
- package/dist/Menu.d.ts +2 -0
- package/dist/Menu.d.ts.map +1 -0
- package/dist/Menu.js +1 -0
- package/dist/Menu.jsx +1 -0
- package/dist/PageLayout.d.ts +2 -0
- package/dist/PageLayout.d.ts.map +1 -0
- package/dist/PageLayout.js +31 -0
- package/dist/PageLayout.js.map +1 -0
- package/dist/PageLayout.jsx +23 -0
- package/dist/PageLayout.jsx.map +1 -0
- package/dist/Picker.d.ts +2 -0
- package/dist/Picker.d.ts.map +1 -0
- package/dist/Picker.js +1 -0
- package/dist/Picker.jsx +1 -0
- package/dist/ProfileCard.d.ts +2 -0
- package/dist/ProfileCard.d.ts.map +1 -0
- package/dist/ProfileCard.js +78 -0
- package/dist/ProfileCard.js.map +1 -0
- package/dist/ProfileCard.jsx +53 -0
- package/dist/ProfileCard.jsx.map +1 -0
- package/dist/ProjectCard.d.ts +2 -0
- package/dist/ProjectCard.d.ts.map +1 -0
- package/dist/ProjectCard.js +164 -0
- package/dist/ProjectCard.js.map +1 -0
- package/dist/ProjectCard.jsx +133 -0
- package/dist/ProjectCard.jsx.map +1 -0
- package/dist/Provider.d.ts +2 -0
- package/dist/Provider.d.ts.map +1 -0
- package/dist/Provider.js +1 -0
- package/dist/Provider.jsx +1 -0
- package/dist/RangeCalendar.d.ts +2 -0
- package/dist/RangeCalendar.d.ts.map +1 -0
- package/dist/RangeCalendar.js +1 -0
- package/dist/RangeCalendar.jsx +1 -0
- package/dist/SearchField.d.ts +2 -0
- package/dist/SearchField.d.ts.map +1 -0
- package/dist/SearchField.js +1 -0
- package/dist/SearchField.jsx +1 -0
- package/dist/SegmentedControl.d.ts +2 -0
- package/dist/SegmentedControl.d.ts.map +1 -0
- package/dist/SegmentedControl.js +1 -0
- package/dist/SegmentedControl.jsx +1 -0
- package/dist/Switch.d.ts +2 -0
- package/dist/Switch.d.ts.map +1 -0
- package/dist/Switch.js +1 -0
- package/dist/Switch.jsx +1 -0
- package/dist/Tabs.d.ts +2 -0
- package/dist/Tabs.d.ts.map +1 -0
- package/dist/Tabs.js +1 -0
- package/dist/Tabs.jsx +1 -0
- package/dist/TextArea.d.ts +2 -0
- package/dist/TextArea.d.ts.map +1 -0
- package/dist/TextArea.js +1 -0
- package/dist/TextArea.jsx +1 -0
- package/dist/TextField.d.ts +2 -0
- package/dist/TextField.d.ts.map +1 -0
- package/dist/TextField.js +1 -0
- package/dist/TextField.jsx +1 -0
- package/dist/TimelineItem.d.ts +2 -0
- package/dist/TimelineItem.d.ts.map +1 -0
- package/dist/TimelineItem.js +137 -0
- package/dist/TimelineItem.js.map +1 -0
- package/dist/TimelineItem.jsx +70 -0
- package/dist/TimelineItem.jsx.map +1 -0
- package/dist/TreeView.d.ts +2 -0
- package/dist/TreeView.d.ts.map +1 -0
- package/dist/TreeView.js +1 -0
- package/dist/TreeView.jsx +1 -0
- package/dist/chip2.js +82 -0
- package/dist/chip2.js.map +1 -0
- package/dist/chip2.jsx +68 -0
- package/dist/chip2.jsx.map +1 -0
- package/dist/components.css +2 -1077
- package/dist/custom/calendar-card/index.d.ts.map +1 -1
- package/dist/custom/chip/index.d.ts +2 -2
- package/dist/custom/chip/index.d.ts.map +1 -1
- package/dist/custom/conversation/index.d.ts +2 -2
- package/dist/custom/conversation/index.d.ts.map +1 -1
- package/dist/custom/event-card/index.d.ts +1 -1
- package/dist/custom/event-card/index.d.ts.map +1 -1
- package/dist/custom/header/index.d.ts +2 -6
- package/dist/custom/header/index.d.ts.map +1 -1
- package/dist/custom/lateral-nav/index.d.ts +1 -1
- package/dist/custom/lateral-nav/index.d.ts.map +1 -1
- package/dist/custom/logo/index.d.ts +1 -18
- package/dist/custom/logo/index.d.ts.map +1 -1
- package/dist/custom/nav-header/index.d.ts +2 -1
- package/dist/custom/nav-header/index.d.ts.map +1 -1
- package/dist/custom/page-layout/index.d.ts +1 -7
- package/dist/custom/page-layout/index.d.ts.map +1 -1
- package/dist/custom/profile-card/index.d.ts +1 -1
- package/dist/custom/profile-card/index.d.ts.map +1 -1
- package/dist/custom/project-card/index.d.ts +2 -13
- package/dist/custom/project-card/index.d.ts.map +1 -1
- package/dist/custom/timeline-item/index.d.ts +2 -2
- package/dist/custom/timeline-item/index.d.ts.map +1 -1
- package/dist/font-faces.css +1 -0
- package/dist/index.d.ts +1 -104
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8222
- package/dist/index.jsx +1 -0
- package/dist/style/runtime.d.ts +2 -0
- package/dist/style/runtime.d.ts.map +1 -0
- package/dist/style/runtime.js +1 -0
- package/dist/style/runtime.jsx +1 -0
- package/dist/style.d.ts +2 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +1 -0
- package/dist/style.jsx +1 -0
- package/dist/styles.css +9 -450
- package/dist/theme.css +2 -101
- package/dist/vite.d.ts +15 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +74 -0
- package/dist/vite.js.map +1 -0
- package/dist/vite.jsx +74 -0
- package/dist/vite.jsx.map +1 -0
- package/dist/viviana-tokens.css +318 -0
- package/package.json +300 -44
- package/src/ActionButton.ts +1 -0
- package/src/ActionMenu.ts +1 -0
- package/src/Breadcrumbs.ts +1 -0
- package/src/Button.ts +1 -0
- package/src/Calendar.ts +1 -0
- package/src/CalendarCard.ts +1 -0
- package/src/Card.ts +1 -0
- package/src/CardView.ts +1 -0
- package/src/CenterBaseline.ts +1 -0
- package/src/Chip.ts +1 -0
- package/src/ColorArea.ts +1 -0
- package/src/ColorField.ts +1 -0
- package/src/ColorSlider.ts +1 -0
- package/src/ColorSwatch.ts +1 -0
- package/src/ColorSwatchPicker.ts +1 -0
- package/src/ColorWheel.ts +1 -0
- package/src/ContrastIcon.ts +2 -0
- package/src/Conversation.ts +1 -0
- package/src/Disclosure.ts +1 -0
- package/src/EventCard.ts +1 -0
- package/src/FileTrigger.ts +1 -0
- package/src/GitHubIcon.ts +1 -0
- package/src/LightenIcon.ts +2 -0
- package/src/LinkButton.ts +1 -0
- package/src/ListView.ts +1 -0
- package/src/Logo.ts +1 -0
- package/src/Menu.ts +1 -0
- package/src/PageLayout.ts +1 -0
- package/src/Picker.ts +1 -0
- package/src/ProfileCard.ts +1 -0
- package/src/ProjectCard.ts +1 -0
- package/src/Provider.ts +1 -0
- package/src/RangeCalendar.ts +1 -0
- package/src/SearchField.ts +1 -0
- package/src/SegmentedControl.ts +1 -0
- package/src/Switch.ts +1 -0
- package/src/Tabs.ts +1 -0
- package/src/TextArea.ts +1 -0
- package/src/TextField.ts +1 -0
- package/src/TimelineItem.ts +1 -0
- package/src/TreeView.ts +1 -0
- package/src/components.css +2 -1077
- package/src/custom/calendar-card/index.tsx +99 -50
- package/src/custom/chip/index.tsx +59 -27
- package/src/custom/conversation/index.tsx +149 -55
- package/src/custom/event-card/index.tsx +174 -74
- package/src/custom/header/index.tsx +64 -33
- package/src/custom/lateral-nav/index.tsx +84 -38
- package/src/custom/logo/index.tsx +34 -39
- package/src/custom/nav-header/index.tsx +81 -25
- package/src/custom/page-layout/index.tsx +23 -19
- package/src/custom/profile-card/index.tsx +85 -35
- package/src/custom/project-card/index.tsx +57 -40
- package/src/custom/timeline-item/index.tsx +83 -48
- package/src/font-faces.css +1 -0
- package/src/index.ts +8 -322
- package/src/style/runtime.ts +2 -0
- package/src/style.ts +5 -0
- package/src/styles.css +6 -450
- package/src/theme.css +2 -101
- package/src/vite.ts +152 -0
- package/src/viviana-tokens.css +318 -0
- package/dist/alert/index.d.ts +0 -12
- package/dist/alert/index.d.ts.map +0 -1
- package/dist/autocomplete/index.d.ts +0 -89
- package/dist/autocomplete/index.d.ts.map +0 -1
- package/dist/avatar/index.d.ts +0 -17
- package/dist/avatar/index.d.ts.map +0 -1
- package/dist/badge/index.d.ts +0 -12
- package/dist/badge/index.d.ts.map +0 -1
- package/dist/breadcrumbs/index.d.ts +0 -38
- package/dist/breadcrumbs/index.d.ts.map +0 -1
- package/dist/button/Button.d.ts +0 -19
- package/dist/button/Button.d.ts.map +0 -1
- package/dist/button/index.d.ts +0 -3
- package/dist/button/index.d.ts.map +0 -1
- package/dist/button/types.d.ts +0 -23
- package/dist/button/types.d.ts.map +0 -1
- package/dist/calendar/DateField.d.ts +0 -47
- package/dist/calendar/DateField.d.ts.map +0 -1
- package/dist/calendar/DatePicker.d.ts +0 -48
- package/dist/calendar/DatePicker.d.ts.map +0 -1
- package/dist/calendar/RangeCalendar.d.ts +0 -42
- package/dist/calendar/RangeCalendar.d.ts.map +0 -1
- package/dist/calendar/TimeField.d.ts +0 -44
- package/dist/calendar/TimeField.d.ts.map +0 -1
- package/dist/calendar/index.d.ts +0 -50
- package/dist/calendar/index.d.ts.map +0 -1
- package/dist/checkbox/index.d.ts +0 -43
- package/dist/checkbox/index.d.ts.map +0 -1
- package/dist/color/index.d.ts +0 -228
- package/dist/color/index.d.ts.map +0 -1
- package/dist/combobox/index.d.ts +0 -81
- package/dist/combobox/index.d.ts.map +0 -1
- package/dist/dialog/Dialog.d.ts +0 -67
- package/dist/dialog/Dialog.d.ts.map +0 -1
- package/dist/dialog/index.d.ts +0 -3
- package/dist/dialog/index.d.ts.map +0 -1
- package/dist/disclosure/index.d.ts +0 -84
- package/dist/disclosure/index.d.ts.map +0 -1
- package/dist/gridlist/index.d.ts +0 -92
- package/dist/gridlist/index.d.ts.map +0 -1
- package/dist/icon/icons/GitHubIcon.d.ts +0 -7
- package/dist/icon/icons/GitHubIcon.d.ts.map +0 -1
- package/dist/icon/index.d.ts +0 -28
- package/dist/icon/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -7
- package/dist/index.ssr.js +0 -6631
- package/dist/index.ssr.js.map +0 -7
- package/dist/landmark/index.d.ts +0 -83
- package/dist/landmark/index.d.ts.map +0 -1
- package/dist/link/index.d.ts +0 -39
- package/dist/link/index.d.ts.map +0 -1
- package/dist/listbox/index.d.ts +0 -47
- package/dist/listbox/index.d.ts.map +0 -1
- package/dist/menu/index.d.ts +0 -74
- package/dist/menu/index.d.ts.map +0 -1
- package/dist/meter/index.d.ts +0 -49
- package/dist/meter/index.d.ts.map +0 -1
- package/dist/numberfield/index.d.ts +0 -50
- package/dist/numberfield/index.d.ts.map +0 -1
- package/dist/popover/index.d.ts +0 -85
- package/dist/popover/index.d.ts.map +0 -1
- package/dist/progress-bar/index.d.ts +0 -49
- package/dist/progress-bar/index.d.ts.map +0 -1
- package/dist/radio/index.d.ts +0 -46
- package/dist/radio/index.d.ts.map +0 -1
- package/dist/searchfield/index.d.ts +0 -44
- package/dist/searchfield/index.d.ts.map +0 -1
- package/dist/select/index.d.ts +0 -72
- package/dist/select/index.d.ts.map +0 -1
- package/dist/separator/index.d.ts +0 -42
- package/dist/separator/index.d.ts.map +0 -1
- package/dist/slider/index.d.ts +0 -53
- package/dist/slider/index.d.ts.map +0 -1
- package/dist/switch/ToggleSwitch.d.ts +0 -28
- package/dist/switch/ToggleSwitch.d.ts.map +0 -1
- package/dist/switch/index.d.ts +0 -26
- package/dist/switch/index.d.ts.map +0 -1
- package/dist/table/index.d.ts +0 -140
- package/dist/table/index.d.ts.map +0 -1
- package/dist/tabs/index.d.ts +0 -56
- package/dist/tabs/index.d.ts.map +0 -1
- package/dist/tag-group/index.d.ts +0 -80
- package/dist/tag-group/index.d.ts.map +0 -1
- package/dist/test-utils/index.d.ts +0 -44
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/textfield/index.d.ts +0 -31
- package/dist/textfield/index.d.ts.map +0 -1
- package/dist/toast/index.d.ts +0 -101
- package/dist/toast/index.d.ts.map +0 -1
- package/dist/toolbar/index.d.ts +0 -42
- package/dist/toolbar/index.d.ts.map +0 -1
- package/dist/tooltip/index.d.ts +0 -78
- package/dist/tooltip/index.d.ts.map +0 -1
- package/dist/tree/index.d.ts +0 -99
- package/dist/tree/index.d.ts.map +0 -1
- package/src/alert/index.tsx +0 -48
- package/src/assets/favicon.png +0 -0
- package/src/assets/fire.gif +0 -0
- package/src/autocomplete/index.tsx +0 -313
- package/src/avatar/index.tsx +0 -75
- package/src/badge/index.tsx +0 -43
- package/src/breadcrumbs/index.tsx +0 -207
- package/src/button/Button.tsx +0 -74
- package/src/button/index.ts +0 -2
- package/src/button/types.ts +0 -24
- package/src/calendar/DateField.tsx +0 -200
- package/src/calendar/DatePicker.tsx +0 -298
- package/src/calendar/RangeCalendar.tsx +0 -236
- package/src/calendar/TimeField.tsx +0 -196
- package/src/calendar/index.tsx +0 -223
- package/src/checkbox/index.tsx +0 -257
- package/src/color/index.tsx +0 -687
- package/src/combobox/index.tsx +0 -383
- package/src/dialog/Dialog.tsx +0 -260
- package/src/dialog/index.tsx +0 -3
- package/src/disclosure/index.tsx +0 -307
- package/src/gridlist/index.tsx +0 -403
- package/src/icon/icons/GitHubIcon.tsx +0 -20
- package/src/icon/index.tsx +0 -48
- package/src/landmark/index.tsx +0 -231
- package/src/link/index.tsx +0 -130
- package/src/listbox/index.tsx +0 -231
- package/src/menu/index.tsx +0 -297
- package/src/meter/index.tsx +0 -163
- package/src/numberfield/index.tsx +0 -482
- package/src/popover/index.tsx +0 -260
- package/src/progress-bar/index.tsx +0 -169
- package/src/radio/index.tsx +0 -173
- package/src/searchfield/index.tsx +0 -453
- package/src/select/index.tsx +0 -349
- package/src/separator/index.tsx +0 -141
- package/src/slider/index.tsx +0 -382
- package/src/switch/ToggleSwitch.tsx +0 -112
- package/src/switch/index.tsx +0 -90
- package/src/table/index.tsx +0 -531
- package/src/tabs/index.tsx +0 -273
- package/src/tag-group/index.tsx +0 -240
- package/src/test-utils/index.ts +0 -40
- package/src/textfield/index.tsx +0 -211
- package/src/toast/index.tsx +0 -324
- package/src/toolbar/index.tsx +0 -108
- package/src/tooltip/index.tsx +0 -197
- package/src/tree/index.tsx +0 -494
package/src/tooltip/index.tsx
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
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 }
|
package/src/tree/index.tsx
DELETED
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree component for proyecto-viviana-ui
|
|
3
|
-
*
|
|
4
|
-
* Styled tree component built on top of solidaria-components.
|
|
5
|
-
* Inspired by Spectrum 2's Tree component patterns.
|
|
6
|
-
*
|
|
7
|
-
* Tree displays hierarchical data with expandable/collapsible nodes,
|
|
8
|
-
* supporting keyboard navigation and selection.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type JSX, splitProps, createContext, useContext, Show } from 'solid-js'
|
|
12
|
-
import {
|
|
13
|
-
Tree as HeadlessTree,
|
|
14
|
-
TreeItem as HeadlessTreeItem,
|
|
15
|
-
TreeExpandButton as HeadlessTreeExpandButton,
|
|
16
|
-
TreeSelectionCheckbox as HeadlessTreeSelectionCheckbox,
|
|
17
|
-
type TreeProps as HeadlessTreeProps,
|
|
18
|
-
type TreeItemProps as HeadlessTreeItemProps,
|
|
19
|
-
type TreeExpandButtonProps as HeadlessTreeExpandButtonProps,
|
|
20
|
-
type TreeRenderProps,
|
|
21
|
-
type TreeItemRenderProps,
|
|
22
|
-
type TreeRenderItemState,
|
|
23
|
-
} from '@proyecto-viviana/solidaria-components'
|
|
24
|
-
import type { Key, TreeItemData } from '@proyecto-viviana/solid-stately'
|
|
25
|
-
|
|
26
|
-
// ============================================
|
|
27
|
-
// SIZE CONTEXT
|
|
28
|
-
// ============================================
|
|
29
|
-
|
|
30
|
-
export type TreeSize = 'sm' | 'md' | 'lg'
|
|
31
|
-
export type TreeVariant = 'default' | 'bordered' | 'quiet'
|
|
32
|
-
|
|
33
|
-
interface TreeContextValue {
|
|
34
|
-
size: TreeSize
|
|
35
|
-
variant: TreeVariant
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const TreeSizeContext = createContext<TreeContextValue>({ size: 'md', variant: 'default' })
|
|
39
|
-
|
|
40
|
-
// ============================================
|
|
41
|
-
// TYPES
|
|
42
|
-
// ============================================
|
|
43
|
-
|
|
44
|
-
export interface TreeProps<T extends object>
|
|
45
|
-
extends Omit<HeadlessTreeProps<T>, 'class' | 'style'> {
|
|
46
|
-
/** The size of the tree. */
|
|
47
|
-
size?: TreeSize
|
|
48
|
-
/** The visual variant of the tree. */
|
|
49
|
-
variant?: TreeVariant
|
|
50
|
-
/** Additional CSS class name. */
|
|
51
|
-
class?: string
|
|
52
|
-
/** Label for the tree. */
|
|
53
|
-
label?: string
|
|
54
|
-
/** Description for the tree. */
|
|
55
|
-
description?: string
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface TreeItemProps<T extends object>
|
|
59
|
-
extends Omit<HeadlessTreeItemProps<T>, 'class' | 'style'> {
|
|
60
|
-
/** Additional CSS class name. */
|
|
61
|
-
class?: string
|
|
62
|
-
/** Optional description text. */
|
|
63
|
-
description?: string
|
|
64
|
-
/**
|
|
65
|
-
* Optional icon to display before the content.
|
|
66
|
-
* Use a function returning JSX for SSR compatibility: `icon={() => <FolderIcon />}`
|
|
67
|
-
*/
|
|
68
|
-
icon?: () => JSX.Element
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface TreeExpandButtonProps extends Omit<HeadlessTreeExpandButtonProps, 'class' | 'style'> {
|
|
72
|
-
/** Additional CSS class name. */
|
|
73
|
-
class?: string
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ============================================
|
|
77
|
-
// STYLES
|
|
78
|
-
// ============================================
|
|
79
|
-
|
|
80
|
-
const sizeStyles = {
|
|
81
|
-
sm: {
|
|
82
|
-
tree: 'text-sm',
|
|
83
|
-
item: 'py-1 px-2 gap-1',
|
|
84
|
-
indent: 16,
|
|
85
|
-
icon: 'h-4 w-4',
|
|
86
|
-
expandButton: 'h-4 w-4',
|
|
87
|
-
label: 'text-sm',
|
|
88
|
-
description: 'text-xs',
|
|
89
|
-
checkbox: 'w-4 h-4',
|
|
90
|
-
},
|
|
91
|
-
md: {
|
|
92
|
-
tree: 'text-base',
|
|
93
|
-
item: 'py-1.5 px-3 gap-2',
|
|
94
|
-
indent: 20,
|
|
95
|
-
icon: 'h-5 w-5',
|
|
96
|
-
expandButton: 'h-5 w-5',
|
|
97
|
-
label: 'text-base',
|
|
98
|
-
description: 'text-sm',
|
|
99
|
-
checkbox: 'w-5 h-5',
|
|
100
|
-
},
|
|
101
|
-
lg: {
|
|
102
|
-
tree: 'text-lg',
|
|
103
|
-
item: 'py-2 px-4 gap-2',
|
|
104
|
-
indent: 24,
|
|
105
|
-
icon: 'h-6 w-6',
|
|
106
|
-
expandButton: 'h-6 w-6',
|
|
107
|
-
label: 'text-lg',
|
|
108
|
-
description: 'text-base',
|
|
109
|
-
checkbox: 'w-6 h-6',
|
|
110
|
-
},
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const variantStyles = {
|
|
114
|
-
default: {
|
|
115
|
-
tree: 'bg-bg-400 rounded-lg border border-bg-300 p-2',
|
|
116
|
-
item: 'rounded-md',
|
|
117
|
-
itemHover: 'hover:bg-bg-200/50',
|
|
118
|
-
itemSelected: 'bg-accent/10 text-accent',
|
|
119
|
-
},
|
|
120
|
-
bordered: {
|
|
121
|
-
tree: 'bg-bg-400 rounded-lg border-2 border-bg-400 p-2',
|
|
122
|
-
item: 'border-b border-bg-300/30 last:border-b-0',
|
|
123
|
-
itemHover: 'hover:bg-bg-200/50',
|
|
124
|
-
itemSelected: 'bg-accent/10 text-accent',
|
|
125
|
-
},
|
|
126
|
-
quiet: {
|
|
127
|
-
tree: 'bg-transparent',
|
|
128
|
-
item: 'rounded-md',
|
|
129
|
-
itemHover: 'hover:bg-bg-300/50',
|
|
130
|
-
itemSelected: 'bg-accent/10 text-accent',
|
|
131
|
-
},
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// ============================================
|
|
135
|
-
// TREE COMPONENT
|
|
136
|
-
// ============================================
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* A tree displays hierarchical data with expandable/collapsible nodes,
|
|
140
|
-
* supporting keyboard navigation and selection.
|
|
141
|
-
*
|
|
142
|
-
* Built on solidaria-components Tree for full accessibility support.
|
|
143
|
-
*
|
|
144
|
-
* @example
|
|
145
|
-
* ```tsx
|
|
146
|
-
* const items = [
|
|
147
|
-
* {
|
|
148
|
-
* key: 'documents',
|
|
149
|
-
* value: { name: 'Documents' },
|
|
150
|
-
* children: [
|
|
151
|
-
* { key: 'doc1', value: { name: 'Report.pdf' } },
|
|
152
|
-
* { key: 'doc2', value: { name: 'Notes.txt' } },
|
|
153
|
-
* ],
|
|
154
|
-
* },
|
|
155
|
-
* {
|
|
156
|
-
* key: 'images',
|
|
157
|
-
* value: { name: 'Images' },
|
|
158
|
-
* children: [
|
|
159
|
-
* { key: 'img1', value: { name: 'Photo.jpg' } },
|
|
160
|
-
* ],
|
|
161
|
-
* },
|
|
162
|
-
* ]
|
|
163
|
-
*
|
|
164
|
-
* <Tree items={items} defaultExpandedKeys={['documents']}>
|
|
165
|
-
* {(item, state) => (
|
|
166
|
-
* <TreeItem id={item.key} icon={() => <FolderIcon />}>
|
|
167
|
-
* {item.value.name}
|
|
168
|
-
* </TreeItem>
|
|
169
|
-
* )}
|
|
170
|
-
* </Tree>
|
|
171
|
-
* ```
|
|
172
|
-
*/
|
|
173
|
-
export function Tree<T extends object>(props: TreeProps<T>): JSX.Element {
|
|
174
|
-
const [local, headlessProps] = splitProps(props, [
|
|
175
|
-
'size',
|
|
176
|
-
'variant',
|
|
177
|
-
'class',
|
|
178
|
-
'label',
|
|
179
|
-
'description',
|
|
180
|
-
])
|
|
181
|
-
|
|
182
|
-
const size = () => local.size ?? 'md'
|
|
183
|
-
const variant = () => local.variant ?? 'default'
|
|
184
|
-
const styles = () => sizeStyles[size()]
|
|
185
|
-
const variantStyle = () => variantStyles[variant()]
|
|
186
|
-
const customClass = local.class ?? ''
|
|
187
|
-
|
|
188
|
-
const getClassName = (renderProps: TreeRenderProps): string => {
|
|
189
|
-
const base = 'overflow-auto focus:outline-none'
|
|
190
|
-
const sizeClass = styles().tree
|
|
191
|
-
const variantClass = variantStyle().tree
|
|
192
|
-
|
|
193
|
-
let stateClass = ''
|
|
194
|
-
if (renderProps.isDisabled) {
|
|
195
|
-
stateClass = 'opacity-50'
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const focusClass = renderProps.isFocusVisible
|
|
199
|
-
? 'ring-2 ring-accent-300 ring-offset-2 ring-offset-bg-400'
|
|
200
|
-
: ''
|
|
201
|
-
|
|
202
|
-
return [base, sizeClass, variantClass, stateClass, focusClass, customClass]
|
|
203
|
-
.filter(Boolean)
|
|
204
|
-
.join(' ')
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const defaultEmptyState = () => (
|
|
208
|
-
<div class="py-8 text-center text-primary-400">
|
|
209
|
-
<div class="flex flex-col items-center gap-2">
|
|
210
|
-
<EmptyTreeIcon class="w-12 h-12 text-primary-500" />
|
|
211
|
-
<span>No items</span>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
const contextValue = () => ({ size: size(), variant: variant() })
|
|
217
|
-
|
|
218
|
-
return (
|
|
219
|
-
<TreeSizeContext.Provider value={contextValue()}>
|
|
220
|
-
<div class="flex flex-col gap-2">
|
|
221
|
-
<Show when={local.label}>
|
|
222
|
-
<label class={`text-primary-200 font-medium ${styles().label}`}>
|
|
223
|
-
{local.label}
|
|
224
|
-
</label>
|
|
225
|
-
</Show>
|
|
226
|
-
<HeadlessTree
|
|
227
|
-
{...headlessProps}
|
|
228
|
-
class={getClassName}
|
|
229
|
-
renderEmptyState={headlessProps.renderEmptyState ?? defaultEmptyState}
|
|
230
|
-
/>
|
|
231
|
-
<Show when={local.description}>
|
|
232
|
-
<span class="text-primary-400 text-sm">{local.description}</span>
|
|
233
|
-
</Show>
|
|
234
|
-
</div>
|
|
235
|
-
</TreeSizeContext.Provider>
|
|
236
|
-
)
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// ============================================
|
|
240
|
-
// TREE ITEM COMPONENT
|
|
241
|
-
// ============================================
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* An item in a tree.
|
|
245
|
-
*/
|
|
246
|
-
export function TreeItem<T extends object>(props: TreeItemProps<T>): JSX.Element {
|
|
247
|
-
const [local, headlessProps] = splitProps(props, [
|
|
248
|
-
'class',
|
|
249
|
-
'description',
|
|
250
|
-
'icon',
|
|
251
|
-
])
|
|
252
|
-
|
|
253
|
-
const context = useContext(TreeSizeContext)
|
|
254
|
-
const sizeStyle = sizeStyles[context.size]
|
|
255
|
-
const variantStyle = variantStyles[context.variant]
|
|
256
|
-
const customClass = local.class ?? ''
|
|
257
|
-
|
|
258
|
-
const getClassName = (renderProps: TreeItemRenderProps): string => {
|
|
259
|
-
const base = 'flex items-center cursor-pointer transition-all duration-150 outline-none'
|
|
260
|
-
const sizeClass = sizeStyle.item
|
|
261
|
-
const variantClass = variantStyle.item
|
|
262
|
-
|
|
263
|
-
let stateClass = ''
|
|
264
|
-
if (renderProps.isDisabled) {
|
|
265
|
-
stateClass = 'opacity-50 cursor-not-allowed'
|
|
266
|
-
} else if (renderProps.isSelected) {
|
|
267
|
-
stateClass = variantStyle.itemSelected
|
|
268
|
-
} else if (renderProps.isHovered) {
|
|
269
|
-
stateClass = variantStyle.itemHover
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
let textClass = ''
|
|
273
|
-
if (!renderProps.isDisabled && !renderProps.isSelected) {
|
|
274
|
-
textClass = 'text-primary-200'
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
const focusClass = renderProps.isFocusVisible
|
|
278
|
-
? 'ring-2 ring-inset ring-accent-300'
|
|
279
|
-
: ''
|
|
280
|
-
|
|
281
|
-
const pressedClass = renderProps.isPressed ? 'scale-[0.99]' : ''
|
|
282
|
-
|
|
283
|
-
return [base, sizeClass, variantClass, stateClass, textClass, focusClass, pressedClass, customClass]
|
|
284
|
-
.filter(Boolean)
|
|
285
|
-
.join(' ')
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const getStyle = (renderProps: TreeItemRenderProps): JSX.CSSProperties => ({
|
|
289
|
-
'padding-left': `${renderProps.level * sizeStyle.indent + 8}px`,
|
|
290
|
-
})
|
|
291
|
-
|
|
292
|
-
return (
|
|
293
|
-
<HeadlessTreeItem {...headlessProps} class={getClassName} style={getStyle}>
|
|
294
|
-
{(renderProps: TreeItemRenderProps) => (
|
|
295
|
-
<>
|
|
296
|
-
{/* Expand button */}
|
|
297
|
-
<TreeExpandButton class={`${sizeStyle.expandButton} shrink-0`} />
|
|
298
|
-
|
|
299
|
-
{/* Icon */}
|
|
300
|
-
<Show when={local.icon}>
|
|
301
|
-
<span class={`shrink-0 ${sizeStyle.icon}`}>
|
|
302
|
-
{local.icon!()}
|
|
303
|
-
</span>
|
|
304
|
-
</Show>
|
|
305
|
-
|
|
306
|
-
{/* Default folder/file icon if no custom icon */}
|
|
307
|
-
<Show when={!local.icon}>
|
|
308
|
-
{renderProps.isExpandable ? (
|
|
309
|
-
<FolderIcon class={`shrink-0 ${sizeStyle.icon} text-accent-300`} isOpen={renderProps.isExpanded} />
|
|
310
|
-
) : (
|
|
311
|
-
<FileIcon class={`shrink-0 ${sizeStyle.icon} text-primary-400`} />
|
|
312
|
-
)}
|
|
313
|
-
</Show>
|
|
314
|
-
|
|
315
|
-
{/* Content */}
|
|
316
|
-
<div class="flex flex-col flex-1 min-w-0">
|
|
317
|
-
<span class="truncate">
|
|
318
|
-
{typeof props.children === 'function'
|
|
319
|
-
? props.children(renderProps)
|
|
320
|
-
: props.children}
|
|
321
|
-
</span>
|
|
322
|
-
<Show when={local.description}>
|
|
323
|
-
<span class={`text-primary-400 truncate ${sizeStyle.description}`}>
|
|
324
|
-
{local.description}
|
|
325
|
-
</span>
|
|
326
|
-
</Show>
|
|
327
|
-
</div>
|
|
328
|
-
|
|
329
|
-
{/* Selection indicator */}
|
|
330
|
-
<Show when={renderProps.isSelected}>
|
|
331
|
-
<CheckIcon class={`shrink-0 ${sizeStyle.icon} text-accent`} />
|
|
332
|
-
</Show>
|
|
333
|
-
</>
|
|
334
|
-
)}
|
|
335
|
-
</HeadlessTreeItem>
|
|
336
|
-
)
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// ============================================
|
|
340
|
-
// TREE EXPAND BUTTON COMPONENT
|
|
341
|
-
// ============================================
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* A button to expand/collapse a tree item.
|
|
345
|
-
*/
|
|
346
|
-
export function TreeExpandButton(props: TreeExpandButtonProps): JSX.Element {
|
|
347
|
-
const [local, headlessProps] = splitProps(props, ['class'])
|
|
348
|
-
const context = useContext(TreeSizeContext)
|
|
349
|
-
const sizeStyle = sizeStyles[context.size]
|
|
350
|
-
const customClass = local.class ?? ''
|
|
351
|
-
|
|
352
|
-
const className = [
|
|
353
|
-
'flex items-center justify-center transition-transform duration-150 text-primary-400 hover:text-primary-200',
|
|
354
|
-
customClass,
|
|
355
|
-
]
|
|
356
|
-
.filter(Boolean)
|
|
357
|
-
.join(' ')
|
|
358
|
-
|
|
359
|
-
return (
|
|
360
|
-
<HeadlessTreeExpandButton
|
|
361
|
-
{...headlessProps}
|
|
362
|
-
class={className}
|
|
363
|
-
>
|
|
364
|
-
{props.children ?? (({ isExpanded }: { isExpanded: boolean }) => (
|
|
365
|
-
<ChevronIcon
|
|
366
|
-
class={`${sizeStyle.expandButton} transition-transform duration-150 ${
|
|
367
|
-
isExpanded ? 'rotate-90' : ''
|
|
368
|
-
}`}
|
|
369
|
-
/>
|
|
370
|
-
))}
|
|
371
|
-
</HeadlessTreeExpandButton>
|
|
372
|
-
)
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// ============================================
|
|
376
|
-
// TREE SELECTION CHECKBOX COMPONENT
|
|
377
|
-
// ============================================
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* A styled checkbox for item selection in a tree.
|
|
381
|
-
*/
|
|
382
|
-
export function TreeSelectionCheckbox(props: { itemKey: Key; class?: string }): JSX.Element {
|
|
383
|
-
const context = useContext(TreeSizeContext)
|
|
384
|
-
const sizeStyle = sizeStyles[context.size]
|
|
385
|
-
const className = `${sizeStyle.checkbox} rounded border-2 border-primary-500 bg-bg-400 text-accent cursor-pointer checked:bg-accent checked:border-accent focus:ring-2 focus:ring-accent-300 focus:ring-offset-1 focus:ring-offset-bg-400 ${props.class ?? ''}`
|
|
386
|
-
|
|
387
|
-
return (
|
|
388
|
-
<span class={className}>
|
|
389
|
-
<HeadlessTreeSelectionCheckbox itemKey={props.itemKey} />
|
|
390
|
-
</span>
|
|
391
|
-
)
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// ============================================
|
|
395
|
-
// ICONS
|
|
396
|
-
// ============================================
|
|
397
|
-
|
|
398
|
-
function ChevronIcon(props: { class?: string }): JSX.Element {
|
|
399
|
-
return (
|
|
400
|
-
<svg
|
|
401
|
-
class={props.class}
|
|
402
|
-
fill="none"
|
|
403
|
-
viewBox="0 0 24 24"
|
|
404
|
-
stroke="currentColor"
|
|
405
|
-
stroke-width="2"
|
|
406
|
-
>
|
|
407
|
-
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7" />
|
|
408
|
-
</svg>
|
|
409
|
-
)
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
function FolderIcon(props: { class?: string; isOpen?: boolean }): JSX.Element {
|
|
413
|
-
return (
|
|
414
|
-
<svg
|
|
415
|
-
class={props.class}
|
|
416
|
-
fill="none"
|
|
417
|
-
viewBox="0 0 24 24"
|
|
418
|
-
stroke="currentColor"
|
|
419
|
-
stroke-width="1.5"
|
|
420
|
-
>
|
|
421
|
-
{props.isOpen ? (
|
|
422
|
-
<path
|
|
423
|
-
stroke-linecap="round"
|
|
424
|
-
stroke-linejoin="round"
|
|
425
|
-
d="M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776"
|
|
426
|
-
/>
|
|
427
|
-
) : (
|
|
428
|
-
<path
|
|
429
|
-
stroke-linecap="round"
|
|
430
|
-
stroke-linejoin="round"
|
|
431
|
-
d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z"
|
|
432
|
-
/>
|
|
433
|
-
)}
|
|
434
|
-
</svg>
|
|
435
|
-
)
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
function FileIcon(props: { class?: string }): JSX.Element {
|
|
439
|
-
return (
|
|
440
|
-
<svg
|
|
441
|
-
class={props.class}
|
|
442
|
-
fill="none"
|
|
443
|
-
viewBox="0 0 24 24"
|
|
444
|
-
stroke="currentColor"
|
|
445
|
-
stroke-width="1.5"
|
|
446
|
-
>
|
|
447
|
-
<path
|
|
448
|
-
stroke-linecap="round"
|
|
449
|
-
stroke-linejoin="round"
|
|
450
|
-
d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"
|
|
451
|
-
/>
|
|
452
|
-
</svg>
|
|
453
|
-
)
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
function CheckIcon(props: { class?: string }): JSX.Element {
|
|
457
|
-
return (
|
|
458
|
-
<svg
|
|
459
|
-
class={props.class}
|
|
460
|
-
fill="none"
|
|
461
|
-
viewBox="0 0 24 24"
|
|
462
|
-
stroke="currentColor"
|
|
463
|
-
stroke-width="2"
|
|
464
|
-
>
|
|
465
|
-
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
|
466
|
-
</svg>
|
|
467
|
-
)
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
function EmptyTreeIcon(props: { class?: string }): JSX.Element {
|
|
471
|
-
return (
|
|
472
|
-
<svg
|
|
473
|
-
class={props.class}
|
|
474
|
-
fill="none"
|
|
475
|
-
viewBox="0 0 24 24"
|
|
476
|
-
stroke="currentColor"
|
|
477
|
-
stroke-width="1.5"
|
|
478
|
-
>
|
|
479
|
-
<path
|
|
480
|
-
stroke-linecap="round"
|
|
481
|
-
stroke-linejoin="round"
|
|
482
|
-
d="M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6z"
|
|
483
|
-
/>
|
|
484
|
-
</svg>
|
|
485
|
-
)
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
// Attach sub-components for convenience
|
|
489
|
-
Tree.Item = TreeItem
|
|
490
|
-
Tree.ExpandButton = TreeExpandButton
|
|
491
|
-
Tree.SelectionCheckbox = TreeSelectionCheckbox
|
|
492
|
-
|
|
493
|
-
// Re-export types for convenience
|
|
494
|
-
export type { Key, TreeItemData, TreeRenderItemState }
|