@mari-ui/components 0.1.1 → 0.2.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/dist/accordion.js +4 -4
- package/dist/accordion.js.map +1 -1
- package/dist/alert.js +5 -5
- package/dist/alert.js.map +1 -1
- package/dist/autocomplete.js +8 -8
- package/dist/autocomplete.js.map +1 -1
- package/dist/avatar.js +3 -3
- package/dist/badge.js +3 -3
- package/dist/breadcrumb.js +9 -9
- package/dist/breadcrumb.js.map +1 -1
- package/dist/button.js +4 -4
- package/dist/calendar.js +14 -14
- package/dist/calendar.js.map +1 -1
- package/dist/card.js +4 -4
- package/dist/card.js.map +1 -1
- package/dist/carousel.js +4 -4
- package/dist/carousel.js.map +1 -1
- package/dist/chart.js +5 -5
- package/dist/chart.js.map +1 -1
- package/dist/checkbox.js +4 -4
- package/dist/{chunk-BDV4GOEN.js → chunk-5GILG5AK.js} +1 -1
- package/dist/chunk-5GILG5AK.js.map +1 -0
- package/dist/{chunk-IP2J3BWY.js → chunk-6AMBZXZJ.js} +1 -1
- package/dist/chunk-6AMBZXZJ.js.map +1 -0
- package/dist/{chunk-XUKVQO6M.js → chunk-6CSUVVFG.js} +1 -1
- package/dist/chunk-6CSUVVFG.js.map +1 -0
- package/dist/{chunk-ELHESRRH.js → chunk-7FQQRTPX.js} +5 -5
- package/dist/chunk-7FQQRTPX.js.map +1 -0
- package/dist/{chunk-QNOHFHVL.js → chunk-7WB4CDWX.js} +4 -4
- package/dist/chunk-7WB4CDWX.js.map +1 -0
- package/dist/{chunk-47FHUOLT.js → chunk-BLFY5UAL.js} +1 -1
- package/dist/chunk-BLFY5UAL.js.map +1 -0
- package/dist/{chunk-CYLXW66E.js → chunk-C3QWJFSE.js} +2 -2
- package/dist/chunk-C3QWJFSE.js.map +1 -0
- package/dist/{chunk-QDFDMWXD.js → chunk-CNWRDTEW.js} +7 -7
- package/dist/chunk-CNWRDTEW.js.map +1 -0
- package/dist/{chunk-2IEXY3OZ.js → chunk-CVKAGR3D.js} +4 -4
- package/dist/{chunk-LZHERDNB.js → chunk-CXIWRNSP.js} +5 -5
- package/dist/chunk-CXIWRNSP.js.map +1 -0
- package/dist/{chunk-FNJHS5KQ.js → chunk-E5JTEQ4V.js} +6 -6
- package/dist/chunk-E5JTEQ4V.js.map +1 -0
- package/dist/{chunk-IO4346TF.js → chunk-FC7T3INX.js} +8 -8
- package/dist/chunk-FC7T3INX.js.map +1 -0
- package/dist/{chunk-KCYM2JXP.js → chunk-FWSMUUZ5.js} +5 -5
- package/dist/chunk-FWSMUUZ5.js.map +1 -0
- package/dist/{chunk-3ABWBQCS.js → chunk-GTNCXOUL.js} +2 -2
- package/dist/chunk-GTNCXOUL.js.map +1 -0
- package/dist/{chunk-ZLPAXPDI.js → chunk-GVJ4M63W.js} +3 -3
- package/dist/{chunk-ZLPAXPDI.js.map → chunk-GVJ4M63W.js.map} +1 -1
- package/dist/{chunk-LBXIPDAB.js → chunk-JXD5DW6E.js} +3 -3
- package/dist/chunk-JXD5DW6E.js.map +1 -0
- package/dist/{chunk-P7Z5BREP.js → chunk-L6DBWUAB.js} +6 -6
- package/dist/chunk-L6DBWUAB.js.map +1 -0
- package/dist/{chunk-YZ7MDC6B.js → chunk-LNL4TCGL.js} +2 -2
- package/dist/chunk-LNL4TCGL.js.map +1 -0
- package/dist/{chunk-TCYDVNSU.js → chunk-MT4VH7QV.js} +1 -1
- package/dist/chunk-MT4VH7QV.js.map +1 -0
- package/dist/{chunk-DKENCYHA.js → chunk-MXGY2ENX.js} +1 -1
- package/dist/chunk-MXGY2ENX.js.map +1 -0
- package/dist/{chunk-DUCIAQGR.js → chunk-NENNFQEY.js} +3 -3
- package/dist/chunk-NENNFQEY.js.map +1 -0
- package/dist/{chunk-LBQMEHK6.js → chunk-NPFMPRII.js} +1 -1
- package/dist/chunk-NPFMPRII.js.map +1 -0
- package/dist/{chunk-NS7FKOFI.js → chunk-NYXU5EFE.js} +1 -1
- package/dist/chunk-NYXU5EFE.js.map +1 -0
- package/dist/{chunk-S66GKX2W.js → chunk-OAWUZIIN.js} +1 -1
- package/dist/chunk-OAWUZIIN.js.map +1 -0
- package/dist/{chunk-JNZODUXP.js → chunk-OYDG6C54.js} +1 -1
- package/dist/chunk-OYDG6C54.js.map +1 -0
- package/dist/{chunk-FFXRFQSU.js → chunk-POBOJBNJ.js} +1 -1
- package/dist/chunk-POBOJBNJ.js.map +1 -0
- package/dist/{chunk-RIBB5OJV.js → chunk-PR2MCHU4.js} +4 -4
- package/dist/chunk-PR2MCHU4.js.map +1 -0
- package/dist/{chunk-LEOIKO7C.js → chunk-RLWP6NJU.js} +4 -4
- package/dist/chunk-RLWP6NJU.js.map +1 -0
- package/dist/{chunk-V7KDUUV6.js → chunk-RMNV2CE2.js} +2 -2
- package/dist/chunk-RMNV2CE2.js.map +1 -0
- package/dist/{chunk-ZXYQ2ZPR.js → chunk-TEMTIMAH.js} +3 -3
- package/dist/chunk-TEMTIMAH.js.map +1 -0
- package/dist/{chunk-NPM7IDYV.js → chunk-TSFAAREV.js} +3 -3
- package/dist/chunk-TSFAAREV.js.map +1 -0
- package/dist/{chunk-54HHEXXD.js → chunk-VKN374SD.js} +1 -1
- package/dist/chunk-VKN374SD.js.map +1 -0
- package/dist/{chunk-ZMA7BT2L.js → chunk-XWBJPA3D.js} +4 -4
- package/dist/{chunk-ZMA7BT2L.js.map → chunk-XWBJPA3D.js.map} +1 -1
- package/dist/{chunk-QZRBO7BE.js → chunk-Z4KFHRDW.js} +9 -9
- package/dist/chunk-Z4KFHRDW.js.map +1 -0
- package/dist/{chunk-TXRQCHOR.js → chunk-ZAR3SCPV.js} +5 -5
- package/dist/chunk-ZAR3SCPV.js.map +1 -0
- package/dist/color-picker.js +19 -19
- package/dist/date-picker.js +10 -10
- package/dist/date-picker.js.map +1 -1
- package/dist/divider.js +2 -2
- package/dist/divider.js.map +1 -1
- package/dist/drawer.js +7 -7
- package/dist/dropdown.js +7 -7
- package/dist/empty.js +5 -5
- package/dist/field.js +2 -2
- package/dist/field.js.map +1 -1
- package/dist/float-button.js +6 -6
- package/dist/float-button.js.map +1 -1
- package/dist/image.js +8 -8
- package/dist/image.js.map +1 -1
- package/dist/input-number.js +6 -6
- package/dist/input.js +8 -8
- package/dist/list.js +12 -12
- package/dist/list.js.map +1 -1
- package/dist/loading.js +1 -1
- package/dist/logo.js.map +1 -1
- package/dist/mari.css +8 -2
- package/dist/masonry.js +5 -5
- package/dist/masonry.js.map +1 -1
- package/dist/menu.js +10 -10
- package/dist/menu.js.map +1 -1
- package/dist/modal.js +8 -8
- package/dist/modal.js.map +1 -1
- package/dist/pagination.js +5 -5
- package/dist/popconfirm.js +13 -13
- package/dist/popconfirm.js.map +1 -1
- package/dist/popover.js +10 -10
- package/dist/progress.js +2 -2
- package/dist/progress.js.map +1 -1
- package/dist/qrcode.js +1 -1
- package/dist/qrcode.js.map +1 -1
- package/dist/radio.js +4 -4
- package/dist/radio.js.map +1 -1
- package/dist/rate.js +2 -2
- package/dist/rate.js.map +1 -1
- package/dist/segmented.js +4 -4
- package/dist/select.js +11 -11
- package/dist/skeleton.js +3 -3
- package/dist/slider.js +8 -8
- package/dist/slider.js.map +1 -1
- package/dist/splitter.js.map +1 -1
- package/dist/statistic.js +7 -7
- package/dist/statistic.js.map +1 -1
- package/dist/steps.js +4 -4
- package/dist/steps.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/switch.js +2 -2
- package/dist/switch.js.map +1 -1
- package/dist/table.js +19 -19
- package/dist/table.js.map +1 -1
- package/dist/tabs.js +2 -2
- package/dist/tabs.js.map +1 -1
- package/dist/tag.js +3 -3
- package/dist/theme-customizer.js +19 -19
- package/dist/theme-customizer.js.map +1 -1
- package/dist/timeline.js +5 -5
- package/dist/timeline.js.map +1 -1
- package/dist/toast.js +7 -7
- package/dist/tooltip.js +4 -4
- package/dist/tour.js +12 -12
- package/dist/tour.js.map +1 -1
- package/dist/transfer.js +11 -11
- package/dist/transfer.js.map +1 -1
- package/dist/tree-select.js +12 -12
- package/dist/tree-select.js.map +1 -1
- package/dist/tree.js +5 -5
- package/dist/types/accordion/Accordion.d.ts +1 -3
- package/dist/types/accordion/Accordion.d.ts.map +1 -1
- package/dist/types/alert/Alert.d.ts +0 -1
- package/dist/types/alert/Alert.d.ts.map +1 -1
- package/dist/types/autocomplete/AutoComplete.d.ts +2 -2
- package/dist/types/autocomplete/utils.d.ts +0 -8
- package/dist/types/autocomplete/utils.d.ts.map +1 -1
- package/dist/types/avatar/utils.d.ts +1 -1
- package/dist/types/badge/Badge.d.ts +0 -3
- package/dist/types/badge/Badge.d.ts.map +1 -1
- package/dist/types/breadcrumb/Breadcrumb.d.ts +1 -12
- package/dist/types/breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/types/breadcrumb/utils.d.ts +0 -7
- package/dist/types/breadcrumb/utils.d.ts.map +1 -1
- package/dist/types/button/types.d.ts +1 -9
- package/dist/types/button/types.d.ts.map +1 -1
- package/dist/types/calendar/Calendar.d.ts +3 -4
- package/dist/types/calendar/Calendar.d.ts.map +1 -1
- package/dist/types/calendar/_components/CalendarPanel.d.ts +1 -2
- package/dist/types/calendar/_components/CalendarPanel.d.ts.map +1 -1
- package/dist/types/calendar/_components/DayGrid.d.ts +1 -1
- package/dist/types/calendar/types.d.ts +1 -1
- package/dist/types/calendar/types.d.ts.map +1 -1
- package/dist/types/card/Card.d.ts +3 -4
- package/dist/types/card/Card.d.ts.map +1 -1
- package/dist/types/card/types.d.ts +1 -1
- package/dist/types/carousel/types.d.ts +4 -10
- package/dist/types/carousel/types.d.ts.map +1 -1
- package/dist/types/carousel/utils.d.ts +0 -11
- package/dist/types/carousel/utils.d.ts.map +1 -1
- package/dist/types/chart/_shared/paths.d.ts +1 -1
- package/dist/types/chart/_shared/scale.d.ts +1 -2
- package/dist/types/chart/_shared/scale.d.ts.map +1 -1
- package/dist/types/chart/bar-chart/BarChart.d.ts +1 -1
- package/dist/types/chart/gauge/Gauge.d.ts +1 -1
- package/dist/types/chart/line-chart/LineChart.d.ts +2 -2
- package/dist/types/chart/pie-chart/PieChart.d.ts +1 -1
- package/dist/types/chart/sparkline/Sparkline.d.ts +1 -1
- package/dist/types/checkbox/utils.d.ts.map +1 -1
- package/dist/types/color-picker/ColorPicker.d.ts +0 -6
- package/dist/types/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/types/color-picker/_components/ColorPresets.d.ts +1 -1
- package/dist/types/color-picker/_components/ColorPresets.d.ts.map +1 -1
- package/dist/types/color-picker/utils.d.ts +1 -1
- package/dist/types/date-picker/DatePicker.d.ts +0 -6
- package/dist/types/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/types/date-picker/TimePicker.d.ts +1 -1
- package/dist/types/date-picker/_components/TimePanel.d.ts.map +1 -1
- package/dist/types/date-picker/utils.d.ts +1 -1
- package/dist/types/date-picker/utils.d.ts.map +1 -1
- package/dist/types/divider/Divider.d.ts +1 -1
- package/dist/types/divider/types.d.ts +2 -4
- package/dist/types/divider/types.d.ts.map +1 -1
- package/dist/types/drawer/Drawer.d.ts +5 -6
- package/dist/types/drawer/Drawer.d.ts.map +1 -1
- package/dist/types/dropdown/_components/DropdownContent.d.ts +1 -1
- package/dist/types/dropdown/_components/DropdownItem.d.ts +0 -5
- package/dist/types/dropdown/_components/DropdownItem.d.ts.map +1 -1
- package/dist/types/dropdown/types.d.ts +1 -1
- package/dist/types/dropdown/useDropdown.d.ts +0 -16
- package/dist/types/dropdown/useDropdown.d.ts.map +1 -1
- package/dist/types/dropdown/utils.d.ts +1 -1
- package/dist/types/empty/Empty.d.ts +1 -6
- package/dist/types/empty/Empty.d.ts.map +1 -1
- package/dist/types/field/Field.d.ts +1 -5
- package/dist/types/field/Field.d.ts.map +1 -1
- package/dist/types/float-button/BackTop.d.ts +1 -1
- package/dist/types/float-button/FloatButton.d.ts +0 -5
- package/dist/types/float-button/FloatButton.d.ts.map +1 -1
- package/dist/types/float-button/FloatButtonGroup.d.ts +1 -1
- package/dist/types/float-button/utils.d.ts +1 -1
- package/dist/types/foundations/usePersonaTheme.d.ts +1 -1
- package/dist/types/image/Image.d.ts +0 -6
- package/dist/types/image/Image.d.ts.map +1 -1
- package/dist/types/image/ImageGallery.d.ts +1 -1
- package/dist/types/image/ImageViewer.d.ts +1 -1
- package/dist/types/image/galleryUtils.d.ts +1 -1
- package/dist/types/input/SearchInput.d.ts +1 -6
- package/dist/types/input/SearchInput.d.ts.map +1 -1
- package/dist/types/input/Textarea.d.ts +2 -6
- package/dist/types/input/Textarea.d.ts.map +1 -1
- package/dist/types/input/mention/types.d.ts +1 -2
- package/dist/types/input/mention/types.d.ts.map +1 -1
- package/dist/types/input/types.d.ts +3 -15
- package/dist/types/input/types.d.ts.map +1 -1
- package/dist/types/input/utils.d.ts +1 -26
- package/dist/types/input/utils.d.ts.map +1 -1
- package/dist/types/input-number/InputNumber.d.ts +0 -2
- package/dist/types/input-number/InputNumber.d.ts.map +1 -1
- package/dist/types/input-number/utils.d.ts +1 -1
- package/dist/types/lib/ContentSkeleton.d.ts +1 -1
- package/dist/types/lib/FloatingArrow.d.ts +0 -10
- package/dist/types/lib/FloatingArrow.d.ts.map +1 -1
- package/dist/types/lib/SkeletonDemo.d.ts +1 -1
- package/dist/types/lib/SkeletonSlot.d.ts +1 -1
- package/dist/types/lib/colorClasses.d.ts +1 -7
- package/dist/types/lib/colorClasses.d.ts.map +1 -1
- package/dist/types/lib/date/index.d.ts +1 -1
- package/dist/types/lib/elevationClass.d.ts +0 -8
- package/dist/types/lib/elevationClass.d.ts.map +1 -1
- package/dist/types/lib/fieldContext.d.ts +1 -1
- package/dist/types/lib/floating.d.ts +2 -7
- package/dist/types/lib/floating.d.ts.map +1 -1
- package/dist/types/lib/infiniteScroll.d.ts +1 -1
- package/dist/types/lib/linkBehavior.d.ts +1 -1
- package/dist/types/lib/overlay.d.ts +0 -7
- package/dist/types/lib/overlay.d.ts.map +1 -1
- package/dist/types/lib/sizeClasses.d.ts +2 -2
- package/dist/types/lib/skeleton.d.ts +1 -1
- package/dist/types/lib/storyMeta.d.ts +7 -28
- package/dist/types/lib/storyMeta.d.ts.map +1 -1
- package/dist/types/lib/storybookArgTypes.d.ts +1 -1
- package/dist/types/lib/useFloatingPosition.d.ts +1 -1
- package/dist/types/list/List.d.ts +0 -4
- package/dist/types/list/List.d.ts.map +1 -1
- package/dist/types/loading/Loading.d.ts.map +1 -1
- package/dist/types/loading/types.d.ts +2 -5
- package/dist/types/loading/types.d.ts.map +1 -1
- package/dist/types/loading/utils.d.ts +0 -5
- package/dist/types/loading/utils.d.ts.map +1 -1
- package/dist/types/masonry/Masonry.d.ts +0 -4
- package/dist/types/masonry/Masonry.d.ts.map +1 -1
- package/dist/types/menu/_shared/MenuLink.d.ts +0 -4
- package/dist/types/menu/_shared/MenuLink.d.ts.map +1 -1
- package/dist/types/menu/_shared/MobileNav.d.ts +0 -6
- package/dist/types/menu/_shared/MobileNav.d.ts.map +1 -1
- package/dist/types/menu/_shared/NavBar.d.ts +0 -8
- package/dist/types/menu/_shared/NavBar.d.ts.map +1 -1
- package/dist/types/menu/basic-menu/BasicMenu.d.ts +2 -16
- package/dist/types/menu/basic-menu/BasicMenu.d.ts.map +1 -1
- package/dist/types/menu/mega-menu/MegaMenu.d.ts +0 -8
- package/dist/types/menu/mega-menu/MegaMenu.d.ts.map +1 -1
- package/dist/types/menu/mega-menu/_components/MegaMenuItem.d.ts +0 -12
- package/dist/types/menu/mega-menu/_components/MegaMenuItem.d.ts.map +1 -1
- package/dist/types/menu/sidebar/Sidebar.d.ts +1 -16
- package/dist/types/menu/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/types/menu/sidebar/_components/SidebarButton.d.ts +0 -6
- package/dist/types/menu/sidebar/_components/SidebarButton.d.ts.map +1 -1
- package/dist/types/menu/sidebar/_components/SidebarItem.d.ts +0 -10
- package/dist/types/menu/sidebar/_components/SidebarItem.d.ts.map +1 -1
- package/dist/types/menu/sidebar/_components/SidebarMenu.d.ts +0 -4
- package/dist/types/menu/sidebar/_components/SidebarMenu.d.ts.map +1 -1
- package/dist/types/menu/types.d.ts +2 -11
- package/dist/types/menu/types.d.ts.map +1 -1
- package/dist/types/menu/utils.d.ts +0 -22
- package/dist/types/menu/utils.d.ts.map +1 -1
- package/dist/types/modal/Modal.d.ts +1 -12
- package/dist/types/modal/Modal.d.ts.map +1 -1
- package/dist/types/modal/types.d.ts +3 -4
- package/dist/types/modal/types.d.ts.map +1 -1
- package/dist/types/modal/utils.d.ts +1 -5
- package/dist/types/modal/utils.d.ts.map +1 -1
- package/dist/types/pagination/Pagination.d.ts +2 -11
- package/dist/types/pagination/Pagination.d.ts.map +1 -1
- package/dist/types/pagination/types.d.ts +1 -1
- package/dist/types/pagination/types.d.ts.map +1 -1
- package/dist/types/pagination/utils.d.ts +5 -12
- package/dist/types/pagination/utils.d.ts.map +1 -1
- package/dist/types/popconfirm/Popconfirm.d.ts +0 -4
- package/dist/types/popconfirm/Popconfirm.d.ts.map +1 -1
- package/dist/types/popover/Popover.d.ts +0 -5
- package/dist/types/popover/Popover.d.ts.map +1 -1
- package/dist/types/progress/Progress.d.ts +0 -3
- package/dist/types/progress/Progress.d.ts.map +1 -1
- package/dist/types/qrcode/QRCode.d.ts +0 -6
- package/dist/types/qrcode/QRCode.d.ts.map +1 -1
- package/dist/types/radio/utils.d.ts +1 -1
- package/dist/types/segmented/Segmented.d.ts +0 -4
- package/dist/types/segmented/Segmented.d.ts.map +1 -1
- package/dist/types/select/Select.d.ts +0 -5
- package/dist/types/select/Select.d.ts.map +1 -1
- package/dist/types/select/_components/SelectPanel.d.ts +2 -3
- package/dist/types/select/_components/SelectPanel.d.ts.map +1 -1
- package/dist/types/select/types.d.ts +1 -1
- package/dist/types/select/types.d.ts.map +1 -1
- package/dist/types/skeleton/utils.d.ts.map +1 -1
- package/dist/types/slider/Slider.d.ts.map +1 -1
- package/dist/types/slider/utils.d.ts +0 -1
- package/dist/types/slider/utils.d.ts.map +1 -1
- package/dist/types/splitter/Splitter.d.ts +4 -4
- package/dist/types/statistic/Statistic.d.ts +1 -1
- package/dist/types/statistic/utils.d.ts +2 -4
- package/dist/types/statistic/utils.d.ts.map +1 -1
- package/dist/types/steps/Steps.d.ts.map +1 -1
- package/dist/types/steps/_components/StepsContent.d.ts +1 -10
- package/dist/types/steps/_components/StepsContent.d.ts.map +1 -1
- package/dist/types/steps/types.d.ts +1 -1
- package/dist/types/steps/types.d.ts.map +1 -1
- package/dist/types/steps/utils.d.ts +0 -9
- package/dist/types/steps/utils.d.ts.map +1 -1
- package/dist/types/switch/Switch.d.ts +1 -9
- package/dist/types/switch/Switch.d.ts.map +1 -1
- package/dist/types/switch/utils.d.ts.map +1 -1
- package/dist/types/table/Table.d.ts +7 -11
- package/dist/types/table/Table.d.ts.map +1 -1
- package/dist/types/table/_components/TableBody.d.ts.map +1 -1
- package/dist/types/table/_components/TableEditDrawer.d.ts +0 -8
- package/dist/types/table/_components/TableEditDrawer.d.ts.map +1 -1
- package/dist/types/table/_components/TableHeader.d.ts +0 -7
- package/dist/types/table/_components/TableHeader.d.ts.map +1 -1
- package/dist/types/table/_components/TableInfoValue.d.ts +0 -10
- package/dist/types/table/_components/TableInfoValue.d.ts.map +1 -1
- package/dist/types/table/_components/TablePagination.d.ts +0 -12
- package/dist/types/table/_components/TablePagination.d.ts.map +1 -1
- package/dist/types/table/_components/TableRowActions.d.ts +0 -6
- package/dist/types/table/_components/TableRowActions.d.ts.map +1 -1
- package/dist/types/table/types.d.ts +2 -18
- package/dist/types/table/types.d.ts.map +1 -1
- package/dist/types/table/utils.d.ts +1 -7
- package/dist/types/table/utils.d.ts.map +1 -1
- package/dist/types/tabs/Tabs.d.ts +0 -1
- package/dist/types/tabs/Tabs.d.ts.map +1 -1
- package/dist/types/tabs/_components/TabsContent.d.ts +0 -5
- package/dist/types/tabs/_components/TabsContent.d.ts.map +1 -1
- package/dist/types/tabs/_components/TabsList.d.ts +6 -6
- package/dist/types/tabs/_components/TabsTrigger.d.ts +1 -1
- package/dist/types/tabs/utils.d.ts +0 -5
- package/dist/types/tabs/utils.d.ts.map +1 -1
- package/dist/types/tag/utils.d.ts +0 -8
- package/dist/types/tag/utils.d.ts.map +1 -1
- package/dist/types/theme-customizer/ThemeCustomizer.d.ts +1 -1
- package/dist/types/timeline/Timeline.d.ts +1 -3
- package/dist/types/timeline/Timeline.d.ts.map +1 -1
- package/dist/types/toast/Toast.d.ts +2 -2
- package/dist/types/toast/useToast.d.ts +2 -4
- package/dist/types/toast/useToast.d.ts.map +1 -1
- package/dist/types/toast/utils.d.ts +0 -1
- package/dist/types/toast/utils.d.ts.map +1 -1
- package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/tooltip/utils.d.ts +0 -6
- package/dist/types/tooltip/utils.d.ts.map +1 -1
- package/dist/types/tour/Tour.d.ts +0 -6
- package/dist/types/tour/Tour.d.ts.map +1 -1
- package/dist/types/tour/utils.d.ts +1 -1
- package/dist/types/tour/utils.d.ts.map +1 -1
- package/dist/types/transfer/Transfer.d.ts +0 -5
- package/dist/types/transfer/Transfer.d.ts.map +1 -1
- package/dist/types/transfer/utils.d.ts +1 -3
- package/dist/types/transfer/utils.d.ts.map +1 -1
- package/dist/types/tree/Tree.d.ts +0 -6
- package/dist/types/tree/Tree.d.ts.map +1 -1
- package/dist/types/tree/utils.d.ts +1 -1
- package/dist/types/tree-select/TreeSelect.d.ts +0 -6
- package/dist/types/tree-select/TreeSelect.d.ts.map +1 -1
- package/dist/types/tree-select/_components/TreeSelectPanel.d.ts +1 -1
- package/dist/types/tree-select/utils.d.ts +1 -1
- package/dist/types/typography/utils.d.ts.map +1 -1
- package/dist/types/upload/_components/List.d.ts +0 -7
- package/dist/types/upload/_components/List.d.ts.map +1 -1
- package/dist/types/upload/_components/ReviewList.d.ts +0 -8
- package/dist/types/upload/_components/ReviewList.d.ts.map +1 -1
- package/dist/types/upload/_components/UploadDragDropButton.d.ts +0 -8
- package/dist/types/upload/_components/UploadDragDropButton.d.ts.map +1 -1
- package/dist/types/upload/_components/UploadReviewButton.d.ts +0 -5
- package/dist/types/upload/_components/UploadReviewButton.d.ts.map +1 -1
- package/dist/types/upload/types.d.ts +5 -8
- package/dist/types/upload/types.d.ts.map +1 -1
- package/dist/types/upload/useUpload.d.ts +0 -10
- package/dist/types/upload/useUpload.d.ts.map +1 -1
- package/dist/types/upload/utils.d.ts +0 -4
- package/dist/types/upload/utils.d.ts.map +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/typography.js +2 -2
- package/dist/typography.js.map +1 -1
- package/dist/upload.js +8 -8
- package/dist/upload.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-3ABWBQCS.js.map +0 -1
- package/dist/chunk-47FHUOLT.js.map +0 -1
- package/dist/chunk-54HHEXXD.js.map +0 -1
- package/dist/chunk-BDV4GOEN.js.map +0 -1
- package/dist/chunk-CYLXW66E.js.map +0 -1
- package/dist/chunk-DKENCYHA.js.map +0 -1
- package/dist/chunk-DUCIAQGR.js.map +0 -1
- package/dist/chunk-ELHESRRH.js.map +0 -1
- package/dist/chunk-FFXRFQSU.js.map +0 -1
- package/dist/chunk-FNJHS5KQ.js.map +0 -1
- package/dist/chunk-IO4346TF.js.map +0 -1
- package/dist/chunk-IP2J3BWY.js.map +0 -1
- package/dist/chunk-JNZODUXP.js.map +0 -1
- package/dist/chunk-KCYM2JXP.js.map +0 -1
- package/dist/chunk-LBQMEHK6.js.map +0 -1
- package/dist/chunk-LBXIPDAB.js.map +0 -1
- package/dist/chunk-LEOIKO7C.js.map +0 -1
- package/dist/chunk-LZHERDNB.js.map +0 -1
- package/dist/chunk-NPM7IDYV.js.map +0 -1
- package/dist/chunk-NS7FKOFI.js.map +0 -1
- package/dist/chunk-P7Z5BREP.js.map +0 -1
- package/dist/chunk-QDFDMWXD.js.map +0 -1
- package/dist/chunk-QNOHFHVL.js.map +0 -1
- package/dist/chunk-QZRBO7BE.js.map +0 -1
- package/dist/chunk-RIBB5OJV.js.map +0 -1
- package/dist/chunk-S66GKX2W.js.map +0 -1
- package/dist/chunk-TCYDVNSU.js.map +0 -1
- package/dist/chunk-TXRQCHOR.js.map +0 -1
- package/dist/chunk-V7KDUUV6.js.map +0 -1
- package/dist/chunk-XUKVQO6M.js.map +0 -1
- package/dist/chunk-YZ7MDC6B.js.map +0 -1
- package/dist/chunk-ZXYQ2ZPR.js.map +0 -1
- /package/dist/{chunk-2IEXY3OZ.js.map → chunk-CVKAGR3D.js.map} +0 -0
package/dist/tag.js
CHANGED
package/dist/theme-customizer.js
CHANGED
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
ColorPicker
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-Z4KFHRDW.js";
|
|
6
|
+
import "./chunk-CNWRDTEW.js";
|
|
7
|
+
import "./chunk-CXIWRNSP.js";
|
|
8
|
+
import "./chunk-OYDG6C54.js";
|
|
9
|
+
import "./chunk-RMNV2CE2.js";
|
|
10
|
+
import "./chunk-TSFAAREV.js";
|
|
11
|
+
import "./chunk-L6DBWUAB.js";
|
|
12
|
+
import "./chunk-6CSUVVFG.js";
|
|
13
|
+
import "./chunk-OAWUZIIN.js";
|
|
14
14
|
import {
|
|
15
15
|
Segmented
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-RLWP6NJU.js";
|
|
17
|
+
import "./chunk-LNL4TCGL.js";
|
|
18
18
|
import "./chunk-KSPM2Z3T.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-NENNFQEY.js";
|
|
20
|
+
import "./chunk-NPFMPRII.js";
|
|
21
|
+
import "./chunk-GTNCXOUL.js";
|
|
22
|
+
import "./chunk-NYXU5EFE.js";
|
|
23
|
+
import "./chunk-MT4VH7QV.js";
|
|
24
|
+
import "./chunk-POBOJBNJ.js";
|
|
25
|
+
import "./chunk-6AMBZXZJ.js";
|
|
26
26
|
import {
|
|
27
27
|
skeletonBoxProps
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-VKN374SD.js";
|
|
29
29
|
|
|
30
30
|
// src/theme-customizer/ThemeCustomizer.tsx
|
|
31
31
|
import { useEffect, useId } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme-customizer/ThemeCustomizer.tsx","../src/theme-customizer/applyTheme.ts","../src/theme-customizer/index.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useId } from \"react\";\nimport { CheckIcon, MonitorIcon, MoonIcon, SunIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport {\n BLACK,\n WHITE,\n defaultThemeSettings,\n lightTheme,\n pickAccessibleForeground,\n type ColorSchemePreference,\n type HexColor,\n type SpacingDensity,\n type ThemeSettings,\n} from \"@mari-ui/tokens\";\nimport { ColorPicker } from \"../color-picker\";\nimport { Segmented } from \"../segmented\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { applyTheme } from \"./applyTheme\";\nimport type { ThemeAccentOption, ThemeCustomizerProps, ThemeCustomizerSection } from \"./types\";\n\nexport type { ThemeCustomizerProps };\n\nconst ALL_SECTIONS: ThemeCustomizerSection[] = [\"mode\", \"color\", \"spacing\"];\n\n/** Parlak sarı/camgöbeği bilinçli olarak listede: otomatik kontrast düzeltmesi onları zeminde görünür kılar. */\nexport const defaultAccentColors: ThemeAccentOption[] = [\n { value: \"#2563eb\", label: \"Mavi\" },\n { value: \"#0891b2\", label: \"Camgöbeği\" },\n { value: \"#16a34a\", label: \"Yeşil\" },\n { value: \"#eab308\", label: \"Sarı\" },\n { value: \"#ea580c\", label: \"Turuncu\" },\n { value: \"#dc2626\", label: \"Kırmızı\" },\n { value: \"#db2777\", label: \"Pembe\" },\n];\n\n/** Dar yerleşimde (çekmece, <20rem) ikon sarmalayıcısıyla gizlenir — etiket kesilmez, boşluk kalmaz. */\nconst MODE_ICON_RESPONSIVE = \"[&_span:has(>svg)]:hidden @xs:[&_span:has(>svg)]:flex\";\n\nconst MODE_OPTIONS: Array<{ value: ColorSchemePreference; label: string; icon: React.ReactNode }> = [\n { value: \"light\", label: \"Açık\", icon: <SunIcon aria-hidden /> },\n { value: \"dark\", label: \"Koyu\", icon: <MoonIcon aria-hidden /> },\n { value: \"system\", label: \"Sistem\", icon: <MonitorIcon aria-hidden /> },\n];\n\nconst SPACING_OPTIONS: Array<{ value: SpacingDensity; label: string }> = [\n { value: \"compact\", label: \"Sıkı\" },\n { value: \"normal\", label: \"Normal\" },\n { value: \"comfortable\", label: \"Rahat\" },\n];\n\nconst HEX6 = /^#[0-9a-f]{6}$/i;\nconst DEFAULT_SWATCH = lightTheme.color.primary.solid;\n\ninterface SwatchProps {\n name: string;\n color: HexColor;\n label: string;\n checked: boolean;\n disabled: boolean;\n skeleton: boolean | undefined;\n onSelect: () => void;\n}\n\n/** Gerçek radyo düğmesi (ok tuşları, tek Tab durağı tarayıcıdan) + görünen daire. */\nfunction Swatch({ name, color, label, checked, disabled, skeleton, onSelect }: Readonly<SwatchProps>) {\n if (skeleton) return <span {...skeletonBoxProps(\"size-8 rounded-full\")} />;\n return (\n <label\n className={cn(\n \"relative grid size-8 place-items-center rounded-full\",\n \"has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-mari-ring\",\n checked && \"ring-2 ring-mari-foreground ring-offset-2 ring-offset-mari-surface\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n \"pointer-coarse:before:absolute pointer-coarse:before:-inset-1.5\"\n )}\n style={{ backgroundColor: color }}\n title={label}\n >\n <input type=\"radio\" name={name} className=\"sr-only\" checked={checked} disabled={disabled} onChange={onSelect} aria-label={label} />\n {checked && <CheckIcon aria-hidden className=\"size-4\" style={{ color: pickAccessibleForeground(color, [WHITE, BLACK]) }} />}\n </label>\n );\n}\n\n/**\n * Faz 16.8 — son kullanıcının uygulamanın görünümünü kişiselleştirdiği panel:\n * mod (açık/koyu/sistem), vurgu rengi, boşluk yoğunluğu. Kendi tasarımımız\n * (ant referansı yok). Satır içi durur; Popover/Drawer/ayarlar sayfasına\n * yerleştirmek tüketicinin işi.\n *\n * Seçim `applyTheme` ile anında uygulanır (provider yok). Seçilen vurgu rengi\n * zeminde görünür olacak kadar otomatik koyulaştırılır/açılır — kullanıcı\n * bozuk tema üretemez. Örnekte kullanıcının seçtiği renk gösterilir.\n */\nexport function ThemeCustomizer({\n value,\n defaultValue,\n onChange,\n apply = true,\n target,\n sections = ALL_SECTIONS,\n colors = defaultAccentColors,\n allowCustom = false,\n disabled = false,\n skeleton,\n className,\n}: Readonly<ThemeCustomizerProps>) {\n const id = useId();\n const [settings, setSettings] = useControllableState<ThemeSettings>({\n value,\n defaultValue: { ...defaultThemeSettings, ...defaultValue },\n onChange,\n });\n const { mode, primary, spacing } = settings;\n\n useEffect(() => {\n if (!apply) return;\n // Temizlik yok (bilerek): panel kapanınca tema geri alınmamalı.\n applyTheme({ mode, primary, spacing }, target?.current ?? undefined);\n }, [apply, target, mode, primary, spacing]);\n\n const update = (patch: Partial<ThemeSettings>) => setSettings({ ...settings, ...patch });\n const isPreset = !primary || colors.some((c) => c.value.toLowerCase() === primary.toLowerCase());\n const customValue = primary && !isPreset ? primary : null;\n\n const renderSection = (section: ThemeCustomizerSection) => {\n const labelId = `${id}-${section}`;\n const heading = (text: string) => (\n <p id={labelId} className=\"mb-2 text-sm font-medium text-mari-foreground\">\n {text}\n </p>\n );\n\n if (section === \"mode\") {\n return (\n <div key={section}>\n {heading(\"Görünüm\")}\n <Segmented\n block\n aria-labelledby={labelId}\n options={MODE_OPTIONS}\n className={MODE_ICON_RESPONSIVE}\n value={mode}\n onChange={(next) => update({ mode: next as ColorSchemePreference })}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n );\n }\n\n if (section === \"spacing\") {\n return (\n <div key={section}>\n {heading(\"Yoğunluk\")}\n <Segmented\n block\n aria-labelledby={labelId}\n options={SPACING_OPTIONS}\n value={spacing}\n onChange={(next) => update({ spacing: next as SpacingDensity })}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n );\n }\n\n const swatches: Array<{ value: HexColor | undefined; color: HexColor; label: string }> = [\n { value: undefined, color: DEFAULT_SWATCH, label: \"Varsayılan\" },\n ...colors.map((c) => ({ value: c.value, color: c.value, label: c.label })),\n ];\n return (\n <div key={section}>\n {heading(\"Vurgu rengi\")}\n <div className=\"flex flex-wrap items-center gap-3\">\n <div role=\"radiogroup\" aria-labelledby={labelId} className=\"flex flex-wrap gap-3\">\n {swatches.map((swatch) => (\n <Swatch\n key={swatch.label}\n name={`${id}-accent`}\n color={swatch.color}\n label={swatch.label}\n checked={swatch.value === undefined ? !primary : primary?.toLowerCase() === swatch.value.toLowerCase()}\n disabled={disabled}\n skeleton={skeleton}\n onSelect={() => update({ primary: swatch.value })}\n />\n ))}\n </div>\n {allowCustom && (\n <div className={cn(\"rounded-md\", customValue && \"ring-2 ring-mari-foreground ring-offset-2 ring-offset-mari-surface\")}>\n <ColorPicker\n aria-label=\"Özel renk\"\n disabledAlpha\n // Boşken \"renk yok\" (çizgili) simgesi yanıltıcıydı: seçici o anki\n // renkten başlar; halka yalnız özel renk seçiliyken.\n value={customValue ?? primary ?? DEFAULT_SWATCH}\n onChange={(next) => {\n if (next && HEX6.test(next)) update({ primary: next.toLowerCase() as HexColor });\n }}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n )}\n </div>\n </div>\n );\n };\n\n return <div className={cn(\"@container flex flex-col gap-5\", className)}>{sections.map(renderSection)}</div>;\n}\n","\"use client\";\n\nimport { buildThemeVars, defaultThemeSettings, type ThemeMode, type ThemeSettings } from \"@mari-ui/tokens\";\n\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\ninterface AppliedState {\n /** İlk uygulamadan önceki öznitelikler — geri alırken bunlara dönülür. */\n original: { theme: string | null; density: string | null };\n vars: string[];\n stopListening?: () => void;\n}\n\nconst appliedStates = new WeakMap<HTMLElement, AppliedState>();\n\n/** \"system\" tercihini o anki işletim sistemi ayarına çözer (SSR'da \"light\"). */\nexport function resolveColorScheme(mode: ThemeSettings[\"mode\"]): ThemeMode {\n if (mode !== \"system\") return mode;\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return \"light\";\n return window.matchMedia(DARK_QUERY).matches ? \"dark\" : \"light\";\n}\n\nfunction restoreAttribute(el: HTMLElement, name: string, value: string | null) {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/** Vurgu renginin yazabileceği tüm değişken adları (hangi renk olursa olsun aynı set). */\nlet ownedVarNames: string[] | undefined;\nconst getOwnedVarNames = () => (ownedVarNames ??= Object.keys(buildThemeVars({ primary: \"#000000\" }, \"light\")));\n\nfunction clearVars(el: HTMLElement, state: AppliedState) {\n for (const name of state.vars) el.style.removeProperty(name);\n state.vars = [];\n}\n\n/**\n * Son kullanıcı tema ayarını bir elemana uygular (varsayılan `<html>`) — provider\n * yok (Link kararıyla aynı). Mod `data-theme`, yoğunluk `data-density`\n * özniteliğiyle stylesheet'e bırakılır; yalnız vurgu rengi satır içi\n * `--mari-color-primary*` değişkenleri olarak yazılır. \"system\" modunda işletim\n * sistemi tercihi canlı izlenir.\n *\n * Aynı elemana tekrar çağrı öncekinin yerini alır. Dönen fonksiyon dinleyiciyi\n * bırakır ve elemanı ilk çağrıdan önceki haline döndürür (React effect temizliği).\n * Kalıcılık (localStorage, API…) tüketicinin işi.\n */\nexport function applyTheme(settings: Partial<ThemeSettings> = {}, target?: HTMLElement): () => void {\n if (typeof document === \"undefined\") return () => {};\n const el = target ?? document.documentElement;\n const { mode, primary } = { ...defaultThemeSettings, ...settings };\n const { spacing } = settings;\n\n const previous = appliedStates.get(el);\n if (previous) {\n previous.stopListening?.();\n clearVars(el, previous);\n } else {\n // Açılış script'i (`getThemeScript`) değişkenleri önceden yazmış olabilir;\n // yeni ayarda vurgu rengi yoksa eskisi takılı kalmasın.\n for (const name of getOwnedVarNames()) el.style.removeProperty(name);\n }\n const state: AppliedState = {\n original: previous?.original ?? { theme: el.getAttribute(\"data-theme\"), density: el.getAttribute(\"data-density\") },\n vars: [],\n };\n appliedStates.set(el, state);\n\n const paint = () => {\n const resolved = resolveColorScheme(mode);\n el.setAttribute(\"data-theme\", resolved);\n clearVars(el, state);\n for (const [name, value] of Object.entries(buildThemeVars({ primary }, resolved))) {\n el.style.setProperty(name, value);\n state.vars.push(name);\n }\n };\n paint();\n\n // Yalnız açıkça verilen yoğunluk yazılır — \"normal\" da (config'teki varsayılan\n // `:root:not([data-density])` farklıysa kullanıcının \"Normal\" seçimi onu ezebilmeli).\n // Verilmediyse config varsayılanı geçerli kalsın: öznitelik ilk haline döner.\n if (spacing) el.setAttribute(\"data-density\", spacing);\n else restoreAttribute(el, \"data-density\", state.original.density);\n\n if (mode === \"system\" && typeof window.matchMedia === \"function\") {\n const query = window.matchMedia(DARK_QUERY);\n query.addEventListener(\"change\", paint);\n state.stopListening = () => query.removeEventListener(\"change\", paint);\n }\n\n return () => {\n // Bu çağrının yerini daha yenisi aldıysa ona dokunma.\n if (appliedStates.get(el) !== state) return;\n state.stopListening?.();\n clearVars(el, state);\n restoreAttribute(el, \"data-theme\", state.original.theme);\n restoreAttribute(el, \"data-density\", state.original.density);\n appliedStates.delete(el);\n };\n}\n","export { ThemeCustomizer, defaultAccentColors } from \"./ThemeCustomizer\";\nexport type { ThemeCustomizerProps, ThemeCustomizerSection, ThemeAccentOption } from \"./types\";\nexport { applyTheme, resolveColorScheme } from \"./applyTheme\";\nexport { saveTheme, loadTheme, getThemeScript, DEFAULT_THEME_STORAGE_KEY } from \"@mari-ui/tokens\";\nexport type { ThemeScriptOptions } from \"@mari-ui/tokens\";\nexport { defaultThemeSettings, spacingDensities } from \"@mari-ui/tokens\";\nexport type { ThemeSettings, ColorSchemePreference, SpacingDensity } from \"@mari-ui/tokens\";\n"],"mappings":"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","names":["defaultThemeSettings","defaultThemeSettings","defaultThemeSettings"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme-customizer/ThemeCustomizer.tsx","../src/theme-customizer/applyTheme.ts","../src/theme-customizer/index.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useId } from \"react\";\nimport { CheckIcon, MonitorIcon, MoonIcon, SunIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport {\n BLACK,\n WHITE,\n defaultThemeSettings,\n lightTheme,\n pickAccessibleForeground,\n type ColorSchemePreference,\n type HexColor,\n type SpacingDensity,\n type ThemeSettings,\n} from \"@mari-ui/tokens\";\nimport { ColorPicker } from \"../color-picker\";\nimport { Segmented } from \"../segmented\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { applyTheme } from \"./applyTheme\";\nimport type { ThemeAccentOption, ThemeCustomizerProps, ThemeCustomizerSection } from \"./types\";\n\nexport type { ThemeCustomizerProps };\n\nconst ALL_SECTIONS: ThemeCustomizerSection[] = [\"mode\", \"color\", \"spacing\"];\n\n/** Parlak sarı/camgöbeği bilinçli olarak listede: otomatik kontrast düzeltmesi onları zeminde görünür kılar. */\nexport const defaultAccentColors: ThemeAccentOption[] = [\n { value: \"#2563eb\", label: \"Mavi\" },\n { value: \"#0891b2\", label: \"Camgöbeği\" },\n { value: \"#16a34a\", label: \"Yeşil\" },\n { value: \"#eab308\", label: \"Sarı\" },\n { value: \"#ea580c\", label: \"Turuncu\" },\n { value: \"#dc2626\", label: \"Kırmızı\" },\n { value: \"#db2777\", label: \"Pembe\" },\n];\n\n/** Dar yerleşimde (çekmece, <20rem) ikon sarmalayıcısıyla gizlenir — etiket kesilmez, boşluk kalmaz. */\nconst MODE_ICON_RESPONSIVE = \"[&_span:has(>svg)]:hidden @xs:[&_span:has(>svg)]:flex\";\n\nconst MODE_OPTIONS: Array<{ value: ColorSchemePreference; label: string; icon: React.ReactNode }> = [\n { value: \"light\", label: \"Açık\", icon: <SunIcon aria-hidden /> },\n { value: \"dark\", label: \"Koyu\", icon: <MoonIcon aria-hidden /> },\n { value: \"system\", label: \"Sistem\", icon: <MonitorIcon aria-hidden /> },\n];\n\nconst SPACING_OPTIONS: Array<{ value: SpacingDensity; label: string }> = [\n { value: \"compact\", label: \"Sıkı\" },\n { value: \"normal\", label: \"Normal\" },\n { value: \"comfortable\", label: \"Rahat\" },\n];\n\nconst HEX6 = /^#[0-9a-f]{6}$/i;\nconst DEFAULT_SWATCH = lightTheme.color.primary.solid;\n\ninterface SwatchProps {\n name: string;\n color: HexColor;\n label: string;\n checked: boolean;\n disabled: boolean;\n skeleton: boolean | undefined;\n onSelect: () => void;\n}\n\n/** Gerçek radyo düğmesi (ok tuşları, tek Tab durağı tarayıcıdan) + görünen daire. */\nfunction Swatch({ name, color, label, checked, disabled, skeleton, onSelect }: Readonly<SwatchProps>) {\n if (skeleton) return <span {...skeletonBoxProps(\"size-8 rounded-full\")} />;\n return (\n <label\n className={cn(\n \"relative grid size-8 place-items-center rounded-full\",\n \"has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-mari-ring\",\n checked && \"ring-2 ring-mari-foreground ring-offset-2 ring-offset-mari-surface\",\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n \"pointer-coarse:before:absolute pointer-coarse:before:-inset-1.5\"\n )}\n style={{ backgroundColor: color }}\n title={label}\n >\n <input type=\"radio\" name={name} className=\"sr-only\" checked={checked} disabled={disabled} onChange={onSelect} aria-label={label} />\n {checked && <CheckIcon aria-hidden className=\"size-4\" style={{ color: pickAccessibleForeground(color, [WHITE, BLACK]) }} />}\n </label>\n );\n}\n\n/**\n * Son kullanıcının uygulamanın görünümünü kişiselleştirdiği panel:\n * mod (açık/koyu/sistem), vurgu rengi, boşluk yoğunluğu. Kendi tasarımımız\n * (ant referansı yok). Satır içi durur; Popover/Drawer/ayarlar sayfasına\n * yerleştirmek tüketicinin işi.\n *\n * Seçim `applyTheme` ile anında uygulanır (provider yok). Seçilen vurgu rengi\n * zeminde görünür olacak kadar otomatik koyulaştırılır/açılır — kullanıcı\n * bozuk tema üretemez. Örnekte kullanıcının seçtiği renk gösterilir.\n */\nexport function ThemeCustomizer({\n value,\n defaultValue,\n onChange,\n apply = true,\n target,\n sections = ALL_SECTIONS,\n colors = defaultAccentColors,\n allowCustom = false,\n disabled = false,\n skeleton,\n className,\n}: Readonly<ThemeCustomizerProps>) {\n const id = useId();\n const [settings, setSettings] = useControllableState<ThemeSettings>({\n value,\n defaultValue: { ...defaultThemeSettings, ...defaultValue },\n onChange,\n });\n const { mode, primary, spacing } = settings;\n\n useEffect(() => {\n if (!apply) return;\n // Temizlik yok (bilerek): panel kapanınca tema geri alınmamalı.\n applyTheme({ mode, primary, spacing }, target?.current ?? undefined);\n }, [apply, target, mode, primary, spacing]);\n\n const update = (patch: Partial<ThemeSettings>) => setSettings({ ...settings, ...patch });\n const isPreset = !primary || colors.some((c) => c.value.toLowerCase() === primary.toLowerCase());\n const customValue = primary && !isPreset ? primary : null;\n\n const renderSection = (section: ThemeCustomizerSection) => {\n const labelId = `${id}-${section}`;\n const heading = (text: string) => (\n <p id={labelId} className=\"mb-2 text-sm font-medium text-mari-foreground\">\n {text}\n </p>\n );\n\n if (section === \"mode\") {\n return (\n <div key={section}>\n {heading(\"Görünüm\")}\n <Segmented\n block\n aria-labelledby={labelId}\n options={MODE_OPTIONS}\n className={MODE_ICON_RESPONSIVE}\n value={mode}\n onChange={(next) => update({ mode: next as ColorSchemePreference })}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n );\n }\n\n if (section === \"spacing\") {\n return (\n <div key={section}>\n {heading(\"Yoğunluk\")}\n <Segmented\n block\n aria-labelledby={labelId}\n options={SPACING_OPTIONS}\n value={spacing}\n onChange={(next) => update({ spacing: next as SpacingDensity })}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n );\n }\n\n const swatches: Array<{ value: HexColor | undefined; color: HexColor; label: string }> = [\n { value: undefined, color: DEFAULT_SWATCH, label: \"Varsayılan\" },\n ...colors.map((c) => ({ value: c.value, color: c.value, label: c.label })),\n ];\n return (\n <div key={section}>\n {heading(\"Vurgu rengi\")}\n <div className=\"flex flex-wrap items-center gap-3\">\n <div role=\"radiogroup\" aria-labelledby={labelId} className=\"flex flex-wrap gap-3\">\n {swatches.map((swatch) => (\n <Swatch\n key={swatch.label}\n name={`${id}-accent`}\n color={swatch.color}\n label={swatch.label}\n checked={swatch.value === undefined ? !primary : primary?.toLowerCase() === swatch.value.toLowerCase()}\n disabled={disabled}\n skeleton={skeleton}\n onSelect={() => update({ primary: swatch.value })}\n />\n ))}\n </div>\n {allowCustom && (\n <div className={cn(\"rounded-md\", customValue && \"ring-2 ring-mari-foreground ring-offset-2 ring-offset-mari-surface\")}>\n <ColorPicker\n aria-label=\"Özel renk\"\n disabledAlpha\n // Boşken \"renk yok\" (çizgili) simgesi yanıltıcıydı: seçici o anki\n // renkten başlar; halka yalnız özel renk seçiliyken.\n value={customValue ?? primary ?? DEFAULT_SWATCH}\n onChange={(next) => {\n if (next && HEX6.test(next)) update({ primary: next.toLowerCase() as HexColor });\n }}\n disabled={disabled}\n skeleton={skeleton}\n />\n </div>\n )}\n </div>\n </div>\n );\n };\n\n return <div className={cn(\"@container flex flex-col gap-5\", className)}>{sections.map(renderSection)}</div>;\n}\n","\"use client\";\n\nimport { buildThemeVars, defaultThemeSettings, type ThemeMode, type ThemeSettings } from \"@mari-ui/tokens\";\n\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\ninterface AppliedState {\n /** İlk uygulamadan önceki öznitelikler — geri alırken bunlara dönülür. */\n original: { theme: string | null; density: string | null };\n vars: string[];\n stopListening?: () => void;\n}\n\nconst appliedStates = new WeakMap<HTMLElement, AppliedState>();\n\n/** \"system\" tercihini o anki işletim sistemi ayarına çözer (SSR'da \"light\"). */\nexport function resolveColorScheme(mode: ThemeSettings[\"mode\"]): ThemeMode {\n if (mode !== \"system\") return mode;\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return \"light\";\n return window.matchMedia(DARK_QUERY).matches ? \"dark\" : \"light\";\n}\n\nfunction restoreAttribute(el: HTMLElement, name: string, value: string | null) {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n}\n\n/** Vurgu renginin yazabileceği tüm değişken adları (hangi renk olursa olsun aynı set). */\nlet ownedVarNames: string[] | undefined;\nconst getOwnedVarNames = () => (ownedVarNames ??= Object.keys(buildThemeVars({ primary: \"#000000\" }, \"light\")));\n\nfunction clearVars(el: HTMLElement, state: AppliedState) {\n for (const name of state.vars) el.style.removeProperty(name);\n state.vars = [];\n}\n\n/**\n * Son kullanıcı tema ayarını bir elemana uygular (varsayılan `<html>`) — provider\n * yok (Link kararıyla aynı). Mod `data-theme`, yoğunluk `data-density`\n * özniteliğiyle stylesheet'e bırakılır; yalnız vurgu rengi satır içi\n * `--mari-color-primary*` değişkenleri olarak yazılır. \"system\" modunda işletim\n * sistemi tercihi canlı izlenir.\n *\n * Aynı elemana tekrar çağrı öncekinin yerini alır. Dönen fonksiyon dinleyiciyi\n * bırakır ve elemanı ilk çağrıdan önceki haline döndürür (React effect temizliği).\n * Kalıcılık (localStorage, API…) tüketicinin işi.\n */\nexport function applyTheme(settings: Partial<ThemeSettings> = {}, target?: HTMLElement): () => void {\n if (typeof document === \"undefined\") return () => {};\n const el = target ?? document.documentElement;\n const { mode, primary } = { ...defaultThemeSettings, ...settings };\n const { spacing } = settings;\n\n const previous = appliedStates.get(el);\n if (previous) {\n previous.stopListening?.();\n clearVars(el, previous);\n } else {\n // Açılış script'i (`getThemeScript`) değişkenleri önceden yazmış olabilir;\n // yeni ayarda vurgu rengi yoksa eskisi takılı kalmasın.\n for (const name of getOwnedVarNames()) el.style.removeProperty(name);\n }\n const state: AppliedState = {\n original: previous?.original ?? { theme: el.getAttribute(\"data-theme\"), density: el.getAttribute(\"data-density\") },\n vars: [],\n };\n appliedStates.set(el, state);\n\n const paint = () => {\n const resolved = resolveColorScheme(mode);\n el.setAttribute(\"data-theme\", resolved);\n clearVars(el, state);\n for (const [name, value] of Object.entries(buildThemeVars({ primary }, resolved))) {\n el.style.setProperty(name, value);\n state.vars.push(name);\n }\n };\n paint();\n\n // Yalnız açıkça verilen yoğunluk yazılır — \"normal\" da (config'teki varsayılan\n // `:root:not([data-density])` farklıysa kullanıcının \"Normal\" seçimi onu ezebilmeli).\n // Verilmediyse config varsayılanı geçerli kalsın: öznitelik ilk haline döner.\n if (spacing) el.setAttribute(\"data-density\", spacing);\n else restoreAttribute(el, \"data-density\", state.original.density);\n\n if (mode === \"system\" && typeof window.matchMedia === \"function\") {\n const query = window.matchMedia(DARK_QUERY);\n query.addEventListener(\"change\", paint);\n state.stopListening = () => query.removeEventListener(\"change\", paint);\n }\n\n return () => {\n // Bu çağrının yerini daha yenisi aldıysa ona dokunma.\n if (appliedStates.get(el) !== state) return;\n state.stopListening?.();\n clearVars(el, state);\n restoreAttribute(el, \"data-theme\", state.original.theme);\n restoreAttribute(el, \"data-density\", state.original.density);\n appliedStates.delete(el);\n };\n}\n","export { ThemeCustomizer, defaultAccentColors } from \"./ThemeCustomizer\";\nexport type { ThemeCustomizerProps, ThemeCustomizerSection, ThemeAccentOption } from \"./types\";\nexport { applyTheme, resolveColorScheme } from \"./applyTheme\";\nexport { saveTheme, loadTheme, getThemeScript, DEFAULT_THEME_STORAGE_KEY } from \"@mari-ui/tokens\";\nexport type { ThemeScriptOptions } from \"@mari-ui/tokens\";\nexport { defaultThemeSettings, spacingDensities } from \"@mari-ui/tokens\";\nexport type { ThemeSettings, ColorSchemePreference, SpacingDensity } from \"@mari-ui/tokens\";\n"],"mappings":"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","names":["defaultThemeSettings","defaultThemeSettings","defaultThemeSettings"]}
|
package/dist/timeline.js
CHANGED
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
} from "./chunk-KG6A32KX.js";
|
|
6
6
|
import {
|
|
7
7
|
ContentSkeleton
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RMNV2CE2.js";
|
|
9
9
|
import {
|
|
10
10
|
SkeletonBlock
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-TSFAAREV.js";
|
|
12
|
+
import "./chunk-6CSUVVFG.js";
|
|
13
13
|
import {
|
|
14
14
|
textClass
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
16
16
|
import {
|
|
17
17
|
skeletonBoxProps
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VKN374SD.js";
|
|
19
19
|
|
|
20
20
|
// src/timeline/Timeline.tsx
|
|
21
21
|
import { useRef } from "react";
|
package/dist/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/timeline/Timeline.tsx","../src/timeline/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useRef } from \"react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\nimport { buildItems, isThreeColumn, resolveSide } from \"./utils\";\n\nexport type { TimelineProps, TimelineItem };\n\nconst PLACEHOLDER = <SkeletonBlock active width=\"60%\" height=\"0.75rem\" radius=\"sm\" className=\"my-1\" />;\n\n/** Nokta kutusu = ilk metin satırının yüksekliği (20px) → nokta ilk satırla hizalı. */\nfunction Dot({ item, filled, skeleton }: Readonly<{ item: TimelineItem; filled: boolean; skeleton: boolean }>) {\n const color: ColorRole = item.color ?? \"primary\";\n let node: React.ReactNode;\n if (skeleton) node = <span {...skeletonBoxProps(\"size-2.5 rounded-full\")} />;\n else if (item.loading) node = <Loader2Icon size={14} aria-hidden className=\"animate-spin text-mari-muted motion-reduce:animate-none\" />;\n else if (item.icon) node = <span className={cn(\"flex size-5 items-center justify-center [&_svg]:size-4\", textClass[color])}>{item.icon}</span>;\n else node = <span className={cn(\"size-2.5 rounded-full border-2 border-current\", textClass[color], filled ? \"bg-current\" : \"bg-mari-surface\")} />;\n return (\n <span aria-hidden className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {node}\n </span>\n );\n}\n\nfunction Rail({ dashed, horizontal }: Readonly<{ dashed: boolean; horizontal?: boolean }>) {\n return (\n <span\n aria-hidden\n className={cn(\n \"border-mari-border\",\n horizontal ? \"mx-1 h-0 flex-1 border-t-2\" : \"mt-1 w-0 flex-1 border-l-2\",\n dashed && \"border-dashed\"\n )}\n />\n );\n}\n\nfunction Title({ children, className }: Readonly<{ children: React.ReactNode; className?: string }>) {\n return <div className={cn(\"text-xs leading-5 text-mari-muted\", className)}>{children}</div>;\n}\n\ninterface RowProps {\n item: TimelineItem;\n index: number;\n last: boolean;\n nextLoading: boolean;\n props: Required<Pick<TimelineProps, \"mode\" | \"variant\" | \"titlePlacement\" | \"skeleton\">>;\n}\n\n/** Üç sütun (sm+) oranları: alternate eşit; opposite'te başlık sütunu dar. */\nfunction threeColumnClass(mode: TimelineProps[\"mode\"]): string {\n if (mode === \"alternate\") return \"sm:grid-cols-[minmax(0,1fr)_1.25rem_minmax(0,1fr)]\";\n if (mode === \"end\") return \"sm:grid-cols-[minmax(0,3fr)_1.25rem_minmax(0,1fr)]\";\n return \"sm:grid-cols-[minmax(0,1fr)_1.25rem_minmax(0,3fr)]\";\n}\n\nfunction VerticalRow({ item, index, last, nextLoading, props }: Readonly<RowProps>) {\n const { mode, variant, titlePlacement, skeleton } = props;\n const side = resolveSide(mode, index, item.placement);\n const three = isThreeColumn(mode, titlePlacement);\n const opposite = titlePlacement === \"opposite\" && item.title !== undefined;\n const before = side === \"before\";\n\n // Dar ekranda üç sütunlu düzen iki sütuna (nokta | içerik) düşer; karşı taraftaki başlık içeriğin üstüne gelir.\n const body = (\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n {item.title !== undefined && <Title className={cn(opposite && \"sm:hidden\")}>{item.title}</Title>}\n <div className={cn(\"leading-5\", item.loading ? \"text-mari-muted\" : \"text-mari-foreground\")}>{item.content}</div>\n </ContentSkeleton>\n );\n\n let grid: string;\n let dotCol: string;\n let bodyCol: string;\n let oppositeCol = \"\";\n if (three) {\n grid = cn(\"grid-cols-[1.25rem_minmax(0,1fr)]\", threeColumnClass(mode));\n dotCol = \"col-start-1 sm:col-start-2\";\n bodyCol = cn(\"col-start-2\", before ? \"sm:col-start-1 sm:text-right\" : \"sm:col-start-3\");\n oppositeCol = cn(\"hidden sm:block\", before ? \"sm:col-start-3\" : \"sm:col-start-1 sm:text-right\");\n } else if (before) {\n grid = \"grid-cols-[minmax(0,1fr)_1.25rem]\";\n dotCol = \"col-start-2\";\n bodyCol = \"col-start-1 text-right\";\n } else {\n grid = \"grid-cols-[1.25rem_minmax(0,1fr)]\";\n dotCol = \"col-start-1\";\n bodyCol = \"col-start-2\";\n }\n\n return (\n <li className={cn(\"grid gap-x-4\", grid)}>\n <div className={cn(\"row-start-1 flex flex-col items-center\", dotCol)}>\n <Dot item={item} filled={variant === \"filled\"} skeleton={skeleton} />\n {!last && <Rail dashed={nextLoading} />}\n </div>\n <div className={cn(\"row-start-1 min-w-0 break-words\", !last && \"pb-6\", bodyCol)}>{body}</div>\n {opposite && (\n <div className={cn(\"row-start-1 min-w-0\", oppositeCol)}>\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n <Title>{item.title}</Title>\n </ContentSkeleton>\n </div>\n )}\n </li>\n );\n}\n\nfunction HorizontalRow({ item, last, nextLoading, props }: Readonly<RowProps>) {\n const { variant, skeleton } = props;\n return (\n <li className=\"flex min-w-36 flex-1 flex-col\">\n <div className=\"flex items-center\">\n <Dot item={item} filled={variant === \"filled\"} skeleton={skeleton} />\n {!last && <Rail dashed={nextLoading} horizontal />}\n </div>\n <div className=\"min-w-0 pt-2 pr-4 break-words\">\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n {item.title !== undefined && <Title>{item.title}</Title>}\n <div className={cn(\"leading-5\", item.loading ? \"text-mari-muted\" : \"text-mari-foreground\")}>{item.content}</div>\n </ContentSkeleton>\n </div>\n </li>\n );\n}\n\n/**\n * Faz 16.3 — yapı ant.design Timeline'dan (başlık + içerik, renkli ya da ikonlu\n * nokta, start/end/alternate, karşı tarafta başlık, yatay yön, bekleyen öğe,\n * ters sıra), görünüm kendi token'larımızdan. Ray noktanın sütununda büyüyen\n * bir çizgi — içerik uzadıkça kendiliğinden uzar, ölçüm yok.\n *\n * Semantik: kronolojik sıra anlamlı → `<ol>`. Noktalar/ikonlar görsel\n * (`aria-hidden`); durum (\"iptal edildi\") metinde söylenmeli. Yatay yön taşarsa\n * kaydırılabilir bölge klavyeyle odaklanabilir olur.\n */\nexport function Timeline({\n items,\n mode = \"start\",\n orientation = \"vertical\",\n variant = \"outlined\",\n titlePlacement = \"inline\",\n reverse = false,\n pending,\n className,\n skeleton = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}: Readonly<TimelineProps>) {\n const all = buildItems(items, pending, reverse);\n const horizontal = orientation === \"horizontal\";\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollable(scrollRef, \"x\", [all.length, horizontal]);\n const Row = horizontal ? HorizontalRow : VerticalRow;\n const rowProps = { mode, variant, titlePlacement, skeleton };\n\n const list = (\n <ol\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-busy={skeleton || undefined}\n className={cn(\"text-sm\", horizontal ? \"flex\" : \"flex flex-col\", !horizontal && className)}\n >\n {all.map((item, i) => (\n <Row\n key={item.key ?? i}\n item={item}\n index={i}\n last={i === all.length - 1}\n // Bekleyen öğeye bağlanan ray (iki ucundan biri bekliyorsa) kesikli.\n nextLoading={Boolean(item.loading || all[i + 1]?.loading)}\n props={rowProps}\n />\n ))}\n </ol>\n );\n\n if (!horizontal) return list;\n return (\n // Taşarken klavyeyle kaydırılabilsin (axe scrollable-region-focusable).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n <div ref={scrollRef} tabIndex={scrollable ? 0 : undefined} className={cn(\"overflow-x-auto pb-1 focus-visible:outline-2 focus-visible:outline-mari-ring\", className)}>\n {list}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\n\nexport const PENDING_KEY = \"__mari-timeline-pending__\";\n\n/** `pending` öğesini ekler ve `reverse`i uygular (bekleyen öğe hep \"en yeni\" uçta). */\nexport function buildItems(items: TimelineItem[], pending: React.ReactNode, reverse: boolean): TimelineItem[] {\n const all = [...items];\n if (pending !== undefined && pending !== null && pending !== false) {\n all.push({ key: PENDING_KEY, content: pending === true ? \"Devam ediyor…\" : pending, loading: true, color: \"neutral\" });\n }\n return reverse ? all.reverse() : all;\n}\n\n/**\n * İçerik noktanın hangi tarafında: `after` (sağ) ya da `before` (sol).\n * `alternate`de çift sıradakiler sağda başlar; öğenin `placement`ı önceliklidir.\n */\nexport function resolveSide(mode: NonNullable<TimelineProps[\"mode\"]>, index: number, placement: TimelineItem[\"placement\"]): \"after\" | \"before\" {\n if (mode === \"start\") return \"after\";\n if (mode === \"end\") return \"before\";\n if (placement) return placement === \"start\" ? \"after\" : \"before\";\n return index % 2 === 0 ? \"after\" : \"before\";\n}\n\n/** Üç sütunlu (başlık/boş | nokta | içerik) yerleşim gerekir mi. */\nexport function isThreeColumn(mode: NonNullable<TimelineProps[\"mode\"]>, titlePlacement: NonNullable<TimelineProps[\"titlePlacement\"]>): boolean {\n return mode === \"alternate\" || titlePlacement === \"opposite\";\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/timeline/Timeline.tsx","../src/timeline/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useRef } from \"react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\nimport { buildItems, isThreeColumn, resolveSide } from \"./utils\";\n\nexport type { TimelineProps, TimelineItem };\n\nconst PLACEHOLDER = <SkeletonBlock active width=\"60%\" height=\"0.75rem\" radius=\"sm\" className=\"my-1\" />;\n\n/** Nokta kutusu = ilk metin satırının yüksekliği (20px) → nokta ilk satırla hizalı. */\nfunction Dot({ item, filled, skeleton }: Readonly<{ item: TimelineItem; filled: boolean; skeleton: boolean }>) {\n const color: ColorRole = item.color ?? \"primary\";\n let node: React.ReactNode;\n if (skeleton) node = <span {...skeletonBoxProps(\"size-2.5 rounded-full\")} />;\n else if (item.loading) node = <Loader2Icon size={14} aria-hidden className=\"animate-spin text-mari-muted motion-reduce:animate-none\" />;\n else if (item.icon) node = <span className={cn(\"flex size-5 items-center justify-center [&_svg]:size-4\", textClass[color])}>{item.icon}</span>;\n else node = <span className={cn(\"size-2.5 rounded-full border-2 border-current\", textClass[color], filled ? \"bg-current\" : \"bg-mari-surface\")} />;\n return (\n <span aria-hidden className=\"flex h-5 w-5 shrink-0 items-center justify-center\">\n {node}\n </span>\n );\n}\n\nfunction Rail({ dashed, horizontal }: Readonly<{ dashed: boolean; horizontal?: boolean }>) {\n return (\n <span\n aria-hidden\n className={cn(\n \"border-mari-border\",\n horizontal ? \"mx-1 h-0 flex-1 border-t-2\" : \"mt-1 w-0 flex-1 border-l-2\",\n dashed && \"border-dashed\"\n )}\n />\n );\n}\n\nfunction Title({ children, className }: Readonly<{ children: React.ReactNode; className?: string }>) {\n return <div className={cn(\"text-xs leading-5 text-mari-muted\", className)}>{children}</div>;\n}\n\ninterface RowProps {\n item: TimelineItem;\n index: number;\n last: boolean;\n nextLoading: boolean;\n props: Required<Pick<TimelineProps, \"mode\" | \"variant\" | \"titlePlacement\" | \"skeleton\">>;\n}\n\n/** Üç sütun (sm+) oranları: alternate eşit; opposite'te başlık sütunu dar. */\nfunction threeColumnClass(mode: TimelineProps[\"mode\"]): string {\n if (mode === \"alternate\") return \"sm:grid-cols-[minmax(0,1fr)_1.25rem_minmax(0,1fr)]\";\n if (mode === \"end\") return \"sm:grid-cols-[minmax(0,3fr)_1.25rem_minmax(0,1fr)]\";\n return \"sm:grid-cols-[minmax(0,1fr)_1.25rem_minmax(0,3fr)]\";\n}\n\nfunction VerticalRow({ item, index, last, nextLoading, props }: Readonly<RowProps>) {\n const { mode, variant, titlePlacement, skeleton } = props;\n const side = resolveSide(mode, index, item.placement);\n const three = isThreeColumn(mode, titlePlacement);\n const opposite = titlePlacement === \"opposite\" && item.title !== undefined;\n const before = side === \"before\";\n\n // Dar ekranda üç sütunlu düzen iki sütuna (nokta | içerik) düşer; karşı taraftaki başlık içeriğin üstüne gelir.\n const body = (\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n {item.title !== undefined && <Title className={cn(opposite && \"sm:hidden\")}>{item.title}</Title>}\n <div className={cn(\"leading-5\", item.loading ? \"text-mari-muted\" : \"text-mari-foreground\")}>{item.content}</div>\n </ContentSkeleton>\n );\n\n let grid: string;\n let dotCol: string;\n let bodyCol: string;\n let oppositeCol = \"\";\n if (three) {\n grid = cn(\"grid-cols-[1.25rem_minmax(0,1fr)]\", threeColumnClass(mode));\n dotCol = \"col-start-1 sm:col-start-2\";\n bodyCol = cn(\"col-start-2\", before ? \"sm:col-start-1 sm:text-right\" : \"sm:col-start-3\");\n oppositeCol = cn(\"hidden sm:block\", before ? \"sm:col-start-3\" : \"sm:col-start-1 sm:text-right\");\n } else if (before) {\n grid = \"grid-cols-[minmax(0,1fr)_1.25rem]\";\n dotCol = \"col-start-2\";\n bodyCol = \"col-start-1 text-right\";\n } else {\n grid = \"grid-cols-[1.25rem_minmax(0,1fr)]\";\n dotCol = \"col-start-1\";\n bodyCol = \"col-start-2\";\n }\n\n return (\n <li className={cn(\"grid gap-x-4\", grid)}>\n <div className={cn(\"row-start-1 flex flex-col items-center\", dotCol)}>\n <Dot item={item} filled={variant === \"filled\"} skeleton={skeleton} />\n {!last && <Rail dashed={nextLoading} />}\n </div>\n <div className={cn(\"row-start-1 min-w-0 break-words\", !last && \"pb-6\", bodyCol)}>{body}</div>\n {opposite && (\n <div className={cn(\"row-start-1 min-w-0\", oppositeCol)}>\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n <Title>{item.title}</Title>\n </ContentSkeleton>\n </div>\n )}\n </li>\n );\n}\n\nfunction HorizontalRow({ item, last, nextLoading, props }: Readonly<RowProps>) {\n const { variant, skeleton } = props;\n return (\n <li className=\"flex min-w-36 flex-1 flex-col\">\n <div className=\"flex items-center\">\n <Dot item={item} filled={variant === \"filled\"} skeleton={skeleton} />\n {!last && <Rail dashed={nextLoading} horizontal />}\n </div>\n <div className=\"min-w-0 pt-2 pr-4 break-words\">\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n {item.title !== undefined && <Title>{item.title}</Title>}\n <div className={cn(\"leading-5\", item.loading ? \"text-mari-muted\" : \"text-mari-foreground\")}>{item.content}</div>\n </ContentSkeleton>\n </div>\n </li>\n );\n}\n\n/**\n * Ray noktanın sütununda büyüyen\n * bir çizgi — içerik uzadıkça kendiliğinden uzar, ölçüm yok.\n *\n * Semantik: kronolojik sıra anlamlı → `<ol>`. Noktalar/ikonlar görsel\n * (`aria-hidden`); durum (\"iptal edildi\") metinde söylenmeli. Yatay yön taşarsa\n * kaydırılabilir bölge klavyeyle odaklanabilir olur.\n */\nexport function Timeline({\n items,\n mode = \"start\",\n orientation = \"vertical\",\n variant = \"outlined\",\n titlePlacement = \"inline\",\n reverse = false,\n pending,\n className,\n skeleton = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}: Readonly<TimelineProps>) {\n const all = buildItems(items, pending, reverse);\n const horizontal = orientation === \"horizontal\";\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollable(scrollRef, \"x\", [all.length, horizontal]);\n const Row = horizontal ? HorizontalRow : VerticalRow;\n const rowProps = { mode, variant, titlePlacement, skeleton };\n\n const list = (\n <ol\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-busy={skeleton || undefined}\n className={cn(\"text-sm\", horizontal ? \"flex\" : \"flex flex-col\", !horizontal && className)}\n >\n {all.map((item, i) => (\n <Row\n key={item.key ?? i}\n item={item}\n index={i}\n last={i === all.length - 1}\n // Bekleyen öğeye bağlanan ray (iki ucundan biri bekliyorsa) kesikli.\n nextLoading={Boolean(item.loading || all[i + 1]?.loading)}\n props={rowProps}\n />\n ))}\n </ol>\n );\n\n if (!horizontal) return list;\n return (\n // Taşarken klavyeyle kaydırılabilsin (axe scrollable-region-focusable).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n <div ref={scrollRef} tabIndex={scrollable ? 0 : undefined} className={cn(\"overflow-x-auto pb-1 focus-visible:outline-2 focus-visible:outline-mari-ring\", className)}>\n {list}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\n\nexport const PENDING_KEY = \"__mari-timeline-pending__\";\n\n/** `pending` öğesini ekler ve `reverse`i uygular (bekleyen öğe hep \"en yeni\" uçta). */\nexport function buildItems(items: TimelineItem[], pending: React.ReactNode, reverse: boolean): TimelineItem[] {\n const all = [...items];\n if (pending !== undefined && pending !== null && pending !== false) {\n all.push({ key: PENDING_KEY, content: pending === true ? \"Devam ediyor…\" : pending, loading: true, color: \"neutral\" });\n }\n return reverse ? all.reverse() : all;\n}\n\n/**\n * İçerik noktanın hangi tarafında: `after` (sağ) ya da `before` (sol).\n * `alternate`de çift sıradakiler sağda başlar; öğenin `placement`ı önceliklidir.\n */\nexport function resolveSide(mode: NonNullable<TimelineProps[\"mode\"]>, index: number, placement: TimelineItem[\"placement\"]): \"after\" | \"before\" {\n if (mode === \"start\") return \"after\";\n if (mode === \"end\") return \"before\";\n if (placement) return placement === \"start\" ? \"after\" : \"before\";\n return index % 2 === 0 ? \"after\" : \"before\";\n}\n\n/** Üç sütunlu (başlık/boş | nokta | içerik) yerleşim gerekir mi. */\nexport function isThreeColumn(mode: NonNullable<TimelineProps[\"mode\"]>, titlePlacement: NonNullable<TimelineProps[\"titlePlacement\"]>): boolean {\n return mode === \"alternate\" || titlePlacement === \"opposite\";\n}\n"],"mappings":"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","names":[]}
|
package/dist/toast.js
CHANGED
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
Toast,
|
|
3
3
|
ToastProvider,
|
|
4
4
|
useToast
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-7FQQRTPX.js";
|
|
6
|
+
import "./chunk-RMNV2CE2.js";
|
|
7
|
+
import "./chunk-TSFAAREV.js";
|
|
8
|
+
import "./chunk-6CSUVVFG.js";
|
|
9
|
+
import "./chunk-POBOJBNJ.js";
|
|
10
|
+
import "./chunk-6AMBZXZJ.js";
|
|
11
|
+
import "./chunk-VKN374SD.js";
|
|
12
12
|
export {
|
|
13
13
|
Toast,
|
|
14
14
|
ToastProvider,
|
package/dist/tooltip.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Tooltip
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-XWBJPA3D.js";
|
|
4
|
+
import "./chunk-NYXU5EFE.js";
|
|
5
|
+
import "./chunk-6AMBZXZJ.js";
|
|
6
|
+
import "./chunk-VKN374SD.js";
|
|
7
7
|
export {
|
|
8
8
|
Tooltip
|
|
9
9
|
};
|
package/dist/tour.js
CHANGED
|
@@ -2,34 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
useModalBehavior
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-OYDG6C54.js";
|
|
6
6
|
import {
|
|
7
7
|
ContentSkeleton
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RMNV2CE2.js";
|
|
9
9
|
import {
|
|
10
10
|
SkeletonBlock
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-TSFAAREV.js";
|
|
12
|
+
import "./chunk-6CSUVVFG.js";
|
|
13
13
|
import {
|
|
14
14
|
FLOATING_ARROW_GAP_PX,
|
|
15
15
|
FLOATING_ARROW_INSET_PX,
|
|
16
16
|
FLOATING_EDGE_PX,
|
|
17
17
|
FLOATING_GAP_PX,
|
|
18
18
|
FloatingArrow
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OAWUZIIN.js";
|
|
20
20
|
import {
|
|
21
21
|
useFloatingPosition
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-GTNCXOUL.js";
|
|
23
|
+
import "./chunk-NYXU5EFE.js";
|
|
24
24
|
import {
|
|
25
25
|
elevationClass
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-MT4VH7QV.js";
|
|
27
27
|
import {
|
|
28
28
|
Button
|
|
29
|
-
} from "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
29
|
+
} from "./chunk-CVKAGR3D.js";
|
|
30
|
+
import "./chunk-POBOJBNJ.js";
|
|
31
|
+
import "./chunk-6AMBZXZJ.js";
|
|
32
|
+
import "./chunk-VKN374SD.js";
|
|
33
33
|
|
|
34
34
|
// src/tour/Tour.tsx
|
|
35
35
|
import { useEffect, useId, useRef, useState } from "react";
|
package/dist/tour.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tour/Tour.tsx","../src/tour/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { elevationClass } from \"../lib/elevationClass\";\nimport { FLOATING_ARROW_GAP_PX, FLOATING_ARROW_INSET_PX, FLOATING_EDGE_PX, FLOATING_GAP_PX, FloatingArrow } from \"../lib/FloatingArrow\";\nimport { useModalBehavior } from \"../lib/overlay\";\nimport { useFloatingPosition } from \"../lib/useFloatingPosition\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { TourProps, TourStep } from \"./types\";\nimport { isFullyVisible, spotlightPath, stepFromKey, type Box } from \"./utils\";\n\nexport type { TourProps, TourStep };\n\n/** Hedef çevresindeki boşluk ve köşe yarıçapı (rem). */\nconst SPOT_PAD_REM = 0.375;\nconst SPOT_RADIUS_REM = 0.5;\n\nconst remToPx = (rem: number) => rem * (Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16);\n\nconst TOUR_PLACEHOLDER = (\n <div className=\"flex flex-col gap-2 pr-6\">\n <SkeletonBlock active width=\"10rem\" height=\"1rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"100%\" height=\"0.75rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"70%\" height=\"0.75rem\" radius=\"sm\" />\n </div>\n);\n\nconst reducedMotion = () => typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n\n/** Hedefin ekrandaki kutusu, her karede (kaydırma/yeniden düzen sırasında karartma deliği hedefi izlesin). */\nfunction useTargetBox(active: boolean, el: HTMLElement | null): Box | null {\n const [box, setBox] = useState<Box | null>(null);\n useEffect(() => {\n if (!active || !el) {\n setBox(null);\n return;\n }\n let frame = 0;\n const read = () => {\n const r = el.getBoundingClientRect();\n setBox((prev) => (prev && prev.top === r.top && prev.left === r.left && prev.width === r.width && prev.height === r.height ? prev : { top: r.top, left: r.left, width: r.width, height: r.height }));\n frame = requestAnimationFrame(read);\n };\n read();\n return () => cancelAnimationFrame(frame);\n }, [active, el]);\n return box;\n}\n\n/** Karartma: hedef dışını örter ve sayfa tıklamalarını engeller (delik de dahil — tur modal). */\nfunction Mask({ box }: Readonly<{ box: Box | null }>) {\n const [size, setSize] = useState(() => ({ w: typeof window === \"undefined\" ? 0 : window.innerWidth, h: typeof window === \"undefined\" ? 0 : window.innerHeight }));\n useEffect(() => {\n const onResize = () => setSize({ w: window.innerWidth, h: window.innerHeight });\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n return (\n <div aria-hidden className=\"fixed inset-0 z-mari-modal\">\n <svg width={size.w} height={size.h} className=\"absolute inset-0 transition-opacity duration-200 starting:opacity-0 motion-reduce:transition-none\">\n <path d={spotlightPath(size.w, size.h, box, remToPx(SPOT_PAD_REM), remToPx(SPOT_RADIUS_REM))} fillRule=\"evenodd\" style={{ fill: \"var(--mari-color-scrim)\" }} />\n </svg>\n </div>\n );\n}\n\ninterface FooterProps {\n current: number;\n total: number;\n step: TourStep;\n onPrev: () => void;\n onNext: () => void;\n skeleton: boolean;\n}\n\nfunction Footer({ current, total, step, onPrev, onNext, skeleton }: Readonly<FooterProps>) {\n const last = current === total - 1;\n return (\n <div className=\"mt-4 flex items-center gap-2\">\n {total > 1 && (\n <>\n <span aria-hidden className=\"flex items-center gap-1\">\n {Array.from({ length: total }, (_, i) => (\n // Konumsal göstergeler.\n <span key={i} className={cn(\"h-1.5 rounded-full transition-all duration-200 motion-reduce:transition-none\", i === current ? \"w-4 bg-mari-primary\" : \"w-1.5 bg-mari-border\")} />\n ))}\n </span>\n <span className=\"text-xs text-mari-muted tabular-nums\">\n {current + 1} / {total}\n </span>\n </>\n )}\n <span className=\"ml-auto flex gap-2\">\n {current > 0 && (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" data-tour-back onClick={onPrev} skeleton={skeleton}>\n Geri\n </Button>\n )}\n <Button size=\"sm\" data-tour-primary onClick={onNext} skeleton={skeleton}>\n {step.nextButtonText ?? (last ? \"Bitir\" : \"Sonraki\")}\n </Button>\n </span>\n </div>\n );\n}\n\n/**\n * Faz 16.6 — yapı ant.design Tour'dan: arayüzü adım adım tanıtan rehber.\n * Her adım bir öğeyi vurgular (sayfa kararır, hedefin çevresi açık kalır) ve\n * yanında başlık/açıklama/görsel taşıyan bir panel açar; hedefsiz adım\n * ortada. Panel konumu ve ok Popover ile ortak (`useFloatingPosition`,\n * `FloatingArrow`).\n *\n * Erişilebilirlik: panel `role=\"dialog\"`; karartmalıyken modal (odak\n * panelde döner, Escape kapatır, kapanınca odak açılıştan önceki öğeye\n * döner). Açılışta odak \"Sonraki\"de; adım değişince içerik (adım no +\n * başlık + açıklama) `aria-live` ile okunur, odak düğmede kalır. ←/→ adım\n * değiştirir. Hareket azaltma tercihinde kaydırma anlık.\n */\nexport function Tour({\n steps,\n mask = true,\n arrow = true,\n scrollIntoView = true,\n onClose,\n onFinish,\n \"aria-label\": ariaLabel = \"Tanıtım turu\",\n className,\n skeleton = false,\n ...props\n}: TourProps) {\n const [open, setOpen] = useControllableState<boolean>({ value: props.open, defaultValue: props.defaultOpen ?? false, onChange: props.onOpenChange });\n const [current, setCurrent] = useControllableState<number>({ value: props.current, defaultValue: props.defaultCurrent ?? 0, onChange: props.onChange });\n const step = open ? steps[current] : undefined;\n const masked = step ? (step.mask ?? mask) : false;\n const titleId = useId();\n const descId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLElement | null>(null);\n const [targetEl, setTargetEl] = useState<HTMLElement | null>(null);\n\n // Hedef DOM'dan adım değişince çözülür (render sırasında DOM okunmaz).\n useEffect(() => {\n setTargetEl(open ? (steps[current]?.target?.() ?? null) : null);\n }, [open, current, steps]);\n anchorRef.current = targetEl;\n\n const coords = useFloatingPosition(open && targetEl !== null, anchorRef, panelRef, {\n placement: step?.placement ?? \"bottom\",\n gap: arrow ? FLOATING_ARROW_GAP_PX : FLOATING_GAP_PX,\n edge: FLOATING_EDGE_PX,\n arrow: arrow ? { inset: FLOATING_ARROW_INSET_PX, pointAtCenter: true } : undefined,\n });\n const box = useTargetBox(open && masked, targetEl);\n const refocusPrimary = useRef(false);\n useEffect(() => {\n if (!refocusPrimary.current) return;\n refocusPrimary.current = false;\n panelRef.current?.querySelector<HTMLElement>(\"[data-tour-primary]\")?.focus();\n }, [current]);\n\n const close = (finished = false) => {\n setOpen(false);\n if (finished) onFinish?.();\n else onClose?.(current);\n };\n\n useModalBehavior(open && masked, panelRef, () => close(), {\n lockScroll: false,\n getInitialFocus: (panel) => panel.querySelector<HTMLElement>(\"[data-tour-primary]\"),\n });\n\n // Karartmasız turda da Escape kapatır (modal davranışı yokken).\n useEffect(() => {\n if (!open || masked) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return;\n e.preventDefault();\n setOpen(false);\n onClose?.(current);\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, masked, current, setOpen, onClose]);\n\n useEffect(() => {\n if (!scrollIntoView || !targetEl) return;\n const r = targetEl.getBoundingClientRect();\n if (!isFullyVisible(r, window.innerWidth, window.innerHeight)) targetEl.scrollIntoView?.({ block: \"center\", inline: \"nearest\", behavior: reducedMotion() ? \"auto\" : \"smooth\" });\n }, [targetEl, scrollIntoView]);\n\n if (!open || !step || typeof document === \"undefined\") return null;\n\n\n const go = (next: number) => {\n const to = Math.max(0, Math.min(steps.length - 1, next));\n // İlk adıma dönünce \"Geri\" DOM'dan kalkar — odaktaysa body'ye düşmesin, \"Sonraki\"ye geçsin.\n if (to === 0 && document.activeElement?.hasAttribute(\"data-tour-back\")) refocusPrimary.current = true;\n setCurrent(to);\n };\n const next = () => (current >= steps.length - 1 ? close(true) : go(current + 1));\n const centered = targetEl === null;\n\n return createPortal(\n <>\n {masked && <Mask box={box} />}\n {/* ←/→ adım kısayolu dialog düzeyinde (içindeki düğmelerden kabarır). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal={masked || undefined}\n aria-label={ariaLabel}\n aria-describedby={`${titleId} ${descId}`}\n tabIndex={-1}\n onKeyDown={(e) => {\n const editable = (e.target as HTMLElement).closest(\"input, textarea, [contenteditable=true]\") !== null;\n const to = stepFromKey(e.key, current, steps.length, editable);\n if (to === null) return;\n e.preventDefault();\n go(to);\n }}\n className={cn(\n \"fixed z-mari-modal w-80 max-w-[calc(100vw-1rem)] rounded-lg bg-mari-surface p-4 text-sm text-mari-foreground outline-none\",\n \"transition-opacity duration-200 starting:opacity-0 motion-reduce:transition-none\",\n elevationClass.lg,\n centered && \"top-1/2 left-1/2 -translate-1/2\",\n // Konum ölçülene kadar `invisible` DEĞİL: görünmez öğedeki odak (Sonraki) tarayıcıda düşer, ←/→ kopardı.\n !centered && !coords && \"pointer-events-none opacity-0\",\n className\n )}\n style={centered ? undefined : { top: coords?.top ?? 0, left: coords?.left ?? 0 }}\n >\n {arrow && !centered && coords && <FloatingArrow side={coords.side} offset={coords.arrowOffset} />}\n <button\n type=\"button\"\n aria-label=\"Turu kapat\"\n onClick={() => close()}\n className=\"absolute top-2 right-2 grid size-7 place-items-center rounded-md text-mari-muted outline-none hover:bg-mari-surface-alt hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-mari-ring pointer-coarse:size-10\"\n >\n <XIcon aria-hidden size={16} />\n </button>\n <ContentSkeleton on={skeleton} fallback={TOUR_PLACEHOLDER}>\n <div>\n {step.cover && <div className=\"mb-3 overflow-hidden rounded-md [&_img]:w-full\">{step.cover}</div>}\n {/* Adım değişince içerik okunur; odak \"Sonraki\"de kalır. */}\n <div aria-live=\"polite\" className=\"pr-6\">\n <h2 id={titleId} className=\"font-semibold\">\n <span className=\"sr-only\">{`Adım ${current + 1} / ${steps.length}: `}</span>\n {step.title}\n </h2>\n {step.description && (\n <div id={descId} className=\"mt-1 text-mari-muted\">\n {step.description}\n </div>\n )}\n </div>\n </div>\n </ContentSkeleton>\n <Footer current={current} total={steps.length} step={step} onPrev={() => go(current - 1)} onNext={next} skeleton={skeleton} />\n </div>\n </>,\n document.body\n );\n}\n","/** Faz 16.6 — Tour'un saf yardımcıları. */\n\nexport interface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Karartma yolu: tüm ekranı kaplayan dikdörtgen + hedefin çevresinde\n * yuvarlatılmış bir delik (`fill-rule=\"evenodd\"`). `pad` hedefin çevresindeki\n * boşluk, `r` köşe yarıçapı (px; çağıran rem'den çevirir).\n */\nexport function spotlightPath(vw: number, vh: number, box: Box | null, pad: number, r: number): string {\n const outer = `M0 0H${vw}V${vh}H0Z`;\n if (!box) return outer;\n const x = box.left - pad;\n const y = box.top - pad;\n const w = box.width + pad * 2;\n const h = box.height + pad * 2;\n const rr = Math.max(0, Math.min(r, w / 2, h / 2));\n const hole = `M${x + rr} ${y}H${x + w - rr}A${rr} ${rr} 0 0 1 ${x + w} ${y + rr}V${y + h - rr}A${rr} ${rr} 0 0 1 ${x + w - rr} ${y + h}H${x + rr}A${rr} ${rr} 0 0 1 ${x} ${y + h - rr}V${y + rr}A${rr} ${rr} 0 0 1 ${x + rr} ${y}Z`;\n return `${outer}${hole}`;\n}\n\n/** Öğe görünür alanda tamamen mi (kaydırma gerekmez). */\nexport function isFullyVisible(box: Box, vw: number, vh: number): boolean {\n return box.top >= 0 && box.left >= 0 && box.top + box.height <= vh && box.left + box.width <= vw;\n}\n\n/** Yön tuşlarıyla adım: ←/→, sınırlarda kesilir. Yazı alanındayken (`editable`) uygulanmaz. */\nexport function stepFromKey(key: string, current: number, total: number, editable: boolean): number | null {\n if (editable) return null;\n if (key === \"ArrowRight\" && current < total - 1) return current + 1;\n if (key === \"ArrowLeft\" && current > 0) return current - 1;\n return null;\n}\n\n"],"mappings":"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","names":["next"]}
|
|
1
|
+
{"version":3,"sources":["../src/tour/Tour.tsx","../src/tour/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { elevationClass } from \"../lib/elevationClass\";\nimport { FLOATING_ARROW_GAP_PX, FLOATING_ARROW_INSET_PX, FLOATING_EDGE_PX, FLOATING_GAP_PX, FloatingArrow } from \"../lib/FloatingArrow\";\nimport { useModalBehavior } from \"../lib/overlay\";\nimport { useFloatingPosition } from \"../lib/useFloatingPosition\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { TourProps, TourStep } from \"./types\";\nimport { isFullyVisible, spotlightPath, stepFromKey, type Box } from \"./utils\";\n\nexport type { TourProps, TourStep };\n\n/** Hedef çevresindeki boşluk ve köşe yarıçapı (rem). */\nconst SPOT_PAD_REM = 0.375;\nconst SPOT_RADIUS_REM = 0.5;\n\nconst remToPx = (rem: number) => rem * (Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16);\n\nconst TOUR_PLACEHOLDER = (\n <div className=\"flex flex-col gap-2 pr-6\">\n <SkeletonBlock active width=\"10rem\" height=\"1rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"100%\" height=\"0.75rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"70%\" height=\"0.75rem\" radius=\"sm\" />\n </div>\n);\n\nconst reducedMotion = () => typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n\n/** Hedefin ekrandaki kutusu, her karede (kaydırma/yeniden düzen sırasında karartma deliği hedefi izlesin). */\nfunction useTargetBox(active: boolean, el: HTMLElement | null): Box | null {\n const [box, setBox] = useState<Box | null>(null);\n useEffect(() => {\n if (!active || !el) {\n setBox(null);\n return;\n }\n let frame = 0;\n const read = () => {\n const r = el.getBoundingClientRect();\n setBox((prev) => (prev && prev.top === r.top && prev.left === r.left && prev.width === r.width && prev.height === r.height ? prev : { top: r.top, left: r.left, width: r.width, height: r.height }));\n frame = requestAnimationFrame(read);\n };\n read();\n return () => cancelAnimationFrame(frame);\n }, [active, el]);\n return box;\n}\n\n/** Karartma: hedef dışını örter ve sayfa tıklamalarını engeller (delik de dahil — tur modal). */\nfunction Mask({ box }: Readonly<{ box: Box | null }>) {\n const [size, setSize] = useState(() => ({ w: typeof window === \"undefined\" ? 0 : window.innerWidth, h: typeof window === \"undefined\" ? 0 : window.innerHeight }));\n useEffect(() => {\n const onResize = () => setSize({ w: window.innerWidth, h: window.innerHeight });\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n return (\n <div aria-hidden className=\"fixed inset-0 z-mari-modal\">\n <svg width={size.w} height={size.h} className=\"absolute inset-0 transition-opacity duration-200 starting:opacity-0 motion-reduce:transition-none\">\n <path d={spotlightPath(size.w, size.h, box, remToPx(SPOT_PAD_REM), remToPx(SPOT_RADIUS_REM))} fillRule=\"evenodd\" style={{ fill: \"var(--mari-color-scrim)\" }} />\n </svg>\n </div>\n );\n}\n\ninterface FooterProps {\n current: number;\n total: number;\n step: TourStep;\n onPrev: () => void;\n onNext: () => void;\n skeleton: boolean;\n}\n\nfunction Footer({ current, total, step, onPrev, onNext, skeleton }: Readonly<FooterProps>) {\n const last = current === total - 1;\n return (\n <div className=\"mt-4 flex items-center gap-2\">\n {total > 1 && (\n <>\n <span aria-hidden className=\"flex items-center gap-1\">\n {Array.from({ length: total }, (_, i) => (\n // Konumsal göstergeler.\n <span key={i} className={cn(\"h-1.5 rounded-full transition-all duration-200 motion-reduce:transition-none\", i === current ? \"w-4 bg-mari-primary\" : \"w-1.5 bg-mari-border\")} />\n ))}\n </span>\n <span className=\"text-xs text-mari-muted tabular-nums\">\n {current + 1} / {total}\n </span>\n </>\n )}\n <span className=\"ml-auto flex gap-2\">\n {current > 0 && (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" data-tour-back onClick={onPrev} skeleton={skeleton}>\n Geri\n </Button>\n )}\n <Button size=\"sm\" data-tour-primary onClick={onNext} skeleton={skeleton}>\n {step.nextButtonText ?? (last ? \"Bitir\" : \"Sonraki\")}\n </Button>\n </span>\n </div>\n );\n}\n\n/*\n * yapı ant.design Tour'dan: arayüzü adım adım tanıtan rehber.\n * Her adım bir öğeyi vurgular (sayfa kararır, hedefin çevresi açık kalır) ve\n * yanında başlık/açıklama/görsel taşıyan bir panel açar; hedefsiz adım\n * ortada. Panel konumu ve ok Popover ile ortak (`useFloatingPosition`,\n * `FloatingArrow`).\n */\n/**\n * Erişilebilirlik: panel `role=\"dialog\"`; karartmalıyken modal (odak\n * panelde döner, Escape kapatır, kapanınca odak açılıştan önceki öğeye\n * döner). Açılışta odak \"Sonraki\"de; adım değişince içerik (adım no +\n * başlık + açıklama) `aria-live` ile okunur, odak düğmede kalır. ←/→ adım\n * değiştirir. Hareket azaltma tercihinde kaydırma anlık.\n */\nexport function Tour({\n steps,\n mask = true,\n arrow = true,\n scrollIntoView = true,\n onClose,\n onFinish,\n \"aria-label\": ariaLabel = \"Tanıtım turu\",\n className,\n skeleton = false,\n ...props\n}: TourProps) {\n const [open, setOpen] = useControllableState<boolean>({ value: props.open, defaultValue: props.defaultOpen ?? false, onChange: props.onOpenChange });\n const [current, setCurrent] = useControllableState<number>({ value: props.current, defaultValue: props.defaultCurrent ?? 0, onChange: props.onChange });\n const step = open ? steps[current] : undefined;\n const masked = step ? (step.mask ?? mask) : false;\n const titleId = useId();\n const descId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLElement | null>(null);\n const [targetEl, setTargetEl] = useState<HTMLElement | null>(null);\n\n // Hedef DOM'dan adım değişince çözülür (render sırasında DOM okunmaz).\n useEffect(() => {\n setTargetEl(open ? (steps[current]?.target?.() ?? null) : null);\n }, [open, current, steps]);\n anchorRef.current = targetEl;\n\n const coords = useFloatingPosition(open && targetEl !== null, anchorRef, panelRef, {\n placement: step?.placement ?? \"bottom\",\n gap: arrow ? FLOATING_ARROW_GAP_PX : FLOATING_GAP_PX,\n edge: FLOATING_EDGE_PX,\n arrow: arrow ? { inset: FLOATING_ARROW_INSET_PX, pointAtCenter: true } : undefined,\n });\n const box = useTargetBox(open && masked, targetEl);\n const refocusPrimary = useRef(false);\n useEffect(() => {\n if (!refocusPrimary.current) return;\n refocusPrimary.current = false;\n panelRef.current?.querySelector<HTMLElement>(\"[data-tour-primary]\")?.focus();\n }, [current]);\n\n const close = (finished = false) => {\n setOpen(false);\n if (finished) onFinish?.();\n else onClose?.(current);\n };\n\n useModalBehavior(open && masked, panelRef, () => close(), {\n lockScroll: false,\n getInitialFocus: (panel) => panel.querySelector<HTMLElement>(\"[data-tour-primary]\"),\n });\n\n // Karartmasız turda da Escape kapatır (modal davranışı yokken).\n useEffect(() => {\n if (!open || masked) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return;\n e.preventDefault();\n setOpen(false);\n onClose?.(current);\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, masked, current, setOpen, onClose]);\n\n useEffect(() => {\n if (!scrollIntoView || !targetEl) return;\n const r = targetEl.getBoundingClientRect();\n if (!isFullyVisible(r, window.innerWidth, window.innerHeight)) targetEl.scrollIntoView?.({ block: \"center\", inline: \"nearest\", behavior: reducedMotion() ? \"auto\" : \"smooth\" });\n }, [targetEl, scrollIntoView]);\n\n if (!open || !step || typeof document === \"undefined\") return null;\n\n\n const go = (next: number) => {\n const to = Math.max(0, Math.min(steps.length - 1, next));\n // İlk adıma dönünce \"Geri\" DOM'dan kalkar — odaktaysa body'ye düşmesin, \"Sonraki\"ye geçsin.\n if (to === 0 && document.activeElement?.hasAttribute(\"data-tour-back\")) refocusPrimary.current = true;\n setCurrent(to);\n };\n const next = () => (current >= steps.length - 1 ? close(true) : go(current + 1));\n const centered = targetEl === null;\n\n return createPortal(\n <>\n {masked && <Mask box={box} />}\n {/* ←/→ adım kısayolu dialog düzeyinde (içindeki düğmelerden kabarır). */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal={masked || undefined}\n aria-label={ariaLabel}\n aria-describedby={`${titleId} ${descId}`}\n tabIndex={-1}\n onKeyDown={(e) => {\n const editable = (e.target as HTMLElement).closest(\"input, textarea, [contenteditable=true]\") !== null;\n const to = stepFromKey(e.key, current, steps.length, editable);\n if (to === null) return;\n e.preventDefault();\n go(to);\n }}\n className={cn(\n \"fixed z-mari-modal w-80 max-w-[calc(100vw-1rem)] rounded-lg bg-mari-surface p-4 text-sm text-mari-foreground outline-none\",\n \"transition-opacity duration-200 starting:opacity-0 motion-reduce:transition-none\",\n elevationClass.lg,\n centered && \"top-1/2 left-1/2 -translate-1/2\",\n // Konum ölçülene kadar `invisible` DEĞİL: görünmez öğedeki odak (Sonraki) tarayıcıda düşer, ←/→ kopardı.\n !centered && !coords && \"pointer-events-none opacity-0\",\n className\n )}\n style={centered ? undefined : { top: coords?.top ?? 0, left: coords?.left ?? 0 }}\n >\n {arrow && !centered && coords && <FloatingArrow side={coords.side} offset={coords.arrowOffset} />}\n <button\n type=\"button\"\n aria-label=\"Turu kapat\"\n onClick={() => close()}\n className=\"absolute top-2 right-2 grid size-7 place-items-center rounded-md text-mari-muted outline-none hover:bg-mari-surface-alt hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-mari-ring pointer-coarse:size-10\"\n >\n <XIcon aria-hidden size={16} />\n </button>\n <ContentSkeleton on={skeleton} fallback={TOUR_PLACEHOLDER}>\n <div>\n {step.cover && <div className=\"mb-3 overflow-hidden rounded-md [&_img]:w-full\">{step.cover}</div>}\n {/* Adım değişince içerik okunur; odak \"Sonraki\"de kalır. */}\n <div aria-live=\"polite\" className=\"pr-6\">\n <h2 id={titleId} className=\"font-semibold\">\n <span className=\"sr-only\">{`Adım ${current + 1} / ${steps.length}: `}</span>\n {step.title}\n </h2>\n {step.description && (\n <div id={descId} className=\"mt-1 text-mari-muted\">\n {step.description}\n </div>\n )}\n </div>\n </div>\n </ContentSkeleton>\n <Footer current={current} total={steps.length} step={step} onPrev={() => go(current - 1)} onNext={next} skeleton={skeleton} />\n </div>\n </>,\n document.body\n );\n}\n","/** Tour'un saf yardımcıları. */\n\nexport interface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Karartma yolu: tüm ekranı kaplayan dikdörtgen + hedefin çevresinde\n * yuvarlatılmış bir delik (`fill-rule=\"evenodd\"`). `pad` hedefin çevresindeki\n * boşluk, `r` köşe yarıçapı (px; çağıran rem'den çevirir).\n */\nexport function spotlightPath(vw: number, vh: number, box: Box | null, pad: number, r: number): string {\n const outer = `M0 0H${vw}V${vh}H0Z`;\n if (!box) return outer;\n const x = box.left - pad;\n const y = box.top - pad;\n const w = box.width + pad * 2;\n const h = box.height + pad * 2;\n const rr = Math.max(0, Math.min(r, w / 2, h / 2));\n const hole = `M${x + rr} ${y}H${x + w - rr}A${rr} ${rr} 0 0 1 ${x + w} ${y + rr}V${y + h - rr}A${rr} ${rr} 0 0 1 ${x + w - rr} ${y + h}H${x + rr}A${rr} ${rr} 0 0 1 ${x} ${y + h - rr}V${y + rr}A${rr} ${rr} 0 0 1 ${x + rr} ${y}Z`;\n return `${outer}${hole}`;\n}\n\n/** Öğe görünür alanda tamamen mi (kaydırma gerekmez). */\nexport function isFullyVisible(box: Box, vw: number, vh: number): boolean {\n return box.top >= 0 && box.left >= 0 && box.top + box.height <= vh && box.left + box.width <= vw;\n}\n\n/** Yön tuşlarıyla adım: ←/→, sınırlarda kesilir. Yazı alanındayken (`editable`) uygulanmaz. */\nexport function stepFromKey(key: string, current: number, total: number, editable: boolean): number | null {\n if (editable) return null;\n if (key === \"ArrowRight\" && current < total - 1) return current + 1;\n if (key === \"ArrowLeft\" && current > 0) return current - 1;\n return null;\n}\n\n"],"mappings":"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","names":["next"]}
|
package/dist/transfer.js
CHANGED
|
@@ -2,33 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
Checkbox
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PR2MCHU4.js";
|
|
6
6
|
import {
|
|
7
7
|
Input
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-L6DBWUAB.js";
|
|
9
9
|
import {
|
|
10
10
|
SkeletonSlot
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-MXGY2ENX.js";
|
|
12
12
|
import {
|
|
13
13
|
foldForSearch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-LNL4TCGL.js";
|
|
15
15
|
import "./chunk-KSPM2Z3T.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-NENNFQEY.js";
|
|
17
17
|
import {
|
|
18
18
|
useFieldGroup,
|
|
19
19
|
useFieldSkeleton
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-NPFMPRII.js";
|
|
21
|
+
import "./chunk-MT4VH7QV.js";
|
|
22
22
|
import {
|
|
23
23
|
Button
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-CVKAGR3D.js";
|
|
25
|
+
import "./chunk-POBOJBNJ.js";
|
|
26
26
|
import {
|
|
27
27
|
borderStrongColorClass
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
29
29
|
import {
|
|
30
30
|
skeletonBoxProps
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-VKN374SD.js";
|
|
32
32
|
|
|
33
33
|
// src/transfer/Transfer.tsx
|
|
34
34
|
import { useState as useState2 } from "react";
|