@handijit/ui 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +872 -2
- package/build/base.css +1 -0
- package/build/charts.cjs +2 -0
- package/build/charts.cjs.map +1 -0
- package/build/charts.css +1 -0
- package/build/charts.js +1865 -0
- package/build/charts.js.map +1 -0
- package/build/chat.cjs +4 -0
- package/build/chat.cjs.map +1 -0
- package/build/chat.css +1 -0
- package/build/chat.js +1120 -0
- package/build/chat.js.map +1 -0
- package/build/components/Accordion/index.cjs +2 -0
- package/build/components/Accordion/index.cjs.map +1 -0
- package/build/components/Accordion/index.d.ts +29 -0
- package/build/components/Accordion/index.js +42 -0
- package/build/components/Accordion/index.js.map +1 -0
- package/build/components/Accordion/style.css +1 -0
- package/build/components/Alert/index.cjs +2 -0
- package/build/components/Alert/index.cjs.map +1 -0
- package/build/components/Alert/index.d.ts +15 -0
- package/build/components/Alert/index.js +30 -0
- package/build/components/Alert/index.js.map +1 -0
- package/build/components/Alert/style.css +1 -0
- package/build/components/Avatar/index.cjs +2 -0
- package/build/components/Avatar/index.cjs.map +1 -0
- package/build/components/Avatar/index.d.ts +26 -0
- package/build/components/Avatar/index.js +57 -0
- package/build/components/Avatar/index.js.map +1 -0
- package/build/components/Avatar/style.css +1 -0
- package/build/components/Badge/index.cjs +2 -0
- package/build/components/Badge/index.cjs.map +1 -0
- package/build/components/Badge/index.d.ts +26 -0
- package/build/components/Badge/index.js +26 -0
- package/build/components/Badge/index.js.map +1 -0
- package/build/components/Badge/style.css +1 -0
- package/build/components/BottomSheet/index.cjs +2 -0
- package/build/components/BottomSheet/index.cjs.map +1 -0
- package/build/components/BottomSheet/index.d.ts +21 -0
- package/build/components/BottomSheet/index.js +85 -0
- package/build/components/BottomSheet/index.js.map +1 -0
- package/build/components/BottomSheet/style.css +1 -0
- package/build/components/Breadcrumb/index.cjs +2 -0
- package/build/components/Breadcrumb/index.cjs.map +1 -0
- package/build/components/Breadcrumb/index.d.ts +20 -0
- package/build/components/Breadcrumb/index.js +31 -0
- package/build/components/Breadcrumb/index.js.map +1 -0
- package/build/components/Breadcrumb/style.css +1 -0
- package/build/components/Button/index.cjs +2 -0
- package/build/components/Button/index.cjs.map +1 -0
- package/build/components/Button/index.d.ts +32 -0
- package/build/components/Button/index.js +88 -0
- package/build/components/Button/index.js.map +1 -0
- package/build/components/Button/style.css +1 -0
- package/build/components/Card/index.cjs +2 -0
- package/build/components/Card/index.cjs.map +1 -0
- package/build/components/Card/index.d.ts +51 -0
- package/build/components/Card/index.js +58 -0
- package/build/components/Card/index.js.map +1 -0
- package/build/components/Card/style.css +1 -0
- package/build/components/Carousel/index.cjs +2 -0
- package/build/components/Carousel/index.cjs.map +1 -0
- package/build/components/Carousel/index.d.ts +24 -0
- package/build/components/Carousel/index.js +111 -0
- package/build/components/Carousel/index.js.map +1 -0
- package/build/components/Carousel/style.css +1 -0
- package/build/components/Checkbox/index.cjs +2 -0
- package/build/components/Checkbox/index.cjs.map +1 -0
- package/build/components/Checkbox/index.d.ts +10 -0
- package/build/components/Checkbox/index.js +33 -0
- package/build/components/Checkbox/index.js.map +1 -0
- package/build/components/Checkbox/style.css +1 -0
- package/build/components/Chip/index.cjs +2 -0
- package/build/components/Chip/index.cjs.map +1 -0
- package/build/components/Chip/index.d.ts +27 -0
- package/build/components/Chip/index.js +67 -0
- package/build/components/Chip/index.js.map +1 -0
- package/build/components/Chip/style.css +1 -0
- package/build/components/ChipGroup/index.cjs +2 -0
- package/build/components/ChipGroup/index.cjs.map +1 -0
- package/build/components/ChipGroup/index.d.ts +34 -0
- package/build/components/ChipGroup/index.js +64 -0
- package/build/components/ChipGroup/index.js.map +1 -0
- package/build/components/ChipGroup/style.css +1 -0
- package/build/components/CodeBadge/index.cjs +2 -0
- package/build/components/CodeBadge/index.cjs.map +1 -0
- package/build/components/CodeBadge/index.d.ts +36 -0
- package/build/components/CodeBadge/index.js +62 -0
- package/build/components/CodeBadge/index.js.map +1 -0
- package/build/components/CodeBadge/style.css +1 -0
- package/build/components/Combobox/index.cjs +2 -0
- package/build/components/Combobox/index.cjs.map +1 -0
- package/build/components/Combobox/index.d.ts +6 -0
- package/build/components/Combobox/index.js +302 -0
- package/build/components/Combobox/index.js.map +1 -0
- package/build/components/Combobox/style.css +1 -0
- package/build/components/CommandPalette/index.cjs +2 -0
- package/build/components/CommandPalette/index.cjs.map +1 -0
- package/build/components/CommandPalette/index.d.ts +37 -0
- package/build/components/CommandPalette/index.js +181 -0
- package/build/components/CommandPalette/index.js.map +1 -0
- package/build/components/CommandPalette/style.css +1 -0
- package/build/components/ConfirmDialog/index.cjs +2 -0
- package/build/components/ConfirmDialog/index.cjs.map +1 -0
- package/build/components/ConfirmDialog/index.d.ts +34 -0
- package/build/components/ConfirmDialog/index.js +85 -0
- package/build/components/ConfirmDialog/index.js.map +1 -0
- package/build/components/CopyField/index.cjs +2 -0
- package/build/components/CopyField/index.cjs.map +1 -0
- package/build/components/CopyField/index.d.ts +20 -0
- package/build/components/CopyField/index.js +44 -0
- package/build/components/CopyField/index.js.map +1 -0
- package/build/components/CopyField/style.css +1 -0
- package/build/components/DataTable/index.cjs +2 -0
- package/build/components/DataTable/index.cjs.map +1 -0
- package/build/components/DataTable/index.d.ts +60 -0
- package/build/components/DataTable/index.js +109 -0
- package/build/components/DataTable/index.js.map +1 -0
- package/build/components/DataTable/style.css +1 -0
- package/build/components/DateField/index.cjs +2 -0
- package/build/components/DateField/index.cjs.map +1 -0
- package/build/components/DateField/index.d.ts +44 -0
- package/build/components/DateField/index.js +79 -0
- package/build/components/DateField/index.js.map +1 -0
- package/build/components/DateField/style.css +1 -0
- package/build/components/Directory/index.cjs +2 -0
- package/build/components/Directory/index.cjs.map +1 -0
- package/build/components/Directory/index.d.ts +51 -0
- package/build/components/Directory/index.js +46 -0
- package/build/components/Directory/index.js.map +1 -0
- package/build/components/Directory/style.css +1 -0
- package/build/components/Disclosure/index.cjs +2 -0
- package/build/components/Disclosure/index.cjs.map +1 -0
- package/build/components/Disclosure/index.d.ts +34 -0
- package/build/components/Disclosure/index.js +64 -0
- package/build/components/Disclosure/index.js.map +1 -0
- package/build/components/Disclosure/style.css +1 -0
- package/build/components/Divider/index.cjs +2 -0
- package/build/components/Divider/index.cjs.map +1 -0
- package/build/components/Divider/index.d.ts +10 -0
- package/build/components/Divider/index.js +24 -0
- package/build/components/Divider/index.js.map +1 -0
- package/build/components/Divider/style.css +1 -0
- package/build/components/Drawer/index.cjs +2 -0
- package/build/components/Drawer/index.cjs.map +1 -0
- package/build/components/Drawer/index.d.ts +22 -0
- package/build/components/Drawer/index.js +88 -0
- package/build/components/Drawer/index.js.map +1 -0
- package/build/components/Drawer/style.css +1 -0
- package/build/components/EmptyState/index.cjs +2 -0
- package/build/components/EmptyState/index.cjs.map +1 -0
- package/build/components/EmptyState/index.d.ts +19 -0
- package/build/components/EmptyState/index.js +35 -0
- package/build/components/EmptyState/index.js.map +1 -0
- package/build/components/EmptyState/style.css +1 -0
- package/build/components/Field/index.cjs +2 -0
- package/build/components/Field/index.cjs.map +1 -0
- package/build/components/Field/index.d.ts +31 -0
- package/build/components/Field/index.js +52 -0
- package/build/components/Field/index.js.map +1 -0
- package/build/components/Field/style.css +1 -0
- package/build/components/FileUpload/index.cjs +2 -0
- package/build/components/FileUpload/index.cjs.map +1 -0
- package/build/components/FileUpload/index.d.ts +42 -0
- package/build/components/FileUpload/index.js +145 -0
- package/build/components/FileUpload/index.js.map +1 -0
- package/build/components/FileUpload/style.css +1 -0
- package/build/components/FilterBar/index.cjs +2 -0
- package/build/components/FilterBar/index.cjs.map +1 -0
- package/build/components/FilterBar/index.d.ts +28 -0
- package/build/components/FilterBar/index.js +35 -0
- package/build/components/FilterBar/index.js.map +1 -0
- package/build/components/FilterBar/style.css +1 -0
- package/build/components/IconButton/index.cjs +2 -0
- package/build/components/IconButton/index.cjs.map +1 -0
- package/build/components/IconButton/index.d.ts +22 -0
- package/build/components/IconButton/index.js +61 -0
- package/build/components/IconButton/index.js.map +1 -0
- package/build/components/IconButton/style.css +1 -0
- package/build/components/Input/index.cjs +2 -0
- package/build/components/Input/index.cjs.map +1 -0
- package/build/components/Input/index.d.ts +15 -0
- package/build/components/Input/index.js +52 -0
- package/build/components/Input/index.js.map +1 -0
- package/build/components/Input/style.css +1 -0
- package/build/components/Kbd/index.cjs +2 -0
- package/build/components/Kbd/index.cjs.map +1 -0
- package/build/components/Kbd/index.d.ts +12 -0
- package/build/components/Kbd/index.js +13 -0
- package/build/components/Kbd/index.js.map +1 -0
- package/build/components/Kbd/style.css +1 -0
- package/build/components/Link/index.cjs +2 -0
- package/build/components/Link/index.cjs.map +1 -0
- package/build/components/Link/index.d.ts +5 -0
- package/build/components/Link/index.js +11 -0
- package/build/components/Link/index.js.map +1 -0
- package/build/components/Menu/index.cjs +2 -0
- package/build/components/Menu/index.cjs.map +1 -0
- package/build/components/Menu/index.d.ts +46 -0
- package/build/components/Menu/index.js +241 -0
- package/build/components/Menu/index.js.map +1 -0
- package/build/components/Menu/style.css +1 -0
- package/build/components/Modal/index.cjs +2 -0
- package/build/components/Modal/index.cjs.map +1 -0
- package/build/components/Modal/index.d.ts +28 -0
- package/build/components/Modal/index.js +92 -0
- package/build/components/Modal/index.js.map +1 -0
- package/build/components/Modal/style.css +1 -0
- package/build/components/PageHeader/index.cjs +2 -0
- package/build/components/PageHeader/index.cjs.map +1 -0
- package/build/components/PageHeader/index.d.ts +24 -0
- package/build/components/PageHeader/index.js +34 -0
- package/build/components/PageHeader/index.js.map +1 -0
- package/build/components/PageHeader/style.css +1 -0
- package/build/components/Pagination/index.cjs +2 -0
- package/build/components/Pagination/index.cjs.map +1 -0
- package/build/components/Pagination/index.d.ts +39 -0
- package/build/components/Pagination/index.js +128 -0
- package/build/components/Pagination/index.js.map +1 -0
- package/build/components/Pagination/style.css +1 -0
- package/build/components/Panel/index.cjs +2 -0
- package/build/components/Panel/index.cjs.map +1 -0
- package/build/components/Panel/index.d.ts +43 -0
- package/build/components/Panel/index.js +55 -0
- package/build/components/Panel/index.js.map +1 -0
- package/build/components/Panel/style.css +1 -0
- package/build/components/PasswordInput/index.cjs +2 -0
- package/build/components/PasswordInput/index.cjs.map +1 -0
- package/build/components/PasswordInput/index.d.ts +14 -0
- package/build/components/PasswordInput/index.js +40 -0
- package/build/components/PasswordInput/index.js.map +1 -0
- package/build/components/PasswordInput/style.css +1 -0
- package/build/components/Popover/index.cjs +2 -0
- package/build/components/Popover/index.cjs.map +1 -0
- package/build/components/Popover/index.d.ts +20 -0
- package/build/components/Popover/index.js +91 -0
- package/build/components/Popover/index.js.map +1 -0
- package/build/components/Popover/style.css +1 -0
- package/build/components/Price/index.cjs +2 -0
- package/build/components/Price/index.cjs.map +1 -0
- package/build/components/Price/index.d.ts +22 -0
- package/build/components/Price/index.js +46 -0
- package/build/components/Price/index.js.map +1 -0
- package/build/components/Price/style.css +1 -0
- package/build/components/Progress/index.cjs +2 -0
- package/build/components/Progress/index.cjs.map +1 -0
- package/build/components/Progress/index.d.ts +49 -0
- package/build/components/Progress/index.js +120 -0
- package/build/components/Progress/index.js.map +1 -0
- package/build/components/Progress/style.css +1 -0
- package/build/components/PromptDialog/index.cjs +2 -0
- package/build/components/PromptDialog/index.cjs.map +1 -0
- package/build/components/PromptDialog/index.d.ts +36 -0
- package/build/components/PromptDialog/index.js +119 -0
- package/build/components/PromptDialog/index.js.map +1 -0
- package/build/components/PromptDialog/style.css +1 -0
- package/build/components/QuantityStepper/index.cjs +2 -0
- package/build/components/QuantityStepper/index.cjs.map +1 -0
- package/build/components/QuantityStepper/index.d.ts +21 -0
- package/build/components/QuantityStepper/index.js +106 -0
- package/build/components/QuantityStepper/index.js.map +1 -0
- package/build/components/QuantityStepper/style.css +1 -0
- package/build/components/Radio/index.cjs +2 -0
- package/build/components/Radio/index.cjs.map +1 -0
- package/build/components/Radio/index.d.ts +12 -0
- package/build/components/Radio/index.js +35 -0
- package/build/components/Radio/index.js.map +1 -0
- package/build/components/Radio/style.css +1 -0
- package/build/components/RadioCard/index.cjs +2 -0
- package/build/components/RadioCard/index.cjs.map +1 -0
- package/build/components/RadioCard/index.d.ts +16 -0
- package/build/components/RadioCard/index.js +48 -0
- package/build/components/RadioCard/index.js.map +1 -0
- package/build/components/RadioCard/style.css +1 -0
- package/build/components/RangeSlider/index.cjs +2 -0
- package/build/components/RangeSlider/index.cjs.map +1 -0
- package/build/components/RangeSlider/index.d.ts +26 -0
- package/build/components/RangeSlider/index.js +102 -0
- package/build/components/RangeSlider/index.js.map +1 -0
- package/build/components/RangeSlider/style.css +1 -0
- package/build/components/Rating/index.cjs +2 -0
- package/build/components/Rating/index.cjs.map +1 -0
- package/build/components/Rating/index.d.ts +16 -0
- package/build/components/Rating/index.js +29 -0
- package/build/components/Rating/index.js.map +1 -0
- package/build/components/Rating/style.css +1 -0
- package/build/components/RatingInput/index.cjs +2 -0
- package/build/components/RatingInput/index.cjs.map +1 -0
- package/build/components/RatingInput/index.d.ts +21 -0
- package/build/components/RatingInput/index.js +75 -0
- package/build/components/RatingInput/index.js.map +1 -0
- package/build/components/RatingInput/style.css +1 -0
- package/build/components/ScrollArea/index.cjs +2 -0
- package/build/components/ScrollArea/index.cjs.map +1 -0
- package/build/components/ScrollArea/index.d.ts +23 -0
- package/build/components/ScrollArea/index.js +65 -0
- package/build/components/ScrollArea/index.js.map +1 -0
- package/build/components/ScrollArea/style.css +1 -0
- package/build/components/SectionHeader/index.cjs +2 -0
- package/build/components/SectionHeader/index.cjs.map +1 -0
- package/build/components/SectionHeader/index.d.ts +17 -0
- package/build/components/SectionHeader/index.js +25 -0
- package/build/components/SectionHeader/index.js.map +1 -0
- package/build/components/SectionHeader/style.css +1 -0
- package/build/components/SegmentedControl/index.cjs +2 -0
- package/build/components/SegmentedControl/index.cjs.map +1 -0
- package/build/components/SegmentedControl/index.d.ts +24 -0
- package/build/components/SegmentedControl/index.js +69 -0
- package/build/components/SegmentedControl/index.js.map +1 -0
- package/build/components/SegmentedControl/style.css +1 -0
- package/build/components/Select/index.cjs +2 -0
- package/build/components/Select/index.cjs.map +1 -0
- package/build/components/Select/index.d.ts +39 -0
- package/build/components/Select/index.js +179 -0
- package/build/components/Select/index.js.map +1 -0
- package/build/components/Select/style.css +1 -0
- package/build/components/Skeleton/index.cjs +2 -0
- package/build/components/Skeleton/index.cjs.map +1 -0
- package/build/components/Skeleton/index.d.ts +25 -0
- package/build/components/Skeleton/index.js +50 -0
- package/build/components/Skeleton/index.js.map +1 -0
- package/build/components/Skeleton/style.css +1 -0
- package/build/components/Spinner/index.cjs +2 -0
- package/build/components/Spinner/index.cjs.map +1 -0
- package/build/components/Spinner/index.d.ts +11 -0
- package/build/components/Spinner/index.js +15 -0
- package/build/components/Spinner/index.js.map +1 -0
- package/build/components/Spinner/style.css +1 -0
- package/build/components/Stat/index.cjs +2 -0
- package/build/components/Stat/index.cjs.map +1 -0
- package/build/components/Stat/index.d.ts +34 -0
- package/build/components/Stat/index.js +72 -0
- package/build/components/Stat/index.js.map +1 -0
- package/build/components/Stat/style.css +1 -0
- package/build/components/StatusDot/index.cjs +2 -0
- package/build/components/StatusDot/index.cjs.map +1 -0
- package/build/components/StatusDot/index.d.ts +23 -0
- package/build/components/StatusDot/index.js +23 -0
- package/build/components/StatusDot/index.js.map +1 -0
- package/build/components/StatusDot/style.css +1 -0
- package/build/components/Steps/index.cjs +2 -0
- package/build/components/Steps/index.cjs.map +1 -0
- package/build/components/Steps/index.d.ts +23 -0
- package/build/components/Steps/index.js +69 -0
- package/build/components/Steps/index.js.map +1 -0
- package/build/components/Steps/style.css +1 -0
- package/build/components/SummaryCard/index.cjs +2 -0
- package/build/components/SummaryCard/index.cjs.map +1 -0
- package/build/components/SummaryCard/index.d.ts +24 -0
- package/build/components/SummaryCard/index.js +33 -0
- package/build/components/SummaryCard/index.js.map +1 -0
- package/build/components/SummaryCard/style.css +1 -0
- package/build/components/Switch/index.cjs +2 -0
- package/build/components/Switch/index.cjs.map +1 -0
- package/build/components/Switch/index.d.ts +16 -0
- package/build/components/Switch/index.js +42 -0
- package/build/components/Switch/index.js.map +1 -0
- package/build/components/Switch/style.css +1 -0
- package/build/components/Table/index.cjs +2 -0
- package/build/components/Table/index.cjs.map +1 -0
- package/build/components/Table/index.d.ts +28 -0
- package/build/components/Table/index.js +58 -0
- package/build/components/Table/index.js.map +1 -0
- package/build/components/Table/style.css +1 -0
- package/build/components/TableCheckbox/index.cjs +2 -0
- package/build/components/TableCheckbox/index.cjs.map +1 -0
- package/build/components/TableCheckbox/index.d.ts +15 -0
- package/build/components/TableCheckbox/index.js +31 -0
- package/build/components/TableCheckbox/index.js.map +1 -0
- package/build/components/TableCheckbox/style.css +1 -0
- package/build/components/Tabs/index.cjs +2 -0
- package/build/components/Tabs/index.cjs.map +1 -0
- package/build/components/Tabs/index.d.ts +27 -0
- package/build/components/Tabs/index.js +102 -0
- package/build/components/Tabs/index.js.map +1 -0
- package/build/components/Tabs/style.css +1 -0
- package/build/components/TagInput/index.cjs +2 -0
- package/build/components/TagInput/index.cjs.map +1 -0
- package/build/components/TagInput/index.d.ts +25 -0
- package/build/components/TagInput/index.js +124 -0
- package/build/components/TagInput/index.js.map +1 -0
- package/build/components/TagInput/style.css +1 -0
- package/build/components/TextLink/index.cjs +2 -0
- package/build/components/TextLink/index.cjs.map +1 -0
- package/build/components/TextLink/index.d.ts +16 -0
- package/build/components/TextLink/index.js +32 -0
- package/build/components/TextLink/index.js.map +1 -0
- package/build/components/TextLink/style.css +1 -0
- package/build/components/Textarea/index.cjs +2 -0
- package/build/components/Textarea/index.cjs.map +1 -0
- package/build/components/Textarea/index.d.ts +20 -0
- package/build/components/Textarea/index.js +68 -0
- package/build/components/Textarea/index.js.map +1 -0
- package/build/components/Textarea/style.css +1 -0
- package/build/components/Tile/index.cjs +2 -0
- package/build/components/Tile/index.cjs.map +1 -0
- package/build/components/Tile/index.d.ts +19 -0
- package/build/components/Tile/index.js +24 -0
- package/build/components/Tile/index.js.map +1 -0
- package/build/components/Tile/style.css +1 -0
- package/build/components/Timeline/index.cjs +2 -0
- package/build/components/Timeline/index.cjs.map +1 -0
- package/build/components/Timeline/index.d.ts +24 -0
- package/build/components/Timeline/index.js +56 -0
- package/build/components/Timeline/index.js.map +1 -0
- package/build/components/Timeline/style.css +1 -0
- package/build/components/Toast/index.cjs +2 -0
- package/build/components/Toast/index.cjs.map +1 -0
- package/build/components/Toast/index.d.ts +43 -0
- package/build/components/Toast/index.js +136 -0
- package/build/components/Toast/index.js.map +1 -0
- package/build/components/Toast/style.css +1 -0
- package/build/components/ToastPortal/index.cjs +2 -0
- package/build/components/ToastPortal/index.cjs.map +1 -0
- package/build/components/ToastPortal/index.d.ts +8 -0
- package/build/components/ToastPortal/index.js +15 -0
- package/build/components/ToastPortal/index.js.map +1 -0
- package/build/components/Tooltip/index.cjs +2 -0
- package/build/components/Tooltip/index.cjs.map +1 -0
- package/build/components/Tooltip/index.d.ts +23 -0
- package/build/components/Tooltip/index.js +116 -0
- package/build/components/Tooltip/index.js.map +1 -0
- package/build/components/Tooltip/style.css +1 -0
- package/build/constants/breakpoint.constants.cjs +2 -0
- package/build/constants/breakpoint.constants.cjs.map +1 -0
- package/build/constants/breakpoint.constants.d.ts +8 -0
- package/build/constants/breakpoint.constants.js +9 -0
- package/build/constants/breakpoint.constants.js.map +1 -0
- package/build/constants/combobox.constants.cjs +2 -0
- package/build/constants/combobox.constants.cjs.map +1 -0
- package/build/constants/combobox.constants.d.ts +11 -0
- package/build/constants/combobox.constants.js +7 -0
- package/build/constants/combobox.constants.js.map +1 -0
- package/build/constants/scroll.constants.cjs +2 -0
- package/build/constants/scroll.constants.cjs.map +1 -0
- package/build/constants/scroll.constants.d.ts +7 -0
- package/build/constants/scroll.constants.js +5 -0
- package/build/constants/scroll.constants.js.map +1 -0
- package/build/enums/ui-size.enum.cjs +2 -0
- package/build/enums/ui-size.enum.cjs.map +1 -0
- package/build/enums/ui-size.enum.d.ts +9 -0
- package/build/enums/ui-size.enum.js +5 -0
- package/build/enums/ui-size.enum.js.map +1 -0
- package/build/enums/ui-variant.enum.cjs +2 -0
- package/build/enums/ui-variant.enum.cjs.map +1 -0
- package/build/enums/ui-variant.enum.d.ts +20 -0
- package/build/enums/ui-variant.enum.js +5 -0
- package/build/enums/ui-variant.enum.js.map +1 -0
- package/build/helpers/class-name.helper.cjs +2 -0
- package/build/helpers/class-name.helper.cjs.map +1 -0
- package/build/helpers/class-name.helper.d.ts +3 -0
- package/build/helpers/class-name.helper.js +10 -0
- package/build/helpers/class-name.helper.js.map +1 -0
- package/build/helpers/component.helper.cjs +2 -0
- package/build/helpers/component.helper.cjs.map +1 -0
- package/build/helpers/component.helper.d.ts +13 -0
- package/build/helpers/component.helper.js +5 -0
- package/build/helpers/component.helper.js.map +1 -0
- package/build/helpers/focus.helper.cjs +2 -0
- package/build/helpers/focus.helper.cjs.map +1 -0
- package/build/helpers/focus.helper.d.ts +42 -0
- package/build/helpers/focus.helper.js +65 -0
- package/build/helpers/focus.helper.js.map +1 -0
- package/build/helpers/label.helper.cjs +2 -0
- package/build/helpers/label.helper.cjs.map +1 -0
- package/build/helpers/label.helper.d.ts +11 -0
- package/build/helpers/label.helper.js +11 -0
- package/build/helpers/label.helper.js.map +1 -0
- package/build/helpers/portal.helper.cjs +2 -0
- package/build/helpers/portal.helper.cjs.map +1 -0
- package/build/helpers/portal.helper.d.ts +28 -0
- package/build/helpers/portal.helper.js +36 -0
- package/build/helpers/portal.helper.js.map +1 -0
- package/build/helpers/scroll.helper.cjs +2 -0
- package/build/helpers/scroll.helper.cjs.map +1 -0
- package/build/helpers/scroll.helper.d.ts +8 -0
- package/build/helpers/scroll.helper.js +11 -0
- package/build/helpers/scroll.helper.js.map +1 -0
- package/build/helpers/text.helper.cjs +2 -0
- package/build/helpers/text.helper.cjs.map +1 -0
- package/build/helpers/text.helper.d.ts +5 -0
- package/build/helpers/text.helper.js +6 -0
- package/build/helpers/text.helper.js.map +1 -0
- package/build/helpers/theme.helper.cjs +24 -0
- package/build/helpers/theme.helper.cjs.map +1 -0
- package/build/helpers/theme.helper.d.ts +49 -0
- package/build/helpers/theme.helper.js +75 -0
- package/build/helpers/theme.helper.js.map +1 -0
- package/build/hooks/useAnnounce.cjs +2 -0
- package/build/hooks/useAnnounce.cjs.map +1 -0
- package/build/hooks/useAnnounce.d.ts +4 -0
- package/build/hooks/useAnnounce.js +23 -0
- package/build/hooks/useAnnounce.js.map +1 -0
- package/build/hooks/useAsyncSearch.cjs +2 -0
- package/build/hooks/useAsyncSearch.cjs.map +1 -0
- package/build/hooks/useAsyncSearch.d.ts +11 -0
- package/build/hooks/useAsyncSearch.js +17 -0
- package/build/hooks/useAsyncSearch.js.map +1 -0
- package/build/hooks/useCopyFeedback.cjs +2 -0
- package/build/hooks/useCopyFeedback.cjs.map +1 -0
- package/build/hooks/useCopyFeedback.d.ts +10 -0
- package/build/hooks/useCopyFeedback.js +25 -0
- package/build/hooks/useCopyFeedback.js.map +1 -0
- package/build/hooks/useDismissOnEscape.cjs +2 -0
- package/build/hooks/useDismissOnEscape.cjs.map +1 -0
- package/build/hooks/useDismissOnEscape.d.ts +12 -0
- package/build/hooks/useDismissOnEscape.js +18 -0
- package/build/hooks/useDismissOnEscape.js.map +1 -0
- package/build/hooks/useListboxNavigation.cjs +2 -0
- package/build/hooks/useListboxNavigation.cjs.map +1 -0
- package/build/hooks/useListboxNavigation.d.ts +7 -0
- package/build/hooks/useListboxNavigation.js +53 -0
- package/build/hooks/useListboxNavigation.js.map +1 -0
- package/build/hooks/usePortalSurface.cjs +2 -0
- package/build/hooks/usePortalSurface.cjs.map +1 -0
- package/build/hooks/usePortalSurface.d.ts +25 -0
- package/build/hooks/usePortalSurface.js +19 -0
- package/build/hooks/usePortalSurface.js.map +1 -0
- package/build/hooks/usePositioning.cjs +2 -0
- package/build/hooks/usePositioning.cjs.map +1 -0
- package/build/hooks/usePositioning.d.ts +13 -0
- package/build/hooks/usePositioning.js +74 -0
- package/build/hooks/usePositioning.js.map +1 -0
- package/build/hooks/useScrollLock.cjs +2 -0
- package/build/hooks/useScrollLock.cjs.map +1 -0
- package/build/hooks/useScrollLock.d.ts +2 -0
- package/build/hooks/useScrollLock.js +34 -0
- package/build/hooks/useScrollLock.js.map +1 -0
- package/build/hooks/useSheetViewport.cjs +2 -0
- package/build/hooks/useSheetViewport.cjs.map +1 -0
- package/build/hooks/useSheetViewport.d.ts +6 -0
- package/build/hooks/useSheetViewport.js +29 -0
- package/build/hooks/useSheetViewport.js.map +1 -0
- package/build/hooks/useStickToBottom.cjs +2 -0
- package/build/hooks/useStickToBottom.cjs.map +1 -0
- package/build/hooks/useStickToBottom.d.ts +12 -0
- package/build/hooks/useStickToBottom.js +39 -0
- package/build/hooks/useStickToBottom.js.map +1 -0
- package/build/hooks/useUiTheme.cjs +2 -0
- package/build/hooks/useUiTheme.cjs.map +1 -0
- package/build/hooks/useUiTheme.d.ts +7 -0
- package/build/hooks/useUiTheme.js +36 -0
- package/build/hooks/useUiTheme.js.map +1 -0
- package/build/hooks/useUiTokens.cjs +2 -0
- package/build/hooks/useUiTokens.cjs.map +1 -0
- package/build/hooks/useUiTokens.d.ts +11 -0
- package/build/hooks/useUiTokens.js +39 -0
- package/build/hooks/useUiTokens.js.map +1 -0
- package/build/hooks/useVirtualList.cjs +2 -0
- package/build/hooks/useVirtualList.cjs.map +1 -0
- package/build/hooks/useVirtualList.d.ts +13 -0
- package/build/hooks/useVirtualList.js +41 -0
- package/build/hooks/useVirtualList.js.map +1 -0
- package/build/index.cjs +2 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +95 -0
- package/build/index.js +207 -0
- package/build/index.js.map +1 -0
- package/build/scss/_colors.generated.scss +119 -0
- package/build/scss/_index.scss +6 -0
- package/build/scss/_metrics.generated.scss +49 -0
- package/build/scss/_mixins.scss +710 -0
- package/build/scss/_variables.scss +51 -0
- package/build/styles/base.d.ts +0 -0
- package/build/styles.css +133 -0
- package/build/theme/UiProvider.cjs +2 -0
- package/build/theme/UiProvider.cjs.map +1 -0
- package/build/theme/UiProvider.d.ts +22 -0
- package/build/theme/UiProvider.js +30 -0
- package/build/theme/UiProvider.js.map +1 -0
- package/build/theme/UiThemeScript.cjs +2 -0
- package/build/theme/UiThemeScript.cjs.map +1 -0
- package/build/theme/UiThemeScript.d.ts +19 -0
- package/build/theme/UiThemeScript.js +8 -0
- package/build/theme/UiThemeScript.js.map +1 -0
- package/build/theme/context.cjs +2 -0
- package/build/theme/context.cjs.map +1 -0
- package/build/theme/context.d.ts +5 -0
- package/build/theme/context.js +8 -0
- package/build/theme/context.js.map +1 -0
- package/build/theme/initUi.cjs +2 -0
- package/build/theme/initUi.cjs.map +1 -0
- package/build/theme/initUi.d.ts +7 -0
- package/build/theme/initUi.js +10 -0
- package/build/theme/initUi.js.map +1 -0
- package/build/theme/palette.cjs +2 -0
- package/build/theme/palette.cjs.map +1 -0
- package/build/theme/palette.d.ts +219 -0
- package/build/theme/palette.js +148 -0
- package/build/theme/palette.js.map +1 -0
- package/build/theme/tokens.cjs +2 -0
- package/build/theme/tokens.cjs.map +1 -0
- package/build/theme/tokens.d.ts +225 -0
- package/build/theme/tokens.js +384 -0
- package/build/theme/tokens.js.map +1 -0
- package/build/types/charts/AreaChart/index.d.ts +14 -0
- package/build/types/charts/BarChart/index.d.ts +16 -0
- package/build/types/charts/BoxPlot/index.d.ts +43 -0
- package/build/types/charts/ComposedChart/index.d.ts +16 -0
- package/build/types/charts/Heatmap/index.d.ts +30 -0
- package/build/types/charts/Histogram/index.d.ts +29 -0
- package/build/types/charts/LineChart/index.d.ts +14 -0
- package/build/types/charts/PieChart/index.d.ts +36 -0
- package/build/types/charts/RadarChart/index.d.ts +40 -0
- package/build/types/charts/ScatterPlot/index.d.ts +41 -0
- package/build/types/charts/core/CartesianChart.d.ts +43 -0
- package/build/types/charts/core/ChartFrame.d.ts +55 -0
- package/build/types/charts/core/axes.d.ts +37 -0
- package/build/types/charts/core/cartesian.d.ts +80 -0
- package/build/types/charts/core/format.d.ts +19 -0
- package/build/types/charts/core/margins.d.ts +9 -0
- package/build/types/charts/core/palette.d.ts +13 -0
- package/build/types/charts/core/path.d.ts +24 -0
- package/build/types/charts/core/scale.d.ts +40 -0
- package/build/types/charts/core/series.d.ts +11 -0
- package/build/types/charts/core/spatial.d.ts +12 -0
- package/build/types/charts/core/stats.d.ts +34 -0
- package/build/types/charts/core/types.d.ts +31 -0
- package/build/types/charts/core/useChartWidth.d.ts +7 -0
- package/build/types/charts/index.d.ts +21 -0
- package/build/types/chat/ActionList/index.d.ts +46 -0
- package/build/types/chat/AppBar/index.d.ts +21 -0
- package/build/types/chat/ChatMessage/index.d.ts +24 -0
- package/build/types/chat/ChatThread/index.d.ts +24 -0
- package/build/types/chat/Citation/index.d.ts +15 -0
- package/build/types/chat/CodeBlock/format.d.ts +7 -0
- package/build/types/chat/CodeBlock/grammars.d.ts +44 -0
- package/build/types/chat/CodeBlock/highlight.d.ts +22 -0
- package/build/types/chat/CodeBlock/index.d.ts +33 -0
- package/build/types/chat/DescriptionList/index.d.ts +16 -0
- package/build/types/chat/Legend/index.d.ts +20 -0
- package/build/types/chat/MessageActions/index.d.ts +21 -0
- package/build/types/chat/PromptInput/index.d.ts +47 -0
- package/build/types/chat/PromptSuggestions/index.d.ts +25 -0
- package/build/types/chat/Prose/index.d.ts +15 -0
- package/build/types/chat/ReasoningBlock/index.d.ts +24 -0
- package/build/types/chat/ReasoningText/index.d.ts +14 -0
- package/build/types/chat/SegmentBar/index.d.ts +46 -0
- package/build/types/chat/SourceList/index.d.ts +25 -0
- package/build/types/chat/TerminalOutput/index.d.ts +25 -0
- package/build/types/chat/ToolCall/index.d.ts +41 -0
- package/build/types/chat/index.d.ts +26 -0
- package/build/types/combobox.type.d.ts +49 -0
- package/build/types/common-element-props.type.d.ts +8 -0
- package/build/types/helpers/class-name.helper.d.ts +3 -0
- package/build/types/helpers/component.helper.d.ts +13 -0
- package/build/types/helpers/label.helper.d.ts +12 -0
- package/build/types/hook.type.d.ts +36 -0
- package/build/types/link.type.d.ts +14 -0
- package/build/types/positioning.type.d.ts +38 -0
- package/build/types/theme/palette.d.ts +219 -0
- package/build/types/theme/tokens.d.ts +225 -0
- package/build/types/theme.type.d.ts +223 -0
- package/build/types/types/common-element-props.type.d.ts +8 -0
- package/build/types/types/link.type.d.ts +14 -0
- package/build/types/types/theme.type.d.ts +223 -0
- package/package.json +487 -4
package/README.md
CHANGED
|
@@ -1,3 +1,873 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @handijit/ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Erişilebilir, tema güdümlü React bileşen kütüphanesi. SCSS Modules üzerine
|
|
4
|
+
kurulu; tek çalışma zamanı bağımlılığı ikon seti (`react-bootstrap-icons`).
|
|
5
|
+
|
|
6
|
+
- **Tek CSS dosyası, iki tema.** Açık ve koyu hazır gelir, her token dışarıdan
|
|
7
|
+
ezilebilir.
|
|
8
|
+
- **Yönlendirici enjekte edilir.** `next/link`, `react-router`, ham `<a>` —
|
|
9
|
+
karar tüketicinin.
|
|
10
|
+
- **Metin dışarıdan, ama BİR KEZ.** Kütüphane hiçbir dilde metin uydurmaz;
|
|
11
|
+
kullanıcıya görünen dizeler sağlayıcıda tek yerde tanımlanır.
|
|
12
|
+
- **Yerel öğeler korunur.** `<dialog>`, `<input type="range">`,
|
|
13
|
+
`<input type="radio">` — odak tuzağı, klavye gezinmesi ve ekran okuyucu
|
|
14
|
+
duyurusu tarayıcıdan gelir.
|
|
15
|
+
- **Üç alt giriş, ana pakete sıfır bayt.** `@handijit/ui/chat` (sohbet ve
|
|
16
|
+
araç arayüzleri), `@handijit/ui/charts` (bağımlılıksız SVG grafikleri),
|
|
17
|
+
`@handijit/ui/scss` (token değişkenleri ve mixin'ler). Kullanmayan uygulama
|
|
18
|
+
onları indirmez.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @handijit/ui @handijit/utils react-bootstrap-icons
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`react`, `react-dom`, `@handijit/utils` ve `react-bootstrap-icons`
|
|
25
|
+
**peer** bağımlılıktır.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Hızlı başlangıç
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { Button, Field, Input, UIVariant } from '@handijit/ui';
|
|
33
|
+
|
|
34
|
+
<Field label="E-posta" isRequired error={error}>
|
|
35
|
+
{props => <Input {...props} type="email" value={email} onChange={onChange} />}
|
|
36
|
+
</Field>
|
|
37
|
+
|
|
38
|
+
<Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}>
|
|
39
|
+
Kaydet
|
|
40
|
+
</Button>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Sağlayıcı **zorunlu değil**: paket kurulup hiçbir yapılandırma yapılmadan
|
|
44
|
+
çalışır. Bağlantılar ham `<a>` olur, tema varsayılanlarda kalır.
|
|
45
|
+
|
|
46
|
+
**CSS tek dosya olarak alınır.** Uygulamanın kökünde bir kez:
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
import '@handijit/ui/styles.css';
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Alt küme isteyen tüketici `base.css` (token'lar, kutu modeli, `@keyframes`) ile
|
|
53
|
+
kullandığı bileşenlerin `components/<Ad>/style.css` dosyalarını **kendi
|
|
54
|
+
derlemesinde tek dosyaya** birleştirir:
|
|
55
|
+
|
|
56
|
+
```scss
|
|
57
|
+
// styles/ui.scss — Sass düz CSS dosyalarını içine alır.
|
|
58
|
+
@use '@handijit/ui/base.css';
|
|
59
|
+
@use '@handijit/ui/components/Button/style.css';
|
|
60
|
+
@use '@handijit/ui/components/Chip/style.css';
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
JS modülleri CSS içe aktarmaz; bu bilinçli: Turbopack'te her istemci sınırının
|
|
64
|
+
CSS'i ayrı dosyaya düşüyor ve render-blocking dosya sayısı LCP'yi bayttan çok
|
|
65
|
+
etkiliyordu (`CHANGELOG.md` → 1.0.0).
|
|
66
|
+
|
|
67
|
+
Her bileşenin alt yolu var — `@handijit/ui/button`, `/chip-group`,
|
|
68
|
+
`/combobox`… — ama cephe (`@handijit/ui`) saf yeniden dışa aktarım olduğu
|
|
69
|
+
için paketleyici ikisinden de aynı dosyaya iner.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Tema
|
|
74
|
+
|
|
75
|
+
### Tema seçimi `<html>` üzerinde taşınır
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<html data-ui-theme="dark">
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Öznitelik yoksa `prefers-color-scheme` yedeği devreye girer — ama kullanıcının
|
|
82
|
+
**açık bir seçimi** varsa sistem tercihi onu ezmez.
|
|
83
|
+
|
|
84
|
+
### İlk boyamadan önce yazın — `UiThemeScript`
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
// app/layout.tsx — sunucu düzeni, <head> içine.
|
|
88
|
+
import { UiThemeScript } from '@handijit/ui';
|
|
89
|
+
|
|
90
|
+
<head>
|
|
91
|
+
<UiThemeScript storageKey="theme" />
|
|
92
|
+
</head>;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Kayıtlı açık seçimi (`light` / `dark`) `<html data-ui-theme>`e yazar; kayıt
|
|
96
|
+
yoksa sistem tercihi izlenir. Satır içi betik HTML ayrıştırılırken çalışır.
|
|
97
|
+
|
|
98
|
+
Bu iş sağlayıcıya bırakılamaz: sağlayıcı ağaç monte olduktan sonra çalışıyor ve
|
|
99
|
+
koyu tema seçmiş kullanıcı o ana kadar **bir kare beyaz ekran** görüyor.
|
|
100
|
+
⚠ Bir **bileşen**, fonksiyon değil: paket `'use client'` taşıdığı için dışa
|
|
101
|
+
verilen düz bir fonksiyon Next'in sunucu düzeninde çağrılamıyor.
|
|
102
|
+
|
|
103
|
+
### Token'ları ezmek
|
|
104
|
+
|
|
105
|
+
Yalnızca değiştirdiğiniz token'ı verin; gerisi varsayılanında kalır.
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
import { UiProvider } from '@handijit/ui';
|
|
109
|
+
|
|
110
|
+
const THEME = {
|
|
111
|
+
light: { link: '#0a58ca', 'ring-color': '#0d6efd' },
|
|
112
|
+
dark: { link: '#6ea8fe' },
|
|
113
|
+
fonts: { heading: 'Archivo, sans-serif', body: 'Inter, sans-serif' },
|
|
114
|
+
// Ölçüler tema başına DEĞİL: bir markanın yuvarlaklığı açık temada
|
|
115
|
+
// 12 px, koyu temada 8 px olmaz.
|
|
116
|
+
metrics: { 'radius-md': '2px', 'radius-lg': '4px', 'duration-normal': '120ms' },
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
<UiProvider theme={THEME} linkComponent={NextLink}>
|
|
120
|
+
<App />
|
|
121
|
+
</UiProvider>;
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Sağlayıcı ezmeyi çocuklarından önce bir `<style>` olarak **çizer**: sunucu
|
|
125
|
+
çıktısında da vardır, ilk boyamada uygulanır; hidrasyondan sonra hiçbir renk
|
|
126
|
+
değişmez. Bu yüzden sağlayıcı `<body>` içinde durur, `<html>`i saramaz.
|
|
127
|
+
|
|
128
|
+
Ezme `@layer ui` içindedir: aynı token'ı kendi CSS'inizde ezerseniz
|
|
129
|
+
(`html:has(.panel) { --ui-danger-solid: #dc2626 }`) sizinki özgüllüğe ve
|
|
130
|
+
sıraya bakılmaksızın kazanır. Açık temaya verilen değer koyu temaya sızmaz;
|
|
131
|
+
koyu temada da istiyorsanız `dark`a da yazın.
|
|
132
|
+
|
|
133
|
+
React'in dışından (Storybook'tan, stil sayfalarından sonra çalışan bir
|
|
134
|
+
betikten) aynı işi `initUi({ theme })` yapar; ezmeyi `<head>`in sonuna
|
|
135
|
+
yazar. ⚠ Stil sayfalarınızdan **önce** çağırmayın: `@layer ui` belgede ilk
|
|
136
|
+
kez orada görülürse katman sırası oradan kurulur ve sonra gelen
|
|
137
|
+
`@layer reset, @handijit/ui;` bildiriminiz `reset`i kütüphanenin üstüne koyar.
|
|
138
|
+
|
|
139
|
+
**Kütüphane font YÜKLEMEZ.** `fonts` yalnızca `font-family` dizesi; yüklemeyi
|
|
140
|
+
(`next/font`, `@font-face`, CDN) siz yaparsınız. Bir UI paketinin ağdan font
|
|
141
|
+
çekmesi, sizin ölçemediğiniz bir istek demek.
|
|
142
|
+
|
|
143
|
+
#### Ezilebilen ölçüler
|
|
144
|
+
|
|
145
|
+
`radius-*` · `space-0…9` · `font-size-2xs…4xl` · `leading-*` · `icon-xs…xl` ·
|
|
146
|
+
`duration-*` · `ease-*` — tam liste `METRIC_TOKENS` içinde ve dışa veriliyor.
|
|
147
|
+
|
|
148
|
+
Ezilemeyenler ve nedenleri: **kırılma noktaları** (`@media (max-width: var(--x))`
|
|
149
|
+
geçersiz CSS), **katman (`z-*`)** (yığılma sırası, marka kararı değil) ve
|
|
150
|
+
**dokunma hedefi** (44 px; yoğun kipte de küçülmemeli — WCAG 2.5.8).
|
|
151
|
+
|
|
152
|
+
### Bilgi yoğunluğu
|
|
153
|
+
|
|
154
|
+
```html
|
|
155
|
+
<html data-ui-density="compact"></html>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Satır yüksekliği, dolgu ve punto bir kademe iner. Vitrin bir ekranda 8 satır,
|
|
159
|
+
operasyon paneli 80 satır gösteriyor; ikisini tek ölçekle karşılamanın yolu yok.
|
|
160
|
+
Kararı `initUi({ density: 'compact' })` da verebilir.
|
|
161
|
+
|
|
162
|
+
**Yarıçap değişmez** (yuvarlaklık yoğunluğun değil markanın işi) ve **dokunma
|
|
163
|
+
hedefi küçülmez**: görsel kutu daralır, `tap-target` örtüsü 44 px kalır.
|
|
164
|
+
|
|
165
|
+
### CSS'imizi ezmek — `@layer ui`
|
|
166
|
+
|
|
167
|
+
Kütüphane CSS'inin tamamı `@layer ui` içinde — tema ezmeleri
|
|
168
|
+
(`UiProvider theme`, `initUi`) dahil. Katmanlı bir kural, katmansız
|
|
169
|
+
bir kurala **her zaman yenilir** — özgüllüğe ve sıraya bakılmaksızın:
|
|
170
|
+
|
|
171
|
+
```css
|
|
172
|
+
/* Bu kadarı yeter; `!important` ya da `.app .card .card` gerekmez. */
|
|
173
|
+
.my-card {
|
|
174
|
+
padding: 0;
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Katman olmadan sizin sınıfınız ile bizimki aynı özgüllükte (0,1,0) yarışıyordu
|
|
179
|
+
ve kazananı **kaynak sırası** belirliyordu; o sıra da bundler'ınızın elinde —
|
|
180
|
+
geliştirme ile üretim aynı olmak zorunda değil.
|
|
181
|
+
|
|
182
|
+
### Temayı değiştirmek
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
const { scheme, preference, setScheme, toggle, isReady } = useUiTheme();
|
|
186
|
+
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
if (isReady) localStorage.setItem('theme', preference);
|
|
189
|
+
}, [preference, isReady]);
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
| Alan | |
|
|
193
|
+
| --- | --- |
|
|
194
|
+
| `scheme` | **ÇÖZÜLMÜŞ** tema — ekranda çizili olan (`light` \| `dark`) |
|
|
195
|
+
| `preference` | kullanıcının **SEÇİMİ** (`light` \| `dark` \| `system`) |
|
|
196
|
+
| `setScheme` | `'system'` verildiğinde açık seçim SİLİNİR |
|
|
197
|
+
|
|
198
|
+
Üç durumlu bir anahtar (Açık / Koyu / Sistem) `preference` okur; `scheme`
|
|
199
|
+
okusaydı "Sistem" seçiliyken düğme "Koyu"yu işaretli gösterirdi. `system` bir
|
|
200
|
+
değer değil **değerin yokluğu**: öznitelik silinir ve
|
|
201
|
+
`:not([data-ui-theme])` sorgusu devreye girer.
|
|
202
|
+
|
|
203
|
+
Kalıcılık **kancanın işi değil**: seçimi `localStorage`a mı, sunucuda
|
|
204
|
+
okunabilsin diye bir çereze mi, kullanıcı profiline mi yazacağınız sizin
|
|
205
|
+
kararınız. Kütüphane `localStorage`a yazsaydı sunucu tarafı onu okuyamayacağı
|
|
206
|
+
için ilk boyama yine yanlış temada olurdu.
|
|
207
|
+
|
|
208
|
+
`isReady`: sunucu çıktısında ve hidrasyondan önceki ilk karede `false`. Tema
|
|
209
|
+
anahtarını çizmeden önce bekleyin — sunucu hangi temanın seçili olduğunu
|
|
210
|
+
bilmiyor ve bir tahminle çizilen anahtar, doğru tahmin edilse bile hidrasyonda
|
|
211
|
+
uyuşmazlık üretiyordu.
|
|
212
|
+
|
|
213
|
+
### Token katmanları
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
theme/palette.ts → ham hex (TEK hex kaynağı)
|
|
217
|
+
theme/tokens.ts → anlamsal token → değer
|
|
218
|
+
LIGHT_THEME / DARK_THEME (renk, temaya bağlı)
|
|
219
|
+
METRIC_TOKENS (ölçü, temadan bağımsız)
|
|
220
|
+
COMPACT_DENSITY (yoğun kipin ezdikleri)
|
|
221
|
+
styles/*.generated → yukarıdakinden ÜRETİLİR (npm run tokens)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
SCSS ve TypeScript tarafı elle tutulsaydı bir tarafta var olup diğerinde
|
|
225
|
+
olmayan bir token çıkardı — ve ayrışma sessiz: bileşen `var(--ui-yok)`
|
|
226
|
+
okuyup rengini kaybediyor, derleme yeşil dönüyor. Nöbetçi
|
|
227
|
+
`theme/__tests__/tokens.contract.test.ts`.
|
|
228
|
+
|
|
229
|
+
**Ölçüler CSS değişkeni olduğu için SCSS aritmetiği çalışmaz.**
|
|
230
|
+
`$space-8 - $space-2` derlenmez — ve Sass hata da vermez: ifadeyi olduğu gibi
|
|
231
|
+
geçirip tarayıcıya `var(--a)-var(--b)` yazar, tarayıcı bütün bildirimi atar.
|
|
232
|
+
Hesap `calc()` içinde yazılır, negatif değer dahil:
|
|
233
|
+
|
|
234
|
+
```scss
|
|
235
|
+
padding-inline-start: calc(#{$space-8} - #{$space-2});
|
|
236
|
+
margin-inline: calc(-1 * #{$space-2});
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Metinler
|
|
242
|
+
|
|
243
|
+
Kütüphane "Kapat" yazamaz: hangi dilde, hangi üslupta, hangi terimle
|
|
244
|
+
yazacağını bilmez. Ama aynı dizeyi yüz çağrı yerine dağıtmak da doğru değil —
|
|
245
|
+
biri değiştiğinde doksan dokuzu eski kalıyor. Metinler **bir kez**, sağlayıcıda
|
|
246
|
+
verilir:
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
<UiProvider
|
|
250
|
+
labels={{
|
|
251
|
+
close: 'Kapat',
|
|
252
|
+
cancel: 'Vazgeç',
|
|
253
|
+
submit: 'Kaydet',
|
|
254
|
+
loading: 'Yükleniyor',
|
|
255
|
+
required: '(zorunlu)',
|
|
256
|
+
filters: 'Filtreler',
|
|
257
|
+
breadcrumb: 'Konum',
|
|
258
|
+
directoryJump: 'Harfe göre atla',
|
|
259
|
+
selectPlaceholder: 'Seçiniz',
|
|
260
|
+
locale: 'tr',
|
|
261
|
+
currency: '₺',
|
|
262
|
+
combobox: {
|
|
263
|
+
searchPlaceholder: 'Ara…',
|
|
264
|
+
emptyMessage: 'Sonuç bulunamadı',
|
|
265
|
+
loadingMessage: 'Aranıyor…',
|
|
266
|
+
clearLabel: 'Seçimi temizle',
|
|
267
|
+
},
|
|
268
|
+
pagination: { label: 'Sayfalar', previous: 'Önceki sayfa', next: 'Sonraki sayfa' },
|
|
269
|
+
quantity: { label: 'Adet', decrease: 'Adeti azalt', increase: 'Adeti artır' },
|
|
270
|
+
range: { min: 'En az', max: 'En çok' },
|
|
271
|
+
dataTable: { empty: 'Kayıt bulunamadı.', loading: 'Yükleniyor…' },
|
|
272
|
+
copyField: {
|
|
273
|
+
copy: value => `${value} kopyala`,
|
|
274
|
+
copied: value => `${value} kopyalandı`,
|
|
275
|
+
announcement: 'Panoya kopyalandı',
|
|
276
|
+
},
|
|
277
|
+
rating: {
|
|
278
|
+
srLabel: (value, count) => `5 üzerinden ${value}${count ? `, ${count} değerlendirme` : ''}`,
|
|
279
|
+
starCount: star => `${star} yıldız`,
|
|
280
|
+
scale: { 1: 'Hiç memnun kalmadım', 2: 'Beklentimi karşılamadı', 3: 'İdare eder', 4: 'Memnun kaldım', 5: 'Çok memnun kaldım' },
|
|
281
|
+
},
|
|
282
|
+
}}
|
|
283
|
+
>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Çözümleme sırası: prop → config → geliştirme uyarısı.** Bir prop verilmişse o
|
|
287
|
+
kazanır; bağlama göre farklı olması gereken yerlerde (`closeLabel="Daha sonra"`)
|
|
288
|
+
hâlâ prop geçilir.
|
|
289
|
+
|
|
290
|
+
### Config'e girmeyenler
|
|
291
|
+
|
|
292
|
+
Öğeye **özgü** hiçbir metin config'e girmez — her çağrı yerinde farklı olduğu
|
|
293
|
+
için bir uygulama düzeyinde varsayılanı olamaz:
|
|
294
|
+
|
|
295
|
+
`Modal.title` · `ConfirmDialog.confirmLabel` ("Sil" — eylemi tekrarlamak
|
|
296
|
+
zorunda; "Tamam" kullanıcıya neyi onayladığını söylemez) · `IconButton.label` ·
|
|
297
|
+
`Select.label` · `Combobox.labels.placeholder` · `TableCheckbox.label` ·
|
|
298
|
+
`ChipGroup.label` · `RatingInput.label`
|
|
299
|
+
|
|
300
|
+
### Eksik metin nasıl görünür
|
|
301
|
+
|
|
302
|
+
TypeScript sağlayıcının çalışma zamanında ne taşıdığını göremiyor, o yüzden
|
|
303
|
+
prop'lar isteğe bağlı. Ne prop ne config varsa öğe adsız kalır ve bu geliştirme
|
|
304
|
+
kipinde konsola düşer:
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
[@handijit/ui] Eksik metin: Modal.closeLabel. Prop olarak geçin ya da
|
|
308
|
+
<UiProvider labels={…}> içinde bir kez tanımlayın.
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Uyarı anahtar başına bir kez verilir; yirmi satırlık bir liste konsolu
|
|
312
|
+
doldurmaz.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Yönlendirici
|
|
317
|
+
|
|
318
|
+
```tsx
|
|
319
|
+
import NextLink from 'next/link';
|
|
320
|
+
|
|
321
|
+
<UiProvider linkComponent={NextLink}>…</UiProvider>;
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Bir bileşen kütüphanesi kendi yönlendiricisini **seçemez**: `next/link` import
|
|
325
|
+
etmek paketi Next'e bağlar, `react-router` import etmek başka bir uygulamayı
|
|
326
|
+
kırar.
|
|
327
|
+
|
|
328
|
+
Yönlendiriciye özgü props `linkProps` ile geçer:
|
|
329
|
+
|
|
330
|
+
```tsx
|
|
331
|
+
<Pagination buildHref={page => `?sayfa=${page}`} linkProps={{ scroll: false }} … />
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Sayfalamada başa dönme
|
|
337
|
+
|
|
338
|
+
Sayfa değiştiren tıklamadan sonra pencereyi başa almak bir **prop**tur; çağıran
|
|
339
|
+
tarafta kaydırma kodu yazılmaz:
|
|
340
|
+
|
|
341
|
+
```tsx
|
|
342
|
+
<Pagination page={page} totalPages={totalPages} scrollTo="top" … />
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
İki kipte de çalışır (`buildHref` ve `onPageChange`). Kaydırma anidir ve üç
|
|
346
|
+
durumda **yapılmaz**: etkin sayfaya basıldığında, yeni sekmede açan tıklamada
|
|
347
|
+
(Ctrl/Cmd/orta tuş) ve prop verilmediğinde.
|
|
348
|
+
|
|
349
|
+
⚠ Sayfa içindeki bir listenin sayfalamasında (sekme içi değerlendirme listesi
|
|
350
|
+
gibi) **verilmez** — kullanıcıyı okuduğu bölümden sayfanın tepesine atar.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Yapışkan başlık
|
|
355
|
+
|
|
356
|
+
Sayfa kaydırmasına yapışan bileşenler (`DirectoryGroup`, `DirectoryJump`,
|
|
357
|
+
kapaklı `DataTable`) offset'i `--ui-header-height`ten okur ve **varsayılanı
|
|
358
|
+
0**. Kendi yapışkan bandınız varsa gerçek ölçüyü yazın:
|
|
359
|
+
|
|
360
|
+
```tsx
|
|
361
|
+
useEffect(() => {
|
|
362
|
+
const observer = new ResizeObserver(([entry]) =>
|
|
363
|
+
document.documentElement.style.setProperty(
|
|
364
|
+
'--ui-header-height',
|
|
365
|
+
`${entry.contentRect.height}px`,
|
|
366
|
+
),
|
|
367
|
+
);
|
|
368
|
+
observer.observe(headerRef.current!);
|
|
369
|
+
return () => observer.disconnect();
|
|
370
|
+
}, []);
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Sabit bir sayı yazmayın: bant mobilde arama kutusu kendi satırına düştüğünde
|
|
374
|
+
büyür, bir duyuru şeridi çıkıp kaybolduğunda değişir.
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Bileşen kataloğu
|
|
379
|
+
|
|
380
|
+
| Grup | Bileşenler |
|
|
381
|
+
| --- | --- |
|
|
382
|
+
| Eylem | `Button` · `IconButton` · `TextLink` · `Tooltip` · `Menu` · `ContextMenu` · `Popover` |
|
|
383
|
+
| Seçim | `Chip` · `ChipGroup` · `SegmentedControl` · `Select` · `Combobox` · `Checkbox` · `Switch` · `Radio` · `RadioCard` · `RangeSlider` · `RatingInput` · `QuantityStepper` · `TableCheckbox` |
|
|
384
|
+
| Girdi | `Input` · `PasswordInput` · `Textarea` · `TagInput` · `DateField` · `FileUpload` · `Field` |
|
|
385
|
+
| Yüzey | `Card` (+ `CardMedia`, `CardOverlay`, `CardBody`, `CardFooter`) · `SummaryCard` · `Panel` (+ `PanelForm`, `PanelRow`) · `PageHeader` · `SectionHeader` · `Tile` · `Directory` (+ `DirectoryGroup`, `DirectoryRow`, `DirectoryJump`) · `Carousel` · `ScrollArea` · `Disclosure` · `Accordion` · `Tabs` |
|
|
386
|
+
| Geri bild. | `Alert` · `Badge` · `StatusDot` · `CodeBadge` · `Kbd` · `EmptyState` · `Skeleton` (+ `SkeletonCard`, `SkeletonRows`, `SkeletonTable`) · `Spinner` · `Progress` · `Steps` · `Divider` · `Avatar` · `Rating` · `Price` · `Stat` · `CopyField` · `Breadcrumb` · `ToastHub` (+ `ToastPortal`) |
|
|
387
|
+
| Kipsel | `Modal` · `Drawer` · `BottomSheet` · `ConfirmDialog` · `PromptDialog` · `CommandPalette` |
|
|
388
|
+
| Veri | `Table` (+ `TableScroller`) · `DataTable` (+ `DataTableRow`) · `FilterBar` (+ `FilterBarField`) · `Pagination` · `Timeline` |
|
|
389
|
+
| Tema ve kancalar | `UiProvider` · `UiThemeScript` · `initUi` · `useUi` · `useUiTheme` · `useUiTokens` · `useAnnounce` · `useStickToBottom` · `usePositioning` · `useVirtualList` · `useListboxNavigation` · `hasOpenSurface` |
|
|
390
|
+
| Sohbet — `/chat` | `ChatThread` · `ChatMessage` · `PromptInput` · `PromptSuggestions` · `Prose` · `CodeBlock` · `ReasoningBlock` (+ `ReasoningText`) · `ToolCall` (+ `ToolCallSection`) · `TerminalOutput` · `SourceList` · `Citation` · `MessageActions` · `AppBar` · `ActionList` (+ `ActionListItem`) · `SegmentBar` · `Legend` · `DescriptionList` |
|
|
391
|
+
| Grafik — `/charts` | `LineChart` · `AreaChart` · `BarChart` · `ComposedChart` · `PieChart` · `ScatterPlot` · `Heatmap` · `BoxPlot` · `Histogram` · `RadarChart` |
|
|
392
|
+
|
|
393
|
+
Alt girişlerin stilleri ayrı dosyada ve `styles.css`ten **sonra** içe aktarılır:
|
|
394
|
+
`@handijit/ui/chat.css`, `@handijit/ui/charts.css`.
|
|
395
|
+
|
|
396
|
+
### Seçenek sayısı öğeyi belirler
|
|
397
|
+
|
|
398
|
+
| Seçenek sayısı | Öğe |
|
|
399
|
+
| -------------- | ----------------------------------------------- |
|
|
400
|
+
| ≤7 | `ChipGroup` — hepsi ekranda, tek dokunuş |
|
|
401
|
+
| 5–20 | `Select` — aramasız liste; mobilde alt sayfa |
|
|
402
|
+
| 20+ | `Combobox` — yazarak ara |
|
|
403
|
+
| Aralık | `RangeSlider` (+ kesin değer için sayı girdisi) |
|
|
404
|
+
| Tekil aç/kapa | `Checkbox` |
|
|
405
|
+
|
|
406
|
+
Hepsini onay kutusu listesi yapmak tek tip ama kötü bir arayüzdür: 1121 markayı
|
|
407
|
+
da 3 seçeneği de aynı biçimde göstermek, ikisini de yanlış gösterir.
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## Sistemin taşıdığı kararlar
|
|
412
|
+
|
|
413
|
+
**Zemin mürekkep ve kâğıt, yeşil eylemdir.** Nötrler sıcak mürekkep ekseninde
|
|
414
|
+
(açık sayfa `#faf9f5`, koyu sayfa `#141413`); markanın yeşili yalnızca birincil
|
|
415
|
+
eylemde, bağlantıda, odak halkasında ve marka işaretinde. Seçim — etkin sayfa,
|
|
416
|
+
seçili çip, sekme çizgisi, ilerleme, onay kutusu, anahtar — mürekkeptir.
|
|
417
|
+
Yeşilin yayılmasını `green-footprint.test.ts` derleme hatasına çevirir.
|
|
418
|
+
|
|
419
|
+
**Doygun dolgu = tıklanabilir.** Durum etiketleri **her zaman** tint zeminli
|
|
420
|
+
(`Badge`, `Alert`), eylemler **her zaman** dolgulu veya çerçeveli. Bu ayrım
|
|
421
|
+
bozulduğunda kullanıcı durum etiketine tıklamayı deniyor. `Badge`in `solid`
|
|
422
|
+
varyantı durum tonlarında bilinçli olarak `soft` ile aynı şeyi verir.
|
|
423
|
+
|
|
424
|
+
**Bir ekranda tek `PRIMARY`.** `UIVariant` bir vurgu hiyerarşisi: iki dolu düğme
|
|
425
|
+
yan yana durduğunda hiçbiri öne çıkmaz. `UIVariant.CART` ekrandaki en parlak
|
|
426
|
+
yeşil — dönüşüm eylemi; birincil eylemden (koyu çam) aydınlıkla ayrışır.
|
|
427
|
+
|
|
428
|
+
**Renk tek başına anlam taşımaz** (WCAG 1.4.1). Her durum bir metin, ikon veya
|
|
429
|
+
işaretle de bildirilir: `Alert`in her tonunun kendi ikonu var, `Field`in zorunlu
|
|
430
|
+
yıldızının yanında okunabilir bir metin, `RatingInput`in yıldızlarının altında
|
|
431
|
+
açıklama duruyor.
|
|
432
|
+
|
|
433
|
+
**İkonlar `react-bootstrap-icons`ten, DOLU sürümüyle.** Kabuk simgeleri
|
|
434
|
+
(`Modal`ın kapatma çarpısı, `Select`in oku, `Alert`in durum ikonu) bir zamanlar
|
|
435
|
+
kütüphanenin içinde elle çizilmiş yollardı; bir ikon setinin bakımını üstlenmek
|
|
436
|
+
hiçbir şey kazandırmıyordu — tüketici uygulamalar kendi içerik ikonlarını zaten
|
|
437
|
+
aynı setten alıyor ve paket `external`, yani ikinci bir kopya inmiyor. Dolu
|
|
438
|
+
(`*Fill`) sürüm kural: ince konturlu bir simge, tint zeminde ve küçük ölçüde
|
|
439
|
+
tek piksele inip kayboluyor. Fill eşi olmayan simgelerde (`X`, `Check`, `Plus`,
|
|
440
|
+
`Dash`) kalın `*Lg` sürümü kullanılır, chevron yerine dolu `Caret*Fill` —
|
|
441
|
+
böylece bütün kabuk aynı çizgi ağırlığında kalır. İçerik ikonları (kategori
|
|
442
|
+
simgesi, marka logosu) her zaman `ReactNode` prop'u olarak DIŞARIDAN gelir.
|
|
443
|
+
|
|
444
|
+
**İkon ölçüsü metin puntosundan ayrıdır.** İkonlar `1em` ile ölçeklenir ama
|
|
445
|
+
taşındıkları kutunun `font-size` değeri metin için seçilmiştir ve simge için
|
|
446
|
+
küçük kalır: 40 px'lik bir `IconButton`ın ortasındaki 16 px'lik simge tıklanabilir
|
|
447
|
+
görünmüyordu. Ölçek ayrı bir token dizisidir (`$icon-xs` … `$icon-xl`,
|
|
448
|
+
14/16/18/20/24 px) ve ikon taşıyan her kutu puntosunu oradan alır.
|
|
449
|
+
|
|
450
|
+
**"Yüklenemedi" ile "boş" ayrı durumlardır.** `DataTable`da `error` verilmişken
|
|
451
|
+
boş mesajı **asla** çizilmez; bir ağ hatasını "kayıt kalmamış" diye okutmak
|
|
452
|
+
kullanıcıya yanlış karar verdirir.
|
|
453
|
+
|
|
454
|
+
**Yerel öğe, taklit öğeden iyidir.** `<dialog>`, `<input type="range">`,
|
|
455
|
+
`<input type="radio">` korunur. Tek istisna `<select>`: açılır listesinin içine
|
|
456
|
+
hiçbir biçimde girilemiyor ve mobil tekerleği uygulamanın geri kalanına hiç
|
|
457
|
+
benzemiyor. Bedeli (odak yönetimi, ok tuşları, `aria-activedescendant`) bir kez
|
|
458
|
+
ödenip tek bileşene kapatıldı.
|
|
459
|
+
|
|
460
|
+
**Dokunma hedefi en az 44×44 px** (WCAG 2.5.8). Görsel kutu daha küçük olabilir;
|
|
461
|
+
tıklanabilir alan görünmez bir örtüyle korunur.
|
|
462
|
+
|
|
463
|
+
**Geçişler 200 ms'yi geçmez** — tek istisna dipten açılan panel
|
|
464
|
+
(`duration-slow`, 320 ms) — ve `prefers-reduced-motion` her animasyonda
|
|
465
|
+
karşılanır.
|
|
466
|
+
|
|
467
|
+
**Odak halkası `:focus-visible` ile.** `:focus` fareyle tıklandığında da halka
|
|
468
|
+
gösterip görsel gürültü yaratıyor ve kullanıcılar bunu hata sanıyordu.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Next.js App Router
|
|
473
|
+
|
|
474
|
+
Paket `'use client'` sınırını **kendi içinde ve dosya başına** çizer (6.0):
|
|
475
|
+
kanca kullanmayan bileşenler (`Button`, `Chip`, `Badge`, `Card`, `Panel`,
|
|
476
|
+
`Tile`, `TextLink`, `Kbd`, `Alert`, `EmptyState`, `IconButton`, `Progress`,
|
|
477
|
+
`Skeleton`, `StatusDot`, `SummaryCard`, `SectionHeader`, `PageHeader`,
|
|
478
|
+
`Divider`) sunucu bileşeni olarak çizilir ve istemciye JS indirmez; etkileşimli
|
|
479
|
+
olanlar kendi yönergesini taşır, `children` sunucuda çizilip aktarılır. İnce
|
|
480
|
+
`Client*` sarmalayıcıları gerekmez; `UIVariant`/`UISize` sunucuda da içe
|
|
481
|
+
aktarılır.
|
|
482
|
+
|
|
483
|
+
```ts
|
|
484
|
+
// next.config.ts — cephe saf olduğu için içe aktarım bileşen dosyasına kısa devre yapılır.
|
|
485
|
+
experimental: { optimizePackageImports: ['@handijit/ui'] }
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
```tsx
|
|
489
|
+
// app/layout.tsx — sunucu bileşeni
|
|
490
|
+
import '@handijit/ui/styles.css';
|
|
491
|
+
import '@handijit/ui/chat.css'; // yalnızca /chat kullanılıyorsa
|
|
492
|
+
import '@handijit/ui/charts.css'; // yalnızca /charts kullanılıyorsa
|
|
493
|
+
import { UiProvider, UiThemeScript } from '@handijit/ui';
|
|
494
|
+
import NextLink from 'next/link';
|
|
495
|
+
|
|
496
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
497
|
+
return (
|
|
498
|
+
<html lang="tr" suppressHydrationWarning>
|
|
499
|
+
<head>
|
|
500
|
+
<UiThemeScript storageKey="theme" />
|
|
501
|
+
</head>
|
|
502
|
+
<body>
|
|
503
|
+
<UiProvider linkComponent={NextLink}>{children}</UiProvider>
|
|
504
|
+
</body>
|
|
505
|
+
</html>
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
`suppressHydrationWarning`: tema betiği `<html>`e sunucunun yazmadığı bir
|
|
511
|
+
öznitelik ekliyor; uyarı yalnızca o öğe için susturulur.
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## Geliştirme
|
|
516
|
+
|
|
517
|
+
```bash
|
|
518
|
+
nvm use # .nvmrc → 24
|
|
519
|
+
npm install
|
|
520
|
+
npm run verify # tokens → kontrast → typecheck → lint → kapsam → build → API → animasyon → boyut
|
|
521
|
+
npm run playground # bileşen galerisi → http://localhost:5273
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
| Komut | |
|
|
525
|
+
| ------------------------- | --------------------------------------------------------------- |
|
|
526
|
+
| `npm run tokens` | SCSS token dosyalarını `theme/tokens.ts`ten üretir |
|
|
527
|
+
| `npm run build` | `build/` — ana giriş + `chat` + `charts` (ESM + CJS + `.d.ts` + CSS) ve `build/scss/` |
|
|
528
|
+
| `npm run test` | Jest + Testing Library + `jest-axe` |
|
|
529
|
+
| `npm run test:coverage` | kapsam kapısı — tüm `src/`: satır 89 · ifade 86 · fonksiyon 80 · dal 75 |
|
|
530
|
+
| `npm run test:visual` | görsel regresyon (Playwright); `verify` İÇİNDE DEĞİL, aşağı bkz. |
|
|
531
|
+
| `npm run test:device` | iOS (WebKit) + Android (Chromium) davranış nöbetçileri, aşağı bkz. |
|
|
532
|
+
| `npm run check:contrast` | WCAG kontrast ölçümü, iki temada 210 çift |
|
|
533
|
+
| `npm run check:palette` | palet tarifinin çıktısı mı + nötr chroma tavanı + tint ve kategori ayrışması |
|
|
534
|
+
| `npm run check:api` | genel API nöbetçisi — dört giriş, dört taban çizgisi (ana 176 · sohbet 30 · grafik 22 · SCSS 252 ad) |
|
|
535
|
+
| `npm run size` | paket boyutu bütçesi (`size-limit`) |
|
|
536
|
+
| `npm run exports` | `package.json` `exports` haritasını üretir (`check:exports` doğrular, `build`in son adımı) |
|
|
537
|
+
| `npm run playground` | bileşen galerisi (tema · RTL · yoğunluk anahtarı) |
|
|
538
|
+
| `npm run lint` | ESLint (TS) + stylelint (SCSS) |
|
|
539
|
+
| `npm run typecheck` | `tsc --noEmit` |
|
|
540
|
+
|
|
541
|
+
### Nöbetçiler ne koruyor
|
|
542
|
+
|
|
543
|
+
- **Eksen taraması** — dışa verilen her bileşen, her anlamlı durumunda
|
|
544
|
+
(`components/__tests__/a11y.test.tsx`). Deftere girmeyen yeni bir bileşen
|
|
545
|
+
testi kırar.
|
|
546
|
+
- **Klavye sözleşmesi** — tuş matrisleri her bileşenin JSDoc'unda, nöbetçisi
|
|
547
|
+
`components/__tests__/keyboard.test.tsx`.
|
|
548
|
+
- **Kontrast** — metin ≥ 4,5:1, ikon ve odak halkası ≥ 3:1. Eşiği tutmayan bir
|
|
549
|
+
token derlemeyi kırar; düzeltme daima `palette.ts` düzeyinde yapılır.
|
|
550
|
+
- **Token sözleşmesi** — açık/koyu anahtar kümeleri ve üretilmiş SCSS kaynakla
|
|
551
|
+
eşleşir. Ayrışma bugüne kadar sessizdi.
|
|
552
|
+
- **Paket boyutu** — tek bileşen import eden bir uygulamanın ne indirdiği
|
|
553
|
+
ölçülür. Ölçülen (2026-10-10, `size-limit`): `Badge` **4,33 kB** · `Button`
|
|
554
|
+
**5,12 kB** · `styles.css` **23,07 kB** · tüm paket **42,05 kB** gzip. Alt
|
|
555
|
+
girişler ana pakette SAYILMAZ: sohbet **6,32 kB**, grafikler **14,02 kB**
|
|
556
|
+
(yalnızca `LineChart` **7,19 kB**).
|
|
557
|
+
⚠ **Bütçeler `.size-limit.js`te** (paket 43 kB, `styles.css` 24 kB) ve
|
|
558
|
+
başlıkta kalan pay dar. Bu satır bir dönem
|
|
559
|
+
`Badge 2,7 / Button 3,4 / paket 22,2` diyordu — ölçüm değil, bayat bir
|
|
560
|
+
kopyaydı ve okuyana **%70 boş alan** olduğunu düşündürüyordu. Yeni bir
|
|
561
|
+
bileşen eklerken bütçenin fiilen dolu olduğu bilinerek girilir; `size-limit`
|
|
562
|
+
kırmızıya döndüğünde doğru tepki limiti yükseltmek değil, ne eklendiğini
|
|
563
|
+
ölçmektir (`npm run size`).
|
|
564
|
+
- **Genel API** — her girişin dışa aktarım kümesi kendi taban çizgisiyle
|
|
565
|
+
karşılaştırılır (`npm run check:api`): ana giriş `scripts/api-baseline.txt`
|
|
566
|
+
(176), `chat` (30), `charts` (22), `scss` (252 `$değişken` + `@mixin`). Düşen
|
|
567
|
+
bir ad **kırıcı**dır ve tüketiciler caret ile aldığı için bir sonraki
|
|
568
|
+
`npm install`da derleme hatası olarak çıkar. Bilinçli değişiklikte
|
|
569
|
+
`node scripts/check-api.mjs --update` + CLAUDE.md'ye gerekçe.
|
|
570
|
+
- **Alt giriş sınırı** — `chat` ve `charts` ana girişi yalnızca PAKET ADIYLA
|
|
571
|
+
alır (`subentry-boundary.test.ts`); göreli bir yol `UiProvider` bağlamının
|
|
572
|
+
ve kipsel yüzey yığınının ikinci bir kopyasını paketlerdi.
|
|
573
|
+
- **Yeşil ayak izi** — bileşen SCSS'inde yeşil token ailesine uzanan her
|
|
574
|
+
bileşen gerekçeli bir izin listesinde (`green-footprint.test.ts`).
|
|
575
|
+
- **Opacity ile soluklaştırma yasak** — `0`/`1` dışındaki her `opacity`
|
|
576
|
+
derlemeyi kırar (`passive-opacity.test.ts`); pasiflik token'larla çizilir.
|
|
577
|
+
- **iOS yakınlaştırması** — galerideki her metin girdisi dar ekranda ≥16px
|
|
578
|
+
(`e2e/mobile.spec.ts`, hesaplanmış stil).
|
|
579
|
+
- **Odak halkası ve hareket ölçeği** — stylelint, `focus-ring` mixin'i dışında
|
|
580
|
+
`outline` ve bileşen SCSS'inde ham süre değeri (`0.7s`) yazılmasını
|
|
581
|
+
engelliyor. Üç bileşen kendi halkasını, iki bileşen kendi süresini
|
|
582
|
+
yazıyordu.
|
|
583
|
+
|
|
584
|
+
### Cihaz nöbetçileri — `npm run test:device`
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
npm run test:device:install # WebKit + Chromium ikilileri (bir kez)
|
|
588
|
+
npm run test:device # ios (iPhone 14 · WebKit) + android (Pixel 7 · Chromium)
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Bu depodaki en pahalı hatalar masaüstünde **görünmüyordu**: alt sayfanın gövdesi
|
|
592
|
+
çöküyor, dip şerit klavyenin altında kalıyor, filtre seçenekleri maskenin
|
|
593
|
+
altında siliniyordu. Üçü de yerleşim/boyama hatası ve üçü de yalnızca gerçek bir
|
|
594
|
+
yerleşim motorunda ölçülebiliyor — jsdom bunları hiç hesaplamıyor.
|
|
595
|
+
|
|
596
|
+
**İki motor, çünkü bir motor yetmiyor.** iOS'taki her tarayıcı (Chrome dahil)
|
|
597
|
+
WebKit; Chromium'da doğru olan orada doğru olmak zorunda değil.
|
|
598
|
+
|
|
599
|
+
**Ekran görüntüsü değil sayı.** Bu koşu piksel karşılaştırmaz — yükseklik,
|
|
600
|
+
taşma, odak ve hesaplanmış CSS değeri ölçer. Yani platformdan bağımsız,
|
|
601
|
+
referans dosyası yok, `--update-snapshots` gerektirmiyor ve `test:visual`in
|
|
602
|
+
aksine **CI'da olduğu gibi koşabilir**.
|
|
603
|
+
|
|
604
|
+
**Emülasyonun dürüst sınırı.** Playwright'ın WebKit'i iOS Safari değil; çentik
|
|
605
|
+
payı (`env(safe-area-inset-*)` burada hep 0), ekran klavyesinin görünen alanı
|
|
606
|
+
daraltması, adres çubuğunun kaybolup gelmesi ve momentum kaydırma
|
|
607
|
+
yakalanmıyor. O sınırın altında kalanlar için savunma CSS'te taban değerlerde
|
|
608
|
+
(bkz. `bottom-sheet` mixin'i) ve onların nöbetçisi `e2e/bottom-sheet.spec.ts`.
|
|
609
|
+
|
|
610
|
+
**Görsel regresyon `verify` içinde değil**: ekran görüntüsü platforma bağlı
|
|
611
|
+
(yazı tipi tarama, alt piksel yumuşatma) ve macOS'te üretilmiş bir referans
|
|
612
|
+
ubuntu üzerinde koşan CI'da her dosyada kırmızı döner. Referanslar platform
|
|
613
|
+
başına saklanıyor (`e2e/__screenshots__/{platform}/`); CI'da açılacağı gün doğru
|
|
614
|
+
yol, Playwright'ın resmi konteynerinde koşup `linux` referanslarını orada
|
|
615
|
+
üretmek.
|
|
616
|
+
|
|
617
|
+
> ⚠ **Referansları yenilerken `--update-snapshots=all` yazın, çıplak
|
|
618
|
+
> `--update-snapshots` DEĞİL.** Ölçüldü (palet değişikliği turunda): çıplak
|
|
619
|
+
> bayrak yalnızca **eksik** referansı yazıyor; eşleşmeyeni ne yeniden üretiyor
|
|
620
|
+
> ne de kırıyor — koşu `40 passed` diyor, dosyalar eski renkte kalıyor ve
|
|
621
|
+
> ardından gelen doğrulama koşusu **eski referansı eski referansla**
|
|
622
|
+
> karşılaştırdığı için yeşil dönüyor. Yani sessizce yanlış bir "temiz" alınıyor.
|
|
623
|
+
> `=all` mod, pikseli değişen her dosyayı yazar (bayt bayt aynı olanlara
|
|
624
|
+
> dokunmaz, o yüzden dosya sayısı toplamdan az çıkabilir). Doğrulama:
|
|
625
|
+
> yenilemeden sonra bir referansın baskın renklerini örnekleyin.
|
|
626
|
+
> ⚠ `=changed` de yetmez: yalnızca eşiği (`maxDiffPixelRatio: 0.002`) aşan
|
|
627
|
+
> farkı yazar — iki küçük yazının kalktığı bir değişiklik eşiğin altında kalıp
|
|
628
|
+
> eski referans dosyada durur. Küçük bir değişiklikte bölümün referansını silip
|
|
629
|
+
> `=missing` ile yazdırın.
|
|
630
|
+
|
|
631
|
+
`master`a her push `npm publish` çalıştırır — **`package.json` sürümünü
|
|
632
|
+
yükseltmeyi unutmayın**, aynı sürüm ikinci kez yayımlanamaz ve iş akışı kırmızı
|
|
633
|
+
döner.
|
|
634
|
+
|
|
635
|
+
## Sohbet bileşenleri — `@handijit/ui/chat`
|
|
636
|
+
|
|
637
|
+
Sohbet ve araç arayüzleri için ayrı bir giriş; ana paketi ve `styles.css`i
|
|
638
|
+
büyütmez.
|
|
639
|
+
|
|
640
|
+
```tsx
|
|
641
|
+
import '@handijit/ui/styles.css';
|
|
642
|
+
import '@handijit/ui/chat.css'; // styles.css'TEN SONRA
|
|
643
|
+
|
|
644
|
+
import { UiProvider } from '@handijit/ui';
|
|
645
|
+
import { ChatMessage, ChatThread, PromptInput } from '@handijit/ui/chat';
|
|
646
|
+
|
|
647
|
+
<ChatThread
|
|
648
|
+
isStreaming={isStreaming}
|
|
649
|
+
dock={
|
|
650
|
+
<PromptInput
|
|
651
|
+
value={draft}
|
|
652
|
+
onChange={setDraft}
|
|
653
|
+
onSubmit={send}
|
|
654
|
+
onStop={stop}
|
|
655
|
+
isBusy={isStreaming}
|
|
656
|
+
placeholder="Mesajınızı yazın…"
|
|
657
|
+
/>
|
|
658
|
+
}
|
|
659
|
+
>
|
|
660
|
+
{messages.map(message => (
|
|
661
|
+
<ChatMessage key={message.id} author={message.author}>
|
|
662
|
+
{message.content}
|
|
663
|
+
</ChatMessage>
|
|
664
|
+
))}
|
|
665
|
+
</ChatThread>;
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
Metinler aynı sağlayıcıdan, `labels.chat` altında:
|
|
669
|
+
|
|
670
|
+
```tsx
|
|
671
|
+
<UiProvider
|
|
672
|
+
labels={{
|
|
673
|
+
chat: {
|
|
674
|
+
thread: 'Sohbet',
|
|
675
|
+
send: 'Gönder',
|
|
676
|
+
stop: 'Durdur',
|
|
677
|
+
scrollToLatest: 'En yeniye in',
|
|
678
|
+
replyReady: 'Yanıt hazır',
|
|
679
|
+
messageActions: 'Mesaj eylemleri',
|
|
680
|
+
sources: 'Kaynaklar',
|
|
681
|
+
citation: index => `Kaynak ${index}`,
|
|
682
|
+
stderr: 'hata çıktısı',
|
|
683
|
+
toolStatus: { running: 'çalışıyor', ok: 'tamamlandı', error: 'hata', aborted: 'durduruldu', interrupted: 'kesildi' },
|
|
684
|
+
codeCopy: language => `${language} kodunu kopyala`,
|
|
685
|
+
codeCopied: 'Kod kopyalandı',
|
|
686
|
+
},
|
|
687
|
+
}}
|
|
688
|
+
>
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
`CodeBlock` kodu kendisi vurgular ve biçimlendirir — bağımlılık yok, renkler
|
|
692
|
+
temayla döner:
|
|
693
|
+
|
|
694
|
+
```tsx
|
|
695
|
+
<CodeBlock language="json" code={JSON.stringify(payload)} />
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
JSON iki boşlukla yeniden girintilenir (değerler metin olarak korunur: büyük
|
|
699
|
+
sayılar yuvarlanmaz), kenardaki boş satırlar atılır; başka dilde girintiye
|
|
700
|
+
dokunulmaz. 30'dan fazla dil tanınır (ts/tsx, json, bash, python, yaml, css,
|
|
701
|
+
html, sql, diff, go, rust…), tanınmayan dil düz çizilir. Kopyala düğmesi ekranda
|
|
702
|
+
görüneni kopyalar. Renkler `chat.css`teki `--ui-syntax-keyword`, `-string`,
|
|
703
|
+
`-number`, `-name`, `-type` değişkenleridir; CSS'te ezilir. Shiki düzeyinde
|
|
704
|
+
doğruluk isterseniz önceden vurgulanmış HTML'i `html` olarak verin (güvenliği
|
|
705
|
+
sizin) — yerleşik vurgulayıcının yerine geçer.
|
|
706
|
+
|
|
707
|
+
Markdown ayrıştırması tüketicide kalır: `Prose` yalnızca tipografi kabıdır.
|
|
708
|
+
Bileşen listesi ve kararlar: `CLAUDE.md` → "`@handijit/ui/chat`".
|
|
709
|
+
|
|
710
|
+
## SCSS API — `@handijit/ui/scss`
|
|
711
|
+
|
|
712
|
+
Token değişkenleri ve mixin'ler kopyalanmadan alınır. Değişkenler
|
|
713
|
+
`var(--ui-…)` dizeleridir; tema çalışma zamanında döner. Modül kural basmaz;
|
|
714
|
+
`:root` token kuralları `base.css`tedir (bileşen modülleri onu kendileri getirir).
|
|
715
|
+
|
|
716
|
+
```scss
|
|
717
|
+
@use '@handijit/ui/scss' as ui;
|
|
718
|
+
|
|
719
|
+
.panel {
|
|
720
|
+
padding: ui.$space-4;
|
|
721
|
+
border: 1px solid ui.$border;
|
|
722
|
+
|
|
723
|
+
@include ui.focus-ring;
|
|
724
|
+
|
|
725
|
+
@media (max-width: ui.$breakpoint-tablet-portrait) {
|
|
726
|
+
padding: ui.$space-3;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
Next.js (Turbopack ve webpack) paket `exports`'unu çözer. Başka bir derleyici
|
|
732
|
+
çözemezse yol `node_modules/@handijit/ui/build/scss` ile `loadPaths`e verilip
|
|
733
|
+
`@use 'index' as @handijit/ui` yazılabilir.
|
|
734
|
+
|
|
735
|
+
## Grafikler — `@handijit/ui/charts`
|
|
736
|
+
|
|
737
|
+
On SVG grafiği, sıfır bağımlılık (çizim, ölçek ve istatistik kütüphanenin
|
|
738
|
+
kendisinde). Ana paketi ve `styles.css`i büyütmez.
|
|
739
|
+
|
|
740
|
+
```tsx
|
|
741
|
+
import '@handijit/ui/styles.css';
|
|
742
|
+
import '@handijit/ui/charts.css'; // styles.css'TEN SONRA
|
|
743
|
+
|
|
744
|
+
import { BarChart, LineChart, PieChart } from '@handijit/ui/charts';
|
|
745
|
+
|
|
746
|
+
<LineChart
|
|
747
|
+
label="Aylık gelir ve gider"
|
|
748
|
+
description="Gelir ekimde zirve yaptı"
|
|
749
|
+
xKey="month"
|
|
750
|
+
data={[
|
|
751
|
+
{ month: 'Oca', revenue: 120, cost: 90 },
|
|
752
|
+
{ month: 'Şub', revenue: 180, cost: null }, // null = veri yok: çizgi KESİLİR
|
|
753
|
+
]}
|
|
754
|
+
series={[
|
|
755
|
+
{ key: 'revenue', label: 'Gelir' },
|
|
756
|
+
{ key: 'cost', label: 'Gider', format: value => `${value} ₺` },
|
|
757
|
+
]}
|
|
758
|
+
/>;
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
| Grafik | Ne zaman |
|
|
762
|
+
|---|---|
|
|
763
|
+
| `LineChart` · `AreaChart` | Zaman içinde eğilim; `AreaChart isStacked` toplamın parçaları |
|
|
764
|
+
| `BarChart` | Kategorileri karşılaştırma; `orientation="horizontal"` uzun adlar için |
|
|
765
|
+
| `ComposedChart` | Çubuk + çizgi; farklı birim `axis: 'right'` |
|
|
766
|
+
| `PieChart` | Bir bütünün ≤6 parçası (`variant="donut"` varsayılan) |
|
|
767
|
+
| `ScatterPlot` | İki değişkenin ilişkisi; `size` ile balon |
|
|
768
|
+
| `Heatmap` | İki kategorik eksende yoğunluk (gün × saat) |
|
|
769
|
+
| `BoxPlot` · `Histogram` | Dağılım: grupları karşılaştırma · tek değişkenin şekli |
|
|
770
|
+
| `RadarChart` | Birkaç seriyi aynı eksen takımında; eksenler AYNI ölçekte |
|
|
771
|
+
|
|
772
|
+
Her grafik tek bir sekme durağıdır: oklar öğeleri gezer (gelinen öğe
|
|
773
|
+
duyurulur), `Home`/`End` uçlara gider, `Escape` vurguyu kaldırır. Ekran okuyucu
|
|
774
|
+
grafiği gizli bir **veri tablosu** olarak da okur. Genişlik kapsayıcıdan ölçülür
|
|
775
|
+
(`width` ile sabitlenebilir), yükseklik `height`. Sayılar `labels.locale`
|
|
776
|
+
yereliyle biçimlenir; ipucu, duyuru ve tablo `formatValue` / `format` ile
|
|
777
|
+
ezilir. Eksen bölmeleri bunu KULLANMAZ: kısa gösterimde ("12 B", "0,005") ve
|
|
778
|
+
birimsiz kalır, basamak sayısı bölme adımından gelir. Renkler kategorik paletten
|
|
779
|
+
(`tone`: `cat-1`…`cat-5`, `series-1`, `series-2`, `muted`).
|
|
780
|
+
|
|
781
|
+
## 1.0'a geçiş — `@ahmetilhn/hanui` 5.x'ten
|
|
782
|
+
|
|
783
|
+
1.0 iki şeyi birden getirir: **yeni ad** (`@ahmetilhn/hanui` → `@handijit/ui`; CSS öneki `hanui-` →
|
|
784
|
+
`ui-`, token'lar `--hanui-*` → `--ui-*`, `@layer ui`, `data-ui-theme`, `UiProvider`/`useUi`/`initUi`;
|
|
785
|
+
peer `@ahmetilhn/handy-utils` → `@handijit/utils`) ve 6.0 olarak hazırlanmış **paketleme** değişiklikleri.
|
|
786
|
+
6.0 bir **paketleme** sürümü: bileşen API'si değişmedi, kırılan şey paketin
|
|
787
|
+
dosya düzeni, `'use client'` sınırı ve CSS'in inişi. Tam liste `CHANGELOG.md`.
|
|
788
|
+
|
|
789
|
+
| 5.x | 6.0 |
|
|
790
|
+
|---|---|
|
|
791
|
+
| `import '@handijit/ui/styles.css'` | ESM'de **silinir** — bileşen modülleri `base.css` + kendi `style.css`ini getirir; CJS/paketleyicisiz kullanımda kalır |
|
|
792
|
+
| tek `build/index.js`, tamamı `'use client'` | `build/components/<Ad>/index.js`; 18 bileşen yönergesiz (sunucuda çizilir), alt yol `@handijit/ui/<kebab-ad>` |
|
|
793
|
+
| `build/index.d.ts` toplanmış | dosya başına `.d.ts`; `import type` aynı |
|
|
794
|
+
| `Combobox` tetikleyicisi `role="button"`, arama kutusu `role="combobox"` | tetikleyici `role="combobox"` (`aria-expanded`, `aria-controls`, `aria-invalid`, `aria-required`), arama kutusu metin kutusu |
|
|
795
|
+
| bağlantı `Button` pasifken `preventDefault` işleyicisi | `aria-disabled` + `tabIndex=-1` + `pointer-events: none`; işlev prop'u yok (sunucudan çizilebilir) |
|
|
796
|
+
| site ezmesi sınıf seçicisiyle | **bileşen değişkenleri** (aşağıda) |
|
|
797
|
+
|
|
798
|
+
### Bileşen değişkenleri
|
|
799
|
+
|
|
800
|
+
Token sözleşmesinin (`--ui-page`, `--ui-text`… 110 ad) dışında, tek bir
|
|
801
|
+
bileşenin görünümünü tüketicinin `:root`ta ezdiği CSS özel özellikleri. Bileşen
|
|
802
|
+
`var(--ui-…, varsayılan)` ile okur; yazılmazsa varsayılan geçerlidir.
|
|
803
|
+
|
|
804
|
+
| Bileşen | Değişkenler |
|
|
805
|
+
|---|---|
|
|
806
|
+
| odak halkası | `--ui-ring-width` (2px) · `--ui-ring-offset` (2px; öğenin içine çekmek için `-2px`) |
|
|
807
|
+
| girdiler | `--ui-placeholder` (`text-3`) |
|
|
808
|
+
| kipsel perde | `--ui-scrim-blur` (3px) |
|
|
809
|
+
| `Button` | `--ui-button-radius` · `-weight` · `-tracking` · `-wrap` (`nowrap`) |
|
|
810
|
+
| `Chip` | `--ui-chip-bg` · `-line` · `-fg` · `-radius` · `-weight` · `-selected-bg` · `-selected-line` · `-selected-fg` · `-selected-weight` |
|
|
811
|
+
| `Badge` | `--ui-badge-font` · `-weight` · `-tracking` · `-transform` · `-radius` (+ `-bg` · `-line` · `-fg`, 5.x) |
|
|
812
|
+
| `Stat` | `--ui-stat-label-font/-size/-weight/-tracking/-transform` · `-value-font/-weight/-tracking` · `-unit-font/-size/-tracking/-transform` |
|
|
813
|
+
| `Tabs` | `--ui-tab-weight` |
|
|
814
|
+
| `RadioCard` | `--ui-radio-card-line` · `-radius` |
|
|
815
|
+
|
|
816
|
+
```css
|
|
817
|
+
:root {
|
|
818
|
+
--ui-ring-offset: -2px;
|
|
819
|
+
--ui-button-weight: 500;
|
|
820
|
+
--ui-chip-radius: var(--ui-radius-pill);
|
|
821
|
+
--ui-badge-font: var(--ui-font-mono);
|
|
822
|
+
--ui-badge-transform: uppercase;
|
|
823
|
+
}
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
## 5.0'a geçiş
|
|
827
|
+
|
|
828
|
+
5.0 bir **renk** sürümü: nötr eksen yeşilden sıcak mürekkebe geçti, yeşil
|
|
829
|
+
yalnızca eylem, bağlantı ve odakta kaldı. Bileşen API'si değişmedi; kırılan şey
|
|
830
|
+
token adları ve görünüm.
|
|
831
|
+
|
|
832
|
+
| 4.x token | 5.0 |
|
|
833
|
+
|---|---|
|
|
834
|
+
| `role`, `role-hover`, `role-active` | `selected`, `selected-hover`, `selected-active` (mürekkep) |
|
|
835
|
+
| `on-role` | `on-selected` |
|
|
836
|
+
| `role-tint` / `role-line` | `selected-tint` / `selected-line` |
|
|
837
|
+
| `role-text` | `link` (+ `link-hover`) |
|
|
838
|
+
| `shell*` | aynı ad, değer çamdan mürekkebe; yeni `on-shell`, `on-shell-2`, `on-shell-danger`, `shell-line` |
|
|
839
|
+
| — | `cat-1…5`, `series-1/2` (kategorik palet) |
|
|
840
|
+
|
|
841
|
+
Eski adlara takma ad **yok**. Kendi CSS'inizde `--ui-role*` okuyan ya da
|
|
842
|
+
`theme={{ light: { role: … } }}` ezmesi yazan yerler yeni adlara geçer.
|
|
843
|
+
Görünüm değişiklikleri: açık sayfa krem (`#faf9f5`), koyu sayfa sıcak siyah
|
|
844
|
+
(`#141413`), kart ve panel durgunken gölgesiz, `info` tonu nötr, `CodeBadge`
|
|
845
|
+
mürekkep. Ayrıntı ve ölçümler: `CLAUDE.md` → "Renk kararları (5.0)".
|
|
846
|
+
|
|
847
|
+
## 5.1 – 5.6'da eklenenler
|
|
848
|
+
|
|
849
|
+
Hepsi ekleme; 5.0'ın token sözleşmesi dışında kırıcı değişiklik yok.
|
|
850
|
+
|
|
851
|
+
| Sürüm | Ne |
|
|
852
|
+
|---|---|
|
|
853
|
+
| 5.1 | `Disclosure`, `StatusDot`, `Kbd`; `useUiTokens`, `useStickToBottom`, `hasOpenSurface`; `Modal size="xl"`, `Button size={UISize.XSMALL}` + `shape="pill"`, `IconButton shape="round"`, `Textarea variant="bare"`, `Progress size="xs"`, etkileşimli `CodeBadge`, `Avatar` (`icon`, `shape="rounded"`, `tone="brand"`), `Stat variant="inline"`, `ScrollArea isFollowingEnd`; `CommandPalette` `hotkey` + komut kapanıştan SONRA çalışır |
|
|
854
|
+
| 5.2 | `UiThemeScript`; `@handijit/ui/chat` — 20 sohbet bileşeni |
|
|
855
|
+
| 5.3 | `@handijit/ui/charts` — 10 SVG grafiği; `@handijit/ui/scss`; `Input --technical` dar ekranda ≥16px; `QuantityStepper` ve `DataTable` pasif/dinlenme hâli opacity yerine token |
|
|
856
|
+
| 5.3.2 | Düzeltme: kaydırma kapları kapsayıcı blok (`ChatThread`, `ScrollArea`, `TerminalOutput`, `ActionList` ve 12 kab daha) — görsel olarak gizli metin kabın dışına taşıp atalarını kaydırılabilir yapmıyor; grafik ekseni 0,1'in altındaki adımda sıfıra çökmüyor |
|
|
857
|
+
| 5.4 | `CodeBlock` yerleşik vurgulayıcı ve biçimlendirici (bağımlılıksız, 30+ dil); sözdizimi renkleri `--ui-syntax-*` (yalnızca `chat.css`) |
|
|
858
|
+
| 5.5 | `Input`, `DateField`, `DateRange` `size="sm"` (36px — `Select sm` ve `Button` SMALL ile tek hiza); SCSS `input-sm` mixin'i; yerel sayısal `size` niteliği bu üç girdinin tipinden çıktı |
|
|
859
|
+
| 5.6 | `ContextMenu` — imleç noktasında açılan menü (sağ tık), `role="menu"` dışında başlık; `Menu` ile ortak yüzey; `usePositioning` öğesiz (nokta) çapayı da ölçer; düzeltme: `Menu` açılışta odağı gerçekten ilk öğeye taşır (gerçek tarayıcıda `<body>`de kalıyordu) |
|
|
860
|
+
|
|
861
|
+
Ayrıntı ve ölçülmüş gerekçeler: `CLAUDE.md` → "Göç ve `@deprecated` yollar",
|
|
862
|
+
"`@handijit/ui/chat`", "`@handijit/ui/charts`".
|
|
863
|
+
|
|
864
|
+
## Tasarım sözleşmesi
|
|
865
|
+
|
|
866
|
+
Öğe seçimi (hangi durumda hangi bileşen), yüzey/yükseklik merdiveni, renk
|
|
867
|
+
kararları, durum tintleri, tipografi rolleri, erişilebilirlik eşikleri, hareket
|
|
868
|
+
ölçeği ve `@deprecated` göç yolları **`CLAUDE.md`** içindedir. O dosya
|
|
869
|
+
kütüphaneyi kullanan uygulamalar için de normatiftir.
|
|
870
|
+
|
|
871
|
+
## Lisans
|
|
872
|
+
|
|
873
|
+
MIT
|