@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/modal.js
CHANGED
|
@@ -10,26 +10,26 @@ import {
|
|
|
10
10
|
useModalBehavior,
|
|
11
11
|
usePresence,
|
|
12
12
|
useRefocusAfterSkeleton
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-OYDG6C54.js";
|
|
14
14
|
import {
|
|
15
15
|
ContentSkeleton
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-RMNV2CE2.js";
|
|
17
17
|
import {
|
|
18
18
|
Skeleton,
|
|
19
19
|
SkeletonBlock
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-TSFAAREV.js";
|
|
21
|
+
import "./chunk-6CSUVVFG.js";
|
|
22
22
|
import {
|
|
23
23
|
Button
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-CVKAGR3D.js";
|
|
25
25
|
import {
|
|
26
26
|
touchTargetSquareClass
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-POBOJBNJ.js";
|
|
28
28
|
import {
|
|
29
29
|
bgSubtleClass,
|
|
30
30
|
textClass
|
|
31
|
-
} from "./chunk-
|
|
32
|
-
import "./chunk-
|
|
31
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
32
|
+
import "./chunk-VKN374SD.js";
|
|
33
33
|
|
|
34
34
|
// src/modal/Modal.tsx
|
|
35
35
|
import { useId, useRef, useState } from "react";
|
package/dist/modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modal/Modal.tsx","../src/modal/utils.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { Skeleton, SkeletonBlock } from \"../skeleton\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { touchTargetSquareClass } from \"../lib/sizeClasses\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { findAutofocus, firstFocusable, reachable, useModalBehavior, usePresence, useRefocusAfterSkeleton } from \"../lib/overlay\";\nimport type { ModalProps } from \"./types\";\nimport { renderModalIcon, sizeMap } from \"./utils\";\n\nexport type { ModalProps };\n\nconst EXIT_MS = 200;\nconst CLOSE_SELECTOR = \"[data-modal-close]\";\n\n/**\n * İlk odak: `initialFocus` → data-autofocus → (yıkıcı onayda) Vazgeç →\n * gövdedeki ilk alan → Vazgeç → Kapat → panel. İskelette düğmeler/alanlar\n * görünmez kopyadadır (`reachable` eler) → odak Kapat'a düşer.\n */\nfunction getModalInitialFocus(panel: HTMLElement, isAlert: boolean, preferred?: \"cancel\" | \"confirm\"): HTMLElement | null {\n const cancel = reachable(panel.querySelector<HTMLElement>(\"[data-modal-cancel]\"));\n const confirm = reachable(panel.querySelector<HTMLElement>(\"[data-modal-confirm]\"));\n const body = panel.querySelector<HTMLElement>(\"[data-modal-body]\");\n const explicit = preferred ? { confirm, cancel }[preferred] : null;\n return (\n explicit ??\n findAutofocus(panel) ??\n (isAlert ? cancel : null) ??\n (body && firstFocusable(body)) ??\n cancel ??\n panel.querySelector<HTMLElement>(CLOSE_SELECTOR)\n );\n}\n\n/** Ölçülecek içerik yoksa (başlık da veriden geliyor ya da yerleşimsiz ortam). */\nconst HEADER_PLACEHOLDER = (\n <div className=\"flex flex-col gap-2.5 py-1.5\">\n <SkeletonBlock active width=\"50%\" height=\"1.125rem\" radius=\"sm\" />\n </div>\n);\nconst FOOTER_PLACEHOLDER = (\n <div className=\"flex justify-end gap-2\">\n <SkeletonBlock active width=\"5rem\" height=\"2.25rem\" />\n <SkeletonBlock active width=\"5rem\" height=\"2.25rem\" />\n </div>\n);\n\n/** `onConfirm` Promise dönerse çözülene kadar onay düğmesi \"yükleniyor\". */\nfunction useConfirm(onConfirm: ModalProps[\"onConfirm\"]) {\n const [pending, setPending] = useState(false);\n const handleConfirm = async () => {\n const result = onConfirm?.();\n if (!(result instanceof Promise)) return;\n setPending(true);\n try {\n await result;\n } finally {\n setPending(false);\n }\n };\n return { pending, handleConfirm };\n}\n\nfunction ModalHeader({\n icon,\n title,\n titleId,\n description,\n descriptionId,\n closeInset,\n skeleton,\n}: Readonly<{\n icon: React.ReactNode;\n title: React.ReactNode;\n titleId: string;\n description: React.ReactNode;\n descriptionId: string;\n /** Kapat düğmesinin olduğu kenar — başlık onun altına girmesin. */\n closeInset?: Exclude<ModalProps[\"closeButtonPosition\"], undefined>;\n skeleton: boolean;\n}>) {\n return (\n <div className={cn(\"shrink-0 px-6 pt-6\", closeInset === \"left\" && \"pl-14\", closeInset === \"right\" && \"pr-14\")}>\n <ContentSkeleton on={skeleton} fallback={HEADER_PLACEHOLDER}>\n <div className=\"flex gap-4\">\n {icon}\n <div className=\"min-w-0 flex-1 self-center\">\n {title && (\n <h2 id={titleId} className=\"text-lg font-semibold leading-7 text-mari-foreground\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descriptionId} className=\"mt-1 text-sm text-mari-muted\">\n {description}\n </p>\n )}\n </div>\n </div>\n </ContentSkeleton>\n </div>\n );\n}\n\nfunction ModalBody({\n indented,\n hasFooter,\n skeleton,\n className,\n children,\n}: Readonly<{\n indented: boolean;\n hasFooter: boolean;\n skeleton: boolean;\n className?: string;\n children: React.ReactNode;\n}>) {\n const ref = useRef<HTMLDivElement>(null);\n // Uzun metin (kullanım koşulları) kayar ama içinde odaklanabilir öğe yok →\n // klavyeyle kaydırılabilsin diye taşarken gövde Tab durağı olur.\n const scrollable = useScrollable(ref, \"y\", [children, skeleton]);\n return (\n <div\n ref={ref}\n data-modal-body\n tabIndex={scrollable && !skeleton ? 0 : undefined}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 pt-4 text-sm text-mari-foreground\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring\",\n // Durum ikonu varsa gövde başlıkla hizalı (ikon + boşluk kadar içeride).\n indented && \"sm:pl-20\",\n // Footer varken de küçük bir alt pay: satır içi dolgu ya da kenardaki\n // alanın odak halkası 1-2px taşıp gereksiz kaydırma çubuğu açmasın.\n hasFooter ? \"pb-1\" : \"pb-6\",\n className\n )}\n >\n <ContentSkeleton on={skeleton} fallback={<Skeleton active title={false} paragraph={{ rows: 3 }} />}>\n {children}\n </ContentSkeleton>\n </div>\n );\n}\n\nfunction CloseButton({ onClose, position }: Readonly<{ onClose: () => void; position: ModalProps[\"closeButtonPosition\"] }>) {\n return (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Kapat\"\n data-modal-close\n className={cn(\n \"absolute top-3 z-10 inline-flex size-8 cursor-pointer items-center justify-center rounded-md text-mari-muted transition-colors\",\n \"hover:bg-mari-surface-alt hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n touchTargetSquareClass.md,\n position === \"left\" ? \"left-3\" : \"right-3\"\n )}\n >\n <XIcon size={18} aria-hidden />\n </button>\n );\n}\n\ninterface FooterButtonsProps {\n position: ModalProps[\"footerButtonPosition\"];\n cancelText?: string;\n confirmText?: string;\n onCancel: () => void;\n onConfirm: () => void;\n color: ModalProps[\"color\"];\n loading: boolean;\n disabled: boolean;\n}\n\n/** `footer` verilmişse o (`null` = alt çubuk yok), yoksa metni verilen düğmeler. */\nfunction resolveFooter({ footer, ...buttons }: FooterButtonsProps & { footer: React.ReactNode }): React.ReactNode {\n if (footer !== undefined) return footer;\n if (!buttons.cancelText && !buttons.confirmText) return null;\n return <FooterButtons {...buttons} />;\n}\n\nfunction FooterButtons({ position, cancelText, confirmText, onCancel, onConfirm, color, loading, disabled }: Readonly<FooterButtonsProps>) {\n return (\n // Mobilde düğmeler tam genişlik ve alt alta (birincil altta, başparmak erişiminde).\n <div className={cn(\"flex flex-col-reverse gap-2 sm:flex-row\", position === \"left\" ? \"sm:justify-start\" : \"sm:justify-end\")}>\n {cancelText && (\n <Button variant=\"outline\" color=\"neutral\" onClick={onCancel} data-modal-cancel className=\"w-full sm:w-auto\">\n {cancelText}\n </Button>\n )}\n {confirmText && (\n <Button color={color === \"neutral\" || !color ? \"primary\" : color} onClick={onConfirm} loading={loading} disabled={disabled} data-modal-confirm className=\"w-full sm:w-auto\">\n {confirmText}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * Faz 9 temel ARIA'yı düzeltmişti (role=dialog, Escape, odağı geri verme).\n * Faz 13.6 — yapı ant.design Modal'dan, overlay davranışı Drawer ile ortak\n * (`lib/overlay.ts`). Eski sürümde kalanlar:\n * - Odak tuzağı YOKTU (belgede \"focus-trap\" yazmasına rağmen Tab dışarı\n * kaçıyordu); sayfa kaydırması kilitlenmiyordu; portal yoktu.\n * - Uzun içerik ekrandan taşıyordu — artık gövde kendi içinde kayar.\n * - `title` zorunlu string'di; açıklama, özel footer, genişlik yoktu.\n * - Async onay için yükleniyor durumu, yıkıcı onay için `alertdialog` yoktu.\n * - Kapalıyken `inert` ile DOM'da kalıyordu; artık kapanış animasyonundan\n * sonra unmount.\n *\n * Faz 15.6 — `skeleton`: başlık (ikon dahil), gövde ve alt çubuk\n * `ContentSkeleton` ile içeriğin kendi şeklinde iskelete döner; Kapat ve\n * Escape çalışır, `aria-busy`. Veri gelince odak (hâlâ Kapat'taysa) normal\n * ilk odağa taşınır. Kapat düğmesi 44px dokunma hedefi.\n */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n icon,\n color,\n children,\n showCloseButton = true,\n closeButtonPosition = \"right\",\n footer,\n footerButtonPosition = \"right\",\n confirmButtonText,\n cancelButtonText,\n onConfirm,\n onCancel,\n confirmLoading,\n confirmDisabled = false,\n initialFocus,\n size = \"md\",\n width,\n maskClosable = true,\n keyboard = true,\n skeleton = false,\n \"aria-label\": ariaLabel,\n className,\n bodyClassName,\n}: ModalProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n const { pending, handleConfirm } = useConfirm(onConfirm);\n const present = usePresence(open, EXIT_MS);\n\n const isAlert = (color === \"error\" || color === \"warning\") && Boolean(confirmButtonText);\n const getInitialFocus = (panel: HTMLElement) => getModalInitialFocus(panel, isAlert, initialFocus);\n\n useModalBehavior(open, panelRef, onClose, { closeOnEscape: keyboard, getInitialFocus });\n useRefocusAfterSkeleton(open, skeleton, panelRef, getInitialFocus, CLOSE_SELECTOR);\n\n if (!present || typeof document === \"undefined\") return null;\n\n const iconNode = renderModalIcon(color, icon);\n const footerNode = resolveFooter({\n footer,\n position: footerButtonPosition,\n cancelText: cancelButtonText,\n confirmText: confirmButtonText,\n onCancel: onCancel ?? onClose,\n onConfirm: handleConfirm,\n color,\n loading: confirmLoading ?? pending,\n disabled: confirmDisabled,\n });\n\n return createPortal(\n <div className={cn(\"fixed inset-0 z-mari-modal\", !open && \"pointer-events-none\")}>\n <div\n aria-hidden\n onClick={maskClosable ? onClose : undefined}\n className={cn(\n \"absolute inset-0 bg-mari-scrim transition-opacity duration-200 motion-reduce:transition-none starting:opacity-0\",\n open ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {/* Kaydırılabilir yerleşim katmanı: çok uzun modal ekranı aşarsa gövde kayar. */}\n <div className=\"pointer-events-none absolute inset-0 flex items-end justify-center p-3 sm:items-center sm:p-6\">\n <div\n ref={panelRef}\n role={isAlert ? \"alertdialog\" : \"dialog\"}\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n aria-describedby={description ? descriptionId : undefined}\n aria-busy={skeleton || undefined}\n tabIndex={-1}\n style={width !== undefined ? { maxWidth: width } : undefined}\n // Tailwind v4'te translate-*/scale-* ayrı `translate`/`scale` CSS\n // özelliklerini yazar, `transform`u değil — geçiş listesinde onlar\n // olmalı. Eskiden `transition-[opacity,transform]` vardı: kapanışta\n // panel ilk karede aniden kayıp küçülüyor, sadece opaklık yumuşak\n // soluyordu (\"kapatırken tekliyor\" kullanıcı bulgusu). Aynı hata\n // Card hover, MegaMenu ve MobileNavLevel'da da düzeltildi.\n className={cn(\n \"pointer-events-auto relative flex max-h-[calc(100dvh-1.5rem)] w-full flex-col rounded-xl border border-mari-border bg-mari-surface text-mari-foreground shadow-mari-xl outline-none sm:max-h-[calc(100dvh-3rem)]\",\n \"transition-[opacity,translate,scale] duration-200 ease-out motion-reduce:transition-none starting:translate-y-2 starting:scale-[0.98] starting:opacity-0\",\n open ? \"translate-y-0 scale-100 opacity-100\" : \"translate-y-2 scale-[0.98] opacity-0\",\n width === undefined && sizeMap[size],\n className\n )}\n >\n {showCloseButton && <CloseButton onClose={onClose} position={closeButtonPosition} />}\n\n {(title || description || iconNode) && (\n <ModalHeader\n icon={iconNode}\n title={title}\n titleId={titleId}\n description={description}\n descriptionId={descriptionId}\n closeInset={showCloseButton ? closeButtonPosition : undefined}\n skeleton={skeleton}\n />\n )}\n\n {children !== undefined && children !== null && (\n <ModalBody indented={Boolean(iconNode)} hasFooter={Boolean(footerNode)} skeleton={skeleton} className={bodyClassName}>\n {children}\n </ModalBody>\n )}\n\n {footerNode && (\n <div className=\"shrink-0 px-6 pb-6 pt-5\">\n <ContentSkeleton on={skeleton} fallback={FOOTER_PLACEHOLDER}>\n {footerNode}\n </ContentSkeleton>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","import React from \"react\";\nimport { AlertTriangleIcon, CheckCircle2Icon, InfoIcon, XCircleIcon, SparklesIcon } from \"lucide-react\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { bgSubtleClass, textClass } from \"../lib/colorClasses\";\n\nconst ICON_BY_COLOR: Record<ColorRole, React.ComponentType<{ className?: string; size?: number }>> = {\n success: CheckCircle2Icon,\n warning: AlertTriangleIcon,\n error: XCircleIcon,\n info: InfoIcon,\n primary: InfoIcon,\n accent: SparklesIcon,\n neutral: InfoIcon,\n};\n\n/**\n * Durum ikonu tonlu bir dairenin içinde (ant.design confirm düzeninin\n * yapısı). `color` yoksa ve özel `icon` da yoksa hiç ikon gösterilmez.\n */\nexport function renderModalIcon(color: ColorRole | undefined, icon: React.ReactNode): React.ReactNode {\n if (!color && !icon) return null;\n const role = color ?? \"neutral\";\n const Icon = ICON_BY_COLOR[role];\n return (\n <span aria-hidden className={`flex size-10 shrink-0 items-center justify-center rounded-full ${bgSubtleClass[role]} ${textClass[role]}`}>\n {icon ?? <Icon size={20} />}\n </span>\n );\n}\n\n/** ant.design: varsayılan 520px. */\nexport const sizeMap: Record<Size, string> = {\n sm: \"sm:max-w-[25rem]\",\n md: \"sm:max-w-[32.5rem]\",\n lg: \"sm:max-w-[45rem]\",\n};\n"],"mappings":"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","names":["jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/modal/Modal.tsx","../src/modal/utils.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { Skeleton, SkeletonBlock } from \"../skeleton\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { touchTargetSquareClass } from \"../lib/sizeClasses\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { findAutofocus, firstFocusable, reachable, useModalBehavior, usePresence, useRefocusAfterSkeleton } from \"../lib/overlay\";\nimport type { ModalProps } from \"./types\";\nimport { renderModalIcon, sizeMap } from \"./utils\";\n\nexport type { ModalProps };\n\nconst EXIT_MS = 200;\nconst CLOSE_SELECTOR = \"[data-modal-close]\";\n\n/**\n * İlk odak: `initialFocus` → data-autofocus → (yıkıcı onayda) Vazgeç →\n * gövdedeki ilk alan → Vazgeç → Kapat → panel. İskelette düğmeler/alanlar\n * görünmez kopyadadır (`reachable` eler) → odak Kapat'a düşer.\n */\nfunction getModalInitialFocus(panel: HTMLElement, isAlert: boolean, preferred?: \"cancel\" | \"confirm\"): HTMLElement | null {\n const cancel = reachable(panel.querySelector<HTMLElement>(\"[data-modal-cancel]\"));\n const confirm = reachable(panel.querySelector<HTMLElement>(\"[data-modal-confirm]\"));\n const body = panel.querySelector<HTMLElement>(\"[data-modal-body]\");\n const explicit = preferred ? { confirm, cancel }[preferred] : null;\n return (\n explicit ??\n findAutofocus(panel) ??\n (isAlert ? cancel : null) ??\n (body && firstFocusable(body)) ??\n cancel ??\n panel.querySelector<HTMLElement>(CLOSE_SELECTOR)\n );\n}\n\n/** Ölçülecek içerik yoksa (başlık da veriden geliyor ya da yerleşimsiz ortam). */\nconst HEADER_PLACEHOLDER = (\n <div className=\"flex flex-col gap-2.5 py-1.5\">\n <SkeletonBlock active width=\"50%\" height=\"1.125rem\" radius=\"sm\" />\n </div>\n);\nconst FOOTER_PLACEHOLDER = (\n <div className=\"flex justify-end gap-2\">\n <SkeletonBlock active width=\"5rem\" height=\"2.25rem\" />\n <SkeletonBlock active width=\"5rem\" height=\"2.25rem\" />\n </div>\n);\n\n/** `onConfirm` Promise dönerse çözülene kadar onay düğmesi \"yükleniyor\". */\nfunction useConfirm(onConfirm: ModalProps[\"onConfirm\"]) {\n const [pending, setPending] = useState(false);\n const handleConfirm = async () => {\n const result = onConfirm?.();\n if (!(result instanceof Promise)) return;\n setPending(true);\n try {\n await result;\n } finally {\n setPending(false);\n }\n };\n return { pending, handleConfirm };\n}\n\nfunction ModalHeader({\n icon,\n title,\n titleId,\n description,\n descriptionId,\n closeInset,\n skeleton,\n}: Readonly<{\n icon: React.ReactNode;\n title: React.ReactNode;\n titleId: string;\n description: React.ReactNode;\n descriptionId: string;\n /** Kapat düğmesinin olduğu kenar — başlık onun altına girmesin. */\n closeInset?: Exclude<ModalProps[\"closeButtonPosition\"], undefined>;\n skeleton: boolean;\n}>) {\n return (\n <div className={cn(\"shrink-0 px-6 pt-6\", closeInset === \"left\" && \"pl-14\", closeInset === \"right\" && \"pr-14\")}>\n <ContentSkeleton on={skeleton} fallback={HEADER_PLACEHOLDER}>\n <div className=\"flex gap-4\">\n {icon}\n <div className=\"min-w-0 flex-1 self-center\">\n {title && (\n <h2 id={titleId} className=\"text-lg font-semibold leading-7 text-mari-foreground\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descriptionId} className=\"mt-1 text-sm text-mari-muted\">\n {description}\n </p>\n )}\n </div>\n </div>\n </ContentSkeleton>\n </div>\n );\n}\n\nfunction ModalBody({\n indented,\n hasFooter,\n skeleton,\n className,\n children,\n}: Readonly<{\n indented: boolean;\n hasFooter: boolean;\n skeleton: boolean;\n className?: string;\n children: React.ReactNode;\n}>) {\n const ref = useRef<HTMLDivElement>(null);\n // Uzun metin (kullanım koşulları) kayar ama içinde odaklanabilir öğe yok →\n // klavyeyle kaydırılabilsin diye taşarken gövde Tab durağı olur.\n const scrollable = useScrollable(ref, \"y\", [children, skeleton]);\n return (\n <div\n ref={ref}\n data-modal-body\n tabIndex={scrollable && !skeleton ? 0 : undefined}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 pt-4 text-sm text-mari-foreground\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring\",\n // Durum ikonu varsa gövde başlıkla hizalı (ikon + boşluk kadar içeride).\n indented && \"sm:pl-20\",\n // Footer varken de küçük bir alt pay: satır içi dolgu ya da kenardaki\n // alanın odak halkası 1-2px taşıp gereksiz kaydırma çubuğu açmasın.\n hasFooter ? \"pb-1\" : \"pb-6\",\n className\n )}\n >\n <ContentSkeleton on={skeleton} fallback={<Skeleton active title={false} paragraph={{ rows: 3 }} />}>\n {children}\n </ContentSkeleton>\n </div>\n );\n}\n\nfunction CloseButton({ onClose, position }: Readonly<{ onClose: () => void; position: ModalProps[\"closeButtonPosition\"] }>) {\n return (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Kapat\"\n data-modal-close\n className={cn(\n \"absolute top-3 z-10 inline-flex size-8 cursor-pointer items-center justify-center rounded-md text-mari-muted transition-colors\",\n \"hover:bg-mari-surface-alt hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n touchTargetSquareClass.md,\n position === \"left\" ? \"left-3\" : \"right-3\"\n )}\n >\n <XIcon size={18} aria-hidden />\n </button>\n );\n}\n\ninterface FooterButtonsProps {\n position: ModalProps[\"footerButtonPosition\"];\n cancelText?: string;\n confirmText?: string;\n onCancel: () => void;\n onConfirm: () => void;\n color: ModalProps[\"color\"];\n loading: boolean;\n disabled: boolean;\n}\n\n/** `footer` verilmişse o (`null` = alt çubuk yok), yoksa metni verilen düğmeler. */\nfunction resolveFooter({ footer, ...buttons }: FooterButtonsProps & { footer: React.ReactNode }): React.ReactNode {\n if (footer !== undefined) return footer;\n if (!buttons.cancelText && !buttons.confirmText) return null;\n return <FooterButtons {...buttons} />;\n}\n\nfunction FooterButtons({ position, cancelText, confirmText, onCancel, onConfirm, color, loading, disabled }: Readonly<FooterButtonsProps>) {\n return (\n // Mobilde düğmeler tam genişlik ve alt alta (birincil altta, başparmak erişiminde).\n <div className={cn(\"flex flex-col-reverse gap-2 sm:flex-row\", position === \"left\" ? \"sm:justify-start\" : \"sm:justify-end\")}>\n {cancelText && (\n <Button variant=\"outline\" color=\"neutral\" onClick={onCancel} data-modal-cancel className=\"w-full sm:w-auto\">\n {cancelText}\n </Button>\n )}\n {confirmText && (\n <Button color={color === \"neutral\" || !color ? \"primary\" : color} onClick={onConfirm} loading={loading} disabled={disabled} data-modal-confirm className=\"w-full sm:w-auto\">\n {confirmText}\n </Button>\n )}\n </div>\n );\n}\n\n/*\n * Faz 9 temel ARIA'yı düzeltmişti (role=dialog, Escape, odağı geri verme).\n * yapı ant.design Modal'dan, overlay davranışı Drawer ile ortak\n * (`lib/overlay.ts`). Eski sürümde kalanlar:\n * - Odak tuzağı YOKTU (belgede \"focus-trap\" yazmasına rağmen Tab dışarı\n * kaçıyordu); sayfa kaydırması kilitlenmiyordu; portal yoktu.\n * - Uzun içerik ekrandan taşıyordu — artık gövde kendi içinde kayar.\n * - `title` zorunlu string'di; açıklama, özel footer, genişlik yoktu.\n * - Async onay için yükleniyor durumu, yıkıcı onay için `alertdialog` yoktu.\n * - Kapalıyken `inert` ile DOM'da kalıyordu; artık kapanış animasyonundan\n * sonra unmount.\n */\n/**\n * `skeleton`: başlık (ikon dahil), gövde ve alt çubuk\n * `ContentSkeleton` ile içeriğin kendi şeklinde iskelete döner; Kapat ve\n * Escape çalışır, `aria-busy`. Veri gelince odak (hâlâ Kapat'taysa) normal\n * ilk odağa taşınır. Kapat düğmesi 44px dokunma hedefi.\n */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n icon,\n color,\n children,\n showCloseButton = true,\n closeButtonPosition = \"right\",\n footer,\n footerButtonPosition = \"right\",\n confirmButtonText,\n cancelButtonText,\n onConfirm,\n onCancel,\n confirmLoading,\n confirmDisabled = false,\n initialFocus,\n size = \"md\",\n width,\n maskClosable = true,\n keyboard = true,\n skeleton = false,\n \"aria-label\": ariaLabel,\n className,\n bodyClassName,\n}: ModalProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n const { pending, handleConfirm } = useConfirm(onConfirm);\n const present = usePresence(open, EXIT_MS);\n\n const isAlert = (color === \"error\" || color === \"warning\") && Boolean(confirmButtonText);\n const getInitialFocus = (panel: HTMLElement) => getModalInitialFocus(panel, isAlert, initialFocus);\n\n useModalBehavior(open, panelRef, onClose, { closeOnEscape: keyboard, getInitialFocus });\n useRefocusAfterSkeleton(open, skeleton, panelRef, getInitialFocus, CLOSE_SELECTOR);\n\n if (!present || typeof document === \"undefined\") return null;\n\n const iconNode = renderModalIcon(color, icon);\n const footerNode = resolveFooter({\n footer,\n position: footerButtonPosition,\n cancelText: cancelButtonText,\n confirmText: confirmButtonText,\n onCancel: onCancel ?? onClose,\n onConfirm: handleConfirm,\n color,\n loading: confirmLoading ?? pending,\n disabled: confirmDisabled,\n });\n\n return createPortal(\n <div className={cn(\"fixed inset-0 z-mari-modal\", !open && \"pointer-events-none\")}>\n <div\n aria-hidden\n onClick={maskClosable ? onClose : undefined}\n className={cn(\n \"absolute inset-0 bg-mari-scrim transition-opacity duration-200 motion-reduce:transition-none starting:opacity-0\",\n open ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n {/* Kaydırılabilir yerleşim katmanı: çok uzun modal ekranı aşarsa gövde kayar. */}\n <div className=\"pointer-events-none absolute inset-0 flex items-end justify-center p-3 sm:items-center sm:p-6\">\n <div\n ref={panelRef}\n role={isAlert ? \"alertdialog\" : \"dialog\"}\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n aria-describedby={description ? descriptionId : undefined}\n aria-busy={skeleton || undefined}\n tabIndex={-1}\n style={width !== undefined ? { maxWidth: width } : undefined}\n // Tailwind v4'te translate-*/scale-* ayrı `translate`/`scale` CSS\n // özelliklerini yazar, `transform`u değil — geçiş listesinde onlar\n // olmalı. Eskiden `transition-[opacity,transform]` vardı: kapanışta\n // panel ilk karede aniden kayıp küçülüyor, sadece opaklık yumuşak\n // soluyordu (\"kapatırken tekliyor\" kullanıcı bulgusu). Aynı hata\n // Card hover, MegaMenu ve MobileNavLevel'da da düzeltildi.\n className={cn(\n \"pointer-events-auto relative flex max-h-[calc(100dvh-1.5rem)] w-full flex-col rounded-xl border border-mari-border bg-mari-surface text-mari-foreground shadow-mari-xl outline-none sm:max-h-[calc(100dvh-3rem)]\",\n \"transition-[opacity,translate,scale] duration-200 ease-out motion-reduce:transition-none starting:translate-y-2 starting:scale-[0.98] starting:opacity-0\",\n open ? \"translate-y-0 scale-100 opacity-100\" : \"translate-y-2 scale-[0.98] opacity-0\",\n width === undefined && sizeMap[size],\n className\n )}\n >\n {showCloseButton && <CloseButton onClose={onClose} position={closeButtonPosition} />}\n\n {(title || description || iconNode) && (\n <ModalHeader\n icon={iconNode}\n title={title}\n titleId={titleId}\n description={description}\n descriptionId={descriptionId}\n closeInset={showCloseButton ? closeButtonPosition : undefined}\n skeleton={skeleton}\n />\n )}\n\n {children !== undefined && children !== null && (\n <ModalBody indented={Boolean(iconNode)} hasFooter={Boolean(footerNode)} skeleton={skeleton} className={bodyClassName}>\n {children}\n </ModalBody>\n )}\n\n {footerNode && (\n <div className=\"shrink-0 px-6 pb-6 pt-5\">\n <ContentSkeleton on={skeleton} fallback={FOOTER_PLACEHOLDER}>\n {footerNode}\n </ContentSkeleton>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","import React from \"react\";\nimport { AlertTriangleIcon, CheckCircle2Icon, InfoIcon, XCircleIcon, SparklesIcon } from \"lucide-react\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { bgSubtleClass, textClass } from \"../lib/colorClasses\";\n\nconst ICON_BY_COLOR: Record<ColorRole, React.ComponentType<{ className?: string; size?: number }>> = {\n success: CheckCircle2Icon,\n warning: AlertTriangleIcon,\n error: XCircleIcon,\n info: InfoIcon,\n primary: InfoIcon,\n accent: SparklesIcon,\n neutral: InfoIcon,\n};\n\n/** Durum ikonu tonlu bir dairenin içinde. `color` yoksa ve özel `icon` da yoksa hiç ikon gösterilmez. */\nexport function renderModalIcon(color: ColorRole | undefined, icon: React.ReactNode): React.ReactNode {\n if (!color && !icon) return null;\n const role = color ?? \"neutral\";\n const Icon = ICON_BY_COLOR[role];\n return (\n <span aria-hidden className={`flex size-10 shrink-0 items-center justify-center rounded-full ${bgSubtleClass[role]} ${textClass[role]}`}>\n {icon ?? <Icon size={20} />}\n </span>\n );\n}\n\n/*\n * ant.design: varsayılan 520px.\n */\nexport const sizeMap: Record<Size, string> = {\n sm: \"sm:max-w-[25rem]\",\n md: \"sm:max-w-[32.5rem]\",\n lg: \"sm:max-w-[45rem]\",\n};\n"],"mappings":"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","names":["jsx"]}
|
package/dist/pagination.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Pagination
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-ZAR3SCPV.js";
|
|
4
|
+
import "./chunk-MXGY2ENX.js";
|
|
5
|
+
import "./chunk-POBOJBNJ.js";
|
|
6
|
+
import "./chunk-6AMBZXZJ.js";
|
|
7
|
+
import "./chunk-VKN374SD.js";
|
|
8
8
|
export {
|
|
9
9
|
Pagination
|
|
10
10
|
};
|
package/dist/popconfirm.js
CHANGED
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
Popover
|
|
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-CNWRDTEW.js";
|
|
6
|
+
import "./chunk-OYDG6C54.js";
|
|
7
|
+
import "./chunk-RMNV2CE2.js";
|
|
8
|
+
import "./chunk-TSFAAREV.js";
|
|
9
|
+
import "./chunk-6CSUVVFG.js";
|
|
10
|
+
import "./chunk-OAWUZIIN.js";
|
|
11
|
+
import "./chunk-GTNCXOUL.js";
|
|
12
|
+
import "./chunk-NYXU5EFE.js";
|
|
13
|
+
import "./chunk-MT4VH7QV.js";
|
|
14
14
|
import {
|
|
15
15
|
Button
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-CVKAGR3D.js";
|
|
17
|
+
import "./chunk-POBOJBNJ.js";
|
|
18
18
|
import {
|
|
19
19
|
textClass
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
21
|
+
import "./chunk-VKN374SD.js";
|
|
22
22
|
|
|
23
23
|
// src/popconfirm/Popconfirm.tsx
|
|
24
24
|
import { useId, useState } from "react";
|
package/dist/popconfirm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/popconfirm/Popconfirm.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useState } from \"react\";\nimport { CircleAlertIcon, CircleXIcon, InfoIcon } from \"lucide-react\";\nimport { cn, useControllableState, type ColorRole } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { Popover } from \"../popover\";\nimport type { PopconfirmProps } from \"./types\";\n\nexport type { PopconfirmProps };\n\nconst isDestructive = (color: ColorRole) => color === \"error\" || color === \"warning\";\n\nfunction StatusIcon({ icon, color }: Readonly<{ icon: PopconfirmProps[\"icon\"]; color: ColorRole }>) {\n if (icon === false) return null;\n if (icon !== true && icon !== undefined) return <span className={cn(\"flex shrink-0 pt-0.5\", textClass[color])}>{icon}</span>;\n let Icon = InfoIcon;\n if (color === \"error\") Icon = CircleXIcon;\n else if (color === \"warning\") Icon = CircleAlertIcon;\n return <Icon aria-hidden size={16} className={cn(\"mt-0.5 shrink-0\", textClass[color])} />;\n}\n\n
|
|
1
|
+
{"version":3,"sources":["../src/popconfirm/Popconfirm.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useState } from \"react\";\nimport { CircleAlertIcon, CircleXIcon, InfoIcon } from \"lucide-react\";\nimport { cn, useControllableState, type ColorRole } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { Popover } from \"../popover\";\nimport type { PopconfirmProps } from \"./types\";\n\nexport type { PopconfirmProps };\n\nconst isDestructive = (color: ColorRole) => color === \"error\" || color === \"warning\";\n\nfunction StatusIcon({ icon, color }: Readonly<{ icon: PopconfirmProps[\"icon\"]; color: ColorRole }>) {\n if (icon === false) return null;\n if (icon !== true && icon !== undefined) return <span className={cn(\"flex shrink-0 pt-0.5\", textClass[color])}>{icon}</span>;\n let Icon = InfoIcon;\n if (color === \"error\") Icon = CircleXIcon;\n else if (color === \"warning\") Icon = CircleAlertIcon;\n return <Icon aria-hidden size={16} className={cn(\"mt-0.5 shrink-0\", textClass[color])} />;\n}\n\n/*\n * yapı ant.design Popconfirm'den: bir eylemin hemen yanında,\n * sayfayı karartmadan \"emin misiniz?\" sorusu. Popover'ın üstüne kurulu\n * (konum, ok, odak, kapatma yolları ortak).\n */\n/**\n * Erişilebilirlik: panel `role=\"alertdialog\"`, soru adı, açıklama\n * `aria-describedby`. Yıkıcı onayda (`error`/`warning`) ilk odak \"Vazgeç\"te —\n * Enter'a basan kullanıcı yanlışlıkla silmesin; diğerlerinde onay düğmesinde.\n * `onConfirm` Promise dönerse düğme yükleniyor, panel açık; bitince kapanır\n * ve odak tetikleyiciye döner.\n */\nexport function Popconfirm({\n title,\n description,\n children,\n onConfirm,\n onCancel,\n okText = \"Evet\",\n cancelText = \"Vazgeç\",\n color = \"warning\",\n icon = true,\n placement = \"top\",\n disabled = false,\n open: openProp,\n onOpenChange,\n className,\n skeleton = false,\n}: Readonly<PopconfirmProps>) {\n const [open, setOpen] = useControllableState<boolean>({ value: openProp, defaultValue: false, onChange: onOpenChange });\n const [pending, setPending] = useState(false);\n const titleId = useId();\n const descriptionId = useId();\n const destructive = isDestructive(color);\n\n const confirm = async () => {\n const result = onConfirm?.();\n if (!(result instanceof Promise)) {\n setOpen(false);\n return;\n }\n setPending(true);\n try {\n await result;\n setOpen(false);\n } catch {\n // Reddedildi: panel açık kalır, kullanıcı tekrar deneyebilir ya da vazgeçebilir.\n } finally {\n setPending(false);\n }\n };\n\n const cancel = () => {\n onCancel?.();\n setOpen(false);\n };\n\n if (disabled) return children;\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => !pending && setOpen(next)}\n placement={placement}\n role=\"alertdialog\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n skeleton={skeleton}\n className={cn(\"max-w-[min(20rem,calc(100vw-1rem))]\", className)}\n content={\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex gap-2\">\n <StatusIcon icon={icon} color={color} />\n <div className=\"min-w-0\">\n <p id={titleId} className=\"font-semibold text-mari-foreground\">\n {title}\n </p>\n {description && (\n <p id={descriptionId} className=\"mt-0.5 text-mari-muted\">\n {description}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" onClick={cancel} data-autofocus={destructive || undefined}>\n {cancelText}\n </Button>\n <Button size=\"sm\" color={destructive ? color : \"primary\"} onClick={confirm} loading={pending} data-autofocus={destructive ? undefined : true}>\n {okText}\n </Button>\n </div>\n </div>\n }\n >\n {children}\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,SAAgB,OAAO,gBAAgB;AACvC,SAAS,iBAAiB,aAAa,gBAAgB;AACvD,SAAS,IAAI,4BAA4C;AAYP,cAgFtC,YAhFsC;AAJlD,IAAM,gBAAgB,CAAC,UAAqB,UAAU,WAAW,UAAU;AAE3E,SAAS,WAAW,EAAE,MAAM,MAAM,GAAkE;AAClG,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO,oBAAC,UAAK,WAAW,GAAG,wBAAwB,UAAU,KAAK,CAAC,GAAI,gBAAK;AACrH,MAAI,OAAO;AACX,MAAI,UAAU,QAAS,QAAO;AAAA,WACrB,UAAU,UAAW,QAAO;AACrC,SAAO,oBAAC,QAAK,eAAW,MAAC,MAAM,IAAI,WAAW,GAAG,mBAAmB,UAAU,KAAK,CAAC,GAAG;AACzF;AAcO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAA8B;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAI,qBAA8B,EAAE,OAAO,UAAU,cAAc,OAAO,UAAU,aAAa,CAAC;AACtH,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,UAAU,MAAM;AACtB,QAAM,gBAAgB,MAAM;AAC5B,QAAM,cAAc,cAAc,KAAK;AAEvC,QAAM,UAAU,YAAY;AAC1B,UAAM,SAAS,YAAY;AAC3B,QAAI,EAAE,kBAAkB,UAAU;AAChC,cAAQ,KAAK;AACb;AAAA,IACF;AACA,eAAW,IAAI;AACf,QAAI;AACF,YAAM;AACN,cAAQ,KAAK;AAAA,IACf,QAAQ;AAAA,IAER,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,eAAW;AACX,YAAQ,KAAK;AAAA,EACf;AAEA,MAAI,SAAU,QAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,CAAC,SAAS,CAAC,WAAW,QAAQ,IAAI;AAAA,MAChD;AAAA,MACA,MAAK;AAAA,MACL,mBAAiB;AAAA,MACjB,oBAAkB,cAAc,gBAAgB;AAAA,MAChD;AAAA,MACA,WAAW,GAAG,uCAAuC,SAAS;AAAA,MAC9D,SACE,qBAAC,SAAI,WAAU,uBACb;AAAA,6BAAC,SAAI,WAAU,cACb;AAAA,8BAAC,cAAW,MAAY,OAAc;AAAA,UACtC,qBAAC,SAAI,WAAU,WACb;AAAA,gCAAC,OAAE,IAAI,SAAS,WAAU,sCACvB,iBACH;AAAA,YACC,eACC,oBAAC,OAAE,IAAI,eAAe,WAAU,0BAC7B,uBACH;AAAA,aAEJ;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,0BACb;AAAA,8BAAC,UAAO,MAAK,MAAK,SAAQ,WAAU,OAAM,WAAU,SAAS,QAAQ,kBAAgB,eAAe,QACjG,sBACH;AAAA,UACA,oBAAC,UAAO,MAAK,MAAK,OAAO,cAAc,QAAQ,WAAW,SAAS,SAAS,SAAS,SAAS,kBAAgB,cAAc,SAAY,MACrI,kBACH;AAAA,WACF;AAAA,SACF;AAAA,MAGD;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
package/dist/popover.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Popover
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-CNWRDTEW.js";
|
|
4
|
+
import "./chunk-OYDG6C54.js";
|
|
5
|
+
import "./chunk-RMNV2CE2.js";
|
|
6
|
+
import "./chunk-TSFAAREV.js";
|
|
7
|
+
import "./chunk-6CSUVVFG.js";
|
|
8
|
+
import "./chunk-OAWUZIIN.js";
|
|
9
|
+
import "./chunk-GTNCXOUL.js";
|
|
10
|
+
import "./chunk-NYXU5EFE.js";
|
|
11
|
+
import "./chunk-MT4VH7QV.js";
|
|
12
|
+
import "./chunk-VKN374SD.js";
|
|
13
13
|
export {
|
|
14
14
|
Popover
|
|
15
15
|
};
|
package/dist/progress.js
CHANGED
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
bgSolidClass,
|
|
3
3
|
strokeSolidClass,
|
|
4
4
|
textClass
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
6
6
|
import {
|
|
7
7
|
skeletonFill
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VKN374SD.js";
|
|
9
9
|
|
|
10
10
|
// src/progress/Progress.tsx
|
|
11
11
|
import { CheckIcon, CircleCheckIcon, CircleXIcon, XIcon } from "lucide-react";
|
package/dist/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/progress/Progress.tsx"],"sourcesContent":["import React from \"react\";\nimport { CheckIcon, CircleCheckIcon, CircleXIcon, XIcon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { bgSolidClass, strokeSolidClass, textClass } from \"../lib/colorClasses\";\nimport { skeletonFill } from \"../lib/skeleton\";\nimport type { ProgressProps, ProgressStatus } from \"./types\";\n\nexport type { ProgressProps };\n\nconst clamp = (n: number | undefined) => Math.min(100, Math.max(0, n ?? 0));\n\n/** Çizgi kalınlığı rem (px yasak): 4 / 8 / 12px. */\nconst LINE_HEIGHT = { sm: \"h-1\", md: \"h-2\", lg: \"h-3\" } as const;\nconst LINE_TEXT = { sm: \"text-xs\", md: \"text-sm\", lg: \"text-sm\" } as const;\n/** Daire çapı rem + viewBox birimi kalınlık. */\nconst CIRCLE_SIZE = { sm: \"3rem\", md: \"5rem\", lg: \"7.5rem\" } as const;\nconst CIRCLE_STROKE = { sm: 10, md: 8, lg: 6 } as const;\nconst CIRCLE_TEXT = { sm: \"text-xs\", md: \"text-base\", lg: \"text-2xl\" } as const;\nconst CIRCLE_ICON = { sm: 16, md: 28, lg: 40 } as const;\n\nfunction resolveStatus(status: ProgressStatus | undefined, percent: number): ProgressStatus {\n if (status) return status;\n return percent >= 100 ? \"success\" : \"normal\";\n}\n\nfunction resolveColor(status: ProgressStatus, color: ColorRole | undefined): ColorRole {\n if (status === \"success\") return \"success\";\n if (status === \"exception\") return \"error\";\n return color ?? \"primary\";\n}\n\n/** `%45` (tr-TR: yüzde işareti önde). */\nconst defaultFormat = (p: number) => `%${Math.round(p)}`;\n\nfunction valueText(format: ProgressProps[\"format\"], percent: number, status: ProgressStatus): string {\n const custom = format?.(percent);\n const base = typeof custom === \"string\" || typeof custom === \"number\" ? String(custom) : defaultFormat(percent);\n if (status === \"exception\") return `${base}, hata`;\n if (status === \"success\") return `${base}, tamamlandı`;\n return base;\n}\n\nfunction Info({ status, percent, format, circle, size, color }: Readonly<{ status: ProgressStatus; percent: number; format: ProgressProps[\"format\"]; circle: boolean; size: NonNullable<ProgressProps[\"size\"]>; color: ColorRole }>) {\n // Özel format varsa her durumda metin; yoksa bitince/hatada ikon.\n if (!format && (status === \"success\" || status === \"exception\")) {\n // Dairede ortadaki alan geniş: yalın ✓/✕; çizginin yanında daire içinde ikon.\n const icons = circle ? { success: CheckIcon, exception: XIcon } : { success: CircleCheckIcon, exception: CircleXIcon };\n const Icon = icons[status];\n return <Icon aria-hidden size={circle ? CIRCLE_ICON[size] : 16} className={textClass[color]} />;\n }\n return <>{(format ?? defaultFormat)(percent)}</>;\n}\n\n/**\n * Faz 16.2 — yapı ant.design Progress'ten. Çizgi (varsayılan, `steps` ile\n * parçalı) ve daire. `%100` kendiliğinden başarı; `exception` hata.\n *\n * Erişilebilirlik: `role=\"progressbar\"` + `aria-valuenow/min/max` ve okunur\n * `aria-valuetext` (\"%45\", \"3 / 5 dosya\", \"%100, tamamlandı\"). Ad zorunlu —\n * `aria-label` ya da görünür bir başlığa `aria-labelledby`. Durum rengi tek\n * başına anlam taşımaz: ikon ve valuetext de söyler. Geçişler ve `active`\n * parıltısı hareket azaltmada durur.\n */\nexport function Progress({\n percent: rawPercent,\n type = \"line\",\n status: statusProp,\n color: colorProp,\n success,\n steps,\n showInfo = true,\n format,\n size = \"md\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n className,\n skeleton = false,\n}: Readonly<ProgressProps>) {\n const percent = clamp(rawPercent);\n const status = resolveStatus(statusProp, percent);\n const color = resolveColor(status, colorProp);\n const successPercent = success ? Math.min(clamp(success.percent), percent) : 0;\n\n const a11y = skeleton\n ? { \"aria-hidden\": true as const }\n : {\n role: \"progressbar\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n \"aria-valuenow\": Math.round(percent),\n \"aria-valuetext\": valueText(format, percent, status),\n };\n\n if (type === \"circle\") {\n return (\n <div {...a11y} className={cn(\"relative inline-flex shrink-0 items-center justify-center\", className)} style={{ width: CIRCLE_SIZE[size], height: CIRCLE_SIZE[size] }}>\n <CircleTrack percent={percent} successPercent={successPercent} stroke={CIRCLE_STROKE[size]} color={color} skeleton={skeleton} />\n {showInfo && !skeleton && (\n <span aria-hidden className={cn(\"absolute inset-0 flex items-center justify-center font-semibold tabular-nums text-mari-foreground\", CIRCLE_TEXT[size])}>\n <Info status={status} percent={percent} format={format} circle size={size} color={color} />\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div {...a11y} className={cn(\"flex w-full items-center gap-3\", className)}>\n {steps ? (\n <StepsTrack steps={steps} percent={percent} color={color} size={size} skeleton={skeleton} />\n ) : (\n <div className={cn(\"relative min-w-0 flex-1 overflow-hidden rounded-full\", LINE_HEIGHT[size], skeleton ? skeletonFill(true) : \"bg-mari-surface-alt\")}>\n {!skeleton && (\n <>\n <span\n className={cn(\n \"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-out motion-reduce:transition-none\",\n bgSolidClass[color],\n status === \"active\" && \"overflow-hidden\"\n )}\n style={{ width: `${percent}%` }}\n >\n {status === \"active\" && (\n <span className=\"absolute inset-0 animate-[mari-progress-active_1.6s_ease-out_infinite] bg-linear-to-r from-transparent via-white/40 to-transparent motion-reduce:hidden\" />\n )}\n </span>\n {successPercent > 0 && (\n <span className={cn(\"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 motion-reduce:transition-none\", bgSolidClass.success)} style={{ width: `${successPercent}%` }} />\n )}\n </>\n )}\n </div>\n )}\n {showInfo && (\n <span aria-hidden className={cn(\"flex min-w-9 shrink-0 items-center justify-end tabular-nums text-mari-muted\", LINE_TEXT[size], skeleton && \"invisible\")}>\n <Info status={status} percent={percent} format={format} circle={false} size={size} color={color} />\n </span>\n )}\n </div>\n );\n}\n\nfunction StepsTrack({ steps, percent, color, size, skeleton }: Readonly<{ steps: number; percent: number; color: ColorRole; size: NonNullable<ProgressProps[\"size\"]>; skeleton: boolean }>) {\n const filled = Math.round((percent / 100) * steps);\n const segmentFill = (i: number) => {\n if (skeleton) return skeletonFill(true);\n return i < filled ? bgSolidClass[color] : \"bg-mari-surface-alt\";\n };\n return (\n <div className=\"flex min-w-0 flex-1 gap-1\">\n {Array.from({ length: steps }, (_, i) => (\n <span key={i} className={cn(\"flex-1 rounded-full transition-colors duration-200 motion-reduce:transition-none\", LINE_HEIGHT[size], segmentFill(i))} />\n ))}\n </div>\n );\n}\n\nfunction CircleTrack({ percent, successPercent, stroke, color, skeleton }: Readonly<{ percent: number; successPercent: number; stroke: number; color: ColorRole; skeleton: boolean }>) {\n const box = 100;\n const r = (box - stroke) / 2;\n const c = 2 * Math.PI * r;\n const arc = (p: number) => `${(p / 100) * c} ${c}`;\n return (\n <svg aria-hidden viewBox={`0 0 ${box} ${box}`} className=\"size-full -rotate-90\">\n <circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} className={skeleton ? \"stroke-mari-border/70\" : \"stroke-mari-surface-alt\"} />\n {!skeleton && (\n <>\n <circle\n cx={box / 2}\n cy={box / 2}\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={arc(percent)}\n className={cn(strokeSolidClass[color], \"transition-[stroke-dasharray] duration-300 motion-reduce:transition-none\", percent === 0 && \"opacity-0\")}\n />\n {successPercent > 0 && (\n <circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={arc(successPercent)} className={strokeSolidClass.success} />\n )}\n </>\n )}\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/progress/Progress.tsx"],"sourcesContent":["import React from \"react\";\nimport { CheckIcon, CircleCheckIcon, CircleXIcon, XIcon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { bgSolidClass, strokeSolidClass, textClass } from \"../lib/colorClasses\";\nimport { skeletonFill } from \"../lib/skeleton\";\nimport type { ProgressProps, ProgressStatus } from \"./types\";\n\nexport type { ProgressProps };\n\nconst clamp = (n: number | undefined) => Math.min(100, Math.max(0, n ?? 0));\n\n/** Çizgi kalınlığı rem (px yasak): 4 / 8 / 12px. */\nconst LINE_HEIGHT = { sm: \"h-1\", md: \"h-2\", lg: \"h-3\" } as const;\nconst LINE_TEXT = { sm: \"text-xs\", md: \"text-sm\", lg: \"text-sm\" } as const;\n/** Daire çapı rem + viewBox birimi kalınlık. */\nconst CIRCLE_SIZE = { sm: \"3rem\", md: \"5rem\", lg: \"7.5rem\" } as const;\nconst CIRCLE_STROKE = { sm: 10, md: 8, lg: 6 } as const;\nconst CIRCLE_TEXT = { sm: \"text-xs\", md: \"text-base\", lg: \"text-2xl\" } as const;\nconst CIRCLE_ICON = { sm: 16, md: 28, lg: 40 } as const;\n\nfunction resolveStatus(status: ProgressStatus | undefined, percent: number): ProgressStatus {\n if (status) return status;\n return percent >= 100 ? \"success\" : \"normal\";\n}\n\nfunction resolveColor(status: ProgressStatus, color: ColorRole | undefined): ColorRole {\n if (status === \"success\") return \"success\";\n if (status === \"exception\") return \"error\";\n return color ?? \"primary\";\n}\n\n/** `%45` (tr-TR: yüzde işareti önde). */\nconst defaultFormat = (p: number) => `%${Math.round(p)}`;\n\nfunction valueText(format: ProgressProps[\"format\"], percent: number, status: ProgressStatus): string {\n const custom = format?.(percent);\n const base = typeof custom === \"string\" || typeof custom === \"number\" ? String(custom) : defaultFormat(percent);\n if (status === \"exception\") return `${base}, hata`;\n if (status === \"success\") return `${base}, tamamlandı`;\n return base;\n}\n\nfunction Info({ status, percent, format, circle, size, color }: Readonly<{ status: ProgressStatus; percent: number; format: ProgressProps[\"format\"]; circle: boolean; size: NonNullable<ProgressProps[\"size\"]>; color: ColorRole }>) {\n // Özel format varsa her durumda metin; yoksa bitince/hatada ikon.\n if (!format && (status === \"success\" || status === \"exception\")) {\n // Dairede ortadaki alan geniş: yalın ✓/✕; çizginin yanında daire içinde ikon.\n const icons = circle ? { success: CheckIcon, exception: XIcon } : { success: CircleCheckIcon, exception: CircleXIcon };\n const Icon = icons[status];\n return <Icon aria-hidden size={circle ? CIRCLE_ICON[size] : 16} className={textClass[color]} />;\n }\n return <>{(format ?? defaultFormat)(percent)}</>;\n}\n\n/*\n * yapı ant.design Progress'ten. Çizgi (varsayılan, `steps` ile\n * parçalı) ve daire. `%100` kendiliğinden başarı; `exception` hata.\n */\n/**\n * Erişilebilirlik: `role=\"progressbar\"` + `aria-valuenow/min/max` ve okunur\n * `aria-valuetext` (\"%45\", \"3 / 5 dosya\", \"%100, tamamlandı\"). Ad zorunlu —\n * `aria-label` ya da görünür bir başlığa `aria-labelledby`. Durum rengi tek\n * başına anlam taşımaz: ikon ve valuetext de söyler. Geçişler ve `active`\n * parıltısı hareket azaltmada durur.\n */\nexport function Progress({\n percent: rawPercent,\n type = \"line\",\n status: statusProp,\n color: colorProp,\n success,\n steps,\n showInfo = true,\n format,\n size = \"md\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n className,\n skeleton = false,\n}: Readonly<ProgressProps>) {\n const percent = clamp(rawPercent);\n const status = resolveStatus(statusProp, percent);\n const color = resolveColor(status, colorProp);\n const successPercent = success ? Math.min(clamp(success.percent), percent) : 0;\n\n const a11y = skeleton\n ? { \"aria-hidden\": true as const }\n : {\n role: \"progressbar\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n \"aria-valuenow\": Math.round(percent),\n \"aria-valuetext\": valueText(format, percent, status),\n };\n\n if (type === \"circle\") {\n return (\n <div {...a11y} className={cn(\"relative inline-flex shrink-0 items-center justify-center\", className)} style={{ width: CIRCLE_SIZE[size], height: CIRCLE_SIZE[size] }}>\n <CircleTrack percent={percent} successPercent={successPercent} stroke={CIRCLE_STROKE[size]} color={color} skeleton={skeleton} />\n {showInfo && !skeleton && (\n <span aria-hidden className={cn(\"absolute inset-0 flex items-center justify-center font-semibold tabular-nums text-mari-foreground\", CIRCLE_TEXT[size])}>\n <Info status={status} percent={percent} format={format} circle size={size} color={color} />\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div {...a11y} className={cn(\"flex w-full items-center gap-3\", className)}>\n {steps ? (\n <StepsTrack steps={steps} percent={percent} color={color} size={size} skeleton={skeleton} />\n ) : (\n <div className={cn(\"relative min-w-0 flex-1 overflow-hidden rounded-full\", LINE_HEIGHT[size], skeleton ? skeletonFill(true) : \"bg-mari-surface-alt\")}>\n {!skeleton && (\n <>\n <span\n className={cn(\n \"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-out motion-reduce:transition-none\",\n bgSolidClass[color],\n status === \"active\" && \"overflow-hidden\"\n )}\n style={{ width: `${percent}%` }}\n >\n {status === \"active\" && (\n <span className=\"absolute inset-0 animate-[mari-progress-active_1.6s_ease-out_infinite] bg-linear-to-r from-transparent via-white/40 to-transparent motion-reduce:hidden\" />\n )}\n </span>\n {successPercent > 0 && (\n <span className={cn(\"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 motion-reduce:transition-none\", bgSolidClass.success)} style={{ width: `${successPercent}%` }} />\n )}\n </>\n )}\n </div>\n )}\n {showInfo && (\n <span aria-hidden className={cn(\"flex min-w-9 shrink-0 items-center justify-end tabular-nums text-mari-muted\", LINE_TEXT[size], skeleton && \"invisible\")}>\n <Info status={status} percent={percent} format={format} circle={false} size={size} color={color} />\n </span>\n )}\n </div>\n );\n}\n\nfunction StepsTrack({ steps, percent, color, size, skeleton }: Readonly<{ steps: number; percent: number; color: ColorRole; size: NonNullable<ProgressProps[\"size\"]>; skeleton: boolean }>) {\n const filled = Math.round((percent / 100) * steps);\n const segmentFill = (i: number) => {\n if (skeleton) return skeletonFill(true);\n return i < filled ? bgSolidClass[color] : \"bg-mari-surface-alt\";\n };\n return (\n <div className=\"flex min-w-0 flex-1 gap-1\">\n {Array.from({ length: steps }, (_, i) => (\n <span key={i} className={cn(\"flex-1 rounded-full transition-colors duration-200 motion-reduce:transition-none\", LINE_HEIGHT[size], segmentFill(i))} />\n ))}\n </div>\n );\n}\n\nfunction CircleTrack({ percent, successPercent, stroke, color, skeleton }: Readonly<{ percent: number; successPercent: number; stroke: number; color: ColorRole; skeleton: boolean }>) {\n const box = 100;\n const r = (box - stroke) / 2;\n const c = 2 * Math.PI * r;\n const arc = (p: number) => `${(p / 100) * c} ${c}`;\n return (\n <svg aria-hidden viewBox={`0 0 ${box} ${box}`} className=\"size-full -rotate-90\">\n <circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} className={skeleton ? \"stroke-mari-border/70\" : \"stroke-mari-surface-alt\"} />\n {!skeleton && (\n <>\n <circle\n cx={box / 2}\n cy={box / 2}\n r={r}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={arc(percent)}\n className={cn(strokeSolidClass[color], \"transition-[stroke-dasharray] duration-300 motion-reduce:transition-none\", percent === 0 && \"opacity-0\")}\n />\n {successPercent > 0 && (\n <circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={arc(successPercent)} className={strokeSolidClass.success} />\n )}\n </>\n )}\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/qrcode.js
CHANGED
package/dist/qrcode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/qrcode/QRCode.tsx","../src/qrcode/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useMemo } from \"react\";\nimport { CircleCheckIcon, Loader2Icon, RotateCwIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { neutralRamp } from \"@mari-ui/tokens\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { QRCodeProps, QRStatus } from \"./types\";\nimport { buildQRModel } from \"./utils\";\n\nexport type { QRCodeProps };\n\nconst DEFAULT_COLOR = neutralRamp[950];\n\nfunction StatusLayer({ status, onRefresh }: Readonly<{ status: Exclude<QRStatus, \"active\">; onRefresh?: () => void }>) {\n if (status === \"loading\") {\n return (\n <>\n <Loader2Icon size={28} aria-hidden className=\"animate-spin text-mari-primary motion-reduce:animate-none\" />\n <span className=\"text-sm text-mari-muted\">Hazırlanıyor…</span>\n </>\n );\n }\n if (status === \"scanned\") {\n return (\n <>\n <CircleCheckIcon size={28} aria-hidden className=\"text-mari-success\" />\n <span className=\"text-sm font-medium text-mari-foreground\">Tarandı</span>\n <span className=\"text-xs text-mari-muted\">Telefonunuzdan onaylayın</span>\n </>\n );\n }\n return (\n <>\n <span className=\"text-sm font-medium text-mari-foreground\">QR kodun süresi doldu</span>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n className=\"relative inline-flex h-8 items-center gap-1.5 rounded-md px-3 text-sm font-medium text-mari-primary transition-colors hover:bg-mari-primary-subtle focus-visible:outline-2 focus-visible:outline-mari-ring pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-1.5\"\n >\n <RotateCwIcon size={14} aria-hidden />\n Yenile\n </button>\n )}\n </>\n );\n}\n\n/**\n * Faz 16.3 — yapı ant.design QRCode'dan (değer, boyut, hata düzeltme, renk,\n * ikon, kenarlık, durum katmanı: loading/expired/scanned + Yenile), çizim\n * kullanıcının `qr-code-generator` projesindeki renderer'dan (nokta stilleri,\n * köşe şekilleri, gradyan, logo). Tek bağımlılık `qrcode-generator` (MIT, sıfır\n * bağımlılık). Saf SVG → SSR'da da çizilir, her çözünürlükte keskin.\n *\n * Varsayılan renkler temadan bağımsız koyu-üstü-açık: bazı okuyucular ters\n * (açık-üstü-koyu) QR'ı çözemez. Erişilebilirlik: `role=\"img\"` + ad; kodun\n * içeriğini (URL) görünür metin olarak da verin — görme engelli kullanıcı\n * QR'ı okutamaz. Durum katmanı `role=\"status\"` ile duyurulur.\n */\nexport function QRCode({\n value,\n size = \"10rem\",\n errorLevel,\n color = DEFAULT_COLOR,\n colorEnd,\n bgColor = \"#ffffff\",\n cornerColor,\n dotType = \"square\",\n cornerSquareType = \"square\",\n cornerDotType = \"square\",\n icon,\n iconSize = 0.22,\n margin = 2,\n bordered = true,\n status = \"active\",\n onRefresh,\n statusRender,\n \"aria-label\": ariaLabel = \"QR kod\",\n className,\n skeleton = false,\n}: Readonly<QRCodeProps>) {\n const gradientId = useId();\n const level = errorLevel ?? (icon ? \"H\" : \"M\");\n const model = useMemo(\n () => buildQRModel({ value, errorLevel: level, margin, dotType, cornerSquareType, cornerDotType }),\n [value, level, margin, dotType, cornerSquareType, cornerDotType]\n );\n\n const fill = colorEnd ? `url(#${gradientId})` : color;\n const cornerFill = cornerColor ?? fill;\n const iconEdge = model.size * Math.min(Math.max(iconSize, 0.1), 0.3);\n const iconPos = (model.size - iconEdge) / 2;\n const iconPad = iconEdge * 0.08;\n const dimension = typeof size === \"number\" ? `${size}px` : size;\n\n return (\n <div\n aria-busy={skeleton || status === \"loading\" || undefined}\n className={cn(\"relative inline-flex shrink-0\", bordered && \"rounded-lg border border-mari-border bg-mari-surface p-2\", className)}\n >\n {skeleton ? (\n <span {...skeletonBoxProps(\"block rounded-md\")} style={{ width: dimension, height: dimension }} />\n ) : (\n <svg\n role=\"img\"\n aria-label={ariaLabel}\n viewBox={`0 0 ${model.size} ${model.size}`}\n width={dimension}\n height={dimension}\n // Yalnız TAMAMEN kare kodda: crispEdges yuvarlak/kalp köşe işaretlerini\n // tırtıklı çizip okunamaz yapıyordu (jsQR ile ölçüldü).\n shapeRendering={dotType === \"square\" && cornerSquareType === \"square\" && cornerDotType === \"square\" ? \"crispEdges\" : undefined}\n className={cn(\"block rounded-md\", status !== \"active\" && \"opacity-10\")}\n >\n {colorEnd && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={color} />\n <stop offset=\"100%\" stopColor={colorEnd} />\n </linearGradient>\n </defs>\n )}\n {bgColor !== \"transparent\" && <rect width={model.size} height={model.size} fill={bgColor} />}\n <path d={model.dataPath} fill={fill} />\n {model.corners.map((c, i) => (\n // Üç konum işareti sabit sırada.\n <g key={i} fill={cornerFill}>\n <path fillRule=\"evenodd\" d={c.ring} />\n <path d={c.dot} />\n </g>\n ))}\n {icon && (\n <>\n <rect\n x={iconPos - iconPad}\n y={iconPos - iconPad}\n width={iconEdge + iconPad * 2}\n height={iconEdge + iconPad * 2}\n rx={iconPad * 2}\n fill={bgColor === \"transparent\" ? \"#ffffff\" : bgColor}\n />\n <image href={icon} x={iconPos} y={iconPos} width={iconEdge} height={iconEdge} preserveAspectRatio=\"xMidYMid meet\" />\n </>\n )}\n </svg>\n )}\n {!skeleton && status !== \"active\" && (\n <div role=\"status\" className=\"absolute inset-0 flex flex-col items-center justify-center gap-1.5 rounded-lg p-2 text-center\">\n {statusRender ? statusRender(status) : <StatusLayer status={status} onRefresh={onRefresh} />}\n </div>\n )}\n </div>\n );\n}\n","import qrcode from \"qrcode-generator\";\nimport type { QRCornerDotType, QRCornerSquareType, QRDotType, QRErrorLevel } from \"./types\";\n\n/**\n * Faz 16.3 — kullanıcının `qr-code-generator` projesindeki `renderQRtoSVG`\n * mantığının saf (DOM'suz, SSR'da çalışan) portu. Birim = 1 modül: viewBox\n * modül cinsindendir, boyut CSS ile verilir → her çözünürlükte keskin.\n */\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\nexport function svgRect(x: number, y: number, w: number, h: number): string {\n return `M${r2(x)},${r2(y)}h${r2(w)}v${r2(h)}h${r2(-w)}z`;\n}\n\nexport function svgCircle(cx: number, cy: number, radius: number): string {\n // İki 180° yay (başı = sonu olan tek yay SVG'de çizilmez).\n return `M${r2(cx - radius)},${r2(cy)}a${r2(radius)},${r2(radius)} 0 1,0 ${r2(radius * 2)},0a${r2(radius)},${r2(radius)} 0 1,0 ${r2(-radius * 2)},0z`;\n}\n\nexport function svgRoundRect(x: number, y: number, w: number, h: number, rad: number): string {\n const r = Math.min(rad, w / 2, h / 2);\n return (\n `M${r2(x + r)},${r2(y)}` +\n `h${r2(w - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(r)}` +\n `v${r2(h - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(r)}` +\n `h${r2(-(w - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(-r)}` +\n `v${r2(-(h - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(-r)}z`\n );\n}\n\nexport function svgHeart(x: number, y: number, s: number): string {\n const p = r2;\n return (\n `M${p(x + s * 0.5)},${p(y + s * 0.25)}` +\n `C${p(x + s * 0.3)},${p(y)} ${p(x)},${p(y)} ${p(x)},${p(y + s * 0.25)}` +\n `C${p(x)},${p(y + s * 0.55)} ${p(x + s * 0.3)},${p(y + s * 0.7)} ${p(x + s * 0.5)},${p(y + s * 0.9)}` +\n `C${p(x + s * 0.7)},${p(y + s * 0.7)} ${p(x + s)},${p(y + s * 0.55)} ${p(x + s)},${p(y + s * 0.25)}` +\n `C${p(x + s)},${p(y)} ${p(x + s * 0.7)},${p(y)} ${p(x + s * 0.5)},${p(y + s * 0.25)}z`\n );\n}\n\n/*\n * Kaynak renderer'daki kalp NOKTA ve kalp köşe HALKASI bilinçli olarak yok:\n * tarayıcıda jsQR ile çözdürüldüğünde (200/400px) hiçbir kombinasyonda\n * okunamadı. Kalp yalnız 3×3 merkezde (cornerDotType) — o okunuyor.\n */\nfunction dotPath(x: number, y: number, s: number, type: QRDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, s, s);\n case \"dots\":\n return svgCircle(x + s / 2, y + s / 2, s / 2);\n case \"rounded\":\n return svgRoundRect(x, y, s, s, s * 0.25);\n case \"extra-rounded\":\n return svgRoundRect(x, y, s, s, s * 0.48);\n }\n}\n\n/** Konum işaretinin 7×7 halkası: dış − iç (evenodd ile delinir). */\nfunction cornerSquarePath(x: number, y: number, type: QRCornerSquareType): string {\n switch (type) {\n case \"square\":\n return `${svgRect(x, y, 7, 7)} ${svgRect(x + 1, y + 1, 5, 5)}`;\n case \"extra-rounded\":\n return `${svgRoundRect(x, y, 7, 7, 1.4)} ${svgRoundRect(x + 1, y + 1, 5, 5, 0.5)}`;\n case \"dot\":\n return `${svgCircle(x + 3.5, y + 3.5, 3.5)} ${svgCircle(x + 3.5, y + 3.5, 2.5)}`;\n }\n}\n\n/** Konum işaretinin 3×3 merkezi. */\nfunction cornerDotPath(x: number, y: number, type: QRCornerDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, 3, 3);\n case \"dot\":\n return svgCircle(x + 1.5, y + 1.5, 1.5);\n case \"heart\":\n return svgHeart(x, y, 3);\n }\n}\n\n/**\n * UTF-8 baytlarını tek baytlık karakter dizisine çevirir. `qrcode-generator`ın\n * varsayılan kodlaması her karakterin yalnız alt baytını alır: \"ş\" (U+015F)\n * \"_\" olur ve Türkçe içerik bozuk kodlanır. Kütüphanenin global\n * `stringToBytes` ayarına dokunmadan doğru baytları verir.\n */\nexport function toByteString(value: string): string {\n return Array.from(new TextEncoder().encode(value), (b) => String.fromCharCode(b)).join(\"\");\n}\n\nexport interface QRModel {\n /** Kenar boşluğu dahil viewBox kenarı (modül). */\n size: number;\n moduleCount: number;\n /** Konum işaretleri hariç tüm veri modülleri — tek yol. */\n dataPath: string;\n /** Üç konum işaretinin halka + merkez yolları. */\n corners: { ring: string; dot: string }[];\n}\n\nexport interface QRModelOptions {\n value: string;\n errorLevel: QRErrorLevel;\n margin: number;\n dotType: QRDotType;\n cornerSquareType: QRCornerSquareType;\n cornerDotType: QRCornerDotType;\n}\n\nexport function buildQRModel({ value, errorLevel, margin, dotType, cornerSquareType, cornerDotType }: QRModelOptions): QRModel {\n const qr = qrcode(0, errorLevel);\n qr.addData(toByteString(value), \"Byte\");\n qr.make();\n\n const n = qr.getModuleCount();\n const finders = [\n [0, 0],\n [0, n - 7],\n [n - 7, 0],\n ] as const;\n const isFinder = (row: number, col: number) => finders.some(([fr, fc]) => row >= fr && row < fr + 7 && col >= fc && col < fc + 7);\n\n // Her nokta modülün TAMAMINI kaplar. Kaynak renderer her yandan %15 boşluk\n // bırakıyordu (nokta = modülün %70'i): tarayıcıda jsQR ile çözdürüldüğünde o\n // boşlukla stilli kodlar hiç çözülmedi, %5'te bazı boyutlarda çözülmedi,\n // boşluksuz tüm stiller 150–600px'te çözüldü. Değiştirirseniz yeniden doğrulayın.\n let dataPath = \"\";\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n if (isFinder(row, col) || !qr.isDark(row, col)) continue;\n dataPath += dotPath(margin + col, margin + row, 1, dotType);\n }\n }\n\n const corners = finders.map(([fr, fc]) => ({\n ring: cornerSquarePath(margin + fc, margin + fr, cornerSquareType),\n dot: cornerDotPath(margin + fc + 2, margin + fr + 2, cornerDotType),\n }));\n\n return { size: n + margin * 2, moduleCount: n, dataPath, corners };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/qrcode/QRCode.tsx","../src/qrcode/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useMemo } from \"react\";\nimport { CircleCheckIcon, Loader2Icon, RotateCwIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { neutralRamp } from \"@mari-ui/tokens\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { QRCodeProps, QRStatus } from \"./types\";\nimport { buildQRModel } from \"./utils\";\n\nexport type { QRCodeProps };\n\nconst DEFAULT_COLOR = neutralRamp[950];\n\nfunction StatusLayer({ status, onRefresh }: Readonly<{ status: Exclude<QRStatus, \"active\">; onRefresh?: () => void }>) {\n if (status === \"loading\") {\n return (\n <>\n <Loader2Icon size={28} aria-hidden className=\"animate-spin text-mari-primary motion-reduce:animate-none\" />\n <span className=\"text-sm text-mari-muted\">Hazırlanıyor…</span>\n </>\n );\n }\n if (status === \"scanned\") {\n return (\n <>\n <CircleCheckIcon size={28} aria-hidden className=\"text-mari-success\" />\n <span className=\"text-sm font-medium text-mari-foreground\">Tarandı</span>\n <span className=\"text-xs text-mari-muted\">Telefonunuzdan onaylayın</span>\n </>\n );\n }\n return (\n <>\n <span className=\"text-sm font-medium text-mari-foreground\">QR kodun süresi doldu</span>\n {onRefresh && (\n <button\n type=\"button\"\n onClick={onRefresh}\n className=\"relative inline-flex h-8 items-center gap-1.5 rounded-md px-3 text-sm font-medium text-mari-primary transition-colors hover:bg-mari-primary-subtle focus-visible:outline-2 focus-visible:outline-mari-ring pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-1.5\"\n >\n <RotateCwIcon size={14} aria-hidden />\n Yenile\n </button>\n )}\n </>\n );\n}\n\n/*\n * yapı ant.design QRCode'dan (değer, boyut, hata düzeltme, renk,\n * ikon, kenarlık, durum katmanı: loading/expired/scanned + Yenile), çizim\n * kullanıcının `qr-code-generator` projesindeki renderer'dan (nokta stilleri,\n * köşe şekilleri, gradyan, logo). Tek bağımlılık `qrcode-generator` (MIT, sıfır\n * bağımlılık). Saf SVG → SSR'da da çizilir, her çözünürlükte keskin.\n */\n/**\n * Varsayılan renkler temadan bağımsız koyu-üstü-açık: bazı okuyucular ters\n * (açık-üstü-koyu) QR'ı çözemez. Erişilebilirlik: `role=\"img\"` + ad; kodun\n * içeriğini (URL) görünür metin olarak da verin — görme engelli kullanıcı\n * QR'ı okutamaz. Durum katmanı `role=\"status\"` ile duyurulur.\n */\nexport function QRCode({\n value,\n size = \"10rem\",\n errorLevel,\n color = DEFAULT_COLOR,\n colorEnd,\n bgColor = \"#ffffff\",\n cornerColor,\n dotType = \"square\",\n cornerSquareType = \"square\",\n cornerDotType = \"square\",\n icon,\n iconSize = 0.22,\n margin = 2,\n bordered = true,\n status = \"active\",\n onRefresh,\n statusRender,\n \"aria-label\": ariaLabel = \"QR kod\",\n className,\n skeleton = false,\n}: Readonly<QRCodeProps>) {\n const gradientId = useId();\n const level = errorLevel ?? (icon ? \"H\" : \"M\");\n const model = useMemo(\n () => buildQRModel({ value, errorLevel: level, margin, dotType, cornerSquareType, cornerDotType }),\n [value, level, margin, dotType, cornerSquareType, cornerDotType]\n );\n\n const fill = colorEnd ? `url(#${gradientId})` : color;\n const cornerFill = cornerColor ?? fill;\n const iconEdge = model.size * Math.min(Math.max(iconSize, 0.1), 0.3);\n const iconPos = (model.size - iconEdge) / 2;\n const iconPad = iconEdge * 0.08;\n const dimension = typeof size === \"number\" ? `${size}px` : size;\n\n return (\n <div\n aria-busy={skeleton || status === \"loading\" || undefined}\n className={cn(\"relative inline-flex shrink-0\", bordered && \"rounded-lg border border-mari-border bg-mari-surface p-2\", className)}\n >\n {skeleton ? (\n <span {...skeletonBoxProps(\"block rounded-md\")} style={{ width: dimension, height: dimension }} />\n ) : (\n <svg\n role=\"img\"\n aria-label={ariaLabel}\n viewBox={`0 0 ${model.size} ${model.size}`}\n width={dimension}\n height={dimension}\n // Yalnız TAMAMEN kare kodda: crispEdges yuvarlak/kalp köşe işaretlerini\n // tırtıklı çizip okunamaz yapıyordu (jsQR ile ölçüldü).\n shapeRendering={dotType === \"square\" && cornerSquareType === \"square\" && cornerDotType === \"square\" ? \"crispEdges\" : undefined}\n className={cn(\"block rounded-md\", status !== \"active\" && \"opacity-10\")}\n >\n {colorEnd && (\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={color} />\n <stop offset=\"100%\" stopColor={colorEnd} />\n </linearGradient>\n </defs>\n )}\n {bgColor !== \"transparent\" && <rect width={model.size} height={model.size} fill={bgColor} />}\n <path d={model.dataPath} fill={fill} />\n {model.corners.map((c, i) => (\n // Üç konum işareti sabit sırada.\n <g key={i} fill={cornerFill}>\n <path fillRule=\"evenodd\" d={c.ring} />\n <path d={c.dot} />\n </g>\n ))}\n {icon && (\n <>\n <rect\n x={iconPos - iconPad}\n y={iconPos - iconPad}\n width={iconEdge + iconPad * 2}\n height={iconEdge + iconPad * 2}\n rx={iconPad * 2}\n fill={bgColor === \"transparent\" ? \"#ffffff\" : bgColor}\n />\n <image href={icon} x={iconPos} y={iconPos} width={iconEdge} height={iconEdge} preserveAspectRatio=\"xMidYMid meet\" />\n </>\n )}\n </svg>\n )}\n {!skeleton && status !== \"active\" && (\n <div role=\"status\" className=\"absolute inset-0 flex flex-col items-center justify-center gap-1.5 rounded-lg p-2 text-center\">\n {statusRender ? statusRender(status) : <StatusLayer status={status} onRefresh={onRefresh} />}\n </div>\n )}\n </div>\n );\n}\n","import qrcode from \"qrcode-generator\";\nimport type { QRCornerDotType, QRCornerSquareType, QRDotType, QRErrorLevel } from \"./types\";\n\n/**\n * Kullanıcının `qr-code-generator` projesindeki `renderQRtoSVG`\n * mantığının saf (DOM'suz, SSR'da çalışan) portu. Birim = 1 modül: viewBox\n * modül cinsindendir, boyut CSS ile verilir → her çözünürlükte keskin.\n */\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\nexport function svgRect(x: number, y: number, w: number, h: number): string {\n return `M${r2(x)},${r2(y)}h${r2(w)}v${r2(h)}h${r2(-w)}z`;\n}\n\nexport function svgCircle(cx: number, cy: number, radius: number): string {\n // İki 180° yay (başı = sonu olan tek yay SVG'de çizilmez).\n return `M${r2(cx - radius)},${r2(cy)}a${r2(radius)},${r2(radius)} 0 1,0 ${r2(radius * 2)},0a${r2(radius)},${r2(radius)} 0 1,0 ${r2(-radius * 2)},0z`;\n}\n\nexport function svgRoundRect(x: number, y: number, w: number, h: number, rad: number): string {\n const r = Math.min(rad, w / 2, h / 2);\n return (\n `M${r2(x + r)},${r2(y)}` +\n `h${r2(w - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(r)}` +\n `v${r2(h - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(r)}` +\n `h${r2(-(w - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(-r)}` +\n `v${r2(-(h - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(-r)}z`\n );\n}\n\nexport function svgHeart(x: number, y: number, s: number): string {\n const p = r2;\n return (\n `M${p(x + s * 0.5)},${p(y + s * 0.25)}` +\n `C${p(x + s * 0.3)},${p(y)} ${p(x)},${p(y)} ${p(x)},${p(y + s * 0.25)}` +\n `C${p(x)},${p(y + s * 0.55)} ${p(x + s * 0.3)},${p(y + s * 0.7)} ${p(x + s * 0.5)},${p(y + s * 0.9)}` +\n `C${p(x + s * 0.7)},${p(y + s * 0.7)} ${p(x + s)},${p(y + s * 0.55)} ${p(x + s)},${p(y + s * 0.25)}` +\n `C${p(x + s)},${p(y)} ${p(x + s * 0.7)},${p(y)} ${p(x + s * 0.5)},${p(y + s * 0.25)}z`\n );\n}\n\n/*\n * Kaynak renderer'daki kalp NOKTA ve kalp köşe HALKASI bilinçli olarak yok:\n * tarayıcıda jsQR ile çözdürüldüğünde (200/400px) hiçbir kombinasyonda\n * okunamadı. Kalp yalnız 3×3 merkezde (cornerDotType) — o okunuyor.\n */\nfunction dotPath(x: number, y: number, s: number, type: QRDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, s, s);\n case \"dots\":\n return svgCircle(x + s / 2, y + s / 2, s / 2);\n case \"rounded\":\n return svgRoundRect(x, y, s, s, s * 0.25);\n case \"extra-rounded\":\n return svgRoundRect(x, y, s, s, s * 0.48);\n }\n}\n\n/** Konum işaretinin 7×7 halkası: dış − iç (evenodd ile delinir). */\nfunction cornerSquarePath(x: number, y: number, type: QRCornerSquareType): string {\n switch (type) {\n case \"square\":\n return `${svgRect(x, y, 7, 7)} ${svgRect(x + 1, y + 1, 5, 5)}`;\n case \"extra-rounded\":\n return `${svgRoundRect(x, y, 7, 7, 1.4)} ${svgRoundRect(x + 1, y + 1, 5, 5, 0.5)}`;\n case \"dot\":\n return `${svgCircle(x + 3.5, y + 3.5, 3.5)} ${svgCircle(x + 3.5, y + 3.5, 2.5)}`;\n }\n}\n\n/** Konum işaretinin 3×3 merkezi. */\nfunction cornerDotPath(x: number, y: number, type: QRCornerDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, 3, 3);\n case \"dot\":\n return svgCircle(x + 1.5, y + 1.5, 1.5);\n case \"heart\":\n return svgHeart(x, y, 3);\n }\n}\n\n/**\n * UTF-8 baytlarını tek baytlık karakter dizisine çevirir. `qrcode-generator`ın\n * varsayılan kodlaması her karakterin yalnız alt baytını alır: \"ş\" (U+015F)\n * \"_\" olur ve Türkçe içerik bozuk kodlanır. Kütüphanenin global\n * `stringToBytes` ayarına dokunmadan doğru baytları verir.\n */\nexport function toByteString(value: string): string {\n return Array.from(new TextEncoder().encode(value), (b) => String.fromCharCode(b)).join(\"\");\n}\n\nexport interface QRModel {\n /** Kenar boşluğu dahil viewBox kenarı (modül). */\n size: number;\n moduleCount: number;\n /** Konum işaretleri hariç tüm veri modülleri — tek yol. */\n dataPath: string;\n /** Üç konum işaretinin halka + merkez yolları. */\n corners: { ring: string; dot: string }[];\n}\n\nexport interface QRModelOptions {\n value: string;\n errorLevel: QRErrorLevel;\n margin: number;\n dotType: QRDotType;\n cornerSquareType: QRCornerSquareType;\n cornerDotType: QRCornerDotType;\n}\n\nexport function buildQRModel({ value, errorLevel, margin, dotType, cornerSquareType, cornerDotType }: QRModelOptions): QRModel {\n const qr = qrcode(0, errorLevel);\n qr.addData(toByteString(value), \"Byte\");\n qr.make();\n\n const n = qr.getModuleCount();\n const finders = [\n [0, 0],\n [0, n - 7],\n [n - 7, 0],\n ] as const;\n const isFinder = (row: number, col: number) => finders.some(([fr, fc]) => row >= fr && row < fr + 7 && col >= fc && col < fc + 7);\n\n // Her nokta modülün TAMAMINI kaplar. Kaynak renderer her yandan %15 boşluk\n // bırakıyordu (nokta = modülün %70'i): tarayıcıda jsQR ile çözdürüldüğünde o\n // boşlukla stilli kodlar hiç çözülmedi, %5'te bazı boyutlarda çözülmedi,\n // boşluksuz tüm stiller 150–600px'te çözüldü. Değiştirirseniz yeniden doğrulayın.\n let dataPath = \"\";\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n if (isFinder(row, col) || !qr.isDark(row, col)) continue;\n dataPath += dotPath(margin + col, margin + row, 1, dotType);\n }\n }\n\n const corners = finders.map(([fr, fc]) => ({\n ring: cornerSquarePath(margin + fc, margin + fr, cornerSquareType),\n dot: cornerDotPath(margin + fc + 2, margin + fr + 2, cornerDotType),\n }));\n\n return { size: n + margin * 2, moduleCount: n, dataPath, corners };\n}\n"],"mappings":"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","names":[]}
|
package/dist/radio.js
CHANGED
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
import {
|
|
4
4
|
useFieldGroup,
|
|
5
5
|
useFieldSkeleton
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NPFMPRII.js";
|
|
7
7
|
import {
|
|
8
8
|
checkableTouchTargetClass,
|
|
9
9
|
fontSizeClass
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-POBOJBNJ.js";
|
|
11
11
|
import {
|
|
12
12
|
bgSolidClass,
|
|
13
13
|
borderStrongColorClass,
|
|
14
14
|
checkedBgSolidClass,
|
|
15
15
|
checkedBorderStrongClass
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
17
17
|
import {
|
|
18
18
|
skeletonBoxProps
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-VKN374SD.js";
|
|
20
20
|
|
|
21
21
|
// src/radio/Radio.tsx
|
|
22
22
|
import { forwardRef, useId, useImperativeHandle, useRef } from "react";
|
package/dist/radio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/radio/Radio.tsx","../src/radio/utils.ts","../src/radio/RadioGroup.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useId, useImperativeHandle, useRef } from \"react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { checkableTouchTargetClass, fontSizeClass } from \"../lib/sizeClasses\";\nimport type { RadioChangeEvent, RadioProps } from \"./types\";\nimport { getDotSizeClasses, getSizeClasses, getVariantClasses, getVariantDotClasses } from \"./utils\";\n\nexport type { RadioProps };\n\n/**\n * Eskiden `isChecked` sadece İLK render'da `defaultChecked ?? checked ?? false`\n * ile kuruluyor, sonra `checked` prop'u değiştiğinde bir `useEffect` ile\n * SENKRONİZE edilmeye çalışılıyordu — ama JSX zaten `checked ?? isChecked`\n * kullandığı için bu effect'in render üzerinde hiçbir etkisi yoktu (ölü\n * senkronizasyon). `useControllableState` bunu tek, doğru bir mekanizmaya indirger.\n */\nconst DESCRIPTION_INDENT_CLASS = { sm: \"pl-5\", md: \"pl-6\", lg: \"pl-7\" } as const;\n\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n autoFocus = false,\n checked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onBlur,\n onFocus,\n className,\n classNames = {},\n label,\n description,\n variant = \"outline\",\n color,\n size = \"md\",\n id,\n value,\n name,\n skeleton = false,\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current!, []);\n\n const [isChecked, setIsChecked] = useControllableState<boolean>({ value: checked, defaultValue: defaultChecked });\n const descriptionId = useId();\n\n const handleChange = (e: RadioChangeEvent) => {\n setIsChecked(e.target.checked);\n onChange?.(e);\n };\n\n if (skeleton) {\n return (\n <span aria-hidden className={cn(\"inline-flex items-center gap-2\", classNames.wrapper)}>\n <span {...skeletonBoxProps(cn(\"shrink-0 rounded-full\", getSizeClasses(size)))} />\n {label && <span {...skeletonBoxProps(cn(\"rounded-sm\", fontSizeClass[size]))}>{label}</span>}\n </span>\n );\n }\n\n const baseClasses = cn(\n \"relative shrink-0 cursor-pointer appearance-none rounded-full border transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n getSizeClasses(size),\n getVariantClasses(variant, color),\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames.radio,\n className\n );\n\n return (\n <label className={cn(\"inline-flex flex-col gap-1 cursor-pointer\", disabled && \"cursor-not-allowed\", classNames.wrapper)}>\n <span className={cn(\"relative inline-flex items-center gap-2\", checkableTouchTargetClass[size])}>\n <span className=\"relative inline-flex items-center justify-center\">\n <input\n ref={inputRef}\n id={id}\n type=\"radio\"\n // eslint-disable-next-line jsx-a11y/no-autofocus -- pass-through: kütüphane autofocus'u ZORLAMIYOR, tüketicinin verdiği prop'u iletiyor.\n autoFocus={autoFocus}\n checked={isChecked}\n disabled={disabled}\n value={value}\n name={name}\n aria-describedby={description ? descriptionId : undefined}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n className={baseClasses}\n />\n {isChecked && (\n // Nokta küçükten büyür (@starting-style) — seçim anlık \"belirmez\".\n <span\n className={cn(\n \"pointer-events-none absolute rounded-full transition-[scale] duration-150 starting:scale-0 motion-reduce:transition-none\",\n getDotSizeClasses(size),\n getVariantDotClasses(variant, color)\n )}\n />\n )}\n </span>\n {label && (\n <span className={cn(\"select-none text-mari-foreground\", fontSizeClass[size], disabled && \"text-mari-disabled\", classNames.label)}>\n {label}\n </span>\n )}\n </span>\n {description && (\n // Etiket hizasında başlar (kutu genişliği + gap): sm 12+8, md 16+8, lg 20+8px.\n <span id={descriptionId} className={cn(\"text-xs text-mari-muted\", DESCRIPTION_INDENT_CLASS[size])}>\n {description}\n </span>\n )}\n </label>\n );\n }\n);\n\nRadio.displayName = \"Radio\";\n","import { cn, type ColorRole, type Size, type Variant } from \"@mari-ui/core\";\nimport { bgSolidClass, borderStrongColorClass, checkedBgSolidClass, checkedBorderStrongClass } from \"../lib/colorClasses\";\n\nconst SIZE_CLASS: Record<Size, string> = {\n sm: \"w-3 h-3 text-sm\",\n md: \"w-4 h-4 text-base\",\n lg: \"w-5 h-5 text-lg\",\n};\n\nconst DOT_SIZE_CLASS: Record<Size, string> = {\n sm: \"w-1 h-1\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n};\n\nexport function getSizeClasses(size: Size): string {\n return SIZE_CLASS[size];\n}\n\nexport function getDotSizeClasses(size: Size): string {\n return DOT_SIZE_CLASS[size];\n}\n\n/**\n * `color` verilmediyse dinlenme halindeki (seçilmemiş) kenarlık nötr/gri\n * (`border-mari-input`) — sadece seçilince rol rengine bürünür.\n *\n * Faz 15: `solid` varyantında dolgu `checked:` önekisizdi — SEÇİLMEMİŞ radio\n * da tamamen dolu çiziliyor, bir grupta hepsi seçili görünüyordu. Açıkça\n * verilen renk (doğrulama) ve seçili halka rol renginde (açık `-border` tonu <3:1).\n */\nexport function getVariantClasses(variant: Extract<Variant, \"solid\" | \"outline\">, color: ColorRole | undefined): string {\n const fillColor = color ?? \"primary\";\n const restBorderClass = color ? borderStrongColorClass[color] : \"border-mari-input\";\n if (variant === \"solid\") return cn(\"border bg-mari-surface-alt\", restBorderClass, checkedBgSolidClass[fillColor], \"checked:border-transparent\");\n return cn(\"border bg-mari-surface\", restBorderClass, checkedBorderStrongClass[fillColor]);\n}\n\nexport function getVariantDotClasses(variant: Extract<Variant, \"solid\" | \"outline\">, color: ColorRole | undefined): string {\n const fillColor = color ?? \"primary\";\n return variant === \"solid\" ? \"bg-mari-surface\" : bgSolidClass[fillColor];\n}\n","\"use client\";\n\nimport React, { useId } from \"react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { useFieldGroup, useFieldSkeleton } from \"../lib/fieldContext\";\nimport { Radio } from \"./Radio\";\nimport type { RadioGroupProps, RadioOption } from \"./types\";\n\nexport type { RadioGroupProps };\n\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n disabled = false,\n options = [],\n onChange,\n variant = \"outline\",\n color,\n size = \"md\",\n block = false,\n orientation = \"horizontal\",\n className,\n skeleton: ownSkeleton,\n \"aria-label\": ownAriaLabel,\n \"aria-labelledby\": ownAriaLabelledBy,\n}: Readonly<RadioGroupProps>) {\n // Field içindeyse etiketi grubun adı olur; ipucu/hata, zorunluluk ve devre dışı oradan.\n const field = useFieldGroup({ \"aria-label\": ownAriaLabel, \"aria-labelledby\": ownAriaLabelledBy, disabled });\n const skeleton = useFieldSkeleton(ownSkeleton);\n const { \"aria-label\": ariaLabel, \"aria-labelledby\": ariaLabelledBy } = field;\n const groupDisabled = !!field.disabled;\n const groupColor = field[\"aria-invalid\"] ? (color ?? \"error\") : color;\n const [selectedValue, setSelectedValue] = useControllableState<string | number | undefined>({\n value,\n defaultValue,\n onChange: (v) => v !== undefined && onChange?.(v),\n });\n\n // Faz 15: `name` verilmezse radyolar tarayıcı gözünde tek bir grup OLMUYORDU —\n // Ok tuşlarıyla gezinme çalışmıyor, Tab her seçenekte duruyordu. Otomatik ad.\n const autoName = useId();\n const groupName = name ?? autoName;\n\n const parsedOptions: RadioOption[] = options.map((opt) =>\n typeof opt === \"string\" || typeof opt === \"number\" ? { label: opt, value: opt } : opt\n );\n\n return (\n // `role=\"radiogroup\"` eskiden yoktu — birden çok `<input type=\"radio\">`\n // sadece aynı `name`'i paylaşarak native olarak bir grup oluşturuyordu\n // ama ekran okuyucuya bunun tek bir SEÇİM grubu olduğu (ve varsa grubun\n // adının) ayrıca duyurulması gerekir.\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={field[\"aria-describedby\"]}\n aria-invalid={field[\"aria-invalid\"]}\n aria-required={field[\"aria-required\"]}\n aria-orientation={orientation}\n aria-busy={skeleton || undefined}\n className={cn(\"flex\", orientation === \"vertical\" ? \"flex-col gap-3\" : \"flex-wrap gap-x-4 gap-y-2\", block && \"w-full\", className)}\n >\n {parsedOptions.map((opt) => (\n <Radio\n key={opt.value}\n value={opt.value}\n name={groupName}\n label={opt.label}\n description={opt.description}\n skeleton={skeleton}\n disabled={groupDisabled || opt.disabled}\n checked={selectedValue === opt.value}\n onChange={() => setSelectedValue(opt.value)}\n size={size}\n variant={variant}\n color={groupColor}\n />\n ))}\n </div>\n );\n}\n\nRadioGroup.displayName = \"RadioGroup\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,SAAgB,YAAY,OAAO,qBAAqB,cAAc;AACtE,SAAS,MAAAA,KAAI,4BAA4B;;;ACHzC,SAAS,UAAmD;AAG5D,IAAM,aAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,iBAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,SAAS,eAAe,MAAoB;AACjD,SAAO,WAAW,IAAI;AACxB;AAEO,SAAS,kBAAkB,MAAoB;AACpD,SAAO,eAAe,IAAI;AAC5B;AAUO,SAAS,kBAAkB,SAAgD,OAAsC;AACtH,QAAM,YAAY,SAAS;AAC3B,QAAM,kBAAkB,QAAQ,uBAAuB,KAAK,IAAI;AAChE,MAAI,YAAY,QAAS,QAAO,GAAG,8BAA8B,iBAAiB,oBAAoB,SAAS,GAAG,4BAA4B;AAC9I,SAAO,GAAG,0BAA0B,iBAAiB,yBAAyB,SAAS,CAAC;AAC1F;AAEO,SAAS,qBAAqB,SAAgD,OAAsC;AACzH,QAAM,YAAY,SAAS;AAC3B,SAAO,YAAY,UAAU,oBAAoB,aAAa,SAAS;AACzE;;;ADgBQ,SACE,KADF;AAvCR,IAAM,2BAA2B,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAE/D,IAAM,QAAQ;AAAA,EACnB,CACE;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,CAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,GACA,QACG;AACH,UAAM,WAAW,OAAyB,IAAI;AAC9C,wBAAoB,KAAK,MAAM,SAAS,SAAU,CAAC,CAAC;AAEpD,UAAM,CAAC,WAAW,YAAY,IAAI,qBAA8B,EAAE,OAAO,SAAS,cAAc,eAAe,CAAC;AAChH,UAAM,gBAAgB,MAAM;AAE5B,UAAM,eAAe,CAAC,MAAwB;AAC5C,mBAAa,EAAE,OAAO,OAAO;AAC7B,iBAAW,CAAC;AAAA,IACd;AAEA,QAAI,UAAU;AACZ,aACE,qBAAC,UAAK,eAAW,MAAC,WAAWC,IAAG,kCAAkC,WAAW,OAAO,GAClF;AAAA,4BAAC,UAAM,GAAG,iBAAiBA,IAAG,yBAAyB,eAAe,IAAI,CAAC,CAAC,GAAG;AAAA,QAC9E,SAAS,oBAAC,UAAM,GAAG,iBAAiBA,IAAG,cAAc,cAAc,IAAI,CAAC,CAAC,GAAI,iBAAM;AAAA,SACtF;AAAA,IAEJ;AAEA,UAAM,cAAcA;AAAA,MAClB;AAAA,MACA,eAAe,IAAI;AAAA,MACnB,kBAAkB,SAAS,KAAK;AAAA,MAChC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX;AAAA,IACF;AAEA,WACE,qBAAC,WAAM,WAAWA,IAAG,6CAA6C,YAAY,sBAAsB,WAAW,OAAO,GACpH;AAAA,2BAAC,UAAK,WAAWA,IAAG,2CAA2C,0BAA0B,IAAI,CAAC,GAC5F;AAAA,6BAAC,UAAK,WAAU,oDACd;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA,MAAK;AAAA,cAEL;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,oBAAkB,cAAc,gBAAgB;AAAA,cAChD,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA,WAAW;AAAA;AAAA,UACb;AAAA,UACC;AAAA,UAEC;AAAA,YAAC;AAAA;AAAA,cACC,WAAWA;AAAA,gBACT;AAAA,gBACA,kBAAkB,IAAI;AAAA,gBACtB,qBAAqB,SAAS,KAAK;AAAA,cACrC;AAAA;AAAA,UACF;AAAA,WAEJ;AAAA,QACC,SACC,oBAAC,UAAK,WAAWA,IAAG,oCAAoC,cAAc,IAAI,GAAG,YAAY,sBAAsB,WAAW,KAAK,GAC5H,iBACH;AAAA,SAEJ;AAAA,MACC;AAAA,MAEC,oBAAC,UAAK,IAAI,eAAe,WAAWA,IAAG,2BAA2B,yBAAyB,IAAI,CAAC,GAC7F,uBACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,MAAM,cAAc;;;AEvHpB,SAAgB,SAAAC,cAAa;AAC7B,SAAS,MAAAC,KAAI,wBAAAC,6BAA4B;AA8DjC,gBAAAC,YAAA;AAvDD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,UAAU,CAAC;AAAA,EACX;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,mBAAmB;AACrB,GAA8B;AAE5B,QAAM,QAAQ,cAAc,EAAE,cAAc,cAAc,mBAAmB,mBAAmB,SAAS,CAAC;AAC1G,QAAM,WAAW,iBAAiB,WAAW;AAC7C,QAAM,EAAE,cAAc,WAAW,mBAAmB,eAAe,IAAI;AACvE,QAAM,gBAAgB,CAAC,CAAC,MAAM;AAC9B,QAAM,aAAa,MAAM,cAAc,IAAK,SAAS,UAAW;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAIC,sBAAkD;AAAA,IAC1F;AAAA,IACA;AAAA,IACA,UAAU,CAAC,MAAM,MAAM,UAAa,WAAW,CAAC;AAAA,EAClD,CAAC;AAID,QAAM,WAAWC,OAAM;AACvB,QAAM,YAAY,QAAQ;AAE1B,QAAM,gBAA+B,QAAQ;AAAA,IAAI,CAAC,QAChD,OAAO,QAAQ,YAAY,OAAO,QAAQ,WAAW,EAAE,OAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EACpF;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,oBAAkB,MAAM,kBAAkB;AAAA,QAC1C,gBAAc,MAAM,cAAc;AAAA,QAClC,iBAAe,MAAM,eAAe;AAAA,QACpC,oBAAkB;AAAA,QAClB,aAAW,YAAY;AAAA,QACvB,WAAWG,IAAG,QAAQ,gBAAgB,aAAa,mBAAmB,6BAA6B,SAAS,UAAU,SAAS;AAAA,QAE9H,wBAAc,IAAI,CAAC,QAClB,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,IAAI;AAAA,YACX,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,aAAa,IAAI;AAAA,YACjB;AAAA,YACA,UAAU,iBAAiB,IAAI;AAAA,YAC/B,SAAS,kBAAkB,IAAI;AAAA,YAC/B,UAAU,MAAM,iBAAiB,IAAI,KAAK;AAAA,YAC1C;AAAA,YACA;AAAA,YACA,OAAO;AAAA;AAAA,UAXF,IAAI;AAAA,QAYX,CACD;AAAA;AAAA,IACH;AAAA;AAEJ;AAEA,WAAW,cAAc;","names":["cn","cn","useId","cn","useControllableState","jsx","useControllableState","useId","cn"]}
|
|
1
|
+
{"version":3,"sources":["../src/radio/Radio.tsx","../src/radio/utils.ts","../src/radio/RadioGroup.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useId, useImperativeHandle, useRef } from \"react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { checkableTouchTargetClass, fontSizeClass } from \"../lib/sizeClasses\";\nimport type { RadioChangeEvent, RadioProps } from \"./types\";\nimport { getDotSizeClasses, getSizeClasses, getVariantClasses, getVariantDotClasses } from \"./utils\";\n\nexport type { RadioProps };\n\n/*\n * Eskiden `isChecked` sadece İLK render'da `defaultChecked ?? checked ?? false`\n * ile kuruluyor, sonra `checked` prop'u değiştiğinde bir `useEffect` ile\n * SENKRONİZE edilmeye çalışılıyordu — ama JSX zaten `checked ?? isChecked`\n * kullandığı için bu effect'in render üzerinde hiçbir etkisi yoktu (ölü\n * senkronizasyon). `useControllableState` bunu tek, doğru bir mekanizmaya indirger.\n */\nconst DESCRIPTION_INDENT_CLASS = { sm: \"pl-5\", md: \"pl-6\", lg: \"pl-7\" } as const;\n\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n autoFocus = false,\n checked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onBlur,\n onFocus,\n className,\n classNames = {},\n label,\n description,\n variant = \"outline\",\n color,\n size = \"md\",\n id,\n value,\n name,\n skeleton = false,\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current!, []);\n\n const [isChecked, setIsChecked] = useControllableState<boolean>({ value: checked, defaultValue: defaultChecked });\n const descriptionId = useId();\n\n const handleChange = (e: RadioChangeEvent) => {\n setIsChecked(e.target.checked);\n onChange?.(e);\n };\n\n if (skeleton) {\n return (\n <span aria-hidden className={cn(\"inline-flex items-center gap-2\", classNames.wrapper)}>\n <span {...skeletonBoxProps(cn(\"shrink-0 rounded-full\", getSizeClasses(size)))} />\n {label && <span {...skeletonBoxProps(cn(\"rounded-sm\", fontSizeClass[size]))}>{label}</span>}\n </span>\n );\n }\n\n const baseClasses = cn(\n \"relative shrink-0 cursor-pointer appearance-none rounded-full border transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n getSizeClasses(size),\n getVariantClasses(variant, color),\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames.radio,\n className\n );\n\n return (\n <label className={cn(\"inline-flex flex-col gap-1 cursor-pointer\", disabled && \"cursor-not-allowed\", classNames.wrapper)}>\n <span className={cn(\"relative inline-flex items-center gap-2\", checkableTouchTargetClass[size])}>\n <span className=\"relative inline-flex items-center justify-center\">\n <input\n ref={inputRef}\n id={id}\n type=\"radio\"\n // eslint-disable-next-line jsx-a11y/no-autofocus -- pass-through: kütüphane autofocus'u ZORLAMIYOR, tüketicinin verdiği prop'u iletiyor.\n autoFocus={autoFocus}\n checked={isChecked}\n disabled={disabled}\n value={value}\n name={name}\n aria-describedby={description ? descriptionId : undefined}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n className={baseClasses}\n />\n {isChecked && (\n // Nokta küçükten büyür (@starting-style) — seçim anlık \"belirmez\".\n <span\n className={cn(\n \"pointer-events-none absolute rounded-full transition-[scale] duration-150 starting:scale-0 motion-reduce:transition-none\",\n getDotSizeClasses(size),\n getVariantDotClasses(variant, color)\n )}\n />\n )}\n </span>\n {label && (\n <span className={cn(\"select-none text-mari-foreground\", fontSizeClass[size], disabled && \"text-mari-disabled\", classNames.label)}>\n {label}\n </span>\n )}\n </span>\n {description && (\n // Etiket hizasında başlar (kutu genişliği + gap): sm 12+8, md 16+8, lg 20+8px.\n <span id={descriptionId} className={cn(\"text-xs text-mari-muted\", DESCRIPTION_INDENT_CLASS[size])}>\n {description}\n </span>\n )}\n </label>\n );\n }\n);\n\nRadio.displayName = \"Radio\";\n","import { cn, type ColorRole, type Size, type Variant } from \"@mari-ui/core\";\nimport { bgSolidClass, borderStrongColorClass, checkedBgSolidClass, checkedBorderStrongClass } from \"../lib/colorClasses\";\n\nconst SIZE_CLASS: Record<Size, string> = {\n sm: \"w-3 h-3 text-sm\",\n md: \"w-4 h-4 text-base\",\n lg: \"w-5 h-5 text-lg\",\n};\n\nconst DOT_SIZE_CLASS: Record<Size, string> = {\n sm: \"w-1 h-1\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n};\n\nexport function getSizeClasses(size: Size): string {\n return SIZE_CLASS[size];\n}\n\nexport function getDotSizeClasses(size: Size): string {\n return DOT_SIZE_CLASS[size];\n}\n\n/**\n * `color` verilmediyse dinlenme halindeki (seçilmemiş) kenarlık nötr/gri\n * (`border-mari-input`) — sadece seçilince rol rengine bürünür.\n *\n * `solid` varyantında dolgu `checked:` önekisizdi — SEÇİLMEMİŞ radio\n * da tamamen dolu çiziliyor, bir grupta hepsi seçili görünüyordu. Açıkça\n * verilen renk (doğrulama) ve seçili halka rol renginde (açık `-border` tonu <3:1).\n */\nexport function getVariantClasses(variant: Extract<Variant, \"solid\" | \"outline\">, color: ColorRole | undefined): string {\n const fillColor = color ?? \"primary\";\n const restBorderClass = color ? borderStrongColorClass[color] : \"border-mari-input\";\n if (variant === \"solid\") return cn(\"border bg-mari-surface-alt\", restBorderClass, checkedBgSolidClass[fillColor], \"checked:border-transparent\");\n return cn(\"border bg-mari-surface\", restBorderClass, checkedBorderStrongClass[fillColor]);\n}\n\nexport function getVariantDotClasses(variant: Extract<Variant, \"solid\" | \"outline\">, color: ColorRole | undefined): string {\n const fillColor = color ?? \"primary\";\n return variant === \"solid\" ? \"bg-mari-surface\" : bgSolidClass[fillColor];\n}\n","\"use client\";\n\nimport React, { useId } from \"react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { useFieldGroup, useFieldSkeleton } from \"../lib/fieldContext\";\nimport { Radio } from \"./Radio\";\nimport type { RadioGroupProps, RadioOption } from \"./types\";\n\nexport type { RadioGroupProps };\n\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n disabled = false,\n options = [],\n onChange,\n variant = \"outline\",\n color,\n size = \"md\",\n block = false,\n orientation = \"horizontal\",\n className,\n skeleton: ownSkeleton,\n \"aria-label\": ownAriaLabel,\n \"aria-labelledby\": ownAriaLabelledBy,\n}: Readonly<RadioGroupProps>) {\n // Field içindeyse etiketi grubun adı olur; ipucu/hata, zorunluluk ve devre dışı oradan.\n const field = useFieldGroup({ \"aria-label\": ownAriaLabel, \"aria-labelledby\": ownAriaLabelledBy, disabled });\n const skeleton = useFieldSkeleton(ownSkeleton);\n const { \"aria-label\": ariaLabel, \"aria-labelledby\": ariaLabelledBy } = field;\n const groupDisabled = !!field.disabled;\n const groupColor = field[\"aria-invalid\"] ? (color ?? \"error\") : color;\n const [selectedValue, setSelectedValue] = useControllableState<string | number | undefined>({\n value,\n defaultValue,\n onChange: (v) => v !== undefined && onChange?.(v),\n });\n\n // Faz 15: `name` verilmezse radyolar tarayıcı gözünde tek bir grup OLMUYORDU —\n // Ok tuşlarıyla gezinme çalışmıyor, Tab her seçenekte duruyordu. Otomatik ad.\n const autoName = useId();\n const groupName = name ?? autoName;\n\n const parsedOptions: RadioOption[] = options.map((opt) =>\n typeof opt === \"string\" || typeof opt === \"number\" ? { label: opt, value: opt } : opt\n );\n\n return (\n // `role=\"radiogroup\"` eskiden yoktu — birden çok `<input type=\"radio\">`\n // sadece aynı `name`'i paylaşarak native olarak bir grup oluşturuyordu\n // ama ekran okuyucuya bunun tek bir SEÇİM grubu olduğu (ve varsa grubun\n // adının) ayrıca duyurulması gerekir.\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={field[\"aria-describedby\"]}\n aria-invalid={field[\"aria-invalid\"]}\n aria-required={field[\"aria-required\"]}\n aria-orientation={orientation}\n aria-busy={skeleton || undefined}\n className={cn(\"flex\", orientation === \"vertical\" ? \"flex-col gap-3\" : \"flex-wrap gap-x-4 gap-y-2\", block && \"w-full\", className)}\n >\n {parsedOptions.map((opt) => (\n <Radio\n key={opt.value}\n value={opt.value}\n name={groupName}\n label={opt.label}\n description={opt.description}\n skeleton={skeleton}\n disabled={groupDisabled || opt.disabled}\n checked={selectedValue === opt.value}\n onChange={() => setSelectedValue(opt.value)}\n size={size}\n variant={variant}\n color={groupColor}\n />\n ))}\n </div>\n );\n}\n\nRadioGroup.displayName = \"RadioGroup\";\n"],"mappings":"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","names":["cn","cn","useId","cn","useControllableState","jsx","useControllableState","useId","cn"]}
|
package/dist/rate.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
textClass
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
6
6
|
import {
|
|
7
7
|
skeletonBoxProps
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VKN374SD.js";
|
|
9
9
|
|
|
10
10
|
// src/rate/Rate.tsx
|
|
11
11
|
import { useEffect, useRef, useState } from "react";
|