@ryuzaki13/react-foundation-ui 3.0.1 → 3.1.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.
Files changed (270) hide show
  1. package/COLOR_TOKENS_MIGRATION.md +66 -50
  2. package/README.md +8 -13
  3. package/dist/chunks/badge-6mXO9BWP.js.map +1 -1
  4. package/dist/chunks/ui.module-oRwY3Zli.js.map +1 -1
  5. package/dist/notifications/index.js.map +1 -1
  6. package/dist/styles.css +1 -1
  7. package/dist/tag-input/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/styles/_tone-derived.scss +18 -0
  10. package/src/styles/mixins/_controls.scss +3 -7
  11. package/src/styles/mixins/controls.test.ts +25 -0
  12. package/src/styles/themes/_theme.scss +19 -5
  13. package/src/styles/themes/theme.test.ts +30 -4
  14. package/storybook-static/assets/{Badge-CPJUZBAx.js → Badge-Esh85lzw.js} +1 -1
  15. package/storybook-static/assets/{Badge.stories-BV9Ob_Oc.js → Badge.stories-DnU4Aj8m.js} +1 -1
  16. package/storybook-static/assets/{BadgeList-CtdWGEn6.js → BadgeList-BxlBVt--.js} +1 -1
  17. package/storybook-static/assets/{BarcodeScannerDialog.stories-B_wBhs1h.js → BarcodeScannerDialog.stories-B_KpAvZI.js} +1 -1
  18. package/storybook-static/assets/{Button-BO03YvyD.js → Button-ZXxiD9P_.js} +1 -1
  19. package/storybook-static/assets/{Button-DJgPWpef.js → Button-dvkBzy21.js} +1 -1
  20. package/storybook-static/assets/{Button.stories-DhqncZmo.js → Button.stories-J4sJtC3v.js} +1 -1
  21. package/storybook-static/assets/{CalendarView-Ctgt0vSh.js → CalendarView-DGp2C40d.js} +1 -1
  22. package/storybook-static/assets/{CheckBox-x4MtRKCD.js → CheckBox-CGIztaSc.js} +1 -1
  23. package/storybook-static/assets/{CheckBox-BOIYiJm5.js → CheckBox-IWsEVvwo.js} +1 -1
  24. package/storybook-static/assets/{CheckBox.stories-B-YhjVpn.js → CheckBox.stories-PatAgJNg.js} +1 -1
  25. package/storybook-static/assets/{Color-6AOWCN3U-D2hSJGdc.js → Color-6AOWCN3U-CObFhsdH.js} +1 -1
  26. package/storybook-static/assets/{ContextMenu--tEb29lb.js → ContextMenu-BpMNIGaS.js} +1 -1
  27. package/storybook-static/assets/{ContextMenu-ConDIkSx.js → ContextMenu-PtQCIWby.js} +1 -1
  28. package/storybook-static/assets/{ContextMenu.stories-DdZB2dQb.js → ContextMenu.stories-DRN3y3fq.js} +1 -1
  29. package/storybook-static/assets/{CustomOptionButton-D9_PjL0f.js → CustomOptionButton-BypRyNBF.js} +1 -1
  30. package/storybook-static/assets/{DateInput-D1XJQ-6l.js → DateInput-CtEsHpVC.js} +1 -1
  31. package/storybook-static/assets/{DateInput-Dh0ZTlaK.js → DateInput-DMRmP2mq.js} +1 -1
  32. package/storybook-static/assets/{DateInput.stories-YIy6ns7j.js → DateInput.stories-kwV29Z7O.js} +1 -1
  33. package/storybook-static/assets/{DateRangePresetSelect-Xy9xMJwE.js → DateRangePresetSelect-BBppsGIA.js} +1 -1
  34. package/storybook-static/assets/{DateRangePresetSelect-CfCtwULa.js → DateRangePresetSelect-BSZ8AV5V.js} +1 -1
  35. package/storybook-static/assets/{DateRangePresetSelect.stories-Cp8bCPPr.js → DateRangePresetSelect.stories-Brt_WHDa.js} +1 -1
  36. package/storybook-static/assets/{Detail-V4a7PEQy.js → Detail-DgopeQrm.js} +1 -1
  37. package/storybook-static/assets/{Detail.stories-CaltBUzP.js → Detail.stories-9gNYQ6_t.js} +1 -1
  38. package/storybook-static/assets/{Dialog-CwIJrdeS.js → Dialog-BIMDgQGd.js} +1 -1
  39. package/storybook-static/assets/{Dialog-TBOx7xuG.js → Dialog-BmgaXy1U.js} +1 -1
  40. package/storybook-static/assets/{Dialog.stories-BWXw_XOW.js → Dialog.stories-gQNF3xNZ.js} +1 -1
  41. package/storybook-static/assets/{Disclosure-ptHsbm71.js → Disclosure-DYkWCvOB.js} +1 -1
  42. package/storybook-static/assets/{Disclosure.stories-CG2LclkF.js → Disclosure.stories-BkgXZx5X.js} +1 -1
  43. package/storybook-static/assets/{DisclosureGroup-CseVXRGI.js → DisclosureGroup-CTkOG9uF.js} +1 -1
  44. package/storybook-static/assets/{DocsRenderer-JROSPFPF-Cz6wf1E5.js → DocsRenderer-JROSPFPF-CGYd7juA.js} +1 -1
  45. package/storybook-static/assets/{DropZone-CRai68J2.js → DropZone-BwnzxS_O.js} +1 -1
  46. package/storybook-static/assets/{DropZone-D_zss6IH.js → DropZone-C_QHZrKt.js} +1 -1
  47. package/storybook-static/assets/{DropZone.stories-DieoYknx.js → DropZone.stories-Boz52u36.js} +1 -1
  48. package/storybook-static/assets/{DropdownMenu-BojaSt_0.js → DropdownMenu-CSMB10lt.js} +1 -1
  49. package/storybook-static/assets/{ExpandableActionPanel-BiS2kSkL.js → ExpandableActionPanel-Bs__dpSI.js} +1 -1
  50. package/storybook-static/assets/{ExpandableActionPanel.stories-CMaKcNjZ.js → ExpandableActionPanel.stories-dz1gGOjf.js} +1 -1
  51. package/storybook-static/assets/{Flex-4xyVvQjb.js → Flex-B1k5JrkX.js} +1 -1
  52. package/storybook-static/assets/{Flex.stories-C3tQavbS.js → Flex.stories-DCEdIXaL.js} +1 -1
  53. package/storybook-static/assets/{FloatingPopover-D-hgsDWB.js → FloatingPopover-Bcol5irF.js} +1 -1
  54. package/storybook-static/assets/{FormattedTableCell-BIx_wHxt.js → FormattedTableCell-BrUuqaAr.js} +1 -1
  55. package/storybook-static/assets/{Grid-D_tQSQsa.js → Grid-BP-ULpSq.js} +1 -1
  56. package/storybook-static/assets/{Grid.stories-rm-LBWqc.js → Grid.stories-xZTqePJe.js} +1 -1
  57. package/storybook-static/assets/{ImageCropper.stories-TWj6EUhv.js → ImageCropper.stories-9VlHvauM.js} +1 -1
  58. package/storybook-static/assets/{ImageRenderer-fJY5cwIZ.js → ImageRenderer-CZUio12Y.js} +1 -1
  59. package/storybook-static/assets/{ImageRenderer.stories-COWaXJSu.js → ImageRenderer.stories-BMJ8rG5Y.js} +1 -1
  60. package/storybook-static/assets/{ImageView.stories-CarFyXxF.js → ImageView.stories-DwbVXc_9.js} +1 -1
  61. package/storybook-static/assets/{ImageViewer.stories-WwLkgsZl.js → ImageViewer.stories-N79zIcYB.js} +2 -2
  62. package/storybook-static/assets/{ImageViewerRuntime-Dg1heG9I.js → ImageViewerRuntime-eFkLooZd.js} +1 -1
  63. package/storybook-static/assets/{Input-CRMRR0du.js → Input-C_pApI-f.js} +1 -1
  64. package/storybook-static/assets/{Input-BqipFubD.js → Input-fyfY8tUJ.js} +1 -1
  65. package/storybook-static/assets/{Input.stories-BZBQd_Yo.js → Input.stories-DPx50f_P.js} +1 -1
  66. package/storybook-static/assets/{InputDateTime-BKzFQcD2.js → InputDateTime-BKOW723d.js} +1 -1
  67. package/storybook-static/assets/{InputDateTime.stories-B3dXU0or.js → InputDateTime.stories-DJpICa-C.js} +1 -1
  68. package/storybook-static/assets/{InputFile-C3iCB2fV.js → InputFile-BIFMqbBI.js} +1 -1
  69. package/storybook-static/assets/{InputFile-Dl4khE53.js → InputFile-CX8kMBfN.js} +1 -1
  70. package/storybook-static/assets/{InputFile.stories-DYqlThPW.js → InputFile.stories-Dpiz4AE-.js} +1 -1
  71. package/storybook-static/assets/{InputFiles-CWyvWdT6.js → InputFiles-B-uYeAwK.js} +1 -1
  72. package/storybook-static/assets/{InputFiles-fSWRgPQt.js → InputFiles-g6BxqKY1.js} +1 -1
  73. package/storybook-static/assets/{InputFiles.stories-wwrSxxCj.js → InputFiles.stories-CIeEtuge.js} +1 -1
  74. package/storybook-static/assets/{InputFilesList-dPZoA3cU.js → InputFilesList-EUw0PgRa.js} +1 -1
  75. package/storybook-static/assets/{InputImage-hI2j2ETf.js → InputImage-BHhhQ_DL.js} +1 -1
  76. package/storybook-static/assets/{InputImage-DbK6OW82.js → InputImage-G56Xrlxa.js} +1 -1
  77. package/storybook-static/assets/{InputImage.stories-BmjAuHh6.js → InputImage.stories-CzcxWNCg.js} +1 -1
  78. package/storybook-static/assets/{InteractiveComponents-CP9rMbrV.js → InteractiveComponents-BwuEU-Jx.js} +1 -1
  79. package/storybook-static/assets/{InteractiveComponents.stories-DWGP7kN9.js → InteractiveComponents.stories-BFz-Wro0.js} +1 -1
  80. package/storybook-static/assets/{LayoutPicker-B6l0KM01.js → LayoutPicker-XV5w8WPa.js} +1 -1
  81. package/storybook-static/assets/{LayoutPicker-BqPt4z1o.js → LayoutPicker-dIhabh1s.js} +1 -1
  82. package/storybook-static/assets/{LayoutPicker.stories-CobjDPnt.js → LayoutPicker.stories-CDt2569o.js} +1 -1
  83. package/storybook-static/assets/{Listbox-VYmcGjMI.js → Listbox-Bgo-nQ9Y.js} +1 -1
  84. package/storybook-static/assets/{Listbox-D8wHXixj.js → Listbox-DaW_mGeW.js} +1 -1
  85. package/storybook-static/assets/{Listbox.stories-DwGQUQ0i.js → Listbox.stories-CP6wE_7K.js} +1 -1
  86. package/storybook-static/assets/{Modal-J__v8Hop.js → Modal-Bqw7AE8B.js} +1 -1
  87. package/storybook-static/assets/{Modal-gdYxFkXo.js → Modal-DDvcZVCM.js} +1 -1
  88. package/storybook-static/assets/{Modal.stories-DIs97N2U.js → Modal.stories-BX600McN.js} +1 -1
  89. package/storybook-static/assets/{ModalManagerProvider-LwIYImtY.js → ModalManagerProvider-CxtoDU9F.js} +1 -1
  90. package/storybook-static/assets/{MultiSelect-DoJsmrgD.js → MultiSelect-BJIs_9bc.js} +1 -1
  91. package/storybook-static/assets/{MultiSelect-DxLtgKfo.js → MultiSelect-yUk0g6i1.js} +1 -1
  92. package/storybook-static/assets/{MultiSelect.stories-gbsa3dqJ.js → MultiSelect.stories-DK5hmxUc.js} +1 -1
  93. package/storybook-static/assets/{NoData-o_sLpPoU.js → NoData-hc4EFPB8.js} +1 -1
  94. package/storybook-static/assets/{NotificationsHost-BMBxunA0.js → NotificationsHost-DJrgoJC_.js} +1 -1
  95. package/storybook-static/assets/{NotificationsHost.stories-BzoCtqMU.js → NotificationsHost.stories-D7mi4TqE.js} +1 -1
  96. package/storybook-static/assets/{ODataMultiSelect-CcbmxqpZ.js → ODataMultiSelect-DNrfwZV0.js} +1 -1
  97. package/storybook-static/assets/{ODataMultiSelect.stories-zw67beZc.js → ODataMultiSelect.stories-kL4DXKxt.js} +1 -1
  98. package/storybook-static/assets/{ODataSelect-CXW8j-z7.js → ODataSelect-DCDQ6QDE.js} +1 -1
  99. package/storybook-static/assets/{ODataSelect.stories-TQM6_DYK.js → ODataSelect.stories-C6kKriiF.js} +1 -1
  100. package/storybook-static/assets/{ODataTreeMultiSelect-DGF8-pWk.js → ODataTreeMultiSelect-CHVUlk_U.js} +1 -1
  101. package/storybook-static/assets/{ODataTreeMultiSelect.stories-Dd_0ra7b.js → ODataTreeMultiSelect.stories-B9FhGd09.js} +1 -1
  102. package/storybook-static/assets/{ODataTreeSelect-VuBknyZd.js → ODataTreeSelect-BtOXQoID.js} +1 -1
  103. package/storybook-static/assets/{ODataTreeSelect.stories-BtzFf_u0.js → ODataTreeSelect.stories-Chqlab-8.js} +1 -1
  104. package/storybook-static/assets/{OneStepScroller-DZNxJvgJ.js → OneStepScroller-DxeS1X71.js} +1 -1
  105. package/storybook-static/assets/{Option-B4DvYPy2.js → Option-ComrvJ9s.js} +1 -1
  106. package/storybook-static/assets/{OptionButton-C4VuB9n6.js → OptionButton-DJAuLjhy.js} +1 -1
  107. package/storybook-static/assets/{PeriodSelect-DSxwgwCW.js → PeriodSelect-DcD82ag2.js} +1 -1
  108. package/storybook-static/assets/{PeriodSelect-B8ox22dv.js → PeriodSelect-RGiWiGWB.js} +1 -1
  109. package/storybook-static/assets/{PeriodSelect.stories-CjTMQdsC.js → PeriodSelect.stories-J0FBtti2.js} +1 -1
  110. package/storybook-static/assets/{PickerField-CIzr66S8.js → PickerField-BamGqyTg.js} +1 -1
  111. package/storybook-static/assets/{PickerTriggerActions-jZXgVj2i.js → PickerTriggerActions-CrzexZv7.js} +1 -1
  112. package/storybook-static/assets/{Popover-BpC72C2z.js → Popover-7hIGWFil.js} +1 -1
  113. package/storybook-static/assets/{Popover-CtpYUZz7.js → Popover-DA6FuPO9.js} +1 -1
  114. package/storybook-static/assets/{Popover.stories-BujYLT_N.js → Popover.stories-BGX_E2Rj.js} +1 -1
  115. package/storybook-static/assets/{PresetRangeDateInput-v5tpwKOr.js → PresetRangeDateInput-BZ5e4ulz.js} +1 -1
  116. package/storybook-static/assets/{PresetRangeDateInput-C6Y1OPu2.js → PresetRangeDateInput-DEMn-CKo.js} +1 -1
  117. package/storybook-static/assets/{PresetRangeDateInput.stories-DXJi-hz8.js → PresetRangeDateInput.stories-DyQzNJiA.js} +1 -1
  118. package/storybook-static/assets/{PresetSelect-gK2K5zkH.js → PresetSelect-BsGseZxe.js} +1 -1
  119. package/storybook-static/assets/{README-BUvT1PC3.js → README-4wAMpqKW.js} +1 -1
  120. package/storybook-static/assets/{README-tSD_oNwO.js → README-530UIsM5.js} +1 -1
  121. package/storybook-static/assets/{README-DUr25qzJ.js → README-97xTDGmC.js} +1 -1
  122. package/storybook-static/assets/{README-BJ9k0Np6.js → README-B71F0K0c.js} +1 -1
  123. package/storybook-static/assets/{README-Daf_hy33.js → README-B7DR00fM.js} +1 -1
  124. package/storybook-static/assets/{README-BC0N2gII.js → README-B84EaQXv.js} +1 -1
  125. package/storybook-static/assets/{README-BkP5HRKY.js → README-BC4xt0AQ.js} +1 -1
  126. package/storybook-static/assets/{README-DTSAWBmg.js → README-BUa64A8D.js} +1 -1
  127. package/storybook-static/assets/{README-tWeRF96t.js → README-BXdudd03.js} +1 -1
  128. package/storybook-static/assets/{README-CV2hDek-.js → README-BbONAExJ.js} +1 -1
  129. package/storybook-static/assets/{README-CYI_EOl0.js → README-BcrNbNjI.js} +1 -1
  130. package/storybook-static/assets/{README-ByB4pX-h.js → README-BgRQJ2S9.js} +1 -1
  131. package/storybook-static/assets/{README-Cm8APMxg.js → README-BhxFmTpV.js} +1 -1
  132. package/storybook-static/assets/{README-DFnpGGTR.js → README-Bjq9zsXL.js} +1 -1
  133. package/storybook-static/assets/{README-35Rz4zJn.js → README-BmrxdH-B.js} +1 -1
  134. package/storybook-static/assets/{README-BEvGMEjK.js → README-BrIfTQtc.js} +1 -1
  135. package/storybook-static/assets/{README-BFt1rK1m.js → README-Bup4xuqw.js} +1 -1
  136. package/storybook-static/assets/{README-SLh2SkXm.js → README-C0GgcK-F.js} +1 -1
  137. package/storybook-static/assets/{README-C9WDex0g.js → README-C1zwQgxk.js} +1 -1
  138. package/storybook-static/assets/{README-ZeIvwrze.js → README-C4KUJF4d.js} +1 -1
  139. package/storybook-static/assets/{README-9FkDpJNL.js → README-C8fBLb8Q.js} +1 -1
  140. package/storybook-static/assets/{README-Cgz1iUWg.js → README-CAaN4Ld-.js} +1 -1
  141. package/storybook-static/assets/{README-DjuBYSZf.js → README-CFR0mu0U.js} +1 -1
  142. package/storybook-static/assets/{README-BARPT1_b.js → README-CGovAIuH.js} +1 -1
  143. package/storybook-static/assets/{README-DwIqFkLN.js → README-CQn8q9y9.js} +1 -1
  144. package/storybook-static/assets/{README-BWp5_vwI.js → README-CUhyCSGc.js} +1 -1
  145. package/storybook-static/assets/{README-C7xESdeZ.js → README-CY5Rzd4q.js} +1 -1
  146. package/storybook-static/assets/{README-76skvum6.js → README-CgkwwR69.js} +1 -1
  147. package/storybook-static/assets/{README-CEg7RhiN.js → README-CmkOA3wW.js} +1 -1
  148. package/storybook-static/assets/{README-BsO3rGAo.js → README-CwZI_nQ7.js} +1 -1
  149. package/storybook-static/assets/{README-BPeCkxf5.js → README-D2L5Yzv1.js} +1 -1
  150. package/storybook-static/assets/{README-DWdFUqVy.js → README-D7L1Z6n9.js} +1 -1
  151. package/storybook-static/assets/{README-C0ZKA9b-.js → README-D7_WRUZg.js} +1 -1
  152. package/storybook-static/assets/{README-BNb4F90Z.js → README-DCJ0rsOW.js} +1 -1
  153. package/storybook-static/assets/{README-BN7MT2Ap.js → README-DETry3fH.js} +1 -1
  154. package/storybook-static/assets/{README-BovclOxj.js → README-DHwyWwmz.js} +1 -1
  155. package/storybook-static/assets/{README-Uy_ptFqX.js → README-DMvM0CFG.js} +1 -1
  156. package/storybook-static/assets/{README-DOgmLyjE.js → README-DP6FJt9L.js} +1 -1
  157. package/storybook-static/assets/{README-BeUl88Dw.js → README-DYrhoV2x.js} +1 -1
  158. package/storybook-static/assets/{README-fC8saBR0.js → README-DhMfO2Dl.js} +1 -1
  159. package/storybook-static/assets/{README-CrMVq7Lw.js → README-DhOlNM3a.js} +1 -1
  160. package/storybook-static/assets/{README-PVmZhf60.js → README-DnkpFu02.js} +1 -1
  161. package/storybook-static/assets/{README-p3wyWaCG.js → README-DtM6kMym.js} +1 -1
  162. package/storybook-static/assets/{README-CGVpfLua.js → README-DuTHnM3g.js} +1 -1
  163. package/storybook-static/assets/{README-Dj-J1DiV.js → README-DvZb2tQw.js} +1 -1
  164. package/storybook-static/assets/{README-CJazQDMs.js → README-DzJwLpxb.js} +1 -1
  165. package/storybook-static/assets/{README-DtFIYO3L.js → README-Ld_nuS76.js} +1 -1
  166. package/storybook-static/assets/{README-BNk4sKbP.js → README-UQVgPCo3.js} +1 -1
  167. package/storybook-static/assets/{README-DgvV1tz2.js → README-YY1Ajz1w.js} +1 -1
  168. package/storybook-static/assets/{README-DKn16Q4N.js → README-_ZkqcsGp.js} +1 -1
  169. package/storybook-static/assets/{README-CHLqXECy.js → README-_oeRmsba.js} +1 -1
  170. package/storybook-static/assets/{README-Dd4omKy5.js → README-mRxMTW_Z.js} +1 -1
  171. package/storybook-static/assets/{README-DjHS3LyZ.js → README-y9Bfe8iT.js} +1 -1
  172. package/storybook-static/assets/{RadioButton-D-hGkjCE.js → RadioButton-0axQ-WvZ.js} +1 -1
  173. package/storybook-static/assets/{RadioButton-SQQ0XZh_.js → RadioButton-AUoosUqB.js} +1 -1
  174. package/storybook-static/assets/{RadioButton.stories-y_RgH92I.js → RadioButton.stories-Dqe-r3lD.js} +1 -1
  175. package/storybook-static/assets/{RadioGroup-c4001gHC.js → RadioGroup-BgCjgFfe.js} +1 -1
  176. package/storybook-static/assets/{RadioGroup-BbZbR0Nd.js → RadioGroup-Biy7jsOy.js} +1 -1
  177. package/storybook-static/assets/{RadioGroup.stories-VUC3P22Z.js → RadioGroup.stories-CHvNWKTQ.js} +1 -1
  178. package/storybook-static/assets/{Scrollable-BCbWuy4A.js → Scrollable-BYmva3ep.js} +1 -1
  179. package/storybook-static/assets/{Select-B9E7ahIl.js → Select-CZCJfh1u.js} +1 -1
  180. package/storybook-static/assets/{Select-CJ33Sv-J.js → Select-CoD4ahoj.js} +1 -1
  181. package/storybook-static/assets/{Select.stories-BcAnEbEn.js → Select.stories-B-PY1Sz5.js} +1 -1
  182. package/storybook-static/assets/{SerializableSelect-BPS2hfyJ.js → SerializableSelect-DE8iNPWu.js} +1 -1
  183. package/storybook-static/assets/{SerializableSelect.stories-CM1ncPEp.js → SerializableSelect.stories-Cgd2VT8m.js} +1 -1
  184. package/storybook-static/assets/{SingleDateTimeInput-gTTeUwQu.js → SingleDateTimeInput-BDHCGYJi.js} +1 -1
  185. package/storybook-static/assets/{SingleDateTimeInput-BHYCHJQE.js → SingleDateTimeInput-BzOL-IZJ.js} +1 -1
  186. package/storybook-static/assets/{SingleDateTimeInput.stories-CbmsCFpW.js → SingleDateTimeInput.stories-yuCgjvxm.js} +1 -1
  187. package/storybook-static/assets/{Slider-RBZi0g2K.js → Slider-BSYDJi1k.js} +1 -1
  188. package/storybook-static/assets/{Slider-CGKqjm7X.js → Slider-Bx2jKg6R.js} +1 -1
  189. package/storybook-static/assets/{Slider.stories-PSyMsLLp.js → Slider.stories-P23SMkMP.js} +1 -1
  190. package/storybook-static/assets/{SliderInput-Df9TmEKF.js → SliderInput-AgH6kueH.js} +1 -1
  191. package/storybook-static/assets/{SliderInput-CznPoK1l.js → SliderInput-CfK1Mnw8.js} +1 -1
  192. package/storybook-static/assets/{SliderInput.stories-BQiRt7bg.js → SliderInput.stories-BIZQY77N.js} +1 -1
  193. package/storybook-static/assets/{Sortable-D42YEoo9.js → Sortable-HAt33EOU.js} +1 -1
  194. package/storybook-static/assets/{Sortable.stories-DkJeEE-A.js → Sortable.stories-DpKHUgP7.js} +1 -1
  195. package/storybook-static/assets/{Splitter-DlRtVvJG.js → Splitter-XHLzIzBV.js} +1 -1
  196. package/storybook-static/assets/{Splitter.stories-CWV7Ofeq.js → Splitter.stories-AF5cuIrd.js} +1 -1
  197. package/storybook-static/assets/{StateSelect-DSmcFkB_.js → StateSelect-Bc7THQz4.js} +1 -1
  198. package/storybook-static/assets/{StateSelect-Cx2e1djS.js → StateSelect-D_4JId4p.js} +1 -1
  199. package/storybook-static/assets/{StateSelect.stories-DE36S04p.js → StateSelect.stories-Dskb5EaO.js} +1 -1
  200. package/storybook-static/assets/{StatusIndicator-5q4RVrlX.js → StatusIndicator-DgpNsNH9.js} +1 -1
  201. package/storybook-static/assets/{StatusIndicator.stories-ChoX8YBt.js → StatusIndicator.stories-CggWAarU.js} +1 -1
  202. package/storybook-static/assets/{StringToggle.stories-C3yjPy-u.js → StringToggle.stories-C0ZhO81t.js} +1 -1
  203. package/storybook-static/assets/{Switch-BVC4Fwd3.js → Switch-CknduYVb.js} +1 -1
  204. package/storybook-static/assets/{Switch-AbpldWAB.js → Switch-f3dsucrL.js} +1 -1
  205. package/storybook-static/assets/{Switch.stories-FPuGI2wa.js → Switch.stories-Chg3TrE2.js} +1 -1
  206. package/storybook-static/assets/{Table-Supenh30.js → Table-A1OmUB1G.js} +1 -1
  207. package/storybook-static/assets/{Table.stories-DF5hgk3V.js → Table.stories-F0G5NqxY.js} +1 -1
  208. package/storybook-static/assets/{TableEditor.stories-CNBIQyHL.js → TableEditor.stories-Hq1Gc1oK.js} +1 -1
  209. package/storybook-static/assets/{Tabs-C039OI9y.js → Tabs-BmH25H7g.js} +1 -1
  210. package/storybook-static/assets/{Tabs.stories-B49PmfdF.js → Tabs.stories-CIX0RdTF.js} +1 -1
  211. package/storybook-static/assets/{TabsBox-C3l5eozp.js → TabsBox-C1OmrVhO.js} +1 -1
  212. package/storybook-static/assets/{TagInput-CwyrBnFS.js → TagInput-CE0_PHMq.js} +1 -1
  213. package/storybook-static/assets/{TagInput.stories-coxQ7Em9.js → TagInput.stories-CTlBOp-Y.js} +1 -1
  214. package/storybook-static/assets/{Text-Ci8EVxdT.js → Text-Dm4ZV9wd.js} +1 -1
  215. package/storybook-static/assets/{Textarea-CK323Zvt.js → Textarea-9eR-qNKs.js} +1 -1
  216. package/storybook-static/assets/{Textarea-BcSflD0g.js → Textarea-CK7tpoYG.js} +1 -1
  217. package/storybook-static/assets/{Textarea.stories-DksBPbfd.js → Textarea.stories-vGi_UkyN.js} +1 -1
  218. package/storybook-static/assets/{TimePanel-rc26nbZr.js → TimePanel-BLQrdjYw.js} +1 -1
  219. package/storybook-static/assets/{TimePanel.stories-CX33HFgH.js → TimePanel.stories-DOLgz23p.js} +1 -1
  220. package/storybook-static/assets/{Toggle-Dj9mjhm6.js → Toggle-DCT7y4pb.js} +1 -1
  221. package/storybook-static/assets/{Toggle-BJ6a2rYs.js → Toggle-d3qw-5vS.js} +1 -1
  222. package/storybook-static/assets/{Toggle.stories-D2U9YqcP.js → Toggle.stories-DIc66YyI.js} +1 -1
  223. package/storybook-static/assets/{TreeMultiSelect-cRTpzovV.js → TreeMultiSelect-3CrIhRKl.js} +1 -1
  224. package/storybook-static/assets/{TreeMultiSelect-0bsShZqq.js → TreeMultiSelect-Buj6k0wN.js} +1 -1
  225. package/storybook-static/assets/{TreeMultiSelect.stories-BGX0KlJq.js → TreeMultiSelect.stories-BHxIRTEy.js} +1 -1
  226. package/storybook-static/assets/{TreePickerBase-BWuxoc3q.js → TreePickerBase-BHduNQZI.js} +1 -1
  227. package/storybook-static/assets/{TreeSelect-K8QcuBmM.js → TreeSelect-BO1tYVB4.js} +1 -1
  228. package/storybook-static/assets/{TreeSelect-BJ9bYsyd.js → TreeSelect-DfFbREJp.js} +1 -1
  229. package/storybook-static/assets/{TreeSelect.stories-DGVst2IK.js → TreeSelect.stories-ZwxGVFce.js} +1 -1
  230. package/storybook-static/assets/{TreeTable-BqgD-2_7.js → TreeTable-CIxtOAyo.js} +1 -1
  231. package/storybook-static/assets/{TreeTable.stories-BcXMrgLT.js → TreeTable.stories-BQNgHwk9.js} +1 -1
  232. package/storybook-static/assets/{blocks-COtaqhG7.js → blocks-OyR7mF18.js} +3 -3
  233. package/storybook-static/assets/{check-ATe9qlhZ.js → check-Gvk-f2eZ.js} +1 -1
  234. package/storybook-static/assets/{chevron-down-C8rhgH0F.js → chevron-down-KZidOQ8z.js} +1 -1
  235. package/storybook-static/assets/{chevron-left-BREifQyg.js → chevron-left-BmY0y72L.js} +1 -1
  236. package/storybook-static/assets/{chevron-right-2G3N5a4T.js → chevron-right-DwE6c1oF.js} +1 -1
  237. package/storybook-static/assets/{chunk-W22LQPXL-CseeqzDY.js → chunk-W22LQPXL-Dvqa6-ec.js} +1 -1
  238. package/storybook-static/assets/{circle-alert-BA5kPpt-.js → circle-alert-CWi4rINy.js} +1 -1
  239. package/storybook-static/assets/{circle-check-Cs9mMZi_.js → circle-check-BWlhKN1l.js} +1 -1
  240. package/storybook-static/assets/{components-C3kWCR3K.js → components-CoPo6nEv.js} +3 -3
  241. package/storybook-static/assets/{contextMenu-BoM0Rrc0.js → contextMenu-DwYdo2Sb.js} +1 -1
  242. package/storybook-static/assets/{download-LnWJpQGc.js → download-Bqp3e16u.js} +1 -1
  243. package/storybook-static/assets/{floating-ui.react-5ooru93I.js → floating-ui.react-Dzrc1SBT.js} +1 -1
  244. package/storybook-static/assets/{foundationApi-BBE0Q757.js → foundationApi-297mfV2y.js} +1 -1
  245. package/storybook-static/assets/{foundationLib-B08SbcPW.js → foundationLib-CnmPNL2i.js} +1 -1
  246. package/storybook-static/assets/{hooks-C0EM5QXj.js → hooks-CZ-c1LQK.js} +1 -1
  247. package/storybook-static/assets/iframe-3DMMfY6n.js +1 -0
  248. package/storybook-static/assets/{iframe-BT_jngkf.css → iframe-C-4tNqTX.css} +1 -1
  249. package/storybook-static/assets/{iframe-Dyg5pyjI.js → iframe-t8Ol-TlS.js} +3 -3
  250. package/storybook-static/assets/{info-CwIwVUF0.js → info-BMddFLDT.js} +1 -1
  251. package/storybook-static/assets/{odata-DhMoO1-z.js → odata-u98yP6vI.js} +1 -1
  252. package/storybook-static/assets/{odataStoryFixtures-gWL6AhyF.js → odataStoryFixtures-BX88AmEk.js} +1 -1
  253. package/storybook-static/assets/{react-DKmCseal.js → react-BwRTJdhk.js} +1 -1
  254. package/storybook-static/assets/{refresh-cw-cEegR14X.js → refresh-cw-BSZCBW1r.js} +1 -1
  255. package/storybook-static/assets/{settings-2-fhEteCrb.js → settings-2-UthslFqJ.js} +1 -1
  256. package/storybook-static/assets/{sortable-Dn0xMPIF.js → sortable-C4MB--OV.js} +1 -1
  257. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-BSkd404o.js → syntaxhighlighter-QEQV7K2Y-DByUKVZY.js} +1 -1
  258. package/storybook-static/assets/{trash-2-DAG4_F6W.js → trash-2-CPAznzsr.js} +1 -1
  259. package/storybook-static/assets/{triangle-alert-5OwD01Sy.js → triangle-alert-B2jfGvCD.js} +1 -1
  260. package/storybook-static/assets/{ui-DSS1yTEO.css → ui-D4-nHP5x.css} +1 -1
  261. package/storybook-static/assets/{uiClasses-e9OQfdw2.js → uiClasses-BCk2WXc4.js} +1 -1
  262. package/storybook-static/assets/{useODataSelectBase-BKD8wc02.js → useODataSelectBase-C-o3n-Rn.js} +1 -1
  263. package/storybook-static/assets/{useODataTreeData-VIqPm8lR.js → useODataTreeData-DkF53Jgq.js} +1 -1
  264. package/storybook-static/assets/{usePickerQuery-qXXh72-v.js → usePickerQuery-D609nrEf.js} +1 -1
  265. package/storybook-static/assets/{usePickerTriggerController-DbTYgg-I.js → usePickerTriggerController-CiGxyPbG.js} +1 -1
  266. package/storybook-static/assets/{x-sWfOdOu5.js → x-Y6c20Jey.js} +1 -1
  267. package/storybook-static/iframe.html +3 -3
  268. package/storybook-static/project.json +1 -1
  269. package/storybook-static/assets/iframe-B5Pyh1le.js +0 -1
  270. /package/storybook-static/assets/{ui.module-SH8ehXul.js → ui.module-nb-nQZVN.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  # Замена цветовых токенов
2
2
 
3
- Новый контракт темы содержит семь схем: `accent`, `brand`, `neutral`, `error`, `warning`, `success`, `info`. Каждая схема имеет четыре роли:
3
+ Новый контракт темы содержит семь схем: `accent`, `brand`, `neutral`, `error`, `warning`, `success`, `info`. Каждая схема принимает четыре настраиваемые роли:
4
4
 
5
5
  - `--<tone>-text` — текст и иконка на обычной поверхности;
6
6
  - `--<tone>-border` — рамка;
@@ -40,57 +40,57 @@
40
40
 
41
41
  ## Производные состояния
42
42
 
43
- Hover, active и soft больше не являются токенами темы. UI-компоненты вычисляют их через `color-mix(in srgb, ...)` из четырёх основных ролей.
43
+ Hover, active и soft не входят в карту `status`, но снова доступны как публичные генерируемые CSS-токены. UI-пакет вычисляет их через единые `color-mix(in srgb, ...)` из четырёх основных ролей. Карта `tokens` остаётся последним escape hatch, если приложению действительно требуется точное переопределение.
44
44
 
45
45
  ```text
46
- --status-brand-text-hover: удалён; вычисляется из --brand-text
47
- --status-brand-text-active: удалён; вычисляется из --brand-text
48
- --status-brand-border-hover: удалён; вычисляется из --brand-border
49
- --status-brand-border-active: удалён; вычисляется из --brand-border
46
+ --status-brand-text-hover: --brand-text-hover
47
+ --status-brand-text-active: --brand-text-active
48
+ --status-brand-border-hover: --brand-border-hover
49
+ --status-brand-border-active: --brand-border-active
50
50
  --status-brand-border-focus: --focus-ring
51
- --status-brand-fill-hover: удалён; вычисляется из --brand-fill
52
- --status-brand-fill-active: удалён; вычисляется из --brand-fill
53
- --status-brand-soft: удалён; вычисляется из --brand-fill
54
- --status-neutral-text-hover: удалён; вычисляется из --neutral-text
55
- --status-neutral-text-active: удалён; вычисляется из --neutral-text
56
- --status-neutral-border-hover: удалён; вычисляется из --neutral-border
57
- --status-neutral-border-active: удалён; вычисляется из --neutral-border
51
+ --status-brand-fill-hover: --brand-fill-hover
52
+ --status-brand-fill-active: --brand-fill-active
53
+ --status-brand-soft: --brand-soft
54
+ --status-neutral-text-hover: --neutral-text-hover
55
+ --status-neutral-text-active: --neutral-text-active
56
+ --status-neutral-border-hover: --neutral-border-hover
57
+ --status-neutral-border-active: --neutral-border-active
58
58
  --status-neutral-border-focus: --focus-ring
59
- --status-neutral-fill-hover: удалён; вычисляется из --neutral-fill
60
- --status-neutral-fill-active: удалён; вычисляется из --neutral-fill
61
- --status-neutral-soft: удалён; вычисляется из --neutral-fill
62
- --status-error-text-hover: удалён; вычисляется из --error-text
63
- --status-error-text-active: удалён; вычисляется из --error-text
64
- --status-error-border-hover: удалён; вычисляется из --error-border
65
- --status-error-border-active: удалён; вычисляется из --error-border
59
+ --status-neutral-fill-hover: --neutral-fill-hover
60
+ --status-neutral-fill-active: --neutral-fill-active
61
+ --status-neutral-soft: --neutral-soft
62
+ --status-error-text-hover: --error-text-hover
63
+ --status-error-text-active: --error-text-active
64
+ --status-error-border-hover: --error-border-hover
65
+ --status-error-border-active: --error-border-active
66
66
  --status-error-border-focus: --focus-ring
67
- --status-error-fill-hover: удалён; вычисляется из --error-fill
68
- --status-error-fill-active: удалён; вычисляется из --error-fill
69
- --status-error-soft: удалён; вычисляется из --error-fill
70
- --status-warning-text-hover: удалён; вычисляется из --warning-text
71
- --status-warning-text-active: удалён; вычисляется из --warning-text
72
- --status-warning-border-hover: удалён; вычисляется из --warning-border
73
- --status-warning-border-active: удалён; вычисляется из --warning-border
67
+ --status-error-fill-hover: --error-fill-hover
68
+ --status-error-fill-active: --error-fill-active
69
+ --status-error-soft: --error-soft
70
+ --status-warning-text-hover: --warning-text-hover
71
+ --status-warning-text-active: --warning-text-active
72
+ --status-warning-border-hover: --warning-border-hover
73
+ --status-warning-border-active: --warning-border-active
74
74
  --status-warning-border-focus: --focus-ring
75
- --status-warning-fill-hover: удалён; вычисляется из --warning-fill
76
- --status-warning-fill-active: удалён; вычисляется из --warning-fill
77
- --status-warning-soft: удалён; вычисляется из --warning-fill
78
- --status-success-text-hover: удалён; вычисляется из --success-text
79
- --status-success-text-active: удалён; вычисляется из --success-text
80
- --status-success-border-hover: удалён; вычисляется из --success-border
81
- --status-success-border-active: удалён; вычисляется из --success-border
75
+ --status-warning-fill-hover: --warning-fill-hover
76
+ --status-warning-fill-active: --warning-fill-active
77
+ --status-warning-soft: --warning-soft
78
+ --status-success-text-hover: --success-text-hover
79
+ --status-success-text-active: --success-text-active
80
+ --status-success-border-hover: --success-border-hover
81
+ --status-success-border-active: --success-border-active
82
82
  --status-success-border-focus: --focus-ring
83
- --status-success-fill-hover: удалён; вычисляется из --success-fill
84
- --status-success-fill-active: удалён; вычисляется из --success-fill
85
- --status-success-soft: удалён; вычисляется из --success-fill
86
- --status-info-text-hover: удалён; вычисляется из --info-text
87
- --status-info-text-active: удалён; вычисляется из --info-text
88
- --status-info-border-hover: удалён; вычисляется из --info-border
89
- --status-info-border-active: удалён; вычисляется из --info-border
83
+ --status-success-fill-hover: --success-fill-hover
84
+ --status-success-fill-active: --success-fill-active
85
+ --status-success-soft: --success-soft
86
+ --status-info-text-hover: --info-text-hover
87
+ --status-info-text-active: --info-text-active
88
+ --status-info-border-hover: --info-border-hover
89
+ --status-info-border-active: --info-border-active
90
90
  --status-info-border-focus: --focus-ring
91
- --status-info-fill-hover: удалён; вычисляется из --info-fill
92
- --status-info-fill-active: удалён; вычисляется из --info-fill
93
- --status-info-soft: удалён; вычисляется из --info-fill
91
+ --status-info-fill-hover: --info-fill-hover
92
+ --status-info-fill-active: --info-fill-active
93
+ --status-info-soft: --info-soft
94
94
  ```
95
95
 
96
96
  ## Accent и прежние interactive-токены
@@ -114,6 +114,8 @@ Hover, active и soft больше не являются токенами тем
114
114
  отсутствовал: --accent-on-fill
115
115
  ```
116
116
 
117
+ `interactiveSurface` намеренно использует базовые `--accent-fill`, `--accent-border` и `--accent-on-fill` для hover, active и selected: это единое заполненное состояние выбора. Производные `--accent-*-hover` и `--accent-*-active` предназначены для компонентов, которые меняют уже заданный tone между состояниями.
118
+
117
119
  ## High contrast
118
120
 
119
121
  ```text
@@ -121,32 +123,32 @@ Hover, active и soft больше не являются токенами тем
121
123
  --hc-status-brand-border: --hc-brand-border
122
124
  --hc-status-brand-fill: --hc-brand-fill
123
125
  --hc-status-brand-on-fill: --hc-brand-on-fill
124
- --hc-status-brand-soft: удалён; мягкая заливка вычисляется из --brand-fill
126
+ --hc-status-brand-soft: удалён; --brand-soft вычисляется из high-contrast-aware --brand-fill
125
127
  --hc-status-neutral-text: --hc-neutral-text
126
128
  --hc-status-neutral-border: --hc-neutral-border
127
129
  --hc-status-neutral-fill: --hc-neutral-fill
128
130
  --hc-status-neutral-on-fill: --hc-neutral-on-fill
129
- --hc-status-neutral-soft: удалён; мягкая заливка вычисляется из --neutral-fill
131
+ --hc-status-neutral-soft: удалён; --neutral-soft вычисляется из high-contrast-aware --neutral-fill
130
132
  --hc-status-error-text: --hc-error-text
131
133
  --hc-status-error-border: --hc-error-border
132
134
  --hc-status-error-fill: --hc-error-fill
133
135
  --hc-status-error-on-fill: --hc-error-on-fill
134
- --hc-status-error-soft: удалён; мягкая заливка вычисляется из --error-fill
136
+ --hc-status-error-soft: удалён; --error-soft вычисляется из high-contrast-aware --error-fill
135
137
  --hc-status-warning-text: --hc-warning-text
136
138
  --hc-status-warning-border: --hc-warning-border
137
139
  --hc-status-warning-fill: --hc-warning-fill
138
140
  --hc-status-warning-on-fill: --hc-warning-on-fill
139
- --hc-status-warning-soft: удалён; мягкая заливка вычисляется из --warning-fill
141
+ --hc-status-warning-soft: удалён; --warning-soft вычисляется из high-contrast-aware --warning-fill
140
142
  --hc-status-success-text: --hc-success-text
141
143
  --hc-status-success-border: --hc-success-border
142
144
  --hc-status-success-fill: --hc-success-fill
143
145
  --hc-status-success-on-fill: --hc-success-on-fill
144
- --hc-status-success-soft: удалён; мягкая заливка вычисляется из --success-fill
146
+ --hc-status-success-soft: удалён; --success-soft вычисляется из high-contrast-aware --success-fill
145
147
  --hc-status-info-text: --hc-info-text
146
148
  --hc-status-info-border: --hc-info-border
147
149
  --hc-status-info-fill: --hc-info-fill
148
150
  --hc-status-info-on-fill: --hc-info-on-fill
149
- --hc-status-info-soft: удалён; мягкая заливка вычисляется из --info-fill
151
+ --hc-status-info-soft: удалён; --info-soft вычисляется из high-contrast-aware --info-fill
150
152
 
151
153
  --hc-content-accent: --hc-accent-text
152
154
  --hc-border-accent: --hc-accent-border
@@ -200,6 +202,20 @@ Hover, active и soft больше не являются токенами тем
200
202
  --info-on-fill
201
203
  ```
202
204
 
205
+ Для каждой из семи схем `--<tone>-*` дополнительно выводятся производные токены:
206
+
207
+ ```text
208
+ --<tone>-text-hover
209
+ --<tone>-text-active
210
+ --<tone>-border-hover
211
+ --<tone>-border-active
212
+ --<tone>-fill-hover
213
+ --<tone>-fill-active
214
+ --<tone>-soft
215
+ ```
216
+
217
+ Эти 49 значений не являются входом Sass-карты `status`. Отдельные `--hc-<tone>-*` для них не нужны: формулы используют первичные токены, которые уже учитывают high-contrast overrides.
218
+
203
219
  Первичное объявление каждого цвета имеет форму `--token: var(--hc-token, #hex)`. Это правило автоматически применяется к цветовым значениям в картах `tokens` и `status`. Contrast-режим задаёт только `--hc-*`, а обычная тема продолжает использовать hex fallback.
204
220
 
205
221
  ## Sass-конфигурация
package/README.md CHANGED
@@ -108,9 +108,13 @@ import "@ryuzaki13/react-foundation-ui/styles.css";
108
108
 
109
109
  ### Точные палитры host-приложения
110
110
 
111
- Публичный mixin `theme` принимает обычные hex-цвета для семантических схем `accent`, `brand`, `neutral`, `error`, `warning`, `success` и `info`. У каждой схемы четыре обязательные роли: `text`, `border`, `fill` и `on-fill`. Неуказанные значения наследуются из baseline выбранного light/dark-режима, поэтому host может переопределить одну роль без копирования всей палитры. Hover, active и мягкие заливки вычисляются внутри компонентов и не расширяют публичный контракт темы.
111
+ Публичный mixin `theme` принимает обычные hex-цвета для семантических схем `accent`, `brand`, `neutral`, `error`, `warning`, `success` и `info`. У каждой схемы четыре обязательные настраиваемые роли: `text`, `border`, `fill` и `on-fill`. Неуказанные значения наследуются из baseline выбранного light/dark-режима, поэтому host может переопределить одну роль без копирования всей палитры.
112
112
 
113
- Каждый первичный цветовой токен использует одноимённый high-contrast token перед hex fallback: например, `--error-text: var(--hc-error-text, #b91c1c)`. Цветовые значения из карты `tokens` получают такой wrapper автоматически. Это позволяет будущему contrast-режиму заменить палитру без повторной компиляции темы. Карта `tokens` выводится последней и остаётся escape hatch для точечных semantic-token overrides.
113
+ Из четырёх ролей тема автоматически выводит переиспользуемые токены `--<tone>-text-hover`, `--<tone>-text-active`, `--<tone>-border-hover`, `--<tone>-border-active`, `--<tone>-fill-hover`, `--<tone>-fill-active` и `--<tone>-soft`. Host не передаёт их в карту `status`: единые формулы остаются владельцем UI-пакета, а прикладные стили используют готовые переменные без локального повторения `color-mix(...)`. Appearance-specific состояния вроде ghost и disabled остаются внутри соответствующих UI-компонентов.
114
+
115
+ Mixin `ui-tone()` применяет те же формулы локально, а не ссылается на унаследованное вычисленное значение. Благодаря этому component-scoped переопределение базовой роли, например `--brand-fill`, продолжает влиять на состояния конкретного контрола.
116
+
117
+ Каждый первичный цветовой токен использует одноимённый high-contrast token перед hex fallback: например, `--error-text: var(--hc-error-text, #b91c1c)`. Цветовые значения из карты `tokens` получают такой wrapper автоматически. Это позволяет будущему contrast-режиму заменить палитру без повторной компиляции темы. Производные состояния ссылаются на базовые CSS-переменные, поэтому учитывают их переопределения в том же theme selector. Карта `tokens` выводится последней и остаётся escape hatch для редкого точного override любого токена.
114
118
 
115
119
  ```scss
116
120
  @use "@ryuzaki13/react-foundation-ui/styles/themes" as foundationThemes;
@@ -152,10 +156,7 @@ Subpath `@ryuzaki13/react-foundation-ui/barcode-scanner` предоставля
152
156
  ```tsx
153
157
  import { useState } from "react";
154
158
 
155
- import {
156
- BarcodeScannerDialog,
157
- type BarcodeScanResult
158
- } from "@ryuzaki13/react-foundation-ui/barcode-scanner";
159
+ import { BarcodeScannerDialog, type BarcodeScanResult } from "@ryuzaki13/react-foundation-ui/barcode-scanner";
159
160
 
160
161
  export function BarcodeField() {
161
162
  const [opened, setOpened] = useState(false);
@@ -221,13 +222,7 @@ export function MaterialGallery() {
221
222
  <button type="button" onClick={() => setOpen(true)}>
222
223
  Открыть галерею
223
224
  </button>
224
- <ImageViewer
225
- open={open}
226
- images={images}
227
- index={index}
228
- onIndexChange={setIndex}
229
- onClose={() => setOpen(false)}
230
- />
225
+ <ImageViewer open={open} images={images} index={index} onIndexChange={setIndex} onClose={() => setOpen(false)} />
231
226
  </>
232
227
  );
233
228
  }
@@ -1 +1 @@
1
- {"version":3,"file":"badge-6mXO9BWP.js","names":[],"sources":["../../src/badge/Badge.module.scss","../../src/badge/Badge.tsx","../../src/badge/BadgeList.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.badge {\n\t@include ui-static-surface;\n\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmax-width: 100%;\n\tpadding: 0 var(--space-xs);\n\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tvertical-align: middle;\n}\n\n.passive {\n\tpointer-events: none;\n\tuser-select: none;\n}\n\n.sizeXs {\n\tfont-size: var(--font-size-xs);\n}\n\n.sizeSm {\n\tfont-size: var(--font-size-sm);\n}\n\n.sizeMd {\n\tfont-size: var(--font-size-md);\n}\n\n.sizeLg {\n\tfont-size: var(--font-size-lg);\n}\n\n.sizeXl {\n\tfont-size: var(--font-size-xl);\n}\n\n.content {\n\tmin-width: 0;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tscale var(--transition-fast) ease;\n\n\t&:hover {\n\t\tbackground-color: color-mix(in srgb, var(--error-fill) 12%, var(--surface-0));\n\t\tcolor: var(--error-text);\n\t\tscale: 1.1;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { TextOverflow } from \"../text\";\nimport { getUiAppearanceClassName, getUiToneClassName, resolveUiScheme } from \"../uiClasses\";\n\nimport styles from \"./Badge.module.scss\";\n\nimport type { UiAppearance, UiSize, UiTone } from \"../types\";\n\ntype BadgeSize = UiSize;\ntype BadgeAppearance = UiAppearance;\n\ntype BadgeProps = {\n\tchildren: string | number;\n\tsize?: BadgeSize;\n\ttone?: UiTone;\n\tappearance?: BadgeAppearance;\n\tclassName?: string;\n\tonRemove?: () => void;\n};\n\nconst sizeClasses: Record<BadgeSize, string> = {\n\txs: styles.sizeXs,\n\tsm: styles.sizeSm,\n\tmd: styles.sizeMd,\n\tlg: styles.sizeLg,\n\txl: styles.sizeXl\n};\n\n/**\n * Компактный индикатор для статусов, категорий и коротких служебных меток.\n */\nexport function Badge({ children, size = \"sm\", tone, appearance, className, onRemove }: BadgeProps) {\n\tconst fallbackTone = tone ?? \"neutral\";\n\tconst fallbackAppearance = fallbackTone !== \"neutral\" ? \"solid\" : \"outline\";\n\tconst scheme = resolveUiScheme({\n\t\ttone,\n\t\tappearance,\n\t\tfallbackTone,\n\t\tfallbackAppearance\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tstyles.badge,\n\t\t\t\tsizeClasses[size],\n\t\t\t\tgetUiToneClassName(scheme.tone),\n\t\t\t\tgetUiAppearanceClassName(scheme.appearance),\n\t\t\t\t!onRemove && styles.passive,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<TextOverflow maxChar={25} placement=\"top\" block textWrapProps={{ className: styles.content }}>\n\t\t\t\t{String(children)}\n\t\t\t</TextOverflow>\n\t\t\t{onRemove && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\taria-label=\"Удалить бейдж\"\n\t\t\t\t\tdata-ui=\"badge-remove-button\"\n\t\t\t\t\tdata-action=\"remove-badge\">\n\t\t\t\t\t<XIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Children, Fragment, ReactElement } from \"react\";\n\nimport { FlexContainer } from \"../flex\";\n\nimport { Badge } from \"./Badge\";\n\ninterface BadgeListProps {\n\tchildren: ReactElement<typeof Badge | null | undefined | false>[];\n}\n\n/**\n * Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.\n */\nexport function BadgeList({ children }: BadgeListProps) {\n\treturn (\n\t\t<FlexContainer inline wrap gap=\"sm\" align=\"baseline\">\n\t\t\t{Children.map(children, (badge, index) => (\n\t\t\t\t<Fragment key={index}>{badge}</Fragment>\n\t\t\t))}\n\t\t</FlexContainer>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;GCsBM,IAAyC;CAC9C,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;AACZ;AAKA,SAAgB,EAAM,EAAE,aAAU,UAAO,MAAM,SAAM,eAAY,cAAW,eAAwB;CACnG,IAAM,IAAe,KAAQ,WAEvB,IAAS,EAAgB;EAC9B;EACA;EACA;EACA,oBAL0B,MAAiB,YAAsB,YAAV;CAMxD,CAAC;CAED,OACC,kBAAC,OAAD;EACC,WAAW,EACV,EAAO,OACP,EAAY,IACZ,EAAmB,EAAO,IAAI,GAC9B,EAAyB,EAAO,UAAU,GAC1C,CAAC,KAAY,EAAO,SACpB,CACD;EARD,UAAA,CASC,kBAAC,GAAD;GAAc,SAAS;GAAI,WAAU;GAAM,OAAA;GAAM,eAAe,EAAE,WAAW,EAAO,QAAQ;GAC1F,UAAA,OAAO,CAAQ;EACH,CAAA,GACb,KACA,kBAAC,UAAD;GACC,MAAK;GACL,SAAS;GACT,WAAW,EAAO;GAClB,cAAW;GACX,WAAQ;GACR,eAAY;GACZ,UAAA,kBAAC,GAAD,CAAQ,CAAA;EACD,CAAA,CAEL;;AAEP;;;ACxDA,SAAgB,EAAU,EAAE,eAA4B;CACvD,OACC,kBAAC,GAAD;EAAe,QAAA;EAAO,MAAA;EAAK,KAAI;EAAK,OAAM;EACxC,UAAA,EAAS,IAAI,IAAW,GAAO,MAC/B,kBAAC,GAAD,EAAA,UAAuB,EAAgB,GAAxB,CAAwB,CACvC;CACa,CAAA;AAEjB"}
1
+ {"version":3,"file":"badge-6mXO9BWP.js","names":[],"sources":["../../src/badge/Badge.module.scss","../../src/badge/Badge.tsx","../../src/badge/BadgeList.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.badge {\n\t@include ui-static-surface;\n\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmax-width: 100%;\n\tpadding: 0 var(--space-xs);\n\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tvertical-align: middle;\n}\n\n.passive {\n\tpointer-events: none;\n\tuser-select: none;\n}\n\n.sizeXs {\n\tfont-size: var(--font-size-xs);\n}\n\n.sizeSm {\n\tfont-size: var(--font-size-sm);\n}\n\n.sizeMd {\n\tfont-size: var(--font-size-md);\n}\n\n.sizeLg {\n\tfont-size: var(--font-size-lg);\n}\n\n.sizeXl {\n\tfont-size: var(--font-size-xl);\n}\n\n.content {\n\tmin-width: 0;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tscale var(--transition-fast) ease;\n\n\t&:hover {\n\t\t@include toneDerived.tone-soft-declaration(\"background-color\", \"error\");\n\t\tcolor: var(--error-text);\n\t\tscale: 1.1;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { TextOverflow } from \"../text\";\nimport { getUiAppearanceClassName, getUiToneClassName, resolveUiScheme } from \"../uiClasses\";\n\nimport styles from \"./Badge.module.scss\";\n\nimport type { UiAppearance, UiSize, UiTone } from \"../types\";\n\ntype BadgeSize = UiSize;\ntype BadgeAppearance = UiAppearance;\n\ntype BadgeProps = {\n\tchildren: string | number;\n\tsize?: BadgeSize;\n\ttone?: UiTone;\n\tappearance?: BadgeAppearance;\n\tclassName?: string;\n\tonRemove?: () => void;\n};\n\nconst sizeClasses: Record<BadgeSize, string> = {\n\txs: styles.sizeXs,\n\tsm: styles.sizeSm,\n\tmd: styles.sizeMd,\n\tlg: styles.sizeLg,\n\txl: styles.sizeXl\n};\n\n/**\n * Компактный индикатор для статусов, категорий и коротких служебных меток.\n */\nexport function Badge({ children, size = \"sm\", tone, appearance, className, onRemove }: BadgeProps) {\n\tconst fallbackTone = tone ?? \"neutral\";\n\tconst fallbackAppearance = fallbackTone !== \"neutral\" ? \"solid\" : \"outline\";\n\tconst scheme = resolveUiScheme({\n\t\ttone,\n\t\tappearance,\n\t\tfallbackTone,\n\t\tfallbackAppearance\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tstyles.badge,\n\t\t\t\tsizeClasses[size],\n\t\t\t\tgetUiToneClassName(scheme.tone),\n\t\t\t\tgetUiAppearanceClassName(scheme.appearance),\n\t\t\t\t!onRemove && styles.passive,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<TextOverflow maxChar={25} placement=\"top\" block textWrapProps={{ className: styles.content }}>\n\t\t\t\t{String(children)}\n\t\t\t</TextOverflow>\n\t\t\t{onRemove && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\taria-label=\"Удалить бейдж\"\n\t\t\t\t\tdata-ui=\"badge-remove-button\"\n\t\t\t\t\tdata-action=\"remove-badge\">\n\t\t\t\t\t<XIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Children, Fragment, ReactElement } from \"react\";\n\nimport { FlexContainer } from \"../flex\";\n\nimport { Badge } from \"./Badge\";\n\ninterface BadgeListProps {\n\tchildren: ReactElement<typeof Badge | null | undefined | false>[];\n}\n\n/**\n * Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.\n */\nexport function BadgeList({ children }: BadgeListProps) {\n\treturn (\n\t\t<FlexContainer inline wrap gap=\"sm\" align=\"baseline\">\n\t\t\t{Children.map(children, (badge, index) => (\n\t\t\t\t<Fragment key={index}>{badge}</Fragment>\n\t\t\t))}\n\t\t</FlexContainer>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;GCsBM,IAAyC;CAC9C,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;AACZ;AAKA,SAAgB,EAAM,EAAE,aAAU,UAAO,MAAM,SAAM,eAAY,cAAW,eAAwB;CACnG,IAAM,IAAe,KAAQ,WAEvB,IAAS,EAAgB;EAC9B;EACA;EACA;EACA,oBAL0B,MAAiB,YAAsB,YAAV;CAMxD,CAAC;CAED,OACC,kBAAC,OAAD;EACC,WAAW,EACV,EAAO,OACP,EAAY,IACZ,EAAmB,EAAO,IAAI,GAC9B,EAAyB,EAAO,UAAU,GAC1C,CAAC,KAAY,EAAO,SACpB,CACD;EARD,UAAA,CASC,kBAAC,GAAD;GAAc,SAAS;GAAI,WAAU;GAAM,OAAA;GAAM,eAAe,EAAE,WAAW,EAAO,QAAQ;GAC1F,UAAA,OAAO,CAAQ;EACH,CAAA,GACb,KACA,kBAAC,UAAD;GACC,MAAK;GACL,SAAS;GACT,WAAW,EAAO;GAClB,cAAW;GACX,WAAQ;GACR,eAAY;GACZ,UAAA,kBAAC,GAAD,CAAQ,CAAA;EACD,CAAA,CAEL;;AAEP;;;ACxDA,SAAgB,EAAU,EAAE,eAA4B;CACvD,OACC,kBAAC,GAAD;EAAe,QAAA;EAAO,MAAA;EAAK,KAAI;EAAK,OAAM;EACxC,UAAA,EAAS,IAAI,IAAW,GAAO,MAC/B,kBAAC,GAAD,EAAA,UAAuB,EAAgB,GAAxB,CAAwB,CACvC;CACa,CAAA;AAEjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.module-oRwY3Zli.js","names":[],"sources":["../../src/ui.module.scss"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.uiSizable {\n\t--base-width: 100%;\n\n\twidth: var(--base-width);\n\n\t&.xs {\n\t\t--base-width: calc(var(--drp-ui-width-xs, var(--ui-width-xs)) - var(--width-add));\n\t}\n\n\t&.sm {\n\t\t--base-width: calc(var(--drp-ui-width-sm, var(--ui-width-sm)) - var(--width-add));\n\t}\n\n\t&.md {\n\t\t--base-width: calc(var(--drp-ui-width-md, var(--ui-width-md)) - var(--width-add));\n\t}\n\n\t&.lg {\n\t\t--base-width: calc(var(--drp-ui-width-lg, var(--ui-width-lg)) - var(--width-add));\n\t}\n\n\t&.xl {\n\t\t--base-width: calc(var(--drp-ui-width-xl, var(--ui-width-xl)) - var(--width-add));\n\t}\n}\n\n// TODO: Тестовый класс\n.uiErrorElement {\n\t--grid-size: var(--space-sm);\n\t--grid-line-size: var(--border-width);\n\t--grid-line-color: color-mix(in srgb, var(--error-fill) 12%, var(--surface-0));\n\n\theight: var(--control-height);\n\twidth: 100%; // calc(10em - var(--width-add));\n\tflex-shrink: 0;\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\n\tborder: var(--focus-width) solid var(--error-border);\n\tborder-radius: var(--radius-sm);\n\toutline: none;\n\n\tfont-weight: 700;\n\tfont-variation-settings: \"wght\" 700;\n\n\tcolor: var(--error-text);\n\tbackground-color: var(--surface-0);\n\tbackground-image:\n\t\trepeating-linear-gradient(\n\t\t\t45deg,\n\t\t\tvar(--grid-line-color) 0 var(--grid-line-size),\n\t\t\ttransparent var(--grid-line-size) var(--grid-size)\n\t\t),\n\t\trepeating-linear-gradient(\n\t\t\t-45deg,\n\t\t\tvar(--grid-line-color) 0 var(--grid-line-size),\n\t\t\ttransparent var(--grid-line-size) var(--grid-size)\n\t\t);\n}\n\n.uiContainer {\n\tposition: relative;\n\twidth: 100%;\n}\n\n.uiInputContainer {\n\t@extend .uiContainer;\n\n\t--padding-right: var(--control-height);\n}\n\n.uiLabelBase {\n\tdisplay: inline-block;\n\tfont-weight: 400;\n\tfont-variation-settings: \"wght\" 400;\n}\n\n.uiLabel {\n\t@extend .uiLabelBase;\n\n\tmargin-block: var(--space-xs);\n}\n\n.uiDescription {\n\t--paragraph-margin: 0;\n\n\tpadding-bottom: var(--space-xs);\n\tcolor: var(--content-1);\n\tfont-weight: 300;\n\tfont-variation-settings: \"wght\" 300;\n}\n\n.uiLabel,\n.uiDescription {\n\tmargin-inline: var(--space-xs);\n}\n\n.uiPlaceholder {\n\tcolor: var(--content-2);\n\tfont-weight: 100;\n\tfont-variation-settings: \"wght\" 100;\n\t// font-size: var(--font-size-sm);\n\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.required {\n\t.uiLabelBase::after {\n\t\tcontent: \" *\";\n\t\tcolor: var(--error-text);\n\t}\n}\n\n.uiControl {\n\t@include ui-tone(\"neutral\");\n\t@include ui-appearance-outline;\n\t@include ui-control-base;\n\n\t--ui-radius: var(--radius-sm);\n\n\t&.invalid,\n\t&:invalid {\n\t\t@include ui-tone(\"error\");\n\t\t@include ui-appearance-outline;\n\t}\n\n\t&::placeholder {\n\t\t@extend .uiPlaceholder;\n\t}\n}\n\n.uiToneNeutral {\n\t@include ui-tone(\"neutral\");\n}\n\n.uiToneAccent {\n\t@include ui-tone(\"accent\");\n}\n\n.uiToneBrand {\n\t@include ui-tone(\"brand\");\n}\n\n.uiToneError {\n\t@include ui-tone(\"error\");\n}\n\n.uiToneWarning {\n\t@include ui-tone(\"warning\");\n}\n\n.uiToneSuccess {\n\t@include ui-tone(\"success\");\n}\n\n.uiToneInfo {\n\t@include ui-tone(\"info\");\n}\n\n.uiAppearanceSolid {\n\t@include ui-appearance-solid;\n}\n\n.uiAppearanceOutline {\n\t@include ui-appearance-outline;\n}\n\n.uiAppearanceGhost {\n\t@include ui-appearance-ghost;\n}\n\n.uiAppearanceTransparent {\n\t@include ui-appearance-transparent;\n}\n\n.uiInputControl {\n\t@extend .uiControl;\n\n\theight: var(--control-height);\n}\n\n.uiInputWithToggle {\n\t@extend .uiInputControl;\n\n\tcolor: var(--content-0);\n\n\tpadding: 0 var(--padding-right) 0 var(--space-sm);\n\twidth: 100%;\n\ttext-align: left;\n\n\t// &[type=\"button\"] {\n\t// \twhite-space: nowrap;\n\t// }\n}\n\n.uiSelectionControl {\n\t@include ui-control-base;\n\n\t--ui-color: var(--content-0);\n\t--ui-color-hover: var(--content-0);\n\t--ui-color-active: var(--content-0);\n\t--ui-background: var(--surface-0);\n\t--ui-background-hover: var(--ui-tone-soft);\n\t--ui-background-active: var(--ui-tone-soft);\n\t--ui-border-color: var(--ui-tone-border);\n\t--ui-border-hover: var(--ui-tone-border-hover);\n\t--ui-border-active: var(--ui-tone-border-active);\n\t--ui-border-focus: var(--ui-tone-border-focus);\n\n\tappearance: none;\n\tmargin: 0;\n\tcursor: pointer;\n\n\t&:checked {\n\t\tborder-color: var(--ui-tone-border-active);\n\n\t\t& + .uiSelectionIcon {\n\t\t\tcolor: var(--ui-tone-fill);\n\t\t}\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\n\t\tborder-color: var(--border-0);\n\n\t\t&:checked {\n\t\t\t& + .uiSelectionIcon {\n\t\t\t\tcolor: var(--border-0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.uiSelectionIcon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tpointer-events: none;\n\tcolor: transparent;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\topacity var(--transition-fast) ease;\n}\n\n.uiElement,\n.uiPopupOption {\n\t&.disabled,\n\t&:disabled {\n\t\tuser-select: none;\n\n\t\t.uiLabel,\n\t\t.uiDescription {\n\t\t\tcolor: var(--content-2);\n\t\t}\n\n\t\t.uiPlaceholder,\n\t\t.uiOptionText,\n\t\t.uiOptionCode {\n\t\t\topacity: 0.25;\n\t\t}\n\t}\n\n\t// Класс disabled используется у составных ненативных элементов: им нужно явно запретить события.\n\t&.disabled {\n\t\tcursor: default;\n\t\tpointer-events: none;\n\t}\n\n\t// Нативный disabled уже блокирует активацию, а pointer-events остаются для курсора и tooltip.\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t}\n}\n\n.uiPanelTonePrimary {\n\t--ui-panel-background: var(--surface-0);\n}\n\n.uiPanelToneSecondary {\n\t--ui-panel-background: var(--surface-1);\n}\n\n.uiPanelToneTertiary {\n\t--ui-panel-background: var(--surface-2);\n}\n\n.uiFilledPanel {\n\tbackground-color: var(--ui-panel-background, var(--surface-0));\n}\n\n.uiFramedPanel {\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tpadding: var(--space-sm);\n}\n\n.uiPanel {\n\t@extend .uiFramedPanel;\n\t@extend .uiFilledPanel;\n}\n\n.uiStateFocus {\n\t@include focusVisible;\n\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--border-1);\n\tcursor: pointer;\n}\n\n.uiOptionBase {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\tgap: var(--space-sm);\n\theight: 100%;\n\twidth: 100%;\n\ttext-align: left;\n}\n\n.uiPopupOption {\n\t@extend .uiOptionBase;\n\n\theight: auto;\n\tmin-height: var(--control-height);\n}\n\n.uiPopupOption {\n\tborder-radius: var(--radius-sm);\n\tborder: none;\n\tbackground-color: transparent;\n\tcolor: var(--content-0);\n\n\ttransition:\n\t\tbackground-color var(--transition-fast) ease,\n\t\tcolor var(--transition-fast) ease;\n\n\t.uiMenuOptionIcon,\n\t.uiPopupOptionIcon {\n\t\tflex-shrink: 0;\n\t\tfont-size: var(--font-size-sm);\n\t\twidth: var(--icon-size);\n\t\theight: var(--icon-size);\n\t}\n\n\t.uiMenuOptionIcon,\n\t.keyboard {\n\t\tcolor: var(--content-2);\n\t}\n\n\t&.selected {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t\tcursor: default;\n\t}\n\n\t&.uiPopupOptionActive,\n\t&:active {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t}\n\n\t@include hover(true) {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t\tcursor: pointer;\n\t}\n\n\t&.disabled {\n\t\t// background-color: var(--surface-2);\n\t\tcolor: var(--content-2);\n\t}\n\n\t&:focus-within {\n\t\t// @extend .uiStateFocus;\n\t\t@include focusVisible;\n\t}\n}\n\n.uiOptionButton,\n.uiOptionLink {\n\t@extend .uiOptionBase;\n\n\tflex: 1 1 0;\n\tmin-width: 0;\n\theight: 100%;\n\tpadding: var(--space-xs) var(--space-sm);\n\tborder: none;\n\tborder-radius: inherit;\n\toutline: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: inherit;\n\ttext-decoration: none;\n}\n\n.uiPopupOptionSeparator {\n\tborder-top: var(--border);\n\tmargin-block: var(--space-xs);\n}\n\n.uiPopupGroupLabel {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n\tfont-weight: 300;\n\ttext-transform: uppercase;\n\tfont-size: var(--font-size-sm);\n}\n\n.uiMenuOptionIcon {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.uiOptionText {\n\t// font-size: var(--font-size-sm);\n\tflex: 1;\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.uiOptionCode {\n\tfont-family: var(--font-family-mono);\n\t// font-size: var(--font-size-sm);\n\tcolor: var(--content-1);\n\tfont-weight: 300;\n\tfont-variation-settings: \"wght\" 300;\n}\n\n.uiOptionContentEmphasize {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.uiToggleButtonContainer {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\theight: 100%;\n\twidth: 100%;\n\n\ttransition-property: width;\n\ttransition-duration: var(--transition-fast);\n\ttransition-timing-function: cubic-bezier(1, 0, 0.5, 0.5);\n\n\t> button {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: var(--control-height);\n\t\twidth: var(--control-height);\n\t\tborder-radius: var(--radius-sm);\n\t\tflex: 0 0 var(--control-height);\n\t}\n\n\t// &[data-disabled] {\n\t// \tcursor: default;\n\t// \tpointer-events: none;\n\t// \topacity: var(--disabled-opacity);\n\t// }\n}\n\n.uiToggleButton {\n\tcolor: var(--content-0);\n\n\t&:hover {\n\t\tcolor: var(--accent-text);\n\t}\n}\n\n.uiToggleIcon {\n\ttransition: transform var(--transition-fast) ease-in-out;\n\n\t&.uiToggleIconOpen {\n\t\ttransform: rotate(180deg);\n\t}\n}\n\n// TODO: пока в свалку стили для дата-подобных компонентов\n\n// Для компонентов, который не являются input, но выставляют себя за него\n.uiInputControlFake {\n\t@extend .uiInputControl;\n\n\twidth: 100%;\n\tpadding: 0 var(--space-sm);\n\tfont-size: var(--font-size-md);\n\n\tdisplay: flex;\n\talign-items: center;\n\n\tcursor: text;\n}\n\n.uiClearButton {\n\tcolor: var(--error-text);\n\n\t&:disabled {\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\toverflow: hidden;\n\t}\n}\n\n.uiButtonSeparator {\n\tborder-left: var(--border);\n\theight: calc(100% - var(--space-sm));\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ui.module-oRwY3Zli.js","names":[],"sources":["../../src/ui.module.scss"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.uiSizable {\n\t--base-width: 100%;\n\n\twidth: var(--base-width);\n\n\t&.xs {\n\t\t--base-width: calc(var(--drp-ui-width-xs, var(--ui-width-xs)) - var(--width-add));\n\t}\n\n\t&.sm {\n\t\t--base-width: calc(var(--drp-ui-width-sm, var(--ui-width-sm)) - var(--width-add));\n\t}\n\n\t&.md {\n\t\t--base-width: calc(var(--drp-ui-width-md, var(--ui-width-md)) - var(--width-add));\n\t}\n\n\t&.lg {\n\t\t--base-width: calc(var(--drp-ui-width-lg, var(--ui-width-lg)) - var(--width-add));\n\t}\n\n\t&.xl {\n\t\t--base-width: calc(var(--drp-ui-width-xl, var(--ui-width-xl)) - var(--width-add));\n\t}\n}\n\n// TODO: Тестовый класс\n.uiErrorElement {\n\t--grid-size: var(--space-sm);\n\t--grid-line-size: var(--border-width);\n\t@include toneDerived.tone-soft-declaration(\"--grid-line-color\", \"error\");\n\n\theight: var(--control-height);\n\twidth: 100%; // calc(10em - var(--width-add));\n\tflex-shrink: 0;\n\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\n\tborder: var(--focus-width) solid var(--error-border);\n\tborder-radius: var(--radius-sm);\n\toutline: none;\n\n\tfont-weight: 700;\n\tfont-variation-settings: \"wght\" 700;\n\n\tcolor: var(--error-text);\n\tbackground-color: var(--surface-0);\n\tbackground-image:\n\t\trepeating-linear-gradient(\n\t\t\t45deg,\n\t\t\tvar(--grid-line-color) 0 var(--grid-line-size),\n\t\t\ttransparent var(--grid-line-size) var(--grid-size)\n\t\t),\n\t\trepeating-linear-gradient(\n\t\t\t-45deg,\n\t\t\tvar(--grid-line-color) 0 var(--grid-line-size),\n\t\t\ttransparent var(--grid-line-size) var(--grid-size)\n\t\t);\n}\n\n.uiContainer {\n\tposition: relative;\n\twidth: 100%;\n}\n\n.uiInputContainer {\n\t@extend .uiContainer;\n\n\t--padding-right: var(--control-height);\n}\n\n.uiLabelBase {\n\tdisplay: inline-block;\n\tfont-weight: 400;\n\tfont-variation-settings: \"wght\" 400;\n}\n\n.uiLabel {\n\t@extend .uiLabelBase;\n\n\tmargin-block: var(--space-xs);\n}\n\n.uiDescription {\n\t--paragraph-margin: 0;\n\n\tpadding-bottom: var(--space-xs);\n\tcolor: var(--content-1);\n\tfont-weight: 300;\n\tfont-variation-settings: \"wght\" 300;\n}\n\n.uiLabel,\n.uiDescription {\n\tmargin-inline: var(--space-xs);\n}\n\n.uiPlaceholder {\n\tcolor: var(--content-2);\n\tfont-weight: 100;\n\tfont-variation-settings: \"wght\" 100;\n\t// font-size: var(--font-size-sm);\n\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.required {\n\t.uiLabelBase::after {\n\t\tcontent: \" *\";\n\t\tcolor: var(--error-text);\n\t}\n}\n\n.uiControl {\n\t@include ui-tone(\"neutral\");\n\t@include ui-appearance-outline;\n\t@include ui-control-base;\n\n\t--ui-radius: var(--radius-sm);\n\n\t&.invalid,\n\t&:invalid {\n\t\t@include ui-tone(\"error\");\n\t\t@include ui-appearance-outline;\n\t}\n\n\t&::placeholder {\n\t\t@extend .uiPlaceholder;\n\t}\n}\n\n.uiToneNeutral {\n\t@include ui-tone(\"neutral\");\n}\n\n.uiToneAccent {\n\t@include ui-tone(\"accent\");\n}\n\n.uiToneBrand {\n\t@include ui-tone(\"brand\");\n}\n\n.uiToneError {\n\t@include ui-tone(\"error\");\n}\n\n.uiToneWarning {\n\t@include ui-tone(\"warning\");\n}\n\n.uiToneSuccess {\n\t@include ui-tone(\"success\");\n}\n\n.uiToneInfo {\n\t@include ui-tone(\"info\");\n}\n\n.uiAppearanceSolid {\n\t@include ui-appearance-solid;\n}\n\n.uiAppearanceOutline {\n\t@include ui-appearance-outline;\n}\n\n.uiAppearanceGhost {\n\t@include ui-appearance-ghost;\n}\n\n.uiAppearanceTransparent {\n\t@include ui-appearance-transparent;\n}\n\n.uiInputControl {\n\t@extend .uiControl;\n\n\theight: var(--control-height);\n}\n\n.uiInputWithToggle {\n\t@extend .uiInputControl;\n\n\tcolor: var(--content-0);\n\n\tpadding: 0 var(--padding-right) 0 var(--space-sm);\n\twidth: 100%;\n\ttext-align: left;\n\n\t// &[type=\"button\"] {\n\t// \twhite-space: nowrap;\n\t// }\n}\n\n.uiSelectionControl {\n\t@include ui-control-base;\n\n\t--ui-color: var(--content-0);\n\t--ui-color-hover: var(--content-0);\n\t--ui-color-active: var(--content-0);\n\t--ui-background: var(--surface-0);\n\t--ui-background-hover: var(--ui-tone-soft);\n\t--ui-background-active: var(--ui-tone-soft);\n\t--ui-border-color: var(--ui-tone-border);\n\t--ui-border-hover: var(--ui-tone-border-hover);\n\t--ui-border-active: var(--ui-tone-border-active);\n\t--ui-border-focus: var(--ui-tone-border-focus);\n\n\tappearance: none;\n\tmargin: 0;\n\tcursor: pointer;\n\n\t&:checked {\n\t\tborder-color: var(--ui-tone-border-active);\n\n\t\t& + .uiSelectionIcon {\n\t\t\tcolor: var(--ui-tone-fill);\n\t\t}\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\n\t\tborder-color: var(--border-0);\n\n\t\t&:checked {\n\t\t\t& + .uiSelectionIcon {\n\t\t\t\tcolor: var(--border-0);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.uiSelectionIcon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tpointer-events: none;\n\tcolor: transparent;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\topacity var(--transition-fast) ease;\n}\n\n.uiElement,\n.uiPopupOption {\n\t&.disabled,\n\t&:disabled {\n\t\tuser-select: none;\n\n\t\t.uiLabel,\n\t\t.uiDescription {\n\t\t\tcolor: var(--content-2);\n\t\t}\n\n\t\t.uiPlaceholder,\n\t\t.uiOptionText,\n\t\t.uiOptionCode {\n\t\t\topacity: 0.25;\n\t\t}\n\t}\n\n\t// Класс disabled используется у составных ненативных элементов: им нужно явно запретить события.\n\t&.disabled {\n\t\tcursor: default;\n\t\tpointer-events: none;\n\t}\n\n\t// Нативный disabled уже блокирует активацию, а pointer-events остаются для курсора и tooltip.\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t}\n}\n\n.uiPanelTonePrimary {\n\t--ui-panel-background: var(--surface-0);\n}\n\n.uiPanelToneSecondary {\n\t--ui-panel-background: var(--surface-1);\n}\n\n.uiPanelToneTertiary {\n\t--ui-panel-background: var(--surface-2);\n}\n\n.uiFilledPanel {\n\tbackground-color: var(--ui-panel-background, var(--surface-0));\n}\n\n.uiFramedPanel {\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tpadding: var(--space-sm);\n}\n\n.uiPanel {\n\t@extend .uiFramedPanel;\n\t@extend .uiFilledPanel;\n}\n\n.uiStateFocus {\n\t@include focusVisible;\n\n\tbackground-color: var(--surface-1);\n\tborder-color: var(--border-1);\n\tcursor: pointer;\n}\n\n.uiOptionBase {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-start;\n\tgap: var(--space-sm);\n\theight: 100%;\n\twidth: 100%;\n\ttext-align: left;\n}\n\n.uiPopupOption {\n\t@extend .uiOptionBase;\n\n\theight: auto;\n\tmin-height: var(--control-height);\n}\n\n.uiPopupOption {\n\tborder-radius: var(--radius-sm);\n\tborder: none;\n\tbackground-color: transparent;\n\tcolor: var(--content-0);\n\n\ttransition:\n\t\tbackground-color var(--transition-fast) ease,\n\t\tcolor var(--transition-fast) ease;\n\n\t.uiMenuOptionIcon,\n\t.uiPopupOptionIcon {\n\t\tflex-shrink: 0;\n\t\tfont-size: var(--font-size-sm);\n\t\twidth: var(--icon-size);\n\t\theight: var(--icon-size);\n\t}\n\n\t.uiMenuOptionIcon,\n\t.keyboard {\n\t\tcolor: var(--content-2);\n\t}\n\n\t&.selected {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t\tcursor: default;\n\t}\n\n\t&.uiPopupOptionActive,\n\t&:active {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t}\n\n\t@include hover(true) {\n\t\tcolor: var(--accent-on-fill);\n\t\tbackground-color: var(--accent-fill);\n\t\tcursor: pointer;\n\t}\n\n\t&.disabled {\n\t\t// background-color: var(--surface-2);\n\t\tcolor: var(--content-2);\n\t}\n\n\t&:focus-within {\n\t\t// @extend .uiStateFocus;\n\t\t@include focusVisible;\n\t}\n}\n\n.uiOptionButton,\n.uiOptionLink {\n\t@extend .uiOptionBase;\n\n\tflex: 1 1 0;\n\tmin-width: 0;\n\theight: 100%;\n\tpadding: var(--space-xs) var(--space-sm);\n\tborder: none;\n\tborder-radius: inherit;\n\toutline: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: inherit;\n\ttext-decoration: none;\n}\n\n.uiPopupOptionSeparator {\n\tborder-top: var(--border);\n\tmargin-block: var(--space-xs);\n}\n\n.uiPopupGroupLabel {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n\tfont-weight: 300;\n\ttext-transform: uppercase;\n\tfont-size: var(--font-size-sm);\n}\n\n.uiMenuOptionIcon {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.uiOptionText {\n\t// font-size: var(--font-size-sm);\n\tflex: 1;\n\tmin-width: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.uiOptionCode {\n\tfont-family: var(--font-family-mono);\n\t// font-size: var(--font-size-sm);\n\tcolor: var(--content-1);\n\tfont-weight: 300;\n\tfont-variation-settings: \"wght\" 300;\n}\n\n.uiOptionContentEmphasize {\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.uiToggleButtonContainer {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\theight: 100%;\n\twidth: 100%;\n\n\ttransition-property: width;\n\ttransition-duration: var(--transition-fast);\n\ttransition-timing-function: cubic-bezier(1, 0, 0.5, 0.5);\n\n\t> button {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: var(--control-height);\n\t\twidth: var(--control-height);\n\t\tborder-radius: var(--radius-sm);\n\t\tflex: 0 0 var(--control-height);\n\t}\n\n\t// &[data-disabled] {\n\t// \tcursor: default;\n\t// \tpointer-events: none;\n\t// \topacity: var(--disabled-opacity);\n\t// }\n}\n\n.uiToggleButton {\n\tcolor: var(--content-0);\n\n\t&:hover {\n\t\tcolor: var(--accent-text);\n\t}\n}\n\n.uiToggleIcon {\n\ttransition: transform var(--transition-fast) ease-in-out;\n\n\t&.uiToggleIconOpen {\n\t\ttransform: rotate(180deg);\n\t}\n}\n\n// TODO: пока в свалку стили для дата-подобных компонентов\n\n// Для компонентов, который не являются input, но выставляют себя за него\n.uiInputControlFake {\n\t@extend .uiInputControl;\n\n\twidth: 100%;\n\tpadding: 0 var(--space-sm);\n\tfont-size: var(--font-size-md);\n\n\tdisplay: flex;\n\talign-items: center;\n\n\tcursor: text;\n}\n\n.uiClearButton {\n\tcolor: var(--error-text);\n\n\t&:disabled {\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t\toverflow: hidden;\n\t}\n}\n\n.uiButtonSeparator {\n\tborder-left: var(--border);\n\theight: calc(100% - var(--space-sm));\n}\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/notifications/model/NotificationsProvider.tsx","../../src/notifications/ui/Notification.module.scss","../../src/notifications/ui/NotificationsHost.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, PropsWithChildren, useContext, useEffect, useMemo } from \"react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\nimport {\n\tbindNotifications,\n\tcreateNotificationsStore,\n\tNotificationId,\n\tNotificationPushInput,\n\tNotificationsStoreApi,\n\tNotificationType\n} from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { useStore } from \"zustand\";\n\nconst NotificationsContext = createContext<NotificationsStoreApi | null>(null);\n\n/**\n * Провайдер уведомлений приложения. Хранит состояние списка уведомлений и предоставляет хуки доступа к нему.\n */\nexport function NotificationsProvider({ children }: PropsWithChildren) {\n\tconst store = useMemo(() => createNotificationsStore(), []);\n\n\tuseEffect(() => {\n\t\treturn bindNotifications(store);\n\t}, [store]);\n\n\treturn <NotificationsContext.Provider value={store}>{children}</NotificationsContext.Provider>;\n}\n\nfunction useNotificationApi() {\n\tconst ctx = useContext(NotificationsContext);\n\tif (!ctx) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"useNotificationApi\",\n\t\t\tproviderName: \"NotificationsProvider\"\n\t\t});\n\t}\n\treturn ctx;\n}\n\nexport function useNotifications() {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items);\n}\n\nexport function useNotify() {\n\tconst api = useNotificationApi();\n\tconst actions = useStore(api, (s) => s.actions);\n\n\tconst mk = (type: NotificationType) => (message: string, opts?: Omit<NotificationPushInput, \"type\" | \"message\">) =>\n\t\tactions.push({ type, message, ...opts });\n\n\treturn {\n\t\t...actions,\n\t\tsuccess: mk(\"success\"),\n\t\tinfo: mk(\"info\"),\n\t\twarning: mk(\"warning\"),\n\t\terror: mk(\"error\")\n\t};\n}\n\nexport function useNotificationById(id: NotificationId) {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items.find((n) => n.id === id));\n}\n","@use \"@/styles/mixins\" as *;\n\n.container {\n\tposition: fixed;\n\tz-index: var(--z-notify);\n\tbottom: 0;\n\tleft: 0;\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-lg);\n\twidth: min(28em, calc(100dvw - var(--space-lg) * 2));\n\tpointer-events: none;\n}\n\n.card {\n\t--notify-accent: var(--border-1);\n\t--notify-accent-surface: var(--surface-1);\n\t--notify-accent-text: var(--accent-text);\n\n\tposition: relative;\n\toverflow: hidden;\n\tpointer-events: auto;\n\twidth: 100%;\n\tpadding: var(--space-md);\n\t// border: var(--border);\n\tborder-left: 0.3125em solid var(--notify-accent);\n\tborder-radius: var(--radius-md);\n\tbackground: linear-gradient(37deg, var(--notify-accent-surface), var(--surface-0));\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-md);\n}\n\n.info {\n\t--notify-accent: var(--info-border);\n\t--notify-accent-surface: color-mix(in srgb, var(--info-fill) 12%, var(--surface-0));\n\t--notify-accent-text: var(--info-text);\n}\n\n.success {\n\t--notify-accent: var(--success-border);\n\t--notify-accent-surface: color-mix(in srgb, var(--success-fill) 12%, var(--surface-0));\n\t--notify-accent-text: var(--success-text);\n}\n\n.warning {\n\t--notify-accent: var(--warning-border);\n\t--notify-accent-surface: color-mix(in srgb, var(--warning-fill) 12%, var(--surface-0));\n\t--notify-accent-text: var(--warning-text);\n}\n\n.error {\n\t--notify-accent: var(--error-border);\n\t--notify-accent-surface: color-mix(in srgb, var(--error-fill) 12%, var(--surface-0));\n\t--notify-accent-text: var(--error-text);\n}\n\n.header,\n.content,\n.copy {\n\tmin-width: 0;\n}\n\n.content {\n\tmin-width: 0;\n\tflex: 1;\n}\n\n.icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder-radius: 50%;\n\tbackground-color: var(--notify-accent-surface);\n\tcolor: var(--notify-accent-text);\n\tborder: var(--border-width) solid color-mix(in srgb, var(--notify-accent) 22%, transparent);\n\n\tsvg {\n\t\twidth: 1.125em;\n\t\theight: 1.125em;\n\t}\n}\n\n.kicker {\n\tmargin-bottom: var(--space-xs);\n\tcolor: var(--notify-accent-text);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.title {\n\tcolor: var(--notify-accent-text);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.message {\n\tmargin-top: var(--space-xs);\n\tcolor: var(--content-0);\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tmargin-top: var(--space-sm);\n}\n\n@include mobile {\n\t.container {\n\t\tpadding: var(--space-md);\n\t\twidth: min(100dvw, calc(100dvw - var(--space-md) * 2));\n\t}\n}\n","import { NotificationType } from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AlertCircleIcon, CheckCircle2Icon, InfoIcon, TriangleAlertIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { useNotifications, useNotify } from \"../model/NotificationsProvider\";\n\nimport styles from \"./Notification.module.scss\";\n\nconst notificationConfig: Record<\n\tNotificationType,\n\t{\n\t\ttitle: string;\n\t\tIcon: typeof InfoIcon;\n\t}\n> = {\n\tinfo: {\n\t\ttitle: \"Информация\",\n\t\tIcon: InfoIcon\n\t},\n\tsuccess: {\n\t\ttitle: \"Успешно\",\n\t\tIcon: CheckCircle2Icon\n\t},\n\twarning: {\n\t\ttitle: \"Предупреждение\",\n\t\tIcon: TriangleAlertIcon\n\t},\n\terror: {\n\t\ttitle: \"Ошибка\",\n\t\tIcon: AlertCircleIcon\n\t}\n};\n\n/**\n * Хост для визуального отображения очереди уведомлений.\n * Обычно монтируется один раз на уровне приложения рядом с провайдером уведомлений.\n */\nexport function NotificationsHost() {\n\tconst items = useNotifications();\n\tconst { dismiss } = useNotify();\n\n\treturn (\n\t\t<div className={styles.container} aria-label=\"Область уведомлений\" aria-live=\"polite\" aria-relevant=\"additions text\">\n\t\t\t{items.map((notification) => {\n\t\t\t\tconst config = notificationConfig[notification.type];\n\t\t\t\tconst title = notification.title ?? config.title;\n\t\t\t\tconst Icon = config.Icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<article\n\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\trole={notification.type === \"error\" ? \"alert\" : \"status\"}\n\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\tclassName={cn(styles.card, styles[notification.type])}>\n\t\t\t\t\t\t<FlexContainer align=\"start\" justify=\"between\" gap=\"sm\" className={styles.header}>\n\t\t\t\t\t\t\t<FlexContainer align=\"start\" gap=\"sm\" className={styles.content}>\n\t\t\t\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<Icon />\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<div className={styles.copy}>\n\t\t\t\t\t\t\t\t\t<div className={styles.kicker}>{config.title}</div>\n\t\t\t\t\t\t\t\t\t{notification.title ? <div className={styles.title}>{title}</div> : null}\n\t\t\t\t\t\t\t\t\t<div className={styles.message}>{notification.message}</div>\n\n\t\t\t\t\t\t\t\t\t{notification.actions?.length ? (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t\t\t\t\t\t\t{notification.actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone ?? notification.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"notification-action-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-action=\"notification-action\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void action.onClick()}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FlexContainer>\n\n\t\t\t\t\t\t\t{notification.dismissible !== false ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ticon={<XIcon />}\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\ttone={notification.type}\n\t\t\t\t\t\t\t\t\tonClick={() => dismiss(notification.id)}\n\t\t\t\t\t\t\t\t\taria-label=\"Закрыть уведомление\"\n\t\t\t\t\t\t\t\t\tdata-ui=\"notification-dismiss-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"dismiss-notification\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t</article>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/notifications/model/NotificationsProvider.tsx","../../src/notifications/ui/Notification.module.scss","../../src/notifications/ui/NotificationsHost.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, PropsWithChildren, useContext, useEffect, useMemo } from \"react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\nimport {\n\tbindNotifications,\n\tcreateNotificationsStore,\n\tNotificationId,\n\tNotificationPushInput,\n\tNotificationsStoreApi,\n\tNotificationType\n} from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { useStore } from \"zustand\";\n\nconst NotificationsContext = createContext<NotificationsStoreApi | null>(null);\n\n/**\n * Провайдер уведомлений приложения. Хранит состояние списка уведомлений и предоставляет хуки доступа к нему.\n */\nexport function NotificationsProvider({ children }: PropsWithChildren) {\n\tconst store = useMemo(() => createNotificationsStore(), []);\n\n\tuseEffect(() => {\n\t\treturn bindNotifications(store);\n\t}, [store]);\n\n\treturn <NotificationsContext.Provider value={store}>{children}</NotificationsContext.Provider>;\n}\n\nfunction useNotificationApi() {\n\tconst ctx = useContext(NotificationsContext);\n\tif (!ctx) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"useNotificationApi\",\n\t\t\tproviderName: \"NotificationsProvider\"\n\t\t});\n\t}\n\treturn ctx;\n}\n\nexport function useNotifications() {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items);\n}\n\nexport function useNotify() {\n\tconst api = useNotificationApi();\n\tconst actions = useStore(api, (s) => s.actions);\n\n\tconst mk = (type: NotificationType) => (message: string, opts?: Omit<NotificationPushInput, \"type\" | \"message\">) =>\n\t\tactions.push({ type, message, ...opts });\n\n\treturn {\n\t\t...actions,\n\t\tsuccess: mk(\"success\"),\n\t\tinfo: mk(\"info\"),\n\t\twarning: mk(\"warning\"),\n\t\terror: mk(\"error\")\n\t};\n}\n\nexport function useNotificationById(id: NotificationId) {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items.find((n) => n.id === id));\n}\n","@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.container {\n\tposition: fixed;\n\tz-index: var(--z-notify);\n\tbottom: 0;\n\tleft: 0;\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-lg);\n\twidth: min(28em, calc(100dvw - var(--space-lg) * 2));\n\tpointer-events: none;\n}\n\n.card {\n\t--notify-accent: var(--border-1);\n\t--notify-accent-surface: var(--surface-1);\n\t--notify-accent-text: var(--accent-text);\n\n\tposition: relative;\n\toverflow: hidden;\n\tpointer-events: auto;\n\twidth: 100%;\n\tpadding: var(--space-md);\n\t// border: var(--border);\n\tborder-left: 0.3125em solid var(--notify-accent);\n\tborder-radius: var(--radius-md);\n\tbackground: linear-gradient(37deg, var(--notify-accent-surface), var(--surface-0));\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-md);\n}\n\n.info {\n\t--notify-accent: var(--info-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"info\");\n\t--notify-accent-text: var(--info-text);\n}\n\n.success {\n\t--notify-accent: var(--success-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"success\");\n\t--notify-accent-text: var(--success-text);\n}\n\n.warning {\n\t--notify-accent: var(--warning-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"warning\");\n\t--notify-accent-text: var(--warning-text);\n}\n\n.error {\n\t--notify-accent: var(--error-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"error\");\n\t--notify-accent-text: var(--error-text);\n}\n\n.header,\n.content,\n.copy {\n\tmin-width: 0;\n}\n\n.content {\n\tmin-width: 0;\n\tflex: 1;\n}\n\n.icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder-radius: 50%;\n\tbackground-color: var(--notify-accent-surface);\n\tcolor: var(--notify-accent-text);\n\tborder: var(--border-width) solid color-mix(in srgb, var(--notify-accent) 22%, transparent);\n\n\tsvg {\n\t\twidth: 1.125em;\n\t\theight: 1.125em;\n\t}\n}\n\n.kicker {\n\tmargin-bottom: var(--space-xs);\n\tcolor: var(--notify-accent-text);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.title {\n\tcolor: var(--notify-accent-text);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.message {\n\tmargin-top: var(--space-xs);\n\tcolor: var(--content-0);\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tmargin-top: var(--space-sm);\n}\n\n@include mobile {\n\t.container {\n\t\tpadding: var(--space-md);\n\t\twidth: min(100dvw, calc(100dvw - var(--space-md) * 2));\n\t}\n}\n","import { NotificationType } from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AlertCircleIcon, CheckCircle2Icon, InfoIcon, TriangleAlertIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { useNotifications, useNotify } from \"../model/NotificationsProvider\";\n\nimport styles from \"./Notification.module.scss\";\n\nconst notificationConfig: Record<\n\tNotificationType,\n\t{\n\t\ttitle: string;\n\t\tIcon: typeof InfoIcon;\n\t}\n> = {\n\tinfo: {\n\t\ttitle: \"Информация\",\n\t\tIcon: InfoIcon\n\t},\n\tsuccess: {\n\t\ttitle: \"Успешно\",\n\t\tIcon: CheckCircle2Icon\n\t},\n\twarning: {\n\t\ttitle: \"Предупреждение\",\n\t\tIcon: TriangleAlertIcon\n\t},\n\terror: {\n\t\ttitle: \"Ошибка\",\n\t\tIcon: AlertCircleIcon\n\t}\n};\n\n/**\n * Хост для визуального отображения очереди уведомлений.\n * Обычно монтируется один раз на уровне приложения рядом с провайдером уведомлений.\n */\nexport function NotificationsHost() {\n\tconst items = useNotifications();\n\tconst { dismiss } = useNotify();\n\n\treturn (\n\t\t<div className={styles.container} aria-label=\"Область уведомлений\" aria-live=\"polite\" aria-relevant=\"additions text\">\n\t\t\t{items.map((notification) => {\n\t\t\t\tconst config = notificationConfig[notification.type];\n\t\t\t\tconst title = notification.title ?? config.title;\n\t\t\t\tconst Icon = config.Icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<article\n\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\trole={notification.type === \"error\" ? \"alert\" : \"status\"}\n\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\tclassName={cn(styles.card, styles[notification.type])}>\n\t\t\t\t\t\t<FlexContainer align=\"start\" justify=\"between\" gap=\"sm\" className={styles.header}>\n\t\t\t\t\t\t\t<FlexContainer align=\"start\" gap=\"sm\" className={styles.content}>\n\t\t\t\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<Icon />\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<div className={styles.copy}>\n\t\t\t\t\t\t\t\t\t<div className={styles.kicker}>{config.title}</div>\n\t\t\t\t\t\t\t\t\t{notification.title ? <div className={styles.title}>{title}</div> : null}\n\t\t\t\t\t\t\t\t\t<div className={styles.message}>{notification.message}</div>\n\n\t\t\t\t\t\t\t\t\t{notification.actions?.length ? (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t\t\t\t\t\t\t{notification.actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone ?? notification.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"notification-action-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-action=\"notification-action\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void action.onClick()}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FlexContainer>\n\n\t\t\t\t\t\t\t{notification.dismissible !== false ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ticon={<XIcon />}\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\ttone={notification.type}\n\t\t\t\t\t\t\t\t\tonClick={() => dismiss(notification.id)}\n\t\t\t\t\t\t\t\t\taria-label=\"Закрыть уведомление\"\n\t\t\t\t\t\t\t\t\tdata-ui=\"notification-dismiss-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"dismiss-notification\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t</article>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}