@mari-ui/components 0.1.0 → 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/input/Input.tsx","../src/input/mention/useMention.tsx","../src/input/mention/caret.ts","../src/input/mention/utils.ts","../src/input/Textarea.tsx","../src/input/OtpInput.tsx","../src/input/_components/OtpSingleField.tsx","../src/input/SearchInput.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useState } from \"react\";\nimport { InputMask } from \"@react-input/mask\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { touchTargetClass } from \"../lib/sizeClasses\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport type { InputProps } from \"./types\";\nimport { useMention } from \"./mention/useMention\";\nimport { ClearButton, clearIconOf, PasswordToggle } from \"./_components/FieldAdornments\";\nimport {\n FIELD_BASE_CLASS,\n FIELD_DISABLED_CLASS,\n FIELD_MOBILE_TEXT_CLASS,\n getShapeClasses,\n getSizeClasses,\n getVariantClasses,\n clearNativeValue,\n isClearable,\n} from \"./utils\";\n\nexport type { InputProps };\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>((outerProps, ref) => {\n // Field içindeyse id / aria-describedby / hata / required / disabled oradan tamamlanır.\n return <InputInner {...useFieldControl(outerProps)} forwardedRef={ref} />;\n});\n\nInput.displayName = \"Input\";\n\nconst InputInner = (\n {\n forwardedRef: ref,\n placeholder,\n allowClear = false,\n clearLabel = \"Temizle\",\n skeleton = false,\n classNames = {},\n className = \"\",\n style,\n count,\n defaultValue = \"\",\n disabled = false,\n id,\n maxLength,\n icon,\n iconPosition = \"start\",\n showCount,\n color,\n size = \"md\",\n shape = \"default\",\n type = \"text\",\n value,\n variant = \"outline\",\n onChange,\n onPressEnter,\n onClear,\n onFocus,\n onBlur,\n onKeyDown,\n onInput,\n onPaste,\n mask,\n replacement = { _: /\\d/ },\n visibilityToggle,\n visibilityIconRender,\n max,\n min,\n mentions,\n ...nativeProps\n }: InputProps & { forwardedRef: React.ForwardedRef<HTMLInputElement> }\n ) => {\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n const setRefs = (el: HTMLInputElement | null) => {\n innerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n };\n // `color` varsayılansız: verilmezse dinlenmede nötr, odakta primary (bkz. `getVariantClasses`).\n // `error` rengi aynı zamanda gerçek bir doğrulama durumudur — ekran\n // okuyucuya da bildirilsin diye `aria-invalid` otomatik eklenir\n // (tüketici zaten kendi `aria-invalid`'ini verdiyse o kazanır).\n const ariaInvalid = nativeProps[\"aria-invalid\"] ?? (color === \"error\" || undefined);\n // `onChange` burada hook'a geçirilmiyor — tam ChangeEvent'i tüketiciye\n // iletmek için `handleChange` içinde ayrıca çağrılıyor.\n const [currentValue, setCurrentValue] = useControllableState<string>({ value, defaultValue });\n const [passwordVisible, setPasswordVisible] = useState(false);\n\n const showPasswordToggle = type === \"password\" && visibilityToggle !== false;\n\n // İç içe ternary yerine ayrık if — SonarJS'in `no-nested-conditional`\n // kuralı bunu okunurluk için haklı olarak istiyordu (Faz 8).\n let inputType = type;\n if (showPasswordToggle) inputType = passwordVisible ? \"text\" : \"password\";\n const charCount = currentValue.length;\n // Ayrık değişken — iç içe template literal yerine (Faz 8, SonarJS `no-nested-template-literals`).\n const countLabel = maxLength ? `${charCount} / ${maxLength}` : `${charCount}`;\n const showClear = isClearable(allowClear) && Boolean(currentValue) && !disabled;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCurrentValue(e.target.value);\n onChange?.(e);\n };\n\n // Maskeli alanda bahsetme yok (maske metni yeniden biçimlendirir).\n const mention = useMention(mask ? undefined : mentions, innerRef, currentValue, \"input\");\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Açık öneri listesinde Enter bir öneri seçer — formu göndermesin / onPressEnter tetiklenmesin.\n const handledByMention = mention.handleKeyDown(e);\n if (e.key === \"Enter\" && !handledByMention) onPressEnter?.(e);\n onKeyDown?.(e);\n };\n\n // Temizledikten sonra odak alana döner — kullanıcı hemen yeniden yazabilsin\n // (buton kaybolduğu için odak aksi halde <body>'ye düşüyordu).\n const handleClear = () => {\n // onChange'i gerçek olayla tetikler (handleChange → iç state + tüketici).\n clearNativeValue(innerRef.current);\n onClear?.();\n innerRef.current?.focus();\n };\n\n // Geometri iskeletle ORTAK (boyut + şekil) — yüklenince kutu zıplamaz.\n const geometryClass = cn(\"flex w-full items-center gap-2\", getSizeClasses(size), getShapeClasses(shape, variant));\n\n if (skeleton) {\n return <div {...skeletonBoxProps(cn(geometryClass, classNames.wrapper, className))} style={style} />;\n }\n\n const wrapperClass = cn(\n geometryClass,\n \"group relative cursor-text\",\n touchTargetClass[size],\n FIELD_BASE_CLASS,\n getVariantClasses(variant, color),\n disabled && FIELD_DISABLED_CLASS,\n classNames.wrapper,\n className\n );\n const adornmentClass = \"flex shrink-0 items-center text-mari-muted\";\n\n // Kutunun input DIŞINDAKİ alanına (dolgu, ikon, dokunmatikte genişletilmiş\n // alan) tıklamak da alanı odaklar — eskiden sadece metin satırının kendisi\n // tıklanabilirdi. İç butonlar (temizle, şifre) kendi işini yapar.\n const handleWrapperMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n if (disabled || innerRef.current?.contains(target) || target.closest(\"button\")) return;\n e.preventDefault();\n innerRef.current?.focus();\n };\n\n // `w-full min-w-0`: native <input>'un tarayıcı varsayılanı ~20 karakterlik\n // bir içsel genişliktir (≈250px) ve bu, kapsayıcının min-content boyutuna\n // katkı olarak sızıp dar grid kolonlarını (mobil form) taşırıyordu —\n // `min-w-0` tek başına yetmez, yüzdelik genişlik bu katkıyı sıfırlar\n // (Faz 13.6 Steps mobil incelemesinde bulundu).\n const inputClass = cn(\"w-full min-w-0 flex-grow bg-transparent placeholder:text-mari-muted focus:outline-none disabled:cursor-not-allowed\", FIELD_MOBILE_TEXT_CLASS, classNames.input);\n\n return (\n <>\n {/* Fare kısayolu; klavye kullanıcısı zaten doğrudan <input>'a sekmeyle gelir. */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div className={wrapperClass} style={style} onMouseDown={handleWrapperMouseDown}>\n {/* Boşluk wrapper'ın `gap-*`'ından gelir — eskiden ayrıca `mr-2` vardı, ikon ile metin arası 2 katıydı. */}\n {icon && iconPosition === \"start\" && <span className={cn(adornmentClass, classNames.icon)}>{icon}</span>}\n\n {mask ? (\n <InputMask\n ref={setRefs}\n id={id}\n mask={mask}\n replacement={replacement}\n disabled={disabled}\n type={inputType}\n maxLength={maxLength}\n placeholder={placeholder}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n onInput={onInput}\n onPaste={onPaste}\n className={inputClass}\n {...nativeProps}\n aria-invalid={ariaInvalid}\n />\n ) : (\n <input\n ref={setRefs}\n id={id}\n disabled={disabled}\n type={inputType}\n maxLength={maxLength}\n placeholder={placeholder}\n value={currentValue}\n {...mention.controlProps}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={onFocus}\n onBlur={(e) => {\n mention.close();\n onBlur?.(e);\n }}\n onInput={onInput}\n onPaste={onPaste}\n className={inputClass}\n max={max}\n min={min}\n {...nativeProps}\n aria-invalid={ariaInvalid}\n />\n )}\n\n {allowClear && <ClearButton visible={showClear} label={clearLabel} icon={clearIconOf(allowClear)} onClear={handleClear} className={classNames.clear} />}\n\n {(showCount || count?.formatter) && (\n <span className={cn(\"flex flex-none items-center text-xs tabular-nums text-mari-muted\", classNames.count)}>\n {count?.formatter ? count.formatter({ value: currentValue, count: charCount, maxLength }) : countLabel}\n </span>\n )}\n\n {icon && iconPosition === \"end\" && <span className={cn(adornmentClass, classNames.icon)}>{icon}</span>}\n\n {showPasswordToggle && (\n <PasswordToggle visible={passwordVisible} disabled={disabled} onToggle={() => setPasswordVisible((prev) => !prev)} iconRender={visibilityIconRender} />\n )}\n </div>\n {mention.panel}\n </>\n );\n };\n","\"use client\";\n\nimport type React from \"react\";\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { FloatingCoords } from \"../../lib/useFloatingPosition\";\nimport { optionDomId, SelectPanel } from \"../../select/_components/SelectPanel\";\nimport type { SelectOption } from \"../../select/types\";\nimport type { MentionOption, MentionsConfig } from \"./types\";\nimport { getCaretRect } from \"./caret\";\nimport { filterMentionOptions, findMention, insertMention, type MentionMatch } from \"./utils\";\n\ntype Field = HTMLInputElement | HTMLTextAreaElement;\n\nconst GAP_PX = 4;\nconst EDGE_PX = 8;\n/** Panel genişliği (rem) — kök yazı boyutuyla ölçeklenir. */\nconst PANEL_WIDTH_REM = 16;\n\nconst toSelectOption = (o: MentionOption): SelectOption => ({ value: o.value, label: o.label ?? o.value, icon: o.icon, description: o.description, disabled: o.disabled });\n\n/** React'in kontrollü alanına değeri \"kullanıcı yazmış gibi\" verir → bileşenin onChange'i gerçek olayla çalışır. */\nfunction setNativeValue(el: Field, text: string) {\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n Object.getOwnPropertyDescriptor(proto, \"value\")?.set?.call(el, text);\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n}\n\nfunction nextEnabled(options: MentionOption[], from: number, step: 1 | -1): number {\n const n = options.length;\n for (let i = 1; i <= n; i++) {\n const idx = (((from + step * i) % n) + n) % n;\n if (!options[idx]!.disabled) return idx;\n }\n return -1;\n}\n\n/** Eşleşmenin tetiğine göre liste, sorguya göre süzülmüş. */\nfunction resolveOptions(config: MentionsConfig | undefined, match: MentionMatch | null): MentionOption[] {\n if (!config || !match) return [];\n const all = typeof config.options === \"function\" ? config.options(match.prefix) : config.options;\n return filterMentionOptions(all, match.query, config.filterOption);\n}\n\n/** Panel konumu: imlecin altında; sığmazsa üstünde; yatayda ekrana sığdırılır. */\nfunction useCaretPosition(open: boolean, elRef: React.RefObject<Field | null>, panelRef: React.RefObject<HTMLDivElement | null>, match: MentionMatch | null, deps: unknown) {\n const [coords, setCoords] = useState<FloatingCoords | null>(null);\n useLayoutEffect(() => {\n if (!open || !match) {\n setCoords(null);\n return;\n }\n const measure = () => {\n const el = elRef.current;\n const panel = panelRef.current;\n if (!el) return;\n const caret = getCaretRect(el, match.start);\n const width = panel?.offsetWidth ?? 0;\n const height = panel?.offsetHeight ?? 0;\n let top = caret.top + caret.height + GAP_PX;\n if (top + height > window.innerHeight - EDGE_PX && caret.top - GAP_PX - height > EDGE_PX) top = caret.top - GAP_PX - height;\n const left = Math.max(EDGE_PX, Math.min(caret.left, window.innerWidth - width - EDGE_PX));\n setCoords({ top, left, side: \"bottom\", arrowOffset: 0, anchorWidth: PANEL_WIDTH_REM * Number.parseFloat(getComputedStyle(document.documentElement).fontSize) });\n };\n measure();\n // İlk ölçümde panel henüz boyutsuz olabilir; bir kare sonra gerçek boyutla yeniden.\n const raf = requestAnimationFrame(measure);\n window.addEventListener(\"scroll\", measure, true);\n window.addEventListener(\"resize\", measure);\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener(\"scroll\", measure, true);\n window.removeEventListener(\"resize\", measure);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `deps`: liste uzunluğu değişince yeniden ölç\n }, [open, match?.start, match?.prefix, deps]);\n return coords;\n}\n\n/**\n * Input ve Textarea'nın ortak `mentions` davranışı. Döndürdüğü `controlProps`\n * alana yayılır (ARIA + klavye + imleç izleme), `panel` alanın yanına çizilir.\n * Odak hep alanda kalır; aktif öneri `aria-activedescendant` (APG combobox).\n */\nexport function useMention(config: MentionsConfig | undefined, elRef: React.RefObject<Field | null>, value: string, kind: \"input\" | \"textarea\") {\n const enabled = config !== undefined;\n const prefixes = useMemo(() => {\n const p = config?.prefix ?? \"@\";\n return Array.isArray(p) ? p : [p];\n }, [config?.prefix]);\n const split = config?.split ?? \" \";\n const [match, setMatch] = useState<MentionMatch | null>(null);\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n const [activeIndex, setActiveIndex] = useState(0);\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n const lastQuery = useRef<string | null>(null);\n\n const options = useMemo(() => resolveOptions(config, match), [config, match]);\n const notFound = config?.notFoundContent === undefined ? \"Sonuç bulunamadı\" : config.notFoundContent;\n const open = enabled && match !== null && dismissedAt !== match.start && (options.length > 0 || !!config?.loading || notFound !== null);\n // SelectPanel aktif satırı nesne kimliğiyle bulur — iki listeye AYNI dizi verilmeli.\n const selectOptions = useMemo(() => options.map(toSelectOption), [options]);\n const coords = useCaretPosition(open, elRef, panelRef, match, options.length);\n\n /** İmlece göre eşleşmeyi yeniden hesapla (yazınca, imleç oynayınca, odakta). */\n const sync = () => {\n const el = elRef.current;\n if (!enabled || !el) return;\n const caret = el.selectionStart;\n const next = caret !== null && caret === el.selectionEnd ? findMention(el.value, caret, prefixes) : null;\n setMatch((prev) => (prev?.start === next?.start && prev?.query === next?.query && prev?.prefix === next?.prefix ? prev : next));\n if (!next) setDismissedAt(null);\n };\n\n // Değer değişince (yazma, yapıştırma, dışarıdan) eşleşmeyi güncelle.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(sync, [value, enabled]);\n\n // Sorgu değişince: aktif satır başa, sunucu araması bildirimi.\n useEffect(() => {\n setActiveIndex(0);\n const key = match ? `${match.prefix}${match.start}:${match.query}` : null;\n if (match && key !== lastQuery.current) config?.onSearch?.(match.query, match.prefix);\n lastQuery.current = key;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [match]);\n\n // Klavyeyle gezinirken aktif öneri listenin görünür alanında kalsın (Select ile aynı).\n const activeId = open && options[activeIndex] ? optionDomId(listboxId, selectOptions[activeIndex]!) : undefined;\n useEffect(() => {\n if (activeId) document.getElementById(activeId)?.scrollIntoView?.({ block: \"nearest\" });\n }, [activeId]);\n\n const choose = (option: MentionOption) => {\n const el = elRef.current;\n if (!el || !match || option.disabled) return;\n const caret = el.selectionStart ?? el.value.length;\n const result = insertMention(el.value, match, caret, option.value, split);\n setNativeValue(el, result.text);\n el.setSelectionRange(result.caret, result.caret);\n // Kontrollü alanda React yeniden çizince imleç sona kaçmasın.\n requestAnimationFrame(() => el.setSelectionRange(result.caret, result.caret));\n setMatch(null);\n config?.onSelect?.(option, match.prefix);\n };\n\n /** `true` → tuş mention tarafından işlendi (bileşen kendi Enter davranışını çalıştırmasın). */\n const handleKeyDown = (e: React.KeyboardEvent): boolean => {\n if (!open || !match) return false;\n const active = options[activeIndex];\n switch (e.key) {\n case \"ArrowDown\":\n case \"ArrowUp\": {\n e.preventDefault();\n if (options.length) setActiveIndex((i) => Math.max(0, nextEnabled(options, i, e.key === \"ArrowDown\" ? 1 : -1)));\n return true;\n }\n case \"Enter\":\n case \"Tab\":\n if (!active || active.disabled) return false;\n e.preventDefault();\n choose(active);\n return true;\n case \"Escape\":\n // Modal/Drawer içinde Escape önce listeyi kapatsın, pencereyi değil.\n e.preventDefault();\n e.stopPropagation();\n setDismissedAt(match.start);\n return true;\n default:\n return false;\n }\n };\n\n const controlProps = enabled\n ? {\n ...(kind === \"input\" ? { role: \"combobox\" as const, \"aria-expanded\": open } : {}),\n \"aria-autocomplete\": \"list\" as const,\n \"aria-controls\": open ? listboxId : undefined,\n \"aria-activedescendant\": activeId,\n onKeyUp: (e: React.KeyboardEvent) => {\n if ([\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"].includes(e.key)) sync();\n },\n onClick: sync,\n }\n : {};\n\n const panel = open ? (\n <SelectPanel\n ref={panelRef}\n listboxId={listboxId}\n coords={coords}\n sections={[{ key: \"mentions\", options: selectOptions }]}\n flatOptions={selectOptions}\n activeIndex={activeIndex}\n isSelected={() => false}\n multiple={false}\n loading={!!config?.loading}\n notFoundContent={notFound}\n listHeight={config?.listHeight ?? \"14rem\"}\n label={config?.listLabel ?? \"Öneriler\"}\n onPick={(o) => {\n const option = options.find((m) => m.value === o.value);\n if (option) choose(option);\n }}\n onHover={setActiveIndex}\n />\n ) : null;\n\n return { controlProps, panel, handleKeyDown, close: () => setMatch(null) };\n}\n","\"use client\";\n\nconst MIRROR_PROPS = [\n \"boxSizing\", \"width\", \"height\", \"overflowX\", \"overflowY\",\n \"borderTopWidth\", \"borderRightWidth\", \"borderBottomWidth\", \"borderLeftWidth\",\n \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\",\n \"fontStyle\", \"fontVariant\", \"fontWeight\", \"fontStretch\", \"fontSize\", \"lineHeight\", \"fontFamily\",\n \"textAlign\", \"textTransform\", \"textIndent\", \"letterSpacing\", \"wordSpacing\", \"tabSize\",\n] as const;\n\n/**\n * İmlecin ekrandaki konumu (viewport koordinatı). Alanın stilini kopyalayan\n * görünmez bir \"ayna\" kutuda imlece kadar olan metin yazılır, ardından gelen\n * işaretçinin konumu ölçülür — tarayıcılar textarea imlecinin konumunu\n * doğrudan vermiyor.\n */\nexport function getCaretRect(el: HTMLInputElement | HTMLTextAreaElement, position: number): { top: number; left: number; height: number } {\n const style = getComputedStyle(el);\n const mirror = document.createElement(\"div\");\n const isInput = el.nodeName === \"INPUT\";\n for (const prop of MIRROR_PROPS) mirror.style[prop] = style[prop];\n Object.assign(mirror.style, {\n position: \"absolute\",\n visibility: \"hidden\",\n top: \"0\",\n left: \"-9999px\",\n whiteSpace: isInput ? \"pre\" : \"pre-wrap\",\n overflowWrap: \"break-word\",\n overflow: \"hidden\",\n });\n mirror.textContent = el.value.slice(0, position);\n const marker = document.createElement(\"span\");\n marker.textContent = el.value.slice(position) || \".\";\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n const rect = el.getBoundingClientRect();\n const lineHeight = Number.parseFloat(style.lineHeight) || Number.parseFloat(style.fontSize) * 1.25;\n const top = rect.top + marker.offsetTop + Number.parseFloat(style.borderTopWidth) - el.scrollTop;\n const left = rect.left + marker.offsetLeft + Number.parseFloat(style.borderLeftWidth) - el.scrollLeft;\n mirror.remove();\n return { top, left: Math.min(left, rect.right), height: lineHeight };\n}\n","import { foldForSearch } from \"../../autocomplete/utils\";\nimport type { MentionOption } from \"./types\";\n\nexport interface MentionMatch {\n prefix: string;\n /** Tetik karakterinin metindeki konumu. */\n start: number;\n /** Tetik ile imleç arası. */\n query: string;\n}\n\nconst isSpace = (ch: string | undefined) => ch !== undefined && /\\s/.test(ch);\n\n/**\n * İmleçten geriye: en yakın tetik karakteri, öncesi satır başı/boşluk ve\n * tetik ile imleç arasında boşluk yoksa eşleşme. (`e-posta@alan` gibi kelime\n * içi `@` tetiklemez.)\n */\nexport function findMention(text: string, caret: number, prefixes: readonly string[]): MentionMatch | null {\n const before = text.slice(0, caret);\n let best: MentionMatch | null = null;\n for (const prefix of prefixes) {\n const start = before.lastIndexOf(prefix);\n if (start === -1) continue;\n if (start > 0 && !isSpace(before[start - 1])) continue;\n const query = before.slice(start + prefix.length);\n if (/\\s/.test(query)) continue;\n if (!best || start > best.start) best = { prefix, start, query };\n }\n return best;\n}\n\n/** `@sor` → `@ayse.demir ` ; imleç ayraçtan sonra. Ayraç zaten varsa ikincisi eklenmez. */\nexport function insertMention(text: string, match: MentionMatch, caret: number, value: string, split: string): { text: string; caret: number } {\n const head = text.slice(0, match.start) + match.prefix + value;\n const tail = text.slice(caret);\n const sep = split && !tail.startsWith(split) ? split : \"\";\n return { text: head + sep + tail, caret: head.length + (split ? split.length : 0) };\n}\n\nexport function mentionText(option: MentionOption): string {\n if (option.searchText !== undefined) return option.searchText;\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return `${option.value} ${label}`;\n}\n\nexport function filterMentionOptions(\n options: readonly MentionOption[],\n query: string,\n filterOption?: false | ((query: string, option: MentionOption) => boolean)\n): MentionOption[] {\n if (filterOption === false) return [...options];\n if (filterOption) return options.filter((o) => filterOption(query, o));\n const q = foldForSearch(query);\n return q ? options.filter((o) => foldForSearch(mentionText(o)).includes(q)) : [...options];\n}\n","\"use client\";\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef } from \"react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { ClearButton, clearIconOf } from \"./_components/FieldAdornments\";\nimport type { InputClassNames, InputShape, InputVariant, InputCountConfig, TextareaAutoSize } from \"./types\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { skeletonBoxProps, type SkeletonableProps } from \"../lib/skeleton\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport {\n FIELD_BASE_CLASS,\n FIELD_DISABLED_CLASS,\n FIELD_MOBILE_TEXT_CLASS,\n getShapeClasses,\n getTextareaSizeClasses,\n getVariantClasses,\n clearNativeValue,\n isClearable,\n} from \"./utils\";\nimport type { MentionsConfig } from \"./mention/types\";\nimport { useMention } from \"./mention/useMention\";\n\nexport interface TextareaProps extends SkeletonableProps {\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onClear?: () => void;\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n allowClear?: boolean | { clearIcon?: React.ReactNode };\n /** Temizle butonunun erişilebilir adı. Varsayılan: `\"Temizle\"`. */\n clearLabel?: string;\n readOnly?: boolean;\n disabled?: boolean;\n name?: string;\n required?: boolean;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n /** İpucu/hata metnine bağlantı (Field içindeyse otomatik). */\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean | \"true\" | \"false\";\n size?: Size;\n shape?: InputShape;\n variant?: InputVariant;\n color?: ColorRole;\n maxLength?: number;\n showCount?: boolean;\n count?: InputCountConfig;\n id?: string;\n classNames?: InputClassNames;\n className?: string;\n /**\n * `true`: içerik kadar uzar. `{ minRows, maxRows }`: en az/en çok bu kadar\n * satır; `maxRows` aşılınca kaydırma çubuğu çıkar. `autoSize` verilince\n * elle yeniden boyutlandırma kapalıdır.\n */\n autoSize?: TextareaAutoSize;\n /** Başlangıç yüksekliği (satır). `autoSize` yoksa elle dikey büyütülebilir. Varsayılan: 3. */\n rows?: number;\n /** `@` ile bahsetme — Input'taki `mentions` ile aynı. */\n mentions?: MentionsConfig;\n}\n\n/*\n * `autoSize` yüksekliği: içerik yüksekliğini satır yüksekliği × min/max'a\n * kıstırır. Eskiden `{ minRows, maxRows }` tipte vardı ama HİÇ uygulanmıyordu —\n * alan sınırsız uzuyordu.\n */\nfunction fitHeight(el: HTMLTextAreaElement, autoSize: TextareaAutoSize) {\n const style = window.getComputedStyle(el);\n const lineHeight = Number.parseFloat(style.lineHeight) || 20;\n const padding = Number.parseFloat(style.paddingTop) + Number.parseFloat(style.paddingBottom);\n const { minRows, maxRows } = typeof autoSize === \"object\" ? autoSize : {};\n el.style.height = \"auto\";\n let height = el.scrollHeight;\n if (minRows) height = Math.max(height, minRows * lineHeight + padding);\n if (maxRows) height = Math.min(height, maxRows * lineHeight + padding);\n el.style.height = `${height}px`;\n el.style.overflowY = maxRows && el.scrollHeight > height ? \"auto\" : \"hidden\";\n}\n\n/*\n * Eskiden `TextareaProps = Omit<InputProps, ...>` ile `Input`tan türetiliyordu\n * ama `onBlur`/`onFocus` Omit listesinde YOKTU — `InputProps.onBlur`'un tipi\n * `FormEvent<HTMLInputElement>` idi ve `{...rest}` ile `<textarea>`'ya\n * yayıldığında (`FocusEventHandler<HTMLTextAreaElement>` beklenen yerde)\n * gerçek bir TS hatasıydı. Artık Textarea kendi tam\n * tip setini tanımlıyor, `Input`tan miras almıyor.\n */\n/**\n * Çok satırlı metin alanı. `autoSize` ile içeriğe göre uzar (`{ minRows, maxRows }`\n * sınırlarıyla); Input ile aynı görünüm ve renk eksenleri.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>((outerProps, ref) => {\n // Field içindeyse id / aria-describedby / hata / required / disabled oradan tamamlanır.\n return <TextareaInner {...useFieldControl(outerProps)} forwardedRef={ref} />;\n});\n\nTextarea.displayName = \"Textarea\";\n\nconst TextareaInner = (\n {\n forwardedRef: ref,\n placeholder,\n allowClear = false,\n clearLabel = \"Temizle\",\n skeleton = false,\n rows = 3,\n readOnly,\n onKeyDown,\n classNames = {},\n className = \"\",\n count,\n defaultValue = \"\",\n disabled = false,\n id,\n maxLength,\n showCount,\n color,\n size = \"md\",\n shape = \"default\",\n variant = \"outline\",\n value,\n onChange,\n onClear,\n onFocus,\n onBlur,\n autoSize = false,\n name,\n required,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalidProp,\n mentions,\n }: TextareaProps & { forwardedRef: React.ForwardedRef<HTMLTextAreaElement> }\n ) => {\n // `color` varsayılansız: verilmezse dinlenmede nötr, odakta primary (bkz. `getVariantClasses`).\n const ariaInvalid = ariaInvalidProp ?? (color === \"error\" || undefined);\n const innerRef = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(ref, () => innerRef.current as HTMLTextAreaElement);\n\n const [currentValue, setCurrentValue] = useControllableState<string>({ value, defaultValue });\n const charCount = currentValue.length;\n // Ayrık değişken — iç içe template literal yerine (Faz 8, SonarJS `no-nested-template-literals`).\n const countLabel = maxLength ? `${charCount} / ${maxLength}` : `${charCount}`;\n const showClear = isClearable(allowClear) && Boolean(currentValue) && !disabled;\n\n const mention = useMention(mentions, innerRef, currentValue, \"textarea\");\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCurrentValue(e.target.value);\n onChange?.(e);\n };\n\n const handleClear = () => {\n // onChange'i gerçek olayla tetikler (handleChange → iç state + tüketici).\n clearNativeValue(innerRef.current);\n onClear?.();\n innerRef.current?.focus();\n };\n\n const initialRows = typeof autoSize === \"object\" && autoSize.minRows ? autoSize.minRows : rows;\n const autoSizeKey = typeof autoSize === \"object\" ? `${autoSize.minRows}-${autoSize.maxRows}` : String(autoSize);\n useEffect(() => {\n if (autoSize && innerRef.current) fitHeight(innerRef.current, autoSize);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- autoSizeKey, obje kimliği yerine değerleri izler\n }, [currentValue, autoSizeKey]);\n\n const geometryClass = cn(\"flex w-full items-start gap-2\", getTextareaSizeClasses(size), getShapeClasses(shape, variant));\n const textareaClass = cn(\n \"w-full bg-transparent placeholder:text-mari-muted focus:outline-none disabled:cursor-not-allowed\",\n autoSize ? \"resize-none\" : \"resize-y\",\n FIELD_MOBILE_TEXT_CLASS,\n classNames.input\n );\n\n if (skeleton) {\n // Şeffaf, erişilemez bir <textarea> kutuya GERÇEK yüksekliğini verir\n // (satır sayısı × satır yüksekliği + dolgu) — tahmin yok, zıplama yok.\n return (\n <div {...skeletonBoxProps(cn(geometryClass, classNames.wrapper, className))}>\n <textarea tabIndex={-1} rows={initialRows} className={cn(textareaClass, \"invisible resize-none\")} />\n </div>\n );\n }\n\n const wrapperClass = cn(\n geometryClass,\n FIELD_BASE_CLASS,\n getVariantClasses(variant, color),\n disabled && FIELD_DISABLED_CLASS,\n classNames.wrapper,\n className\n );\n\n return (\n // `w-full`: Input gibi kapsayıcısını doldurur — `items-start`lı bir flex sütununda (Field) büzülüyordu.\n <div className=\"flex w-full flex-col gap-2\">\n <div className={wrapperClass}>\n <textarea\n id={id}\n ref={innerRef}\n value={currentValue}\n onChange={handleChange}\n {...mention.controlProps}\n onFocus={onFocus}\n onBlur={(e) => {\n mention.close();\n onBlur?.(e);\n }}\n onKeyDown={(e) => {\n mention.handleKeyDown(e);\n onKeyDown?.(e);\n }}\n readOnly={readOnly}\n rows={initialRows}\n placeholder={placeholder}\n maxLength={maxLength}\n disabled={disabled}\n name={name}\n required={required}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n className={textareaClass}\n />\n {allowClear && <ClearButton visible={showClear} label={clearLabel} icon={clearIconOf(allowClear)} onClear={handleClear} className={classNames.clear} />}\n </div>\n {(showCount || count?.formatter) && (\n <span className={cn(\"flex flex-none items-center justify-end text-xs tabular-nums\", maxLength && charCount >= maxLength ? \"text-mari-error\" : \"text-mari-muted\", classNames.count)}>\n {count?.formatter ? count.formatter({ value: currentValue, count: charCount, maxLength }) : countLabel}\n </span>\n )}\n {mention.panel}\n </div>\n );\n };\n","\"use client\";\n\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { FieldContext, useFieldControl, useFieldGroup, useFieldSkeleton } from \"../lib/fieldContext\";\nimport type { SkeletonableProps } from \"../lib/skeleton\";\nimport { Input } from \"./Input\";\nimport { OtpSingleField } from \"./_components/OtpSingleField\";\nimport type { InputShape, InputVariant } from \"./types\";\n\nexport interface OtpInputProps extends SkeletonableProps {\n length?: number;\n value?: string;\n defaultValue?: string;\n disabled?: boolean;\n size?: Size;\n shape?: InputShape;\n variant?: InputVariant;\n color?: ColorRole;\n onChange?: (value: string) => void;\n onInput?: (value: string[]) => void;\n mask?: boolean;\n formatter?: (val: string) => string;\n separator?: React.ReactNode | ((i: number) => React.ReactNode);\n className?: string;\n /** Grubun erişilebilir adı. Varsayılan: `\"Doğrulama kodu\"`. */\n \"aria-label\"?: string;\n /**\n * Mobil klavye. Varsayılan `\"numeric\"` (SMS/e-posta kodları rakamdır);\n * harf içeren kodlar için `\"text\"`.\n */\n inputMode?: \"numeric\" | \"text\";\n /**\n * `separated` (varsayılan): her hane ayrı bir kutucuk. `single`: tek bir\n * alan içinde hane yuvaları — arkada tek bir gerçek `<input>` (yapıştırma,\n * SMS otomatik doldurma, ekran okuyucu için en sade yapı).\n */\n layout?: \"separated\" | \"single\";\n /**\n * Yalnızca `layout=\"single\"`: yuva çizgisinin yeri. `center` (varsayılan):\n * boş yuvada dikeyde ortalı çizgi, hane girilince kaybolur. `bottom`:\n * hanenin altında, dolu yuvada da kalan alt çizgi.\n */\n linePosition?: \"center\" | \"bottom\";\n}\n\nconst WIDTH_CLASS: Record<Size, string> = { sm: \"w-6 p-0\", md: \"w-8 p-0\", lg: \"w-10 p-0\" };\n\n/** İç içe ternary yerine ayrık fonksiyon. */\nfunction resolveDisplayValue(rawValue: string, formatter: ((val: string) => string) | undefined, mask: boolean): string {\n if (formatter) return formatter(rawValue);\n if (mask && rawValue) return \"•\";\n return rawValue;\n}\n\nexport function OtpInput({\n length = 6,\n value,\n defaultValue = \"\",\n disabled = false,\n size = \"md\",\n shape = \"default\",\n variant = \"outline\",\n color,\n onChange,\n onInput,\n mask = false,\n formatter,\n separator,\n className,\n \"aria-label\": ariaLabelProp,\n inputMode = \"numeric\",\n skeleton: ownSkeleton,\n layout = \"separated\",\n linePosition = \"center\",\n}: Readonly<OtpInputProps>) {\n // Field içinde: kutucuklu düzen bir GRUP (etiket grubun adı), tek kutu düzeni tek bir ALAN (label htmlFor).\n // Varsayılan \"Doğrulama kodu\" adı yalnız hiç ad yoksa — Field'ın etiketini ezmesin.\n const inField = useContext(FieldContext) !== null;\n const group = useFieldGroup({ \"aria-label\": ariaLabelProp, disabled }, layout === \"separated\");\n const skeleton = useFieldSkeleton(ownSkeleton);\n const control = useFieldControl({ disabled, color });\n const ariaLabel = ariaLabelProp ?? (inField ? undefined : \"Doğrulama kodu\");\n const [otpValues, setOtpValues] = useState<string[]>(Array.from({ length }, (_, i) => value?.[i] ?? defaultValue[i] ?? \"\"));\n const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n\n const focusInput = (index: number) => {\n const input = inputsRef.current[index];\n if (input) {\n input.focus();\n input.select();\n }\n };\n\n /**\n * Hücrelerde artık `maxLength=1` YOK — o, 6 haneli bir kodun\n * yapıştırılmasını VE iOS/Android'in SMS kodunu otomatik doldurmasını\n * (`autocomplete=\"one-time-code\"`, kodun tamamını ilk hücreye yazar) tek\n * haneye kırpıyordu. Uzun giriş buradan hücrelere dağıtılır; dolu bir\n * hücrede imleç sondayken yazılan tek karakter ise eskisinin YERİNE geçer.\n */\n const handleInput = (i: number, rawValue: string) => {\n const shown = resolveDisplayValue(otpValues[i] ?? \"\", formatter, mask);\n let text = rawValue.replace(/\\s/g, \"\");\n if (shown && text.length === shown.length + 1) text = text.startsWith(shown) ? text.slice(shown.length) : text.slice(0, 1);\n const chars = text.split(\"\");\n const updated = [...otpValues];\n for (let j = 0; j < chars.length; j++) {\n if (i + j < length) updated[i + j] = chars[j] ?? \"\";\n }\n setOtpValues(updated);\n onInput?.(updated);\n if (!updated.includes(\"\")) onChange?.(updated.join(\"\"));\n focusInput(Math.min(i + chars.length, length - 1));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, i: number) => {\n const input = e.currentTarget;\n const cursorAtStart = input.selectionStart === 0;\n const cursorAtEnd = input.selectionStart === input.value.length;\n\n if (e.key === \"Backspace\") {\n e.preventDefault();\n const updated = [...otpValues];\n if (otpValues[i]) {\n updated[i] = \"\";\n setOtpValues(updated);\n onInput?.(updated);\n focusInput(i);\n } else if (i > 0) {\n updated[i - 1] = \"\";\n setOtpValues(updated);\n onInput?.(updated);\n focusInput(i - 1);\n }\n }\n if (e.key === \"ArrowLeft\" && cursorAtStart && i > 0) {\n e.preventDefault();\n focusInput(i - 1);\n }\n if (e.key === \"ArrowRight\" && cursorAtEnd && i < length - 1) {\n e.preventDefault();\n focusInput(i + 1);\n }\n };\n\n useEffect(() => {\n if (value !== undefined) {\n const split = value.split(\"\").slice(0, length);\n setOtpValues((prev) => Array.from({ length }, (_, i) => split[i] ?? prev[i] ?? \"\"));\n }\n }, [value, length]);\n\n // Faz 13 gözden geçirmesi: `ghost` Input'ta (\"kenarlıksız, arka planı\n // saydam\") bir metin alanının içinde/etrafında bağlam olduğu için anlamlı\n // — ama OTP'de her kutucuk TEK BAŞINA bir hücre, çevresinde hiçbir görsel\n // referans yok. `ghost` seçilince kutucuklar TAMAMEN görünmez oluyordu,\n // kullanıcı nereye yazacağını göremiyordu. OTP için `ghost`, `underlined`e\n // (en azından bir alt çizgi kalır) düşürülür.\n const resolvedVariant = variant === \"ghost\" ? \"underlined\" : variant;\n\n if (layout === \"single\") {\n return (\n <OtpSingleField\n length={length}\n value={value}\n defaultValue={defaultValue}\n disabled={!!control.disabled}\n size={size}\n shape={shape}\n variant={resolvedVariant}\n color={control.color}\n id={control.id}\n describedBy={control[\"aria-describedby\"]}\n required={control.required}\n onChange={onChange}\n onInput={onInput}\n display={(raw) => resolveDisplayValue(raw, formatter, mask)}\n separator={separator}\n className={className}\n ariaLabel={ariaLabel}\n inputMode={inputMode}\n skeleton={skeleton}\n linePosition={linePosition}\n />\n );\n }\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>, i: number) => {\n e.preventDefault();\n handleInput(i, e.clipboardData.getData(\"text\"));\n };\n\n if (skeleton) {\n return (\n <div aria-hidden className=\"flex items-center gap-2\">\n {Array.from({ length }, (_, i) => (\n <Input key={i} skeleton size={size} shape={shape} className={cn(WIDTH_CLASS[size], className)} />\n ))}\n </div>\n );\n }\n\n return (\n <div\n role=\"group\"\n aria-label={group[\"aria-labelledby\"] ? undefined : (ariaLabel ?? \"Doğrulama kodu\")}\n aria-labelledby={group[\"aria-labelledby\"]}\n aria-describedby={group[\"aria-describedby\"]}\n className=\"flex items-center gap-2\"\n >\n {/* Hücreler Field'ın bağlantılarını ALMAZ — hepsi aynı id'yi alırdı; bağlantılar gruptadır. */}\n <FieldContext.Provider value={null}>\n {Array.from({ length }).map((_, i) => {\n const rawValue = otpValues[i] ?? \"\";\n const displayValue = resolveDisplayValue(rawValue, formatter, mask);\n\n return (\n <React.Fragment key={`otp-${i}`}>\n <Input\n ref={(el) => {\n inputsRef.current[i] = el;\n }}\n value={displayValue}\n onInput={(e) => handleInput(i, (e.target as HTMLInputElement).value)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onPaste={(e) => handlePaste(e, i)}\n onFocus={(e) => e.currentTarget.select()}\n aria-label={`Hane ${i + 1} / ${length}`}\n inputMode={inputMode}\n // SMS kodunu klavye önerisi olarak sunar — sadece ilk hücrede.\n autoComplete={i === 0 ? \"one-time-code\" : \"off\"}\n disabled={!!group.disabled}\n size={size}\n shape={shape}\n variant={resolvedVariant}\n color={group[\"aria-invalid\"] ? (color ?? \"error\") : color}\n className={cn(WIDTH_CLASS[size], className)}\n classNames={{ input: \"w-full text-center font-medium\" }}\n />\n {separator && i < length - 1 && (\n <span aria-hidden className=\"text-mari-muted\">\n {typeof separator === \"function\" ? separator(i) : separator}\n </span>\n )}\n </React.Fragment>\n );\n })}\n </FieldContext.Provider>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { cn, useControllableState, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../../lib/skeleton\";\nimport { touchTargetClass } from \"../../lib/sizeClasses\";\nimport type { InputShape, InputVariant } from \"../types\";\nimport { FIELD_BASE_CLASS, FIELD_DISABLED_CLASS, getShapeClasses, getVariantClasses } from \"../utils\";\n\nexport interface OtpSingleFieldProps {\n length: number;\n value?: string;\n defaultValue: string;\n disabled: boolean;\n size: Size;\n shape: InputShape;\n variant: InputVariant;\n color?: ColorRole;\n onChange?: (value: string) => void;\n onInput?: (value: string[]) => void;\n display: (raw: string) => string;\n separator?: React.ReactNode | ((i: number) => React.ReactNode);\n className?: string;\n /** Field içinde `undefined` — ad `<label htmlFor>`dan gelir. */\n ariaLabel?: string;\n /** Field bağlantıları. */\n id?: string;\n describedBy?: string;\n required?: boolean;\n inputMode: \"numeric\" | \"text\";\n skeleton: boolean;\n linePosition: \"center\" | \"bottom\";\n}\n\n/** Kutu yüksekliği + yatay dolgu; yuva genişliği ve rakam boyutu. */\nconst BOX_CLASS: Record<Size, string> = { sm: \"h-8 px-2.5 gap-1\", md: \"h-10 px-3 gap-1.5\", lg: \"h-12 px-4 gap-2\" };\nconst SLOT_CLASS: Record<Size, string> = { sm: \"w-4 text-sm\", md: \"w-5 text-base\", lg: \"w-6 text-xl\" };\n\n/**\n * Tek kutu görünümlü OTP (`layout=\"single\"`). Kutucuklar yerine TEK bir alan\n * içinde eşit aralıklı hane yuvaları çizilir; arkada ise TEK bir gerçek\n * `<input>` vardır (metni ve imleci şeffaf, kutuyu tamamen kaplar). Bu yapı:\n * yapıştırma ve SMS otomatik doldurma kendiliğinden çalışır (kodun tamamı tek\n * alana gelir), ekran okuyucu tek bir adlandırılmış alan görür (6 ayrı\n * \"hane\" değil), mobil klavye bir kez açılır. Yuvalar yalnızca görseldir\n * (`aria-hidden`).\n */\nexport function OtpSingleField({\n length,\n value,\n defaultValue,\n disabled,\n size,\n shape,\n variant,\n color,\n onChange,\n onInput,\n display,\n separator,\n className,\n ariaLabel,\n id,\n describedBy,\n required,\n inputMode,\n skeleton,\n linePosition,\n}: Readonly<OtpSingleFieldProps>) {\n const [code, setCode] = useControllableState<string>({ value, defaultValue: defaultValue.slice(0, length) });\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const boxClass = cn(\"relative inline-flex w-fit max-w-full items-center\", BOX_CLASS[size], getShapeClasses(shape, variant));\n\n if (skeleton) {\n return (\n <div {...skeletonBoxProps(cn(boxClass, className))}>\n {Array.from({ length }, (_, i) => (\n <span key={i} className={SLOT_CLASS[size]} />\n ))}\n </div>\n );\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n let next = e.target.value.replace(/\\s/g, \"\");\n if (inputMode === \"numeric\") next = next.replace(/\\D/g, \"\");\n next = next.slice(0, length);\n setCode(next);\n onInput?.(Array.from({ length }, (_, i) => next[i] ?? \"\"));\n if (next.length === length) onChange?.(next);\n };\n\n // İmleç hep sonda: yuvalar ortada bir konuma tıklamayı göstermediği için\n // seçim/imleç taşınırsa kullanıcı nereye yazdığını göremezdi.\n const keepCaretAtEnd = (e: React.SyntheticEvent<HTMLInputElement>) => {\n const el = e.currentTarget;\n const end = el.value.length;\n if (el.selectionStart !== end || el.selectionEnd !== end) el.setSelectionRange(end, end);\n };\n\n const activeIndex = Math.min(code.length, length - 1);\n\n return (\n <div\n className={cn(\n boxClass,\n FIELD_BASE_CLASS,\n getVariantClasses(variant, color),\n touchTargetClass[size],\n disabled && FIELD_DISABLED_CLASS,\n className\n )}\n >\n {Array.from({ length }, (_, i) => {\n const char = code[i];\n const isActive = focused && i === activeIndex;\n // `center`: yalnızca BOŞ yuvada ortada çizgi (dolu hanenin üstünü çizmesin).\n // `bottom`: hanenin altında, dolu olsa da kalan alt çizgi.\n // Aktif boş yuvada `center` çizgisi imleçle kesişip \"+\" çiziyordu — orada imleç yeterli.\n const showLine = linePosition === \"bottom\" || (!char && !isActive);\n return (\n <React.Fragment key={i}>\n <span\n aria-hidden\n className={cn(\n \"relative flex h-full items-center justify-center font-medium tabular-nums text-mari-foreground\",\n SLOT_CLASS[size],\n showLine && \"after:absolute after:inset-x-0.5 after:h-px after:bg-mari-input\",\n showLine && (linePosition === \"bottom\" ? \"after:bottom-[18%]\" : \"after:top-1/2 after:-translate-y-1/2\"),\n showLine && isActive && \"after:bg-mari-primary\"\n )}\n >\n {char ? display(char) : null}\n {isActive && code.length < length && (\n // `key`: her yazışta animasyon baştan başlar — yazarken imleç\n // hep görünür, durunca yanıp söner (gerçek imleç davranışı).\n <span\n key={code.length}\n className=\"absolute h-[45%] w-px bg-mari-foreground animate-[mari-caret-blink_1.06s_step-end_infinite] motion-reduce:animate-none\"\n />\n )}\n </span>\n {separator && i < length - 1 && (\n <span aria-hidden className=\"px-0.5 text-mari-muted\">\n {typeof separator === \"function\" ? separator(i) : separator}\n </span>\n )}\n </React.Fragment>\n );\n })}\n <input\n ref={inputRef}\n value={code}\n onChange={handleChange}\n onFocus={(e) => {\n setFocused(true);\n keepCaretAtEnd(e);\n }}\n onBlur={() => setFocused(false)}\n onSelect={keepCaretAtEnd}\n // `maxLength` YOK: tarayıcı yapıştırılan \"482 913\" gibi biçimli bir kodu\n // temizlemeden ÖNCE kırpıp \"482 91\" bırakırdı. Uzunluk `handleChange`de.\n disabled={disabled}\n id={id}\n required={required}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={color === \"error\" || undefined}\n inputMode={inputMode}\n autoComplete=\"one-time-code\"\n spellCheck={false}\n // Metin ve imleç şeffaf — görünen haneler yuvalardır. `text-base`:\n // iOS 16px altındaki alanda odakta sayfayı yakınlaştırır.\n className=\"absolute inset-0 h-full w-full cursor-text bg-transparent text-base text-transparent caret-transparent outline-none selection:bg-transparent disabled:cursor-not-allowed\"\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { forwardRef, useImperativeHandle, useRef } from \"react\";\nimport { Loader2Icon, SearchIcon } from \"lucide-react\";\nimport { Input } from \"./Input\";\nimport type { InputProps } from \"./types\";\n\nexport type SearchInputProps = InputProps & {\n /** Enter'a basılınca VE ara butonuna tıklanınca, alanın o anki değeriyle çağrılır. */\n onSearch?: (value: string) => void;\n /** Arama sürüyor — ara ikonu yerine dönen gösterge. Alan yazılabilir kalır. */\n loading?: boolean;\n /** Ara butonunun erişilebilir adı. Varsayılan: `\"Ara\"`. */\n searchLabel?: string;\n};\n\n/*\n * `onSearch` eskiden YALNIZCA butona tıklanınca çağrılıyordu — Enter\n * sadece `onPressEnter`'ı tetikliyordu, klavyeyle arama yapan kullanıcı sonuç\n * alamıyordu. Butonun erişilebilir adı yoktu. Mobil klavyede Enter tuşu artık\n * \"Ara\" etiketli (`enterKeyHint=\"search\"`).\n */\n/** Arama alanı: Enter ya da arama düğmesi `onSearch`ı çağırır; mobil klavyede Enter tuşu \"Ara\" olarak görünür. */\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\n ({ icon, iconPosition = \"end\", onSearch, onPressEnter, loading = false, searchLabel = \"Ara\", ...rest }, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current!, []);\n\n const search = () => onSearch?.(inputRef.current?.value ?? \"\");\n\n const handlePressEnter = (e: React.KeyboardEvent<HTMLInputElement>) => {\n search();\n onPressEnter?.(e);\n };\n\n const searchButton = (\n <button\n type=\"button\"\n aria-label={searchLabel}\n onClick={search}\n disabled={rest.disabled}\n className=\"flex size-6 cursor-pointer select-none items-center justify-center rounded-sm hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-mari-ring\"\n >\n {loading ? <Loader2Icon size={16} className=\"animate-spin\" aria-hidden /> : <SearchIcon size={16} aria-hidden />}\n </button>\n );\n\n return (\n <Input\n ref={inputRef}\n icon={icon ?? searchButton}\n iconPosition={iconPosition}\n onPressEnter={handlePressEnter}\n enterKeyHint=\"search\"\n aria-busy={loading || undefined}\n {...rest}\n />\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n"],"mappings":"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","names":["useState","jsx","useState","forwardRef","useEffect","useRef","cn","useControllableState","jsx","jsxs","forwardRef","useRef","useControllableState","useEffect","cn","React","useEffect","useRef","useState","cn","React","useRef","useState","cn","useControllableState","jsx","jsxs","useControllableState","useState","useRef","cn","React","jsx","jsxs","useState","useRef","useEffect","cn","React","forwardRef","useImperativeHandle","useRef","jsx","forwardRef","useRef","useImperativeHandle"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
elevationClass
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MT4VH7QV.js";
|
|
6
6
|
|
|
7
7
|
// src/autocomplete/utils.ts
|
|
8
8
|
function foldForSearch(text) {
|
|
@@ -186,4 +186,4 @@ export {
|
|
|
186
186
|
optionDomId,
|
|
187
187
|
SelectPanel
|
|
188
188
|
};
|
|
189
|
-
//# sourceMappingURL=chunk-
|
|
189
|
+
//# sourceMappingURL=chunk-LNL4TCGL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/autocomplete/utils.ts","../src/select/_components/SelectPanel.tsx","../src/select/utils.ts"],"sourcesContent":["import type { Option } from \"./types\";\n\n/*\n * Arama için katlama: Türkçe küçük harf + aksanları at + ı→i. Böylece\n * \"istanbul\" → \"İstanbul\", \"sehir\" → \"Şehir\", \"IĞDIR\" → \"Iğdır\" bulunur.\n * Eskiden düz `toLowerCase()` vardı: \"İstanbul\".toLowerCase() JS'te\n * \"i̇stanbul\" (i + birleşik nokta) verir ve \"istanbul\" ile HİÇ eşleşmezdi.\n * Karakter sayısını korur (NFC girişte her harf tek karaktere iner) — vurgu\n * aralıkları özgün metne aynı indekslerle uygulanabilir.\n */\nexport function foldForSearch(text: string): string {\n return text.toLocaleLowerCase(\"tr\").normalize(\"NFD\").replace(/\\p{M}/gu, \"\").replace(/ı/g, \"i\");\n}\n\nexport function getFilteredOption(options: Option[], searchText: string): Option[] {\n const query = foldForSearch(searchText.trim());\n if (!query) return options;\n return options.filter((option) => foldForSearch(option.value).includes(query));\n}\n\n/** Seçenek metnini [önce, eşleşen, sonra] olarak böler; eşleşme yoksa `null`. */\nexport function splitMatch(value: string, searchText: string): [string, string, string] | null {\n const query = foldForSearch(searchText.trim());\n const folded = foldForSearch(value);\n if (!query || folded.length !== value.length) return null;\n const start = folded.indexOf(query);\n if (start < 0) return null;\n const end = start + query.length;\n return [value.slice(0, start), value.slice(start, end), value.slice(end)];\n}\n","\"use client\";\n\nimport React, { forwardRef, useId } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CheckIcon, Loader2Icon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { elevationClass } from \"../../lib/elevationClass\";\nimport type { FloatingCoords } from \"../../lib/useFloatingPosition\";\nimport type { SelectOption, SelectProps } from \"../types\";\nimport { type SelectSection, valueKey } from \"../utils\";\n\ninterface SelectPanelProps {\n listboxId: string;\n coords: FloatingCoords | null;\n sections: SelectSection[];\n /** `sections`taki seçeneklerin düz sırası — aktif indeks buna göre. */\n flatOptions: SelectOption[];\n activeIndex: number;\n isSelected: (option: SelectOption) => boolean;\n multiple: boolean;\n loading: boolean;\n notFoundContent: React.ReactNode;\n listHeight: string;\n optionRender?: Exclude<SelectProps[\"optionRender\"], undefined>;\n labelledBy?: string;\n label?: string;\n onPick: (option: SelectOption) => void;\n onHover: (index: number) => void;\n}\n\nexport const optionDomId = (listboxId: string, option: SelectOption) => `${listboxId}-${valueKey(option.value).replace(/[^\\w-]/g, \"_\")}`;\n\nfunction OptionContent({ option, selected, multiple }: Readonly<{ option: SelectOption; selected: boolean; multiple: boolean }>) {\n return (\n <>\n {option.icon && <span className=\"flex shrink-0 items-center text-mari-muted [&>svg]:size-4\">{option.icon}</span>}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label ?? option.value}</span>\n {option.description && <span className=\"block truncate text-xs text-mari-muted\">{option.description}</span>}\n </span>\n {/* Tekli seçimde seçili satır zeminle belli; çokluda onay işareti durumu taşır. */}\n {multiple && <CheckIcon size={16} aria-hidden className={cn(\"shrink-0 text-mari-primary\", !selected && \"invisible\")} />}\n </>\n );\n}\n\n/**\n * Select'in listesi. `document.body`'ye portal edilir, konum\n * `useFloatingPosition`dan (Dropdown ile ortak); genişlik tetikleyicininki. Odak listede DEĞİL tetikleyicide\n * kalır; aktif seçenek `aria-activedescendant` ile bildirilir (APG combobox).\n * Seçenekler `onMouseDown` ile `preventDefault` — tıklamak tetikleyicinin\n * odağını (dolayısıyla açık listeyi) kaybettirmesin.\n */\nexport const SelectPanel = forwardRef<HTMLDivElement, SelectPanelProps>(function SelectPanel(\n { listboxId, coords, sections, flatOptions, activeIndex, isSelected, multiple, loading, notFoundContent, listHeight, optionRender, labelledBy, label, onPick, onHover },\n ref\n) {\n const groupIdBase = useId();\n if (typeof document === \"undefined\") return null;\n const empty = flatOptions.length === 0;\n\n const renderOption = (option: SelectOption) => {\n const index = flatOptions.indexOf(option);\n const selected = isSelected(option);\n const active = index === activeIndex;\n return (\n // Klavye tetikleyicide (combobox) işlenir; seçenek odak almaz, `aria-activedescendant` ile gösterilir (APG).\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n <div\n key={valueKey(option.value)}\n id={optionDomId(listboxId, option)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={selected}\n aria-disabled={option.disabled || undefined}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => !active && !option.disabled && onHover(index)}\n onClick={() => !option.disabled && onPick(option)}\n className={cn(\n \"flex min-h-8 cursor-pointer items-center gap-2 rounded-md px-2.5 py-1.5 text-mari-foreground pointer-coarse:min-h-11\",\n active && \"bg-mari-surface-alt\",\n selected && !multiple && \"bg-mari-primary-subtle font-medium\",\n option.disabled && \"cursor-not-allowed opacity-50\"\n )}\n >\n {optionRender ? optionRender(option, { selected, active }) : <OptionContent option={option} selected={selected} multiple={multiple} />}\n </div>\n );\n };\n\n return createPortal(\n <div\n ref={ref}\n className={cn(\"fixed z-mari-dropdown max-w-[calc(100vw-1rem)] rounded-lg bg-mari-surface p-1 text-sm\", elevationClass.md, !coords && \"invisible\")}\n style={{ top: coords?.top ?? 0, left: coords?.left ?? 0, width: coords?.anchorWidth }}\n >\n <div\n id={listboxId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : label}\n aria-busy={loading || undefined}\n className=\"overflow-y-auto overscroll-contain\"\n style={{ maxHeight: listHeight }}\n >\n {sections.map((section) =>\n section.label === undefined ? (\n <React.Fragment key={section.key}>{section.options.map(renderOption)}</React.Fragment>\n ) : (\n <div key={section.key} role=\"group\" aria-labelledby={`${groupIdBase}-${section.key}`}>\n <div id={`${groupIdBase}-${section.key}`} role=\"presentation\" className=\"px-2.5 pb-1 pt-2 text-xs font-medium text-mari-muted\">\n {section.label}\n </div>\n {section.options.map(renderOption)}\n </div>\n )\n )}\n </div>\n {loading && (\n <div role=\"status\" className=\"flex items-center gap-2 px-2.5 py-2 text-mari-muted\">\n <Loader2Icon size={16} aria-hidden className=\"animate-spin motion-reduce:animate-[spin_2s_linear_infinite]\" />\n Yükleniyor\n </div>\n )}\n {!loading && empty && (\n <div role=\"status\" className=\"px-2.5 py-2 text-mari-muted\">\n {notFoundContent}\n </div>\n )}\n </div>,\n document.body\n );\n});\n","import type React from \"react\";\nimport { foldForSearch } from \"../autocomplete/utils\";\nimport type { SelectOption, SelectOptionGroup, SelectValue } from \"./types\";\n\n/**\n * Listede sırayla çizilen bölüm: başlıklı grup (`role=\"group\"`) ya da\n * başlıksız ardışık seçenekler. Gruplar DOM'da da iç içe olmalı — ekran\n * okuyucu seçeneği \"Meyveler grubu, Elma\" diye okusun.\n */\nexport interface SelectSection {\n key: string;\n label?: React.ReactNode;\n options: SelectOption[];\n}\n\nexport const isGroup = (item: SelectOption | SelectOptionGroup): item is SelectOptionGroup => \"options\" in item;\n\n/** Gruplar açılmış, düz seçenek listesi (değer arama, klavye gezinmesi için). */\nexport function flattenOptions(items: Array<SelectOption | SelectOptionGroup>): SelectOption[] {\n return items.flatMap((item) => (isGroup(item) ? item.options : [item]));\n}\n\n/** Aramada/harfle atlamada kullanılan düz metin: `searchText` → düz `label` → `value`. */\nexport function optionText(option: SelectOption): string {\n if (option.searchText !== undefined) return option.searchText;\n if (typeof option.label === \"string\" || typeof option.label === \"number\") return String(option.label);\n return String(option.value);\n}\n\n/** DOM id'si için değer anahtarı (sayı ile aynı yazılı string çakışmasın). */\nexport const valueKey = (value: SelectValue) => `${typeof value}:${value}`;\n\n/**\n * Aramaya göre süzülmüş bölümler; eşleşmesi kalmayan grup tamamen düşer.\n * Türkçe/aksansız eşleşme AutoComplete'le aynı (`foldForSearch`).\n */\nexport function buildSections(items: Array<SelectOption | SelectOptionGroup>, search: string): SelectSection[] {\n const query = foldForSearch(search.trim());\n const matches = (option: SelectOption) => !query || foldForSearch(optionText(option)).includes(query);\n const sections: SelectSection[] = [];\n items.forEach((item, index) => {\n if (isGroup(item)) {\n const visible = item.options.filter(matches);\n if (visible.length > 0) sections.push({ key: `group-${index}`, label: item.label, options: visible });\n return;\n }\n if (!matches(item)) return;\n const last = sections.at(-1);\n if (last && last.label === undefined) last.options.push(item);\n else sections.push({ key: `plain-${index}`, options: [item] });\n });\n return sections;\n}\n\n/**\n * Klavye gezinmesi: seçilebilir (disabled olmayan) seçenekler arasında\n * `from`dan `step` yönünde bir sonraki; kenarda durur (APG listbox — sarmaz).\n */\nexport function nextEnabled(options: SelectOption[], from: number, step: 1 | -1): number {\n for (let i = from + step; i >= 0 && i < options.length; i += step) {\n if (!options[i]!.disabled) return i;\n }\n return from;\n}\n\n/** İlk seçilebilir seçenek; yoksa -1. */\nexport function firstEnabled(options: SelectOption[]): number {\n return nextEnabledOrNone(options, -1, 1);\n}\n\n/** Son seçilebilir seçenek; yoksa -1. */\nexport function lastEnabled(options: SelectOption[]): number {\n return nextEnabledOrNone(options, options.length, -1);\n}\n\nfunction nextEnabledOrNone(options: SelectOption[], from: number, step: 1 | -1): number {\n const next = nextEnabled(options, from, step);\n return next === from ? -1 : next;\n}\n\n/**\n * Harfle atlama (type-ahead): art arda yazılan harfler birikir (\"is\" →\n * \"İstanbul\"); tek harf tekrarlanırsa o harfle başlayan sonrakine geçer.\n */\nexport function typeAheadMatch(options: SelectOption[], current: number, buffer: string): number {\n const query = foldForSearch(buffer);\n if (!query) return -1;\n const repeated = query.length > 1 && [...query].every((ch) => ch === query[0]);\n const needle = repeated ? query[0]! : query;\n const start = repeated || query.length === 1 ? current + 1 : current;\n for (let step = 0; step < options.length; step++) {\n const i = (Math.max(start, 0) + step) % options.length;\n const option = options[i]!;\n if (!option.disabled && foldForSearch(optionText(option)).startsWith(needle)) return i;\n }\n return -1;\n}\n"],"mappings":"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","names":["SelectPanel"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/elevationClass.ts"],"sourcesContent":["import { cn } from \"@mari-ui/core\";\n\n/*\n * `foundations/Elevation.mdx`'te vaat edilen tablo: `shadow-mari-*` + ince\n * `border-mari-border` kombinasyonu birlikte kullanılır. Koyu temada saf\n * siyah-alfa gölge tek başına neredeyse görünmez — yükseklik hissi asıl\n * kenarlıktan gelir, gölge sadece üstüne biner. Faz 13 öncesi component'ler\n * (Card, Carousel) `shadow-md`/`shadow` gibi tokensız Tailwind built-in'lerini\n * kullanıyordu; bu tablo onların yerini alır.\n */\nexport const elevationClass: Record<\"sm\" | \"md\" | \"lg\" | \"xl\", string> = {\n sm: cn(\"shadow-mari-sm\", \"border border-mari-border\"),\n md: cn(\"shadow-mari-md\", \"border border-mari-border\"),\n lg: cn(\"shadow-mari-lg\", \"border border-mari-border\"),\n xl: cn(\"shadow-mari-xl\", \"border border-mari-border\"),\n};\n"],"mappings":";AAAA,SAAS,UAAU;AAUZ,IAAM,iBAA4D;AAAA,EACvE,IAAI,GAAG,kBAAkB,2BAA2B;AAAA,EACpD,IAAI,GAAG,kBAAkB,2BAA2B;AAAA,EACpD,IAAI,GAAG,kBAAkB,2BAA2B;AAAA,EACpD,IAAI,GAAG,kBAAkB,2BAA2B;AACtD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/SkeletonSlot.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface SkeletonSlotProps {\n on: boolean;\n placeholder: React.ReactNode;\n /**\n * Bölgenin YÜKLÜ hâldeki akışı: flex bir ebeveynin (aksiyon hücresi, extra)\n * içeriği flex öğesidir, blok ebeveyninki satır kutusuna girer. Görünmez\n * kopya aynı akışta çizilmezse yükseklik 3-4px kayar (Card'da ölçüldü).\n */\n flow?: \"block\" | \"flex\";\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * İskelette bir bölgeyi yer tutucuya çevirir: gerçek içerik\n * `invisible` olarak aynı grid hücresinde kalır (yükseklik/genişlik korunur,\n * tab sırasından çıkar), yer tutucu üstüne biner. İçerik yoksa (veri henüz\n * gelmedi) kutuyu yer tutucu belirler — her iki durumda da yüklenince zıplama\n * olmaz. Serbest içerik taşıyan component'lerin (Card, Carousel…) ortak aracı.\n */\nexport function SkeletonSlot({ on, placeholder, flow = \"block\", className, children }: Readonly<SkeletonSlotProps>) {\n if (!on) return <>{children}</>;\n return (\n <div aria-hidden className={cn(\"grid\", className)}>\n <div className={cn(\"invisible min-w-0 [grid-area:1/1]\", flow === \"flex\" && \"flex items-center\")}>{children}</div>\n <div className=\"[grid-area:1/1]\">{placeholder}</div>\n </div>\n );\n}\n"],"mappings":";AACA,SAAS,UAAU;AAuBD,wBAEd,YAFc;AADX,SAAS,aAAa,EAAE,IAAI,aAAa,OAAO,SAAS,WAAW,SAAS,GAAgC;AAClH,MAAI,CAAC,GAAI,QAAO,gCAAG,UAAS;AAC5B,SACE,qBAAC,SAAI,eAAW,MAAC,WAAW,GAAG,QAAQ,SAAS,GAC9C;AAAA,wBAAC,SAAI,WAAW,GAAG,qCAAqC,SAAS,UAAU,mBAAmB,GAAI,UAAS;AAAA,IAC3G,oBAAC,SAAI,WAAU,mBAAmB,uBAAY;AAAA,KAChD;AAEJ;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sizeClass
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-POBOJBNJ.js";
|
|
4
4
|
import {
|
|
5
5
|
borderStrongColorClass
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
7
7
|
|
|
8
8
|
// src/input/utils.ts
|
|
9
9
|
import { cn } from "@mari-ui/core";
|
|
@@ -64,4 +64,4 @@ export {
|
|
|
64
64
|
isClearable,
|
|
65
65
|
clearNativeValue
|
|
66
66
|
};
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
67
|
+
//# sourceMappingURL=chunk-NENNFQEY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/input/utils.ts"],"sourcesContent":["import type React from \"react\";\nimport { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { borderStrongColorClass } from \"../lib/colorClasses\";\nimport { sizeClass } from \"../lib/sizeClasses\";\nimport type { InputShape, InputVariant } from \"./types\";\n\n/*\n * Kendi `SIZE_CLASS`/`TEXTAREA_SIZE_CLASS` tabloları vardı — `lib.sizeClass`\n * ile SAYISAL OLARAK zaten birebir aynıydı (yükseklik/padding/font). Faz 13\n * gereği tek kaynağa bağlandı; rakip tablo silindi.\n */\nexport function getSizeClasses(size: Size): string {\n return sizeClass[size];\n}\n\n/** Textarea çok satırlı olduğu için sabit `h-*` almaz — geri kalan (padding/font/gap/radius) aynı ölçekten. */\nexport function getTextareaSizeClasses(size: Size): string {\n return cn(sizeClass[size], \"h-auto\");\n}\n\n/*\n * Odakta kenarlık ROL RENGİNE döner: eskiden açık `-border` tonuydu\n * (#93c6f6 ≈ 1.8:1 beyazda — WCAG 1.4.11'in 3:1'ini geçmiyordu; outline\n * Button'da bulunan sorunun aynısı). Ayrıca ofsetli outline yerine kenarlığa\n * yapışık yumuşak bir hale (`ring`) — modern form alanı görünümü, iki ayrı\n * çerçeve üst üste binmiyor. Literal tablo: pseudo-class önekleri runtime'da\n * string birleştirmesiyle kurulmaz (Tailwind taraması).\n */\nconst FOCUS_BORDER_CLASS: Record<ColorRole, string> = {\n primary: \"focus-within:border-mari-primary focus-within:ring-mari-primary/20\",\n accent: \"focus-within:border-mari-accent focus-within:ring-mari-accent/20\",\n success: \"focus-within:border-mari-success focus-within:ring-mari-success/20\",\n error: \"focus-within:border-mari-error focus-within:ring-mari-error/20\",\n warning: \"focus-within:border-mari-warning focus-within:ring-mari-warning/20\",\n info: \"focus-within:border-mari-info focus-within:ring-mari-info/20\",\n neutral: \"focus-within:border-mari-neutral focus-within:ring-mari-neutral/20\",\n};\n\n/** Kutu (wrapper) ortak sınıfları — Input ve Textarea. */\nexport const FIELD_BASE_CLASS = \"transition-[color,background-color,border-color,box-shadow] duration-150 focus-within:ring-3\";\n\n/**\n * Devre dışı: `pointer-events-none` KULLANILMAZ — imleci de kapatıp\n * `cursor-not-allowed`'ı hiç göstermiyordu. Yazmayı native `disabled` engeller.\n */\nexport const FIELD_DISABLED_CLASS = \"opacity-50 cursor-not-allowed [&_*]:cursor-not-allowed\";\n\n/**\n * İOS Safari 16px'ten küçük yazılı bir alana odaklanınca sayfayı yakınlaştırır\n * (ve geri uzaklaştırmaz). Dar ekranda alanın METNİ en az 16px olur; `sm` (640px)\n * ve üstünde boyut ölçeğinin kendi fontu geçerli.\n */\nexport const FIELD_MOBILE_TEXT_CLASS = \"max-sm:text-base\";\n\n/*\n * Kullanıcı geri bildirimi: `color` verilmediyse (yani gerçek bir\n * doğrulama durumu YOKSA) dinlenme halindeki kenarlık HER ZAMAN nötr/gri\n * olmalı (`border-mari-input` — Faz 13.0a'da tam bunun için eklenen ama o\n * zamana kadar hiç tüketilmeyen token) — eskiden varsayılan `\"primary\"`e\n * düşüp her input'u sürekli mavi gösteriyordu. Odaklanınca `primary`e döner.\n * `color` AÇIKÇA verildiyse (örn. `error`/`warning` doğrulama durumu) o renk\n * dinlenme halinde de kalıcıdır — odak beklemeden görünür olmalı.\n */\nexport function getVariantClasses(variant: InputVariant, color: ColorRole | undefined): string {\n // Açık renk (doğrulama durumu) → rol rengi; açık `-border` tonu beyazda\n // ~1.8:1 ile WCAG 1.4.11'in 3:1'ini geçmiyordu (Faz 15).\n const restBorderClass = color ? borderStrongColorClass[color] : \"border-mari-input\";\n const focusBorderClass = FOCUS_BORDER_CLASS[color ?? \"primary\"];\n\n switch (variant) {\n case \"outline\":\n return cn(\"border bg-mari-surface text-mari-foreground\", restBorderClass, focusBorderClass);\n case \"soft\":\n return cn(\"border bg-mari-surface-alt text-mari-foreground\", restBorderClass, focusBorderClass);\n case \"ghost\":\n // Kenarlık yok → odak göstergesi tek başına halka.\n return \"border-none bg-transparent focus-within:ring-mari-ring/40\";\n case \"underlined\":\n // Halkasız: alt çizgili alanın odağı çizginin kendisidir.\n return cn(\"border-b bg-transparent rounded-none focus-within:ring-0\", restBorderClass, focusBorderClass);\n }\n}\n\n/*\n * `underlined` her zaman köşesiz — eskiden `shape` sınıfı varyanttan SONRA\n * geldiği için `rounded-md` kazanıyor ve alt çizginin uçları bükülüyordu.\n */\nexport function getShapeClasses(shape: InputShape, variant?: InputVariant): string {\n if (variant === \"underlined\") return \"rounded-none\";\n return { square: \"rounded-none\", pill: \"rounded-full px-4\", default: \"rounded-md\" }[shape];\n}\n\nexport function isClearable(allowClear: boolean | { clearIcon?: React.ReactNode } | undefined): boolean {\n return typeof allowClear === \"boolean\" ? allowClear : !!allowClear;\n}\n\n/*\n * Temizle düğmesi alanı GERÇEK bir değişiklik olarak boşaltır: yerel değer\n * setter'ı + `input` olayı → React `onChange`'i gerçek bir ChangeEvent'le\n * çalışır. Eskiden yalnız iç state siliniyordu; kontrollü kullanımda\n * (`value` + `onChange`) `onChange` hiç çağrılmadığı için X hiçbir şey\n * silmiyordu (Tree arama story'sinde yakalandı).\n */\nexport function clearNativeValue(el: HTMLInputElement | HTMLTextAreaElement | null): void {\n if (!el) return;\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n Object.getOwnPropertyDescriptor(proto, \"value\")?.set?.call(el, \"\");\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n}\n\n"],"mappings":";;;;;;;;AACA,SAAS,UAAqC;AAUvC,SAAS,eAAe,MAAoB;AACjD,SAAO,UAAU,IAAI;AACvB;AAGO,SAAS,uBAAuB,MAAoB;AACzD,SAAO,GAAG,UAAU,IAAI,GAAG,QAAQ;AACrC;AAUA,IAAM,qBAAgD;AAAA,EACpD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;AAGO,IAAM,mBAAmB;AAMzB,IAAM,uBAAuB;AAO7B,IAAM,0BAA0B;AAWhC,SAAS,kBAAkB,SAAuB,OAAsC;AAG7F,QAAM,kBAAkB,QAAQ,uBAAuB,KAAK,IAAI;AAChE,QAAM,mBAAmB,mBAAmB,SAAS,SAAS;AAE9D,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,GAAG,+CAA+C,iBAAiB,gBAAgB;AAAA,IAC5F,KAAK;AACH,aAAO,GAAG,mDAAmD,iBAAiB,gBAAgB;AAAA,IAChG,KAAK;AAEH,aAAO;AAAA,IACT,KAAK;AAEH,aAAO,GAAG,4DAA4D,iBAAiB,gBAAgB;AAAA,EAC3G;AACF;AAMO,SAAS,gBAAgB,OAAmB,SAAgC;AACjF,MAAI,YAAY,aAAc,QAAO;AACrC,SAAO,EAAE,QAAQ,gBAAgB,MAAM,qBAAqB,SAAS,aAAa,EAAE,KAAK;AAC3F;AAEO,SAAS,YAAY,YAA4E;AACtG,SAAO,OAAO,eAAe,YAAY,aAAa,CAAC,CAAC;AAC1D;AASO,SAAS,iBAAiB,IAAyD;AACxF,MAAI,CAAC,GAAI;AACT,QAAM,QAAQ,cAAc,sBAAsB,oBAAoB,YAAY,iBAAiB;AACnG,SAAO,yBAAyB,OAAO,OAAO,GAAG,KAAK,KAAK,IAAI,EAAE;AACjE,KAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACxD;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/fieldContext.ts"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useContext, useEffect } from \"react\";\nimport type { ColorRole } from \"@mari-ui/core\";\n\n/**\n * `Field`in içindeki kontrole geçirdiği bağlantılar. `lib`te\n * duruyor (field/ klasöründe değil) çünkü her kontrol bunu import eder;\n * tsup ortak parçaya (chunk) koyar, tek bir context örneği olur.\n */\nexport interface FieldContextValue {\n /** Kontrolün id'si — `<label htmlFor>` buna bağlı. */\n controlId: string;\n labelId: string;\n /** İpucu ve/veya hata metninin id'leri (boşlukla ayrılmış); yoksa `undefined`. */\n describedBy: string | undefined;\n invalid: boolean;\n required: boolean;\n disabled: boolean;\n /** Grup kontrolleri (RadioGroup, Segmented, OtpInput) çağırır: etiket `<label for>` değil grubun adı olur. */\n markGroup: () => void;\n /** Kontrol kendi `id`sini verdiyse etiketin `htmlFor`u ona dönsün. */\n setControlId: (id: string | undefined) => void;\n /** Field iskelette: içindeki kontrol de iskelet çizer (tek prop kuralı). */\n skeleton: boolean;\n}\n\nexport const FieldContext = createContext<FieldContextValue | null>(null);\n\nconst joinIds = (...ids: Array<string | undefined>) => ids.filter(Boolean).join(\" \") || undefined;\n\nexport interface FieldControlProps {\n id?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: Exclude<React.AriaAttributes[\"aria-invalid\"], undefined>;\n required?: boolean;\n disabled?: boolean;\n color?: ColorRole;\n skeleton?: boolean;\n}\n\n/**\n * Tek bir alanı olan kontroller (Input, Select, InputNumber…) için. Field\n * içinde değilse verilen prop'ları olduğu gibi döner. İçindeyse eksikleri\n * Field'dan tamamlar — kontrole AÇIKÇA verilen prop her zaman kazanır;\n * `aria-describedby` ise birleştirilir (ikisi de okunsun).\n */\nexport function useFieldControl<P extends FieldControlProps>(props: P): P & FieldControlProps {\n const field = useContext(FieldContext);\n const setControlId = field?.setControlId;\n const ownId = props.id;\n useEffect(() => {\n if (!setControlId || ownId === undefined) return;\n setControlId(ownId);\n return () => setControlId(undefined);\n }, [setControlId, ownId]);\n if (!field) return props;\n return {\n ...props,\n id: props.id ?? field.controlId,\n \"aria-describedby\": joinIds(props[\"aria-describedby\"], field.describedBy),\n \"aria-invalid\": props[\"aria-invalid\"] ?? (field.invalid || undefined),\n required: props.required ?? (field.required || undefined),\n disabled: props.disabled ?? (field.disabled || undefined),\n color: props.color ?? (field.invalid ? \"error\" : undefined),\n skeleton: props.skeleton ?? (field.skeleton || undefined),\n };\n}\n\n/**\n * Grup kontrolleri (RadioGroup, Segmented, OtpInput, Transfer) için: kontrolün\n * kendi `skeleton`u verilmediyse Field'ınki geçerli.\n */\nexport function useFieldSkeleton(own: boolean | undefined): boolean {\n const field = useContext(FieldContext);\n return own ?? field?.skeleton ?? false;\n}\n\nexport interface FieldGroupProps {\n \"aria-labelledby\"?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n disabled?: boolean;\n}\n\n/**\n * Grup kontrolleri için: Field'ın etiketi grubun adı olur (`aria-labelledby`)\n * — grup tek bir odaklanabilir alan olmadığından `<label htmlFor>` bağlanamaz.\n * Kontrol kendi `aria-label`/`aria-labelledby`sini verdiyse o kazanır.\n */\nexport function useFieldGroup<P extends FieldGroupProps>(props: P, enabled = true): P & FieldGroupProps & { \"aria-invalid\"?: true; \"aria-required\"?: true } {\n const field = useContext(FieldContext);\n const markGroup = enabled ? field?.markGroup : undefined;\n useEffect(() => markGroup?.(), [markGroup]);\n if (!field || !enabled) return props;\n const named = props[\"aria-labelledby\"] !== undefined || props[\"aria-label\"] !== undefined;\n return {\n ...props,\n \"aria-labelledby\": named ? props[\"aria-labelledby\"] : field.labelId,\n \"aria-describedby\": joinIds(props[\"aria-describedby\"], field.describedBy),\n disabled: props.disabled ?? (field.disabled || undefined),\n \"aria-invalid\": field.invalid ? true : undefined,\n \"aria-required\": field.required ? true : undefined,\n };\n}\n"],"mappings":";AAGA,SAAS,eAAe,YAAY,iBAAiB;AAyB9C,IAAM,eAAe,cAAwC,IAAI;AAExE,IAAM,UAAU,IAAI,QAAmC,IAAI,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAkBjF,SAAS,gBAA6C,OAAiC;AAC5F,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,eAAe,OAAO;AAC5B,QAAM,QAAQ,MAAM;AACpB,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,UAAU,OAAW;AAC1C,iBAAa,KAAK;AAClB,WAAO,MAAM,aAAa,MAAS;AAAA,EACrC,GAAG,CAAC,cAAc,KAAK,CAAC;AACxB,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,MAAM,MAAM,MAAM;AAAA,IACtB,oBAAoB,QAAQ,MAAM,kBAAkB,GAAG,MAAM,WAAW;AAAA,IACxE,gBAAgB,MAAM,cAAc,MAAM,MAAM,WAAW;AAAA,IAC3D,UAAU,MAAM,aAAa,MAAM,YAAY;AAAA,IAC/C,UAAU,MAAM,aAAa,MAAM,YAAY;AAAA,IAC/C,OAAO,MAAM,UAAU,MAAM,UAAU,UAAU;AAAA,IACjD,UAAU,MAAM,aAAa,MAAM,YAAY;AAAA,EACjD;AACF;AAMO,SAAS,iBAAiB,KAAmC;AAClE,QAAM,QAAQ,WAAW,YAAY;AACrC,SAAO,OAAO,OAAO,YAAY;AACnC;AAcO,SAAS,cAAyC,OAAU,UAAU,MAA+E;AAC1J,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,YAAY,UAAU,OAAO,YAAY;AAC/C,YAAU,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC;AAC1C,MAAI,CAAC,SAAS,CAAC,QAAS,QAAO;AAC/B,QAAM,QAAQ,MAAM,iBAAiB,MAAM,UAAa,MAAM,YAAY,MAAM;AAChF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,mBAAmB,QAAQ,MAAM,iBAAiB,IAAI,MAAM;AAAA,IAC5D,oBAAoB,QAAQ,MAAM,kBAAkB,GAAG,MAAM,WAAW;AAAA,IACxE,UAAU,MAAM,aAAa,MAAM,YAAY;AAAA,IAC/C,gBAAgB,MAAM,UAAU,OAAO;AAAA,IACvC,iBAAiB,MAAM,WAAW,OAAO;AAAA,EAC3C;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/floating.ts"],"sourcesContent":["import type { Placement } from \"@mari-ui/core\";\n\n/*\n * Yüzen paneller (Dropdown, Tooltip) için ortak konumlandırma — Faz 15'te\n * `dropdown/utils.ts`'ten taşındı; Tooltip'in kendi 4-yönlü, kıstırmasız\n * hesabının yerini aldı (mobilde ekrandan taşıyordu).\n */\nexport type Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n/** 12 değerli `Placement`i ana yön + hizaya ayırır (`bottom-end` → `{ side: \"bottom\", align: \"end\" }`). */\nexport function parsePlacement(placement: Placement): { side: Side; align: Align } {\n const [side, align] = placement.split(\"-\") as [Side, Align | undefined];\n return { side, align: align ?? \"center\" };\n}\n\nconst OPPOSITE_SIDE: Record<Side, Side> = { top: \"bottom\", bottom: \"top\", left: \"right\", right: \"left\" };\n\nexport interface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface ArrowOptions {\n /** Okun ORTASININ panelin hizalandığı kenardan uzaklığı. */\n inset: number;\n /** `true`: panel, okun ortası TETİKLEYİCİNİN ortasına gelecek şekilde kayar. */\n pointAtCenter: boolean;\n}\n\nfunction getArrowCenter(align: Align, size: number, inset: number, towardsTrigger: number | undefined): number {\n if (towardsTrigger !== undefined) return towardsTrigger;\n if (align === \"start\") return inset;\n if (align === \"end\") return size - inset;\n return size / 2;\n}\n\n/**\n * Panelin sol-üst köşesinin (viewport koordinatlarında) nereye gelmesi\n * gerektiğini hesaplar: tercih edilen yönde sığmıyor ama karşı yönde\n * sığıyorsa yönü çevirir (flip), sonra iki eksende de viewport içinde\n * kelepçeler. `side` (flip sonrası gerçek yön) ve `arrowOffset` (okun ortasının\n * panelin kenarı boyunca konumu) da döner. Saf fonksiyon — DOM'a dokunmaz.\n */\nexport function computePanelPosition(\n anchor: Box,\n panel: { width: number; height: number },\n placement: Placement,\n viewport: { width: number; height: number },\n gap: number,\n edge: number,\n arrow?: ArrowOptions\n): { top: number; left: number; side: Side; arrowOffset: number } {\n const { side: preferred, align } = parsePlacement(placement);\n\n const mainStart = (side: Side): number => {\n switch (side) {\n case \"top\":\n return anchor.top - gap - panel.height;\n case \"bottom\":\n return anchor.top + anchor.height + gap;\n case \"left\":\n return anchor.left - gap - panel.width;\n default:\n return anchor.left + anchor.width + gap;\n }\n };\n\n const fits = (side: Side): boolean => {\n const start = mainStart(side);\n const size = side === \"top\" || side === \"bottom\" ? panel.height : panel.width;\n const limit = side === \"top\" || side === \"bottom\" ? viewport.height : viewport.width;\n return start >= edge && start + size <= limit - edge;\n };\n\n // Sıra: tercih → karşı yön → dik yönler. Dar ekranda yatay iki yön de\n // sığmıyorsa (mobilde geniş bir balon) üst/alta geçilir — eskiden tercih\n // edilen yönde kalıp kıstırılıyor ve TETİKLEYİCİNİN ÜSTÜNÜ KAPATIYORDU.\n const perpendicular: Side[] = preferred === \"top\" || preferred === \"bottom\" ? [\"right\", \"left\"] : [\"top\", \"bottom\"];\n const side = [preferred, OPPOSITE_SIDE[preferred], ...perpendicular].find(fits) ?? preferred;\n const vertical = side === \"top\" || side === \"bottom\";\n const inset = arrow?.inset ?? 0;\n\n // Çapraz eksen: panelin `size`ı, tetikleyicinin `start`/`length`i.\n const cross = vertical\n ? { start: anchor.left, length: anchor.width, size: panel.width }\n : { start: anchor.top, length: anchor.height, size: panel.height };\n const center = cross.start + cross.length / 2;\n\n let origin: number;\n if (align === \"center\") origin = center - cross.size / 2;\n else if (arrow?.pointAtCenter) origin = align === \"start\" ? center - inset : center + inset - cross.size;\n else origin = align === \"start\" ? cross.start : cross.start + cross.length - cross.size;\n\n const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n // Çapraz eksen: önce ekran içine kıstır, SONRA tetikleyiciye bağlılığı\n // zorla — panel her koşulda tetikleyicinin ortasını (ok payıyla) kapsamalı.\n // Eskiden yalnızca ekrana kıstırılıyordu: tetikleyici ekranın alt/üst\n // kenarına yaklaşınca panel kayıp tetikleyiciden kopuyor, komşu satırın\n // balonuna biniyordu (kaydırırken, kullanıcı bulgusu). Kenara yakınken panel\n // ekrandan biraz taşar ama asla tetikleyicisinden ayrılmaz.\n const attach = (value: number) => clamp(value, center - cross.size + inset, center - inset);\n const crossPos = attach(clamp(origin, edge, (vertical ? viewport.width - panel.width : viewport.height - panel.height) - edge));\n const top = vertical ? clamp(mainStart(side), edge, viewport.height - panel.height - edge) : crossPos;\n const left = vertical ? crossPos : clamp(mainStart(side), edge, viewport.width - panel.width - edge);\n\n // Ok: varsayılan olarak hizalanan kenardan sabit `inset` içeride (ant.design);\n // `pointAtCenter` ise tetikleyicinin ortasında. Köşeye taşmasın diye kelepçelenir.\n const finalOrigin = vertical ? left : top;\n const arrowOffset = clamp(getArrowCenter(align, cross.size, inset, arrow?.pointAtCenter ? center - finalOrigin : undefined), inset, cross.size - inset);\n\n return { top, left, side, arrowOffset };\n}\n\n"],"mappings":";AAWO,SAAS,eAAe,WAAoD;AACjF,QAAM,CAAC,MAAM,KAAK,IAAI,UAAU,MAAM,GAAG;AACzC,SAAO,EAAE,MAAM,OAAO,SAAS,SAAS;AAC1C;AAEA,IAAM,gBAAoC,EAAE,KAAK,UAAU,QAAQ,OAAO,MAAM,SAAS,OAAO,OAAO;AAgBvG,SAAS,eAAe,OAAc,MAAc,OAAe,gBAA4C;AAC7G,MAAI,mBAAmB,OAAW,QAAO;AACzC,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,MAAO,QAAO,OAAO;AACnC,SAAO,OAAO;AAChB;AASO,SAAS,qBACd,QACA,OACA,WACA,UACA,KACA,MACA,OACgE;AAChE,QAAM,EAAE,MAAM,WAAW,MAAM,IAAI,eAAe,SAAS;AAE3D,QAAM,YAAY,CAACA,UAAuB;AACxC,YAAQA,OAAM;AAAA,MACZ,KAAK;AACH,eAAO,OAAO,MAAM,MAAM,MAAM;AAAA,MAClC,KAAK;AACH,eAAO,OAAO,MAAM,OAAO,SAAS;AAAA,MACtC,KAAK;AACH,eAAO,OAAO,OAAO,MAAM,MAAM;AAAA,MACnC;AACE,eAAO,OAAO,OAAO,OAAO,QAAQ;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,OAAO,CAACA,UAAwB;AACpC,UAAM,QAAQ,UAAUA,KAAI;AAC5B,UAAM,OAAOA,UAAS,SAASA,UAAS,WAAW,MAAM,SAAS,MAAM;AACxE,UAAM,QAAQA,UAAS,SAASA,UAAS,WAAW,SAAS,SAAS,SAAS;AAC/E,WAAO,SAAS,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EAClD;AAKA,QAAM,gBAAwB,cAAc,SAAS,cAAc,WAAW,CAAC,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AAClH,QAAM,OAAO,CAAC,WAAW,cAAc,SAAS,GAAG,GAAG,aAAa,EAAE,KAAK,IAAI,KAAK;AACnF,QAAM,WAAW,SAAS,SAAS,SAAS;AAC5C,QAAM,QAAQ,OAAO,SAAS;AAG9B,QAAM,QAAQ,WACV,EAAE,OAAO,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,MAAM,MAAM,IAC9D,EAAE,OAAO,OAAO,KAAK,QAAQ,OAAO,QAAQ,MAAM,MAAM,OAAO;AACnE,QAAM,SAAS,MAAM,QAAQ,MAAM,SAAS;AAE5C,MAAI;AACJ,MAAI,UAAU,SAAU,UAAS,SAAS,MAAM,OAAO;AAAA,WAC9C,OAAO,cAAe,UAAS,UAAU,UAAU,SAAS,QAAQ,SAAS,QAAQ,MAAM;AAAA,MAC/F,UAAS,UAAU,UAAU,MAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM;AAEnF,QAAM,QAAQ,CAAC,OAAe,KAAa,QAAgB,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAO5G,QAAM,SAAS,CAAC,UAAkB,MAAM,OAAO,SAAS,MAAM,OAAO,OAAO,SAAS,KAAK;AAC1F,QAAM,WAAW,OAAO,MAAM,QAAQ,OAAO,WAAW,SAAS,QAAQ,MAAM,QAAQ,SAAS,SAAS,MAAM,UAAU,IAAI,CAAC;AAC9H,QAAM,MAAM,WAAW,MAAM,UAAU,IAAI,GAAG,MAAM,SAAS,SAAS,MAAM,SAAS,IAAI,IAAI;AAC7F,QAAM,OAAO,WAAW,WAAW,MAAM,UAAU,IAAI,GAAG,MAAM,SAAS,QAAQ,MAAM,QAAQ,IAAI;AAInG,QAAM,cAAc,WAAW,OAAO;AACtC,QAAM,cAAc,MAAM,eAAe,OAAO,MAAM,MAAM,OAAO,OAAO,gBAAgB,SAAS,cAAc,MAAS,GAAG,OAAO,MAAM,OAAO,KAAK;AAEtJ,SAAO,EAAE,KAAK,MAAM,MAAM,YAAY;AACxC;","names":["side"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/FloatingArrow.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Side } from \"./floating\";\n\n/*\n * Yüzey renkli yüzen panellerin (Dropdown, Popover, Popconfirm) ortak ölçüleri\n * ve oku — Faz 16.2'de DropdownContent'ten taşındı.\n *\n * Yapısal ölçüler ant.design'ın canlı Dropdown sayfasından `getComputedStyle`\n * ile alındı: ok yokken tetikleyiciyle panel arasında 4px, okluyken 12px\n * (8px'lik ok kutusu + 4px); ok, panelin hizalandığı kenardan 12px içeride\n * başlayan 16px'lik bir kutu, yani ORTASI kenardan 20px. GÖRÜNÜM (gölge,\n * kenarlık, renk) ant'tan değil kendi token'larımızdan gelir.\n */\nexport const FLOATING_GAP_PX = 4;\nexport const FLOATING_ARROW_GAP_PX = 12;\nexport const FLOATING_ARROW_INSET_PX = 20;\n/** Panel viewport kenarına YAPIŞMASIN diye bırakılan minimum boşluk. */\nexport const FLOATING_EDGE_PX = 8;\n\n/*\n * ant.design okunun birebir `clip-path`i: 16×8, ucu yuvarlak, taban köşeleri panele yumuşakça karışan üçgen.\n */\nconst ARROW_FILL_PATH = \"M 0 8 A 4 4 0 0 0 2.82843 6.82843 L 6.58579 3.07107 A 2 2 0 0 1 9.41421 3.07107 L 13.1716 6.82843 A 4 4 0 0 0 16 8 Z\";\n/** Aynı yol KAPATILMADAN — kenarlık rengiyle sadece eğik kenarlar çizilir; taban çizgisi panelin kenarlığının üstünden geçmesin diye (dolgu o kısmı örter). */\nconst ARROW_STROKE_PATH = \"M 0 8 A 4 4 0 0 0 2.82843 6.82843 L 6.58579 3.07107 A 2 2 0 0 1 9.41421 3.07107 L 13.1716 6.82843 A 4 4 0 0 0 16 8\";\n\nconst ARROW_LONG_PX = 16;\nconst ARROW_SHORT_PX = 8;\n/** Panelin kenarlığı: mutlak konumlu ok padding kutusuna göre konumlanır, bu yüzden çapraz eksende 1px düzeltilir. */\nconst BORDER_PX = 1;\n\n/** `side` panelin tetikleyiciye GÖRE konumu; ok panelin tetikleyiciye bakan kenarında durur ve tetikleyiciyi gösterir. */\nfunction getArrowBox(side: Side, offset: number): { style: React.CSSProperties; rotation: number } {\n const half = ARROW_LONG_PX / 2 + BORDER_PX;\n switch (side) {\n case \"bottom\":\n return { style: { left: offset - half, top: -ARROW_SHORT_PX, width: ARROW_LONG_PX, height: ARROW_SHORT_PX }, rotation: 0 };\n case \"top\":\n return { style: { left: offset - half, top: \"100%\", width: ARROW_LONG_PX, height: ARROW_SHORT_PX }, rotation: 180 };\n case \"right\":\n return { style: { left: -ARROW_SHORT_PX, top: offset - half, width: ARROW_SHORT_PX, height: ARROW_LONG_PX }, rotation: -90 };\n default:\n return { style: { left: \"100%\", top: offset - half, width: ARROW_SHORT_PX, height: ARROW_LONG_PX }, rotation: 90 };\n }\n}\n\nexport function FloatingArrow({ side, offset }: Readonly<{ side: Side; offset: number }>) {\n const { style, rotation } = getArrowBox(side, offset);\n return (\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute\" style={style}>\n <svg\n width={ARROW_LONG_PX}\n height={ARROW_SHORT_PX}\n viewBox=\"0 0 16 8\"\n className=\"absolute left-1/2 top-1/2 overflow-visible\"\n style={{ transform: `translate(-50%, -50%) rotate(${rotation}deg)` }}\n >\n <path d={ARROW_FILL_PATH} className=\"fill-mari-surface\" />\n {/* Taban ucu panelin 1px kenarlığının TAM ortasına otursun diye yarım piksel yukarı: aksi halde çizgi kenarlığın 0.5px dışına/altına taşıp çıkıntı bırakır. */}\n <path d={ARROW_STROKE_PATH} fill=\"none\" transform=\"translate(0 -0.5)\" className=\"stroke-mari-border\" />\n </svg>\n </span>\n );\n}\n"],"mappings":";AAkDM,SAOE,KAPF;AArCC,IAAM,kBAAkB;AACxB,IAAM,wBAAwB;AAC9B,IAAM,0BAA0B;AAEhC,IAAM,mBAAmB;AAKhC,IAAM,kBAAkB;AAExB,IAAM,oBAAoB;AAE1B,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAEvB,IAAM,YAAY;AAGlB,SAAS,YAAY,MAAY,QAAkE;AACjG,QAAM,OAAO,gBAAgB,IAAI;AACjC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,KAAK,CAAC,gBAAgB,OAAO,eAAe,QAAQ,eAAe,GAAG,UAAU,EAAE;AAAA,IAC3H,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,eAAe,QAAQ,eAAe,GAAG,UAAU,IAAI;AAAA,IACpH,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,KAAK,SAAS,MAAM,OAAO,gBAAgB,QAAQ,cAAc,GAAG,UAAU,IAAI;AAAA,IAC7H;AACE,aAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,KAAK,SAAS,MAAM,OAAO,gBAAgB,QAAQ,cAAc,GAAG,UAAU,GAAG;AAAA,EACrH;AACF;AAEO,SAAS,cAAc,EAAE,MAAM,OAAO,GAA6C;AACxF,QAAM,EAAE,OAAO,SAAS,IAAI,YAAY,MAAM,MAAM;AACpD,SACE,oBAAC,UAAK,eAAY,QAAO,WAAU,gCAA+B,OAChE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAO,EAAE,WAAW,gCAAgC,QAAQ,OAAO;AAAA,MAEnE;AAAA,4BAAC,UAAK,GAAG,iBAAiB,WAAU,qBAAoB;AAAA,QAExD,oBAAC,UAAK,GAAG,mBAAmB,MAAK,QAAO,WAAU,qBAAoB,WAAU,sBAAqB;AAAA;AAAA;AAAA,EACvG,GACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/overlay.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type RefObject } from \"react\";\n\n/*\n * Kenardan açılan modal katmanların (Drawer, NavDrawer) ortak davranışı.\n * Faz 13.6'dan önce bu mantık yalnız `menu/_shared/NavDrawer.tsx`'te vardı;\n * `Drawer`da HİÇBİRİ yoktu (odak tuzağı, Escape, kaydırma kilidi, portal) —\n * kapalı Drawer DOM'da kalıyor, içindeki düğmeler Tab ile odaklanabiliyordu.\n * Artık tek yerde.\n */\n\nexport const FOCUSABLE_SELECTOR =\n 'button:not([disabled]), a[href], input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Gerçekten odaklanabilen öğeler. `aria-hidden`/`inert` bir atanın içindekiler\n * elenir: iskelette gerçek içerik `SkeletonSlot` ile görünmez kopya olarak\n * DOM'da kalır (`visibility: hidden` → `focus()` sessizce başarısız olur);\n * bunlar sayılırsa odak tuzağının ilk/son öğesi görünmez bir düğme olur ve\n * Tab takılır.\n */\nexport function getFocusables(root: ParentNode): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => !el.closest('[aria-hidden=\"true\"], [inert]')\n );\n}\n\nexport function firstFocusable(root: ParentNode): HTMLElement | null {\n return getFocusables(root)[0] ?? null;\n}\n\n/** Öğe var ve iskeletin görünmez kopyasında (aria-hidden/inert) değilse kendisi. */\nexport function reachable(el: HTMLElement | null | undefined): HTMLElement | null {\n return el && !el.closest('[aria-hidden=\"true\"], [inert]') ? el : null;\n}\n\n/**\n * İskelet → içerik geldi: iskelette odak \"Kapat\"a (ya da panele) düşer;\n * içerik gelince odak hâlâ orada ise normal ilk odağa taşınır. Kullanıcı\n * bu arada odağı başka yere taşıdıysa dokunulmaz.\n */\nexport function useRefocusAfterSkeleton(\n open: boolean,\n skeleton: boolean,\n panelRef: RefObject<HTMLElement | null>,\n getInitialFocus: (panel: HTMLElement) => HTMLElement | null | undefined,\n closeSelector: string\n) {\n const wasSkeleton = useRef(skeleton);\n const getInitialFocusRef = useRef(getInitialFocus);\n getInitialFocusRef.current = getInitialFocus;\n useEffect(() => {\n const panel = panelRef.current;\n if (open && wasSkeleton.current && !skeleton && panel) {\n const active = document.activeElement;\n if (active === panel || (active instanceof HTMLElement && active.matches(closeSelector))) {\n const target = getInitialFocusRef.current(panel);\n if (target && target !== active) target.focus();\n }\n }\n wasSkeleton.current = skeleton;\n }, [skeleton, open, panelRef, closeSelector]);\n}\n\n/**\n * Açılışta hemen mount; kapanışta `exitMs` (çıkış animasyonu) bitince\n * unmount. `mounted` false iken hiç render etmeyin.\n */\nexport function usePresence(open: boolean, exitMs: number): boolean {\n const [mounted, setMounted] = useState(open);\n useEffect(() => {\n if (open) {\n setMounted(true);\n return;\n }\n const timer = setTimeout(() => setMounted(false), exitMs);\n return () => clearTimeout(timer);\n }, [open, exitMs]);\n return open || mounted;\n}\n\nexport interface ModalBehaviorOptions {\n /** Escape kapatsın mı. Varsayılan: `true`. */\n closeOnEscape?: boolean;\n /** Sayfa kaydırmasını kilitle. Varsayılan: `true`. */\n lockScroll?: boolean;\n /**\n * Açılışta odaklanacak öğeyi seçer. Verilmezse: `[data-autofocus]` → ilk\n * odaklanabilir → panelin kendisi.\n */\n getInitialFocus?: (panel: HTMLElement) => HTMLElement | null | undefined;\n}\n\n/** `[data-autofocus]` — kendisi odaklanabilir değilse (bileşen data-* iletmiyorsa) içindeki ilk odaklanabilir. */\nexport function findAutofocus(root: ParentNode): HTMLElement | null {\n const auto = root.querySelector<HTMLElement>(\"[data-autofocus]\");\n if (!auto || auto.closest('[aria-hidden=\"true\"], [inert]')) return null;\n return auto.matches(FOCUSABLE_SELECTOR) ? auto : firstFocusable(auto);\n}\n\n/**\n * Açıkken:\n * - sayfa kaydırması kilitlenir (kaydırma çubuğu genişliği kadar sağ dolgu\n * eklenir — kilitlenince içerik yana kaymasın),\n * - odak panelin ilk odaklanabilir öğesine (yoksa panelin kendisine) taşınır\n * ve Tab/Shift+Tab ile panel içinde döner,\n * - Escape `onClose` çağırır,\n * - kapanınca odak açılıştan önceki öğeye (genelde tetikleyici) döner.\n */\nexport function useModalBehavior(\n open: boolean,\n panelRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n { closeOnEscape = true, lockScroll = true, getInitialFocus }: ModalBehaviorOptions = {}\n) {\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n const getInitialFocusRef = useRef(getInitialFocus);\n getInitialFocusRef.current = getInitialFocus;\n\n useEffect(() => {\n if (!open) return;\n const panel = panelRef.current;\n const previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\n const { body, documentElement } = document;\n const previousOverflow = body.style.overflow;\n const previousPaddingRight = body.style.paddingRight;\n if (lockScroll) {\n const scrollbar = window.innerWidth - documentElement.clientWidth;\n body.style.overflow = \"hidden\";\n if (scrollbar > 0) body.style.paddingRight = `${scrollbar}px`;\n }\n\n if (panel) {\n const target = getInitialFocusRef.current\n ? getInitialFocusRef.current(panel)\n : (findAutofocus(panel) ?? firstFocusable(panel));\n (target ?? panel).focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && closeOnEscape) {\n // İçteki açılır bir parça (Select listesi, DatePicker/Popover paneli) Escape'i zaten işlediyse\n // yalnız o kapanır — pencere değil.\n if (event.defaultPrevented) return;\n event.preventDefault();\n onCloseRef.current();\n return;\n }\n if (event.key !== \"Tab\" || !panel) return;\n const focusables = getFocusables(panel);\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (!first || !last) {\n event.preventDefault();\n return;\n }\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !panel.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || !panel.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n if (lockScroll) {\n body.style.overflow = previousOverflow;\n body.style.paddingRight = previousPaddingRight;\n }\n previouslyFocused?.focus();\n };\n }, [open, panelRef, closeOnEscape, lockScroll]);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/sizeClasses.ts"],"sourcesContent":["import type { ExtendedSize } from \"@mari-ui/core\";\n\n/**\n * `@mari-ui/core`'un `componentSize` tablosuyla (height/paddingX/paddingY/\n * fontSize) BİLİNÇLİ OLARAK sayısal olarak hizalı, ama burada Tailwind'in\n * kendi built-in utility'leri kullanılır (`h-8`, `px-3`, `rounded-md`),\n * `@mari-ui/tokens`'ın `--mari-*` CSS değişkenleri değil.\n *\n * Neden: renk ekseni tema stüdyosunda ÇALIŞMA ZAMANINDA değişebilir\n * (kullanıcı primary/accent'i değiştirir) — bu yüzden renk CSS değişkeni\n * üzerinden akmalı. Boyut/radius skalası ise `mari-ui.config.json`'da\n * sadece bir PRESET seçimi; rastgele bir\n * değere çekilebilir olması gerekmiyor. Bu ayrım, gereksiz yere ikinci bir\n * özel Tailwind namespace'i icat etmekten kaçınır.\n *\n * Her class ismi burada da (renk tablolarındaki gibi) literal string'tir —\n * Tailwind'in derleme-zamanı tarayıcısı için.\n */\nexport const sizeClass: Record<ExtendedSize, string> = {\n xs: \"h-5 px-2 py-0.5 text-xs gap-1 rounded-sm\",\n sm: \"h-6 px-2 py-1 text-xs gap-1.5 rounded-sm\",\n md: \"h-8 px-3 py-1.5 text-sm gap-2 rounded-md\",\n lg: \"h-10 px-4 py-2 text-base gap-2 rounded-md\",\n xl: \"h-12 px-5 py-2.5 text-lg gap-2.5 rounded-lg\",\n};\n\n/**\n * Kontrol içindeki ikonun (doğrudan `<svg>` çocuk) boyutu — yazı boyutuyla\n * orantılı. Tüketici `<PlusIcon />`ı boyut vermeden geçebilsin: lucide'ın\n * varsayılanı 24px'ti, küçük butonda metinden iri duruyordu. CSS, SVG'nin\n * `width`/`height` niteliğini ezer → `size={16}` verilse de tutarlı kalır.\n */\nexport const iconSizeClass: Record<ExtendedSize, string> = {\n xs: \"[&>svg]:size-3\",\n sm: \"[&>svg]:size-3.5\",\n md: \"[&>svg]:size-4\",\n lg: \"[&>svg]:size-[1.125rem]\",\n xl: \"[&>svg]:size-5\",\n};\n\n/** Sadece font boyutu gereken (Typography gibi) bileşenler için. */\nexport const fontSizeClass: Record<ExtendedSize, string> = {\n xs: \"text-xs\",\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n xl: \"text-lg\",\n};\n\n/**\n * Dokunmatik hedef. Varsayılan kontroller masaüstü yoğunluğunda\n * (md = 32px); parmakla kullanımda önerilen en az 44px. GÖRÜNÜMÜ DEĞİŞTİRMEDEN\n * yalnızca kaba işaretçili (dokunmatik) cihazlarda görünmez bir `::before`\n * katmanı tıklama alanını 44px'e tamamlar. Öğe `relative` olmalı.\n *\n * Dikey: (44 − yükseklik) / 2 → xs 20→12px, sm 24→10px, md 32→6px, lg 40→2px,\n * xl 48 zaten yeterli. Yatay genişletme YOK: yan yana butonlar arasında\n * (gap-2) hedefler çakışırdı; ikon-only (kare) kontroller için\n * `touchTargetSquareClass` kullanın.\n */\nexport const touchTargetClass: Record<ExtendedSize, string> = {\n xs: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-3\",\n sm: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2.5\",\n md: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-1.5\",\n lg: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-0.5\",\n xl: \"\",\n};\n\n/** Kare/daire ikon-only kontroller: her yönde 44px'e tamamlar. */\nexport const touchTargetSquareClass: Record<ExtendedSize, string> = {\n xs: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-3\",\n sm: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-2.5\",\n md: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-1.5\",\n lg: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-0.5\",\n xl: \"\",\n};\n\n/**\n * Checkbox/Radio satırı (kutu + etiket) için dokunmatik hedef: satır\n * yüksekliği etiketin satır yüksekliğidir (sm 16 / md 20 / lg 24px) → 44px'e\n * tamamlar. `<label>` içindeki bir öğeye uygulanır; pseudo alana dokunmak\n * etikete dokunmak sayılır ve kontrolü değiştirir.\n */\nexport const checkableTouchTargetClass: Record<\"sm\" | \"md\" | \"lg\", string> = {\n sm: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1 pointer-coarse:before:-inset-y-3.5\",\n md: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1 pointer-coarse:before:-inset-y-3\",\n lg: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1 pointer-coarse:before:-inset-y-2.5\",\n};\n"],"mappings":";AAkBO,IAAM,YAA0C;AAAA,EACrD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAQO,IAAM,gBAA8C;AAAA,EACzD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGO,IAAM,gBAA8C;AAAA,EACzD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAaO,IAAM,mBAAiD;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGO,IAAM,yBAAuD;AAAA,EAClE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAQO,IAAM,4BAAgE;AAAA,EAC3E,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;","names":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import {
|
|
4
4
|
checkableTouchTargetClass,
|
|
5
5
|
fontSizeClass
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-POBOJBNJ.js";
|
|
7
7
|
import {
|
|
8
8
|
bgSolidClass,
|
|
9
9
|
bgSolidContrastClass,
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
checkedBgSolidHoverClass,
|
|
13
13
|
checkedBorderSolidClass,
|
|
14
14
|
textSolidContrastClass
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-6AMBZXZJ.js";
|
|
16
16
|
import {
|
|
17
17
|
skeletonBoxProps
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VKN374SD.js";
|
|
19
19
|
|
|
20
20
|
// src/checkbox/Checkbox.tsx
|
|
21
21
|
import { forwardRef, useEffect, useId, useImperativeHandle, useRef } from "react";
|
|
@@ -149,4 +149,4 @@ Checkbox.displayName = "Checkbox";
|
|
|
149
149
|
export {
|
|
150
150
|
Checkbox
|
|
151
151
|
};
|
|
152
|
-
//# sourceMappingURL=chunk-
|
|
152
|
+
//# sourceMappingURL=chunk-PR2MCHU4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/checkbox/Checkbox.tsx","../src/checkbox/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useEffect, useId, useImperativeHandle, useRef } from \"react\";\nimport { CheckIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { bgSolidContrastClass, textSolidContrastClass } from \"../lib/colorClasses\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { checkableTouchTargetClass, fontSizeClass } from \"../lib/sizeClasses\";\nimport type { CheckboxChangeEvent, CheckboxProps } from \"./types\";\nimport { getCheckIconClass, getIndeterminateSizeClasses, getShapeClasses, getSizeClasses, getVariantClasses } from \"./utils\";\n\nexport type { CheckboxProps };\n\n/*\n * `useControllableState` ile controlled/uncontrolled ayrımı artık burada\n * elle yazılmıyor (eskiden `useState(defaultChecked ?? checked ?? false)`\n * ile başlatılıp `checked={typeof checked === \"boolean\" ? checked :\n * isChecked}` şeklinde ayrıca kontrol ediliyordu — iki yerde aynı mantık).\n */\nconst DESCRIPTION_INDENT_CLASS = { sm: \"pl-5\", md: \"pl-6\", lg: \"pl-7\" } as const;\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n autoFocus = false,\n checked,\n defaultChecked = false,\n disabled = false,\n indeterminate = false,\n onChange,\n onBlur,\n onFocus,\n className,\n classNames = {},\n label,\n description,\n variant = \"outline\",\n color,\n size = \"md\",\n shape = \"default\",\n id,\n name,\n value,\n required,\n skeleton = false,\n },\n ref\n ) => {\n // `color` varsayılansız: \"renk açıkça verilmedi\" ile \"primary seçildi\"\n // ayrımı dinlenme halindeki kenarlığın nötr mü renkli mi olacağını\n // belirler (Faz 13 — checked OLMAYAN kutucuk mavi görünmemeli).\n // İşaretliyken çentiğin/açıklamanın rengi — renk verilmediyse `primary`.\n const fillColor = color ?? \"primary\";\n const [isChecked, setIsChecked] = useControllableState<boolean>({ value: checked, defaultValue: defaultChecked });\n\n const inputRef = useRef<HTMLInputElement>(null);\n const descriptionId = useId();\n useImperativeHandle(ref, () => inputRef.current!, []);\n\n const handleChange = (e: CheckboxChangeEvent) => {\n setIsChecked(e.target.checked);\n onChange?.(e);\n };\n\n useEffect(() => {\n if (inputRef.current) inputRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\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\", getSizeClasses(size), getShapeClasses(shape)))} />\n {label && <span {...skeletonBoxProps(cn(\"rounded-sm\", fontSizeClass[size]))}>{label}</span>}\n </span>\n );\n }\n\n const baseClasses = cn(\n \"shrink-0 cursor-pointer appearance-none border transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n getSizeClasses(size),\n getShapeClasses(shape),\n getVariantClasses(variant, color, indeterminate),\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames.checkbox,\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 <input\n ref={inputRef}\n id={id}\n type=\"checkbox\"\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 name={name}\n value={value}\n required={required}\n aria-describedby={description ? descriptionId : undefined}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n className={baseClasses}\n />\n {(indeterminate || isChecked) && (\n <span className={cn(\"absolute pointer-events-none\", getSizeClasses(size), \"flex items-center justify-center\")}>\n {indeterminate ? (\n <span className={cn(\"rounded-full\", bgSolidContrastClass[fillColor], getIndeterminateSizeClasses(size))} />\n ) : (\n <CheckIcon className={cn(textSolidContrastClass[fillColor], getCheckIconClass(size))} strokeWidth={3.5} />\n )}\n </span>\n )}\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\nCheckbox.displayName = \"Checkbox\";\n","import { cn, type ColorRole, type Size, type Variant } from \"@mari-ui/core\";\nimport {\n bgSolidClass,\n borderStrongColorClass,\n checkedBgSolidClass,\n checkedBgSolidHoverClass,\n checkedBorderSolidClass,\n textSolidContrastClass,\n} from \"../lib/colorClasses\";\nimport type { CheckboxShape } from \"./types\";\n\nconst SIZE_CLASS: Record<Size, string> = {\n sm: \"h-3 w-3 text-xs\",\n md: \"h-4 w-4 text-sm\",\n lg: \"h-5 w-5 text-base\",\n};\n\n/*\n * Çentik ikonu kutuyla orantılı — eskiden her boyutta sabit 16px'ti (sm'nin 12px kutusundan taşıyordu).\n */\nconst CHECK_ICON_CLASS: Record<Size, string> = {\n sm: \"size-2.5\",\n md: \"size-3\",\n lg: \"size-3.5\",\n};\n\n/** Belirsiz (indeterminate) hal: dolu kutunun ortasında yatay bir çizgi. */\nconst INDETERMINATE_SIZE_CLASS: Record<Size, string> = {\n sm: \"h-0.5 w-1.5\",\n md: \"h-0.5 w-2\",\n lg: \"h-0.5 w-2.5\",\n};\n\nexport function getSizeClasses(size: Size): string {\n return SIZE_CLASS[size];\n}\n\nexport function getIndeterminateSizeClasses(size: Size): string {\n return INDETERMINATE_SIZE_CLASS[size];\n}\n\nexport function getCheckIconClass(size: Size): string {\n return CHECK_ICON_CLASS[size];\n}\n\nexport function getShapeClasses(shape: CheckboxShape): string {\n // `pill` eskiden `px-4` da taşıyordu — 16px'lik kutu 34px'lik bir ovale dönüşüyordu.\n // Kutu köşesi, kontrol ölçeğinde (`rounded-sm`), radius preset'ini izler.\n return { square: \"rounded-none\", pill: \"rounded-full\", default: \"rounded-sm\" }[shape];\n}\n\n/**\n * `color` verilmediyse (yani gerçek bir doğrulama durumu YOKSA) dinlenme\n * halindeki (işaretsiz) kenarlık nötr/gri (`border-mari-input`) — sadece\n * işaretlenince `primary`e (veya AÇIKÇA verilen renge) bürünür. `color`\n * AÇIKÇA verildiyse (örn. `error`) o renk işaretli/işaretsiz HER ZAMAN\n * kalıcıdır (bkz. `input/utils.ts`'teki aynı desen).\n */\nexport function getVariantClasses(variant: Extract<Variant, \"solid\" | \"outline\">, color: ColorRole | undefined, indeterminate = false): string {\n const fillColor = color ?? \"primary\";\n // Belirsiz hal native `checked` DEĞİL — eskiden hiçbir dolgu almıyordu, iç\n // çubuk da yüzey renginde olduğu için kutu BOŞ görünüyordu.\n const indeterminateClass = indeterminate && cn(bgSolidClass[fillColor], \"border-transparent\");\n if (variant === \"solid\") {\n return cn(\"border-transparent bg-mari-surface-alt\", checkedBgSolidClass[fillColor], checkedBgSolidHoverClass[fillColor], indeterminateClass);\n }\n // Açıkça verilen renk (doğrulama durumu) dinlenmede de rol renginde (≥3:1).\n const restBorderClass = color ? borderStrongColorClass[color] : \"border-mari-input\";\n return cn(\"bg-mari-surface\", restBorderClass, checkedBgSolidClass[fillColor], checkedBorderSolidClass[fillColor], textSolidContrastClass[fillColor], indeterminateClass);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAEA,SAAgB,YAAY,WAAW,OAAO,qBAAqB,cAAc;AACjF,SAAS,iBAAiB;AAC1B,SAAS,MAAAA,KAAI,4BAA4B;;;ACJzC,SAAS,UAAmD;AAW5D,IAAM,aAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,IAAM,mBAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,2BAAiD;AAAA,EACrD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,SAAS,eAAe,MAAoB;AACjD,SAAO,WAAW,IAAI;AACxB;AAEO,SAAS,4BAA4B,MAAoB;AAC9D,SAAO,yBAAyB,IAAI;AACtC;AAEO,SAAS,kBAAkB,MAAoB;AACpD,SAAO,iBAAiB,IAAI;AAC9B;AAEO,SAAS,gBAAgB,OAA8B;AAG5D,SAAO,EAAE,QAAQ,gBAAgB,MAAM,gBAAgB,SAAS,aAAa,EAAE,KAAK;AACtF;AASO,SAAS,kBAAkB,SAAgD,OAA8B,gBAAgB,OAAe;AAC7I,QAAM,YAAY,SAAS;AAG3B,QAAM,qBAAqB,iBAAiB,GAAG,aAAa,SAAS,GAAG,oBAAoB;AAC5F,MAAI,YAAY,SAAS;AACvB,WAAO,GAAG,0CAA0C,oBAAoB,SAAS,GAAG,yBAAyB,SAAS,GAAG,kBAAkB;AAAA,EAC7I;AAEA,QAAM,kBAAkB,QAAQ,uBAAuB,KAAK,IAAI;AAChE,SAAO,GAAG,mBAAmB,iBAAiB,oBAAoB,SAAS,GAAG,wBAAwB,SAAS,GAAG,uBAAuB,SAAS,GAAG,kBAAkB;AACzK;;;ADCQ,SACE,KADF;AAnDR,IAAM,2BAA2B,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAE/D,IAAM,WAAW;AAAA,EACtB,CACE;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,CAAC;AAAA,IACd;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,GACA,QACG;AAKH,UAAM,YAAY,SAAS;AAC3B,UAAM,CAAC,WAAW,YAAY,IAAI,qBAA8B,EAAE,OAAO,SAAS,cAAc,eAAe,CAAC;AAEhH,UAAM,WAAW,OAAyB,IAAI;AAC9C,UAAM,gBAAgB,MAAM;AAC5B,wBAAoB,KAAK,MAAM,SAAS,SAAU,CAAC,CAAC;AAEpD,UAAM,eAAe,CAAC,MAA2B;AAC/C,mBAAa,EAAE,OAAO,OAAO;AAC7B,iBAAW,CAAC;AAAA,IACd;AAEA,cAAU,MAAM;AACd,UAAI,SAAS,QAAS,UAAS,QAAQ,gBAAgB;AAAA,IACzD,GAAG,CAAC,aAAa,CAAC;AAElB,QAAI,UAAU;AACZ,aACE,qBAAC,UAAK,eAAW,MAAC,WAAWC,IAAG,kCAAkC,WAAW,OAAO,GAClF;AAAA,4BAAC,UAAM,GAAG,iBAAiBA,IAAG,YAAY,eAAe,IAAI,GAAG,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAAA,QACzF,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,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,SAAS,OAAO,aAAa;AAAA,MAC/C,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;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA,MAAK;AAAA,YAEL;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,oBAAkB,cAAc,gBAAgB;AAAA,YAChD,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,WAAW;AAAA;AAAA,QACb;AAAA,SACE,iBAAiB,cACjB,oBAAC,UAAK,WAAWA,IAAG,gCAAgC,eAAe,IAAI,GAAG,kCAAkC,GACzG,0BACC,oBAAC,UAAK,WAAWA,IAAG,gBAAgB,qBAAqB,SAAS,GAAG,4BAA4B,IAAI,CAAC,GAAG,IAEzG,oBAAC,aAAU,WAAWA,IAAG,uBAAuB,SAAS,GAAG,kBAAkB,IAAI,CAAC,GAAG,aAAa,KAAK,GAE5G;AAAA,QAED,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,SAAS,cAAc;","names":["cn","cn"]}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
import {
|
|
4
4
|
useFieldGroup,
|
|
5
5
|
useFieldSkeleton
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NPFMPRII.js";
|
|
7
7
|
import {
|
|
8
8
|
touchTargetClass
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-POBOJBNJ.js";
|
|
10
10
|
import {
|
|
11
11
|
skeletonBoxProps
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-VKN374SD.js";
|
|
13
13
|
|
|
14
14
|
// src/segmented/Segmented.tsx
|
|
15
15
|
import { useId, useLayoutEffect, useRef, useState } from "react";
|
|
@@ -141,4 +141,4 @@ function Segmented({
|
|
|
141
141
|
export {
|
|
142
142
|
Segmented
|
|
143
143
|
};
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
144
|
+
//# sourceMappingURL=chunk-RLWP6NJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/segmented/Segmented.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn, useControllableState, type Size } from \"@mari-ui/core\";\nimport { useFieldGroup, useFieldSkeleton } from \"../lib/fieldContext\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { touchTargetClass } from \"../lib/sizeClasses\";\nimport type { SegmentedOption, SegmentedProps, SegmentedValue } from \"./types\";\n\nexport type { SegmentedProps };\n\n/** Kapsayıcı 2px dolgulu; dilim yüksekliği + 4px = Input/Select yüksekliği (24/32/40). */\nconst SEGMENT_SIZE: Record<Size, string> = {\n sm: \"h-5 px-2 text-xs gap-1\",\n md: \"h-7 px-3 text-sm gap-1.5\",\n lg: \"h-9 px-4 text-base gap-2\",\n};\n\nconst normalize = (option: SegmentedValue | SegmentedOption): SegmentedOption =>\n typeof option === \"object\" ? option : { value: option, label: String(option) };\n\n/**\n * Seçili dilimin altında kayan zemin (\"thumb\"). Konumu DOM'dan ölçülür ve\n * boyut değişince (pencere, `block`, yazı tipi yüklenmesi) yeniden ölçülür.\n * Ölçülene kadar (SSR, ilk kare) seçili dilim zemini kendisi çizer — boş görünmez.\n */\nfunction useThumb(containerRef: React.RefObject<HTMLDivElement | null>, selectedIndex: number) {\n const [rect, setRect] = useState<{ left: number; width: number } | null>(null);\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const measure = () => {\n const segment = container.querySelectorAll<HTMLElement>(\"[data-segment]\")[selectedIndex];\n setRect(segment ? { left: segment.offsetLeft, width: segment.offsetWidth } : null);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(container);\n return () => observer.disconnect();\n }, [containerRef, selectedIndex]);\n return rect;\n}\n\n/*\n * ant.design Segmented'ın yapısı, Tabs `pills`in görünümü (aynı\n * zemin, aynı kayan beyaz dilim). Tabs'ten ayrı çünkü anlamı farklı: Tabs bir\n * PANEL değiştirir (`tablist`), Segmented bir DEĞER seçer — form kontrolü.\n */\n/**\n * Erişilebilirlik: gerçek `<input type=\"radio\">`lar + `role=\"radiogroup\"`.\n * Ok tuşları seçimi taşır, Tab gruba tek durakla girer, `name` ile native\n * forma katılır, disabled seçenek atlanır — hepsi tarayıcının kendisinden.\n * Yalnız ikonlu seçenekte `aria-label` verin.\n */\nexport function Segmented({\n options,\n value,\n defaultValue,\n onChange,\n block = false,\n size = \"md\",\n disabled: ownDisabled = false,\n name,\n \"aria-label\": ownAriaLabel,\n \"aria-labelledby\": ownAriaLabelledBy,\n className,\n skeleton: ownSkeleton,\n}: Readonly<SegmentedProps>) {\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: ownDisabled });\n const skeleton = useFieldSkeleton(ownSkeleton);\n const { \"aria-label\": ariaLabel, \"aria-labelledby\": ariaLabelledBy } = field;\n const disabled = !!field.disabled;\n const items = options.map(normalize);\n const fallbackName = useId();\n const groupName = name ?? fallbackName;\n const [current, setCurrent] = useControllableState<SegmentedValue | undefined>({\n value,\n defaultValue: defaultValue ?? items.find((o) => !o.disabled)?.value,\n onChange: onChange as ((v: SegmentedValue | undefined) => void) | undefined,\n });\n const containerRef = useRef<HTMLDivElement>(null);\n const selectedIndex = items.findIndex((o) => o.value === current);\n const thumb = useThumb(containerRef, selectedIndex);\n\n const containerClass = cn(\"relative isolate inline-flex max-w-full rounded-lg bg-mari-surface-alt p-0.5\", block && \"flex w-full\");\n\n const segments = items.map((option, index) => {\n const selected = index === selectedIndex;\n const optionDisabled = disabled || option.disabled;\n return (\n <label\n key={String(option.value)}\n data-segment=\"\"\n className={cn(\n \"relative flex min-w-0 cursor-pointer items-center justify-center rounded-md font-medium transition-colors duration-150\",\n SEGMENT_SIZE[size],\n touchTargetClass[size],\n block && \"flex-1\",\n selected ? \"text-mari-foreground\" : \"text-mari-muted hover:text-mari-foreground\",\n // Kayan zemin ölçülene kadar seçili dilim kendi zeminini çizer.\n selected && !thumb && \"bg-mari-surface shadow-mari-sm ring-1 ring-mari-border/60\",\n optionDisabled && \"cursor-not-allowed opacity-50 hover:text-mari-muted\",\n // Odak halkası dilimin kendisinde (radyo görünmez).\n \"has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1 has-[:focus-visible]:outline-mari-ring\"\n )}\n >\n <input\n type=\"radio\"\n name={groupName}\n value={String(option.value)}\n checked={selected}\n disabled={optionDisabled}\n aria-label={option[\"aria-label\"]}\n onChange={() => setCurrent(option.value)}\n className=\"sr-only\"\n />\n {option.icon && (\n <span aria-hidden className=\"flex shrink-0 items-center [&>svg]:size-4\">\n {option.icon}\n </span>\n )}\n {option.label !== undefined && <span className=\"truncate\">{option.label}</span>}\n </label>\n );\n });\n\n if (skeleton) {\n // Gerçek dilimler görünmez olarak yerinde: iskelet ile yüklü hal birebir aynı genişlikte.\n return (\n <div {...skeletonBoxProps(cn(containerClass, \"rounded-lg\", className))}>\n <div className=\"invisible flex w-full\">{segments}</div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\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-disabled={disabled || undefined}\n className={cn(containerClass, className)}\n >\n {thumb && selectedIndex >= 0 && (\n <span\n aria-hidden\n className=\"absolute inset-y-0.5 -z-10 rounded-md bg-mari-surface shadow-mari-sm ring-1 ring-mari-border/60 transition-[left,width] duration-200 ease-out motion-reduce:transition-none\"\n style={{ left: thumb.left, width: thumb.width }}\n />\n )}\n {segments}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
skeletonFill
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VKN374SD.js";
|
|
6
6
|
|
|
7
7
|
// src/lib/ContentSkeleton.tsx
|
|
8
8
|
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
@@ -98,4 +98,4 @@ function ContentSkeleton({ on, fallback, className, children }) {
|
|
|
98
98
|
export {
|
|
99
99
|
ContentSkeleton
|
|
100
100
|
};
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
101
|
+
//# sourceMappingURL=chunk-RMNV2CE2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/ContentSkeleton.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonFill } from \"./skeleton\";\n\ninterface Block {\n left: number;\n top: number;\n width: number;\n height: number;\n radius: string;\n}\n\n/** Tek başına tek blok olan öğeler (içine inilmez). */\nconst CONTROL_SELECTOR =\n 'input:not([type=\"hidden\"]), textarea, select, button, img, svg, video, canvas, [role=\"button\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"radio\"], [role=\"slider\"], [role=\"img\"]';\n\n/** Bundan küçük kutular (ör. `sr-only` native input'lar) atlanır. */\nconst MIN_SIZE = 4;\n\nfunction isTransparent(color: string): boolean {\n return color === \"transparent\" || /rgba?\\([^)]*,\\s*0\\)$/.test(color) || color.endsWith(\" / 0)\");\n}\n\n/**\n * Metinsiz ve dört kenarı çerçeveli (ya da dolgulu) kutu: Input'un kenarlıklı\n * sarmalayıcısı, Checkbox'ın kutusu gibi. İçindeki native input yerine bu\n * kutunun kendisi (radius'uyla) tek blok olur.\n */\nfunction isVisualBox(el: Element, style: CSSStyleDeclaration): boolean {\n if (el.textContent?.trim()) return false;\n const framed = [\"Top\", \"Right\", \"Bottom\", \"Left\"].every((side) => parseFloat(style.getPropertyValue(`border-${side.toLowerCase()}-width`)) > 0);\n return framed || !isTransparent(style.backgroundColor);\n}\n\nfunction measure(root: HTMLElement): Block[] {\n const origin = root.getBoundingClientRect();\n // `getBoundingClientRect` atalardaki transform'u içerir: Modal açılırken\n // `scale(0.98)`den başlar ve ölçüm o anda yapılır — bloklar %2 dar kalıyordu\n // (transform değişimi ResizeObserver'ı tetiklemez). Ölçek çarpanıyla\n // düzeltilir; bloklar transform'un İÇİNDE çizildiği için yerel px gerekir.\n const scale = root.offsetWidth > 0 && origin.width > 0 ? origin.width / root.offsetWidth : 1;\n const blocks: Block[] = [];\n /** Viewport koordinatlı kutu → bölgeye göreli, ölçeksiz blok. */\n const push = (x: number, y: number, w: number, h: number, radius: string) => {\n const left = Math.max(x - origin.left, 0) / scale;\n // `truncate`lı metnin satır kutusu kırpılan kısmı da kapsar — bölgeye sığdır.\n const width = Math.min(x + w - origin.left, origin.width) / scale - left;\n const height = h / scale;\n if (width < MIN_SIZE || height < MIN_SIZE) return;\n blocks.push({ left, top: (y - origin.top) / scale, width, height, radius });\n };\n\n /** Satır başına bir çubuk; yüksekliği yazı boyuna göre (satır aralığı değil). */\n const pushTextLines = (text: Node, parent: Element) => {\n if (!text.textContent?.trim()) return;\n const range = document.createRange();\n range.selectNodeContents(text);\n // jsdom'da yok → blok üretilmez, `fallback` devreye girer.\n if (typeof range.getClientRects !== \"function\") return;\n const fontSize = parseFloat(getComputedStyle(parent).fontSize) || 16;\n for (const line of Array.from(range.getClientRects())) {\n const height = Math.min(line.height, fontSize * 0.8);\n push(line.left, line.top + (line.height - height) / 2, line.width, height, \"0.25rem\");\n }\n };\n\n const walk = (el: Element) => {\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === Node.TEXT_NODE) pushTextLines(node, el);\n else if (node instanceof Element) visit(node);\n }\n };\n\n const visit = (el: Element) => {\n const style = getComputedStyle(el);\n if (style.display === \"none\") return;\n // Yalnız ekran okuyucu için (sr-only: 1×1px kırpılmış kutu) — görünmeyen metnin\n // satır ölçüsü yine tam genişlik döner; iskelette fazladan çubuk çiziliyordu.\n const box = el.getBoundingClientRect();\n if (box.width <= 1 && box.height <= 1) return;\n if (!el.matches(CONTROL_SELECTOR) && !isVisualBox(el, style)) {\n walk(el);\n return;\n }\n const rect = el.getBoundingClientRect();\n // Kendi radius'u olmayan öğe (ikon SVG'si, düz img) keskin kare değil, metin çubukları gibi hafif yuvarlak.\n const radius = style.borderRadius && style.borderRadius !== \"0px\" ? style.borderRadius : \"0.25rem\";\n push(rect.left, rect.top, rect.width, rect.height, radius);\n };\n\n walk(root);\n return blocks;\n}\n\nexport interface ContentSkeletonProps {\n on: boolean;\n /** Ölçülecek içerik yoksa (veri henüz gelmedi) gösterilecek genel iskelet. */\n fallback: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Serbest içeriğin (Drawer/Modal gövdesi) KENDİ şeklinde iskeleti.\n * Gerçek içerik görünmez olarak yerinde çizilir (yükseklik korunur, yüklenince\n * zıplama olmaz), sonra her metin satırının ve her kontrolün (input, düğme,\n * checkbox kutusu…) kutusu ölçülüp üstüne bir blok konur. Genel \"6 satır\n * paragraf\" iskeleti bir formun yanında yarım kalmış görünüyordu.\n *\n * Ölçülecek bir şey yoksa (içerik boş ya da jsdom gibi yerleşimsiz ortam)\n * `fallback` gösterilir. Boyut değişince (pencere, çekmece genişliği)\n * `ResizeObserver` ile yeniden ölçülür.\n */\nexport function ContentSkeleton({ on, fallback, className, children }: Readonly<ContentSkeletonProps>) {\n const contentRef = useRef<HTMLDivElement>(null);\n const [blocks, setBlocks] = useState<Block[] | null>(null);\n\n const remeasure = useCallback(() => {\n if (contentRef.current) setBlocks(measure(contentRef.current));\n }, []);\n\n useLayoutEffect(() => {\n if (!on) {\n setBlocks(null);\n return;\n }\n remeasure();\n const content = contentRef.current;\n if (!content || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(remeasure);\n observer.observe(content);\n return () => observer.disconnect();\n }, [on, children, remeasure]);\n\n if (!on) return <>{children}</>;\n\n const empty = blocks !== null && blocks.length === 0;\n return (\n <div aria-hidden data-skeleton=\"\" className={cn(\"pointer-events-none relative select-none\", className)}>\n <div ref={contentRef} className={cn(\"invisible\", empty && \"absolute inset-x-0 top-0\")}>\n {children}\n </div>\n {empty\n ? fallback\n : blocks?.map((block, i) => (\n <span\n // Bloklar her ölçümde baştan üretilir; sıra kararlı.\n key={i}\n className={cn(\"absolute\", skeletonFill(true))}\n style={{ left: block.left, top: block.top, width: block.width, height: block.height, borderRadius: block.radius }}\n />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;AAEA,SAAgB,aAAa,iBAAiB,QAAQ,gBAAgB;AACtE,SAAS,UAAU;AAqID,wBAId,YAJc;AAzHlB,IAAM,mBACJ;AAGF,IAAM,WAAW;AAEjB,SAAS,cAAc,OAAwB;AAC7C,SAAO,UAAU,iBAAiB,uBAAuB,KAAK,KAAK,KAAK,MAAM,SAAS,OAAO;AAChG;AAOA,SAAS,YAAY,IAAa,OAAqC;AACrE,MAAI,GAAG,aAAa,KAAK,EAAG,QAAO;AACnC,QAAM,SAAS,CAAC,OAAO,SAAS,UAAU,MAAM,EAAE,MAAM,CAAC,SAAS,WAAW,MAAM,iBAAiB,UAAU,KAAK,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9I,SAAO,UAAU,CAAC,cAAc,MAAM,eAAe;AACvD;AAEA,SAAS,QAAQ,MAA4B;AAC3C,QAAM,SAAS,KAAK,sBAAsB;AAK1C,QAAM,QAAQ,KAAK,cAAc,KAAK,OAAO,QAAQ,IAAI,OAAO,QAAQ,KAAK,cAAc;AAC3F,QAAM,SAAkB,CAAC;AAEzB,QAAM,OAAO,CAAC,GAAW,GAAW,GAAW,GAAW,WAAmB;AAC3E,UAAM,OAAO,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI;AAE5C,UAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,OAAO,MAAM,OAAO,KAAK,IAAI,QAAQ;AACpE,UAAM,SAAS,IAAI;AACnB,QAAI,QAAQ,YAAY,SAAS,SAAU;AAC3C,WAAO,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,CAAC;AAAA,EAC5E;AAGA,QAAM,gBAAgB,CAAC,MAAY,WAAoB;AACrD,QAAI,CAAC,KAAK,aAAa,KAAK,EAAG;AAC/B,UAAM,QAAQ,SAAS,YAAY;AACnC,UAAM,mBAAmB,IAAI;AAE7B,QAAI,OAAO,MAAM,mBAAmB,WAAY;AAChD,UAAM,WAAW,WAAW,iBAAiB,MAAM,EAAE,QAAQ,KAAK;AAClE,eAAW,QAAQ,MAAM,KAAK,MAAM,eAAe,CAAC,GAAG;AACrD,YAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,WAAW,GAAG;AACnD,WAAK,KAAK,MAAM,KAAK,OAAO,KAAK,SAAS,UAAU,GAAG,KAAK,OAAO,QAAQ,SAAS;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,OAAgB;AAC5B,eAAW,QAAQ,MAAM,KAAK,GAAG,UAAU,GAAG;AAC5C,UAAI,KAAK,aAAa,KAAK,UAAW,eAAc,MAAM,EAAE;AAAA,eACnD,gBAAgB,QAAS,OAAM,IAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,OAAgB;AAC7B,UAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAI,MAAM,YAAY,OAAQ;AAG9B,UAAM,MAAM,GAAG,sBAAsB;AACrC,QAAI,IAAI,SAAS,KAAK,IAAI,UAAU,EAAG;AACvC,QAAI,CAAC,GAAG,QAAQ,gBAAgB,KAAK,CAAC,YAAY,IAAI,KAAK,GAAG;AAC5D,WAAK,EAAE;AACP;AAAA,IACF;AACA,UAAM,OAAO,GAAG,sBAAsB;AAEtC,UAAM,SAAS,MAAM,gBAAgB,MAAM,iBAAiB,QAAQ,MAAM,eAAe;AACzF,SAAK,KAAK,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ,MAAM;AAAA,EAC3D;AAEA,OAAK,IAAI;AACT,SAAO;AACT;AAqBO,SAAS,gBAAgB,EAAE,IAAI,UAAU,WAAW,SAAS,GAAmC;AACrG,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAyB,IAAI;AAEzD,QAAM,YAAY,YAAY,MAAM;AAClC,QAAI,WAAW,QAAS,WAAU,QAAQ,WAAW,OAAO,CAAC;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,kBAAgB,MAAM;AACpB,QAAI,CAAC,IAAI;AACP,gBAAU,IAAI;AACd;AAAA,IACF;AACA,cAAU;AACV,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,WAAW,OAAO,mBAAmB,YAAa;AACvD,UAAM,WAAW,IAAI,eAAe,SAAS;AAC7C,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,IAAI,UAAU,SAAS,CAAC;AAE5B,MAAI,CAAC,GAAI,QAAO,gCAAG,UAAS;AAE5B,QAAM,QAAQ,WAAW,QAAQ,OAAO,WAAW;AACnD,SACE,qBAAC,SAAI,eAAW,MAAC,iBAAc,IAAG,WAAW,GAAG,4CAA4C,SAAS,GACnG;AAAA,wBAAC,SAAI,KAAK,YAAY,WAAW,GAAG,aAAa,SAAS,0BAA0B,GACjF,UACH;AAAA,IACC,QACG,WACA,QAAQ,IAAI,CAAC,OAAO,MAClB;AAAA,MAAC;AAAA;AAAA,QAGC,WAAW,GAAG,YAAY,aAAa,IAAI,CAAC;AAAA,QAC5C,OAAO,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,MAAM,OAAO,QAAQ,MAAM,QAAQ,cAAc,MAAM,OAAO;AAAA;AAAA,MAF3G;AAAA,IAGP,CACD;AAAA,KACP;AAEJ;","names":[]}
|