@proyecto-viviana/ui 0.3.5 → 0.4.1
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 +96 -0
- package/dist/CalendarCard.js.map +1 -0
- package/dist/CalendarCard.jsx +50 -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 +176 -0
- package/dist/Conversation.js.map +1 -0
- package/dist/Conversation.jsx +106 -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 +171 -0
- package/dist/EventCard.js.map +1 -0
- package/dist/EventCard.jsx +94 -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 +77 -0
- package/dist/ProfileCard.js.map +1 -0
- package/dist/ProfileCard.jsx +52 -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 +162 -0
- package/dist/ProjectCard.js.map +1 -0
- package/dist/ProjectCard.jsx +131 -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 +16 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +82 -0
- package/dist/vite.js.map +1 -0
- package/dist/vite.jsx +82 -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 +108 -50
- package/src/custom/chip/index.tsx +63 -27
- package/src/custom/conversation/index.tsx +166 -55
- package/src/custom/event-card/index.tsx +195 -74
- package/src/custom/header/index.tsx +64 -33
- package/src/custom/lateral-nav/index.tsx +93 -38
- package/src/custom/logo/index.tsx +41 -39
- package/src/custom/nav-header/index.tsx +89 -25
- package/src/custom/page-layout/index.tsx +23 -19
- package/src/custom/profile-card/index.tsx +94 -35
- package/src/custom/project-card/index.tsx +57 -40
- package/src/custom/timeline-item/index.tsx +91 -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 +164 -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/slider/index.tsx
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Slider component for proyecto-viviana-ui
|
|
3
|
-
*
|
|
4
|
-
* A styled slider component with track, thumb, and value display.
|
|
5
|
-
* Built directly on solidaria hooks for full accessibility support.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { type JSX, splitProps, mergeProps as solidMergeProps, Show } from 'solid-js'
|
|
9
|
-
import {
|
|
10
|
-
createSlider,
|
|
11
|
-
createFocusRing,
|
|
12
|
-
createHover,
|
|
13
|
-
type AriaSliderProps,
|
|
14
|
-
} from '@proyecto-viviana/solidaria'
|
|
15
|
-
import {
|
|
16
|
-
createSliderState,
|
|
17
|
-
type SliderOrientation,
|
|
18
|
-
} from '@proyecto-viviana/solid-stately'
|
|
19
|
-
|
|
20
|
-
// ============================================
|
|
21
|
-
// TYPES
|
|
22
|
-
// ============================================
|
|
23
|
-
|
|
24
|
-
export type SliderSize = 'sm' | 'md' | 'lg'
|
|
25
|
-
export type SliderVariant = 'default' | 'accent'
|
|
26
|
-
|
|
27
|
-
export interface SliderProps extends Omit<AriaSliderProps, 'label'> {
|
|
28
|
-
/** The size of the slider. */
|
|
29
|
-
size?: SliderSize
|
|
30
|
-
/** The visual variant of the slider. */
|
|
31
|
-
variant?: SliderVariant
|
|
32
|
-
/** Additional CSS class name. */
|
|
33
|
-
class?: string
|
|
34
|
-
/** Label text for the slider. */
|
|
35
|
-
label?: string
|
|
36
|
-
/** The current value (controlled). */
|
|
37
|
-
value?: number
|
|
38
|
-
/** The default value (uncontrolled). */
|
|
39
|
-
defaultValue?: number
|
|
40
|
-
/** Handler called when the value changes. */
|
|
41
|
-
onChange?: (value: number) => void
|
|
42
|
-
/** Handler called when dragging ends. */
|
|
43
|
-
onChangeEnd?: (value: number) => void
|
|
44
|
-
/** The minimum value. */
|
|
45
|
-
minValue?: number
|
|
46
|
-
/** The maximum value. */
|
|
47
|
-
maxValue?: number
|
|
48
|
-
/** The step value. */
|
|
49
|
-
step?: number
|
|
50
|
-
/** The orientation of the slider. */
|
|
51
|
-
orientation?: SliderOrientation
|
|
52
|
-
/** The locale for number formatting. */
|
|
53
|
-
locale?: string
|
|
54
|
-
/** Number format options. */
|
|
55
|
-
formatOptions?: Intl.NumberFormatOptions
|
|
56
|
-
/** Whether to show the value output. */
|
|
57
|
-
showOutput?: boolean
|
|
58
|
-
/** Whether to show min/max labels. */
|
|
59
|
-
showMinMax?: boolean
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ============================================
|
|
63
|
-
// STYLES
|
|
64
|
-
// ============================================
|
|
65
|
-
|
|
66
|
-
const sizeStyles = {
|
|
67
|
-
sm: {
|
|
68
|
-
track: 'h-1',
|
|
69
|
-
thumb: 'w-3 h-3 -mt-1',
|
|
70
|
-
label: 'text-sm',
|
|
71
|
-
output: 'text-xs',
|
|
72
|
-
},
|
|
73
|
-
md: {
|
|
74
|
-
track: 'h-2',
|
|
75
|
-
thumb: 'w-4 h-4 -mt-1',
|
|
76
|
-
label: 'text-sm',
|
|
77
|
-
output: 'text-sm',
|
|
78
|
-
},
|
|
79
|
-
lg: {
|
|
80
|
-
track: 'h-3',
|
|
81
|
-
thumb: 'w-5 h-5 -mt-1',
|
|
82
|
-
label: 'text-base',
|
|
83
|
-
output: 'text-base',
|
|
84
|
-
},
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// ============================================
|
|
88
|
-
// COMPONENT
|
|
89
|
-
// ============================================
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* A slider allows users to select a value from a range.
|
|
93
|
-
*
|
|
94
|
-
* Built directly on solidaria hooks for full accessibility support.
|
|
95
|
-
*/
|
|
96
|
-
export function Slider(props: SliderProps): JSX.Element {
|
|
97
|
-
const defaultProps: Partial<SliderProps> = {
|
|
98
|
-
size: 'md',
|
|
99
|
-
variant: 'default',
|
|
100
|
-
minValue: 0,
|
|
101
|
-
maxValue: 100,
|
|
102
|
-
step: 1,
|
|
103
|
-
orientation: 'horizontal',
|
|
104
|
-
showOutput: true,
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const merged = solidMergeProps(defaultProps, props)
|
|
108
|
-
|
|
109
|
-
const [local, stateProps, ariaProps] = splitProps(merged, [
|
|
110
|
-
'size',
|
|
111
|
-
'variant',
|
|
112
|
-
'class',
|
|
113
|
-
'label',
|
|
114
|
-
'showOutput',
|
|
115
|
-
'showMinMax',
|
|
116
|
-
], [
|
|
117
|
-
'value',
|
|
118
|
-
'defaultValue',
|
|
119
|
-
'onChange',
|
|
120
|
-
'onChangeEnd',
|
|
121
|
-
'minValue',
|
|
122
|
-
'maxValue',
|
|
123
|
-
'step',
|
|
124
|
-
'orientation',
|
|
125
|
-
'locale',
|
|
126
|
-
'formatOptions',
|
|
127
|
-
])
|
|
128
|
-
|
|
129
|
-
const size = () => sizeStyles[local.size!]
|
|
130
|
-
|
|
131
|
-
// Track ref for pointer handling
|
|
132
|
-
let trackRef: HTMLDivElement | undefined
|
|
133
|
-
|
|
134
|
-
// Create slider state
|
|
135
|
-
const state = createSliderState({
|
|
136
|
-
get value() {
|
|
137
|
-
return stateProps.value
|
|
138
|
-
},
|
|
139
|
-
get defaultValue() {
|
|
140
|
-
return stateProps.defaultValue
|
|
141
|
-
},
|
|
142
|
-
get onChange() {
|
|
143
|
-
return stateProps.onChange
|
|
144
|
-
},
|
|
145
|
-
get onChangeEnd() {
|
|
146
|
-
return stateProps.onChangeEnd
|
|
147
|
-
},
|
|
148
|
-
get minValue() {
|
|
149
|
-
return stateProps.minValue
|
|
150
|
-
},
|
|
151
|
-
get maxValue() {
|
|
152
|
-
return stateProps.maxValue
|
|
153
|
-
},
|
|
154
|
-
get step() {
|
|
155
|
-
return stateProps.step
|
|
156
|
-
},
|
|
157
|
-
get orientation() {
|
|
158
|
-
return stateProps.orientation
|
|
159
|
-
},
|
|
160
|
-
get locale() {
|
|
161
|
-
return stateProps.locale
|
|
162
|
-
},
|
|
163
|
-
get formatOptions() {
|
|
164
|
-
return stateProps.formatOptions
|
|
165
|
-
},
|
|
166
|
-
get isDisabled() {
|
|
167
|
-
return ariaProps.isDisabled
|
|
168
|
-
},
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
// Create slider aria props
|
|
172
|
-
const sliderAria = createSlider(
|
|
173
|
-
{
|
|
174
|
-
get label() {
|
|
175
|
-
return local.label
|
|
176
|
-
},
|
|
177
|
-
get 'aria-label'() {
|
|
178
|
-
return ariaProps['aria-label']
|
|
179
|
-
},
|
|
180
|
-
get 'aria-labelledby'() {
|
|
181
|
-
return ariaProps['aria-labelledby']
|
|
182
|
-
},
|
|
183
|
-
get 'aria-describedby'() {
|
|
184
|
-
return ariaProps['aria-describedby']
|
|
185
|
-
},
|
|
186
|
-
get isDisabled() {
|
|
187
|
-
return ariaProps.isDisabled
|
|
188
|
-
},
|
|
189
|
-
get orientation() {
|
|
190
|
-
return stateProps.orientation
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
state,
|
|
194
|
-
() => trackRef ?? null
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
// Create focus ring
|
|
198
|
-
const { isFocused, isFocusVisible, focusProps } = createFocusRing()
|
|
199
|
-
|
|
200
|
-
// Create hover
|
|
201
|
-
const { isHovered, hoverProps } = createHover({
|
|
202
|
-
get isDisabled() {
|
|
203
|
-
return ariaProps.isDisabled
|
|
204
|
-
},
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
// Compute classes
|
|
208
|
-
const containerClasses = () => {
|
|
209
|
-
const base = 'flex flex-col w-full'
|
|
210
|
-
const disabledClass = ariaProps.isDisabled ? 'opacity-60' : ''
|
|
211
|
-
const custom = local.class || ''
|
|
212
|
-
return [base, disabledClass, custom].filter(Boolean).join(' ')
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const labelRowClasses = () => {
|
|
216
|
-
return 'flex justify-between items-center mb-2'
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
const trackContainerClasses = () => {
|
|
220
|
-
const base = 'relative w-full cursor-pointer'
|
|
221
|
-
const disabledClass = ariaProps.isDisabled ? 'cursor-not-allowed' : ''
|
|
222
|
-
return [base, disabledClass].filter(Boolean).join(' ')
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const trackClasses = () => {
|
|
226
|
-
const base = 'w-full rounded-full bg-bg-300'
|
|
227
|
-
const sizeClass = size().track
|
|
228
|
-
return [base, sizeClass].filter(Boolean).join(' ')
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const fillClasses = () => {
|
|
232
|
-
const base = 'absolute top-0 left-0 h-full rounded-full transition-all'
|
|
233
|
-
const variantClass = local.variant === 'accent' ? 'bg-accent' : 'bg-primary-400'
|
|
234
|
-
return [base, variantClass].filter(Boolean).join(' ')
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const thumbClasses = () => {
|
|
238
|
-
const base = 'absolute top-1/2 rounded-full shadow-md transition-all cursor-grab'
|
|
239
|
-
const sizeClass = size().thumb
|
|
240
|
-
|
|
241
|
-
let stateClass: string
|
|
242
|
-
if (ariaProps.isDisabled) {
|
|
243
|
-
stateClass = 'bg-primary-400 cursor-not-allowed'
|
|
244
|
-
} else if (state.isDragging()) {
|
|
245
|
-
stateClass = local.variant === 'accent' ? 'bg-accent-400 scale-110 cursor-grabbing' : 'bg-primary-200 scale-110 cursor-grabbing'
|
|
246
|
-
} else if (isHovered()) {
|
|
247
|
-
stateClass = local.variant === 'accent' ? 'bg-accent-400 scale-105' : 'bg-primary-200 scale-105'
|
|
248
|
-
} else {
|
|
249
|
-
stateClass = local.variant === 'accent' ? 'bg-accent' : 'bg-primary-100'
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const focusClass = isFocusVisible() ? 'ring-2 ring-accent ring-offset-2 ring-offset-bg-100' : ''
|
|
253
|
-
|
|
254
|
-
return [base, sizeClass, stateClass, focusClass].filter(Boolean).join(' ')
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
const labelClasses = () => {
|
|
258
|
-
const base = 'font-medium text-primary-200'
|
|
259
|
-
const sizeClass = size().label
|
|
260
|
-
return [base, sizeClass].filter(Boolean).join(' ')
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
const outputClasses = () => {
|
|
264
|
-
const base = 'font-medium text-primary-100'
|
|
265
|
-
const sizeClass = size().output
|
|
266
|
-
return [base, sizeClass].filter(Boolean).join(' ')
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const minMaxClasses = () => {
|
|
270
|
-
const base = 'text-xs text-primary-400'
|
|
271
|
-
return base
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Clean props helpers
|
|
275
|
-
const cleanGroupProps = () => {
|
|
276
|
-
const { ref: _ref, ...rest } = sliderAria.groupProps as Record<string, unknown>
|
|
277
|
-
return rest
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const cleanTrackProps = () => {
|
|
281
|
-
const { ref: _ref, style: _style, ...rest } = sliderAria.trackProps as Record<string, unknown>
|
|
282
|
-
return rest
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const cleanThumbProps = () => {
|
|
286
|
-
const { ref: _ref, style: thumbStyle, ...rest } = sliderAria.thumbProps as Record<string, unknown>
|
|
287
|
-
// Extract positioning from thumbStyle
|
|
288
|
-
const style = thumbStyle as Record<string, string> | undefined
|
|
289
|
-
return { rest, style }
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const cleanFocusProps = () => {
|
|
293
|
-
const { ref: _ref, ...rest } = focusProps as Record<string, unknown>
|
|
294
|
-
return rest
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const cleanHoverProps = () => {
|
|
298
|
-
const { ref: _ref, ...rest } = hoverProps as Record<string, unknown>
|
|
299
|
-
return rest
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const cleanOutputProps = () => {
|
|
303
|
-
const { ref: _ref, ...rest } = sliderAria.outputProps as Record<string, unknown>
|
|
304
|
-
return rest
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const thumbData = () => cleanThumbProps()
|
|
308
|
-
const percent = () => state.getValuePercent() * 100
|
|
309
|
-
|
|
310
|
-
return (
|
|
311
|
-
<div
|
|
312
|
-
{...cleanGroupProps()}
|
|
313
|
-
class={containerClasses()}
|
|
314
|
-
data-disabled={ariaProps.isDisabled || undefined}
|
|
315
|
-
data-orientation={state.orientation}
|
|
316
|
-
>
|
|
317
|
-
{/* Label and Output Row */}
|
|
318
|
-
<Show when={local.label || local.showOutput}>
|
|
319
|
-
<div class={labelRowClasses()}>
|
|
320
|
-
<Show when={local.label}>
|
|
321
|
-
<span {...sliderAria.labelProps} class={labelClasses()}>
|
|
322
|
-
{local.label}
|
|
323
|
-
</span>
|
|
324
|
-
</Show>
|
|
325
|
-
<Show when={local.showOutput}>
|
|
326
|
-
<output {...cleanOutputProps()} class={outputClasses()}>
|
|
327
|
-
{state.getFormattedValue()}
|
|
328
|
-
</output>
|
|
329
|
-
</Show>
|
|
330
|
-
</div>
|
|
331
|
-
</Show>
|
|
332
|
-
|
|
333
|
-
{/* Track Container */}
|
|
334
|
-
<div class={trackContainerClasses()}>
|
|
335
|
-
{/* Track */}
|
|
336
|
-
<div
|
|
337
|
-
ref={(el) => (trackRef = el)}
|
|
338
|
-
{...cleanTrackProps()}
|
|
339
|
-
class={trackClasses()}
|
|
340
|
-
style={{ 'touch-action': 'none' }}
|
|
341
|
-
>
|
|
342
|
-
{/* Fill */}
|
|
343
|
-
<div
|
|
344
|
-
class={fillClasses()}
|
|
345
|
-
style={{ width: `${percent()}%` }}
|
|
346
|
-
/>
|
|
347
|
-
</div>
|
|
348
|
-
|
|
349
|
-
{/* Thumb */}
|
|
350
|
-
<div
|
|
351
|
-
{...thumbData().rest}
|
|
352
|
-
{...cleanFocusProps()}
|
|
353
|
-
{...cleanHoverProps()}
|
|
354
|
-
class={thumbClasses()}
|
|
355
|
-
style={{
|
|
356
|
-
left: `${percent()}%`,
|
|
357
|
-
transform: 'translateX(-50%)',
|
|
358
|
-
...(thumbData().style || {}),
|
|
359
|
-
}}
|
|
360
|
-
data-dragging={state.isDragging() || undefined}
|
|
361
|
-
data-focused={isFocused() || undefined}
|
|
362
|
-
data-focus-visible={isFocusVisible() || undefined}
|
|
363
|
-
data-hovered={isHovered() || undefined}
|
|
364
|
-
/>
|
|
365
|
-
</div>
|
|
366
|
-
|
|
367
|
-
{/* Min/Max Labels */}
|
|
368
|
-
<Show when={local.showMinMax}>
|
|
369
|
-
<div class="flex justify-between mt-1">
|
|
370
|
-
<span class={minMaxClasses()}>{state.minValue}</span>
|
|
371
|
-
<span class={minMaxClasses()}>{state.maxValue}</span>
|
|
372
|
-
</div>
|
|
373
|
-
</Show>
|
|
374
|
-
|
|
375
|
-
{/* Hidden input for form submission */}
|
|
376
|
-
<input {...sliderAria.inputProps} />
|
|
377
|
-
</div>
|
|
378
|
-
)
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Re-export types
|
|
382
|
-
export type { SliderState, SliderOrientation } from '@proyecto-viviana/solid-stately'
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ToggleSwitch component for proyecto-viviana-ui
|
|
3
|
-
*
|
|
4
|
-
* A styled switch component built on top of solidaria-components.
|
|
5
|
-
* This component only handles styling - all behavior and accessibility
|
|
6
|
-
* is provided by the headless Switch from solidaria-components.
|
|
7
|
-
*
|
|
8
|
-
* Named "ToggleSwitch" to avoid conflict with SolidJS's built-in Switch component.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { type JSX, splitProps, mergeProps as solidMergeProps } from 'solid-js';
|
|
12
|
-
import { ToggleSwitch as HeadlessToggleSwitch, type ToggleSwitchProps as HeadlessToggleSwitchProps, type ToggleSwitchRenderProps } from '@proyecto-viviana/solidaria-components';
|
|
13
|
-
|
|
14
|
-
// ============================================
|
|
15
|
-
// TYPES
|
|
16
|
-
// ============================================
|
|
17
|
-
|
|
18
|
-
export type SwitchSize = 'sm' | 'md' | 'lg';
|
|
19
|
-
|
|
20
|
-
export interface ToggleSwitchProps extends Omit<HeadlessToggleSwitchProps, 'class' | 'children'> {
|
|
21
|
-
/** The size of the switch. */
|
|
22
|
-
size?: SwitchSize;
|
|
23
|
-
/** Additional CSS class name. */
|
|
24
|
-
class?: string;
|
|
25
|
-
/** Label text for the switch. */
|
|
26
|
-
children?: JSX.Element;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// ============================================
|
|
30
|
-
// STYLES
|
|
31
|
-
// ============================================
|
|
32
|
-
|
|
33
|
-
const sizeStyles = {
|
|
34
|
-
sm: {
|
|
35
|
-
track: 'h-5 w-9',
|
|
36
|
-
thumb: 'h-4 w-4',
|
|
37
|
-
translate: 'translate-x-4',
|
|
38
|
-
},
|
|
39
|
-
md: {
|
|
40
|
-
track: 'h-6 w-11',
|
|
41
|
-
thumb: 'h-5 w-5',
|
|
42
|
-
translate: 'translate-x-5',
|
|
43
|
-
},
|
|
44
|
-
lg: {
|
|
45
|
-
track: 'h-7 w-14',
|
|
46
|
-
thumb: 'h-6 w-6',
|
|
47
|
-
translate: 'translate-x-7',
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
// ============================================
|
|
52
|
-
// COMPONENT
|
|
53
|
-
// ============================================
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* A switch allows users to toggle between two mutually exclusive states.
|
|
57
|
-
*
|
|
58
|
-
* Built on solidaria-components Switch for full accessibility support.
|
|
59
|
-
* Named "ToggleSwitch" to avoid conflict with SolidJS's built-in Switch component.
|
|
60
|
-
*/
|
|
61
|
-
export function ToggleSwitch(props: ToggleSwitchProps): JSX.Element {
|
|
62
|
-
const defaultProps: Partial<ToggleSwitchProps> = {
|
|
63
|
-
size: 'md',
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const merged = solidMergeProps(defaultProps, props);
|
|
67
|
-
|
|
68
|
-
const [local, headlessProps] = splitProps(merged, [
|
|
69
|
-
'size',
|
|
70
|
-
'class',
|
|
71
|
-
]);
|
|
72
|
-
|
|
73
|
-
const size = () => sizeStyles[local.size!];
|
|
74
|
-
|
|
75
|
-
// Generate class based on render props
|
|
76
|
-
const getClassName = (renderProps: ToggleSwitchRenderProps): string => {
|
|
77
|
-
const base = 'inline-flex items-center gap-2 cursor-pointer';
|
|
78
|
-
const disabledClass = renderProps.isDisabled ? 'cursor-not-allowed opacity-50' : '';
|
|
79
|
-
const custom = local.class || '';
|
|
80
|
-
return [base, disabledClass, custom].filter(Boolean).join(' ');
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
return (
|
|
84
|
-
<HeadlessToggleSwitch
|
|
85
|
-
{...headlessProps}
|
|
86
|
-
class={getClassName}
|
|
87
|
-
>
|
|
88
|
-
{(renderProps: ToggleSwitchRenderProps) => (
|
|
89
|
-
<>
|
|
90
|
-
<span
|
|
91
|
-
class={[
|
|
92
|
-
'relative rounded-full transition-colors duration-200',
|
|
93
|
-
'focus-within:ring-2 focus-within:ring-accent-300 focus-within:ring-offset-2 focus-within:ring-offset-bg-400',
|
|
94
|
-
size().track,
|
|
95
|
-
renderProps.isSelected ? 'bg-accent' : 'bg-bg-300',
|
|
96
|
-
renderProps.isDisabled ? 'cursor-not-allowed' : 'cursor-pointer',
|
|
97
|
-
].join(' ')}
|
|
98
|
-
>
|
|
99
|
-
<span
|
|
100
|
-
class={[
|
|
101
|
-
'absolute top-0.5 left-0.5 rounded-full bg-white shadow transition-transform duration-200',
|
|
102
|
-
size().thumb,
|
|
103
|
-
renderProps.isSelected ? size().translate : 'translate-x-0',
|
|
104
|
-
].join(' ')}
|
|
105
|
-
/>
|
|
106
|
-
</span>
|
|
107
|
-
{props.children && <span class="text-primary-200">{props.children}</span>}
|
|
108
|
-
</>
|
|
109
|
-
)}
|
|
110
|
-
</HeadlessToggleSwitch>
|
|
111
|
-
);
|
|
112
|
-
}
|
package/src/switch/index.tsx
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Switch components for proyecto-viviana-ui
|
|
3
|
-
*
|
|
4
|
-
* This file exports:
|
|
5
|
-
* - ToggleSwitch: The primary switch component built on solidaria-components
|
|
6
|
-
* (named to avoid conflict with SolidJS's built-in Switch)
|
|
7
|
-
* - TabSwitch: A custom two-option tab selector
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { type JSX, createSignal, createEffect } from 'solid-js'
|
|
11
|
-
|
|
12
|
-
// Re-export ToggleSwitch (the solidaria-components based switch)
|
|
13
|
-
export { ToggleSwitch, type ToggleSwitchProps, type SwitchSize } from './ToggleSwitch'
|
|
14
|
-
|
|
15
|
-
// ============================================
|
|
16
|
-
// TAB SWITCH (Two-option selector)
|
|
17
|
-
// ============================================
|
|
18
|
-
|
|
19
|
-
interface SwitchOption {
|
|
20
|
-
label: string
|
|
21
|
-
value: string
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface TabSwitchProps {
|
|
25
|
-
options: SwitchOption[]
|
|
26
|
-
value?: string
|
|
27
|
-
onChange?: (value: string) => void
|
|
28
|
-
class?: string
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* A tab-style switch that allows users to select between two options.
|
|
33
|
-
* This is a custom component, not based on solidaria/react-aria.
|
|
34
|
-
*/
|
|
35
|
-
export function TabSwitch(props: TabSwitchProps): JSX.Element {
|
|
36
|
-
const [leftSelected, setLeftSelected] = createSignal(
|
|
37
|
-
props.value ? props.value === props.options[0]?.value : true
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
createEffect(() => {
|
|
41
|
-
if (props.value !== undefined) {
|
|
42
|
-
setLeftSelected(props.value === props.options[0]?.value)
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
const toggle = () => {
|
|
47
|
-
const newLeftSelected = !leftSelected()
|
|
48
|
-
setLeftSelected(newLeftSelected)
|
|
49
|
-
const newValue = newLeftSelected ? props.options[0]?.value : props.options[1]?.value
|
|
50
|
-
if (newValue) {
|
|
51
|
-
props.onChange?.(newValue)
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const leftSelectedStyle = 'left-0 w-[142px] border-l-2'
|
|
56
|
-
const rightSelectedStyle = 'left-[142px] w-[108px] border-r-2'
|
|
57
|
-
const textSelected = 'font-extrabold text-primary-300'
|
|
58
|
-
const textUnselected = 'font-medium text-primary-600 tracking-wider'
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<div
|
|
62
|
-
onClick={toggle}
|
|
63
|
-
class={`relative bg-bg-400 rounded-full w-[250px] cursor-pointer ${props.class ?? ''}`}
|
|
64
|
-
>
|
|
65
|
-
<div
|
|
66
|
-
class={`${
|
|
67
|
-
leftSelected() ? leftSelectedStyle : rightSelectedStyle
|
|
68
|
-
} transition-all duration-500 ease-in-out z-0 absolute bg-primary-600 rounded-full h-8 border-accent-300`}
|
|
69
|
-
/>
|
|
70
|
-
<div class="flex z-10 h-8 justify-around">
|
|
71
|
-
<button
|
|
72
|
-
type="button"
|
|
73
|
-
class={`${
|
|
74
|
-
leftSelected() ? textSelected : textUnselected
|
|
75
|
-
} transition-all ease-in-out duration-500 z-10 text-lg flex justify-center items-center pointer-events-none`}
|
|
76
|
-
>
|
|
77
|
-
<span>{props.options[0]?.label ?? 'TENDENCIAS'}</span>
|
|
78
|
-
</button>
|
|
79
|
-
<button
|
|
80
|
-
type="button"
|
|
81
|
-
class={`${
|
|
82
|
-
leftSelected() ? textUnselected : textSelected
|
|
83
|
-
} transition-all ease-in-out duration-500 z-10 text-lg flex justify-center items-center pointer-events-none`}
|
|
84
|
-
>
|
|
85
|
-
<span>{props.options[1]?.label ?? 'ÚLTIMOS'}</span>
|
|
86
|
-
</button>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
)
|
|
90
|
-
}
|